Ignore:
Timestamp:
Jun 21, 2021, 3:40:00 PM (11 months ago)
Author:
Thierry Delisle <tdelisle@…>
Branches:
enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast-unique-expr
Children:
4d865ca
Parents:
8110bc3
Message:

Fixed rseq so it is initilizaed even for non-processor threads.

File:
1 edited

Legend:

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

    r8110bc3 r0ee224b  
    2929      #include <sys/mman.h>     // mprotect
    3030      #include <sys/resource.h> // getrlimit
    31         #include <sys/syscall.h>  // __NR_xxx
    3231}
    3332
     
    102101extern void __wake_proc(processor *);
    103102
    104 #if   defined(CFA_HAVE_LINUX_LIBRSEQ)
    105         // No forward declaration needed
    106         #define __kernel_rseq_register rseq_register_current_thread
    107         #define __kernel_rseq_unregister rseq_unregister_current_thread
    108 #elif defined(CFA_HAVE_LINUX_RSEQ_H)
    109         void __kernel_raw_rseq_register  (void);
    110         void __kernel_raw_rseq_unregister(void);
    111 
    112         #define __kernel_rseq_register __kernel_raw_rseq_register
    113         #define __kernel_rseq_unregister __kernel_raw_rseq_unregister
    114 #else
    115         // No forward declaration needed
    116         // No initialization needed
    117         static inline void noop(void) {}
    118 
    119         #define __kernel_rseq_register noop
    120         #define __kernel_rseq_unregister noop
    121 #endif
    122 
    123103//-----------------------------------------------------------------------------
    124104// Kernel storage
     
    256236        register_tls( mainProcessor );
    257237
    258         __kernel_rseq_register();
    259 
    260238        //initialize the global state variables
    261239        __cfaabi_tls.this_processor = mainProcessor;
     
    323301        mainProcessor->local_data = 0p;
    324302
    325         __kernel_rseq_unregister();
    326 
    327303        unregister_tls( mainProcessor );
    328304
     
    376352        register_tls( proc );
    377353
    378         __kernel_rseq_register();
    379 
    380354        // SKULLDUGGERY: We want to create a context for the processor coroutine
    381355        // which is needed for the 2-step context switch. However, there is no reason
     
    416390
    417391        proc->local_data = 0p;
    418 
    419         __kernel_rseq_unregister();
    420392
    421393        unregister_tls( proc );
     
    833805}
    834806#endif
    835 
    836 #if   defined(CFA_HAVE_LINUX_LIBRSEQ)
    837         // No definition needed
    838 #elif defined(CFA_HAVE_LINUX_RSEQ_H)
    839 
    840         #if defined( __x86_64 ) || defined( __i386 )
    841                 #define RSEQ_SIG        0x53053053
    842         #elif defined( __ARM_ARCH )
    843                 #ifdef __ARMEB__
    844                 #define RSEQ_SIG    0xf3def5e7      /* udf    #24035    ; 0x5de3 (ARMv6+) */
    845                 #else
    846                 #define RSEQ_SIG    0xe7f5def3      /* udf    #24035    ; 0x5de3 */
    847                 #endif
    848         #endif
    849 
    850         extern void __disable_interrupts_hard();
    851         extern void __enable_interrupts_hard();
    852 
    853         void __kernel_raw_rseq_register  (void) {
    854                 /* paranoid */ verify( __cfaabi_rseq.cpu_id == RSEQ_CPU_ID_UNINITIALIZED );
    855 
    856                 // int ret = syscall(__NR_rseq, &__cfaabi_rseq, sizeof(struct rseq), 0, (sigset_t *)0p, _NSIG / 8);
    857                 int ret = syscall(__NR_rseq, &__cfaabi_rseq, sizeof(struct rseq), 0, RSEQ_SIG);
    858                 if(ret != 0) {
    859                         int e = errno;
    860                         switch(e) {
    861                         case EINVAL: abort("KERNEL ERROR: rseq register invalid argument");
    862                         case ENOSYS: abort("KERNEL ERROR: rseq register no supported");
    863                         case EFAULT: abort("KERNEL ERROR: rseq register with invalid argument");
    864                         case EBUSY : abort("KERNEL ERROR: rseq register already registered");
    865                         case EPERM : abort("KERNEL ERROR: rseq register sig  argument  on unregistration does not match the signature received on registration");
    866                         default: abort("KERNEL ERROR: rseq register unexpected return %d", e);
    867                         }
    868                 }
    869         }
    870 
    871         void __kernel_raw_rseq_unregister(void) {
    872                 /* paranoid */ verify( __cfaabi_rseq.cpu_id >= 0 );
    873 
    874                 // int ret = syscall(__NR_rseq, &__cfaabi_rseq, sizeof(struct rseq), RSEQ_FLAG_UNREGISTER, (sigset_t *)0p, _NSIG / 8);
    875                 int ret = syscall(__NR_rseq, &__cfaabi_rseq, sizeof(struct rseq), RSEQ_FLAG_UNREGISTER, RSEQ_SIG);
    876                 if(ret != 0) {
    877                         int e = errno;
    878                         switch(e) {
    879                         case EINVAL: abort("KERNEL ERROR: rseq unregister invalid argument");
    880                         case ENOSYS: abort("KERNEL ERROR: rseq unregister no supported");
    881                         case EFAULT: abort("KERNEL ERROR: rseq unregister with invalid argument");
    882                         case EBUSY : abort("KERNEL ERROR: rseq unregister already registered");
    883                         case EPERM : abort("KERNEL ERROR: rseq unregister sig  argument  on unregistration does not match the signature received on registration");
    884                         default: abort("KERNEL ERROR: rseq unregisteunexpected return %d", e);
    885                         }
    886                 }
    887         }
    888 #else
    889         // No definition needed
    890 #endif
Note: See TracChangeset for help on using the changeset viewer.