ARC: mm: move MMU specific bits out of entry code ...
[linux-2.6-microblaze.git] / arch / arc / kernel / entry-arcv2.S
index 14254b8..a7e6a21 100644 (file)
@@ -10,6 +10,7 @@
 #include <asm/errno.h>
 #include <asm/arcregs.h>
 #include <asm/irqflags.h>
+#include <asm/mmu.h>
 
 ; A maximum number of supported interrupts in the core interrupt controller.
 ; This number is not equal to the maximum interrupt number (256) because
@@ -67,7 +68,7 @@ reserved:
 
 ENTRY(handle_interrupt)
 
-       INTERRUPT_PROLOGUE  irq
+       INTERRUPT_PROLOGUE
 
        # irq control APIs local_irq_save/restore/disable/enable fiddle with
        # global interrupt enable bits in STATUS32 (.IE for 1 prio, .E[] for 2 prio)
@@ -79,7 +80,7 @@ ENTRY(handle_interrupt)
        #
        # Note this disable is only for consistent book-keeping as further interrupts
        # will be disabled anyways even w/o this. Hardware tracks active interrupts
-       # seperately in AUX_IRQ_ACTIVE.active and will not take new interrupts
+       # seperately in AUX_IRQ_ACT.active and will not take new interrupts
        # unless this one returns (or higher prio becomes pending in 2-prio scheme)
 
        IRQ_DISABLE
@@ -200,17 +201,18 @@ restore_regs:
        ld      r0, [sp, PT_status32]   ; U/K mode at time of entry
        lr      r10, [AUX_IRQ_ACT]
 
-       bmsk    r11, r10, 15    ; AUX_IRQ_ACT.ACTIVE
+       bmsk    r11, r10, 15            ; extract AUX_IRQ_ACT.active
        breq    r11, 0, .Lexcept_ret    ; No intr active, ret from Exception
 
 ;####### Return from Intr #######
 
+.Lisr_ret:
+
 debug_marker_l1:
        ; bbit1.nt r0, STATUS_DE_BIT, .Lintr_ret_to_delay_slot
        btst    r0, STATUS_DE_BIT               ; Z flag set if bit clear
        bnz     .Lintr_ret_to_delay_slot        ; branch if STATUS_DE_BIT set
 
-.Lisr_ret_fast_path:
        ; Handle special case #1: (Entry via Exception, Return via IRQ)
        ;
        ; Exception in U mode, preempted in kernel, Intr taken (K mode), orig
@@ -223,7 +225,7 @@ debug_marker_l1:
        bset.nz r11, r11, AUX_IRQ_ACT_BIT_U     ; NZ means U
        sr      r11, [AUX_IRQ_ACT]
 
-       INTERRUPT_EPILOGUE  irq
+       INTERRUPT_EPILOGUE
        rtie
 
 ;####### Return from Exception / pure kernel mode #######
@@ -244,8 +246,8 @@ debug_marker_syscall:
 ;
 ; IRQ RTIE won't reliably restore DE bit and/or BTA, needs workaround
 ;
-; Solution is return from Intr w/o any delay slot quirks into a kernel trampoline
-; and from pure kernel mode return to delay slot which handles DS bit/BTA correctly
+; Solution is to drop out of interrupt context into pure kernel mode
+; and return from pure kernel mode which does right things for delay slot
 
 .Lintr_ret_to_delay_slot:
 debug_marker_ds:
@@ -254,48 +256,9 @@ debug_marker_ds:
        add     r2, r2, 1
        st      r2, [@intr_to_DE_cnt]
 
-       ld      r2, [sp, PT_ret]
-       ld      r3, [sp, PT_status32]
-
-       ; STAT32 for Int return created from scratch
-       ; (No delay dlot, disable Further intr in trampoline)
-
-       bic     r0, r3, STATUS_U_MASK|STATUS_DE_MASK|STATUS_IE_MASK|STATUS_L_MASK
-       st      r0, [sp, PT_status32]
-
-       mov     r1, .Lintr_ret_to_delay_slot_2
-       st      r1, [sp, PT_ret]
-
-       ; Orig exception PC/STAT32 safekept @orig_r0 and @event stack slots
-       st      r2, [sp, 0]
-       st      r3, [sp, 4]
-
-       b       .Lisr_ret_fast_path
-
-.Lintr_ret_to_delay_slot_2:
-       ; Trampoline to restore orig exception PC/STAT32/BTA/AUX_USER_SP
-       sub     sp, sp, SZ_PT_REGS
-       st      r9, [sp, -4]
-
-       ld      r9, [sp, 0]
-       sr      r9, [eret]
-
-       ld      r9, [sp, 4]
-       sr      r9, [erstatus]
-
-       ; restore AUX_USER_SP if returning to U mode
-       bbit0   r9, STATUS_U_BIT, 1f
-       ld      r9, [sp, PT_sp]
-       sr      r9, [AUX_USER_SP]
-
-1:
-       ld      r9, [sp, 8]
-       sr      r9, [erbta]
-
-       ld      r9, [sp, -4]
-       add     sp, sp, SZ_PT_REGS
-
-       ; return from pure kernel mode to delay slot
-       rtie
+       ; drop out of interrupt context (clear AUX_IRQ_ACT.active)
+       bmskn   r11, r10, 15
+       sr      r11, [AUX_IRQ_ACT]
+       b       .Lexcept_ret
 
 END(ret_from_exception)