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