From a00648aa2b38936a5052cee8e2f94691f085301a Mon Sep 17 00:00:00 2001 From: Andreas Schwab Date: Sat, 12 Nov 2016 20:02:23 +0100 Subject: [PATCH] m68k: switch to PTRACE_GETREGS * Makefile.am (EXTRA_DIST): Add linux/m68k/arch_regs.h, remove linux/m68k/get_syscall_result.c. * linux/m68k/arch_regs.c (m68k_d0, ARCH_PC_PEEK_ADDR): Don't define. (m68k_regs, m68k_usp_ptr, ARCH_PC_REG, ARCH_REGS_FOR_GETREGS): Define. * linux/m68k/arch_regs.h: New file. * linux/m68k/arch_sigreturn.c (arch_sigreturn): Use m68k_usp_ptr. * linux/m68k/get_error.c (get_error): Use m68k_regs.d0. * linux/m68k/get_scno.c (arch_get_scno): Use m68k_regs.orig_d0. * linux/m68k/get_syscall_args.c (get_syscall_args): Use m68k_regs. * linux/m68k/get_syscall_result.c: Remove. --- Makefile.am | 2 +- linux/m68k/arch_regs.c | 6 ++++-- linux/m68k/arch_regs.h | 1 + linux/m68k/arch_sigreturn.c | 4 +--- linux/m68k/get_error.c | 6 +++--- linux/m68k/get_scno.c | 3 ++- linux/m68k/get_syscall_args.c | 11 ++++++----- linux/m68k/get_syscall_result.c | 5 ----- 8 files changed, 18 insertions(+), 20 deletions(-) create mode 100644 linux/m68k/arch_regs.h delete mode 100644 linux/m68k/get_syscall_result.c diff --git a/Makefile.am b/Makefile.am index e55a0db2..457659fe 100644 --- a/Makefile.am +++ b/Makefile.am @@ -414,11 +414,11 @@ EXTRA_DIST = \ linux/ia64/userent.h \ linux/inet_diag.h \ linux/m68k/arch_regs.c \ + linux/m68k/arch_regs.h \ linux/m68k/arch_sigreturn.c \ linux/m68k/get_error.c \ linux/m68k/get_scno.c \ linux/m68k/get_syscall_args.c \ - linux/m68k/get_syscall_result.c \ linux/m68k/ioctls_arch0.h \ linux/m68k/ioctls_inc0.h \ linux/m68k/syscallent.h \ diff --git a/linux/m68k/arch_regs.c b/linux/m68k/arch_regs.c index 8f0ab79a..1198762b 100644 --- a/linux/m68k/arch_regs.c +++ b/linux/m68k/arch_regs.c @@ -1,2 +1,4 @@ -static long m68k_d0; -#define ARCH_PC_PEEK_ADDR (4 * PT_PC) +static struct user_regs_struct m68k_regs; +long *const m68k_usp_ptr = &m68k_regs.usp; +#define ARCH_PC_REG m68k_regs.pc +#define ARCH_REGS_FOR_GETREGS m68k_regs diff --git a/linux/m68k/arch_regs.h b/linux/m68k/arch_regs.h new file mode 100644 index 00000000..08293365 --- /dev/null +++ b/linux/m68k/arch_regs.h @@ -0,0 +1 @@ +extern long *const m68k_usp_ptr; diff --git a/linux/m68k/arch_sigreturn.c b/linux/m68k/arch_sigreturn.c index 0011c174..12e8bded 100644 --- a/linux/m68k/arch_sigreturn.c +++ b/linux/m68k/arch_sigreturn.c @@ -3,10 +3,8 @@ arch_sigreturn(struct tcb *tcp) { long addr; - if (upeek(tcp->pid, 4*PT_USP, &addr) < 0) - return; /* Fetch pointer to struct sigcontext. */ - if (umove(tcp, addr + 2 * sizeof(int), &addr) < 0) + if (umove(tcp, *m68k_usp_ptr + 2 * sizeof(int), &addr) < 0) return; unsigned long mask[NSIG / 8 / sizeof(long)]; diff --git a/linux/m68k/get_error.c b/linux/m68k/get_error.c index a792835d..3ad51a08 100644 --- a/linux/m68k/get_error.c +++ b/linux/m68k/get_error.c @@ -1,10 +1,10 @@ static void get_error(struct tcb *tcp, const bool check_errno) { - if (check_errno && is_negated_errno(m68k_d0)) { + if (check_errno && is_negated_errno(m68k_regs.d0)) { tcp->u_rval = -1; - tcp->u_error = -m68k_d0; + tcp->u_error = -m68k_regs.d0; } else { - tcp->u_rval = m68k_d0; + tcp->u_rval = m68k_regs.d0; } } diff --git a/linux/m68k/get_scno.c b/linux/m68k/get_scno.c index 716a7616..829f3477 100644 --- a/linux/m68k/get_scno.c +++ b/linux/m68k/get_scno.c @@ -2,5 +2,6 @@ static int arch_get_scno(struct tcb *tcp) { - return upeek(tcp->pid, 4 * PT_ORIG_D0, &tcp->scno) < 0 ? -1 : 1; + tcp->scno = m68k_regs.orig_d0; + return 1; } diff --git a/linux/m68k/get_syscall_args.c b/linux/m68k/get_syscall_args.c index bc69a195..8ec3d281 100644 --- a/linux/m68k/get_syscall_args.c +++ b/linux/m68k/get_syscall_args.c @@ -2,10 +2,11 @@ static int get_syscall_args(struct tcb *tcp) { - unsigned int i; - - for (i = 0; i < tcp->s_ent->nargs; ++i) - if (upeek(tcp->pid, (i < 5 ? i : i + 2)*4, &tcp->u_arg[i]) < 0) - return -1; + tcp->u_arg[0] = m68k_regs.d1; + tcp->u_arg[1] = m68k_regs.d2; + tcp->u_arg[2] = m68k_regs.d3; + tcp->u_arg[3] = m68k_regs.d4; + tcp->u_arg[4] = m68k_regs.d5; + tcp->u_arg[5] = m68k_regs.a0; return 1; } diff --git a/linux/m68k/get_syscall_result.c b/linux/m68k/get_syscall_result.c deleted file mode 100644 index 005cf60c..00000000 --- a/linux/m68k/get_syscall_result.c +++ /dev/null @@ -1,5 +0,0 @@ -static int -get_syscall_result_regs(struct tcb *tcp) -{ - return upeek(tcp->pid, 4 * PT_D0, &m68k_d0) < 0 ? -1 : 0; -} -- 2.40.0