diff options
author | Mike Frysinger <vapier@gentoo.org> | 2012-07-03 00:45:41 -0400 |
---|---|---|
committer | Mike Frysinger <vapier@gentoo.org> | 2012-07-03 14:27:45 -0400 |
commit | 731630b7470b2b7ae3c055779138460d14d9fcd5 (patch) | |
tree | 5f4d373a2f4032789515ca1a608956b76ec17f6d /libsandbox/trace/linux/hppa.c | |
parent | include stdint.h/inttypes.h too (diff) | |
download | sandbox-731630b7470b2b7ae3c055779138460d14d9fcd5.tar.gz sandbox-731630b7470b2b7ae3c055779138460d14d9fcd5.tar.bz2 sandbox-731630b7470b2b7ae3c055779138460d14d9fcd5.zip |
libsandbox: migrate to get/set regs interface for everyone
Newer ports (like x32) limit what is available via the peek/poke user
interface, and instead are pushing people to use the single get/set
regs interface. Since this also simplifies the code a bit (by forcing
all ports to use this), and cuts down on the number of syscalls that
we have to make, switch everyone over to it.
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
Diffstat (limited to 'libsandbox/trace/linux/hppa.c')
-rw-r--r-- | libsandbox/trace/linux/hppa.c | 38 |
1 files changed, 24 insertions, 14 deletions
diff --git a/libsandbox/trace/linux/hppa.c b/libsandbox/trace/linux/hppa.c index b7fab1c..d23b0d1 100644 --- a/libsandbox/trace/linux/hppa.c +++ b/libsandbox/trace/linux/hppa.c @@ -1,15 +1,5 @@ -#define trace_sysnum_puser (20 * 4) /* PT_GR20 */ - -static long trace_raw_ret(void *vregs) -{ - trace_regs *regs = vregs; - return regs->gr[28]; -} - -static void trace_set_ret(void *vregs, int err) -{ - do_pokeuser(28 * 4 /* PT_GR28 */, -err); -} +#define trace_reg_sysnum (20 * 4) /* PT_GR20 */ +#define trace_reg_ret (28 * 4) /* PT_GR28 */ static unsigned long trace_arg(void *vregs, int num) { @@ -25,12 +15,32 @@ static unsigned long trace_arg(void *vregs, int num) } } +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; - for (i = 21; i < 29; ++i) + for (i = 20; i < 29; ++i) regs->gr[i] = do_peekuser(i * 4); return 0; } -#define trace_get_regs trace_get_regs + +#undef trace_set_regs +static long trace_set_regs(void *vregs) +{ + trace_regs *regs = vregs; + size_t i; + for (i = 20; i < 29; ++i) + do_pokeuser(i * 4, regs->gr[i]); + return 0; +} |