Changes in kernel/generic/src/main/main.c [bae6169:7e752b2] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/main/main.c
rbae6169 r7e752b2 84 84 #include <main/main.h> 85 85 #include <ipc/event.h> 86 #include <sysinfo/sysinfo.h> 87 #include <sysinfo/stats.h> 86 88 87 89 /** Global configuration structure. */ … … 95 97 /** Boot allocations. */ 96 98 ballocs_t ballocs = { 97 .base = NULL,99 .base = (uintptr_t) NULL, 98 100 .size = 0 99 101 }; … … 102 104 103 105 /** Lowest safe stack virtual address. */ 104 uintptr_t stack_safe = 0; 106 uintptr_t stack_safe = 0; 105 107 106 108 /* … … 111 113 */ 112 114 static void main_bsp_separated_stack(void); 115 113 116 #ifdef CONFIG_SMP 114 117 static void main_ap_separated_stack(void); 115 118 #endif 116 119 117 #define CONFIG_STACK_SIZE 120 #define CONFIG_STACK_SIZE ((1 << STACK_FRAMES) * STACK_SIZE) 118 121 119 122 /** Main kernel routine for bootstrap CPU. … … 128 131 * 129 132 */ 130 void main_bsp(void)133 NO_TRACE void main_bsp(void) 131 134 { 132 135 config.cpu_count = 1; … … 144 147 size_t i; 145 148 for (i = 0; i < init.cnt; i++) { 146 if (PA_ overlaps(config.stack_base, config.stack_size,149 if (PA_OVERLAPS(config.stack_base, config.stack_size, 147 150 init.tasks[i].addr, init.tasks[i].size)) 148 151 config.stack_base = ALIGN_UP(init.tasks[i].addr + 149 152 init.tasks[i].size, config.stack_size); 150 153 } 151 154 152 155 /* Avoid placing stack on top of boot allocations. */ 153 156 if (ballocs.size) { 154 if (PA_ overlaps(config.stack_base, config.stack_size,157 if (PA_OVERLAPS(config.stack_base, config.stack_size, 155 158 ballocs.base, ballocs.size)) 156 159 config.stack_base = ALIGN_UP(ballocs.base + … … 168 171 } 169 172 170 171 173 /** Main kernel routine for bootstrap CPU using new stack. 172 174 * … … 174 176 * 175 177 */ 176 void main_bsp_separated_stack(void) 178 void main_bsp_separated_stack(void) 177 179 { 178 180 /* Keep this the first thing. */ … … 181 183 version_print(); 182 184 183 LOG("\nconfig.base=% #" PRIp " config.kernel_size=%" PRIs184 "\nconfig.stack_base=% #" PRIp " config.stack_size=%" PRIs,185 LOG("\nconfig.base=%p config.kernel_size=%zu" 186 "\nconfig.stack_base=%p config.stack_size=%zu", 185 187 config.base, config.kernel_size, config.stack_base, 186 188 config.stack_size); … … 192 194 * commands. 193 195 */ 194 LOG_EXEC(kconsole_init());196 kconsole_init(); 195 197 #endif 196 198 … … 199 201 * starts adding its own handlers 200 202 */ 201 LOG_EXEC(exc_init());203 exc_init(); 202 204 203 205 /* 204 206 * Memory management subsystems initialization. 205 207 */ 206 LOG_EXEC(arch_pre_mm_init());207 LOG_EXEC(frame_init());208 arch_pre_mm_init(); 209 frame_init(); 208 210 209 211 /* Initialize at least 1 memory segment big enough for slab to work. */ 210 LOG_EXEC(slab_cache_init()); 211 LOG_EXEC(btree_init()); 212 LOG_EXEC(as_init()); 213 LOG_EXEC(page_init()); 214 LOG_EXEC(tlb_init()); 215 LOG_EXEC(ddi_init()); 216 LOG_EXEC(tasklet_init()); 217 LOG_EXEC(arch_post_mm_init()); 218 LOG_EXEC(arch_pre_smp_init()); 219 LOG_EXEC(smp_init()); 212 slab_cache_init(); 213 sysinfo_init(); 214 btree_init(); 215 as_init(); 216 page_init(); 217 tlb_init(); 218 ddi_init(); 219 tasklet_init(); 220 arch_post_mm_init(); 221 arch_pre_smp_init(); 222 smp_init(); 220 223 221 224 /* Slab must be initialized after we know the number of processors. */ 222 LOG_EXEC(slab_enable_cpucache());223 224 printf("Detected % " PRIs " CPU(s), %" PRIu64" MiB free memory\n",225 config.cpu_count, SIZE2MB(zone _total_size()));226 227 LOG_EXEC(cpu_init());228 229 LOG_EXEC(calibrate_delay_loop());230 LOG_EXEC(clock_counter_init());231 LOG_EXEC(timeout_init());232 LOG_EXEC(scheduler_init());233 LOG_EXEC(task_init());234 LOG_EXEC(thread_init());235 LOG_EXEC(futex_init());225 slab_enable_cpucache(); 226 227 printf("Detected %u CPU(s), %" PRIu64 " MiB free memory\n", 228 config.cpu_count, SIZE2MB(zones_total_size())); 229 230 cpu_init(); 231 232 calibrate_delay_loop(); 233 clock_counter_init(); 234 timeout_init(); 235 scheduler_init(); 236 task_init(); 237 thread_init(); 238 futex_init(); 236 239 237 240 if (init.cnt > 0) { 238 241 size_t i; 239 242 for (i = 0; i < init.cnt; i++) 240 LOG("init[%" PRIs "].addr=%#" PRIp ", init[%" PRIs 241 "].size=%#" PRIs, i, init.tasks[i].addr, i, 242 init.tasks[i].size); 243 LOG("init[%zu].addr=%p, init[%zu].size=%zu", 244 i, init.tasks[i].addr, i, init.tasks[i].size); 243 245 } else 244 246 printf("No init binaries found.\n"); 245 247 246 LOG_EXEC(ipc_init()); 247 LOG_EXEC(event_init()); 248 LOG_EXEC(klog_init()); 248 ipc_init(); 249 event_init(); 250 klog_init(); 251 stats_init(); 249 252 250 253 /* … … 262 265 if (!kinit_thread) 263 266 panic("Cannot create kinit thread."); 264 LOG_EXEC(thread_ready(kinit_thread));267 thread_ready(kinit_thread); 265 268 266 269 /* … … 272 275 } 273 276 274 275 277 #ifdef CONFIG_SMP 278 276 279 /** Main kernel routine for application CPUs. 277 280 * … … 292 295 */ 293 296 config.cpu_active++; 294 297 295 298 /* 296 299 * The THE structure is well defined because ctx.sp is used as stack. … … 307 310 calibrate_delay_loop(); 308 311 arch_post_cpu_init(); 309 312 310 313 the_copy(THE, (the_t *) CPU->stack); 311 314 312 315 /* 313 316 * If we woke kmp up before we left the kernel stack, we could … … 322 325 } 323 326 324 325 327 /** Main kernel routine for application CPUs using new stack. 326 328 * … … 334 336 */ 335 337 timeout_init(); 336 338 337 339 waitq_wakeup(&ap_completion_wq, WAKEUP_FIRST); 338 340 scheduler(); 339 341 /* not reached */ 340 342 } 343 341 344 #endif /* CONFIG_SMP */ 342 345
Note:
See TracChangeset
for help on using the changeset viewer.