svn commit: r281096 - in head/sys/powerpc: aim booke powerpc

Justin Hibbits jhibbits at FreeBSD.org
Sun Apr 5 02:42:53 UTC 2015


Author: jhibbits
Date: Sun Apr  5 02:42:52 2015
New Revision: 281096
URL: https://svnweb.freebsd.org/changeset/base/281096

Log:
  Unify Book-E and AIM trap.c
  
  Summary:
  Book-E and AIM trap.c are almost identical, except for a few bits.  This is step
  1 in unifying them.
  
  This also renumbers EXC_DEBUG, to not conflict with AIM vector numbers.  Since
  this is the only one thus far that is used in the switch statement in trap(),
  it's the only one renumbered.  If others get added to the switch, which conflict
  with AIM numbers, they should also be renumbered.
  
  Reviewers: #powerpc, marcel, nwhitehorn
  
  Reviewed By: marcel
  
  Subscribers: imp
  
  Differential Revision: https://reviews.freebsd.org/D2215

Added:
  head/sys/powerpc/powerpc/trap.c
     - copied, changed from r280833, head/sys/powerpc/aim/trap.c
Deleted:
  head/sys/powerpc/aim/trap.c
  head/sys/powerpc/booke/trap.c
Modified:
  head/sys/powerpc/aim/machdep.c

Modified: head/sys/powerpc/aim/machdep.c
==============================================================================
--- head/sys/powerpc/aim/machdep.c	Sun Apr  5 01:03:11 2015	(r281095)
+++ head/sys/powerpc/aim/machdep.c	Sun Apr  5 02:42:52 2015	(r281096)
@@ -760,31 +760,6 @@ spinlock_exit(void)
 	}
 }
 
-int db_trap_glue(struct trapframe *);		/* Called from trap_subr.S */
-
-int
-db_trap_glue(struct trapframe *frame)
-{
-	if (!(frame->srr1 & PSL_PR)
-	    && (frame->exc == EXC_TRC || frame->exc == EXC_RUNMODETRC
-		|| (frame->exc == EXC_PGM
-		    && (frame->srr1 & 0x20000))
-		|| frame->exc == EXC_BPT
-		|| frame->exc == EXC_DSI)) {
-		int type = frame->exc;
-
-		/* Ignore DTrace traps. */
-		if (*(uint32_t *)frame->srr0 == EXC_DTRACE)
-			return (0);
-		if (type == EXC_PGM && (frame->srr1 & 0x20000)) {
-			type = T_BREAKPOINT;
-		}
-		return (kdb_trap(type, 0, frame));
-	}
-
-	return (0);
-}
-
 #ifndef __powerpc64__
 
 uint64_t

Copied and modified: head/sys/powerpc/powerpc/trap.c (from r280833, head/sys/powerpc/aim/trap.c)
==============================================================================
--- head/sys/powerpc/aim/trap.c	Sun Mar 29 22:46:07 2015	(r280833, copy source)
+++ head/sys/powerpc/powerpc/trap.c	Sun Apr  5 02:42:52 2015	(r281096)
@@ -74,6 +74,12 @@ __FBSDID("$FreeBSD$");
 #include <machine/spr.h>
 #include <machine/sr.h>
 
+#define	FAULTBUF_LR	0
+#define	FAULTBUF_R1	1
+#define	FAULTBUF_R2	2
+#define	FAULTBUF_CR	3
+#define	FAULTBUF_R13	6
+
 static void	trap_fatal(struct trapframe *frame);
 static void	printtrap(u_int vector, struct trapframe *frame, int isfatal,
 		    int user);
