Index: libcfa/src/concurrency/kernel/startup.cfa
===================================================================
--- libcfa/src/concurrency/kernel/startup.cfa	(revision 95958a814c13cbc06ba4e807c0e4ce23dfdba614)
+++ libcfa/src/concurrency/kernel/startup.cfa	(revision f558b5f776427c8e5d02d7affb6784f4bfc6082b)
@@ -19,11 +19,15 @@
 // C Includes
 #include <errno.h>              // errno
+#include <signal.h>
 #include <string.h>             // strerror
 #include <unistd.h>             // sysconf
+
 extern "C" {
       #include <limits.h>       // PTHREAD_STACK_MIN
+	#include <unistd.h>       // syscall
 	#include <sys/eventfd.h>  // eventfd
       #include <sys/mman.h>     // mprotect
       #include <sys/resource.h> // getrlimit
+	#include <sys/syscall.h>  // __NR_xxx
 }
 
@@ -98,4 +102,23 @@
 extern void __wake_proc(processor *);
 
+#if   defined(CFA_HAVE_LINUX_LIBRSEQ)
+	// No forward declaration needed
+	#define __kernel_rseq_register rseq_register_current_thread
+	#define __kernel_rseq_unregister rseq_unregister_current_thread
+#elif defined(CFA_HAVE_LINUX_RSEQ_H)
+	void __kernel_raw_rseq_register  (void);
+	void __kernel_raw_rseq_unregister(void);
+
+	#define __kernel_rseq_register __kernel_raw_rseq_register
+	#define __kernel_rseq_unregister __kernel_raw_rseq_unregister
+#else
+	// No forward declaration needed
+	// No initialization needed
+	static inline void noop(void) {};
+
+	#define __kernel_rseq_register noop
+	#define __kernel_rseq_unregister noop
+#endif
+
 //-----------------------------------------------------------------------------
 // Kernel storage
@@ -141,5 +164,7 @@
 #elif defined(CFA_HAVE_LINUX_RSEQ_H)
 	extern "Cforall" {
-		// thread_local volatile struct rseq __cfaabi_rseq;
+		__attribute__((aligned(128))) thread_local volatile struct rseq __cfaabi_rseq @= {
+			.cpu_id : RSEQ_CPU_ID_UNINITIALIZED,
+		};
 	}
 #else
@@ -230,4 +255,6 @@
 
 	register_tls( mainProcessor );
+
+	__kernel_rseq_register();
 
 	//initialize the global state variables
@@ -296,4 +323,6 @@
 	mainProcessor->local_data = 0p;
 
+	__kernel_rseq_unregister();
+
 	unregister_tls( mainProcessor );
 
@@ -347,7 +376,5 @@
 	register_tls( proc );
 
-	#if defined(CFA_HAVE_LINUX_LIBRSEQ)
-		rseq_register_current_thread();
-	#endif
+	__kernel_rseq_register();
 
 	// SKULLDUGGERY: We want to create a context for the processor coroutine
@@ -389,4 +416,6 @@
 
 	proc->local_data = 0p;
+
+	__kernel_rseq_unregister();
 
 	unregister_tls( proc );
@@ -803,2 +832,58 @@
 }
 #endif
