- File:
-
- 1 edited
-
libcfa/src/concurrency/kernel/startup.cfa (modified) (14 diffs)
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/kernel/startup.cfa
r8fc652e0 r6a77224 118 118 //----------------------------------------------------------------------------- 119 119 // Global state 120 thread_local struct KernelThreadData __cfaabi_tls__attribute__ ((tls_model ( "initial-exec" ))) @= {120 thread_local struct KernelThreadData kernelTLS __attribute__ ((tls_model ( "initial-exec" ))) @= { 121 121 NULL, // cannot use 0p 122 NULL,123 122 NULL, 124 123 NULL, … … 156 155 // Kernel boot procedures 157 156 static void __kernel_startup(void) { 158 /* paranoid */ verify( ! __preemption_enabled());157 verify( ! kernelTLS.preemption_state.enabled ); 159 158 __cfadbg_print_safe(runtime_core, "Kernel : Starting\n"); 160 159 … … 212 211 213 212 //initialize the global state variables 214 __cfaabi_tls.this_processor = mainProcessor; 215 __cfaabi_tls.this_proc_id = (__processor_id_t*)mainProcessor; 216 __cfaabi_tls.this_thread = mainThread; 213 kernelTLS.this_processor = mainProcessor; 214 kernelTLS.this_thread = mainThread; 217 215 218 216 #if !defined( __CFA_NO_STATISTICS__ ) 219 __cfaabi_tls.this_stats = (__stats_t *)& storage_mainProcStats;220 __init_stats( __cfaabi_tls.this_stats );217 kernelTLS.this_stats = (__stats_t *)& storage_mainProcStats; 218 __init_stats( kernelTLS.this_stats ); 221 219 #endif 222 220 … … 229 227 // Add the main thread to the ready queue 230 228 // once resume is called on mainProcessor->runner the mainThread needs to be scheduled like any normal thread 231 __schedule_thread( mainThread);229 __schedule_thread((__processor_id_t *)mainProcessor, mainThread); 232 230 233 231 // SKULLDUGGERY: Force a context switch to the main processor to set the main thread's context to the current UNIX 234 232 // context. Hence, the main thread does not begin through __cfactx_invoke_thread, like all other threads. The trick here is that 235 233 // mainThread is on the ready queue when this call is made. 236 __kernel_first_resume( __cfaabi_tls.this_processor );234 __kernel_first_resume( kernelTLS.this_processor ); 237 235 238 236 … … 251 249 __cfadbg_print_safe(runtime_core, "Kernel : Started\n--------------------------------------------------\n\n"); 252 250 253 /* paranoid */ verify( ! __preemption_enabled());251 verify( ! kernelTLS.preemption_state.enabled ); 254 252 enable_interrupts( __cfaabi_dbg_ctx ); 255 /* paranoid */ verify( __preemption_enabled() ); 256 253 verify( TL_GET( preemption_state.enabled ) ); 257 254 } 258 255 … … 263 260 mainCluster->io.ctxs = 0p; 264 261 265 /* paranoid */ verify( __preemption_enabled() );262 /* paranoid */ verify( TL_GET( preemption_state.enabled ) ); 266 263 disable_interrupts(); 267 /* paranoid */ verify( ! __preemption_enabled());264 /* paranoid */ verify( ! kernelTLS.preemption_state.enabled ); 268 265 269 266 __cfadbg_print_safe(runtime_core, "\n--------------------------------------------------\nKernel : Shutting down\n"); … … 273 270 // which is currently here 274 271 __atomic_store_n(&mainProcessor->do_terminate, true, __ATOMIC_RELEASE); 275 __kernel_last_resume( __cfaabi_tls.this_processor );272 __kernel_last_resume( kernelTLS.this_processor ); 276 273 mainThread->self_cor.state = Halted; 277 274 … … 322 319 __stats_t local_stats; 323 320 __init_stats( &local_stats ); 324 __cfaabi_tls.this_stats = &local_stats;321 kernelTLS.this_stats = &local_stats; 325 322 #endif 326 323 327 324 processor * proc = (processor *) arg; 328 __cfaabi_tls.this_processor = proc; 329 __cfaabi_tls.this_proc_id = (__processor_id_t*)proc; 330 __cfaabi_tls.this_thread = 0p; 331 __cfaabi_tls.preemption_state.[enabled, disable_count] = [false, 1]; 325 kernelTLS.this_processor = proc; 326 kernelTLS.this_thread = 0p; 327 kernelTLS.preemption_state.[enabled, disable_count] = [false, 1]; 332 328 // SKULLDUGGERY: We want to create a context for the processor coroutine 333 329 // which is needed for the 2-step context switch. However, there is no reason … … 341 337 342 338 //Set global state 343 __cfaabi_tls.this_thread = 0p;339 kernelTLS.this_thread = 0p; 344 340 345 341 //We now have a proper context from which to schedule threads … … 371 367 $coroutine * dst = get_coroutine(this->runner); 372 368 373 /* paranoid */ verify( ! __preemption_enabled());374 375 __cfaabi_tls.this_thread->curr_cor = dst;369 verify( ! kernelTLS.preemption_state.enabled ); 370 371 kernelTLS.this_thread->curr_cor = dst; 376 372 __stack_prepare( &dst->stack, 65000 ); 377 373 __cfactx_start(main, dst, this->runner, __cfactx_invoke_coroutine); 378 374 379 /* paranoid */ verify( ! __preemption_enabled());375 verify( ! kernelTLS.preemption_state.enabled ); 380 376 381 377 dst->last = &src->self_cor; … … 395 391 /* paranoid */ verify(src->state == Active); 396 392 397 /* paranoid */ verify( ! __preemption_enabled());393 verify( ! kernelTLS.preemption_state.enabled ); 398 394 } 399 395 … … 403 399 $coroutine * dst = get_coroutine(this->runner); 404 400 405 /* paranoid */ verify( ! __preemption_enabled());406 /* paranoid */verify( dst->starter == src );407 /* paranoid */verify( dst->context.SP );401 verify( ! kernelTLS.preemption_state.enabled ); 402 verify( dst->starter == src ); 403 verify( dst->context.SP ); 408 404 409 405 // SKULLDUGGERY in debug the processors check that the … … 547 543 548 544 P( terminated ); 549 /* paranoid */ verify( active_processor()!= &this);545 verify( kernelTLS.this_processor != &this); 550 546 } 551 547 … … 697 693 #if defined(__CFA_WITH_VERIFY__) 698 694 static bool verify_fwd_bck_rng(void) { 699 __cfaabi_tls.ready_rng.fwd_seed = 25214903917_l64u * (rdtscl() ^ (uintptr_t)&verify_fwd_bck_rng);695 kernelTLS.ready_rng.fwd_seed = 25214903917_l64u * (rdtscl() ^ (uintptr_t)&verify_fwd_bck_rng); 700 696 701 697 unsigned values[10];
Note:
See TracChangeset
for help on using the changeset viewer.