@@ -100,32 +106,37 @@ int (*dtrace_invop_jump_addr)(struct tra
 #endif
 
 static struct powerpc_exception powerpc_exceptions[] = {
-	{ 0x0100, "system reset" },
-	{ 0x0200, "machine check" },
-	{ 0x0300, "data storage interrupt" },
-	{ 0x0380, "data segment exception" },
-	{ 0x0400, "instruction storage interrupt" },
-	{ 0x0480, "instruction segment exception" },
-	{ 0x0500, "external interrupt" },
-	{ 0x0600, "alignment" },
-	{ 0x0700, "program" },
-	{ 0x0800, "floating-point unavailable" },
-	{ 0x0900, "decrementer" },
-	{ 0x0c00, "system call" },
-	{ 0x0d00, "trace" },
-	{ 0x0e00, "floating-point assist" },
-	{ 0x0f00, "performance monitoring" },
-	{ 0x0f20, "altivec unavailable" },
-	{ 0x0f40, "vsx unavailable" },
-	{ 0x1000, "instruction tlb miss" },
-	{ 0x1100, "data load tlb miss" },
-	{ 0x1200, "data store tlb miss" },
-	{ 0x1300, "instruction breakpoint" },
-	{ 0x1400, "system management" },
-	{ 0x1600, "altivec assist" },
-	{ 0x1700, "thermal management" },
-	{ 0x2000, "run mode/trace" },
-	{ 0x3000, NULL }
+	{ EXC_CRIT,	"critical input" },
+	{ EXC_RST,	"system reset" },
+	{ EXC_MCHK,	"machine check" },
+	{ EXC_DSI,	"data storage interrupt" },
+	{ EXC_DSE,	"data segment exception" },
+	{ EXC_ISI,	"instruction storage interrupt" },
+	{ EXC_ISE,	"instruction segment exception" },
+	{ EXC_EXI,	"external interrupt" },
+	{ EXC_ALI,	"alignment" },
+	{ EXC_PGM,	"program" },
+	{ EXC_FPU,	"floating-point unavailable" },
+	{ EXC_APU,	"auxiliary proc unavailable" },
+	{ EXC_DECR,	"decrementer" },
+	{ EXC_FIT,	"fixed-interval timer" },
+	{ EXC_WDOG,	"watchdog timer" },
+	{ EXC_SC,	"system call" },
+	{ EXC_TRC,	"trace" },
+	{ EXC_FPA,	"floating-point assist" },
+	{ EXC_DEBUG,	"debug" },
+	{ EXC_PERF,	"performance monitoring" },
+	{ EXC_VEC,	"altivec unavailable" },
+	{ EXC_VSX,	"vsx unavailable" },
+	{ EXC_ITMISS,	"instruction tlb miss" },
+	{ EXC_DLMISS,	"data load tlb miss" },
+	{ EXC_DSMISS,	"data store tlb miss" },
+	{ EXC_BPT,	"instruction breakpoint" },
+	{ EXC_SMI,	"system management" },
+	{ EXC_VECAST_G4,	"altivec assist" },
+	{ EXC_THRM,	"thermal management" },
+	{ EXC_RUNMODETRC,	"run mode/trace" },
+	{ EXC_LAST,	NULL }
 };
 
 static const char *
@@ -133,7 +144,7 @@ trapname(u_int vector)
 {
 	struct	powerpc_exception *pe;
 
-	for (pe = powerpc_exceptions; pe->vector != 0x3000; pe++) {
+	for (pe = powerpc_exceptions; pe->vector != EXC_LAST; pe++) {
 		if (pe->vector == vector)
 			return (pe->name);
 	}
@@ -265,9 +276,21 @@ trap(struct trapframe *frame)
 				frame->srr0 += 4;
 			break;
 
+		case EXC_DEBUG:	/* Single stepping */
+			mtspr(SPR_DBSR, mfspr(SPR_DBSR));
+			frame->srr1 &= ~PSL_DE;
+			frame->cpu.booke.dbcr0 &= ~(DBCR0_IDM || DBCR0_IC);
+			sig = SIGTRAP;
+			ucode = TRAP_TRACE;
+			break;
+
 		case EXC_PGM:
 			/* Identify the trap reason */
+#ifdef AIM
 			if (frame->srr1 & EXC_PGM_TRAP) {
+#else
+			if (frame->cpu.booke.esr & ESR_PTR) {
+#endif
 #ifdef KDTRACE_HOOKS
 				inst = fuword32((const void *)frame->srr0);
 				if (inst == 0x0FFFDDDD &&
@@ -384,12 +407,14 @@ printtrap(u_int vector, struct trapframe
 	printf("\n");
 	printf("   exception       = 0x%x (%s)\n", vector, trapname(vector));
 	switch (vector) {
+	case EXC_DTMISS:
 	case EXC_DSE:
 	case EXC_DSI:
 		printf("   virtual address = 0x%" PRIxPTR "\n", frame->dar);
 		printf("   dsisr           = 0x%" PRIxPTR "\n",
 		    frame->cpu.aim.dsisr);
 		break;
+	case EXC_ITMISS:
 	case EXC_ISE:
 	case EXC_ISI:
 		printf("   virtual address = 0x%" PRIxPTR "\n", frame->srr0);
@@ -418,12 +443,12 @@ handle_onfault(struct trapframe *frame)
 	td = curthread;
 	fb = td->td_pcb->pcb_onfault;
 	if (fb != NULL) {
-		frame->srr0 = (*fb)[0];
-		frame->fixreg[1] = (*fb)[1];
-		frame->fixreg[2] = (*fb)[2];
+		frame->srr0 = (*fb)[FAULTBUF_LR];
+		frame->fixreg[1] = (*fb)[FAULTBUF_R1];
+		frame->fixreg[2] = (*fb)[FAULTBUF_R2];
 		frame->fixreg[3] = 1;
-		frame->cr = (*fb)[3];
-		bcopy(&(*fb)[4], &frame->fixreg[13],
+		frame->cr = (*fb)[FAULTBUF_CR];
+		bcopy(&(*fb)[FAULTBUF_R13], &frame->fixreg[13],
 		    19 * sizeof(register_t));
 		return (1);
 	}
@@ -630,7 +655,9 @@ trap_pfault(struct trapframe *frame, int
 	vm_map_t	map;
 	vm_prot_t	ftype;
 	int		rv;
+#ifdef AIM
 	register_t	user_sr;
+#endif
 
 	td = curthread;
 	p = td->td_proc;
@@ -641,24 +668,35 @@ trap_pfault(struct trapframe *frame, int
 			ftype |= VM_PROT_READ;
 	} else {
 		eva = frame->dar;
+#ifdef BOOKE
+		if (frame->cpu.booke.esr & ESR_ST)
+#else
 		if (frame->cpu.aim.dsisr & DSISR_STORE)
+#endif
 			ftype = VM_PROT_WRITE;
 		else
 			ftype = VM_PROT_READ;
 	}
 
 	if (user) {
+		KASSERT(p->p_vmspace != NULL, ("trap_pfault: vmspace  NULL"));
 		map = &p->p_vmspace->vm_map;
 	} else {
+#ifdef BOOKE
+		if (eva < VM_MAXUSER_ADDRESS) {
+#else
 		if ((eva >> ADDR_SR_SHFT) == (USER_ADDR >> ADDR_SR_SHFT)) {
+#endif
 			if (p->p_vmspace == NULL)
 				return (SIGSEGV);
 
 			map = &p->p_vmspace->vm_map;
 
+#ifdef AIM
 			user_sr = td->td_pcb->pcb_cpu.aim.usr_segm;
 			eva &= ADDR_PIDX | ADDR_POFF;
 			eva |= user_sr << ADDR_SR_SHFT;
+#endif
 		} else {
 			map = kernel_map;
 		}
@@ -736,17 +774,43 @@ fix_unaligned(struct thread *td, struct 
 		if (indicator == EXC_ALI_LFD) {
 			if (copyin((void *)frame->dar, fpr,
 			    sizeof(double)) != 0)
-				return -1;
+				return (-1);
 			enable_fpu(td);
 		} else {
 			if (copyout(fpr, (void *)frame->dar,
 			    sizeof(double)) != 0)
-				return -1;
+				return (-1);
 		}
-		return 0;
+		return (0);
 		break;
 	}
 
-	return -1;
+	return (-1);
 }
 
+#ifdef KDB
+int db_trap_glue(struct trapframe *);		/* Called from trap_subr.S */
+
+int
+db_trap_glue(struct trapframe *frame)
+{
+	if (!(frame->srr1 & PSL_PR)
+	    && (frame->exc == EXC_TRC || frame->exc == EXC_RUNMODETRC
+		|| (frame->exc == EXC_PGM
+		    && (frame->srr1 & 0x20000))
+		|| frame->exc == EXC_BPT
+		|| frame->exc == EXC_DSI)) {
+		int type = frame->exc;
+
+		/* Ignore DTrace traps. */
+		if (*(uint32_t *)frame->srr0 == EXC_DTRACE)
+			return (0);
+		if (type == EXC_PGM && (frame->srr1 & 0x20000)) {
+			type = T_BREAKPOINT;
+		}
+		return (kdb_trap(type, 0, frame));
+	}
+
+	return (0);
+}
+#endif


More information about the svn-src-head mailing list