Set si_addr to dar for MMU and alignment faults.
Reviewed by: kib Sponsored by: DARPA Differential Revision: https://reviews.freebsd.org/D25776
This commit is contained in:
parent
d11a7b16cd
commit
7d351d60fa
@ -207,7 +207,7 @@ trap(struct trapframe *frame)
|
||||
int sig, type, user;
|
||||
u_int ucode;
|
||||
ksiginfo_t ksi;
|
||||
register_t fscr;
|
||||
register_t addr, fscr;
|
||||
|
||||
VM_CNT_INC(v_trap);
|
||||
|
||||
@ -224,6 +224,7 @@ trap(struct trapframe *frame)
|
||||
type = ucode = frame->exc;
|
||||
sig = 0;
|
||||
user = frame->srr1 & PSL_PR;
|
||||
addr = 0;
|
||||
|
||||
CTR3(KTR_TRAP, "trap: %s type=%s (%s)", td->td_name,
|
||||
trapname(type), user ? "user" : "kernel");
|
||||
@ -248,6 +249,7 @@ trap(struct trapframe *frame)
|
||||
if (user) {
|
||||
td->td_pticks = 0;
|
||||
td->td_frame = frame;
|
||||
addr = frame->srr0;
|
||||
if (td->td_cowgen != p->p_cowgen)
|
||||
thread_cow_update(td);
|
||||
|
||||
@ -261,18 +263,22 @@ trap(struct trapframe *frame)
|
||||
break;
|
||||
|
||||
#if defined(__powerpc64__) && defined(AIM)
|
||||
case EXC_ISE:
|
||||
case EXC_DSE:
|
||||
addr = frame->dar;
|
||||
/* FALLTHROUGH */
|
||||
case EXC_ISE:
|
||||
/* DSE/ISE are automatically fatal with radix pmap. */
|
||||
if (radix_mmu ||
|
||||
handle_user_slb_spill(&p->p_vmspace->vm_pmap,
|
||||
(type == EXC_ISE) ? frame->srr0 : frame->dar) != 0){
|
||||
addr) != 0){
|
||||
sig = SIGSEGV;
|
||||
ucode = SEGV_MAPERR;
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
case EXC_DSI:
|
||||
addr = frame->dar;
|
||||
/* FALLTHROUGH */
|
||||
case EXC_ISI:
|
||||
if (trap_pfault(frame, true, &sig, &ucode))
|
||||
sig = 0;
|
||||
@ -368,6 +374,7 @@ trap(struct trapframe *frame)
|
||||
if (fix_unaligned(td, frame) != 0) {
|
||||
sig = SIGBUS;
|
||||
ucode = BUS_ADRALN;
|
||||
addr = frame->dar;
|
||||
}
|
||||
else
|
||||
frame->srr0 += 4;
|
||||
@ -481,7 +488,7 @@ trap(struct trapframe *frame)
|
||||
ksiginfo_init_trap(&ksi);
|
||||
ksi.ksi_signo = sig;
|
||||
ksi.ksi_code = (int) ucode; /* XXX, not POSIX */
|
||||
ksi.ksi_addr = (void *)frame->srr0;
|
||||
ksi.ksi_addr = (void *)addr;
|
||||
ksi.ksi_trapno = type;
|
||||
trapsignal(td, &ksi);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user