mirror of
https://github.com/freebsd/freebsd-src
synced 2024-11-05 18:22:52 +00:00
Convert syscall to trapframe. Based on work done by John Brezak.
This commit is contained in:
parent
f7d757443b
commit
c8a13ecd00
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=924
24 changed files with 445 additions and 760 deletions
|
@ -23,7 +23,7 @@
|
|||
* any improvements or extensions that they make and grant Carnegie the
|
||||
* rights to redistribute these changes.
|
||||
*
|
||||
* $Id: db_trace.c,v 1.2 1993/10/16 14:14:56 rgrimes Exp $
|
||||
* $Id: db_trace.c,v 1.3 1993/12/19 00:50:01 wollman Exp $
|
||||
*/
|
||||
|
||||
#include "param.h"
|
||||
|
@ -73,8 +73,10 @@ struct i386_frame {
|
|||
|
||||
#define TRAP 1
|
||||
#define INTERRUPT 2
|
||||
#define SYSCALL 3
|
||||
|
||||
db_addr_t db_trap_symbol_value = 0;
|
||||
db_addr_t db_syscall_symbol_value = 0;
|
||||
db_addr_t db_kdintr_symbol_value = 0;
|
||||
boolean_t db_trace_symbols_found = FALSE;
|
||||
|
||||
|
@ -86,6 +88,8 @@ db_find_trace_symbols()
|
|||
db_trap_symbol_value = (db_addr_t) value;
|
||||
if (db_value_of_name("_kdintr", &value))
|
||||
db_kdintr_symbol_value = (db_addr_t) value;
|
||||
if (db_value_of_name("_syscall", &value))
|
||||
db_syscall_symbol_value = (db_addr_t) value;
|
||||
db_trace_symbols_found = TRUE;
|
||||
}
|
||||
|
||||
|
@ -135,26 +139,43 @@ db_nextframe(fp, ip, argp, is_trap)
|
|||
{
|
||||
struct i386_saved_state *saved_regs;
|
||||
|
||||
if (is_trap == 0) {
|
||||
switch (is_trap) {
|
||||
case 0:
|
||||
*ip = (db_addr_t)
|
||||
db_get_value((int) &(*fp)->f_retaddr, 4, FALSE);
|
||||
*fp = (struct i386_frame *)
|
||||
db_get_value((int) &(*fp)->f_frame, 4, FALSE);
|
||||
} else {
|
||||
break;
|
||||
case TRAP:
|
||||
default:
|
||||
/*
|
||||
* We know that trap() has 1 argument and we know that
|
||||
* it is an (int *).
|
||||
*/
|
||||
#if 0
|
||||
saved_regs = (struct i386_saved_state *)
|
||||
db_get_value((int)argp, 4, FALSE);
|
||||
#endif
|
||||
saved_regs = (struct i386_saved_state *)argp;
|
||||
db_printf("--- trap (number %d) ---\n",
|
||||
saved_regs->tf_trapno & 0xffff);
|
||||
db_printsym(saved_regs->tf_eip, DB_STGY_XTRN);
|
||||
db_printf(":\n");
|
||||
*fp = (struct i386_frame *)saved_regs->tf_ebp;
|
||||
*ip = (db_addr_t)saved_regs->tf_eip;
|
||||
}
|
||||
break;
|
||||
|
||||
case SYSCALL: {
|
||||
struct trapframe *saved_regs = (struct trapframe *)argp;
|
||||
|
||||
db_printf("--- syscall (number %d) ---\n", saved_regs->tf_eax);
|
||||
db_printsym(saved_regs->tf_eip, DB_STGY_XTRN);
|
||||
db_printf(":\n");
|
||||
*fp = (struct i386_frame *)saved_regs->tf_ebp;
|
||||
*ip = (db_addr_t)saved_regs->tf_eip;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -171,8 +192,10 @@ db_stack_trace_cmd(addr, have_addr, count, modif)
|
|||
boolean_t kernel_only = TRUE;
|
||||
boolean_t trace_thread = FALSE;
|
||||
|
||||
#if 0
|
||||
if (!db_trace_symbols_found)
|
||||
db_find_trace_symbols();
|
||||
#endif
|
||||
|
||||
{
|
||||
register char *cp = modif;
|
||||
|
@ -203,38 +226,84 @@ db_stack_trace_cmd(addr, have_addr, count, modif)
|
|||
|
||||
lastframe = 0;
|
||||
while (count-- && frame != 0) {
|
||||
register int narg;
|
||||
int narg;
|
||||
char * name;
|
||||
db_expr_t offset;
|
||||
db_sym_t sym;
|
||||
#define MAXNARG 16
|
||||
char *argnames[MAXNARG], **argnp = NULL;
|
||||
|
||||
if (INKERNEL((int)frame) && callpc == db_trap_symbol_value) {
|
||||
sym = db_search_symbol(callpc, DB_STGY_ANY, &offset);
|
||||
db_symbol_values(sym, &name, NULL);
|
||||
|
||||
if (lastframe == 0 && sym == NULL) {
|
||||
/* Symbol not found, peek at code */
|
||||
int instr = db_get_value(callpc, 4, FALSE);
|
||||
|
||||
offset = 1;
|
||||
if ((instr & 0x00ffffff) == 0x00e58955 ||
|
||||
/* enter: pushl %ebp, movl %esp, %ebp */
|
||||
(instr & 0x0000ffff) == 0x0000e589
|
||||
/* enter+1: movl %esp, %ebp */ ) {
|
||||
offset = 0;
|
||||
}
|
||||
}
|
||||
#define STRCMP(s1,s2) ((s1) && (s2) && strcmp((s1), (s2)) == 0)
|
||||
if (INKERNEL((int)frame) && STRCMP(name, "_trap")) {
|
||||
narg = 1;
|
||||
is_trap = TRAP;
|
||||
}
|
||||
else
|
||||
if (INKERNEL((int)frame) && callpc == db_kdintr_symbol_value) {
|
||||
if (INKERNEL((int)frame) && STRCMP(name, "_kdintr")) {
|
||||
is_trap = INTERRUPT;
|
||||
narg = 0;
|
||||
}
|
||||
else
|
||||
if (INKERNEL((int)frame) && STRCMP(name, "_syscall")) {
|
||||
is_trap = SYSCALL;
|
||||
narg = 0;
|
||||
}
|
||||
#undef STRCMP
|
||||
else {
|
||||
is_trap = 0;
|
||||
narg = db_numargs(frame);
|
||||
narg = MAXNARG;
|
||||
if (db_sym_numargs(sym, &narg, argnames)) {
|
||||
argnp = argnames;
|
||||
} else {
|
||||
narg = db_numargs(frame);
|
||||
}
|
||||
}
|
||||
|
||||
db_find_sym_and_offset(callpc, &name, &offset);
|
||||
db_printf("%s(", name);
|
||||
|
||||
argp = &frame->f_arg0;
|
||||
if (lastframe == 0 && offset == 0 && !have_addr) {
|
||||
/*
|
||||
* We have a breakpoint before the frame is set up
|
||||
* Use %esp instead
|
||||
*/
|
||||
argp = &((struct i386_frame *)(ddb_regs.tf_esp-4))->f_arg0;
|
||||
} else
|
||||
argp = &frame->f_arg0;
|
||||
|
||||
while (narg) {
|
||||
if (argnp)
|
||||
db_printf("%s=", *argnp++);
|
||||
db_printf("%x", db_get_value((int)argp, 4, FALSE));
|
||||
argp++;
|
||||
if (--narg != 0)
|
||||
db_printf(",");
|
||||
}
|
||||
db_printf(") at ");
|
||||
db_printsym(callpc, DB_STGY_XTRN);
|
||||
db_printsym(callpc, DB_STGY_PROC);
|
||||
db_printf("\n");
|
||||
|
||||
if (lastframe == 0 && offset == 0 && !have_addr) {
|
||||
/* Frame really belongs to next callpc */
|
||||
lastframe = (struct i386_frame *)(ddb_regs.tf_esp-4);
|
||||
callpc = (db_addr_t)db_get_value((int)&lastframe->f_retaddr, 4, FALSE);
|
||||
continue;
|
||||
}
|
||||
|
||||
lastframe = frame;
|
||||
db_nextframe(&frame, &callpc, &frame->f_arg0, is_trap);
|
||||
|
||||
|
@ -257,7 +326,7 @@ db_stack_trace_cmd(addr, have_addr, count, modif)
|
|||
else {
|
||||
/* in user */
|
||||
if (frame <= lastframe) {
|
||||
db_printf("Bad frame pointer: 0x%x\n", frame);
|
||||
db_printf("Bad user frame pointer: 0x%x\n", frame);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -30,7 +30,7 @@
|
|||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $Id$
|
||||
* $Id: exception.s,v 1.1 1993/11/13 02:24:57 davidg Exp $
|
||||
*/
|
||||
|
||||
#include "npx.h" /* NNPX */
|
||||
|
@ -181,7 +181,7 @@ calltrap:
|
|||
* Return through doreti to handle ASTs. Have to change trap frame
|
||||
* to interrupt frame.
|
||||
*/
|
||||
movl $T_ASTFLT,4+4+32(%esp) /* new trap type (err code not used) */
|
||||
movl $T_ASTFLT,TF_TRAPNO(%esp) /* new trap type (err code not used) */
|
||||
pushl _cpl
|
||||
pushl $0 /* dummy unit */
|
||||
jmp doreti
|
||||
|
@ -195,8 +195,8 @@ calltrap:
|
|||
bpttraps:
|
||||
pushal
|
||||
nop
|
||||
pushl %es
|
||||
pushl %ds
|
||||
pushl %es
|
||||
movl $KDSEL,%eax
|
||||
movl %ax,%ds
|
||||
movl %ax,%es
|
||||
|
@ -211,38 +211,24 @@ bpttraps:
|
|||
*/
|
||||
SUPERALIGN_TEXT
|
||||
IDTVEC(syscall)
|
||||
pushfl /* only for stupid carry bit and more stupid wait3 cc kludge */
|
||||
/* XXX - also for direction flag (bzero, etc. clear it) */
|
||||
pushal /* only need eax,ecx,edx - trap resaves others */
|
||||
pushfl /* Room for tf_err */
|
||||
pushfl /* Room for tf_trapno */
|
||||
pushal
|
||||
nop
|
||||
pushl %ds
|
||||
pushl %es
|
||||
movl $KDSEL,%eax /* switch to kernel segments */
|
||||
movl %ax,%ds
|
||||
movl %ax,%es
|
||||
movl TF_ERR(%esp),%eax /* copy eflags from tf_err to fs_eflags */
|
||||
movl %eax,TF_EFLAGS(%esp)
|
||||
movl $0,TF_ERR(%esp) /* zero tf_err */
|
||||
incl _cnt+V_SYSCALL
|
||||
call _syscall
|
||||
/*
|
||||
* Return through doreti to handle ASTs. Have to change syscall frame
|
||||
* to interrupt frame.
|
||||
*
|
||||
* XXX - we should have set up the frame earlier to avoid the
|
||||
* following popal/pushal (not much can be done to avoid shuffling
|
||||
* the flags). Consistent frames would simplify things all over.
|
||||
* Return through doreti to handle ASTs.
|
||||
*/
|
||||
movl 32+0(%esp),%eax /* old flags, shuffle to above cs:eip */
|
||||
movl 32+4(%esp),%ebx /* `int' frame should have been ef, eip, cs */
|
||||
movl 32+8(%esp),%ecx
|
||||
movl %ebx,32+0(%esp)
|
||||
movl %ecx,32+4(%esp)
|
||||
movl %eax,32+8(%esp)
|
||||
popal
|
||||
nop
|
||||
pushl $0 /* dummy error code */
|
||||
pushl $T_ASTFLT
|
||||
pushal
|
||||
nop
|
||||
movl __udatasel,%eax /* switch back to user segments */
|
||||
pushl %eax /* XXX - better to preserve originals? */
|
||||
pushl %eax
|
||||
movl $T_ASTFLT,TF_TRAPNO(%esp) /* new trap type (err code not used) */
|
||||
pushl _cpl
|
||||
pushl $0
|
||||
jmp doreti
|
||||
|
|
|
@ -30,7 +30,7 @@
|
|||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $Id$
|
||||
* $Id: exception.s,v 1.1 1993/11/13 02:24:57 davidg Exp $
|
||||
*/
|
||||
|
||||
#include "npx.h" /* NNPX */
|
||||
|
@ -181,7 +181,7 @@ calltrap:
|
|||
* Return through doreti to handle ASTs. Have to change trap frame
|
||||
* to interrupt frame.
|
||||
*/
|
||||
movl $T_ASTFLT,4+4+32(%esp) /* new trap type (err code not used) */
|
||||
movl $T_ASTFLT,TF_TRAPNO(%esp) /* new trap type (err code not used) */
|
||||
pushl _cpl
|
||||
pushl $0 /* dummy unit */
|
||||
jmp doreti
|
||||
|
@ -195,8 +195,8 @@ calltrap:
|
|||
bpttraps:
|
||||
pushal
|
||||
nop
|
||||
pushl %es
|
||||
pushl %ds
|
||||
pushl %es
|
||||
movl $KDSEL,%eax
|
||||
movl %ax,%ds
|
||||
movl %ax,%es
|
||||
|
@ -211,38 +211,24 @@ bpttraps:
|
|||
*/
|
||||
SUPERALIGN_TEXT
|
||||
IDTVEC(syscall)
|
||||
pushfl /* only for stupid carry bit and more stupid wait3 cc kludge */
|
||||
/* XXX - also for direction flag (bzero, etc. clear it) */
|
||||
pushal /* only need eax,ecx,edx - trap resaves others */
|
||||
pushfl /* Room for tf_err */
|
||||
pushfl /* Room for tf_trapno */
|
||||
pushal
|
||||
nop
|
||||
pushl %ds
|
||||
pushl %es
|
||||
movl $KDSEL,%eax /* switch to kernel segments */
|
||||
movl %ax,%ds
|
||||
movl %ax,%es
|
||||
movl TF_ERR(%esp),%eax /* copy eflags from tf_err to fs_eflags */
|
||||
movl %eax,TF_EFLAGS(%esp)
|
||||
movl $0,TF_ERR(%esp) /* zero tf_err */
|
||||
incl _cnt+V_SYSCALL
|
||||
call _syscall
|
||||
/*
|
||||
* Return through doreti to handle ASTs. Have to change syscall frame
|
||||
* to interrupt frame.
|
||||
*
|
||||
* XXX - we should have set up the frame earlier to avoid the
|
||||
* following popal/pushal (not much can be done to avoid shuffling
|
||||
* the flags). Consistent frames would simplify things all over.
|
||||
* Return through doreti to handle ASTs.
|
||||
*/
|
||||
movl 32+0(%esp),%eax /* old flags, shuffle to above cs:eip */
|
||||
movl 32+4(%esp),%ebx /* `int' frame should have been ef, eip, cs */
|
||||
movl 32+8(%esp),%ecx
|
||||
movl %ebx,32+0(%esp)
|
||||
movl %ecx,32+4(%esp)
|
||||
movl %eax,32+8(%esp)
|
||||
popal
|
||||
nop
|
||||
pushl $0 /* dummy error code */
|
||||
pushl $T_ASTFLT
|
||||
pushal
|
||||
nop
|
||||
movl __udatasel,%eax /* switch back to user segments */
|
||||
pushl %eax /* XXX - better to preserve originals? */
|
||||
pushl %eax
|
||||
movl $T_ASTFLT,TF_TRAPNO(%esp) /* new trap type (err code not used) */
|
||||
pushl _cpl
|
||||
pushl $0
|
||||
jmp doreti
|
||||
|
|
|
@ -32,7 +32,7 @@
|
|||
* SUCH DAMAGE.
|
||||
*
|
||||
* from: @(#)npx.c 7.2 (Berkeley) 5/12/91
|
||||
* $Id: npx.c,v 1.4 1993/11/03 00:29:19 paul Exp $
|
||||
* $Id: npx.c,v 1.5 1993/11/03 23:32:35 paul Exp $
|
||||
*/
|
||||
|
||||
#include "npx.h"
|
||||
|
@ -439,7 +439,6 @@ npxintr(frame)
|
|||
* just before it is used).
|
||||
*/
|
||||
curproc->p_regs = (int *)&frame.if_es;
|
||||
curpcb->pcb_flags |= FM_TRAP; /* used by sendsig */
|
||||
#ifdef notyet
|
||||
/*
|
||||
* Encode the appropriate code for detailed information on
|
||||
|
@ -450,7 +449,6 @@ npxintr(frame)
|
|||
code = 0; /* XXX */
|
||||
#endif
|
||||
trapsignal(curproc, SIGFPE, code);
|
||||
curpcb->pcb_flags &= ~FM_TRAP;
|
||||
} else {
|
||||
/*
|
||||
* Nested interrupt. These losers occur when:
|
||||
|
|
|
@ -35,7 +35,7 @@
|
|||
* SUCH DAMAGE.
|
||||
*
|
||||
* from: @(#)machdep.c 7.4 (Berkeley) 6/3/91
|
||||
* $Id: machdep.c,v 1.22 1993/12/19 00:50:03 wollman Exp $
|
||||
* $Id: machdep.c,v 1.23 1993/12/22 13:12:04 davidg Exp $
|
||||
*/
|
||||
|
||||
#include "npx.h"
|
||||
|
@ -418,7 +418,6 @@ sendsig(catcher, sig, mask, code)
|
|||
|
||||
regs = p->p_regs;
|
||||
oonstack = ps->ps_onstack;
|
||||
frmtrap = curpcb->pcb_flags & FM_TRAP;
|
||||
/*
|
||||
* Allocate and validate space for the signal handler
|
||||
* context. Note that if the stack is in P0 space, the
|
||||
|
@ -431,12 +430,8 @@ sendsig(catcher, sig, mask, code)
|
|||
- sizeof(struct sigframe));
|
||||
ps->ps_onstack = 1;
|
||||
} else {
|
||||
if (frmtrap)
|
||||
fp = (struct sigframe *)(regs[tESP]
|
||||
- sizeof(struct sigframe));
|
||||
else
|
||||
fp = (struct sigframe *)(regs[sESP]
|
||||
- sizeof(struct sigframe));
|
||||
fp = (struct sigframe *)(regs[tESP]
|
||||
- sizeof(struct sigframe));
|
||||
}
|
||||
|
||||
if (useracc((caddr_t)fp, sizeof (struct sigframe), B_WRITE) == 0) {
|
||||
|
@ -463,35 +458,21 @@ sendsig(catcher, sig, mask, code)
|
|||
fp->sf_handler = catcher;
|
||||
|
||||
/* save scratch registers */
|
||||
if(frmtrap) {
|
||||
fp->sf_eax = regs[tEAX];
|
||||
fp->sf_edx = regs[tEDX];
|
||||
fp->sf_ecx = regs[tECX];
|
||||
} else {
|
||||
fp->sf_eax = regs[sEAX];
|
||||
fp->sf_edx = regs[sEDX];
|
||||
fp->sf_ecx = regs[sECX];
|
||||
}
|
||||
fp->sf_eax = regs[tEAX];
|
||||
fp->sf_edx = regs[tEDX];
|
||||
fp->sf_ecx = regs[tECX];
|
||||
|
||||
/*
|
||||
* Build the signal context to be used by sigreturn.
|
||||
*/
|
||||
fp->sf_sc.sc_onstack = oonstack;
|
||||
fp->sf_sc.sc_mask = mask;
|
||||
if(frmtrap) {
|
||||
fp->sf_sc.sc_sp = regs[tESP];
|
||||
fp->sf_sc.sc_fp = regs[tEBP];
|
||||
fp->sf_sc.sc_pc = regs[tEIP];
|
||||
fp->sf_sc.sc_ps = regs[tEFLAGS];
|
||||
regs[tESP] = (int)fp;
|
||||
regs[tEIP] = (int)((struct pcb *)kstack)->pcb_sigc;
|
||||
} else {
|
||||
fp->sf_sc.sc_sp = regs[sESP];
|
||||
fp->sf_sc.sc_fp = regs[sEBP];
|
||||
fp->sf_sc.sc_pc = regs[sEIP];
|
||||
fp->sf_sc.sc_ps = regs[sEFLAGS];
|
||||
regs[sESP] = (int)fp;
|
||||
regs[sEIP] = (int)((struct pcb *)kstack)->pcb_sigc;
|
||||
}
|
||||
fp->sf_sc.sc_sp = regs[tESP];
|
||||
fp->sf_sc.sc_fp = regs[tEBP];
|
||||
fp->sf_sc.sc_pc = regs[tEIP];
|
||||
fp->sf_sc.sc_ps = regs[tEFLAGS];
|
||||
regs[tESP] = (int)fp;
|
||||
regs[tEIP] = (int)((struct pcb *)kstack)->pcb_sigc;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -519,7 +500,7 @@ sigreturn(p, uap, retval)
|
|||
register int *regs = p->p_regs;
|
||||
|
||||
/*
|
||||
* (XXX old comment) regs[sESP] points to the return address.
|
||||
* (XXX old comment) regs[tESP] points to the return address.
|
||||
* The user scp pointer is above that.
|
||||
* The return address is faked in the signal trampoline code
|
||||
* for consistency.
|
||||
|
@ -532,9 +513,9 @@ sigreturn(p, uap, retval)
|
|||
return(EINVAL);
|
||||
|
||||
/* restore scratch registers */
|
||||
regs[sEAX] = fp->sf_eax ;
|
||||
regs[sEDX] = fp->sf_edx ;
|
||||
regs[sECX] = fp->sf_ecx ;
|
||||
regs[tEAX] = fp->sf_eax ;
|
||||
regs[tEDX] = fp->sf_edx ;
|
||||
regs[tECX] = fp->sf_ecx ;
|
||||
|
||||
if (useracc((caddr_t)scp, sizeof (*scp), 0) == 0)
|
||||
return(EINVAL);
|
||||
|
@ -546,10 +527,10 @@ sigreturn(p, uap, retval)
|
|||
p->p_sigacts->ps_onstack = scp->sc_onstack & 01;
|
||||
p->p_sigmask = scp->sc_mask &~
|
||||
(sigmask(SIGKILL)|sigmask(SIGCONT)|sigmask(SIGSTOP));
|
||||
regs[sEBP] = scp->sc_fp;
|
||||
regs[sESP] = scp->sc_sp;
|
||||
regs[sEIP] = scp->sc_pc;
|
||||
regs[sEFLAGS] = scp->sc_ps;
|
||||
regs[tEBP] = scp->sc_fp;
|
||||
regs[tESP] = scp->sc_sp;
|
||||
regs[tEIP] = scp->sc_pc;
|
||||
regs[tEFLAGS] = scp->sc_ps;
|
||||
return(EJUSTRETURN);
|
||||
}
|
||||
|
||||
|
@ -762,13 +743,18 @@ initcpu()
|
|||
* Clear registers on exec
|
||||
*/
|
||||
void
|
||||
setregs(p, entry)
|
||||
setregs(p, entry, stack)
|
||||
struct proc *p;
|
||||
u_long entry;
|
||||
u_long stack;
|
||||
{
|
||||
|
||||
p->p_regs[sEBP] = 0; /* bottom of the fp chain */
|
||||
p->p_regs[sEIP] = entry;
|
||||
p->p_regs[tEBP] = 0; /* bottom of the fp chain */
|
||||
p->p_regs[tEIP] = entry;
|
||||
p->p_regs[tESP] = stack;
|
||||
p->p_regs[tSS] = _udatasel;
|
||||
p->p_regs[tDS] = _udatasel;
|
||||
p->p_regs[tES] = _udatasel;
|
||||
p->p_regs[tCS] = _ucodesel;
|
||||
|
||||
p->p_addr->u_pcb.pcb_flags = 0; /* no fp at all */
|
||||
load_cr0(rcr0() | CR0_TS); /* start emulating */
|
||||
|
@ -1153,7 +1139,7 @@ init386(first)
|
|||
x = (int) &IDTVEC(syscall);
|
||||
gdp->gd_looffset = x++;
|
||||
gdp->gd_selector = GSEL(GCODE_SEL,SEL_KPL);
|
||||
gdp->gd_stkcpy = 0;
|
||||
gdp->gd_stkcpy = 1; /* Leaves room for eflags like a trap */
|
||||
gdp->gd_type = SDT_SYS386CGT;
|
||||
gdp->gd_dpl = SEL_UPL;
|
||||
gdp->gd_p = 1;
|
||||
|
@ -1268,35 +1254,24 @@ _remque(element)
|
|||
|
||||
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;
|
||||
((struct trapframe *)regs)->tf_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;
|
||||
((struct trapframe *)regs)->tf_eflags |= PSL_T;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Copy the registers to user-space. This is tedious because
|
||||
* we essentially duplicate code for trapframe and syscframe. *sigh*
|
||||
* Copy the registers to user-space.
|
||||
*/
|
||||
|
||||
int
|
||||
|
@ -1325,50 +1300,24 @@ int
|
|||
fill_regs(struct proc *p, struct regs *regs) {
|
||||
int error;
|
||||
struct trapframe *tp;
|
||||
struct syscframe *sp;
|
||||
struct pcb *pcb;
|
||||
void *ptr = (char*)p->p_addr +
|
||||
((char*) p->p_regs - (char*) kstack);
|
||||
|
||||
pcb = &p->p_addr->u_pcb;
|
||||
if (pcb->pcb_flags & FM_TRAP) {
|
||||
tp = ptr;
|
||||
regs->r_es = tp->tf_es;
|
||||
regs->r_ds = tp->tf_ds;
|
||||
regs->r_edi = tp->tf_edi;
|
||||
regs->r_esi = tp->tf_esi;
|
||||
regs->r_ebp = tp->tf_ebp;
|
||||
regs->r_ebx = tp->tf_ebx;
|
||||
regs->r_edx = tp->tf_edx;
|
||||
regs->r_ecx = tp->tf_ecx;
|
||||
regs->r_eax = tp->tf_eax;
|
||||
regs->r_eip = tp->tf_eip;
|
||||
regs->r_cs = tp->tf_cs;
|
||||
regs->r_eflags = tp->tf_eflags;
|
||||
regs->r_esp = tp->tf_esp;
|
||||
regs->r_ss = tp->tf_ss;
|
||||
} else {
|
||||
sp = ptr;
|
||||
/*
|
||||
* No sf_es or sf_ds... dunno why.
|
||||
*/
|
||||
/*
|
||||
* regs.r_es = sp->sf_es;
|
||||
* regs.r_ds = sp->sf_ds;
|
||||
*/
|
||||
regs->r_edi = sp->sf_edi;
|
||||
regs->r_esi = sp->sf_esi;
|
||||
regs->r_ebp = sp->sf_ebp;
|
||||
regs->r_ebx = sp->sf_ebx;
|
||||
regs->r_edx = sp->sf_edx;
|
||||
regs->r_ecx = sp->sf_ecx;
|
||||
regs->r_eax = sp->sf_eax;
|
||||
regs->r_eip = sp->sf_eip;
|
||||
regs->r_cs = sp->sf_cs;
|
||||
regs->r_eflags = sp->sf_eflags;
|
||||
regs->r_esp = sp->sf_esp;
|
||||
regs->r_ss = sp->sf_ss;
|
||||
}
|
||||
tp = ptr;
|
||||
regs->r_es = tp->tf_es;
|
||||
regs->r_ds = tp->tf_ds;
|
||||
regs->r_edi = tp->tf_edi;
|
||||
regs->r_esi = tp->tf_esi;
|
||||
regs->r_ebp = tp->tf_ebp;
|
||||
regs->r_ebx = tp->tf_ebx;
|
||||
regs->r_edx = tp->tf_edx;
|
||||
regs->r_ecx = tp->tf_ecx;
|
||||
regs->r_eax = tp->tf_eax;
|
||||
regs->r_eip = tp->tf_eip;
|
||||
regs->r_cs = tp->tf_cs;
|
||||
regs->r_eflags = tp->tf_eflags;
|
||||
regs->r_esp = tp->tf_esp;
|
||||
regs->r_ss = tp->tf_ss;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1376,122 +1325,27 @@ int
|
|||
set_regs (struct proc *p, struct regs *regs) {
|
||||
int error;
|
||||
struct trapframe *tp;
|
||||
struct syscframe *sp;
|
||||
struct pcb *pcb;
|
||||
void *ptr = (char*)p->p_addr +
|
||||
((char*) p->p_regs - (char*) kstack);
|
||||
|
||||
pcb = &p->p_addr->u_pcb;
|
||||
if (pcb->pcb_flags & FM_TRAP) {
|
||||
tp = ptr;
|
||||
tp->tf_es = regs->r_es;
|
||||
tp->tf_ds = regs->r_ds;
|
||||
tp->tf_edi = regs->r_edi;
|
||||
tp->tf_esi = regs->r_esi;
|
||||
tp->tf_ebp = regs->r_ebp;
|
||||
tp->tf_ebx = regs->r_ebx;
|
||||
tp->tf_edx = regs->r_edx;
|
||||
tp->tf_ecx = regs->r_ecx;
|
||||
tp->tf_eax = regs->r_eax;
|
||||
tp->tf_eip = regs->r_eip;
|
||||
tp->tf_cs = regs->r_cs;
|
||||
tp->tf_eflags = regs->r_eflags;
|
||||
tp->tf_esp = regs->r_esp;
|
||||
tp->tf_ss = regs->r_ss;
|
||||
} else {
|
||||
sp = ptr;
|
||||
/*
|
||||
* No sf_es or sf_ds members, dunno why...
|
||||
*/
|
||||
/*
|
||||
* sp->sf_es = regs.r_es;
|
||||
* sp->sf_ds = regs.r_ds;
|
||||
*/
|
||||
sp->sf_edi = regs->r_edi;
|
||||
sp->sf_esi = regs->r_esi;
|
||||
sp->sf_ebp = regs->r_ebp;
|
||||
sp->sf_ebx = regs->r_ebx;
|
||||
sp->sf_edx = regs->r_edx;
|
||||
sp->sf_ecx = regs->r_ecx;
|
||||
sp->sf_eax = regs->r_eax;
|
||||
sp->sf_eip = regs->r_eip;
|
||||
sp->sf_cs = regs->r_cs;
|
||||
sp->sf_eflags = regs->r_eflags;
|
||||
sp->sf_esp = regs->r_esp;
|
||||
sp->sf_ss = regs->r_ss;
|
||||
}
|
||||
tp = ptr;
|
||||
tp->tf_es = regs->r_es;
|
||||
tp->tf_ds = regs->r_ds;
|
||||
tp->tf_edi = regs->r_edi;
|
||||
tp->tf_esi = regs->r_esi;
|
||||
tp->tf_ebp = regs->r_ebp;
|
||||
tp->tf_ebx = regs->r_ebx;
|
||||
tp->tf_edx = regs->r_edx;
|
||||
tp->tf_ecx = regs->r_ecx;
|
||||
tp->tf_eax = regs->r_eax;
|
||||
tp->tf_eip = regs->r_eip;
|
||||
tp->tf_cs = regs->r_cs;
|
||||
tp->tf_eflags = regs->r_eflags;
|
||||
tp->tf_esp = regs->r_esp;
|
||||
tp->tf_ss = regs->r_ss;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef SLOW_OLD_COPYSTRS
|
||||
vmunaccess() {}
|
||||
|
||||
#if 0 /* assembler versions now in locore.s */
|
||||
/*
|
||||
* Below written in C to allow access to debugging code
|
||||
*/
|
||||
copyinstr(fromaddr, toaddr, maxlength, lencopied) u_int *lencopied, maxlength;
|
||||
void *toaddr, *fromaddr; {
|
||||
int c,tally;
|
||||
|
||||
tally = 0;
|
||||
while (maxlength--) {
|
||||
c = fubyte(fromaddr++);
|
||||
if (c == -1) {
|
||||
if(lencopied) *lencopied = tally;
|
||||
return(EFAULT);
|
||||
}
|
||||
tally++;
|
||||
*(char *)toaddr++ = (char) c;
|
||||
if (c == 0){
|
||||
if(lencopied) *lencopied = (u_int)tally;
|
||||
return(0);
|
||||
}
|
||||
}
|
||||
if(lencopied) *lencopied = (u_int)tally;
|
||||
return(ENAMETOOLONG);
|
||||
}
|
||||
|
||||
copyoutstr(fromaddr, toaddr, maxlength, lencopied) u_int *lencopied, maxlength;
|
||||
void *fromaddr, *toaddr; {
|
||||
int c;
|
||||
int tally;
|
||||
|
||||
tally = 0;
|
||||
while (maxlength--) {
|
||||
c = subyte(toaddr++, *(char *)fromaddr);
|
||||
if (c == -1) return(EFAULT);
|
||||
tally++;
|
||||
if (*(char *)fromaddr++ == 0){
|
||||
if(lencopied) *lencopied = tally;
|
||||
return(0);
|
||||
}
|
||||
}
|
||||
if(lencopied) *lencopied = tally;
|
||||
return(ENAMETOOLONG);
|
||||
}
|
||||
|
||||
#endif /* SLOW_OLD_COPYSTRS */
|
||||
|
||||
copystr(fromaddr, toaddr, maxlength, lencopied) u_int *lencopied, maxlength;
|
||||
void *fromaddr, *toaddr; {
|
||||
u_int tally;
|
||||
|
||||
tally = 0;
|
||||
while (maxlength--) {
|
||||
*(u_char *)toaddr = *(u_char *)fromaddr++;
|
||||
tally++;
|
||||
if (*(u_char *)toaddr++ == 0) {
|
||||
if(lencopied) *lencopied = tally;
|
||||
return(0);
|
||||
}
|
||||
}
|
||||
if(lencopied) *lencopied = tally;
|
||||
return(ENAMETOOLONG);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#include "ddb.h"
|
||||
#if NDDB <= 0
|
||||
void
|
||||
|
|
|
@ -38,7 +38,7 @@
|
|||
*
|
||||
* from: Utah $Hdr: mem.c 1.13 89/10/08$
|
||||
* from: @(#)mem.c 7.2 (Berkeley) 5/9/91
|
||||
* $Id: mem.c,v 1.5 1993/11/25 01:30:59 wollman Exp $
|
||||
* $Id: mem.c,v 1.6 1993/12/19 00:50:06 wollman Exp $
|
||||
*/
|
||||
|
||||
/*
|
||||
|
@ -70,12 +70,12 @@ mmclose(dev, uio, flags)
|
|||
struct uio *uio;
|
||||
int flags;
|
||||
{
|
||||
struct syscframe *fp;
|
||||
struct trapframe *fp;
|
||||
|
||||
switch (minor(dev)) {
|
||||
case 14:
|
||||
fp = (struct syscframe *)curproc->p_regs;
|
||||
fp->sf_eflags &= ~PSL_IOPL;
|
||||
fp = (struct trapframe *)curproc->p_regs;
|
||||
fp->tf_eflags &= ~PSL_IOPL;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
@ -89,12 +89,12 @@ mmopen(dev, uio, flags)
|
|||
struct uio *uio;
|
||||
int flags;
|
||||
{
|
||||
struct syscframe *fp;
|
||||
struct trapframe *fp;
|
||||
|
||||
switch (minor(dev)) {
|
||||
case 14:
|
||||
fp = (struct syscframe *)curproc->p_regs;
|
||||
fp->sf_eflags |= PSL_IOPL;
|
||||
fp = (struct trapframe *)curproc->p_regs;
|
||||
fp->tf_eflags |= PSL_IOPL;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
|
|
@ -34,7 +34,7 @@
|
|||
* SUCH DAMAGE.
|
||||
*
|
||||
* from: @(#)trap.c 7.4 (Berkeley) 5/13/91
|
||||
* $Id: trap.c,v 1.11 1993/12/12 12:22:57 davidg Exp $
|
||||
* $Id: trap.c,v 1.12 1993/12/19 00:50:09 wollman Exp $
|
||||
*/
|
||||
|
||||
/*
|
||||
|
@ -179,7 +179,6 @@ if(curpcb == 0 || curproc == 0) goto we_re_toast;
|
|||
if (ISPL(frame.tf_cs) == SEL_UPL) {
|
||||
type |= T_USER;
|
||||
p->p_regs = (int *)&frame;
|
||||
curpcb->pcb_flags |= FM_TRAP; /* used by sendsig */
|
||||
}
|
||||
|
||||
ucode=0;
|
||||
|
@ -487,7 +486,6 @@ if(curpcb == 0 || curproc == 0) goto we_re_toast;
|
|||
}
|
||||
}
|
||||
curpri = p->p_pri;
|
||||
curpcb->pcb_flags &= ~FM_TRAP; /* used by sendsig */
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -575,7 +573,7 @@ int trapwrite(addr)
|
|||
/*ARGSUSED*/
|
||||
void
|
||||
syscall(frame)
|
||||
volatile struct syscframe frame;
|
||||
volatile struct trapframe frame;
|
||||
{
|
||||
register int *locr0 = ((int *)&frame);
|
||||
register caddr_t params;
|
||||
|
@ -591,29 +589,30 @@ syscall(frame)
|
|||
r0 = 0; r0 = r0; r1 = 0; r1 = r1;
|
||||
#endif
|
||||
syst = p->p_stime;
|
||||
if (ISPL(frame.sf_cs) != SEL_UPL)
|
||||
if (ISPL(frame.tf_cs) != SEL_UPL)
|
||||
panic("syscall");
|
||||
|
||||
code = frame.sf_eax;
|
||||
curpcb->pcb_flags &= ~FM_TRAP; /* used by sendsig */
|
||||
code = frame.tf_eax;
|
||||
p->p_regs = (int *)&frame;
|
||||
params = (caddr_t)frame.sf_esp + sizeof (int) ;
|
||||
params = (caddr_t)frame.tf_esp + sizeof (int) ;
|
||||
|
||||
/*
|
||||
* Reconstruct pc, assuming lcall $X,y is 7 bytes, as it is always.
|
||||
*/
|
||||
opc = frame.sf_eip - 7;
|
||||
callp = (code >= nsysent) ? &sysent[63] : &sysent[code];
|
||||
if (callp == sysent) {
|
||||
i = fuword(params);
|
||||
opc = frame.tf_eip - 7;
|
||||
if (code == 0) {
|
||||
code = fuword(params);
|
||||
params += sizeof (int);
|
||||
callp = (code >= nsysent) ? &sysent[63] : &sysent[code];
|
||||
}
|
||||
if (code < 0 || code >= nsysent)
|
||||
callp = &sysent[0];
|
||||
else
|
||||
callp = &sysent[code];
|
||||
|
||||
if ((i = callp->sy_narg * sizeof (int)) &&
|
||||
(error = copyin(params, (caddr_t)args, (u_int)i))) {
|
||||
frame.sf_eax = error;
|
||||
frame.sf_eflags |= PSL_C; /* carry bit */
|
||||
frame.tf_eax = error;
|
||||
frame.tf_eflags |= PSL_C; /* carry bit */
|
||||
#ifdef KTRACE
|
||||
if (KTRPOINT(p, KTR_SYSCALL))
|
||||
ktrsyscall(p->p_tracep, code, callp->sy_narg, args);
|
||||
|
@ -625,20 +624,20 @@ syscall(frame)
|
|||
ktrsyscall(p->p_tracep, code, callp->sy_narg, args);
|
||||
#endif
|
||||
rval[0] = 0;
|
||||
rval[1] = frame.sf_edx;
|
||||
rval[1] = frame.tf_edx;
|
||||
/*pg("%d. s %d\n", p->p_pid, code);*/
|
||||
error = (*callp->sy_call)(p, args, rval);
|
||||
if (error == ERESTART)
|
||||
frame.sf_eip = opc;
|
||||
frame.tf_eip = opc;
|
||||
else if (error != EJUSTRETURN) {
|
||||
if (error) {
|
||||
/*pg("error %d", error);*/
|
||||
frame.sf_eax = error;
|
||||
frame.sf_eflags |= PSL_C; /* carry bit */
|
||||
frame.tf_eax = error;
|
||||
frame.tf_eflags |= PSL_C; /* carry bit */
|
||||
} else {
|
||||
frame.sf_eax = rval[0];
|
||||
frame.sf_edx = rval[1];
|
||||
frame.sf_eflags &= ~PSL_C; /* carry bit */
|
||||
frame.tf_eax = rval[0];
|
||||
frame.tf_edx = rval[1];
|
||||
frame.tf_eflags &= ~PSL_C; /* carry bit */
|
||||
}
|
||||
}
|
||||
/* else if (error == EJUSTRETURN) */
|
||||
|
@ -679,10 +678,10 @@ syscall(frame)
|
|||
if (ticks) {
|
||||
#ifdef PROFTIMER
|
||||
extern int profscale;
|
||||
addupc(frame.sf_eip, &p->p_stats->p_prof,
|
||||
addupc(frame.tf_eip, &p->p_stats->p_prof,
|
||||
ticks * profscale);
|
||||
#else
|
||||
addupc(frame.sf_eip, &p->p_stats->p_prof, ticks);
|
||||
addupc(frame.tf_eip, &p->p_stats->p_prof, ticks);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
@ -693,13 +692,13 @@ syscall(frame)
|
|||
#endif
|
||||
#ifdef DIAGNOSTICx
|
||||
{ extern int _udatasel, _ucodesel;
|
||||
if (frame.sf_ss != _udatasel)
|
||||
printf("ss %x call %d\n", frame.sf_ss, code);
|
||||
if ((frame.sf_cs&0xffff) != _ucodesel)
|
||||
printf("cs %x call %d\n", frame.sf_cs, code);
|
||||
if (frame.sf_eip > VM_MAXUSER_ADDRESS) {
|
||||
printf("eip %x call %d\n", frame.sf_eip, code);
|
||||
frame.sf_eip = 0;
|
||||
if (frame.tf_ss != _udatasel)
|
||||
printf("ss %x call %d\n", frame.tf_ss, code);
|
||||
if ((frame.tf_cs&0xffff) != _ucodesel)
|
||||
printf("cs %x call %d\n", frame.tf_cs, code);
|
||||
if (frame.tf_eip > VM_MAXUSER_ADDRESS) {
|
||||
printf("eip %x call %d\n", frame.tf_eip, code);
|
||||
frame.tf_eip = 0;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -34,7 +34,7 @@
|
|||
* SUCH DAMAGE.
|
||||
*
|
||||
* from: @(#)frame.h 5.2 (Berkeley) 1/18/91
|
||||
* $Id: frame.h,v 1.5 1993/12/03 05:10:00 alm Exp $
|
||||
* $Id: frame.h,v 1.6 1993/12/19 00:50:15 wollman Exp $
|
||||
*/
|
||||
|
||||
#ifndef _MACHINE_FRAME_H_
|
||||
|
@ -113,28 +113,5 @@ struct sigframe {
|
|||
int sf_edx;
|
||||
int sf_ecx;
|
||||
struct sigcontext sf_sc;
|
||||
} ;
|
||||
|
||||
/*
|
||||
* Call Gate/System Call Stack Frame
|
||||
*/
|
||||
|
||||
struct syscframe {
|
||||
int sf_edi;
|
||||
int sf_esi;
|
||||
int sf_ebp;
|
||||
int :32; /* redundant save of isp */
|
||||
int sf_ebx;
|
||||
int sf_edx;
|
||||
int sf_ecx;
|
||||
int sf_eax;
|
||||
int sf_eflags;
|
||||
/* below portion defined in 386 hardware */
|
||||
/* int sf_args[N];*/ /* if call gate copy args enabled!*/
|
||||
int sf_eip;
|
||||
int sf_cs;
|
||||
/* below only when transitting rings (e.g. user to kernel) */
|
||||
int sf_esp;
|
||||
int sf_ss;
|
||||
};
|
||||
#endif /* _MACHINE_FRAME_H_ */
|
||||
|
|
|
@ -34,7 +34,7 @@
|
|||
* SUCH DAMAGE.
|
||||
*
|
||||
* from: @(#)pcb.h 5.10 (Berkeley) 5/12/91
|
||||
* $Id: pcb.h,v 1.2 1993/10/08 20:51:00 rgrimes Exp $
|
||||
* $Id: pcb.h,v 1.3 1993/11/07 17:42:59 wollman Exp $
|
||||
*/
|
||||
|
||||
#ifndef _I386_PCB_H_
|
||||
|
@ -72,7 +72,6 @@ struct pcb {
|
|||
#define FP_NEEDSRESTORE 0x04 /* ... that needs restore on next DNA fault */
|
||||
#endif
|
||||
#define FP_USESEMC 0x08 /* process uses EMC memory-mapped mode */
|
||||
#define FM_TRAP 0x10 /* process entered kernel on a trap frame */
|
||||
#define FP_SOFTFP 0x20 /* process using software fltng pnt emulator */
|
||||
short pcb_iml; /* interrupt mask level */
|
||||
caddr_t pcb_onfault; /* copyin/out fault recovery */
|
||||
|
|
|
@ -34,7 +34,7 @@
|
|||
* SUCH DAMAGE.
|
||||
*
|
||||
* from: @(#)reg.h 5.5 (Berkeley) 1/18/91
|
||||
* $Id: reg.h,v 1.4 1993/11/16 09:54:57 davidg Exp $
|
||||
* $Id: reg.h,v 1.5 1993/12/03 05:10:08 alm Exp $
|
||||
*/
|
||||
|
||||
#ifndef _MACHINE_REG_H_
|
||||
|
@ -68,28 +68,6 @@
|
|||
#define tESP (15)
|
||||
#define tSS (16)
|
||||
|
||||
/* During a system call, registers are at these offsets instead of above. */
|
||||
|
||||
#define sEDI (0)
|
||||
#define sESI (1)
|
||||
#define sEBP (2)
|
||||
|
||||
#define sEBX (4)
|
||||
#define sEDX (5)
|
||||
#define sECX (6)
|
||||
#define sEAX (7)
|
||||
#define sEFLAGS (8)
|
||||
#define sEIP (9)
|
||||
#define sCS (10)
|
||||
#define sESP (11)
|
||||
#define sSS (12)
|
||||
|
||||
#define PC sEIP
|
||||
#define SP sESP
|
||||
#define PS sEFLAGS
|
||||
#define R0 sEDX
|
||||
#define R1 sECX
|
||||
|
||||
/*
|
||||
* Registers accessible to ptrace(2) syscall for debugger
|
||||
* The machine-dependent code for PT_{SET,GET}REGS needs to
|
||||
|
|
|
@ -32,7 +32,7 @@
|
|||
* SUCH DAMAGE.
|
||||
*
|
||||
* from: @(#)npx.c 7.2 (Berkeley) 5/12/91
|
||||
* $Id: npx.c,v 1.4 1993/11/03 00:29:19 paul Exp $
|
||||
* $Id: npx.c,v 1.5 1993/11/03 23:32:35 paul Exp $
|
||||
*/
|
||||
|
||||
#include "npx.h"
|
||||
|
@ -439,7 +439,6 @@ npxintr(frame)
|
|||
* just before it is used).
|
||||
*/
|
||||
curproc->p_regs = (int *)&frame.if_es;
|
||||
curpcb->pcb_flags |= FM_TRAP; /* used by sendsig */
|
||||
#ifdef notyet
|
||||
/*
|
||||
* Encode the appropriate code for detailed information on
|
||||
|
@ -450,7 +449,6 @@ npxintr(frame)
|
|||
code = 0; /* XXX */
|
||||
#endif
|
||||
trapsignal(curproc, SIGFPE, code);
|
||||
curpcb->pcb_flags &= ~FM_TRAP;
|
||||
} else {
|
||||
/*
|
||||
* Nested interrupt. These losers occur when:
|
||||
|
|
|
@ -35,7 +35,7 @@
|
|||
*
|
||||
* from: @(#)pccons.c 5.11 (Berkeley) 5/21/91
|
||||
* from: @(#)syscons.c 1.1 931021
|
||||
* $Id: syscons.c,v 1.22 1993/12/21 02:49:13 rich Exp $
|
||||
* $Id: syscons.c,v 1.23 1993/12/21 03:27:26 rich Exp $
|
||||
*
|
||||
* Heavily modified by Søren Schmidt (sos@login.dkuug.dk) to provide:
|
||||
*
|
||||
|
@ -526,14 +526,8 @@ pcparam(struct tty *tp, struct termios *t)
|
|||
return(0);
|
||||
}
|
||||
|
||||
|
||||
#if defined(NetBSD)
|
||||
#define frametype struct trapframe
|
||||
#define eflags tf_eflags
|
||||
#else
|
||||
#define frametype struct syscframe
|
||||
#define eflags sf_eflags
|
||||
#endif
|
||||
|
||||
int
|
||||
pcioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
* any improvements or extensions that they make and grant Carnegie the
|
||||
* rights to redistribute these changes.
|
||||
*
|
||||
* $Id: db_trace.c,v 1.2 1993/10/16 14:14:56 rgrimes Exp $
|
||||
* $Id: db_trace.c,v 1.3 1993/12/19 00:50:01 wollman Exp $
|
||||
*/
|
||||
|
||||
#include "param.h"
|
||||
|
@ -73,8 +73,10 @@ struct i386_frame {
|
|||
|
||||
#define TRAP 1
|
||||
#define INTERRUPT 2
|
||||
#define SYSCALL 3
|
||||
|
||||
db_addr_t db_trap_symbol_value = 0;
|
||||
db_addr_t db_syscall_symbol_value = 0;
|
||||
db_addr_t db_kdintr_symbol_value = 0;
|
||||
boolean_t db_trace_symbols_found = FALSE;
|
||||
|
||||
|
@ -86,6 +88,8 @@ db_find_trace_symbols()
|
|||
db_trap_symbol_value = (db_addr_t) value;
|
||||
if (db_value_of_name("_kdintr", &value))
|
||||
db_kdintr_symbol_value = (db_addr_t) value;
|
||||
if (db_value_of_name("_syscall", &value))
|
||||
db_syscall_symbol_value = (db_addr_t) value;
|
||||
db_trace_symbols_found = TRUE;
|
||||
}
|
||||
|
||||
|
@ -135,26 +139,43 @@ db_nextframe(fp, ip, argp, is_trap)
|
|||
{
|
||||
struct i386_saved_state *saved_regs;
|
||||
|
||||
if (is_trap == 0) {
|
||||
switch (is_trap) {
|
||||
case 0:
|
||||
*ip = (db_addr_t)
|
||||
db_get_value((int) &(*fp)->f_retaddr, 4, FALSE);
|
||||
*fp = (struct i386_frame *)
|
||||
db_get_value((int) &(*fp)->f_frame, 4, FALSE);
|
||||
} else {
|
||||
break;
|
||||
case TRAP:
|
||||
default:
|
||||
/*
|
||||
* We know that trap() has 1 argument and we know that
|
||||
* it is an (int *).
|
||||
*/
|
||||
#if 0
|
||||
saved_regs = (struct i386_saved_state *)
|
||||
db_get_value((int)argp, 4, FALSE);
|
||||
#endif
|
||||
saved_regs = (struct i386_saved_state *)argp;
|
||||
db_printf("--- trap (number %d) ---\n",
|
||||
saved_regs->tf_trapno & 0xffff);
|
||||
db_printsym(saved_regs->tf_eip, DB_STGY_XTRN);
|
||||
db_printf(":\n");
|
||||
*fp = (struct i386_frame *)saved_regs->tf_ebp;
|
||||
*ip = (db_addr_t)saved_regs->tf_eip;
|
||||
}
|
||||
break;
|
||||
|
||||
case SYSCALL: {
|
||||
struct trapframe *saved_regs = (struct trapframe *)argp;
|
||||
|
||||
db_printf("--- syscall (number %d) ---\n", saved_regs->tf_eax);
|
||||
db_printsym(saved_regs->tf_eip, DB_STGY_XTRN);
|
||||
db_printf(":\n");
|
||||
*fp = (struct i386_frame *)saved_regs->tf_ebp;
|
||||
*ip = (db_addr_t)saved_regs->tf_eip;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -171,8 +192,10 @@ db_stack_trace_cmd(addr, have_addr, count, modif)
|
|||
boolean_t kernel_only = TRUE;
|
||||
boolean_t trace_thread = FALSE;
|
||||
|
||||
#if 0
|
||||
if (!db_trace_symbols_found)
|
||||
db_find_trace_symbols();
|
||||
#endif
|
||||
|
||||
{
|
||||
register char *cp = modif;
|
||||
|
@ -203,38 +226,84 @@ db_stack_trace_cmd(addr, have_addr, count, modif)
|
|||
|
||||
lastframe = 0;
|
||||
while (count-- && frame != 0) {
|
||||
register int narg;
|
||||
int narg;
|
||||
char * name;
|
||||
db_expr_t offset;
|
||||
db_sym_t sym;
|
||||
#define MAXNARG 16
|
||||
char *argnames[MAXNARG], **argnp = NULL;
|
||||
|
||||
if (INKERNEL((int)frame) && callpc == db_trap_symbol_value) {
|
||||
sym = db_search_symbol(callpc, DB_STGY_ANY, &offset);
|
||||
db_symbol_values(sym, &name, NULL);
|
||||
|
||||
if (lastframe == 0 && sym == NULL) {
|
||||
/* Symbol not found, peek at code */
|
||||
int instr = db_get_value(callpc, 4, FALSE);
|
||||
|
||||
offset = 1;
|
||||
if ((instr & 0x00ffffff) == 0x00e58955 ||
|
||||
/* enter: pushl %ebp, movl %esp, %ebp */
|
||||
(instr & 0x0000ffff) == 0x0000e589
|
||||
/* enter+1: movl %esp, %ebp */ ) {
|
||||
offset = 0;
|
||||
}
|
||||
}
|
||||
#define STRCMP(s1,s2) ((s1) && (s2) && strcmp((s1), (s2)) == 0)
|
||||
if (INKERNEL((int)frame) && STRCMP(name, "_trap")) {
|
||||
narg = 1;
|
||||
is_trap = TRAP;
|
||||
}
|
||||
else
|
||||
if (INKERNEL((int)frame) && callpc == db_kdintr_symbol_value) {
|
||||
if (INKERNEL((int)frame) && STRCMP(name, "_kdintr")) {
|
||||
is_trap = INTERRUPT;
|
||||
narg = 0;
|
||||
}
|
||||
else
|
||||
if (INKERNEL((int)frame) && STRCMP(name, "_syscall")) {
|
||||
is_trap = SYSCALL;
|
||||
narg = 0;
|
||||
}
|
||||
#undef STRCMP
|
||||
else {
|
||||
is_trap = 0;
|
||||
narg = db_numargs(frame);
|
||||
narg = MAXNARG;
|
||||
if (db_sym_numargs(sym, &narg, argnames)) {
|
||||
argnp = argnames;
|
||||
} else {
|
||||
narg = db_numargs(frame);
|
||||
}
|
||||
}
|
||||
|
||||
db_find_sym_and_offset(callpc, &name, &offset);
|
||||
db_printf("%s(", name);
|
||||
|
||||
argp = &frame->f_arg0;
|
||||
if (lastframe == 0 && offset == 0 && !have_addr) {
|
||||
/*
|
||||
* We have a breakpoint before the frame is set up
|
||||
* Use %esp instead
|
||||
*/
|
||||
argp = &((struct i386_frame *)(ddb_regs.tf_esp-4))->f_arg0;
|
||||
} else
|
||||
argp = &frame->f_arg0;
|
||||
|
||||
while (narg) {
|
||||
if (argnp)
|
||||
db_printf("%s=", *argnp++);
|
||||
db_printf("%x", db_get_value((int)argp, 4, FALSE));
|
||||
argp++;
|
||||
if (--narg != 0)
|
||||
db_printf(",");
|
||||
}
|
||||
db_printf(") at ");
|
||||
db_printsym(callpc, DB_STGY_XTRN);
|
||||
db_printsym(callpc, DB_STGY_PROC);
|
||||
db_printf("\n");
|
||||
|
||||
if (lastframe == 0 && offset == 0 && !have_addr) {
|
||||
/* Frame really belongs to next callpc */
|
||||
lastframe = (struct i386_frame *)(ddb_regs.tf_esp-4);
|
||||
callpc = (db_addr_t)db_get_value((int)&lastframe->f_retaddr, 4, FALSE);
|
||||
continue;
|
||||
}
|
||||
|
||||
lastframe = frame;
|
||||
db_nextframe(&frame, &callpc, &frame->f_arg0, is_trap);
|
||||
|
||||
|
@ -257,7 +326,7 @@ db_stack_trace_cmd(addr, have_addr, count, modif)
|
|||
else {
|
||||
/* in user */
|
||||
if (frame <= lastframe) {
|
||||
db_printf("Bad frame pointer: 0x%x\n", frame);
|
||||
db_printf("Bad user frame pointer: 0x%x\n", frame);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -30,7 +30,7 @@
|
|||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $Id$
|
||||
* $Id: exception.s,v 1.1 1993/11/13 02:24:57 davidg Exp $
|
||||
*/
|
||||
|
||||
#include "npx.h" /* NNPX */
|
||||
|
@ -181,7 +181,7 @@ calltrap:
|
|||
* Return through doreti to handle ASTs. Have to change trap frame
|
||||
* to interrupt frame.
|
||||
*/
|
||||
movl $T_ASTFLT,4+4+32(%esp) /* new trap type (err code not used) */
|
||||
movl $T_ASTFLT,TF_TRAPNO(%esp) /* new trap type (err code not used) */
|
||||
pushl _cpl
|
||||
pushl $0 /* dummy unit */
|
||||
jmp doreti
|
||||
|
@ -195,8 +195,8 @@ calltrap:
|
|||
bpttraps:
|
||||
pushal
|
||||
nop
|
||||
pushl %es
|
||||
pushl %ds
|
||||
pushl %es
|
||||
movl $KDSEL,%eax
|
||||
movl %ax,%ds
|
||||
movl %ax,%es
|
||||
|
@ -211,38 +211,24 @@ bpttraps:
|
|||
*/
|
||||
SUPERALIGN_TEXT
|
||||
IDTVEC(syscall)
|
||||
pushfl /* only for stupid carry bit and more stupid wait3 cc kludge */
|
||||
/* XXX - also for direction flag (bzero, etc. clear it) */
|
||||
pushal /* only need eax,ecx,edx - trap resaves others */
|
||||
pushfl /* Room for tf_err */
|
||||
pushfl /* Room for tf_trapno */
|
||||
pushal
|
||||
nop
|
||||
pushl %ds
|
||||
pushl %es
|
||||
movl $KDSEL,%eax /* switch to kernel segments */
|
||||
movl %ax,%ds
|
||||
movl %ax,%es
|
||||
movl TF_ERR(%esp),%eax /* copy eflags from tf_err to fs_eflags */
|
||||
movl %eax,TF_EFLAGS(%esp)
|
||||
movl $0,TF_ERR(%esp) /* zero tf_err */
|
||||
incl _cnt+V_SYSCALL
|
||||
call _syscall
|
||||
/*
|
||||
* Return through doreti to handle ASTs. Have to change syscall frame
|
||||
* to interrupt frame.
|
||||
*
|
||||
* XXX - we should have set up the frame earlier to avoid the
|
||||
* following popal/pushal (not much can be done to avoid shuffling
|
||||
* the flags). Consistent frames would simplify things all over.
|
||||
* Return through doreti to handle ASTs.
|
||||
*/
|
||||
movl 32+0(%esp),%eax /* old flags, shuffle to above cs:eip */
|
||||
movl 32+4(%esp),%ebx /* `int' frame should have been ef, eip, cs */
|
||||
movl 32+8(%esp),%ecx
|
||||
movl %ebx,32+0(%esp)
|
||||
movl %ecx,32+4(%esp)
|
||||
movl %eax,32+8(%esp)
|
||||
popal
|
||||
nop
|
||||
pushl $0 /* dummy error code */
|
||||
pushl $T_ASTFLT
|
||||
pushal
|
||||
nop
|
||||
movl __udatasel,%eax /* switch back to user segments */
|
||||
pushl %eax /* XXX - better to preserve originals? */
|
||||
pushl %eax
|
||||
movl $T_ASTFLT,TF_TRAPNO(%esp) /* new trap type (err code not used) */
|
||||
pushl _cpl
|
||||
pushl $0
|
||||
jmp doreti
|
||||
|
|
|
@ -35,7 +35,7 @@
|
|||
* SUCH DAMAGE.
|
||||
*
|
||||
* from: @(#)machdep.c 7.4 (Berkeley) 6/3/91
|
||||
* $Id: machdep.c,v 1.22 1993/12/19 00:50:03 wollman Exp $
|
||||
* $Id: machdep.c,v 1.23 1993/12/22 13:12:04 davidg Exp $
|
||||
*/
|
||||
|
||||
#include "npx.h"
|
||||
|
@ -418,7 +418,6 @@ sendsig(catcher, sig, mask, code)
|
|||
|
||||
regs = p->p_regs;
|
||||
oonstack = ps->ps_onstack;
|
||||
frmtrap = curpcb->pcb_flags & FM_TRAP;
|
||||
/*
|
||||
* Allocate and validate space for the signal handler
|
||||
* context. Note that if the stack is in P0 space, the
|
||||
|
@ -431,12 +430,8 @@ sendsig(catcher, sig, mask, code)
|
|||
- sizeof(struct sigframe));
|
||||
ps->ps_onstack = 1;
|
||||
} else {
|
||||
if (frmtrap)
|
||||
fp = (struct sigframe *)(regs[tESP]
|
||||
- sizeof(struct sigframe));
|
||||
else
|
||||
fp = (struct sigframe *)(regs[sESP]
|
||||
- sizeof(struct sigframe));
|
||||
fp = (struct sigframe *)(regs[tESP]
|
||||
- sizeof(struct sigframe));
|
||||
}
|
||||
|
||||
if (useracc((caddr_t)fp, sizeof (struct sigframe), B_WRITE) == 0) {
|
||||
|
@ -463,35 +458,21 @@ sendsig(catcher, sig, mask, code)
|
|||
fp->sf_handler = catcher;
|
||||
|
||||
/* save scratch registers */
|
||||
if(frmtrap) {
|
||||
fp->sf_eax = regs[tEAX];
|
||||
fp->sf_edx = regs[tEDX];
|
||||
fp->sf_ecx = regs[tECX];
|
||||
} else {
|
||||
fp->sf_eax = regs[sEAX];
|
||||
fp->sf_edx = regs[sEDX];
|
||||
fp->sf_ecx = regs[sECX];
|
||||
}
|
||||
fp->sf_eax = regs[tEAX];
|
||||
fp->sf_edx = regs[tEDX];
|
||||
fp->sf_ecx = regs[tECX];
|
||||
|
||||
/*
|
||||
* Build the signal context to be used by sigreturn.
|
||||
*/
|
||||
fp->sf_sc.sc_onstack = oonstack;
|
||||
fp->sf_sc.sc_mask = mask;
|
||||
if(frmtrap) {
|
||||
fp->sf_sc.sc_sp = regs[tESP];
|
||||
fp->sf_sc.sc_fp = regs[tEBP];
|
||||
fp->sf_sc.sc_pc = regs[tEIP];
|
||||
fp->sf_sc.sc_ps = regs[tEFLAGS];
|
||||
regs[tESP] = (int)fp;
|
||||
regs[tEIP] = (int)((struct pcb *)kstack)->pcb_sigc;
|
||||
} else {
|
||||
fp->sf_sc.sc_sp = regs[sESP];
|
||||
fp->sf_sc.sc_fp = regs[sEBP];
|
||||
fp->sf_sc.sc_pc = regs[sEIP];
|
||||
fp->sf_sc.sc_ps = regs[sEFLAGS];
|
||||
regs[sESP] = (int)fp;
|
||||
regs[sEIP] = (int)((struct pcb *)kstack)->pcb_sigc;
|
||||
}
|
||||
fp->sf_sc.sc_sp = regs[tESP];
|
||||
fp->sf_sc.sc_fp = regs[tEBP];
|
||||
fp->sf_sc.sc_pc = regs[tEIP];
|
||||
fp->sf_sc.sc_ps = regs[tEFLAGS];
|
||||
regs[tESP] = (int)fp;
|
||||
regs[tEIP] = (int)((struct pcb *)kstack)->pcb_sigc;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -519,7 +500,7 @@ sigreturn(p, uap, retval)
|
|||
register int *regs = p->p_regs;
|
||||
|
||||
/*
|
||||
* (XXX old comment) regs[sESP] points to the return address.
|
||||
* (XXX old comment) regs[tESP] points to the return address.
|
||||
* The user scp pointer is above that.
|
||||
* The return address is faked in the signal trampoline code
|
||||
* for consistency.
|
||||
|
@ -532,9 +513,9 @@ sigreturn(p, uap, retval)
|
|||
return(EINVAL);
|
||||
|
||||
/* restore scratch registers */
|
||||
regs[sEAX] = fp->sf_eax ;
|
||||
regs[sEDX] = fp->sf_edx ;
|
||||
regs[sECX] = fp->sf_ecx ;
|
||||
regs[tEAX] = fp->sf_eax ;
|
||||
regs[tEDX] = fp->sf_edx ;
|
||||
regs[tECX] = fp->sf_ecx ;
|
||||
|
||||
if (useracc((caddr_t)scp, sizeof (*scp), 0) == 0)
|
||||
return(EINVAL);
|
||||
|
@ -546,10 +527,10 @@ sigreturn(p, uap, retval)
|
|||
p->p_sigacts->ps_onstack = scp->sc_onstack & 01;
|
||||
p->p_sigmask = scp->sc_mask &~
|
||||
(sigmask(SIGKILL)|sigmask(SIGCONT)|sigmask(SIGSTOP));
|
||||
regs[sEBP] = scp->sc_fp;
|
||||
regs[sESP] = scp->sc_sp;
|
||||
regs[sEIP] = scp->sc_pc;
|
||||
regs[sEFLAGS] = scp->sc_ps;
|
||||
regs[tEBP] = scp->sc_fp;
|
||||
regs[tESP] = scp->sc_sp;
|
||||
regs[tEIP] = scp->sc_pc;
|
||||
regs[tEFLAGS] = scp->sc_ps;
|
||||
return(EJUSTRETURN);
|
||||
}
|
||||
|
||||
|
@ -762,13 +743,18 @@ initcpu()
|
|||
* Clear registers on exec
|
||||
*/
|
||||
void
|
||||
setregs(p, entry)
|
||||
setregs(p, entry, stack)
|
||||
struct proc *p;
|
||||
u_long entry;
|
||||
u_long stack;
|
||||
{
|
||||
|
||||
p->p_regs[sEBP] = 0; /* bottom of the fp chain */
|
||||
p->p_regs[sEIP] = entry;
|
||||
p->p_regs[tEBP] = 0; /* bottom of the fp chain */
|
||||
p->p_regs[tEIP] = entry;
|
||||
p->p_regs[tESP] = stack;
|
||||
p->p_regs[tSS] = _udatasel;
|
||||
p->p_regs[tDS] = _udatasel;
|
||||
p->p_regs[tES] = _udatasel;
|
||||
p->p_regs[tCS] = _ucodesel;
|
||||
|
||||
p->p_addr->u_pcb.pcb_flags = 0; /* no fp at all */
|
||||
load_cr0(rcr0() | CR0_TS); /* start emulating */
|
||||
|
@ -1153,7 +1139,7 @@ init386(first)
|
|||
x = (int) &IDTVEC(syscall);
|
||||
gdp->gd_looffset = x++;
|
||||
gdp->gd_selector = GSEL(GCODE_SEL,SEL_KPL);
|
||||
gdp->gd_stkcpy = 0;
|
||||
gdp->gd_stkcpy = 1; /* Leaves room for eflags like a trap */
|
||||
gdp->gd_type = SDT_SYS386CGT;
|
||||
gdp->gd_dpl = SEL_UPL;
|
||||
gdp->gd_p = 1;
|
||||
|
@ -1268,35 +1254,24 @@ _remque(element)
|
|||
|
||||
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;
|
||||
((struct trapframe *)regs)->tf_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;
|
||||
((struct trapframe *)regs)->tf_eflags |= PSL_T;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Copy the registers to user-space. This is tedious because
|
||||
* we essentially duplicate code for trapframe and syscframe. *sigh*
|
||||
* Copy the registers to user-space.
|
||||
*/
|
||||
|
||||
int
|
||||
|
@ -1325,50 +1300,24 @@ int
|
|||
fill_regs(struct proc *p, struct regs *regs) {
|
||||
int error;
|
||||
struct trapframe *tp;
|
||||
struct syscframe *sp;
|
||||
struct pcb *pcb;
|
||||
void *ptr = (char*)p->p_addr +
|
||||
((char*) p->p_regs - (char*) kstack);
|
||||
|
||||
pcb = &p->p_addr->u_pcb;
|
||||
if (pcb->pcb_flags & FM_TRAP) {
|
||||
tp = ptr;
|
||||
regs->r_es = tp->tf_es;
|
||||
regs->r_ds = tp->tf_ds;
|
||||
regs->r_edi = tp->tf_edi;
|
||||
regs->r_esi = tp->tf_esi;
|
||||
regs->r_ebp = tp->tf_ebp;
|
||||
regs->r_ebx = tp->tf_ebx;
|
||||
regs->r_edx = tp->tf_edx;
|
||||
regs->r_ecx = tp->tf_ecx;
|
||||
regs->r_eax = tp->tf_eax;
|
||||
regs->r_eip = tp->tf_eip;
|
||||
regs->r_cs = tp->tf_cs;
|
||||
regs->r_eflags = tp->tf_eflags;
|
||||
regs->r_esp = tp->tf_esp;
|
||||
regs->r_ss = tp->tf_ss;
|
||||
} else {
|
||||
sp = ptr;
|
||||
/*
|
||||
* No sf_es or sf_ds... dunno why.
|
||||
*/
|
||||
/*
|
||||
* regs.r_es = sp->sf_es;
|
||||
* regs.r_ds = sp->sf_ds;
|
||||
*/
|
||||
regs->r_edi = sp->sf_edi;
|
||||
regs->r_esi = sp->sf_esi;
|
||||
regs->r_ebp = sp->sf_ebp;
|
||||
regs->r_ebx = sp->sf_ebx;
|
||||
regs->r_edx = sp->sf_edx;
|
||||
regs->r_ecx = sp->sf_ecx;
|
||||
regs->r_eax = sp->sf_eax;
|
||||
regs->r_eip = sp->sf_eip;
|
||||
regs->r_cs = sp->sf_cs;
|
||||
regs->r_eflags = sp->sf_eflags;
|
||||
regs->r_esp = sp->sf_esp;
|
||||
regs->r_ss = sp->sf_ss;
|
||||
}
|
||||
tp = ptr;
|
||||
regs->r_es = tp->tf_es;
|
||||
regs->r_ds = tp->tf_ds;
|
||||
regs->r_edi = tp->tf_edi;
|
||||
regs->r_esi = tp->tf_esi;
|
||||
regs->r_ebp = tp->tf_ebp;
|
||||
regs->r_ebx = tp->tf_ebx;
|
||||
regs->r_edx = tp->tf_edx;
|
||||
regs->r_ecx = tp->tf_ecx;
|
||||
regs->r_eax = tp->tf_eax;
|
||||
regs->r_eip = tp->tf_eip;
|
||||
regs->r_cs = tp->tf_cs;
|
||||
regs->r_eflags = tp->tf_eflags;
|
||||
regs->r_esp = tp->tf_esp;
|
||||
regs->r_ss = tp->tf_ss;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1376,122 +1325,27 @@ int
|
|||
set_regs (struct proc *p, struct regs *regs) {
|
||||
int error;
|
||||
struct trapframe *tp;
|
||||
struct syscframe *sp;
|
||||
struct pcb *pcb;
|
||||
void *ptr = (char*)p->p_addr +
|
||||
((char*) p->p_regs - (char*) kstack);
|
||||
|
||||
pcb = &p->p_addr->u_pcb;
|
||||
if (pcb->pcb_flags & FM_TRAP) {
|
||||
tp = ptr;
|
||||
tp->tf_es = regs->r_es;
|
||||
tp->tf_ds = regs->r_ds;
|
||||
tp->tf_edi = regs->r_edi;
|
||||
tp->tf_esi = regs->r_esi;
|
||||
tp->tf_ebp = regs->r_ebp;
|
||||
tp->tf_ebx = regs->r_ebx;
|
||||
tp->tf_edx = regs->r_edx;
|
||||
tp->tf_ecx = regs->r_ecx;
|
||||
tp->tf_eax = regs->r_eax;
|
||||
tp->tf_eip = regs->r_eip;
|
||||
tp->tf_cs = regs->r_cs;
|
||||
tp->tf_eflags = regs->r_eflags;
|
||||
tp->tf_esp = regs->r_esp;
|
||||
tp->tf_ss = regs->r_ss;
|
||||
} else {
|
||||
sp = ptr;
|
||||
/*
|
||||
* No sf_es or sf_ds members, dunno why...
|
||||
*/
|
||||
/*
|
||||
* sp->sf_es = regs.r_es;
|
||||
* sp->sf_ds = regs.r_ds;
|
||||
*/
|
||||
sp->sf_edi = regs->r_edi;
|
||||
sp->sf_esi = regs->r_esi;
|
||||
sp->sf_ebp = regs->r_ebp;
|
||||
sp->sf_ebx = regs->r_ebx;
|
||||
sp->sf_edx = regs->r_edx;
|
||||
sp->sf_ecx = regs->r_ecx;
|
||||
sp->sf_eax = regs->r_eax;
|
||||
sp->sf_eip = regs->r_eip;
|
||||
sp->sf_cs = regs->r_cs;
|
||||
sp->sf_eflags = regs->r_eflags;
|
||||
sp->sf_esp = regs->r_esp;
|
||||
sp->sf_ss = regs->r_ss;
|
||||
}
|
||||
tp = ptr;
|
||||
tp->tf_es = regs->r_es;
|
||||
tp->tf_ds = regs->r_ds;
|
||||
tp->tf_edi = regs->r_edi;
|
||||
tp->tf_esi = regs->r_esi;
|
||||
tp->tf_ebp = regs->r_ebp;
|
||||
tp->tf_ebx = regs->r_ebx;
|
||||
tp->tf_edx = regs->r_edx;
|
||||
tp->tf_ecx = regs->r_ecx;
|
||||
tp->tf_eax = regs->r_eax;
|
||||
tp->tf_eip = regs->r_eip;
|
||||
tp->tf_cs = regs->r_cs;
|
||||
tp->tf_eflags = regs->r_eflags;
|
||||
tp->tf_esp = regs->r_esp;
|
||||
tp->tf_ss = regs->r_ss;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef SLOW_OLD_COPYSTRS
|
||||
vmunaccess() {}
|
||||
|
||||
#if 0 /* assembler versions now in locore.s */
|
||||
/*
|
||||
* Below written in C to allow access to debugging code
|
||||
*/
|
||||
copyinstr(fromaddr, toaddr, maxlength, lencopied) u_int *lencopied, maxlength;
|
||||
void *toaddr, *fromaddr; {
|
||||
int c,tally;
|
||||
|
||||
tally = 0;
|
||||
while (maxlength--) {
|
||||
c = fubyte(fromaddr++);
|
||||
if (c == -1) {
|
||||
if(lencopied) *lencopied = tally;
|
||||
return(EFAULT);
|
||||
}
|
||||
tally++;
|
||||
*(char *)toaddr++ = (char) c;
|
||||
if (c == 0){
|
||||
if(lencopied) *lencopied = (u_int)tally;
|
||||
return(0);
|
||||
}
|
||||
}
|
||||
if(lencopied) *lencopied = (u_int)tally;
|
||||
return(ENAMETOOLONG);
|
||||
}
|
||||
|
||||
copyoutstr(fromaddr, toaddr, maxlength, lencopied) u_int *lencopied, maxlength;
|
||||
void *fromaddr, *toaddr; {
|
||||
int c;
|
||||
int tally;
|
||||
|
||||
tally = 0;
|
||||
while (maxlength--) {
|
||||
c = subyte(toaddr++, *(char *)fromaddr);
|
||||
if (c == -1) return(EFAULT);
|
||||
tally++;
|
||||
if (*(char *)fromaddr++ == 0){
|
||||
if(lencopied) *lencopied = tally;
|
||||
return(0);
|
||||
}
|
||||
}
|
||||
if(lencopied) *lencopied = tally;
|
||||
return(ENAMETOOLONG);
|
||||
}
|
||||
|
||||
#endif /* SLOW_OLD_COPYSTRS */
|
||||
|
||||
copystr(fromaddr, toaddr, maxlength, lencopied) u_int *lencopied, maxlength;
|
||||
void *fromaddr, *toaddr; {
|
||||
u_int tally;
|
||||
|
||||
tally = 0;
|
||||
while (maxlength--) {
|
||||
*(u_char *)toaddr = *(u_char *)fromaddr++;
|
||||
tally++;
|
||||
if (*(u_char *)toaddr++ == 0) {
|
||||
if(lencopied) *lencopied = tally;
|
||||
return(0);
|
||||
}
|
||||
}
|
||||
if(lencopied) *lencopied = tally;
|
||||
return(ENAMETOOLONG);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#include "ddb.h"
|
||||
#if NDDB <= 0
|
||||
void
|
||||
|
|
|
@ -38,7 +38,7 @@
|
|||
*
|
||||
* from: Utah $Hdr: mem.c 1.13 89/10/08$
|
||||
* from: @(#)mem.c 7.2 (Berkeley) 5/9/91
|
||||
* $Id: mem.c,v 1.5 1993/11/25 01:30:59 wollman Exp $
|
||||
* $Id: mem.c,v 1.6 1993/12/19 00:50:06 wollman Exp $
|
||||
*/
|
||||
|
||||
/*
|
||||
|
@ -70,12 +70,12 @@ mmclose(dev, uio, flags)
|
|||
struct uio *uio;
|
||||
int flags;
|
||||
{
|
||||
struct syscframe *fp;
|
||||
struct trapframe *fp;
|
||||
|
||||
switch (minor(dev)) {
|
||||
case 14:
|
||||
fp = (struct syscframe *)curproc->p_regs;
|
||||
fp->sf_eflags &= ~PSL_IOPL;
|
||||
fp = (struct trapframe *)curproc->p_regs;
|
||||
fp->tf_eflags &= ~PSL_IOPL;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
@ -89,12 +89,12 @@ mmopen(dev, uio, flags)
|
|||
struct uio *uio;
|
||||
int flags;
|
||||
{
|
||||
struct syscframe *fp;
|
||||
struct trapframe *fp;
|
||||
|
||||
switch (minor(dev)) {
|
||||
case 14:
|
||||
fp = (struct syscframe *)curproc->p_regs;
|
||||
fp->sf_eflags |= PSL_IOPL;
|
||||
fp = (struct trapframe *)curproc->p_regs;
|
||||
fp->tf_eflags |= PSL_IOPL;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
|
|
@ -34,7 +34,7 @@
|
|||
* SUCH DAMAGE.
|
||||
*
|
||||
* from: @(#)trap.c 7.4 (Berkeley) 5/13/91
|
||||
* $Id: trap.c,v 1.11 1993/12/12 12:22:57 davidg Exp $
|
||||
* $Id: trap.c,v 1.12 1993/12/19 00:50:09 wollman Exp $
|
||||
*/
|
||||
|
||||
/*
|
||||
|
@ -179,7 +179,6 @@ if(curpcb == 0 || curproc == 0) goto we_re_toast;
|
|||
if (ISPL(frame.tf_cs) == SEL_UPL) {
|
||||
type |= T_USER;
|
||||
p->p_regs = (int *)&frame;
|
||||
curpcb->pcb_flags |= FM_TRAP; /* used by sendsig */
|
||||
}
|
||||
|
||||
ucode=0;
|
||||
|
@ -487,7 +486,6 @@ if(curpcb == 0 || curproc == 0) goto we_re_toast;
|
|||
}
|
||||
}
|
||||
curpri = p->p_pri;
|
||||
curpcb->pcb_flags &= ~FM_TRAP; /* used by sendsig */
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -575,7 +573,7 @@ int trapwrite(addr)
|
|||
/*ARGSUSED*/
|
||||
void
|
||||
syscall(frame)
|
||||
volatile struct syscframe frame;
|
||||
volatile struct trapframe frame;
|
||||
{
|
||||
register int *locr0 = ((int *)&frame);
|
||||
register caddr_t params;
|
||||
|
@ -591,29 +589,30 @@ syscall(frame)
|
|||
r0 = 0; r0 = r0; r1 = 0; r1 = r1;
|
||||
#endif
|
||||
syst = p->p_stime;
|
||||
if (ISPL(frame.sf_cs) != SEL_UPL)
|
||||
if (ISPL(frame.tf_cs) != SEL_UPL)
|
||||
panic("syscall");
|
||||
|
||||
code = frame.sf_eax;
|
||||
curpcb->pcb_flags &= ~FM_TRAP; /* used by sendsig */
|
||||
code = frame.tf_eax;
|
||||
p->p_regs = (int *)&frame;
|
||||
params = (caddr_t)frame.sf_esp + sizeof (int) ;
|
||||
params = (caddr_t)frame.tf_esp + sizeof (int) ;
|
||||
|
||||
/*
|
||||
* Reconstruct pc, assuming lcall $X,y is 7 bytes, as it is always.
|
||||
*/
|
||||
opc = frame.sf_eip - 7;
|
||||
callp = (code >= nsysent) ? &sysent[63] : &sysent[code];
|
||||
if (callp == sysent) {
|
||||
i = fuword(params);
|
||||
opc = frame.tf_eip - 7;
|
||||
if (code == 0) {
|
||||
code = fuword(params);
|
||||
params += sizeof (int);
|
||||
callp = (code >= nsysent) ? &sysent[63] : &sysent[code];
|
||||
}
|
||||
if (code < 0 || code >= nsysent)
|
||||
callp = &sysent[0];
|
||||
else
|
||||
callp = &sysent[code];
|
||||
|
||||
if ((i = callp->sy_narg * sizeof (int)) &&
|
||||
(error = copyin(params, (caddr_t)args, (u_int)i))) {
|
||||
frame.sf_eax = error;
|
||||
frame.sf_eflags |= PSL_C; /* carry bit */
|
||||
frame.tf_eax = error;
|
||||
frame.tf_eflags |= PSL_C; /* carry bit */
|
||||
#ifdef KTRACE
|
||||
if (KTRPOINT(p, KTR_SYSCALL))
|
||||
ktrsyscall(p->p_tracep, code, callp->sy_narg, args);
|
||||
|
@ -625,20 +624,20 @@ syscall(frame)
|
|||
ktrsyscall(p->p_tracep, code, callp->sy_narg, args);
|
||||
#endif
|
||||
rval[0] = 0;
|
||||
rval[1] = frame.sf_edx;
|
||||
rval[1] = frame.tf_edx;
|
||||
/*pg("%d. s %d\n", p->p_pid, code);*/
|
||||
error = (*callp->sy_call)(p, args, rval);
|
||||
if (error == ERESTART)
|
||||
frame.sf_eip = opc;
|
||||
frame.tf_eip = opc;
|
||||
else if (error != EJUSTRETURN) {
|
||||
if (error) {
|
||||
/*pg("error %d", error);*/
|
||||
frame.sf_eax = error;
|
||||
frame.sf_eflags |= PSL_C; /* carry bit */
|
||||
frame.tf_eax = error;
|
||||
frame.tf_eflags |= PSL_C; /* carry bit */
|
||||
} else {
|
||||
frame.sf_eax = rval[0];
|
||||
frame.sf_edx = rval[1];
|
||||
frame.sf_eflags &= ~PSL_C; /* carry bit */
|
||||
frame.tf_eax = rval[0];
|
||||
frame.tf_edx = rval[1];
|
||||
frame.tf_eflags &= ~PSL_C; /* carry bit */
|
||||
}
|
||||
}
|
||||
/* else if (error == EJUSTRETURN) */
|
||||
|
@ -679,10 +678,10 @@ syscall(frame)
|
|||
if (ticks) {
|
||||
#ifdef PROFTIMER
|
||||
extern int profscale;
|
||||
addupc(frame.sf_eip, &p->p_stats->p_prof,
|
||||
addupc(frame.tf_eip, &p->p_stats->p_prof,
|
||||
ticks * profscale);
|
||||
#else
|
||||
addupc(frame.sf_eip, &p->p_stats->p_prof, ticks);
|
||||
addupc(frame.tf_eip, &p->p_stats->p_prof, ticks);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
@ -693,13 +692,13 @@ syscall(frame)
|
|||
#endif
|
||||
#ifdef DIAGNOSTICx
|
||||
{ extern int _udatasel, _ucodesel;
|
||||
if (frame.sf_ss != _udatasel)
|
||||
printf("ss %x call %d\n", frame.sf_ss, code);
|
||||
if ((frame.sf_cs&0xffff) != _ucodesel)
|
||||
printf("cs %x call %d\n", frame.sf_cs, code);
|
||||
if (frame.sf_eip > VM_MAXUSER_ADDRESS) {
|
||||
printf("eip %x call %d\n", frame.sf_eip, code);
|
||||
frame.sf_eip = 0;
|
||||
if (frame.tf_ss != _udatasel)
|
||||
printf("ss %x call %d\n", frame.tf_ss, code);
|
||||
if ((frame.tf_cs&0xffff) != _ucodesel)
|
||||
printf("cs %x call %d\n", frame.tf_cs, code);
|
||||
if (frame.tf_eip > VM_MAXUSER_ADDRESS) {
|
||||
printf("eip %x call %d\n", frame.tf_eip, code);
|
||||
frame.tf_eip = 0;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -34,7 +34,7 @@
|
|||
* SUCH DAMAGE.
|
||||
*
|
||||
* from: @(#)frame.h 5.2 (Berkeley) 1/18/91
|
||||
* $Id: frame.h,v 1.5 1993/12/03 05:10:00 alm Exp $
|
||||
* $Id: frame.h,v 1.6 1993/12/19 00:50:15 wollman Exp $
|
||||
*/
|
||||
|
||||
#ifndef _MACHINE_FRAME_H_
|
||||
|
@ -113,28 +113,5 @@ struct sigframe {
|
|||
int sf_edx;
|
||||
int sf_ecx;
|
||||
struct sigcontext sf_sc;
|
||||
} ;
|
||||
|
||||
/*
|
||||
* Call Gate/System Call Stack Frame
|
||||
*/
|
||||
|
||||
struct syscframe {
|
||||
int sf_edi;
|
||||
int sf_esi;
|
||||
int sf_ebp;
|
||||
int :32; /* redundant save of isp */
|
||||
int sf_ebx;
|
||||
int sf_edx;
|
||||
int sf_ecx;
|
||||
int sf_eax;
|
||||
int sf_eflags;
|
||||
/* below portion defined in 386 hardware */
|
||||
/* int sf_args[N];*/ /* if call gate copy args enabled!*/
|
||||
int sf_eip;
|
||||
int sf_cs;
|
||||
/* below only when transitting rings (e.g. user to kernel) */
|
||||
int sf_esp;
|
||||
int sf_ss;
|
||||
};
|
||||
#endif /* _MACHINE_FRAME_H_ */
|
||||
|
|
|
@ -34,7 +34,7 @@
|
|||
* SUCH DAMAGE.
|
||||
*
|
||||
* from: @(#)pcb.h 5.10 (Berkeley) 5/12/91
|
||||
* $Id: pcb.h,v 1.2 1993/10/08 20:51:00 rgrimes Exp $
|
||||
* $Id: pcb.h,v 1.3 1993/11/07 17:42:59 wollman Exp $
|
||||
*/
|
||||
|
||||
#ifndef _I386_PCB_H_
|
||||
|
@ -72,7 +72,6 @@ struct pcb {
|
|||
#define FP_NEEDSRESTORE 0x04 /* ... that needs restore on next DNA fault */
|
||||
#endif
|
||||
#define FP_USESEMC 0x08 /* process uses EMC memory-mapped mode */
|
||||
#define FM_TRAP 0x10 /* process entered kernel on a trap frame */
|
||||
#define FP_SOFTFP 0x20 /* process using software fltng pnt emulator */
|
||||
short pcb_iml; /* interrupt mask level */
|
||||
caddr_t pcb_onfault; /* copyin/out fault recovery */
|
||||
|
|
|
@ -34,7 +34,7 @@
|
|||
* SUCH DAMAGE.
|
||||
*
|
||||
* from: @(#)reg.h 5.5 (Berkeley) 1/18/91
|
||||
* $Id: reg.h,v 1.4 1993/11/16 09:54:57 davidg Exp $
|
||||
* $Id: reg.h,v 1.5 1993/12/03 05:10:08 alm Exp $
|
||||
*/
|
||||
|
||||
#ifndef _MACHINE_REG_H_
|
||||
|
@ -68,28 +68,6 @@
|
|||
#define tESP (15)
|
||||
#define tSS (16)
|
||||
|
||||
/* During a system call, registers are at these offsets instead of above. */
|
||||
|
||||
#define sEDI (0)
|
||||
#define sESI (1)
|
||||
#define sEBP (2)
|
||||
|
||||
#define sEBX (4)
|
||||
#define sEDX (5)
|
||||
#define sECX (6)
|
||||
#define sEAX (7)
|
||||
#define sEFLAGS (8)
|
||||
#define sEIP (9)
|
||||
#define sCS (10)
|
||||
#define sESP (11)
|
||||
#define sSS (12)
|
||||
|
||||
#define PC sEIP
|
||||
#define SP sESP
|
||||
#define PS sEFLAGS
|
||||
#define R0 sEDX
|
||||
#define R1 sECX
|
||||
|
||||
/*
|
||||
* Registers accessible to ptrace(2) syscall for debugger
|
||||
* The machine-dependent code for PT_{SET,GET}REGS needs to
|
||||
|
|
|
@ -32,7 +32,7 @@
|
|||
* SUCH DAMAGE.
|
||||
*
|
||||
* from: @(#)npx.c 7.2 (Berkeley) 5/12/91
|
||||
* $Id: npx.c,v 1.4 1993/11/03 00:29:19 paul Exp $
|
||||
* $Id: npx.c,v 1.5 1993/11/03 23:32:35 paul Exp $
|
||||
*/
|
||||
|
||||
#include "npx.h"
|
||||
|
@ -439,7 +439,6 @@ npxintr(frame)
|
|||
* just before it is used).
|
||||
*/
|
||||
curproc->p_regs = (int *)&frame.if_es;
|
||||
curpcb->pcb_flags |= FM_TRAP; /* used by sendsig */
|
||||
#ifdef notyet
|
||||
/*
|
||||
* Encode the appropriate code for detailed information on
|
||||
|
@ -450,7 +449,6 @@ npxintr(frame)
|
|||
code = 0; /* XXX */
|
||||
#endif
|
||||
trapsignal(curproc, SIGFPE, code);
|
||||
curpcb->pcb_flags &= ~FM_TRAP;
|
||||
} else {
|
||||
/*
|
||||
* Nested interrupt. These losers occur when:
|
||||
|
|
|
@ -35,7 +35,7 @@
|
|||
*
|
||||
* from: @(#)pccons.c 5.11 (Berkeley) 5/21/91
|
||||
* from: @(#)syscons.c 1.1 931021
|
||||
* $Id: syscons.c,v 1.22 1993/12/21 02:49:13 rich Exp $
|
||||
* $Id: syscons.c,v 1.23 1993/12/21 03:27:26 rich Exp $
|
||||
*
|
||||
* Heavily modified by Søren Schmidt (sos@login.dkuug.dk) to provide:
|
||||
*
|
||||
|
@ -526,14 +526,8 @@ pcparam(struct tty *tp, struct termios *t)
|
|||
return(0);
|
||||
}
|
||||
|
||||
|
||||
#if defined(NetBSD)
|
||||
#define frametype struct trapframe
|
||||
#define eflags tf_eflags
|
||||
#else
|
||||
#define frametype struct syscframe
|
||||
#define eflags sf_eflags
|
||||
#endif
|
||||
|
||||
int
|
||||
pcioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
|
||||
|
|
|
@ -35,7 +35,7 @@
|
|||
*
|
||||
* from: @(#)pccons.c 5.11 (Berkeley) 5/21/91
|
||||
* from: @(#)syscons.c 1.1 931021
|
||||
* $Id: syscons.c,v 1.22 1993/12/21 02:49:13 rich Exp $
|
||||
* $Id: syscons.c,v 1.23 1993/12/21 03:27:26 rich Exp $
|
||||
*
|
||||
* Heavily modified by Søren Schmidt (sos@login.dkuug.dk) to provide:
|
||||
*
|
||||
|
@ -526,14 +526,8 @@ pcparam(struct tty *tp, struct termios *t)
|
|||
return(0);
|
||||
}
|
||||
|
||||
|
||||
#if defined(NetBSD)
|
||||
#define frametype struct trapframe
|
||||
#define eflags tf_eflags
|
||||
#else
|
||||
#define frametype struct syscframe
|
||||
#define eflags sf_eflags
|
||||
#endif
|
||||
|
||||
int
|
||||
pcioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
|
||||
|
|
|
@ -34,7 +34,7 @@
|
|||
* SUCH DAMAGE.
|
||||
*
|
||||
* from: @(#)trap.c 7.4 (Berkeley) 5/13/91
|
||||
* $Id: trap.c,v 1.11 1993/12/12 12:22:57 davidg Exp $
|
||||
* $Id: trap.c,v 1.12 1993/12/19 00:50:09 wollman Exp $
|
||||
*/
|
||||
|
||||
/*
|
||||
|
@ -179,7 +179,6 @@ if(curpcb == 0 || curproc == 0) goto we_re_toast;
|
|||
if (ISPL(frame.tf_cs) == SEL_UPL) {
|
||||
type |= T_USER;
|
||||
p->p_regs = (int *)&frame;
|
||||
curpcb->pcb_flags |= FM_TRAP; /* used by sendsig */
|
||||
}
|
||||
|
||||
ucode=0;
|
||||
|
@ -487,7 +486,6 @@ if(curpcb == 0 || curproc == 0) goto we_re_toast;
|
|||
}
|
||||
}
|
||||
curpri = p->p_pri;
|
||||
curpcb->pcb_flags &= ~FM_TRAP; /* used by sendsig */
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -575,7 +573,7 @@ int trapwrite(addr)
|
|||
/*ARGSUSED*/
|
||||
void
|
||||
syscall(frame)
|
||||
volatile struct syscframe frame;
|
||||
volatile struct trapframe frame;
|
||||
{
|
||||
register int *locr0 = ((int *)&frame);
|
||||
register caddr_t params;
|
||||
|
@ -591,29 +589,30 @@ syscall(frame)
|
|||
r0 = 0; r0 = r0; r1 = 0; r1 = r1;
|
||||
#endif
|
||||
syst = p->p_stime;
|
||||
if (ISPL(frame.sf_cs) != SEL_UPL)
|
||||
if (ISPL(frame.tf_cs) != SEL_UPL)
|
||||
panic("syscall");
|
||||
|
||||
code = frame.sf_eax;
|
||||
curpcb->pcb_flags &= ~FM_TRAP; /* used by sendsig */
|
||||
code = frame.tf_eax;
|
||||
p->p_regs = (int *)&frame;
|
||||
params = (caddr_t)frame.sf_esp + sizeof (int) ;
|
||||
params = (caddr_t)frame.tf_esp + sizeof (int) ;
|
||||
|
||||
/*
|
||||
* Reconstruct pc, assuming lcall $X,y is 7 bytes, as it is always.
|
||||
*/
|
||||
opc = frame.sf_eip - 7;
|
||||
callp = (code >= nsysent) ? &sysent[63] : &sysent[code];
|
||||
if (callp == sysent) {
|
||||
i = fuword(params);
|
||||
opc = frame.tf_eip - 7;
|
||||
if (code == 0) {
|
||||
code = fuword(params);
|
||||
params += sizeof (int);
|
||||
callp = (code >= nsysent) ? &sysent[63] : &sysent[code];
|
||||
}
|
||||
if (code < 0 || code >= nsysent)
|
||||
callp = &sysent[0];
|
||||
else
|
||||
callp = &sysent[code];
|
||||
|
||||
if ((i = callp->sy_narg * sizeof (int)) &&
|
||||
(error = copyin(params, (caddr_t)args, (u_int)i))) {
|
||||
frame.sf_eax = error;
|
||||
frame.sf_eflags |= PSL_C; /* carry bit */
|
||||
frame.tf_eax = error;
|
||||
frame.tf_eflags |= PSL_C; /* carry bit */
|
||||
#ifdef KTRACE
|
||||
if (KTRPOINT(p, KTR_SYSCALL))
|
||||
ktrsyscall(p->p_tracep, code, callp->sy_narg, args);
|
||||
|
@ -625,20 +624,20 @@ syscall(frame)
|
|||
ktrsyscall(p->p_tracep, code, callp->sy_narg, args);
|
||||
#endif
|
||||
rval[0] = 0;
|
||||
rval[1] = frame.sf_edx;
|
||||
rval[1] = frame.tf_edx;
|
||||
/*pg("%d. s %d\n", p->p_pid, code);*/
|
||||
error = (*callp->sy_call)(p, args, rval);
|
||||
if (error == ERESTART)
|
||||
frame.sf_eip = opc;
|
||||
frame.tf_eip = opc;
|
||||
else if (error != EJUSTRETURN) {
|
||||
if (error) {
|
||||
/*pg("error %d", error);*/
|
||||
frame.sf_eax = error;
|
||||
frame.sf_eflags |= PSL_C; /* carry bit */
|
||||
frame.tf_eax = error;
|
||||
frame.tf_eflags |= PSL_C; /* carry bit */
|
||||
} else {
|
||||
frame.sf_eax = rval[0];
|
||||
frame.sf_edx = rval[1];
|
||||
frame.sf_eflags &= ~PSL_C; /* carry bit */
|
||||
frame.tf_eax = rval[0];
|
||||
frame.tf_edx = rval[1];
|
||||
frame.tf_eflags &= ~PSL_C; /* carry bit */
|
||||
}
|
||||
}
|
||||
/* else if (error == EJUSTRETURN) */
|
||||
|
@ -679,10 +678,10 @@ syscall(frame)
|
|||
if (ticks) {
|
||||
#ifdef PROFTIMER
|
||||
extern int profscale;
|
||||
addupc(frame.sf_eip, &p->p_stats->p_prof,
|
||||
addupc(frame.tf_eip, &p->p_stats->p_prof,
|
||||
ticks * profscale);
|
||||
#else
|
||||
addupc(frame.sf_eip, &p->p_stats->p_prof, ticks);
|
||||
addupc(frame.tf_eip, &p->p_stats->p_prof, ticks);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
@ -693,13 +692,13 @@ syscall(frame)
|
|||
#endif
|
||||
#ifdef DIAGNOSTICx
|
||||
{ extern int _udatasel, _ucodesel;
|
||||
if (frame.sf_ss != _udatasel)
|
||||
printf("ss %x call %d\n", frame.sf_ss, code);
|
||||
if ((frame.sf_cs&0xffff) != _ucodesel)
|
||||
printf("cs %x call %d\n", frame.sf_cs, code);
|
||||
if (frame.sf_eip > VM_MAXUSER_ADDRESS) {
|
||||
printf("eip %x call %d\n", frame.sf_eip, code);
|
||||
frame.sf_eip = 0;
|
||||
if (frame.tf_ss != _udatasel)
|
||||
printf("ss %x call %d\n", frame.tf_ss, code);
|
||||
if ((frame.tf_cs&0xffff) != _ucodesel)
|
||||
printf("cs %x call %d\n", frame.tf_cs, code);
|
||||
if (frame.tf_eip > VM_MAXUSER_ADDRESS) {
|
||||
printf("eip %x call %d\n", frame.tf_eip, code);
|
||||
frame.tf_eip = 0;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
|
Loading…
Reference in a new issue