PERFORCE change 135935 for review
Marcel Moolenaar
marcel at FreeBSD.org
Fri Feb 22 02:37:22 UTC 2008
http://perforce.freebsd.org/chv.cgi?CH=135935
Change 135935 by marcel at marcel_jnpr on 2008/02/22 02:36:54
Unify <machine/frame.h>
In this case the difference between Book E and AIM is
just the name of the DAR/DEAR and DSISR/ESR registers.
One can argue that this can be eliminated by using
structure fields that match neither, but imply either.
Euh... right...
However, it's valuable to keep the fields the same as
the register names, so in this case a simple union is
enough to eliminate the #ifdefs.
Affected files ...
.. //depot/projects/e500/sys/powerpc/aim/machdep.c#8 edit
.. //depot/projects/e500/sys/powerpc/aim/trap.c#7 edit
.. //depot/projects/e500/sys/powerpc/aim/trap_subr.S#4 edit
.. //depot/projects/e500/sys/powerpc/booke/interrupt.c#4 edit
.. //depot/projects/e500/sys/powerpc/booke/machdep.c#10 edit
.. //depot/projects/e500/sys/powerpc/booke/trap.c#4 edit
.. //depot/projects/e500/sys/powerpc/booke/trap_subr.S#4 edit
.. //depot/projects/e500/sys/powerpc/include/frame.h#3 edit
.. //depot/projects/e500/sys/powerpc/powerpc/db_trace.c#4 edit
.. //depot/projects/e500/sys/powerpc/powerpc/genassym.c#4 edit
Differences ...
==== //depot/projects/e500/sys/powerpc/aim/machdep.c#8 (text+ko) ====
@@ -519,13 +519,13 @@
*/
sf.sf_si = ksi->ksi_info;
sf.sf_si.si_signo = sig;
- sf.sf_si.si_addr = (void *) ((tf->exc == EXC_DSI) ?
- tf->dar : tf->srr0);
+ sf.sf_si.si_addr = (void *)((tf->exc == EXC_DSI) ?
+ tf->cpu.aim.dar : tf->srr0);
} else {
/* Old FreeBSD-style arguments. */
tf->fixreg[FIRSTARG+1] = code;
tf->fixreg[FIRSTARG+3] = (tf->exc == EXC_DSI) ?
- tf->dar : tf->srr0;
+ tf->cpu.aim.dar : tf->srr0;
}
mtx_unlock(&psp->ps_mtx);
PROC_UNLOCK(p);
==== //depot/projects/e500/sys/powerpc/aim/trap.c#7 (text+ko) ====
@@ -292,7 +292,7 @@
trapname(vector));
switch (vector) {
case EXC_DSI:
- printf(" virtual address = 0x%x\n", frame->dar);
+ printf(" virtual address = 0x%x\n", frame->cpu.aim.dar);
break;
case EXC_ISI:
printf(" virtual address = 0x%x\n", frame->srr0);
@@ -510,8 +510,8 @@
eva = frame->srr0;
ftype = VM_PROT_READ | VM_PROT_EXECUTE;
} else {
- eva = frame->dar;
- if (frame->dsisr & DSISR_STORE)
+ eva = frame->cpu.aim.dar;
+ if (frame->cpu.aim.dsisr & DSISR_STORE)
ftype = VM_PROT_WRITE;
else
ftype = VM_PROT_READ;
@@ -643,12 +643,12 @@
int indicator, reg;
double *fpr;
- indicator = EXC_ALI_OPCODE_INDICATOR(frame->dsisr);
+ indicator = EXC_ALI_OPCODE_INDICATOR(frame->cpu.aim.dsisr);
switch (indicator) {
case EXC_ALI_LFD:
case EXC_ALI_STFD:
- reg = EXC_ALI_RST(frame->dsisr);
+ reg = EXC_ALI_RST(frame->cpu.aim.dsisr);
fpr = &td->td_pcb->pcb_fpu.fpr[reg];
fputhread = PCPU_GET(fputhread);
@@ -664,12 +664,12 @@
save_fpu(td);
if (indicator == EXC_ALI_LFD) {
- if (copyin((void *)frame->dar, fpr,
+ if (copyin((void *)frame->cpu.aim.dar, fpr,
sizeof(double)) != 0)
return -1;
enable_fpu(td);
} else {
- if (copyout(fpr, (void *)frame->dar,
+ if (copyout(fpr, (void *)frame->cpu.aim.dar,
sizeof(double)) != 0)
return -1;
}
==== //depot/projects/e500/sys/powerpc/aim/trap_subr.S#4 (text+ko) ====
@@ -151,8 +151,8 @@
stw %r3, FRAME_XER+8(1); /* save xer/ctr/exc */ \
stw %r4, FRAME_CTR+8(1); \
stw %r5, FRAME_EXC+8(1); \
- stw %r28,FRAME_DAR+8(1); \
- stw %r29,FRAME_DSISR+8(1); /* save dsisr/srr0/srr1 */ \
+ stw %r28,FRAME_AIM_DAR+8(1); \
+ stw %r29,FRAME_AIM_DSISR+8(1); /* save dsisr/srr0/srr1 */ \
stw %r30,FRAME_SRR0+8(1); \
stw %r31,FRAME_SRR1+8(1)
==== //depot/projects/e500/sys/powerpc/booke/interrupt.c#4 (text+ko) ====
@@ -82,8 +82,8 @@
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->dear);
- printf(" esr = 0x%08x\n", frame->esr);
+ printf(" dear = 0x%08x\n", frame->cpu.booke.dear);
+ printf(" esr = 0x%08x\n", frame->cpu.booke.esr);
printf(" lr = 0x%08x\n", frame->lr);
printf(" cr = 0x%08x\n", frame->cr);
printf(" sp = 0x%08x\n", frame->fixreg[1]);
==== //depot/projects/e500/sys/powerpc/booke/machdep.c#10 (text+ko) ====
@@ -871,12 +871,12 @@
sf.sf_si = ksi->ksi_info;
sf.sf_si.si_signo = sig;
sf.sf_si.si_addr = (void *) ((tf->exc == EXC_DSI) ?
- tf->dear : tf->srr0);
+ tf->cpu.booke.dear : tf->srr0);
} else {
/* Old FreeBSD-style arguments. */
tf->fixreg[FIRSTARG+1] = code;
tf->fixreg[FIRSTARG+3] = (tf->exc == EXC_DSI) ?
- tf->dear : tf->srr0;
+ tf->cpu.booke.dear : tf->srr0;
}
mtx_unlock(&psp->ps_mtx);
PROC_UNLOCK(p);
==== //depot/projects/e500/sys/powerpc/booke/trap.c#4 (text+ko) ====
@@ -222,7 +222,7 @@
break;
#ifdef KDB
case EXC_PGM:
- if (frame->esr & ESR_PTR)
+ if (frame->cpu.booke.esr & ESR_PTR)
kdb_trap(EXC_PGM, 0, frame);
return;
#endif
@@ -274,7 +274,7 @@
switch (vector) {
case EXC_DTMISS:
case EXC_DSI:
- va = frame->dear;
+ va = frame->cpu.booke.dear;
break;
case EXC_ITMISS:
@@ -499,8 +499,8 @@
ftype = VM_PROT_READ | VM_PROT_EXECUTE;
} else {
- eva = frame->dear;
- if (frame->esr & ESR_ST)
+ eva = frame->cpu.booke.dear;
+ if (frame->cpu.booke.esr & ESR_ST)
ftype = VM_PROT_WRITE;
else
ftype = VM_PROT_READ;
==== //depot/projects/e500/sys/powerpc/booke/trap_subr.S#4 (text+ko) ====
@@ -198,8 +198,8 @@
/* save DEAR, ESR */ \
lwz %r28, (savearea+CPUSAVE_DEAR)(%r2); \
lwz %r29, (savearea+CPUSAVE_ESR)(%r2); \
- stw %r28, FRAME_DEAR+8(1); \
- stw %r29, FRAME_ESR+8(1); \
+ stw %r28, FRAME_BOOKE_DEAR+8(1); \
+ stw %r29, FRAME_BOOKE_ESR+8(1); \
/* save XER, CTR, exc number */ \
mfxer %r3; \
mfctr %r4; \
==== //depot/projects/e500/sys/powerpc/include/frame.h#3 (text+ko) ====
@@ -50,20 +50,25 @@
struct trapframe {
register_t fixreg[32];
register_t lr;
- int cr;
- int xer;
+ int cr;
+ int xer;
register_t ctr;
register_t srr0;
register_t srr1;
-#if defined(AIM)
- register_t dar; /* dar & dsisr are only filled on a DSI trap */
- int dsisr;
-#elif defined(E500)
- register_t dear;
- register_t esr;
-#endif
- int exc;
+ int exc;
+ union {
+ struct {
+ /* dar & dsisr are only filled on a DSI trap */
+ register_t dar;
+ int dsisr;
+ } aim;
+ struct {
+ register_t dear;
+ register_t esr;
+ } booke;
+ } cpu;
};
+
/*
* This is to ensure alignment of the stackpointer
*/
==== //depot/projects/e500/sys/powerpc/powerpc/db_trace.c#4 (text+ko) ====
@@ -92,12 +92,13 @@
{ "ctr", DB_OFFSET(ctr), db_frame },
{ "cr", DB_OFFSET(cr), db_frame },
{ "xer", DB_OFFSET(xer), db_frame },
+#ifdef AIM
+ { "dar", DB_OFFSET(cpu.aim.dar), db_frame },
+ { "dsisr", DB_OFFSET(cpu.aim.dsisr), db_frame },
+#endif
#ifdef E500
- { "dear", DB_OFFSET(dear), db_frame },
- { "esr", DB_OFFSET(esr), db_frame },
-#else
- { "dar", DB_OFFSET(dar), db_frame },
- { "dsisr", DB_OFFSET(dsisr), db_frame },
+ { "dear", DB_OFFSET(cpu.booke.dear), db_frame },
+ { "esr", DB_OFFSET(cpu.booke.esr), db_frame },
#endif
};
struct db_variable *db_eregs = db_regs + sizeof (db_regs)/sizeof (db_regs[0]);
@@ -199,24 +200,15 @@
db_printf("%s ", tf->srr1 & PSL_PR ? "user" : "kernel");
switch (tf->exc) {
case EXC_DSI:
-#ifdef E500
+ /* XXX take advantage of the union. */
db_printf("DSI %s trap @ %#x by ",
- tf->esr & DSISR_STORE ? "write" : "read",
- tf->dear);
-#else
- db_printf("DSI %s trap @ %#x by ",
- tf->dsisr & DSISR_STORE ? "write" : "read",
- tf->dar);
-#endif
+ (tf->cpu.aim.dsisr & DSISR_STORE) ? "write"
+ : "read", tf->cpu.aim.dar);
goto print_trap;
case EXC_ALI:
-#ifdef E500
- db_printf("ALI trap @ %#x (ESR %#x) ",
- tf->dear, tf->esr);
-#else
- db_printf("ALI trap @ %#x (DSISR %#x) ",
- tf->dar, tf->dsisr);
-#endif
+ /* XXX take advantage of the union. */
+ db_printf("ALI trap @ %#x (xSR %#x) ",
+ tf->cpu.aim.dar, tf->cpu.aim.dsisr);
goto print_trap;
case EXC_ISI: trapstr = "ISI"; break;
case EXC_PGM: trapstr = "PGM"; break;
@@ -257,13 +249,8 @@
}
db_printf("%-10s r1=%#x cr=%#x xer=%#x ctr=%#x",
"", tf->fixreg[1], tf->cr, tf->xer, tf->ctr);
-#ifdef E500
if (tf->exc == EXC_DSI)
- db_printf(" esr=%#x", tf->esr);
-#else
- if (tf->exc == EXC_DSI)
- db_printf(" dsisr=%#x", tf->dsisr);
-#endif
+ db_printf(" sr=%#x", tf->cpu.aim.dsisr);
db_printf("\n");
stackframe = (db_addr_t) tf->fixreg[1];
if (kernel_only && (tf->srr1 & PSL_PR))
==== //depot/projects/e500/sys/powerpc/powerpc/genassym.c#4 (text+ko) ====
@@ -160,14 +160,11 @@
ASSYM(FRAME_XER, offsetof(struct trapframe, xer));
ASSYM(FRAME_SRR0, offsetof(struct trapframe, srr0));
ASSYM(FRAME_SRR1, offsetof(struct trapframe, srr1));
-#if defined(AIM)
-ASSYM(FRAME_DAR, offsetof(struct trapframe, dar));
-ASSYM(FRAME_DSISR, offsetof(struct trapframe, dsisr));
-#elif defined(E500)
-ASSYM(FRAME_DEAR, offsetof(struct trapframe, dear));
-ASSYM(FRAME_ESR, offsetof(struct trapframe, esr));
-#endif
ASSYM(FRAME_EXC, offsetof(struct trapframe, exc));
+ASSYM(FRAME_AIM_DAR, offsetof(struct trapframe, cpu.aim.dar));
+ASSYM(FRAME_AIM_DSISR, offsetof(struct trapframe, cpu.aim.dsisr));
+ASSYM(FRAME_BOOKE_DEAR, offsetof(struct trapframe, cpu.booke.dear));
+ASSYM(FRAME_BOOKE_ESR, offsetof(struct trapframe, cpu.booke.esr));
ASSYM(CF_FUNC, offsetof(struct callframe, cf_func));
ASSYM(CF_ARG0, offsetof(struct callframe, cf_arg0));
More information about the p4-projects
mailing list