Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6b3bab39 authored by Elliott Hughes's avatar Elliott Hughes
Browse files

Fix libcorkscrew for x86 targets (bionic) as well as the host (glibc).

Longer term, we might want to offer <ucontext.h> and have that be like glibc's,
but not today. (Note that POSIX says nothing about mcontext_t and glibc,
Mac OS, and the Linux kernel headers are all mutually incompatible.)

Change-Id: Ia074b51f4567cd54e06bbe29721389c8d1278614
parent 04607b8a
Loading
Loading
Loading
Loading
+18 −0
Original line number Diff line number Diff line
@@ -33,9 +33,21 @@
#include <sys/ptrace.h>
#include <cutils/log.h>

#if defined(__BIONIC__)

// Bionic offers the Linux kernel headers.
#include <asm/sigcontext.h>
#include <asm/ucontext.h>
typedef struct ucontext ucontext_t;

#else

// 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

/* Unwind state. */
typedef struct {
    uint32_t ebp;
@@ -84,9 +96,15 @@ ssize_t unwind_backtrace_signal_arch(siginfo_t* siginfo, void* sigcontext,
    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);