NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: port-arm/52119: PT_STEP not supported on arm 32-bit



The following reply was made to PR port-arm/52119; it has been noted by GNATS.

From: Nick Hudson <skrll%netbsd.org@localhost>
To: gnats-bugs%NetBSD.org@localhost, port-arm-maintainer%netbsd.org@localhost,
 gnats-admin%netbsd.org@localhost, netbsd-bugs%netbsd.org@localhost
Cc: 
Subject: Re: port-arm/52119: PT_STEP not supported on arm 32-bit
Date: Fri, 14 Apr 2017 10:44:21 +0100

 This is a multi-part message in MIME format.
 --------------080500010605080702030803
 Content-Type: text/plain; charset=windows-1252; format=flowed
 Content-Transfer-Encoding: 7bit
 
 This is as far as I got... lots borrowed from FreeBSD.
 
 --------------080500010605080702030803
 Content-Type: text/x-patch;
  name="arm.pt_step.diff"
 Content-Transfer-Encoding: 7bit
 Content-Disposition: attachment;
  filename="arm.pt_step.diff"
 
 Index: sys/arch/arm/arm/arm_machdep.c
 ===================================================================
 RCS file: /cvsroot/src/sys/arch/arm/arm/arm_machdep.c,v
 retrieving revision 1.51
 diff -u -p -r1.51 arm_machdep.c
 --- sys/arch/arm/arm/arm_machdep.c	4 Apr 2017 11:46:12 -0000	1.51
 +++ sys/arch/arm/arm/arm_machdep.c	13 Apr 2017 10:20:38 -0000
 @@ -356,3 +356,116 @@ cpu_kpreempt_disabled(void)
  	return curcpu()->ci_cpl != IPL_NONE;
  }
  #endif /* __HAVE_PREEMPTION */
 +
 +int
 +arm_predict_branch(void *cookie, u_int insn, register_t pc, register_t *new_pc,
 +    u_int (*fetch_reg)(void *, int), u_int (*read_int)(void *, vaddr_t, u_int*))
 +{
 +	u_int addr, nregs, offset = 0;
 +	int error = 0;
 +
 +	switch ((insn >> 24) & 0xf) {
 +	case 0x2:	/* add pc, reg1, #value */
 +	case 0x0:	/* add pc, reg1, reg2, lsl #offset */
 +
 +		/* Data-processin and miscellaneous A5-196 */
 +		addr = fetch_reg(cookie, (insn >> 16) & 0xf);
 +		if (((insn >> 16) & 0xf) == 15)
 +			addr += 8;
 +		if (insn & 0x0200000) {
 +			offset = (insn >> 7) & 0x1e;
 +			offset = (insn & 0xff) << (32 - offset) |
 +			    (insn & 0xff) >> offset;
 +		} else {
 +
 +			offset = fetch_reg(cookie, insn & 0x0f);
 +			if ((insn & 0x0000ff0) != 0x00000000) {
 +				if (insn & 0x10)
 +					nregs = fetch_reg(cookie,
 +					    (insn >> 8) & 0xf);
 +				else
 +					nregs = (insn >> 7) & 0x1f;
 +				switch ((insn >> 5) & 3) {
 +				case 0:
 +					/* lsl */
 +					offset = offset << nregs;
 +					break;
 +				case 1:
 +					/* lsr */
 +					offset = offset >> nregs;
 +					break;
 +				default:
 +					break; /* XXX */
 +				}
 +
 +			}
 +			*new_pc = addr + offset;
 +			return 0;
 +
 +		}
 +
 +	case 0xa:	/* b ... */
 +	case 0xb:	/* bl ... */
 +		addr = ((insn << 2) & 0x03ffffff);
 +		if (addr & 0x02000000)
 +			addr |= 0xfc000000;
 +		*new_pc = (pc + 8 + addr);
 +		return 0;
 +	case 0x7:	/* ldr pc, [pc, reg, lsl #2] */
 +
 +		/* Load/store A5-208 */
 +		/* XXX op1 = 0x11, op (bit 4) = 0 */
 +
 +		addr = fetch_reg(cookie, insn & 0xf);
 +		addr = pc + 8 + (addr << 2);
 +		error = read_int(cookie, addr, &addr);
 +		*new_pc = addr;
 +		return error;
 +	case 0x1:	/* mov pc, reg */
 +    		/* Data-processing and miscellaneous A5-196 */
 +
 +		*new_pc = fetch_reg(cookie, insn & 0xf);
 +		return 0;
 +	case 0x4:
 +	case 0x5:	/* ldr pc, [reg] */
 +		addr = fetch_reg(cookie, (insn >> 16) & 0xf);
 +		/* ldr pc, [reg, #offset] */
 +		if (insn & (1 << 24))
 +			offset = insn & 0xfff;
 +		if (insn & 0x00800000)
 +			addr += offset;
 +		else
 +			addr -= offset;
 +		error = read_int(cookie, addr, &addr);
 +		*new_pc = addr;
 +
 +		return error;
 +	case 0x8:	/* ldmxx reg, {..., pc} */
 +	case 0x9:
 +		addr = fetch_reg(cookie, (insn >> 16) & 0xf);
 +		nregs = (insn  & 0x5555) + ((insn  >> 1) & 0x5555);
 +		nregs = (nregs & 0x3333) + ((nregs >> 2) & 0x3333);
 +		nregs = (nregs + (nregs >> 4)) & 0x0f0f;
 +		nregs = (nregs + (nregs >> 8)) & 0x001f;
 +		switch ((insn >> 23) & 0x3) {
 +		case 0x0:	/* ldmda */
 +			addr = addr - 0;
 +			break;
 +		case 0x1:	/* ldmia */
 +			addr = addr + 0 + ((nregs - 1) << 2);
 +			break;
 +		case 0x2:	/* ldmdb */
 +			addr = addr - 4;
 +			break;
 +		case 0x3:	/* ldmib */
 +			addr = addr + 4 + ((nregs - 1) << 2);
 +			break;
 +		}
 +		error = read_int(cookie, addr, &addr);
 +		*new_pc = addr;
 +
 +		return error;
 +	default:
 +		return EINVAL;
 +	}
 +}
 Index: sys/arch/arm/arm/process_machdep.c
 ===================================================================
 RCS file: /cvsroot/src/sys/arch/arm/arm/process_machdep.c,v
 retrieving revision 1.32
 diff -u -p -r1.32 process_machdep.c
 --- sys/arch/arm/arm/process_machdep.c	16 Mar 2017 16:13:20 -0000	1.32
 +++ sys/arch/arm/arm/process_machdep.c	13 Apr 2017 10:20:38 -0000
 @@ -143,6 +143,7 @@ __KERNEL_RCSID(0, "$NetBSD: process_mach
  #include <arm/vfpreg.h>
  #include <arm/locore.h>
  
 +#include <machine/db_machdep.h>
  #include <machine/pcb.h>
  #include <machine/reg.h>
  
 @@ -250,3 +251,171 @@ process_set_pc(struct lwp *l, void *addr
  
  	return 0;
  }
 +
 +static int
 +ptrace_read_int(struct lwp *l, vaddr_t addr, uint32_t *v)
 +{
 +
 +	return proc_readmem(curlwp, l, addr, v, sizeof(*v));
 +}
 +
 +static int
 +ptrace_write_int(struct lwp *l, vaddr_t addr, uint32_t v)
 +{
 +
 +	return proc_writemem(curlwp, l, addr, &v, sizeof(v));
 +}
 +
 +static u_int
 +ptrace_get_usr_reg(void *cookie, int reg)
 +{
 +	struct lwp * const l = cookie;
 +	struct trapframe * const tf = lwp_trapframe(l);
 +	int ret;
 +
 +	KASSERTMSG(reg >= 0 && reg <= ARM_REG_NUM_PC,
 +	    "reg (%d) is outside range", reg);
 +
 +	switch(reg) {
 +	case ARM_REG_NUM_PC:
 +		ret = tf->tf_pc;
 +		break;
 +	case ARM_REG_NUM_LR:
 +		ret = tf->tf_usr_lr;
 +		break;
 +	case ARM_REG_NUM_SP:
 +		ret = tf->tf_usr_sp;
 +		break;
 +	default:
 +		ret = *((register_t*)&tf->tf_r0 + reg);
 +		break;
 +	}
 +
 +	return ret;
 +}
 +
 +static u_int
 +ptrace_get_usr_int(void *cookie, vaddr_t offset, u_int *val)
 +{
 +	struct lwp * const l = cookie;
 +
 +	return ptrace_read_int(l, offset, val);
 +}
 +
 +/**
 + * This function parses current instruction opcode and decodes
 + * any possible jump (change in PC) which might occur after
 + * the instruction is executed.
 + *
 + * @param     l                 LWP structure of analysed thread
 + * @param     cur_instr         Currently executed instruction
 + * @param     alt_next_address  Pointer to the variable where
 + *                              the destination address of the
 + *                              jump instruction shall be stored.
 + *
 + * @return    <0>               when jump is possible
 + *            <EINVAL>          otherwise
 + */
 +static int
 +ptrace_get_alternative_next(struct lwp *l, uint32_t cur_instr,
 +    uint32_t *alt_next_address)
 +{
 +	int error;
 +
 +	if (inst_branch(cur_instr) || inst_call(cur_instr) ||
 +	    inst_return(cur_instr)) {
 +		struct trapframe * const tf = lwp_trapframe(l);
 +		error = arm_predict_branch(l, cur_instr, tf->tf_pc,
 +		    alt_next_address, ptrace_get_usr_reg, ptrace_get_usr_int);
 +
 +		return error;
 +	}
 +
 +	return EINVAL;
 +}
 +
 +int
 +process_sstep(struct lwp *l, int sstep)
 +{
 +	struct trapframe * const tf = lwp_trapframe(l);
 +	uint32_t cur_instr, alt_next = 0;
 +
 +	/* TODO: This needs to be updated for Thumb-2 */
 +	if ((tf->tf_spsr & PSR_T_bit) != 0)
 +		return EINVAL;
 +
 +	process_clear_sstep(l);
 +
 +	/* We're continuing... */
 +	if (sstep == 0) {
 +		return 0;
 +	}
 +
 +	KASSERTMSG(l->l_md.md_ptrace_instr == 0, "Didn't clear single step");
 +	KASSERTMSG(l->l_md.md_ptrace_instr_alt == 0,
 +	    "Didn't clear alternative single step");
 +
 +	int error;
 +	error = ptrace_read_int(l, tf->tf_pc, &cur_instr);
 +	if (error)
 +		return error;
 +
 +	error = ptrace_read_int(l, tf->tf_pc + INSN_SIZE,
 +	    &l->l_md.md_ptrace_instr);
 +	if (error)
 +		return error;
 +
 +	error = ptrace_write_int(l, tf->tf_pc + INSN_SIZE,
 +	    PTRACE_BREAKPOINT_INSN);
 +	if (error) {
 +		l->l_md.md_ptrace_instr = 0;
 +		return error;
 +	}
 +
 +	l->l_md.md_ptrace_addr = tf->tf_pc + INSN_SIZE;
 +	error = ptrace_get_alternative_next(l, cur_instr, &alt_next);
 +	if (error)
 +		return 0;
 +
 +	error = ptrace_read_int(l, alt_next, &l->l_md.md_ptrace_instr_alt);
 +	if (error) {
 +		l->l_md.md_ptrace_instr_alt = 0;
 +		return error;
 +	}
 +
 +	error = ptrace_write_int(l, alt_next, PTRACE_BREAKPOINT_INSN);
 +	if (error) {
 +		l->l_md.md_ptrace_instr_alt = 0;
 +		return error;
 +	}
 +
 +	l->l_md.md_ptrace_addr_alt = alt_next;
 +
 +	return 0;
 +}
 +
 +int
 +process_clear_sstep(struct lwp *l)
 +{
 +	struct trapframe * const tf = lwp_trapframe(l);
 +
 +	/* TODO: This needs to be updated for Thumb-2 */
 +	if ((tf->tf_spsr & PSR_T_bit) != 0)
 +		return EINVAL;
 +
 +	if (l->l_md.md_ptrace_instr != 0) {
 +		ptrace_write_int(l, l->l_md.md_ptrace_addr,
 +		    l->l_md.md_ptrace_instr);
 +		l->l_md.md_ptrace_instr = 0;
 +	}
 +	l->l_md.md_ptrace_addr = 0;
 +
 +	if (l->l_md.md_ptrace_instr_alt != 0) {
 +		ptrace_write_int(l, l->l_md.md_ptrace_addr_alt,
 +		    l->l_md.md_ptrace_instr_alt);
 +		l->l_md.md_ptrace_instr_alt = 0;
 +	}
 +	l->l_md.md_ptrace_addr_alt = 0;
 +
 +	return 0;
 +}
 Index: sys/arch/arm/arm/undefined.c
 ===================================================================
 RCS file: /cvsroot/src/sys/arch/arm/arm/undefined.c,v
 retrieving revision 1.58
 diff -u -p -r1.58 undefined.c
 --- sys/arch/arm/arm/undefined.c	27 Feb 2017 06:46:59 -0000	1.58
 +++ sys/arch/arm/arm/undefined.c	13 Apr 2017 10:20:38 -0000
 @@ -47,8 +47,9 @@
  #define FAST_FPE
  
  #include "opt_ddb.h"
 -#include "opt_kgdb.h"
  #include "opt_dtrace.h"
 +#include "opt_kgdb.h"
 +#include "opt_ptrace.h"
  
  #include <sys/param.h>
  #ifdef KGDB
 @@ -85,11 +86,18 @@ __KERNEL_RCSID(0, "$NetBSD: undefined.c,
  #include <machine/db_machdep.h>
  #endif
  
 +#ifdef PTRACE
 +#include <sys/ptrace.h>
 +#endif
 +
  #ifdef acorn26
  #include <machine/machdep.h>
  #endif
  
  static int gdb_trapper(u_int, u_int, struct trapframe *, int);
 +#ifdef PTRACE
 +static int ptrace_trapper(u_int, u_int, struct trapframe *, int);
 +#endif
  
  LIST_HEAD(, undefined_handler) undefined_handlers[NUM_UNKNOWN_HANDLERS];
  
 @@ -212,6 +220,38 @@ gdb_trapper(u_int addr, u_int insn, stru
  	return 1;
  }
  
 +#ifdef PTRACE
 +static struct undefined_handler ptrace_uh;
 +
 +static int
 +ptrace_trapper(u_int addr, u_int insn, struct trapframe *tf, int code)
 +{
 +	/* TODO: No support for ptrace from Thumb-2 */
 +	if ((tf->tf_spsr & PSR_T_bit))
 +		return 1;
 +
 +	if (insn == PTRACE_BREAKPOINT_INSN) {
 +		struct lwp * const l = curlwp;
 +		const bool sstep =
 +		   addr == l->l_md.md_ptrace_addr ||
 +		   addr == l->l_md.md_ptrace_addr_alt;
 +
 +		process_clear_sstep(l);
 +		ksiginfo_t ksi;
 +		KSI_INIT_TRAP(&ksi);
 +		ksi.ksi_signo = SIGTRAP;
 +		ksi.ksi_code = sstep ? TRAP_TRACE : TRAP_BRKPT;
 +		ksi.ksi_addr = (uint32_t *)addr;
 +		ksi.ksi_trap = insn;
 +		trapsignal(l, &ksi);
 +		return 0;
 +	}
 +
 +	return 1;
 +}
 +#endif
 +
 +
  static struct undefined_handler cp15_uh;
  static struct undefined_handler gdb_uh;
  #ifdef THUMB_CODE
 @@ -273,6 +313,12 @@ undefined_init(void)
  	/* Install handler for GDB breakpoints */
  	gdb_uh.uh_handler = gdb_trapper;
  	install_coproc_handler_static(CORE_UNKNOWN_HANDLER, &gdb_uh);
 +
 +#ifdef PTRACE
 +	/* Install handler for PTRACE breakpoints */
 +	ptrace_uh.uh_handler = ptrace_trapper;
 +	install_coproc_handler_static(CORE_UNKNOWN_HANDLER, &ptrace_uh);
 +#endif
  #ifdef THUMB_CODE
  	gdb_uh_thumb.uh_handler = gdb_trapper;
  	install_coproc_handler_static(THUMB_UNKNOWN_HANDLER, &gdb_uh_thumb);
 Index: sys/arch/arm/arm32/db_interface.c
 ===================================================================
 RCS file: /cvsroot/src/sys/arch/arm/arm32/db_interface.c,v
 retrieving revision 1.54
 diff -u -p -r1.54 db_interface.c
 --- sys/arch/arm/arm32/db_interface.c	29 Oct 2014 14:14:14 -0000	1.54
 +++ sys/arch/arm/arm32/db_interface.c	13 Apr 2017 10:20:38 -0000
 @@ -51,6 +51,7 @@ __KERNEL_RCSID(0, "$NetBSD: db_interface
  
  #include <uvm/uvm_extern.h>
  
 +#include <arm/arm32/machdep.h>
  #include <arm/arm32/db_machdep.h>
  #include <arm/undefined.h>
  #include <ddb/db_access.h>
 @@ -462,54 +463,38 @@ db_fetch_reg(int reg, db_regs_t *regs)
  	}
  }
  
 +static u_int
 +db_branch_taken_read_int(void *cookie __unused, vaddr_t va, u_int *val)
 +{
 +	u_int ret;
 +
 +	db_read_bytes(va, sizeof(ret), (char *)&ret);
 +	*val = ret;
 +
 +	return 0;
 +}
 +
 +static u_int
 +db_branch_taken_fetch_reg(void *cookie, int reg)
 +{
 +	db_regs_t *regs = cookie;
 +
 +	return db_fetch_reg(reg, regs);
 +}
 +
  u_int
  branch_taken(u_int insn, u_int pc, db_regs_t *regs)
  {
 -	u_int addr, nregs;
 +	register_t new_pc;
 +	int ret;
  
 -	switch ((insn >> 24) & 0xf) {
 -	case 0xa:	/* b ... */
 -	case 0xb:	/* bl ... */
 -		addr = ((insn << 2) & 0x03ffffff);
 -		if (addr & 0x02000000)
 -			addr |= 0xfc000000;
 -		return (pc + 8 + addr);
 -	case 0x7:	/* ldr pc, [pc, reg, lsl #2] */
 -		addr = db_fetch_reg(insn & 0xf, regs);
 -		addr = pc + 8 + (addr << 2);
 -		db_read_bytes(addr, 4, (char *)&addr);
 -		return (addr);
 -	case 0x5:	/* ldr pc, [reg] */
 -		addr = db_fetch_reg((insn >> 16) & 0xf, regs);
 -		db_read_bytes(addr, 4, (char *)&addr);
 -		return (addr);
 -	case 0x1:	/* mov pc, reg */
 -		addr = db_fetch_reg(insn & 0xf, regs);
 -		return (addr);
 -	case 0x8:	/* ldmxx reg, {..., pc} */
 -	case 0x9:
 -		addr = db_fetch_reg((insn >> 16) & 0xf, regs);
 -		nregs = (insn  & 0x5555) + ((insn  >> 1) & 0x5555);
 -		nregs = (nregs & 0x3333) + ((nregs >> 2) & 0x3333);
 -		nregs = (nregs + (nregs >> 4)) & 0x0f0f;
 -		nregs = (nregs + (nregs >> 8)) & 0x001f;
 -		switch ((insn >> 23) & 0x3) {
 -		case 0x0:	/* ldmda */
 -			addr = addr - 0;
 -			break;
 -		case 0x1:	/* ldmia */
 -			addr = addr + 0 + ((nregs - 1) << 2);
 -			break;
 -		case 0x2:	/* ldmdb */
 -			addr = addr - 4;
 -			break;
 -		case 0x3:	/* ldmib */
 -			addr = addr + 4 + ((nregs - 1) << 2);
 -			break;
 -		}
 -		db_read_bytes(addr, 4, (char *)&addr);
 -		return (addr);
 -	default:
 -		panic("branch_taken: botch");
 +	ret = arm_predict_branch(regs, insn, pc, &new_pc,
 +	    db_branch_taken_fetch_reg, db_branch_taken_read_int);
 +
 +	if (ret != 0) {
 +		panic("what now");
 +		//kdb_reenter();
  	}
 +
 +	return new_pc;
  }
 Index: sys/arch/arm/include/armreg.h
 ===================================================================
 RCS file: /cvsroot/src/sys/arch/arm/include/armreg.h,v
 retrieving revision 1.111
 diff -u -p -r1.111 armreg.h
 --- sys/arch/arm/include/armreg.h	17 May 2016 08:27:24 -0000	1.111
 +++ sys/arch/arm/include/armreg.h	13 Apr 2017 10:20:39 -0000
 @@ -604,6 +604,12 @@
  
  #define THUMB_INSN_SIZE		2		/* Some are 4 bytes.  */
  
 +/* ARM register defines */
 +#define	ARM_REG_SIZE		4
 +#define	ARM_REG_NUM_PC		15
 +#define	ARM_REG_NUM_LR		14
 +#define	ARM_REG_NUM_SP		13
 +
  /*
   * Defines and such for arm11 Performance Monitor Counters (p15, c15, c12, 0)
   */
 Index: sys/arch/arm/include/cpu.h
 ===================================================================
 RCS file: /cvsroot/src/sys/arch/arm/include/cpu.h,v
 retrieving revision 1.93
 diff -u -p -r1.93 cpu.h
 --- sys/arch/arm/include/cpu.h	4 Apr 2017 09:26:32 -0000	1.93
 +++ sys/arch/arm/include/cpu.h	13 Apr 2017 10:20:39 -0000
 @@ -315,6 +315,9 @@ void	cpu_set_curpri(int);
   */
  vaddr_t cpu_uarea_alloc_idlelwp(struct cpu_info *);
  
 +int arm_predict_branch(void *, u_int, register_t, register_t *,
 +    u_int (*)(void *, int), u_int (*)(void *, vaddr_t, u_int *));
 +
  #ifndef acorn26
  /*
   * cpu device glue (belongs in cpuvar.h)
 Index: sys/arch/arm/include/db_machdep.h
 ===================================================================
 RCS file: /cvsroot/src/sys/arch/arm/include/db_machdep.h,v
 retrieving revision 1.24
 diff -u -p -r1.24 db_machdep.h
 --- sys/arch/arm/include/db_machdep.h	20 Feb 2017 17:27:32 -0000	1.24
 +++ sys/arch/arm/include/db_machdep.h	13 Apr 2017 10:20:39 -0000
 @@ -91,7 +91,8 @@ extern db_regs_t *ddb_regp;
  /* mov pc, reg
  					    0000000f  register */
  #define	inst_return(ins)	(((ins) & 0x0e108000) == 0x08108000 || \
 -				 ((ins) & 0x0ff0fff0) == 0x01a0f000)
 +				 ((ins) & 0x0ff0fff0) == 0x01a0f000 ||	\
 +				 ((ins) & 0x0ffffff0) == 0x012fff10) /* bx */
  /* bl ...
  					    00ffffff  offset>>2 */
  #define	inst_call(ins)		(((ins) & 0x0f000000) == 0x0b000000)
 @@ -99,9 +100,13 @@ extern db_regs_t *ddb_regp;
  					    00ffffff  offset>>2 */
  /* ldr pc, [pc, reg, lsl #2]
  					    0000000f  register */
 +
  #define	inst_branch(ins)	(((ins) & 0x0f000000) == 0x0a000000 || \
  				 ((ins) & 0x0fdffff0) == 0x079ff100 || \
 -				 ((ins) & 0x0ff0f000) == 0x0590f000)
 +				 ((ins) & 0x0cd0f000) == 0x0490f000 || \
 +				 ((ins) & 0x0ffffff0) == 0x012fff30 || /* blx */ \
 +				 ((ins) & 0x0de0f000) == 0x0080f000)
 +
  #define inst_load(ins)		(0)
  #define inst_store(ins)		(0)
  #define inst_unconditional_flow_transfer(ins)	\
 Index: sys/arch/arm/include/proc.h
 ===================================================================
 RCS file: /cvsroot/src/sys/arch/arm/include/proc.h,v
 retrieving revision 1.17
 diff -u -p -r1.17 proc.h
 --- sys/arch/arm/include/proc.h	24 Feb 2014 16:57:57 -0000	1.17
 +++ sys/arch/arm/include/proc.h	13 Apr 2017 10:20:39 -0000
 @@ -44,7 +44,11 @@ struct lwp;
  
  struct mdlwp {
  	struct trapframe *md_tf;
 -	int	md_flags;
 +	int md_flags;
 +	int md_ptrace_instr;
 +	int md_ptrace_addr;
 +	int md_ptrace_instr_alt;
 +	int md_ptrace_addr_alt;
  };
  
  /* Flags setttings for md_flags */
 Index: sys/arch/arm/include/ptrace.h
 ===================================================================
 RCS file: /cvsroot/src/sys/arch/arm/include/ptrace.h,v
 retrieving revision 1.11
 diff -u -p -r1.11 ptrace.h
 --- sys/arch/arm/include/ptrace.h	12 Apr 2017 18:17:59 -0000	1.11
 +++ sys/arch/arm/include/ptrace.h	13 Apr 2017 10:20:39 -0000
 @@ -34,18 +34,14 @@
  /*
   * arm-dependent ptrace definitions
   */
 -#ifndef _KERNEL
 -#define PT_STEP		(PT_FIRSTMACH + 0) /* Not implemented */
 -#endif
 +#define	PT_STEP		(PT_FIRSTMACH + 0)
  #define	PT_GETREGS	(PT_FIRSTMACH + 1)
  #define	PT_SETREGS	(PT_FIRSTMACH + 2)
  /* 3 and 4 are for FPE registers */
  #define	PT_GETFPREGS	(PT_FIRSTMACH + 5)
  #define	PT_SETFPREGS	(PT_FIRSTMACH + 6)
 -#ifndef _KERNEL
 -#define PT_SETSTEP	(PT_FIRSTMACH + 7) /* Not implemented */
 -#define PT_CLEARSTEP	(PT_FIRSTMACH + 8) /* Not implemented */
 -#endif
 +#define PT_SETSTEP	(PT_FIRSTMACH + 7)
 +#define PT_CLEARSTEP	(PT_FIRSTMACH + 8)
  
  #define PT_MACHDEP_STRINGS \
  	"PT_STEP", \
 @@ -68,3 +64,7 @@
  #define PTRACE_BREAKPOINT_INSN	0xe7fffffe
  #define PTRACE_BREAKPOINT_ASM	__asm __volatile (".word " ___STRING(PTRACE_BREAKPOINT_INSN) )
  #define PTRACE_BREAKPOINT_SIZE	4
 +
 +struct lwp;
 +int	process_clear_sstep(struct lwp *);
 +
 Index: sys/arch/hppa/include/ptrace.h
 ===================================================================
 RCS file: /cvsroot/src/sys/arch/hppa/include/ptrace.h,v
 retrieving revision 1.8
 diff -u -p -r1.8 ptrace.h
 --- sys/arch/hppa/include/ptrace.h	12 Apr 2017 18:17:59 -0000	1.8
 +++ sys/arch/hppa/include/ptrace.h	13 Apr 2017 10:20:42 -0000
 @@ -60,3 +60,7 @@
  #define PTRACE_BREAKPOINT	((const uint8_t[]) { 0x00, 0x01, 0x00, 0x04 })
  #define PTRACE_BREAKPOINT_ASM	__asm __volatile("break	%0, %1" :: "i" (HPPA_BREAK_KERNEL), "i" (HPPA_BREAK_SS) : "memory")
  #define PTRACE_BREAKPOINT_SIZE	4
 +
 +struct lwp;
 +int     process_clear_sstep(struct lwp *);
 +
 Index: sys/kern/sys_process.c
 ===================================================================
 RCS file: /cvsroot/src/sys/kern/sys_process.c,v
 retrieving revision 1.179
 diff -u -p -r1.179 sys_process.c
 --- sys/kern/sys_process.c	13 Apr 2017 07:58:45 -0000	1.179
 +++ sys/kern/sys_process.c	13 Apr 2017 10:20:39 -0000
 @@ -145,6 +145,42 @@ __KERNEL_RCSID(0, "$NetBSD: sys_process.
  #include <machine/reg.h>
  
  #if defined(KTRACE) || defined(PTRACE_HOOKS)
 +
 +static int
 +proc_iop(struct lwp *curl, struct lwp *l, vaddr_t va, void *buf,
 +    size_t len, enum uio_rw rw)
 +{
 +	struct uio uio;
 +	struct iovec iov;
 +
 +	iov.iov_base = buf;
 +	iov.iov_len = len;
 +	uio.uio_iov = &iov;
 +	uio.uio_iovcnt = 1;
 +	uio.uio_offset = va;
 +	uio.uio_resid = len;
 +	uio.uio_rw = rw;
 +	UIO_SETUP_SYSSPACE(&uio);
 +
 +	return process_domem(curl, l, &uio);
 +}
 +
 +int
 +proc_readmem(struct lwp *curl, struct lwp *l, vaddr_t va, void *buf,
 +    size_t len)
 +{
 +
 +	return proc_iop(curl, l, va, buf, len, UIO_READ);
 +}
 +
 +int
 +proc_writemem(struct lwp *curl, struct lwp *l, vaddr_t va, void *buf,
 +    size_t len)
 +{
 +
 +	return proc_iop(curl, l, va, buf, len, UIO_WRITE);
 +}
 +
  int
  process_domem(struct lwp *curl /*tracer*/,
      struct lwp *l /*traced*/,
 Index: sys/sys/ptrace.h
 ===================================================================
 RCS file: /cvsroot/src/sys/sys/ptrace.h,v
 retrieving revision 1.60
 diff -u -p -r1.60 ptrace.h
 --- sys/sys/ptrace.h	24 Mar 2017 17:40:44 -0000	1.60
 +++ sys/sys/ptrace.h	13 Apr 2017 10:20:39 -0000
 @@ -212,6 +212,8 @@ void	proc_stoptrace(int);
  void	proc_reparent(struct proc *, struct proc *);
  void	proc_changeparent(struct proc *, struct proc *);
  
 +int	proc_readmem(struct lwp *, struct lwp *, vaddr_t, void *, size_t);
 +int	proc_writemem(struct lwp *, struct lwp *, vaddr_t, void *, size_t);
  
  int	do_ptrace(struct ptrace_methods *, struct lwp *, int, pid_t, void *,
  	    int, register_t *);
 Index: sys/arch/hppa/hppa/trap.c
 ===================================================================
 RCS file: /cvsroot/src/sys/arch/hppa/hppa/trap.c,v
 retrieving revision 1.107
 diff -u -p -r1.107 trap.c
 --- sys/arch/hppa/hppa/trap.c	2 Mar 2015 11:05:12 -0000	1.107
 +++ sys/arch/hppa/hppa/trap.c	13 Apr 2017 10:20:41 -0000
 @@ -1015,40 +1015,16 @@ cpu_spawn_return(struct lwp *l)
  
  #include <sys/ptrace.h>
  
 -int
 +static inline int
  ss_get_value(struct lwp *l, vaddr_t addr, u_int *value)
  {
 -	struct uio uio;
 -	struct iovec iov;
 -
 -	iov.iov_base = (void *)value;
 -	iov.iov_len = sizeof(u_int);
 -	uio.uio_iov = &iov;
 -	uio.uio_iovcnt = 1;
 -	uio.uio_offset = (off_t)addr;
 -	uio.uio_resid = sizeof(u_int);
 -	uio.uio_rw = UIO_READ;
 -	UIO_SETUP_SYSSPACE(&uio);
 -
 -	return (process_domem(curlwp, l, &uio));
 +	return proc_readmem(curlwp, l, addr, value, sizeof(*value));
  }
  
  int
  ss_put_value(struct lwp *l, vaddr_t addr, u_int value)
  {
 -	struct uio uio;
 -	struct iovec iov;
 -
 -	iov.iov_base = (void *)&value;
 -	iov.iov_len = sizeof(u_int);
 -	uio.uio_iov = &iov;
 -	uio.uio_iovcnt = 1;
 -	uio.uio_offset = (off_t)addr;
 -	uio.uio_resid = sizeof(u_int);
 -	uio.uio_rw = UIO_WRITE;
 -	UIO_SETUP_SYSSPACE(&uio);
 -
 -	return (process_domem(curlwp, l, &uio));
 +	return proc_writemem(curlwp, l, addr, &value, sizeof(value));
  }
  
  void
 Index: sys/arch/hppa/include/ptrace.h
 ===================================================================
 RCS file: /cvsroot/src/sys/arch/hppa/include/ptrace.h,v
 retrieving revision 1.8
 diff -u -p -r1.8 ptrace.h
 --- sys/arch/hppa/include/ptrace.h	12 Apr 2017 18:17:59 -0000	1.8
 +++ sys/arch/hppa/include/ptrace.h	13 Apr 2017 10:20:42 -0000
 @@ -60,3 +60,7 @@
  #define PTRACE_BREAKPOINT	((const uint8_t[]) { 0x00, 0x01, 0x00, 0x04 })
  #define PTRACE_BREAKPOINT_ASM	__asm __volatile("break	%0, %1" :: "i" (HPPA_BREAK_KERNEL), "i" (HPPA_BREAK_SS) : "memory")
  #define PTRACE_BREAKPOINT_SIZE	4
 +
 +struct lwp;
 +int     process_clear_sstep(struct lwp *);
 +
 
 
 --------------080500010605080702030803--
 


Home | Main Index | Thread Index | Old Index