diff options
Diffstat (limited to 'libsandbox/trace/linux/x86_64.c')
-rw-r--r-- | libsandbox/trace/linux/x86_64.c | 29 |
1 files changed, 12 insertions, 17 deletions
diff --git a/libsandbox/trace/linux/x86_64.c b/libsandbox/trace/linux/x86_64.c index 8a214f9..9b7e4ea 100644 --- a/libsandbox/trace/linux/x86_64.c +++ b/libsandbox/trace/linux/x86_64.c @@ -13,54 +13,49 @@ static const struct syscall_entry syscall_table_64[] = { { SB_NR_UNDEF, SB_NR_UNDEF, NULL }, }; -static bool pers_is_32(void) +static bool pers_is_32(trace_regs *regs) { - switch (do_peekuser(8 * CS)) { + switch (regs->cs) { case 0x23: return true; case 0x33: return false; default: sb_ebort("unknown x86_64 personality"); } } -static const struct syscall_entry *trace_check_personality(void) +static const struct syscall_entry *trace_check_personality(void *vregs) { - return pers_is_32() ? syscall_table_32 : syscall_table_64; + trace_regs *regs = vregs; + return pers_is_32(regs) ? syscall_table_32 : syscall_table_64; } #else -static bool pers_is_32(void) +static bool pers_is_32(trace_regs *regs) { return false; } #endif -static int trace_sysnum(void) -{ - return do_peekuser(8 * ORIG_RAX); -} +#define trace_reg_sysnum orig_rax static long trace_raw_ret(void *vregs) { trace_regs *regs = vregs; - return pers_is_32() ? (int)regs->rax : regs->rax; -} - -static void trace_set_sysnum(void *vregs, long nr) -{ - do_pokeuser(8 * ORIG_RAX, nr); + return pers_is_32(regs) ? (int)regs->rax : regs->rax; } static void trace_set_ret(void *vregs, int err) { - do_pokeuser(8 * RAX, -err); + trace_regs *regs = vregs; + regs->rax = -err; + trace_set_regs(regs); } static unsigned long trace_arg(void *vregs, int num) { trace_regs *regs = vregs; - if (pers_is_32()) + if (pers_is_32(regs)) switch (num) { case 1: return regs->rbx; case 2: return regs->rcx; |