diff options
author | Mike Frysinger <vapier@gentoo.org> | 2015-12-20 06:06:45 -0500 |
---|---|---|
committer | Mike Frysinger <vapier@gentoo.org> | 2015-12-20 06:06:45 -0500 |
commit | d4aff41888c4e8eb71519330ab7621aed3f73da4 (patch) | |
tree | 66abe3e09fd7aeb5e572a3d24936fcec2b91bb40 | |
parent | libsandbox: new arm ptrace port (diff) | |
download | sandbox-d4aff41888c4e8eb71519330ab7621aed3f73da4.tar.gz sandbox-d4aff41888c4e8eb71519330ab7621aed3f73da4.tar.bz2 sandbox-d4aff41888c4e8eb71519330ab7621aed3f73da4.zip |
libsandbox: new alpha ptrace port
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
-rw-r--r-- | libsandbox/trace/linux/alpha.c | 58 | ||||
-rw-r--r-- | libsandbox/trace/linux/arch.c | 2 |
2 files changed, 60 insertions, 0 deletions
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__) |