1
0
Fork 0
mirror of https://github.com/tobast/libunwind-eh_elf.git synced 2024-06-26 03:11:44 +02:00

Move uc_addr to os-specific file

This commit is contained in:
Konstantin Belousov 2010-04-05 22:42:23 +03:00
parent 79d012348d
commit 0dbeeeb08d
8 changed files with 144 additions and 110 deletions

View file

@ -40,65 +40,12 @@ static struct unw_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
HIDDEN void *
tdep_uc_addr (ucontext_t *uc, int reg)
{
return uc_addr (uc, reg);
return x86_r_uc_addr (uc, reg);
}
# 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))
goto badreg;
if (!(addr = uc_addr (uc, reg)))
if (!(addr = x86_r_uc_addr (uc, reg)))
goto badreg;
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))
goto badreg;
if (!(addr = uc_addr (uc, reg)))
if (!(addr = x86_r_uc_addr (uc, reg)))
goto badreg;
if (write)

View file

@ -255,3 +255,36 @@ x86_get_scratch_loc (struct cursor *c, unw_regnum_t reg)
else
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

View file

@ -242,3 +242,37 @@ x86_get_scratch_loc (struct cursor *c, unw_regnum_t reg)
else
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

View file

@ -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_scratch_loc UNW_OBJ(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 int x86_local_resume (unw_addr_space_t as, unw_cursor_t *cursor,
void *arg);
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 void *x86_r_uc_addr (ucontext_t *uc, int reg);
#endif /* unwind_i_h */

View file

@ -43,63 +43,12 @@ static struct unw_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
HIDDEN void *
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 */
@ -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))
goto badreg;
if (!(addr = uc_addr (uc, reg)))
if (!(addr = x86_64_r_uc_addr (uc, reg)))
goto badreg;
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))
goto badreg;
if (!(addr = uc_addr (uc, reg)))
if (!(addr = x86_64_r_uc_addr (uc, reg)))
goto badreg;
if (write)

View file

@ -148,3 +148,36 @@ unw_handle_signal_frame (unw_cursor_t *cursor)
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

View file

@ -97,3 +97,36 @@ unw_handle_signal_frame (unw_cursor_t *cursor)
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

View file

@ -62,6 +62,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
#if 0
#define x86_64_scratch_loc UNW_OBJ(scratch_loc)
#endif
#define x86_64_r_uc_addr UNW_OBJ(r_uc_addr)
extern void x86_64_local_addr_space_init (void);
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);
#endif
extern void *x86_64_r_uc_addr (ucontext_t *uc, int reg);
#endif /* unwind_i_h */