}
static void LongJmp(ThreadState *thr, uptr *env) {
-#ifdef __powerpc__
- uptr mangled_sp = env[0];
-#elif SANITIZER_FREEBSD
- uptr mangled_sp = env[2];
-#elif SANITIZER_NETBSD
- uptr mangled_sp = env[6];
-#elif SANITIZER_MAC
-# ifdef __aarch64__
- uptr mangled_sp =
- (GetMacosVersion() >= MACOS_VERSION_MOJAVE) ? env[12] : env[13];
-# else
- uptr mangled_sp = env[2];
-# endif
-#elif SANITIZER_LINUX
-# ifdef __aarch64__
- uptr mangled_sp = env[13];
-# elif defined(__mips64)
- uptr mangled_sp = env[1];
-# else
- uptr mangled_sp = env[6];
-# endif
-#endif
- uptr sp = UnmangleLongJmpSp(mangled_sp);
+ uptr sp = ExtractLongJmpSp(env);
// Find the saved buf with matching sp.
for (uptr i = 0; i < thr->jmp_bufs.Size(); i++) {
JmpBuf *buf = &thr->jmp_bufs[i];
void WriteMemoryProfile(char *buf, uptr buf_size, uptr nthread, uptr nlive);
int ExtractResolvFDs(void *state, int *fds, int nfd);
int ExtractRecvmsgFDs(void *msg, int *fds, int nfd);
-uptr UnmangleLongJmpSp(uptr mangled_sp);
+uptr ExtractLongJmpSp(uptr *env);
void ImitateTlsWrite(ThreadState *thr, uptr tls_addr, uptr tls_size);
int call_pthread_cancel_with_cleanup(int(*fn)(void *c, void *m,
}
// Reverse operation of libc stack pointer mangling
-uptr UnmangleLongJmpSp(uptr mangled_sp) {
+static uptr UnmangleLongJmpSp(uptr mangled_sp) {
#if defined(__x86_64__)
-#if SANITIZER_FREEBSD || SANITIZER_NETBSD
+# if SANITIZER_FREEBSD || SANITIZER_NETBSD
return mangled_sp;
-#else // Linux
+# else // Linux
// Reverse of:
// xor %fs:0x30, %rsi
// rol $0x11, %rsi
: "=r" (sp)
: "0" (mangled_sp));
return sp;
-#endif
+# endif
#elif defined(__aarch64__)
# if SANITIZER_LINUX
return mangled_sp ^ _tsan_pointer_chk_guard;
#endif
}
+#ifdef __powerpc__
+# define LONG_JMP_SP_ENV_SLOT 0
+#elif SANITIZER_FREEBSD
+# define LONG_JMP_SP_ENV_SLOT 2
+#elif SANITIZER_NETBSD
+# define LONG_JMP_SP_ENV_SLOT 6
+#elif SANITIZER_LINUX
+# ifdef __aarch64__
+# define LONG_JMP_SP_ENV_SLOT 13
+# elif defined(__mips64)
+# define LONG_JMP_SP_ENV_SLOT 1
+# else
+# define LONG_JMP_SP_ENV_SLOT 6
+# endif
+#endif
+
+uptr ExtractLongJmpSp(uptr *env) {
+ uptr mangled_sp = env[LONG_JMP_SP_ENV_SLOT];
+ return UnmangleLongJmpSp(mangled_sp);
+}
+
void ImitateTlsWrite(ThreadState *thr, uptr tls_addr, uptr tls_size) {
// Check that the thr object is in tls;
const uptr thr_beg = (uptr)thr;
}
}
-uptr UnmangleLongJmpSp(uptr mangled_sp) {
+#ifdef __aarch64__
+# define LONG_JMP_SP_ENV_SLOT \
+ ((GetMacosVersion() >= MACOS_VERSION_MOJAVE) ? 12 : 13)
+#else
+# define LONG_JMP_SP_ENV_SLOT 2
+#endif
+
+uptr ExtractLongJmpSp(uptr *env) {
+ uptr mangled_sp = env[LONG_JMP_SP_ENV_SLOT];
return mangled_sp ^ __tsan_darwin_setjmp_xor_key;
}