PERFORCE change 132425 for review
Warner Losh
imp at FreeBSD.org
Thu Jan 3 13:08:17 PST 2008
http://perforce.freebsd.org/chv.cgi?CH=132425
Change 132425 by imp at imp_paco-paco on 2008/01/03 21:08:04
Trap compiles now. not 100% sure of the changes, so we should have
many eyes look here...
Affected files ...
.. //depot/projects/mips2-jnpr/src/sys/mips/mips/trap.c#5 edit
Differences ...
==== //depot/projects/mips2-jnpr/src/sys/mips/mips/trap.c#5 (text+ko) ====
@@ -311,24 +311,23 @@
unsigned ucode = 0;
struct thread *td = curthread;
struct proc *p = curproc;
- u_quad_t sticks;
vm_prot_t ftype;
pt_entry_t *pte;
unsigned int entry;
pmap_t pmap;
int quad_syscall = 0;
int access_type;
+ ksiginfo_t ksi;
char *msg = NULL;
+ register_t addr = 0;
trapdebug_enter(trapframe, 0);
type = (trapframe->cause & CR_EXC_CODE) >> CR_EXC_CODE_SHIFT;
if (USERMODE(trapframe->sr)) {
type |= T_USER;
- sticks = td->td_sticks;
usermode = 1;
} else {
- sticks = 0;
usermode = 0;
}
@@ -581,6 +580,7 @@
ucode = ftype;
i = ((rv == KERN_PROTECTION_FAILURE) ? SIGBUS : SIGSEGV);
+ addr = trapframe->pc;
msg = "BAD_PAGE_FAULT";
log_bad_page_fault(msg, trapframe, type);
@@ -626,6 +626,7 @@
case T_BUS_ERR_LD_ST+T_USER: /* BERR asserted to cpu */
ucode = 0; /* XXX should be VM_PROT_something */
i = SIGBUS;
+ addr = trapframe->pc;
if (!msg)
msg = "BUS_ERR";
log_bad_page_fault(msg, trapframe, type);
@@ -706,7 +707,7 @@
else
callp = &p->p_sysent->sv_table[code];
- nargs = callp->sy_narg & SYF_ARGMASK;
+ nargs = callp->sy_narg;
if (nargs > nsaved) {
i = copyin((caddr_t)(locr0->sp +
@@ -736,14 +737,6 @@
else
trp[-1].code = code;
#endif
-
- /*
- * Try to run the syscall without Giant if the syscall
- * is MP safe.
- */
- if ((callp->sy_narg & SYF_MPSAFE) == 0)
- mtx_lock(&Giant);
-
STOPEVENT(p, S_SCE, nargs);
PTRACESTOP_SC(p, td, S_PT_SCE);
@@ -799,18 +792,12 @@
}
/*
- * Release Giant if we previously set it.
- */
- if ((callp->sy_narg & SYF_MPSAFE) == 0)
- mtx_unlock(&Giant);
-
- /*
* The sync'ing of I & D caches for SYS_ptrace() is
* done by procfs_domem() through procfs_rwmem() instead
* of being done here under a special check for SYS_ptrace().
*/
done:
- userret(td, trapframe, sticks);
+ userret(td, trapframe);
#ifdef KTRACE
if (KTRPOINT(p, KTR_SYSRET))
@@ -824,7 +811,7 @@
STOPEVENT(p, S_SCX, code);
PTRACESTOP_SC(p, td, S_PT_SCX);
-
+#ifdef GONE_IN_7
WITNESS_WARN(WARN_PANIC, NULL, "System call %s returning",
(code >= 0 && code < SYS_MAXSYSCALL) ?
syscallnames[code] : "???");
@@ -833,7 +820,7 @@
if (curthread->td_flags & (TDF_ASTPENDING|TDF_NEEDRESCHED)) {
ast(trapframe);
}
-
+#endif
return (trapframe->pc);
}
@@ -861,6 +848,7 @@
#endif
if (td->td_md.md_ss_addr != va || instr != BREAK_SSTEP) {
i = SIGTRAP;
+ addr = trapframe->pc;
break;
}
@@ -870,7 +858,7 @@
* call to ptrace_clear_single_step() in issignal()
* when SIGTRAP is processed.
*/
-
+ addr = trapframe->pc;
i = SIGTRAP;
break;
}
@@ -885,6 +873,7 @@
va += sizeof(int);
printf("watch exception @ 0x%x\n", va);
i = SIGTRAP;
+ addr = va;
break;
}
@@ -906,12 +895,14 @@
} else {
locr0->pc += sizeof(int);
}
+ addr = va;
i = SIGEMT; /* Stuff it with something for now */
break;
}
case T_RES_INST+T_USER:
i = SIGILL;
+ addr = trapframe->pc;
break;
case T_COP_UNUSABLE+T_USER:
@@ -926,6 +917,7 @@
i = SIGILL; /* only FPU instructions allowed */
break;
}
+ addr = trapframe->pc;
MipsSwitchFPState(PCPU_GET(fpcurthread), td->td_frame);
PCPU_SET(fpcurthread, td);
td->td_frame->sr |= SR_COP_1_BIT;
@@ -947,6 +939,7 @@
case T_OVFLOW+T_USER:
i = SIGFPE;
+ addr = trapframe->pc;
break;
case T_ADDR_ERR_LD: /* misaligned access */
@@ -1023,18 +1016,23 @@
td->td_frame->pc = trapframe->pc;
td->td_frame->cause = trapframe->cause;
td->td_frame->badvaddr = trapframe->badvaddr;
- trapsignal(td, i, ucode);
+ ksiginfo_init_trap(&ksi);
+ ksi.ksi_signo = i;
+ ksi.ksi_code = ucode;
+ ksi.ksi_addr = (void *)addr;
+ ksi.ksi_trapno = type;
+ trapsignal(td, &ksi);
out:
/*
* Note: we should only get here if returning to user mode.
*/
- userret(td, trapframe, sticks);
- mtx_assert(&sched_lock, MA_NOTOWNED);
+ userret(td, trapframe);
mtx_assert(&Giant, MA_NOTOWNED);
+#ifdef GONE_IN_7
if (curthread->td_flags & (TDF_ASTPENDING | TDF_NEEDRESCHED)) {
ast(trapframe);
}
-
+#endif
return (trapframe->pc);
}
@@ -1214,7 +1212,6 @@
/* forward */
char *fn_name(unsigned addr);
-void stacktrace_subr(struct trapframe *, int (*)(const char*, ...);
/*
* Print a stack backtrace.
@@ -1226,7 +1223,7 @@
}
void
-stacktrace_subr(struct trapframe *regs, int (*printfn)(const char*, ...)))
+stacktrace_subr(struct trapframe *regs, int (*printfn)(const char*, ...))
{
InstFmt i;
unsigned a0, a1, a2, a3, pc, sp, fp, ra, va, subr;
More information about the p4-projects
mailing list