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.
This commit is contained in:
Nathan Whitehorn 2015-03-04 21:06:57 +00:00
parent 31f9a29bee
commit f14cf38dbe
7 changed files with 19 additions and 35 deletions

View File

@ -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;
}

View File

@ -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);

View File

@ -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

View File

@ -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;

View File

@ -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);

View File

@ -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);

View File

@ -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));