Changes in kernel/generic/src/main/main.c [1caeb2d:98000fb] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/main/main.c
r1caeb2d r98000fb 84 84 #include <main/main.h> 85 85 #include <ipc/event.h> 86 #include <sysinfo/sysinfo.h>87 #include <sysinfo/stats.h>88 86 89 87 /** Global configuration structure. */ … … 97 95 /** Boot allocations. */ 98 96 ballocs_t ballocs = { 99 .base = (uintptr_t)NULL,97 .base = NULL, 100 98 .size = 0 101 99 }; … … 103 101 context_t ctx; 104 102 103 /* 104 * These 'hardcoded' variables will be intialized by 105 * the linker or the low level assembler code with 106 * appropriate sizes and addresses. 107 */ 108 109 /** Virtual address of where the kernel is loaded. */ 110 uintptr_t hardcoded_load_address = 0; 111 /** Size of the kernel code in bytes. */ 112 size_t hardcoded_ktext_size = 0; 113 /** Size of the kernel data in bytes. */ 114 size_t hardcoded_kdata_size = 0; 105 115 /** Lowest safe stack virtual address. */ 106 uintptr_t stack_safe = 0; 116 uintptr_t stack_safe = 0; 107 117 108 118 /* … … 113 123 */ 114 124 static void main_bsp_separated_stack(void); 115 116 125 #ifdef CONFIG_SMP 117 126 static void main_ap_separated_stack(void); 118 127 #endif 119 128 120 #define CONFIG_STACK_SIZE 129 #define CONFIG_STACK_SIZE ((1 << STACK_FRAMES) * STACK_SIZE) 121 130 122 131 /** Main kernel routine for bootstrap CPU. … … 131 140 * 132 141 */ 133 NO_TRACEvoid main_bsp(void)142 void main_bsp(void) 134 143 { 135 144 config.cpu_count = 1; … … 147 156 size_t i; 148 157 for (i = 0; i < init.cnt; i++) { 149 if (PA_ OVERLAPS(config.stack_base, config.stack_size,158 if (PA_overlaps(config.stack_base, config.stack_size, 150 159 init.tasks[i].addr, init.tasks[i].size)) 151 160 config.stack_base = ALIGN_UP(init.tasks[i].addr + 152 161 init.tasks[i].size, config.stack_size); 153 162 } 154 163 155 164 /* Avoid placing stack on top of boot allocations. */ 156 165 if (ballocs.size) { 157 if (PA_ OVERLAPS(config.stack_base, config.stack_size,166 if (PA_overlaps(config.stack_base, config.stack_size, 158 167 ballocs.base, ballocs.size)) 159 168 config.stack_base = ALIGN_UP(ballocs.base + … … 171 180 } 172 181 182 173 183 /** Main kernel routine for bootstrap CPU using new stack. 174 184 * … … 176 186 * 177 187 */ 178 void main_bsp_separated_stack(void) 188 void main_bsp_separated_stack(void) 179 189 { 180 190 /* Keep this the first thing. */ … … 183 193 version_print(); 184 194 185 LOG("\nconfig.base=% p config.kernel_size=%zu"186 "\nconfig.stack_base=% p config.stack_size=%zu",187 (void *) config.base, config.kernel_size,188 (void *) config.stack_base,config.stack_size);195 LOG("\nconfig.base=%#" PRIp " config.kernel_size=%" PRIs 196 "\nconfig.stack_base=%#" PRIp " config.stack_size=%" PRIs, 197 config.base, config.kernel_size, config.stack_base, 198 config.stack_size); 189 199 190 200 #ifdef CONFIG_KCONSOLE … … 194 204 * commands. 195 205 */ 196 kconsole_init();206 LOG_EXEC(kconsole_init()); 197 207 #endif 198 208 … … 201 211 * starts adding its own handlers 202 212 */ 203 exc_init();213 LOG_EXEC(exc_init()); 204 214 205 215 /* 206 216 * Memory management subsystems initialization. 207 217 */ 208 arch_pre_mm_init();209 frame_init();218 LOG_EXEC(arch_pre_mm_init()); 219 LOG_EXEC(frame_init()); 210 220 211 221 /* Initialize at least 1 memory segment big enough for slab to work. */ 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(); 222 LOG_EXEC(slab_cache_init()); 223 LOG_EXEC(btree_init()); 224 LOG_EXEC(as_init()); 225 LOG_EXEC(page_init()); 226 LOG_EXEC(tlb_init()); 227 LOG_EXEC(ddi_init()); 228 LOG_EXEC(tasklet_init()); 229 LOG_EXEC(arch_post_mm_init()); 230 LOG_EXEC(arch_pre_smp_init()); 231 LOG_EXEC(smp_init()); 223 232 224 233 /* Slab must be initialized after we know the number of processors. */ 225 slab_enable_cpucache();226 227 printf("Detected % u CPU(s), %" PRIu64" MiB free memory\n",228 config.cpu_count, SIZE2MB(zone s_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();234 LOG_EXEC(slab_enable_cpucache()); 235 236 printf("Detected %" PRIs " CPU(s), %" PRIu64" MiB free memory\n", 237 config.cpu_count, SIZE2MB(zone_total_size())); 238 239 LOG_EXEC(cpu_init()); 240 241 LOG_EXEC(calibrate_delay_loop()); 242 LOG_EXEC(clock_counter_init()); 243 LOG_EXEC(timeout_init()); 244 LOG_EXEC(scheduler_init()); 245 LOG_EXEC(task_init()); 246 LOG_EXEC(thread_init()); 247 LOG_EXEC(futex_init()); 239 248 240 249 if (init.cnt > 0) { 241 250 size_t i; 242 251 for (i = 0; i < init.cnt; i++) 243 LOG("init[%zu].addr=%p, init[%zu].size=%zu", 244 i, (void *) init.tasks[i].addr, i, init.tasks[i].size); 252 LOG("init[%" PRIs "].addr=%#" PRIp ", init[%" PRIs 253 "].size=%#" PRIs, i, init.tasks[i].addr, i, 254 init.tasks[i].size); 245 255 } else 246 256 printf("No init binaries found.\n"); 247 257 248 ipc_init(); 249 event_init(); 250 klog_init(); 251 stats_init(); 258 LOG_EXEC(ipc_init()); 259 LOG_EXEC(event_init()); 260 LOG_EXEC(klog_init()); 252 261 253 262 /* … … 265 274 if (!kinit_thread) 266 275 panic("Cannot create kinit thread."); 267 thread_ready(kinit_thread);276 LOG_EXEC(thread_ready(kinit_thread)); 268 277 269 278 /* … … 275 284 } 276 285 286 277 287 #ifdef CONFIG_SMP 278 279 288 /** Main kernel routine for application CPUs. 280 289 * … … 295 304 */ 296 305 config.cpu_active++; 297 306 298 307 /* 299 308 * The THE structure is well defined because ctx.sp is used as stack. … … 310 319 calibrate_delay_loop(); 311 320 arch_post_cpu_init(); 312 321 313 322 the_copy(THE, (the_t *) CPU->stack); 314 323 315 324 /* 316 325 * If we woke kmp up before we left the kernel stack, we could … … 325 334 } 326 335 336 327 337 /** Main kernel routine for application CPUs using new stack. 328 338 * … … 336 346 */ 337 347 timeout_init(); 338 348 339 349 waitq_wakeup(&ap_completion_wq, WAKEUP_FIRST); 340 350 scheduler(); 341 351 /* not reached */ 342 352 } 343 344 353 #endif /* CONFIG_SMP */ 345 354
Note:
See TracChangeset
for help on using the changeset viewer.