From d4aff41888c4e8eb71519330ab7621aed3f73da4 Mon Sep 17 00:00:00 2001 From: Mike Frysinger Date: Sun, 20 Dec 2015 06:06:45 -0500 Subject: libsandbox: new alpha ptrace port Signed-off-by: Mike Frysinger --- libsandbox/trace/linux/alpha.c | 58 ++++++++++++++++++++++++++++++++++++++++++ libsandbox/trace/linux/arch.c | 2 ++ 2 files changed, 60 insertions(+) create mode 100644 libsandbox/trace/linux/alpha.c diff --git a/libsandbox/trace/linux/alpha.c b/libsandbox/trace/linux/alpha.c new file mode 100644 index 0000000..4aa6cd6 --- /dev/null +++ b/libsandbox/trace/linux/alpha.c @@ -0,0 +1,58 @@ +#define REG_R0 0 +#define REG_A0 16 + +#define trace_reg_sysnum r0 + +static unsigned long trace_arg(void *vregs, int num) +{ + trace_regs *regs = vregs; + if (num < 7) + return *(®s->r16 + num - 1); + else + return -1; +} + +static long do_peekuser(long offset) +{ + return do_ptrace(PTRACE_PEEKUSER, (void *)offset, NULL); +} + +static long do_pokeuser(long offset, long val) +{ + return do_ptrace(PTRACE_POKEUSER, (void *)offset, (void *)val); +} + +#undef trace_get_regs +static long trace_get_regs(void *vregs) +{ + trace_regs *regs = vregs; + size_t i; + regs->r0 = do_peekuser(REG_R0); + for (i = 0; i < 7; ++i) + *(®s->r16 + i) = do_peekuser(REG_A0 + i); + return 0; +} + +#undef trace_set_regs +static long trace_set_regs(void *vregs) +{ + trace_regs *regs = vregs; + size_t i; + do_pokeuser(REG_R0, regs->r0); + for (i = 0; i < 7; ++i) + do_pokeuser(REG_A0 + i, *(®s->r16 + i)); + return 0; +} + +static long trace_raw_ret(void *vregs) +{ + trace_regs *regs = vregs; + return regs->r16; +} + +static void trace_set_ret(void *vregs, int err) +{ + trace_regs *regs = vregs; + regs->r0 = -err; + trace_set_regs(regs); +} diff --git a/libsandbox/trace/linux/arch.c b/libsandbox/trace/linux/arch.c index 83b6977..1515abe 100644 --- a/libsandbox/trace/linux/arch.c +++ b/libsandbox/trace/linux/arch.c @@ -7,6 +7,8 @@ #if !defined(HAVE_PTRACE) || !defined(HAVE_SYS_PTRACE_H) || \ !defined(HAVE_SYS_USER_H) || !defined(PTRACE_SETOPTIONS) # define SB_NO_TRACE_ARCH +#elif defined(__alpha__) +# include "alpha.c" #elif defined(__arm__) # include "arm.c" #elif defined(__bfin__) -- cgit v1.2.3-18-g5258