- rc = sys_rseq(&__rseq_abi, 0);
- if (rc) {
- fprintf(stderr, "Error: sys_rseq(...) failed(%d): %s\n",
- errno, strerror(errno));
- return -1;
+ signal_off_save(&oldset);
+ if (caa_likely(!rseq_registered)) {
+ rc = sys_rseq(&__rseq_abi, 0);
+ if (rc) {
+ fprintf(stderr, "Error: sys_rseq(...) failed(%d): %s\n",
+ errno, strerror(errno));
+ __rseq_abi.u.e.cpu_id = -2;
+ ret = -1;
+ goto end;
+ }
+ rseq_registered = 1;
+ assert(rseq_current_cpu_raw() >= 0);
+ /*
+ * Register destroy notifier. Pointer needs to
+ * be non-NULL.
+ */
+ if (pthread_setspecific(rseq_key, (void *)0x1))
+ abort();