Rev 2071 | Rev 2089 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 2071 | Rev 2087 | ||
|---|---|---|---|
| Line 144... | Line 144... | ||
| 144 | 144 | ||
| 145 | config.base = hardcoded_load_address; |
145 | config.base = hardcoded_load_address; |
| 146 | config.memory_size = get_memory_size(); |
146 | config.memory_size = get_memory_size(); |
| 147 | 147 | ||
| 148 | config.kernel_size = ALIGN_UP(hardcoded_ktext_size + |
148 | config.kernel_size = ALIGN_UP(hardcoded_ktext_size + |
| 149 | hardcoded_kdata_size, PAGE_SIZE); |
149 | hardcoded_kdata_size, PAGE_SIZE); |
| 150 | config.stack_size = CONFIG_STACK_SIZE; |
150 | config.stack_size = CONFIG_STACK_SIZE; |
| 151 | 151 | ||
| 152 | /* Initialy the stack is placed just after the kernel */ |
152 | /* Initialy the stack is placed just after the kernel */ |
| 153 | config.stack_base = config.base + config.kernel_size; |
153 | config.stack_base = config.base + config.kernel_size; |
| 154 | 154 | ||
| 155 | /* Avoid placing stack on top of init */ |
155 | /* Avoid placing stack on top of init */ |
| 156 | count_t i; |
156 | count_t i; |
| 157 | for (i = 0; i < init.cnt; i++) { |
157 | for (i = 0; i < init.cnt; i++) { |
| 158 | if (PA_overlaps(config.stack_base, config.stack_size, |
158 | if (PA_overlaps(config.stack_base, config.stack_size, |
| 159 | init.tasks[i].addr, init.tasks[i].size)) |
159 | init.tasks[i].addr, init.tasks[i].size)) |
| 160 | config.stack_base = ALIGN_UP(init.tasks[i].addr + |
160 | config.stack_base = ALIGN_UP(init.tasks[i].addr + |
| 161 | init.tasks[i].size, config.stack_size); |
161 | init.tasks[i].size, config.stack_size); |
| 162 | } |
162 | } |
| 163 | 163 | ||
| 164 | /* Avoid placing stack on top of boot allocations. */ |
164 | /* Avoid placing stack on top of boot allocations. */ |
| 165 | if (ballocs.size) { |
165 | if (ballocs.size) { |
| 166 | if (PA_overlaps(config.stack_base, config.stack_size, |
166 | if (PA_overlaps(config.stack_base, config.stack_size, |
| 167 | ballocs.base, ballocs.size)) |
167 | ballocs.base, ballocs.size)) |
| 168 | config.stack_base = ALIGN_UP(ballocs.base + |
168 | config.stack_base = ALIGN_UP(ballocs.base + |
| 169 | ballocs.size, PAGE_SIZE); |
169 | ballocs.size, PAGE_SIZE); |
| 170 | } |
170 | } |
| 171 | 171 | ||
| 172 | if (config.stack_base < stack_safe) |
172 | if (config.stack_base < stack_safe) |
| 173 | config.stack_base = ALIGN_UP(stack_safe, PAGE_SIZE); |
173 | config.stack_base = ALIGN_UP(stack_safe, PAGE_SIZE); |
| 174 | 174 | ||
| 175 | context_save(&ctx); |
175 | context_save(&ctx); |
| 176 | context_set(&ctx, FADDR(main_bsp_separated_stack), config.stack_base, |
176 | context_set(&ctx, FADDR(main_bsp_separated_stack), config.stack_base, |
| 177 | THREAD_STACK_SIZE); |
177 | THREAD_STACK_SIZE); |
| 178 | context_restore(&ctx); |
178 | context_restore(&ctx); |
| 179 | /* not reached */ |
179 | /* not reached */ |
| 180 | } |
180 | } |
| 181 | 181 | ||
| 182 | 182 | ||
| Line 220... | Line 220... | ||
| 220 | ddi_init(); |
220 | ddi_init(); |
| 221 | arch_post_mm_init(); |
221 | arch_post_mm_init(); |
| 222 | 222 | ||
| 223 | version_print(); |
223 | version_print(); |
| 224 | printf("kernel: %.*p hardcoded_ktext_size=%zdK, " |
224 | printf("kernel: %.*p hardcoded_ktext_size=%zdK, " |
| 225 | "hardcoded_kdata_size=%zdK\n", sizeof(uintptr_t) * 2, |
225 | "hardcoded_kdata_size=%zdK\n", sizeof(uintptr_t) * 2, |
| 226 | config.base, hardcoded_ktext_size >> 10, hardcoded_kdata_size >> |
226 | config.base, hardcoded_ktext_size >> 10, |
| 227 | 10); |
227 | hardcoded_kdata_size >> 10); |
| 228 | printf("stack: %.*p size=%zdK\n", sizeof(uintptr_t) * 2, |
228 | printf("stack: %.*p size=%zdK\n", sizeof(uintptr_t) * 2, |
| 229 | config.stack_base, config.stack_size >> 10); |
229 | config.stack_base, config.stack_size >> 10); |
| 230 | 230 | ||
| 231 | arch_pre_smp_init(); |
231 | arch_pre_smp_init(); |
| 232 | smp_init(); |
232 | smp_init(); |
| 233 | /* Slab must be initialized after we know the number of processors. */ |
233 | /* Slab must be initialized after we know the number of processors. */ |
| 234 | slab_enable_cpucache(); |
234 | slab_enable_cpucache(); |
| Line 247... | Line 247... | ||
| 247 | klog_init(); |
247 | klog_init(); |
| 248 | 248 | ||
| 249 | if (init.cnt > 0) { |
249 | if (init.cnt > 0) { |
| 250 | for (i = 0; i < init.cnt; i++) |
250 | for (i = 0; i < init.cnt; i++) |
| 251 | printf("init[%zd].addr=%.*p, init[%zd].size=%zd\n", i, |
251 | printf("init[%zd].addr=%.*p, init[%zd].size=%zd\n", i, |
| 252 | sizeof(uintptr_t) * 2, init.tasks[i].addr, i, |
252 | sizeof(uintptr_t) * 2, init.tasks[i].addr, i, |
| 253 | init.tasks[i].size); |
253 | init.tasks[i].size); |
| 254 | } else |
254 | } else |
| 255 | printf("No init binaries found\n"); |
255 | printf("No init binaries found\n"); |
| 256 | 256 | ||
| 257 | ipc_init(); |
257 | ipc_init(); |
| 258 | 258 | ||
| Line 321... | Line 321... | ||
| 321 | * If we woke kmp up before we left the kernel stack, we could |
321 | * If we woke kmp up before we left the kernel stack, we could |
| 322 | * collide with another CPU coming up. To prevent this, we |
322 | * collide with another CPU coming up. To prevent this, we |
| 323 | * switch to this cpu's private stack prior to waking kmp up. |
323 | * switch to this cpu's private stack prior to waking kmp up. |
| 324 | */ |
324 | */ |
| 325 | context_set(&CPU->saved_context, FADDR(main_ap_separated_stack), |
325 | context_set(&CPU->saved_context, FADDR(main_ap_separated_stack), |
| 326 | (uintptr_t) CPU->stack, CPU_STACK_SIZE); |
326 | (uintptr_t) CPU->stack, CPU_STACK_SIZE); |
| 327 | context_restore(&CPU->saved_context); |
327 | context_restore(&CPU->saved_context); |
| 328 | /* not reached */ |
328 | /* not reached */ |
| 329 | } |
329 | } |
| 330 | 330 | ||
| 331 | 331 | ||