Ignore:
Timestamp:
Nov 6, 2020, 11:22:57 AM (3 years ago)
Author:
Thierry Delisle <tdelisle@…>
Branches:
ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast-unique-expr, pthread-emulation, qualifiedEnum
Children:
54dcab1
Parents:
be5e34b
Message:

Change usage of TLS to more strongly segregate in kernel and out of kernel usage.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/concurrency/kernel/startup.cfa

    rbe5e34b r8fc652e0  
    118118//-----------------------------------------------------------------------------
    119119// Global state
    120 thread_local struct KernelThreadData kernelTLS __attribute__ ((tls_model ( "initial-exec" ))) @= {
     120thread_local struct KernelThreadData __cfaabi_tls __attribute__ ((tls_model ( "initial-exec" ))) @= {
    121121        NULL,                                                                                           // cannot use 0p
    122122        NULL,
     
    156156// Kernel boot procedures
    157157static void __kernel_startup(void) {
    158         verify( ! kernelTLS.preemption_state.enabled );
     158        /* paranoid */ verify( ! __preemption_enabled() );
    159159        __cfadbg_print_safe(runtime_core, "Kernel : Starting\n");
    160160
     
    212212
    213213        //initialize the global state variables
    214         kernelTLS.this_processor = mainProcessor;
    215         kernelTLS.this_proc_id   = (__processor_id_t*)mainProcessor;
    216         kernelTLS.this_thread    = mainThread;
     214        __cfaabi_tls.this_processor = mainProcessor;
     215        __cfaabi_tls.this_proc_id   = (__processor_id_t*)mainProcessor;
     216        __cfaabi_tls.this_thread    = mainThread;
    217217
    218218        #if !defined( __CFA_NO_STATISTICS__ )
    219                 kernelTLS.this_stats = (__stats_t *)& storage_mainProcStats;
    220                 __init_stats( kernelTLS.this_stats );
     219                __cfaabi_tls.this_stats = (__stats_t *)& storage_mainProcStats;
     220                __init_stats( __cfaabi_tls.this_stats );
    221221        #endif
    222222
     
    234234        // context. Hence, the main thread does not begin through __cfactx_invoke_thread, like all other threads. The trick here is that
    235235        // mainThread is on the ready queue when this call is made.
    236         __kernel_first_resume( kernelTLS.this_processor );
     236        __kernel_first_resume( __cfaabi_tls.this_processor );
    237237
    238238
     
    251251        __cfadbg_print_safe(runtime_core, "Kernel : Started\n--------------------------------------------------\n\n");
    252252
    253         verify( ! kernelTLS.preemption_state.enabled );
     253        /* paranoid */ verify( ! __preemption_enabled() );
    254254        enable_interrupts( __cfaabi_dbg_ctx );
    255         verify( TL_GET( preemption_state.enabled ) );
     255        /* paranoid */ verify( __preemption_enabled() );
     256
    256257}
    257258
     
    262263        mainCluster->io.ctxs = 0p;
    263264
    264         /* paranoid */ verify( TL_GET( preemption_state.enabled ) );
     265        /* paranoid */ verify( __preemption_enabled() );
    265266        disable_interrupts();
    266         /* paranoid */ verify( ! kernelTLS.preemption_state.enabled );
     267        /* paranoid */ verify( ! __preemption_enabled() );
    267268
    268269        __cfadbg_print_safe(runtime_core, "\n--------------------------------------------------\nKernel : Shutting down\n");
     
    272273        // which is currently here
    273274        __atomic_store_n(&mainProcessor->do_terminate, true, __ATOMIC_RELEASE);
    274         __kernel_last_resume( kernelTLS.this_processor );
     275        __kernel_last_resume( __cfaabi_tls.this_processor );
    275276        mainThread->self_cor.state = Halted;
    276277
     
    321322                __stats_t local_stats;
    322323                __init_stats( &local_stats );
    323                 kernelTLS.this_stats = &local_stats;
     324                __cfaabi_tls.this_stats = &local_stats;
    324325        #endif
    325326
    326327        processor * proc = (processor *) arg;
    327         kernelTLS.this_processor = proc;
    328         kernelTLS.this_proc_id   = (__processor_id_t*)proc;
    329         kernelTLS.this_thread    = 0p;
    330         kernelTLS.preemption_state.[enabled, disable_count] = [false, 1];
     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];
    331332        // SKULLDUGGERY: We want to create a context for the processor coroutine
    332333        // which is needed for the 2-step context switch. However, there is no reason
     
    340341
    341342        //Set global state
    342         kernelTLS.this_thread = 0p;
     343        __cfaabi_tls.this_thread = 0p;
    343344
    344345        //We now have a proper context from which to schedule threads
     
    370371        $coroutine * dst = get_coroutine(this->runner);
    371372
    372         verify( ! kernelTLS.preemption_state.enabled );
    373 
    374         kernelTLS.this_thread->curr_cor = dst;
     373        /* paranoid */ verify( ! __preemption_enabled() );
     374
     375        __cfaabi_tls.this_thread->curr_cor = dst;
    375376        __stack_prepare( &dst->stack, 65000 );
    376377        __cfactx_start(main, dst, this->runner, __cfactx_invoke_coroutine);
    377378
    378         verify( ! kernelTLS.preemption_state.enabled );
     379        /* paranoid */ verify( ! __preemption_enabled() );
    379380
    380381        dst->last = &src->self_cor;
     
    394395        /* paranoid */ verify(src->state == Active);
    395396
    396         verify( ! kernelTLS.preemption_state.enabled );
     397        /* paranoid */ verify( ! __preemption_enabled() );
    397398}
    398399
     
    402403        $coroutine * dst = get_coroutine(this->runner);
    403404
    404         verify( ! kernelTLS.preemption_state.enabled );
    405         verify( dst->starter == src );
    406         verify( dst->context.SP );
     405        /* paranoid */ verify( ! __preemption_enabled() );
     406        /* paranoid */ verify( dst->starter == src );
     407        /* paranoid */ verify( dst->context.SP );
    407408
    408409        // SKULLDUGGERY in debug the processors check that the
     
    546547
    547548                P( terminated );
    548                 verify( kernelTLS.this_processor != &this);
     549                /* paranoid */ verify( active_processor() != &this);
    549550        }
    550551
     
    696697#if defined(__CFA_WITH_VERIFY__)
    697698static bool verify_fwd_bck_rng(void) {
    698         kernelTLS.ready_rng.fwd_seed = 25214903917_l64u * (rdtscl() ^ (uintptr_t)&verify_fwd_bck_rng);
     699        __cfaabi_tls.ready_rng.fwd_seed = 25214903917_l64u * (rdtscl() ^ (uintptr_t)&verify_fwd_bck_rng);
    699700
    700701        unsigned values[10];
Note: See TracChangeset for help on using the changeset viewer.