Fixed SPARC kernel entry SNAFU
authorAndrew Waterman <waterman@s143.Millennium.Berkeley.EDU>
Wed, 5 May 2010 07:56:03 +0000 (00:56 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:35:47 +0000 (17:35 -0700)
If a trap occurred with interrupts disabled (i.e. a kernel bug),
then the trap handler would invert the interrupt state, which would
enable interrupts!!!

kern/arch/sparc/trap_entry.S

index 3c62c15..edc1b7e 100644 (file)
@@ -53,8 +53,9 @@ handle_trap:
        // The spill handler won't overwrite l0/l5/l6, so stash l1 (pc) and l2 (npc)
        // in there, since the hardware will overwrite them if save traps
        mov     %psr,%l7
-       wr      %l7,PSR_PIL,%psr
-       wr      %l7,PSR_PIL|PSR_ET,%psr
+       andn    %l7,PSR_PIL,%l6
+       wr      %l6,PSR_PIL,%psr
+       wr      %l6,PSR_PIL|PSR_ET,%psr
 
        // Are we user or kernel?
        btst    PSR_PS,%l7