Author: nwhitehorn
Date: Mon Feb  9 02:12:38 2015
New Revision: 278427
URL: https://svnweb.freebsd.org/changeset/base/278427

Log:
  Simplify trapcode setup by placing a copy of the generic trap handler at
  every possible trap address by default. This also makes sure the kernel
  notices (and panics at) traps from newer CPUs that the kernel was not
  expecting rather than executing gibberish memory.

Modified:
  head/sys/powerpc/aim/machdep.c

Modified: head/sys/powerpc/aim/machdep.c
==============================================================================
--- head/sys/powerpc/aim/machdep.c      Mon Feb  9 01:45:06 2015        
(r278426)
+++ head/sys/powerpc/aim/machdep.c      Mon Feb  9 02:12:38 2015        
(r278427)
@@ -256,6 +256,7 @@ powerpc_init(vm_offset_t fdt, vm_offset_
        vm_offset_t     startkernel, endkernel;
        void            *generictrap;
        size_t          trap_offset, trapsize;
+       vm_offset_t     trap;
        void            *kmdp;
         char           *env;
        register_t      msr, scratch;
@@ -481,20 +482,6 @@ powerpc_init(vm_offset_t fdt, vm_offset_
        #endif
 
                /*
-                * Copy a code snippet to restore 32-bit bridge mode
-                * to the top of every non-generic trap handler
-                */
-
-               trap_offset += (size_t)&restorebridgesize;
-               bcopy(&restorebridge, (void *)EXC_RST, trap_offset); 
-               bcopy(&restorebridge, (void *)EXC_DSI, trap_offset); 
-               bcopy(&restorebridge, (void *)EXC_ALI, trap_offset); 
-               bcopy(&restorebridge, (void *)EXC_PGM, trap_offset); 
-               bcopy(&restorebridge, (void *)EXC_MCHK, trap_offset); 
-               bcopy(&restorebridge, (void *)EXC_TRC, trap_offset); 
-               bcopy(&restorebridge, (void *)EXC_BPT, trap_offset); 
-
-               /*
                 * Set the common trap entry point to the one that
                 * knows to restore 32-bit operation on execution.
                 */
@@ -507,14 +494,35 @@ powerpc_init(vm_offset_t fdt, vm_offset_
        #else /* powerpc64 */
        cpu_features |= PPC_FEATURE_64;
        generictrap = &trapcode;
-
-       /* Set TOC base so that the interrupt code can get at it */
-       *((void **)TRAP_GENTRAP) = &trapcode2;
-       *((register_t *)TRAP_TOCBASE) = toc;
        #endif
 
        trapsize = (size_t)&trapcodeend - (size_t)&trapcode;
 
+       /*
+        * Copy generic handler into every possible trap. Special cases will get
+        * different ones in a minute.
+        */
+       for (trap = EXC_RST; trap < EXC_LAST; trap += 0x20)
+               bcopy(generictrap, (void *)trap, trapsize);
+
+       #ifndef __powerpc64__
+       if (cpu_features & PPC_FEATURE_64) {
+               /*
+                * Copy a code snippet to restore 32-bit bridge mode
+                * to the top of every non-generic trap handler
+                */
+
+               trap_offset += (size_t)&restorebridgesize;
+               bcopy(&restorebridge, (void *)EXC_RST, trap_offset); 
+               bcopy(&restorebridge, (void *)EXC_DSI, trap_offset); 
+               bcopy(&restorebridge, (void *)EXC_ALI, trap_offset); 
+               bcopy(&restorebridge, (void *)EXC_PGM, trap_offset); 
+               bcopy(&restorebridge, (void *)EXC_MCHK, trap_offset); 
+               bcopy(&restorebridge, (void *)EXC_TRC, trap_offset); 
+               bcopy(&restorebridge, (void *)EXC_BPT, trap_offset); 
+       }
+       #endif
+
        bcopy(&rstcode, (void *)(EXC_RST + trap_offset), (size_t)&rstcodeend -
            (size_t)&rstcode);
 
@@ -527,31 +535,20 @@ powerpc_init(vm_offset_t fdt, vm_offset_
            (size_t)&dblow);
        bcopy(&dblow, (void *)(EXC_BPT + trap_offset), (size_t)&dbend -
            (size_t)&dblow);
-#else
-       bcopy(generictrap, (void *)EXC_MCHK, trapsize);
-       bcopy(generictrap, (void *)EXC_PGM,  trapsize);
-       bcopy(generictrap, (void *)EXC_TRC,  trapsize);
-       bcopy(generictrap, (void *)EXC_BPT,  trapsize);
 #endif
        bcopy(&alitrap,  (void *)(EXC_ALI + trap_offset),  (size_t)&aliend -
            (size_t)&alitrap);
        bcopy(&dsitrap,  (void *)(EXC_DSI + trap_offset),  (size_t)&dsiend -
            (size_t)&dsitrap);
-       bcopy(generictrap, (void *)EXC_ISI,  trapsize);
+
        #ifdef __powerpc64__
+       /* Set TOC base so that the interrupt code can get at it */
+       *((void **)TRAP_GENTRAP) = &trapcode2;
+       *((register_t *)TRAP_TOCBASE) = toc;
+
        bcopy(&slbtrap, (void *)EXC_DSE,(size_t)&slbtrapend - (size_t)&slbtrap);
        bcopy(&slbtrap, (void *)EXC_ISE,(size_t)&slbtrapend - (size_t)&slbtrap);
-       #endif
-       bcopy(generictrap, (void *)EXC_EXI,  trapsize);
-       bcopy(generictrap, (void *)EXC_FPU,  trapsize);
-       bcopy(generictrap, (void *)EXC_DECR, trapsize);
-       bcopy(generictrap, (void *)EXC_SC,   trapsize);
-       bcopy(generictrap, (void *)EXC_FPA,  trapsize);
-       bcopy(generictrap, (void *)EXC_VEC,  trapsize);
-       bcopy(generictrap, (void *)EXC_PERF,  trapsize);
-       bcopy(generictrap, (void *)EXC_VECAST_G4, trapsize);
-       bcopy(generictrap, (void *)EXC_VECAST_G5, trapsize);
-       #ifndef __powerpc64__
+       #else
        /* G2-specific TLB miss helper handlers */
        bcopy(&imisstrap, (void *)EXC_IMISS,  (size_t)&imisssize);
        bcopy(&dlmisstrap, (void *)EXC_DLMISS,  (size_t)&dlmisssize);
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to