Pull up following revision(s) (requested by rin in ticket #465):

sys/kern/sys_ptrace_common.c: revision 1.73

Fix regression introduced to ptrace_regs() in rev 1.27:
http://cvsweb.netbsd.org/bsdweb.cgi/src/sys/kern/sys_ptrace_common.c#rev1.27

Size of registers should be determined from tracer, NOT tracee.

Now, 64-bit tracer can manipulate registers of 32-bit tracee again.
gdb for amd64 works for i386 binaries to some extent.

XXX
pullup to netbsd-9 and -8.
This commit is contained in:
martin 2019-11-24 08:16:52 +00:00
parent cdb4f02bd2
commit d73e5a931f
1 changed files with 9 additions and 6 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: sys_ptrace_common.c,v 1.58.2.11 2019/11/19 13:22:01 martin Exp $ */
/* $NetBSD: sys_ptrace_common.c,v 1.58.2.12 2019/11/24 08:16:52 martin Exp $ */
/*-
* Copyright (c) 2008, 2009 The NetBSD Foundation, Inc.
@ -118,7 +118,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: sys_ptrace_common.c,v 1.58.2.11 2019/11/19 13:22:01 martin Exp $");
__KERNEL_RCSID(0, "$NetBSD: sys_ptrace_common.c,v 1.58.2.12 2019/11/24 08:16:52 martin Exp $");
#ifdef _KERNEL_OPT
#include "opt_ptrace.h"
@ -831,9 +831,12 @@ ptrace_regs(struct lwp *l, struct lwp **lt, int rq, struct ptrace_methods *ptm,
void *addr, size_t data)
{
int error;
struct proc *t = (*lt)->l_proc;
struct proc *p, *t;
struct vmspace *vm;
p = l->l_proc; /* tracer */
t = (*lt)->l_proc; /* traced */
if ((error = ptrace_update_lwp(t, lt, data)) != 0)
return error;
@ -849,7 +852,7 @@ ptrace_regs(struct lwp *l, struct lwp **lt, int rq, struct ptrace_methods *ptm,
case_PT_SETREGS
if (!process_validregs(*lt))
return EINVAL;
size = PROC_REGSZ(t);
size = PROC_REGSZ(p);
func = ptm->ptm_doregs;
break;
#endif
@ -858,7 +861,7 @@ ptrace_regs(struct lwp *l, struct lwp **lt, int rq, struct ptrace_methods *ptm,
case_PT_SETFPREGS
if (!process_validfpregs(*lt))
return EINVAL;
size = PROC_FPREGSZ(t);
size = PROC_FPREGSZ(p);
func = ptm->ptm_dofpregs;
break;
#endif
@ -867,7 +870,7 @@ ptrace_regs(struct lwp *l, struct lwp **lt, int rq, struct ptrace_methods *ptm,
case_PT_SETDBREGS
if (!process_validdbregs(*lt))
return EINVAL;
size = PROC_DBREGSZ(t);
size = PROC_DBREGSZ(p);
func = ptm->ptm_dodbregs;
break;
#endif