Changeset deca67b in mainline for kernel/arch/ia32/src/ia32.c
- Timestamp:
- 2009-03-03T12:56:20Z (16 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- add04f7
- Parents:
- 2f57690
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/ia32/src/ia32.c
r2f57690 rdeca67b 1 1 /* 2 2 * Copyright (c) 2001-2004 Jakub Jermar 3 * Copyright (c) 2009 Jiri Svoboda 4 * Copyright (c) 2009 Martin Decky 3 5 * All rights reserved. 4 6 * … … 64 66 #include <ddi/device.h> 65 67 #include <sysinfo/sysinfo.h> 68 #include <arch/boot/boot.h> 69 #include <string.h> 70 #include <macros.h> 66 71 67 72 #ifdef CONFIG_SMP 68 73 #include <arch/smp/apic.h> 69 74 #endif 75 76 /** Extract command name from the multiboot module command line. 77 * 78 * @param buf Destination buffer (will always null-terminate). 79 * @param n Size of destination buffer. 80 * @param cmd_line Input string (the command line). 81 * 82 */ 83 static void extract_command(char *buf, size_t n, const char *cmd_line) 84 { 85 const char *start, *end, *cp; 86 size_t max_len; 87 88 /* Find the first space. */ 89 end = strchr(cmd_line, ' '); 90 if (end == NULL) 91 end = cmd_line + strlen(cmd_line); 92 93 /* 94 * Find last occurence of '/' before 'end'. If found, place start at 95 * next character. Otherwise, place start at beginning of buffer. 96 */ 97 cp = end; 98 start = buf; 99 while (cp != start) { 100 if (*cp == '/') { 101 start = cp + 1; 102 break; 103 } 104 --cp; 105 } 106 107 /* Copy the command and null-terminate the string. */ 108 max_len = min(n - 1, (size_t) (end - start)); 109 strncpy(buf, start, max_len + 1); 110 buf[max_len] = '\0'; 111 } 112 113 /** C part of ia32 boot sequence. 114 * 115 * @param signature Should contain the multiboot signature. 116 * @param mi Pointer to the multiboot information structure. 117 */ 118 void arch_pre_main(uint32_t signature, const mb_info_t *mi) 119 { 120 uint32_t flags; 121 mb_mod_t *mods; 122 uint32_t i; 123 124 if (signature == MULTIBOOT_LOADER_MAGIC) 125 flags = mi->flags; 126 else { 127 /* No multiboot info available. */ 128 flags = 0; 129 } 130 131 /* Copy module information. */ 132 133 if ((flags & MBINFO_FLAGS_MODS) != 0) { 134 init.cnt = mi->mods_count; 135 mods = mi->mods_addr; 136 137 for (i = 0; i < init.cnt; i++) { 138 init.tasks[i].addr = mods[i].start + 0x80000000; 139 init.tasks[i].size = mods[i].end - mods[i].start; 140 141 /* Copy command line, if available. */ 142 if (mods[i].string) { 143 extract_command(init.tasks[i].name, 144 CONFIG_TASK_NAME_BUFLEN, 145 mods[i].string); 146 } else 147 init.tasks[i].name[0] = '\0'; 148 } 149 } else 150 init.cnt = 0; 151 152 /* Copy memory map. */ 153 154 int32_t mmap_length; 155 mb_mmap_t *mme; 156 uint32_t size; 157 158 if ((flags & MBINFO_FLAGS_MMAP) != 0) { 159 mmap_length = mi->mmap_length; 160 mme = mi->mmap_addr; 161 e820counter = 0; 162 163 i = 0; 164 while (mmap_length > 0) { 165 e820table[i++] = mme->mm_info; 166 167 /* Compute address of next structure. */ 168 size = sizeof(mme->size) + mme->size; 169 mme = ((void *) mme) + size; 170 mmap_length -= size; 171 } 172 173 e820counter = i; 174 } else 175 e820counter = 0; 176 177 #ifdef CONFIG_SMP 178 /* Copy AP bootstrap routines below 1 MB. */ 179 memcpy((void *) AP_BOOT_OFFSET, (void *) BOOT_OFFSET, 180 (size_t) &_hardcoded_unmapped_size); 181 #endif 182 } 70 183 71 184 void arch_pre_mm_init(void)
Note:
See TracChangeset
for help on using the changeset viewer.