Date: Mon, 27 Jul 2020 16:34:32 +0000 (UTC) From: John Baldwin <jhb@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r363618 - head/sys/powerpc/powerpc Message-ID: <202007271634.06RGYWKM057358@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: jhb Date: Mon Jul 27 16:34:31 2020 New Revision: 363618 URL: https://svnweb.freebsd.org/changeset/base/363618 Log: Set si_addr to dar for MMU and alignment faults. Reviewed by: kib Sponsored by: DARPA Differential Revision: https://reviews.freebsd.org/D25776 Modified: head/sys/powerpc/powerpc/trap.c Modified: head/sys/powerpc/powerpc/trap.c ============================================================================== --- head/sys/powerpc/powerpc/trap.c Mon Jul 27 16:32:21 2020 (r363617) +++ head/sys/powerpc/powerpc/trap.c Mon Jul 27 16:34:31 2020 (r363618) @@ -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); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202007271634.06RGYWKM057358>