mirror of
https://github.com/tobast/libunwind-eh_elf.git
synced 2024-09-30 02:19:31 +02:00
Move uc_addr to os-specific file
This commit is contained in:
parent
79d012348d
commit
0dbeeeb08d
8 changed files with 144 additions and 110 deletions
|
@ -40,65 +40,12 @@ static struct unw_addr_space local_addr_space;
|
||||||
|
|
||||||
PROTECTED unw_addr_space_t unw_local_addr_space = &local_addr_space;
|
PROTECTED unw_addr_space_t unw_local_addr_space = &local_addr_space;
|
||||||
|
|
||||||
static inline void *
|
|
||||||
uc_addr (ucontext_t *uc, int reg)
|
|
||||||
{
|
|
||||||
void *addr;
|
|
||||||
|
|
||||||
switch (reg)
|
|
||||||
{
|
|
||||||
#if defined __linux__
|
|
||||||
case UNW_X86_GS: addr = &uc->uc_mcontext.gregs[REG_GS]; break;
|
|
||||||
case UNW_X86_FS: addr = &uc->uc_mcontext.gregs[REG_FS]; break;
|
|
||||||
case UNW_X86_ES: addr = &uc->uc_mcontext.gregs[REG_ES]; break;
|
|
||||||
case UNW_X86_DS: addr = &uc->uc_mcontext.gregs[REG_DS]; break;
|
|
||||||
case UNW_X86_EAX: addr = &uc->uc_mcontext.gregs[REG_EAX]; break;
|
|
||||||
case UNW_X86_EBX: addr = &uc->uc_mcontext.gregs[REG_EBX]; break;
|
|
||||||
case UNW_X86_ECX: addr = &uc->uc_mcontext.gregs[REG_ECX]; break;
|
|
||||||
case UNW_X86_EDX: addr = &uc->uc_mcontext.gregs[REG_EDX]; break;
|
|
||||||
case UNW_X86_ESI: addr = &uc->uc_mcontext.gregs[REG_ESI]; break;
|
|
||||||
case UNW_X86_EDI: addr = &uc->uc_mcontext.gregs[REG_EDI]; break;
|
|
||||||
case UNW_X86_EBP: addr = &uc->uc_mcontext.gregs[REG_EBP]; break;
|
|
||||||
case UNW_X86_EIP: addr = &uc->uc_mcontext.gregs[REG_EIP]; break;
|
|
||||||
case UNW_X86_ESP: addr = &uc->uc_mcontext.gregs[REG_ESP]; break;
|
|
||||||
case UNW_X86_TRAPNO: addr = &uc->uc_mcontext.gregs[REG_TRAPNO]; break;
|
|
||||||
case UNW_X86_CS: addr = &uc->uc_mcontext.gregs[REG_CS]; break;
|
|
||||||
case UNW_X86_EFLAGS: addr = &uc->uc_mcontext.gregs[REG_EFL]; break;
|
|
||||||
case UNW_X86_SS: addr = &uc->uc_mcontext.gregs[REG_SS]; break;
|
|
||||||
#elif defined __FreeBSD__
|
|
||||||
case UNW_X86_GS: addr = &uc->uc_mcontext.mc_gs; break;
|
|
||||||
case UNW_X86_FS: addr = &uc->uc_mcontext.mc_fs; break;
|
|
||||||
case UNW_X86_ES: addr = &uc->uc_mcontext.mc_es; break;
|
|
||||||
case UNW_X86_DS: addr = &uc->uc_mcontext.mc_ds; break;
|
|
||||||
case UNW_X86_EAX: addr = &uc->uc_mcontext.mc_eax; break;
|
|
||||||
case UNW_X86_EBX: addr = &uc->uc_mcontext.mc_ebx; break;
|
|
||||||
case UNW_X86_ECX: addr = &uc->uc_mcontext.mc_ecx; break;
|
|
||||||
case UNW_X86_EDX: addr = &uc->uc_mcontext.mc_edx; break;
|
|
||||||
case UNW_X86_ESI: addr = &uc->uc_mcontext.mc_esi; break;
|
|
||||||
case UNW_X86_EDI: addr = &uc->uc_mcontext.mc_edi; break;
|
|
||||||
case UNW_X86_EBP: addr = &uc->uc_mcontext.mc_ebp; break;
|
|
||||||
case UNW_X86_EIP: addr = &uc->uc_mcontext.mc_eip; break;
|
|
||||||
case UNW_X86_ESP: addr = &uc->uc_mcontext.mc_esp; break;
|
|
||||||
case UNW_X86_TRAPNO: addr = &uc->uc_mcontext.mc_trapno; break;
|
|
||||||
case UNW_X86_CS: addr = &uc->uc_mcontext.mc_cs; break;
|
|
||||||
case UNW_X86_EFLAGS: addr = &uc->uc_mcontext.mc_eflags; break;
|
|
||||||
case UNW_X86_SS: addr = &uc->uc_mcontext.mc_ss; break;
|
|
||||||
#else
|
|
||||||
#error Port me
|
|
||||||
#endif
|
|
||||||
|
|
||||||
default:
|
|
||||||
addr = NULL;
|
|
||||||
}
|
|
||||||
return addr;
|
|
||||||
}
|
|
||||||
|
|
||||||
# ifdef UNW_LOCAL_ONLY
|
# ifdef UNW_LOCAL_ONLY
|
||||||
|
|
||||||
HIDDEN void *
|
HIDDEN void *
|
||||||
tdep_uc_addr (ucontext_t *uc, int reg)
|
tdep_uc_addr (ucontext_t *uc, int reg)
|
||||||
{
|
{
|
||||||
return uc_addr (uc, reg);
|
return x86_r_uc_addr (uc, reg);
|
||||||
}
|
}
|
||||||
|
|
||||||
# endif /* UNW_LOCAL_ONLY */
|
# endif /* UNW_LOCAL_ONLY */
|
||||||
|
@ -199,7 +146,7 @@ access_reg (unw_addr_space_t as, unw_regnum_t reg, unw_word_t *val, int write,
|
||||||
if (unw_is_fpreg (reg))
|
if (unw_is_fpreg (reg))
|
||||||
goto badreg;
|
goto badreg;
|
||||||
|
|
||||||
if (!(addr = uc_addr (uc, reg)))
|
if (!(addr = x86_r_uc_addr (uc, reg)))
|
||||||
goto badreg;
|
goto badreg;
|
||||||
|
|
||||||
if (write)
|
if (write)
|
||||||
|
@ -229,7 +176,7 @@ access_fpreg (unw_addr_space_t as, unw_regnum_t reg, unw_fpreg_t *val,
|
||||||
if (!unw_is_fpreg (reg))
|
if (!unw_is_fpreg (reg))
|
||||||
goto badreg;
|
goto badreg;
|
||||||
|
|
||||||
if (!(addr = uc_addr (uc, reg)))
|
if (!(addr = x86_r_uc_addr (uc, reg)))
|
||||||
goto badreg;
|
goto badreg;
|
||||||
|
|
||||||
if (write)
|
if (write)
|
||||||
|
|
|
@ -255,3 +255,36 @@ x86_get_scratch_loc (struct cursor *c, unw_regnum_t reg)
|
||||||
else
|
else
|
||||||
return DWARF_MEM_LOC (c, addr + off);
|
return DWARF_MEM_LOC (c, addr + off);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef UNW_REMOTE_ONLY
|
||||||
|
HIDDEN void *
|
||||||
|
x86_r_uc_addr (ucontext_t *uc, int reg)
|
||||||
|
{
|
||||||
|
void *addr;
|
||||||
|
|
||||||
|
switch (reg)
|
||||||
|
{
|
||||||
|
case UNW_X86_GS: addr = &uc->uc_mcontext.mc_gs; break;
|
||||||
|
case UNW_X86_FS: addr = &uc->uc_mcontext.mc_fs; break;
|
||||||
|
case UNW_X86_ES: addr = &uc->uc_mcontext.mc_es; break;
|
||||||
|
case UNW_X86_DS: addr = &uc->uc_mcontext.mc_ds; break;
|
||||||
|
case UNW_X86_EAX: addr = &uc->uc_mcontext.mc_eax; break;
|
||||||
|
case UNW_X86_EBX: addr = &uc->uc_mcontext.mc_ebx; break;
|
||||||
|
case UNW_X86_ECX: addr = &uc->uc_mcontext.mc_ecx; break;
|
||||||
|
case UNW_X86_EDX: addr = &uc->uc_mcontext.mc_edx; break;
|
||||||
|
case UNW_X86_ESI: addr = &uc->uc_mcontext.mc_esi; break;
|
||||||
|
case UNW_X86_EDI: addr = &uc->uc_mcontext.mc_edi; break;
|
||||||
|
case UNW_X86_EBP: addr = &uc->uc_mcontext.mc_ebp; break;
|
||||||
|
case UNW_X86_EIP: addr = &uc->uc_mcontext.mc_eip; break;
|
||||||
|
case UNW_X86_ESP: addr = &uc->uc_mcontext.mc_esp; break;
|
||||||
|
case UNW_X86_TRAPNO: addr = &uc->uc_mcontext.mc_trapno; break;
|
||||||
|
case UNW_X86_CS: addr = &uc->uc_mcontext.mc_cs; break;
|
||||||
|
case UNW_X86_EFLAGS: addr = &uc->uc_mcontext.mc_eflags; break;
|
||||||
|
case UNW_X86_SS: addr = &uc->uc_mcontext.mc_ss; break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
addr = NULL;
|
||||||
|
}
|
||||||
|
return addr;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
|
@ -242,3 +242,37 @@ x86_get_scratch_loc (struct cursor *c, unw_regnum_t reg)
|
||||||
else
|
else
|
||||||
return DWARF_MEM_LOC (c, addr + off);
|
return DWARF_MEM_LOC (c, addr + off);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef UNW_REMOTE_ONLY
|
||||||
|
|
||||||
|
HIDDEN void *
|
||||||
|
x86_r_uc_addr (ucontext_t *uc, int reg)
|
||||||
|
{
|
||||||
|
void *addr;
|
||||||
|
|
||||||
|
switch (reg)
|
||||||
|
{
|
||||||
|
case UNW_X86_GS: addr = &uc->uc_mcontext.gregs[REG_GS]; break;
|
||||||
|
case UNW_X86_FS: addr = &uc->uc_mcontext.gregs[REG_FS]; break;
|
||||||
|
case UNW_X86_ES: addr = &uc->uc_mcontext.gregs[REG_ES]; break;
|
||||||
|
case UNW_X86_DS: addr = &uc->uc_mcontext.gregs[REG_DS]; break;
|
||||||
|
case UNW_X86_EAX: addr = &uc->uc_mcontext.gregs[REG_EAX]; break;
|
||||||
|
case UNW_X86_EBX: addr = &uc->uc_mcontext.gregs[REG_EBX]; break;
|
||||||
|
case UNW_X86_ECX: addr = &uc->uc_mcontext.gregs[REG_ECX]; break;
|
||||||
|
case UNW_X86_EDX: addr = &uc->uc_mcontext.gregs[REG_EDX]; break;
|
||||||
|
case UNW_X86_ESI: addr = &uc->uc_mcontext.gregs[REG_ESI]; break;
|
||||||
|
case UNW_X86_EDI: addr = &uc->uc_mcontext.gregs[REG_EDI]; break;
|
||||||
|
case UNW_X86_EBP: addr = &uc->uc_mcontext.gregs[REG_EBP]; break;
|
||||||
|
case UNW_X86_EIP: addr = &uc->uc_mcontext.gregs[REG_EIP]; break;
|
||||||
|
case UNW_X86_ESP: addr = &uc->uc_mcontext.gregs[REG_ESP]; break;
|
||||||
|
case UNW_X86_TRAPNO: addr = &uc->uc_mcontext.gregs[REG_TRAPNO]; break;
|
||||||
|
case UNW_X86_CS: addr = &uc->uc_mcontext.gregs[REG_CS]; break;
|
||||||
|
case UNW_X86_EFLAGS: addr = &uc->uc_mcontext.gregs[REG_EFL]; break;
|
||||||
|
case UNW_X86_SS: addr = &uc->uc_mcontext.gregs[REG_SS]; break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
addr = NULL;
|
||||||
|
}
|
||||||
|
return addr;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
|
@ -52,11 +52,13 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||||
#define x86_local_addr_space_init UNW_OBJ(local_addr_space_init)
|
#define x86_local_addr_space_init UNW_OBJ(local_addr_space_init)
|
||||||
#define x86_scratch_loc UNW_OBJ(scratch_loc)
|
#define x86_scratch_loc UNW_OBJ(scratch_loc)
|
||||||
#define x86_get_scratch_loc UNW_OBJ(get_scratch_loc)
|
#define x86_get_scratch_loc UNW_OBJ(get_scratch_loc)
|
||||||
|
#define x86_r_uc_addr UNW_OBJ(r_uc_addr)
|
||||||
|
|
||||||
extern void x86_local_addr_space_init (void);
|
extern void x86_local_addr_space_init (void);
|
||||||
extern int x86_local_resume (unw_addr_space_t as, unw_cursor_t *cursor,
|
extern int x86_local_resume (unw_addr_space_t as, unw_cursor_t *cursor,
|
||||||
void *arg);
|
void *arg);
|
||||||
extern dwarf_loc_t x86_scratch_loc (struct cursor *c, unw_regnum_t reg);
|
extern dwarf_loc_t x86_scratch_loc (struct cursor *c, unw_regnum_t reg);
|
||||||
extern dwarf_loc_t x86_get_scratch_loc (struct cursor *c, unw_regnum_t reg);
|
extern dwarf_loc_t x86_get_scratch_loc (struct cursor *c, unw_regnum_t reg);
|
||||||
|
extern void *x86_r_uc_addr (ucontext_t *uc, int reg);
|
||||||
|
|
||||||
#endif /* unwind_i_h */
|
#endif /* unwind_i_h */
|
||||||
|
|
|
@ -43,63 +43,12 @@ static struct unw_addr_space local_addr_space;
|
||||||
|
|
||||||
PROTECTED unw_addr_space_t unw_local_addr_space = &local_addr_space;
|
PROTECTED unw_addr_space_t unw_local_addr_space = &local_addr_space;
|
||||||
|
|
||||||
static inline void *
|
|
||||||
uc_addr (ucontext_t *uc, int reg)
|
|
||||||
{
|
|
||||||
void *addr;
|
|
||||||
|
|
||||||
switch (reg)
|
|
||||||
{
|
|
||||||
#ifdef __FreeBSD__
|
|
||||||
case UNW_X86_64_R8: addr = &uc->uc_mcontext.mc_r8; break;
|
|
||||||
case UNW_X86_64_R9: addr = &uc->uc_mcontext.mc_r9; break;
|
|
||||||
case UNW_X86_64_R10: addr = &uc->uc_mcontext.mc_r10; break;
|
|
||||||
case UNW_X86_64_R11: addr = &uc->uc_mcontext.mc_r11; break;
|
|
||||||
case UNW_X86_64_R12: addr = &uc->uc_mcontext.mc_r12; break;
|
|
||||||
case UNW_X86_64_R13: addr = &uc->uc_mcontext.mc_r13; break;
|
|
||||||
case UNW_X86_64_R14: addr = &uc->uc_mcontext.mc_r14; break;
|
|
||||||
case UNW_X86_64_R15: addr = &uc->uc_mcontext.mc_r15; break;
|
|
||||||
case UNW_X86_64_RDI: addr = &uc->uc_mcontext.mc_rdi; break;
|
|
||||||
case UNW_X86_64_RSI: addr = &uc->uc_mcontext.mc_rsi; break;
|
|
||||||
case UNW_X86_64_RBP: addr = &uc->uc_mcontext.mc_rbp; break;
|
|
||||||
case UNW_X86_64_RBX: addr = &uc->uc_mcontext.mc_rbx; break;
|
|
||||||
case UNW_X86_64_RDX: addr = &uc->uc_mcontext.mc_rdx; break;
|
|
||||||
case UNW_X86_64_RAX: addr = &uc->uc_mcontext.mc_rax; break;
|
|
||||||
case UNW_X86_64_RCX: addr = &uc->uc_mcontext.mc_rcx; break;
|
|
||||||
case UNW_X86_64_RSP: addr = &uc->uc_mcontext.mc_rsp; break;
|
|
||||||
case UNW_X86_64_RIP: addr = &uc->uc_mcontext.mc_rip; break;
|
|
||||||
#else
|
|
||||||
case UNW_X86_64_R8: addr = &uc->uc_mcontext.gregs[REG_R8]; break;
|
|
||||||
case UNW_X86_64_R9: addr = &uc->uc_mcontext.gregs[REG_R9]; break;
|
|
||||||
case UNW_X86_64_R10: addr = &uc->uc_mcontext.gregs[REG_R10]; break;
|
|
||||||
case UNW_X86_64_R11: addr = &uc->uc_mcontext.gregs[REG_R11]; break;
|
|
||||||
case UNW_X86_64_R12: addr = &uc->uc_mcontext.gregs[REG_R12]; break;
|
|
||||||
case UNW_X86_64_R13: addr = &uc->uc_mcontext.gregs[REG_R13]; break;
|
|
||||||
case UNW_X86_64_R14: addr = &uc->uc_mcontext.gregs[REG_R14]; break;
|
|
||||||
case UNW_X86_64_R15: addr = &uc->uc_mcontext.gregs[REG_R15]; break;
|
|
||||||
case UNW_X86_64_RDI: addr = &uc->uc_mcontext.gregs[REG_RDI]; break;
|
|
||||||
case UNW_X86_64_RSI: addr = &uc->uc_mcontext.gregs[REG_RSI]; break;
|
|
||||||
case UNW_X86_64_RBP: addr = &uc->uc_mcontext.gregs[REG_RBP]; break;
|
|
||||||
case UNW_X86_64_RBX: addr = &uc->uc_mcontext.gregs[REG_RBX]; break;
|
|
||||||
case UNW_X86_64_RDX: addr = &uc->uc_mcontext.gregs[REG_RDX]; break;
|
|
||||||
case UNW_X86_64_RAX: addr = &uc->uc_mcontext.gregs[REG_RAX]; break;
|
|
||||||
case UNW_X86_64_RCX: addr = &uc->uc_mcontext.gregs[REG_RCX]; break;
|
|
||||||
case UNW_X86_64_RSP: addr = &uc->uc_mcontext.gregs[REG_RSP]; break;
|
|
||||||
case UNW_X86_64_RIP: addr = &uc->uc_mcontext.gregs[REG_RIP]; break;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
default:
|
|
||||||
addr = NULL;
|
|
||||||
}
|
|
||||||
return addr;
|
|
||||||
}
|
|
||||||
|
|
||||||
# ifdef UNW_LOCAL_ONLY
|
# ifdef UNW_LOCAL_ONLY
|
||||||
|
|
||||||
HIDDEN void *
|
HIDDEN void *
|
||||||
tdep_uc_addr (ucontext_t *uc, int reg)
|
tdep_uc_addr (ucontext_t *uc, int reg)
|
||||||
{
|
{
|
||||||
return uc_addr (uc, reg);
|
return x86_64_r_uc_addr (uc, reg);
|
||||||
}
|
}
|
||||||
|
|
||||||
# endif /* UNW_LOCAL_ONLY */
|
# endif /* UNW_LOCAL_ONLY */
|
||||||
|
@ -200,7 +149,7 @@ access_reg (unw_addr_space_t as, unw_regnum_t reg, unw_word_t *val, int write,
|
||||||
if (unw_is_fpreg (reg))
|
if (unw_is_fpreg (reg))
|
||||||
goto badreg;
|
goto badreg;
|
||||||
|
|
||||||
if (!(addr = uc_addr (uc, reg)))
|
if (!(addr = x86_64_r_uc_addr (uc, reg)))
|
||||||
goto badreg;
|
goto badreg;
|
||||||
|
|
||||||
if (write)
|
if (write)
|
||||||
|
@ -230,7 +179,7 @@ access_fpreg (unw_addr_space_t as, unw_regnum_t reg, unw_fpreg_t *val,
|
||||||
if (!unw_is_fpreg (reg))
|
if (!unw_is_fpreg (reg))
|
||||||
goto badreg;
|
goto badreg;
|
||||||
|
|
||||||
if (!(addr = uc_addr (uc, reg)))
|
if (!(addr = x86_64_r_uc_addr (uc, reg)))
|
||||||
goto badreg;
|
goto badreg;
|
||||||
|
|
||||||
if (write)
|
if (write)
|
||||||
|
|
|
@ -148,3 +148,36 @@ unw_handle_signal_frame (unw_cursor_t *cursor)
|
||||||
return -UNW_EBADFRAME;
|
return -UNW_EBADFRAME;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef UNW_REMOTE_ONLY
|
||||||
|
HIDDEN void *
|
||||||
|
x86_64_r_uc_addr (ucontext_t *uc, int reg)
|
||||||
|
{
|
||||||
|
void *addr;
|
||||||
|
|
||||||
|
switch (reg)
|
||||||
|
{
|
||||||
|
case UNW_X86_64_R8: addr = &uc->uc_mcontext.mc_r8; break;
|
||||||
|
case UNW_X86_64_R9: addr = &uc->uc_mcontext.mc_r9; break;
|
||||||
|
case UNW_X86_64_R10: addr = &uc->uc_mcontext.mc_r10; break;
|
||||||
|
case UNW_X86_64_R11: addr = &uc->uc_mcontext.mc_r11; break;
|
||||||
|
case UNW_X86_64_R12: addr = &uc->uc_mcontext.mc_r12; break;
|
||||||
|
case UNW_X86_64_R13: addr = &uc->uc_mcontext.mc_r13; break;
|
||||||
|
case UNW_X86_64_R14: addr = &uc->uc_mcontext.mc_r14; break;
|
||||||
|
case UNW_X86_64_R15: addr = &uc->uc_mcontext.mc_r15; break;
|
||||||
|
case UNW_X86_64_RDI: addr = &uc->uc_mcontext.mc_rdi; break;
|
||||||
|
case UNW_X86_64_RSI: addr = &uc->uc_mcontext.mc_rsi; break;
|
||||||
|
case UNW_X86_64_RBP: addr = &uc->uc_mcontext.mc_rbp; break;
|
||||||
|
case UNW_X86_64_RBX: addr = &uc->uc_mcontext.mc_rbx; break;
|
||||||
|
case UNW_X86_64_RDX: addr = &uc->uc_mcontext.mc_rdx; break;
|
||||||
|
case UNW_X86_64_RAX: addr = &uc->uc_mcontext.mc_rax; break;
|
||||||
|
case UNW_X86_64_RCX: addr = &uc->uc_mcontext.mc_rcx; break;
|
||||||
|
case UNW_X86_64_RSP: addr = &uc->uc_mcontext.mc_rsp; break;
|
||||||
|
case UNW_X86_64_RIP: addr = &uc->uc_mcontext.mc_rip; break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
addr = NULL;
|
||||||
|
}
|
||||||
|
return addr;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
|
@ -97,3 +97,36 @@ unw_handle_signal_frame (unw_cursor_t *cursor)
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef UNW_REMOTE_ONLY
|
||||||
|
static inline void *
|
||||||
|
x86_64_r_uc_addr (ucontext_t *uc, int reg)
|
||||||
|
{
|
||||||
|
void *addr;
|
||||||
|
|
||||||
|
switch (reg)
|
||||||
|
{
|
||||||
|
case UNW_X86_64_R8: addr = &uc->uc_mcontext.gregs[REG_R8]; break;
|
||||||
|
case UNW_X86_64_R9: addr = &uc->uc_mcontext.gregs[REG_R9]; break;
|
||||||
|
case UNW_X86_64_R10: addr = &uc->uc_mcontext.gregs[REG_R10]; break;
|
||||||
|
case UNW_X86_64_R11: addr = &uc->uc_mcontext.gregs[REG_R11]; break;
|
||||||
|
case UNW_X86_64_R12: addr = &uc->uc_mcontext.gregs[REG_R12]; break;
|
||||||
|
case UNW_X86_64_R13: addr = &uc->uc_mcontext.gregs[REG_R13]; break;
|
||||||
|
case UNW_X86_64_R14: addr = &uc->uc_mcontext.gregs[REG_R14]; break;
|
||||||
|
case UNW_X86_64_R15: addr = &uc->uc_mcontext.gregs[REG_R15]; break;
|
||||||
|
case UNW_X86_64_RDI: addr = &uc->uc_mcontext.gregs[REG_RDI]; break;
|
||||||
|
case UNW_X86_64_RSI: addr = &uc->uc_mcontext.gregs[REG_RSI]; break;
|
||||||
|
case UNW_X86_64_RBP: addr = &uc->uc_mcontext.gregs[REG_RBP]; break;
|
||||||
|
case UNW_X86_64_RBX: addr = &uc->uc_mcontext.gregs[REG_RBX]; break;
|
||||||
|
case UNW_X86_64_RDX: addr = &uc->uc_mcontext.gregs[REG_RDX]; break;
|
||||||
|
case UNW_X86_64_RAX: addr = &uc->uc_mcontext.gregs[REG_RAX]; break;
|
||||||
|
case UNW_X86_64_RCX: addr = &uc->uc_mcontext.gregs[REG_RCX]; break;
|
||||||
|
case UNW_X86_64_RSP: addr = &uc->uc_mcontext.gregs[REG_RSP]; break;
|
||||||
|
case UNW_X86_64_RIP: addr = &uc->uc_mcontext.gregs[REG_RIP]; break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
addr = NULL;
|
||||||
|
}
|
||||||
|
return addr;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
|
@ -62,6 +62,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||||
#if 0
|
#if 0
|
||||||
#define x86_64_scratch_loc UNW_OBJ(scratch_loc)
|
#define x86_64_scratch_loc UNW_OBJ(scratch_loc)
|
||||||
#endif
|
#endif
|
||||||
|
#define x86_64_r_uc_addr UNW_OBJ(r_uc_addr)
|
||||||
|
|
||||||
extern void x86_64_local_addr_space_init (void);
|
extern void x86_64_local_addr_space_init (void);
|
||||||
extern int x86_64_local_resume (unw_addr_space_t as, unw_cursor_t *cursor,
|
extern int x86_64_local_resume (unw_addr_space_t as, unw_cursor_t *cursor,
|
||||||
|
@ -72,4 +73,6 @@ extern int setcontext (const ucontext_t *ucp);
|
||||||
extern dwarf_loc_t x86_64_scratch_loc (struct cursor *c, unw_regnum_t reg);
|
extern dwarf_loc_t x86_64_scratch_loc (struct cursor *c, unw_regnum_t reg);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
extern void *x86_64_r_uc_addr (ucontext_t *uc, int reg);
|
||||||
|
|
||||||
#endif /* unwind_i_h */
|
#endif /* unwind_i_h */
|
||||||
|
|
Loading…
Reference in a new issue