From f14cf38dbea3a2ab05425623ad75322683447155 Mon Sep 17 00:00:00 2001 From: Nathan Whitehorn Date: Wed, 4 Mar 2015 21:06:57 +0000 Subject: [PATCH] The AIM DAR (data access fault address register) and Book-E DEAR registers have the same meaning and occupy the same memory address in the trapframe courtesy of union. Avoid some pointless #ifdef by spelling them both 'DAR' in the trapframe. --- sys/powerpc/aim/trap.c | 14 ++++++-------- sys/powerpc/booke/interrupt.c | 2 +- sys/powerpc/booke/trap.c | 4 ++-- sys/powerpc/include/frame.h | 5 ++--- sys/powerpc/powerpc/db_trace.c | 11 ++++------- sys/powerpc/powerpc/exec_machdep.c | 14 ++------------ sys/powerpc/powerpc/genassym.c | 4 ++-- 7 files changed, 19 insertions(+), 35 deletions(-) diff --git a/sys/powerpc/aim/trap.c b/sys/powerpc/aim/trap.c index b0afffcbdcc6..e0e2fe630159 100644 --- a/sys/powerpc/aim/trap.c +++ b/sys/powerpc/aim/trap.c @@ -201,8 +201,7 @@ trap(struct trapframe *frame) case EXC_ISE: case EXC_DSE: if (handle_user_slb_spill(&p->p_vmspace->vm_pmap, - (type == EXC_ISE) ? frame->srr0 : - frame->cpu.aim.dar) != 0) { + (type == EXC_ISE) ? frame->srr0 : frame->dar) != 0){ sig = SIGSEGV; ucode = SEGV_MAPERR; } @@ -326,7 +325,7 @@ trap(struct trapframe *frame) #endif #ifdef __powerpc64__ case EXC_DSE: - if ((frame->cpu.aim.dar & SEGMENT_MASK) == USER_ADDR) { + if ((frame->dar & SEGMENT_MASK) == USER_ADDR) { __asm __volatile ("slbmte %0, %1" :: "r"(td->td_pcb->pcb_cpu.aim.usr_vsid), "r"(USER_SLB_SLBE)); @@ -387,8 +386,7 @@ printtrap(u_int vector, struct trapframe *frame, int isfatal, int user) switch (vector) { case EXC_DSE: case EXC_DSI: - printf(" virtual address = 0x%" PRIxPTR "\n", - frame->cpu.aim.dar); + printf(" virtual address = 0x%" PRIxPTR "\n", frame->dar); printf(" dsisr = 0x%" PRIxPTR "\n", frame->cpu.aim.dsisr); break; @@ -642,7 +640,7 @@ trap_pfault(struct trapframe *frame, int user) if (frame->srr1 & SRR1_ISI_PFAULT) ftype |= VM_PROT_READ; } else { - eva = frame->cpu.aim.dar; + eva = frame->dar; if (frame->cpu.aim.dsisr & DSISR_STORE) ftype = VM_PROT_WRITE; else @@ -736,12 +734,12 @@ fix_unaligned(struct thread *td, struct trapframe *frame) save_fpu(td); if (indicator == EXC_ALI_LFD) { - if (copyin((void *)frame->cpu.aim.dar, fpr, + if (copyin((void *)frame->dar, fpr, sizeof(double)) != 0) return -1; enable_fpu(td); } else { - if (copyout(fpr, (void *)frame->cpu.aim.dar, + if (copyout(fpr, (void *)frame->dar, sizeof(double)) != 0) return -1; } diff --git a/sys/powerpc/booke/interrupt.c b/sys/powerpc/booke/interrupt.c index e268537a6039..b5f61401cf61 100644 --- a/sys/powerpc/booke/interrupt.c +++ b/sys/powerpc/booke/interrupt.c @@ -79,7 +79,7 @@ dump_frame(struct trapframe *frame) printf(" exc = 0x%x\n", frame->exc); printf(" srr0 = 0x%08x\n", frame->srr0); printf(" srr1 = 0x%08x\n", frame->srr1); - printf(" dear = 0x%08x\n", frame->cpu.booke.dear); + printf(" dear = 0x%08x\n", frame->dar); printf(" esr = 0x%08x\n", frame->cpu.booke.esr); printf(" lr = 0x%08x\n", frame->lr); printf(" cr = 0x%08x\n", frame->cr); diff --git a/sys/powerpc/booke/trap.c b/sys/powerpc/booke/trap.c index eacd3e789f10..d1899efd8e7c 100644 --- a/sys/powerpc/booke/trap.c +++ b/sys/powerpc/booke/trap.c @@ -263,7 +263,7 @@ printtrap(u_int vector, struct trapframe *frame, int isfatal, int user) switch (vector) { case EXC_DTMISS: case EXC_DSI: - va = frame->cpu.booke.dear; + va = frame->dar; break; case EXC_ITMISS: @@ -400,7 +400,7 @@ trap_pfault(struct trapframe *frame, int user) ftype = VM_PROT_READ | VM_PROT_EXECUTE; } else { - eva = frame->cpu.booke.dear; + eva = frame->dar; if (frame->cpu.booke.esr & ESR_ST) ftype = VM_PROT_WRITE; else diff --git a/sys/powerpc/include/frame.h b/sys/powerpc/include/frame.h index d2100a104a2b..e6fb103c7af5 100644 --- a/sys/powerpc/include/frame.h +++ b/sys/powerpc/include/frame.h @@ -56,14 +56,13 @@ struct trapframe { register_t srr0; register_t srr1; register_t exc; + register_t dar; /* DAR/DEAR filled in on DSI traps */ union { struct { - /* dar & dsisr are only filled on a DSI trap */ - register_t dar; + /* dsisr only filled on a DSI trap */ register_t dsisr; } aim; struct { - register_t dear; register_t esr; register_t dbcr0; } booke; diff --git a/sys/powerpc/powerpc/db_trace.c b/sys/powerpc/powerpc/db_trace.c index aff18b1a7558..51e3ab441ee9 100644 --- a/sys/powerpc/powerpc/db_trace.c +++ b/sys/powerpc/powerpc/db_trace.c @@ -98,12 +98,11 @@ struct db_variable db_regs[] = { { "ctr", DB_OFFSET(ctr), db_frame }, { "cr", DB_OFFSET(cr), db_frame }, { "xer", DB_OFFSET(xer), db_frame }, + { "dar", DB_OFFSET(dar), db_frame }, #ifdef AIM - { "dar", DB_OFFSET(cpu.aim.dar), db_frame }, { "dsisr", DB_OFFSET(cpu.aim.dsisr), db_frame }, #endif #if defined(BOOKE) - { "dear", DB_OFFSET(cpu.booke.dear), db_frame }, { "esr", DB_OFFSET(cpu.booke.esr), db_frame }, #endif }; @@ -218,18 +217,16 @@ db_backtrace(struct thread *td, db_addr_t fp, int count) /* XXX take advantage of the union. */ db_printf("DSI %s trap @ %#zx by ", (tf->cpu.aim.dsisr & DSISR_STORE) ? "write" - : "read", tf->cpu.aim.dar); + : "read", tf->dar); goto print_trap; case EXC_ALI: /* XXX take advantage of the union. */ db_printf("ALI trap @ %#zx (xSR %#x) ", - tf->cpu.aim.dar, - (uint32_t)tf->cpu.aim.dsisr); + tf->dar, (uint32_t)tf->cpu.aim.dsisr); goto print_trap; #ifdef __powerpc64__ case EXC_DSE: - db_printf("DSE trap @ %#zx by ", - tf->cpu.aim.dar); + db_printf("DSE trap @ %#zx by ", tf->dar); goto print_trap; case EXC_ISE: db_printf("ISE trap @ %#zx by ", tf->srr0); diff --git a/sys/powerpc/powerpc/exec_machdep.c b/sys/powerpc/powerpc/exec_machdep.c index 9da6ec658ff2..4b8288bc07aa 100644 --- a/sys/powerpc/powerpc/exec_machdep.c +++ b/sys/powerpc/powerpc/exec_machdep.c @@ -152,13 +152,8 @@ sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask) * Fill siginfo structure. */ ksi->ksi_info.si_signo = ksi->ksi_signo; - #ifdef AIM ksi->ksi_info.si_addr = (void *)((tf->exc == EXC_DSI) ? - tf->cpu.aim.dar : tf->srr0); - #else - ksi->ksi_info.si_addr = (void *)((tf->exc == EXC_DSI) ? - tf->cpu.booke.dear : tf->srr0); - #endif + tf->dar : tf->srr0); #ifdef COMPAT_FREEBSD32 if (SV_PROC_FLAG(p, SV_ILP32)) { @@ -284,13 +279,8 @@ sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask) } else { /* Old FreeBSD-style arguments. */ tf->fixreg[FIRSTARG+1] = code; - #ifdef AIM tf->fixreg[FIRSTARG+3] = (tf->exc == EXC_DSI) ? - tf->cpu.aim.dar : tf->srr0; - #else - tf->fixreg[FIRSTARG+3] = (tf->exc == EXC_DSI) ? - tf->cpu.booke.dear : tf->srr0; - #endif + tf->dar : tf->srr0; } mtx_unlock(&psp->ps_mtx); PROC_UNLOCK(p); diff --git a/sys/powerpc/powerpc/genassym.c b/sys/powerpc/powerpc/genassym.c index f3b50922490e..1faa0d69f299 100644 --- a/sys/powerpc/powerpc/genassym.c +++ b/sys/powerpc/powerpc/genassym.c @@ -171,9 +171,9 @@ ASSYM(FRAME_XER, offsetof(struct trapframe, xer)); ASSYM(FRAME_SRR0, offsetof(struct trapframe, srr0)); ASSYM(FRAME_SRR1, offsetof(struct trapframe, srr1)); ASSYM(FRAME_EXC, offsetof(struct trapframe, exc)); -ASSYM(FRAME_AIM_DAR, offsetof(struct trapframe, cpu.aim.dar)); +ASSYM(FRAME_AIM_DAR, offsetof(struct trapframe, dar)); ASSYM(FRAME_AIM_DSISR, offsetof(struct trapframe, cpu.aim.dsisr)); -ASSYM(FRAME_BOOKE_DEAR, offsetof(struct trapframe, cpu.booke.dear)); +ASSYM(FRAME_BOOKE_DEAR, offsetof(struct trapframe, dar)); ASSYM(FRAME_BOOKE_ESR, offsetof(struct trapframe, cpu.booke.esr)); ASSYM(FRAME_BOOKE_DBCR0, offsetof(struct trapframe, cpu.booke.dbcr0));