Loading libcorkscrew/arch-arm/backtrace-arm.c +23 −11 Original line number Diff line number Diff line Loading @@ -62,21 +62,19 @@ #include <sys/exec_elf.h> #include <cutils/log.h> #if !defined(__BIONIC_HAVE_UCONTEXT_T) /* Old versions of the Android <signal.h> didn't define ucontext_t. */ #include <asm/sigcontext.h> /* Ensure 'struct sigcontext' is defined. */ /* Machine context at the time a signal was raised. */ typedef struct ucontext { uint32_t uc_flags; struct ucontext* uc_link; stack_t uc_stack; struct sigcontext { uint32_t trap_no; uint32_t error_code; uint32_t oldmask; uint32_t gregs[16]; uint32_t arm_cpsr; uint32_t fault_address; } uc_mcontext; struct sigcontext uc_mcontext; uint32_t uc_sigmask; } ucontext_t; #endif /* !__BIONIC_HAVE_UCONTEXT_T */ /* Unwind state. */ typedef struct { Loading Loading @@ -560,9 +558,23 @@ ssize_t unwind_backtrace_signal_arch(siginfo_t* siginfo, void* sigcontext, const ucontext_t* uc = (const ucontext_t*)sigcontext; unwind_state_t state; for (int i = 0; i < 16; i++) { state.gregs[i] = uc->uc_mcontext.gregs[i]; } state.gregs[0] = uc->uc_mcontext.arm_r0; state.gregs[1] = uc->uc_mcontext.arm_r1; state.gregs[2] = uc->uc_mcontext.arm_r2; state.gregs[3] = uc->uc_mcontext.arm_r3; state.gregs[4] = uc->uc_mcontext.arm_r4; state.gregs[5] = uc->uc_mcontext.arm_r5; state.gregs[6] = uc->uc_mcontext.arm_r6; state.gregs[7] = uc->uc_mcontext.arm_r7; state.gregs[8] = uc->uc_mcontext.arm_r8; state.gregs[9] = uc->uc_mcontext.arm_r9; state.gregs[10] = uc->uc_mcontext.arm_r10; state.gregs[11] = uc->uc_mcontext.arm_fp; state.gregs[12] = uc->uc_mcontext.arm_ip; state.gregs[13] = uc->uc_mcontext.arm_sp; state.gregs[14] = uc->uc_mcontext.arm_lr; state.gregs[15] = uc->uc_mcontext.arm_pc; memory_t memory; init_memory(&memory, map_info_list); Loading libcorkscrew/arch-x86/backtrace-x86.c +34 −8 Original line number Diff line number Diff line Loading @@ -35,18 +35,50 @@ #if defined(__BIONIC__) #if defined(__BIONIC_HAVE_UCONTEXT_T) // Bionic offers the Linux kernel headers. #include <asm/sigcontext.h> #include <asm/ucontext.h> typedef struct ucontext ucontext_t; #else #else /* __BIONIC_HAVE_UCONTEXT_T */ /* Old versions of the Android <signal.h> didn't define ucontext_t. */ typedef struct { uint32_t gregs[32]; void* fpregs; uint32_t oldmask; uint32_t cr2; } mcontext_t; enum { REG_GS = 0, REG_FS, REG_ES, REG_DS, REG_EDI, REG_ESI, REG_EBP, REG_ESP, REG_EBX, REG_EDX, REG_ECX, REG_EAX, REG_TRAPNO, REG_ERR, REG_EIP, REG_CS, REG_EFL, REG_UESP, REG_SS }; /* Machine context at the time a signal was raised. */ typedef struct ucontext { uint32_t uc_flags; struct ucontext* uc_link; stack_t uc_stack; mcontext_t uc_mcontext; uint32_t uc_sigmask; } ucontext_t; #endif /* __BIONIC_HAVE_UCONTEXT_T */ #else /* __BIONIC__ */ // glibc has its own renaming of the Linux kernel's structures. #define __USE_GNU // For REG_EBP, REG_ESP, and REG_EIP. #include <ucontext.h> #endif #endif /* __ BIONIC__ */ /* Unwind state. */ typedef struct { Loading Loading @@ -96,15 +128,9 @@ ssize_t unwind_backtrace_signal_arch(siginfo_t* siginfo __attribute__((unused)), const ucontext_t* uc = (const ucontext_t*)sigcontext; unwind_state_t state; #if defined(__BIONIC__) state.ebp = uc->uc_mcontext.ebp; state.esp = uc->uc_mcontext.esp; state.eip = uc->uc_mcontext.eip; #else state.ebp = uc->uc_mcontext.gregs[REG_EBP]; state.esp = uc->uc_mcontext.gregs[REG_ESP]; state.eip = uc->uc_mcontext.gregs[REG_EIP]; #endif memory_t memory; init_memory(&memory, map_info_list); Loading Loading
libcorkscrew/arch-arm/backtrace-arm.c +23 −11 Original line number Diff line number Diff line Loading @@ -62,21 +62,19 @@ #include <sys/exec_elf.h> #include <cutils/log.h> #if !defined(__BIONIC_HAVE_UCONTEXT_T) /* Old versions of the Android <signal.h> didn't define ucontext_t. */ #include <asm/sigcontext.h> /* Ensure 'struct sigcontext' is defined. */ /* Machine context at the time a signal was raised. */ typedef struct ucontext { uint32_t uc_flags; struct ucontext* uc_link; stack_t uc_stack; struct sigcontext { uint32_t trap_no; uint32_t error_code; uint32_t oldmask; uint32_t gregs[16]; uint32_t arm_cpsr; uint32_t fault_address; } uc_mcontext; struct sigcontext uc_mcontext; uint32_t uc_sigmask; } ucontext_t; #endif /* !__BIONIC_HAVE_UCONTEXT_T */ /* Unwind state. */ typedef struct { Loading Loading @@ -560,9 +558,23 @@ ssize_t unwind_backtrace_signal_arch(siginfo_t* siginfo, void* sigcontext, const ucontext_t* uc = (const ucontext_t*)sigcontext; unwind_state_t state; for (int i = 0; i < 16; i++) { state.gregs[i] = uc->uc_mcontext.gregs[i]; } state.gregs[0] = uc->uc_mcontext.arm_r0; state.gregs[1] = uc->uc_mcontext.arm_r1; state.gregs[2] = uc->uc_mcontext.arm_r2; state.gregs[3] = uc->uc_mcontext.arm_r3; state.gregs[4] = uc->uc_mcontext.arm_r4; state.gregs[5] = uc->uc_mcontext.arm_r5; state.gregs[6] = uc->uc_mcontext.arm_r6; state.gregs[7] = uc->uc_mcontext.arm_r7; state.gregs[8] = uc->uc_mcontext.arm_r8; state.gregs[9] = uc->uc_mcontext.arm_r9; state.gregs[10] = uc->uc_mcontext.arm_r10; state.gregs[11] = uc->uc_mcontext.arm_fp; state.gregs[12] = uc->uc_mcontext.arm_ip; state.gregs[13] = uc->uc_mcontext.arm_sp; state.gregs[14] = uc->uc_mcontext.arm_lr; state.gregs[15] = uc->uc_mcontext.arm_pc; memory_t memory; init_memory(&memory, map_info_list); Loading
libcorkscrew/arch-x86/backtrace-x86.c +34 −8 Original line number Diff line number Diff line Loading @@ -35,18 +35,50 @@ #if defined(__BIONIC__) #if defined(__BIONIC_HAVE_UCONTEXT_T) // Bionic offers the Linux kernel headers. #include <asm/sigcontext.h> #include <asm/ucontext.h> typedef struct ucontext ucontext_t; #else #else /* __BIONIC_HAVE_UCONTEXT_T */ /* Old versions of the Android <signal.h> didn't define ucontext_t. */ typedef struct { uint32_t gregs[32]; void* fpregs; uint32_t oldmask; uint32_t cr2; } mcontext_t; enum { REG_GS = 0, REG_FS, REG_ES, REG_DS, REG_EDI, REG_ESI, REG_EBP, REG_ESP, REG_EBX, REG_EDX, REG_ECX, REG_EAX, REG_TRAPNO, REG_ERR, REG_EIP, REG_CS, REG_EFL, REG_UESP, REG_SS }; /* Machine context at the time a signal was raised. */ typedef struct ucontext { uint32_t uc_flags; struct ucontext* uc_link; stack_t uc_stack; mcontext_t uc_mcontext; uint32_t uc_sigmask; } ucontext_t; #endif /* __BIONIC_HAVE_UCONTEXT_T */ #else /* __BIONIC__ */ // glibc has its own renaming of the Linux kernel's structures. #define __USE_GNU // For REG_EBP, REG_ESP, and REG_EIP. #include <ucontext.h> #endif #endif /* __ BIONIC__ */ /* Unwind state. */ typedef struct { Loading Loading @@ -96,15 +128,9 @@ ssize_t unwind_backtrace_signal_arch(siginfo_t* siginfo __attribute__((unused)), const ucontext_t* uc = (const ucontext_t*)sigcontext; unwind_state_t state; #if defined(__BIONIC__) state.ebp = uc->uc_mcontext.ebp; state.esp = uc->uc_mcontext.esp; state.eip = uc->uc_mcontext.eip; #else state.ebp = uc->uc_mcontext.gregs[REG_EBP]; state.esp = uc->uc_mcontext.gregs[REG_ESP]; state.eip = uc->uc_mcontext.gregs[REG_EIP]; #endif memory_t memory; init_memory(&memory, map_info_list); Loading