- File:
-
- 1 edited
-
libcfa/src/concurrency/kernel/startup.cfa (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/kernel/startup.cfa
rf558b5f r3814957 19 19 // C Includes 20 20 #include <errno.h> // errno 21 #include <signal.h>22 21 #include <string.h> // strerror 23 22 #include <unistd.h> // sysconf 24 25 23 extern "C" { 26 24 #include <limits.h> // PTHREAD_STACK_MIN 27 #include <unistd.h> // syscall28 25 #include <sys/eventfd.h> // eventfd 29 26 #include <sys/mman.h> // mprotect 30 27 #include <sys/resource.h> // getrlimit 31 #include <sys/syscall.h> // __NR_xxx32 28 } 33 29 … … 102 98 extern void __wake_proc(processor *); 103 99 104 #if defined(CFA_HAVE_LINUX_LIBRSEQ)105 // No forward declaration needed106 #define __kernel_rseq_register rseq_register_current_thread107 #define __kernel_rseq_unregister rseq_unregister_current_thread108 #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_register113 #define __kernel_rseq_unregister __kernel_raw_rseq_unregister114 #else115 // No forward declaration needed116 // No initialization needed117 static inline void noop(void) {};118 119 #define __kernel_rseq_register noop120 #define __kernel_rseq_unregister noop121 #endif122 123 100 //----------------------------------------------------------------------------- 124 101 // Kernel storage … … 164 141 #elif defined(CFA_HAVE_LINUX_RSEQ_H) 165 142 extern "Cforall" { 166 __attribute__((aligned(128))) thread_local volatile struct rseq __cfaabi_rseq @= { 167 .cpu_id : RSEQ_CPU_ID_UNINITIALIZED, 168 }; 143 // thread_local volatile struct rseq __cfaabi_rseq; 169 144 } 170 145 #else … … 255 230 256 231 register_tls( mainProcessor ); 257 258 __kernel_rseq_register();259 232 260 233 //initialize the global state variables … … 323 296 mainProcessor->local_data = 0p; 324 297 325 __kernel_rseq_unregister();326 327 298 unregister_tls( mainProcessor ); 328 299 … … 376 347 register_tls( proc ); 377 348 378 __kernel_rseq_register(); 349 #if defined(CFA_HAVE_LINUX_LIBRSEQ) 350 rseq_register_current_thread(); 351 #endif 379 352 380 353 // SKULLDUGGERY: We want to create a context for the processor coroutine … … 416 389 417 390 proc->local_data = 0p; 418 419 __kernel_rseq_unregister();420 391 421 392 unregister_tls( proc ); … … 832 803 } 833 804 #endif 834 835 #if defined(CFA_HAVE_LINUX_LIBRSEQ)836 // No definition needed837 #elif defined(CFA_HAVE_LINUX_RSEQ_H)838 839 #if defined( __x86_64 ) || defined( __i386 )840 #define RSEQ_SIG 0x53053053841 #elif defined( __ARM_ARCH )842 #ifdef __ARMEB__843 #define RSEQ_SIG 0xf3def5e7 /* udf #24035 ; 0x5de3 (ARMv6+) */844 #else845 #define RSEQ_SIG 0xe7f5def3 /* udf #24035 ; 0x5de3 */846 #endif847 #endif848 849 extern void __disable_interrupts_hard();850 extern void __enable_interrupts_hard();851 852 void __kernel_raw_rseq_register (void) {853 /* paranoid */ verify( __cfaabi_rseq.cpu_id == RSEQ_CPU_ID_UNINITIALIZED );854 855 // int ret = syscall(__NR_rseq, &__cfaabi_rseq, sizeof(struct rseq), 0, (sigset_t *)0p, _NSIG / 8);856 int ret = syscall(__NR_rseq, &__cfaabi_rseq, sizeof(struct rseq), 0, RSEQ_SIG);857 if(ret != 0) {858 int e = errno;859 switch(e) {860 case EINVAL: abort("KERNEL ERROR: rseq register invalid argument");861 case ENOSYS: abort("KERNEL ERROR: rseq register no supported");862 case EFAULT: abort("KERNEL ERROR: rseq register with invalid argument");863 case EBUSY : abort("KERNEL ERROR: rseq register already registered");864 case EPERM : abort("KERNEL ERROR: rseq register sig argument on unregistration does not match the signature received on registration");865 default: abort("KERNEL ERROR: rseq register unexpected return %d", e);866 }867 }868 }869 870 void __kernel_raw_rseq_unregister(void) {871 /* paranoid */ verify( __cfaabi_rseq.cpu_id >= 0 );872 873 // int ret = syscall(__NR_rseq, &__cfaabi_rseq, sizeof(struct rseq), RSEQ_FLAG_UNREGISTER, (sigset_t *)0p, _NSIG / 8);874 int ret = syscall(__NR_rseq, &__cfaabi_rseq, sizeof(struct rseq), RSEQ_FLAG_UNREGISTER, RSEQ_SIG);875 if(ret != 0) {876 int e = errno;877 switch(e) {878 case EINVAL: abort("KERNEL ERROR: rseq unregister invalid argument");879 case ENOSYS: abort("KERNEL ERROR: rseq unregister no supported");880 case EFAULT: abort("KERNEL ERROR: rseq unregister with invalid argument");881 case EBUSY : abort("KERNEL ERROR: rseq unregister already registered");882 case EPERM : abort("KERNEL ERROR: rseq unregister sig argument on unregistration does not match the signature received on registration");883 default: abort("KERNEL ERROR: rseq unregisteunexpected return %d", e);884 }885 }886 }887 #else888 // No definition needed889 #endif
Note:
See TracChangeset
for help on using the changeset viewer.