+
+#if   defined(CFA_HAVE_LINUX_LIBRSEQ)
+	// No definition needed
+#elif defined(CFA_HAVE_LINUX_RSEQ_H)
+
+	#if defined( __x86_64 ) || defined( __i386 )
+		#define RSEQ_SIG	0x53053053
+	#elif defined( __ARM_ARCH )
+		#ifdef __ARMEB__
+		#define RSEQ_SIG    0xf3def5e7      /* udf    #24035    ; 0x5de3 (ARMv6+) */
+		#else
+		#define RSEQ_SIG    0xe7f5def3      /* udf    #24035    ; 0x5de3 */
+		#endif
+	#endif
+
+	extern void __disable_interrupts_hard();
+	extern void __enable_interrupts_hard();
+
+	void __kernel_raw_rseq_register  (void) {
+		/* paranoid */ verify( __cfaabi_rseq.cpu_id == RSEQ_CPU_ID_UNINITIALIZED );
+
+		// int ret = syscall(__NR_rseq, &__cfaabi_rseq, sizeof(struct rseq), 0, (sigset_t *)0p, _NSIG / 8);
+		int ret = syscall(__NR_rseq, &__cfaabi_rseq, sizeof(struct rseq), 0, RSEQ_SIG);
+		if(ret != 0) {
+			int e = errno;
+			switch(e) {
+			case EINVAL: abort("KERNEL ERROR: rseq register invalid argument");
+			case ENOSYS: abort("KERNEL ERROR: rseq register no supported");
+			case EFAULT: abort("KERNEL ERROR: rseq register with invalid argument");
+			case EBUSY : abort("KERNEL ERROR: rseq register already registered");
+			case EPERM : abort("KERNEL ERROR: rseq register sig  argument  on unregistration does not match the signature received on registration");
+			default: abort("KERNEL ERROR: rseq register unexpected return %d", e);
+			}
+		}
+	}
+
+	void __kernel_raw_rseq_unregister(void) {
+		/* paranoid */ verify( __cfaabi_rseq.cpu_id >= 0 );
+
+		// int ret = syscall(__NR_rseq, &__cfaabi_rseq, sizeof(struct rseq), RSEQ_FLAG_UNREGISTER, (sigset_t *)0p, _NSIG / 8);
+		int ret = syscall(__NR_rseq, &__cfaabi_rseq, sizeof(struct rseq), RSEQ_FLAG_UNREGISTER, RSEQ_SIG);
+		if(ret != 0) {
+			int e = errno;
+			switch(e) {
+			case EINVAL: abort("KERNEL ERROR: rseq unregister invalid argument");
+			case ENOSYS: abort("KERNEL ERROR: rseq unregister no supported");
+			case EFAULT: abort("KERNEL ERROR: rseq unregister with invalid argument");
+			case EBUSY : abort("KERNEL ERROR: rseq unregister already registered");
+			case EPERM : abort("KERNEL ERROR: rseq unregister sig  argument  on unregistration does not match the signature received on registration");
+			default: abort("KERNEL ERROR: rseq unregisteunexpected return %d", e);
+			}
+		}
+	}
+#else
+	// No definition needed
+#endif
Index: libcfa/src/concurrency/kernel_private.hfa
===================================================================
--- libcfa/src/concurrency/kernel_private.hfa	(revision 95958a814c13cbc06ba4e807c0e4ce23dfdba614)
+++ libcfa/src/concurrency/kernel_private.hfa	(revision f558b5f776427c8e5d02d7affb6784f4bfc6082b)
@@ -30,5 +30,5 @@
 	#include <rseq/rseq.h>
 #elif defined(CFA_HAVE_LINUX_RSEQ_H)
-	// #include <linux/rseq.h>
+	#include <linux/rseq.h>
 #else
 	#ifndef _GNU_SOURCE
@@ -60,5 +60,5 @@
 #elif defined(CFA_HAVE_LINUX_RSEQ_H)
 	extern "Cforall" {
-		// extern __attribute__((aligned(128))) thread_local volatile struct rseq __cfaabi_rseq;
+		extern __attribute__((aligned(128))) thread_local volatile struct rseq __cfaabi_rseq;
 	}
 #else
@@ -69,7 +69,9 @@
 	/* paranoid */ verify( ! __preemption_enabled() );
 #if   defined(CFA_HAVE_LINUX_LIBRSEQ)
-	return rseq_current_cpu_raw();
+	return rseq_current_cpu();
 #elif defined(CFA_HAVE_LINUX_RSEQ_H)
-	// return __cfaabi_rseq.cpu_id;
+	int r = __cfaabi_rseq.cpu_id;
+	/* paranoid */ verify( r >= 0 );
+	return r;
 #else
 	return sched_getcpu();
