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:
parent
31f9a29bee
commit
f14cf38dbe
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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));
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user