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