better ptrace() support from Sean Eric Fagan <sef@kithrup.com>

This commit is contained in:
cgd 1993-09-04 05:32:18 +00:00
parent acb2374c70
commit 3aa99f85dc
3 changed files with 43 additions and 4 deletions

View File

@ -35,7 +35,7 @@
* SUCH DAMAGE.
*
* from: @(#)machdep.c 7.4 (Berkeley) 6/3/91
* $Id: machdep.c,v 1.44 1993/09/04 01:29:22 cgd Exp $
* $Id: machdep.c,v 1.45 1993/09/04 05:32:18 cgd Exp $
*/
#include "npx.h"
@ -1451,3 +1451,41 @@ pmap_page_index(pa)
return -1;
}
#endif /* MACHINE_NONCONTIG */
/*
* The registers are in the frame; the frame is in the user area of
* the process in question; when the process is active, the registers
* are in "the kernel stack"; when it's not, they're still there, but
* things get flipped around. So, since p->p_regs is the whole address
* of the register set, take its offset from the kernel stack, and
* index into the user block. Don't you just *love* virtual memory?
* (I'm starting to think seymour is right...)
*/
int
ptrace_set_pc (struct proc *p, unsigned int addr) {
struct pcb *pcb;
void *regs = (char*)p->p_addr +
((char*) p->p_regs - (char*) kstack);
pcb = &p->p_addr->u_pcb;
if (pcb->pcb_flags & FM_TRAP)
((struct trapframe *)regs)->tf_eip = addr;
else
((struct syscframe *)regs)->sf_eip = addr;
return 0;
}
int
ptrace_single_step (struct proc *p) {
struct pcb *pcb;
void *regs = (char*)p->p_addr +
((char*) p->p_regs - (char*) kstack);
pcb = &p->p_addr->u_pcb;
if (pcb->pcb_flags & FM_TRAP)
((struct trapframe *)regs)->tf_eflags |= PSL_T;
else
((struct syscframe *)regs)->sf_eflags |= PSL_T;
return 0;
}

View File

@ -1 +1 @@
revision 1.8 intentionally removed
revision 1.9 intentionally removed

View File

@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* from: @(#)ptrace.h 7.4 (Berkeley) 2/22/91
* $Id: ptrace.h,v 1.3 1993/05/20 16:22:53 cgd Exp $
* $Id: ptrace.h,v 1.4 1993/09/04 05:32:42 cgd Exp $
*/
#ifndef _SYS_PTRACE_H_
@ -47,7 +47,8 @@
#define PT_CONTINUE 7 /* continue the child */
#define PT_KILL 8 /* kill the child process */
#define PT_STEP 9 /* single step the child */
/*#define PT_ATTACH 10 /* attach to running process */
/*#define PT_DETACH 11 /* detach from running process */
#ifndef KERNEL
#include <sys/cdefs.h>