From 0ca98af7f96fcc5a1e16c314b3da8eb76c510207 Mon Sep 17 00:00:00 2001 From: David CARLIER Date: Fri, 19 Jul 2024 21:22:33 +0100 Subject: [PATCH] Dump regs fbsd fix (#99676) --- .../lib/safestack/safestack_platform.h | 2 + .../lib/sanitizer_common/sanitizer_linux.cpp | 47 +++++++++++++++---- .../FreeBSD/dump_registers_x86_64.cpp | 19 ++++++++ 3 files changed, 60 insertions(+), 8 deletions(-) create mode 100644 compiler-rt/test/sanitizer_common/TestCases/FreeBSD/dump_registers_x86_64.cpp diff --git a/compiler-rt/lib/safestack/safestack_platform.h b/compiler-rt/lib/safestack/safestack_platform.h index 68d26813bef4..41c7c25fdaf4 100644 --- a/compiler-rt/lib/safestack/safestack_platform.h +++ b/compiler-rt/lib/safestack/safestack_platform.h @@ -143,6 +143,8 @@ inline void *Mmap(void *addr, size_t length, int prot, int flags, int fd, return __mmap(addr, length, prot, flags, fd, 0, offset); #elif SANITIZER_FREEBSD && (defined(__aarch64__) || defined(__x86_64__)) return (void *)__syscall(SYS_mmap, addr, length, prot, flags, fd, offset); +#elif SANITIZER_FREEBSD && (defined(__i386__)) + return (void *)syscall(SYS_mmap, addr, length, prot, flags, fd, offset); #elif SANITIZER_SOLARIS return _REAL64(mmap)(addr, length, prot, flags, fd, offset); #elif SANITIZER_LINUX_USES_64BIT_SYSCALLS diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp index 47f9f0c4590f..40c46a894963 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp +++ b/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp @@ -2121,7 +2121,8 @@ bool SignalContext::IsTrueFaultingAddress() const { UNUSED static const char *RegNumToRegName(int reg) { switch (reg) { -# if defined(__x86_64__) +# if SANITIZER_LINUX +# if defined(__x86_64__) case REG_RAX: return "rax"; case REG_RBX: @@ -2154,7 +2155,7 @@ static const char *RegNumToRegName(int reg) { return "r14"; case REG_R15: return "r15"; -# elif defined(__i386__) +# elif defined(__i386__) case REG_EAX: return "eax"; case REG_EBX: @@ -2171,6 +2172,7 @@ static const char *RegNumToRegName(int reg) { return "ebp"; case REG_ESP: return "esp"; +# endif # endif default: return NULL; @@ -2178,22 +2180,24 @@ static const char *RegNumToRegName(int reg) { return NULL; } +# if SANITIZER_LINUX UNUSED static void DumpSingleReg(ucontext_t *ctx, int RegNum) { const char *RegName = RegNumToRegName(RegNum); -# if defined(__x86_64__) +# if defined(__x86_64__) Printf("%s%s = 0x%016llx ", internal_strlen(RegName) == 2 ? " " : "", RegName, ctx->uc_mcontext.gregs[RegNum]); -# elif defined(__i386__) +# elif defined(__i386__) Printf("%s = 0x%08x ", RegName, ctx->uc_mcontext.gregs[RegNum]); -# else +# else (void)RegName; -# endif +# endif } +# endif void SignalContext::DumpAllRegisters(void *context) { -# if SANITIZER_LINUX ucontext_t *ucontext = (ucontext_t *)context; +# if SANITIZER_LINUX # if defined(__x86_64__) Report("Register values:\n"); DumpSingleReg(ucontext, REG_RAX); @@ -2232,8 +2236,35 @@ void SignalContext::DumpAllRegisters(void *context) { DumpSingleReg(ucontext, REG_EBP); DumpSingleReg(ucontext, REG_ESP); Printf("\n"); -# endif +# else (void)ucontext; +# endif +# elif SANITIZER_FREEBSD +# if defined(__x86_64__) + Report("Register values:\n"); + Printf("rax = 0x%016llx ", ucontext->uc_mcontext.mc_rax); + Printf("rbx = 0x%016llx ", ucontext->uc_mcontext.mc_rbx); + Printf("rcx = 0x%016llx ", ucontext->uc_mcontext.mc_rcx); + Printf("rdx = 0x%016llx ", ucontext->uc_mcontext.mc_rdx); + Printf("\n"); + Printf("rdi = 0x%016llx ", ucontext->uc_mcontext.mc_rdi); + Printf("rsi = 0x%016llx ", ucontext->uc_mcontext.mc_rsi); + Printf("rbp = 0x%016llx ", ucontext->uc_mcontext.mc_rbp); + Printf("rsp = 0x%016llx ", ucontext->uc_mcontext.mc_rsp); + Printf("\n"); + Printf(" r8 = 0x%016llx ", ucontext->uc_mcontext.mc_r8); + Printf(" r9 = 0x%016llx ", ucontext->uc_mcontext.mc_r9); + Printf("r10 = 0x%016llx ", ucontext->uc_mcontext.mc_r10); + Printf("r11 = 0x%016llx ", ucontext->uc_mcontext.mc_r11); + Printf("\n"); + Printf("r12 = 0x%016llx ", ucontext->uc_mcontext.mc_r12); + Printf("r13 = 0x%016llx ", ucontext->uc_mcontext.mc_r13); + Printf("r14 = 0x%016llx ", ucontext->uc_mcontext.mc_r14); + Printf("r15 = 0x%016llx ", ucontext->uc_mcontext.mc_r15); + Printf("\n"); +# else + (void)ucontext; +# endif # endif // FIXME: Implement this for other OSes and architectures. } diff --git a/compiler-rt/test/sanitizer_common/TestCases/FreeBSD/dump_registers_x86_64.cpp b/compiler-rt/test/sanitizer_common/TestCases/FreeBSD/dump_registers_x86_64.cpp new file mode 100644 index 000000000000..3d11ef0e098f --- /dev/null +++ b/compiler-rt/test/sanitizer_common/TestCases/FreeBSD/dump_registers_x86_64.cpp @@ -0,0 +1,19 @@ +// Check that sanitizer prints registers dump_registers on dump_registers=1 +// RUN: %clangxx %s -o %t +// RUN: %env_tool_opts=dump_registers=0 not %run %t 2>&1 | FileCheck %s --check-prefixes=CHECK-NODUMP --strict-whitespace +// RUN: not %run %t 2>&1 | FileCheck %s --check-prefixes=CHECK-DUMP --strict-whitespace +// +// REQUIRES: x86_64-target-arch + +#include + +int main() { + raise(SIGSEGV); + // CHECK-DUMP: Register values + // CHECK-DUMP-NEXT: rax = {{0x[0-9a-f]+}} rbx = {{0x[0-9a-f]+}} rcx = {{0x[0-9a-f]+}} rdx = {{0x[0-9a-f]+}} + // CHECK-DUMP-NEXT: rdi = {{0x[0-9a-f]+}} rsi = {{0x[0-9a-f]+}} rbp = {{0x[0-9a-f]+}} rsp = {{0x[0-9a-f]+}} + // CHECK-DUMP-NEXT: r8 = {{0x[0-9a-f]+}} r9 = {{0x[0-9a-f]+}} r10 = {{0x[0-9a-f]+}} r11 = {{0x[0-9a-f]+}} + // CHECK-DUMP-NEXT: r12 = {{0x[0-9a-f]+}} r13 = {{0x[0-9a-f]+}} r14 = {{0x[0-9a-f]+}} r15 = {{0x[0-9a-f]+}} + // CHECK-NODUMP-NOT: Register values + return 0; +}