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
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to