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

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/concurrency/ready_queue.cfa

    r8110bc3 r0ee224b  
    3030#include "math.hfa"
    3131
     32#include <errno.h>
    3233#include <unistd.h>
     34
     35extern "C" {
     36        #include <sys/syscall.h>  // __NR_xxx
     37}
    3338
    3439#include "ready_subqueue.hfa"
     
    8994}
    9095
     96#if   defined(CFA_HAVE_LINUX_LIBRSEQ)
     97        // No forward declaration needed
     98        #define __kernel_rseq_register rseq_register_current_thread
     99        #define __kernel_rseq_unregister rseq_unregister_current_thread
     100#elif defined(CFA_HAVE_LINUX_RSEQ_H)
     101        void __kernel_raw_rseq_register  (void);
     102        void __kernel_raw_rseq_unregister(void);
     103
     104        #define __kernel_rseq_register __kernel_raw_rseq_register
     105        #define __kernel_rseq_unregister __kernel_raw_rseq_unregister
     106#else
     107        // No forward declaration needed
     108        // No initialization needed
     109        static inline void noop(void) {}
     110
     111        #define __kernel_rseq_register noop
     112        #define __kernel_rseq_unregister noop
     113#endif
     114
    91115//=======================================================================
    92116// Cluster wide reader-writer lock
     
    111135// Lock-Free registering/unregistering of threads
    112136unsigned register_proc_id( void ) with(*__scheduler_lock) {
     137        __kernel_rseq_register();
     138
    113139        __cfadbg_print_safe(ready_queue, "Kernel : Registering proc %p for RW-Lock\n", proc);
    114140        bool * handle = (bool *)&kernelTLS().sched_lock;
     
    165191
    166192        __cfadbg_print_safe(ready_queue, "Kernel : Unregister proc %p\n", proc);
     193
     194        __kernel_rseq_unregister();
    167195}
    168196
     
    848876        }
    849877#endif
     878
     879
     880#if   defined(CFA_HAVE_LINUX_LIBRSEQ)
     881        // No definition needed
     882#elif defined(CFA_HAVE_LINUX_RSEQ_H)
     883
     884        #if defined( __x86_64 ) || defined( __i386 )
     885                #define RSEQ_SIG        0x53053053
     886        #elif defined( __ARM_ARCH )
     887                #ifdef __ARMEB__
     888                #define RSEQ_SIG    0xf3def5e7      /* udf    #24035    ; 0x5de3 (ARMv6+) */
     889                #else
     890                #define RSEQ_SIG    0xe7f5def3      /* udf    #24035    ; 0x5de3 */
     891                #endif
     892        #endif
     893
     894        extern void __disable_interrupts_hard();
     895        extern void __enable_interrupts_hard();
     896
     897        void __kernel_raw_rseq_register  (void) {
     898                /* paranoid */ verify( __cfaabi_rseq.cpu_id == RSEQ_CPU_ID_UNINITIALIZED );
     899
     900                // int ret = syscall(__NR_rseq, &__cfaabi_rseq, sizeof(struct rseq), 0, (sigset_t *)0p, _NSIG / 8);
     901                int ret = syscall(__NR_rseq, &__cfaabi_rseq, sizeof(struct rseq), 0, RSEQ_SIG);
     902                if(ret != 0) {
     903                        int e = errno;
     904                        switch(e) {
     905                        case EINVAL: abort("KERNEL ERROR: rseq register invalid argument");
     906                        case ENOSYS: abort("KERNEL ERROR: rseq register no supported");
     907                        case EFAULT: abort("KERNEL ERROR: rseq register with invalid argument");
     908                        case EBUSY : abort("KERNEL ERROR: rseq register already registered");
     909                        case EPERM : abort("KERNEL ERROR: rseq register sig  argument  on unregistration does not match the signature received on registration");
     910                        default: abort("KERNEL ERROR: rseq register unexpected return %d", e);
     911                        }
     912                }
     913        }
     914
     915        void __kernel_raw_rseq_unregister(void) {
     916                /* paranoid */ verify( __cfaabi_rseq.cpu_id >= 0 );
     917
     918                // int ret = syscall(__NR_rseq, &__cfaabi_rseq, sizeof(struct rseq), RSEQ_FLAG_UNREGISTER, (sigset_t *)0p, _NSIG / 8);
     919                int ret = syscall(__NR_rseq, &__cfaabi_rseq, sizeof(struct rseq), RSEQ_FLAG_UNREGISTER, RSEQ_SIG);
     920                if(ret != 0) {
     921                        int e = errno;
     922                        switch(e) {
     923                        case EINVAL: abort("KERNEL ERROR: rseq unregister invalid argument");
     924                        case ENOSYS: abort("KERNEL ERROR: rseq unregister no supported");
     925                        case EFAULT: abort("KERNEL ERROR: rseq unregister with invalid argument");
     926                        case EBUSY : abort("KERNEL ERROR: rseq unregister already registered");
     927                        case EPERM : abort("KERNEL ERROR: rseq unregister sig  argument  on unregistration does not match the signature received on registration");
     928                        default: abort("KERNEL ERROR: rseq unregisteunexpected return %d", e);
     929                        }
     930                }
     931        }
     932#else
     933        // No definition needed
     934#endif
Note: See TracChangeset for help on using the changeset viewer.