ARC: entry: Add more common chores to EXCEPTION_PROLOGUE
authorVineet Gupta <vgupta@kernel.org>
Wed, 20 May 2020 07:39:09 +0000 (00:39 -0700)
committerVineet Gupta <vgupta@kernel.org>
Fri, 18 Aug 2023 17:30:07 +0000 (10:30 -0700)
THe high level structure of most ARC exception handlers is
 1. save regfile with EXCEPTION_PROLOGUE
 2. setup r0: EFA (not part of pt_regs)
 3. setup r1: pointer to pt_regs (SP)
 4. drop down to pure kernel mode (from exception)
 5. call the Linux "C" handler

Remove the boiler plate code by moving #2, #3, #4 into #1.

The exceptions to most exceptions are syscall Trap and Machine check
which don't do some of above for various reasons, so call a newly
introduced variant EXCEPTION_PROLOGUE_KEEP_AE (same as original
EXCEPTION_PROLOGUE)

Tested-by: Pavel Kozlov <Pavel.Kozlov@synopsys.com>
Signed-off-by: Vineet Gupta <vgupta@kernel.org>
arch/arc/include/asm/entry-arcv2.h
arch/arc/include/asm/entry-compact.h
arch/arc/kernel/entry-arcv2.S
arch/arc/kernel/entry-compact.S
arch/arc/kernel/entry.S

index a38ed50..11b48ab 100644 (file)
@@ -75,7 +75,7 @@
 .endm
 
 /*------------------------------------------------------------------------*/
-.macro EXCEPTION_PROLOGUE
+.macro EXCEPTION_PROLOGUE_KEEP_AE
 
        ; Before jumping to Exception Vector, hardware micro-ops did following:
        ;   1. SP auto-switched to kernel mode stack
        ; OUTPUT: r10 has ECR expected by EV_Trap
 .endm
 
+.macro EXCEPTION_PROLOGUE
+
+       EXCEPTION_PROLOGUE_KEEP_AE      ; return ECR in r10
+
+       lr  r0, [efa]
+       mov r1, sp
+
+       FAKE_RET_FROM_EXCPN             ; clobbers r9
+.endm
+
 /*------------------------------------------------------------------------
  * This macro saves the registers manually which would normally be autosaved
  * by hardware on taken interrupts. It is used by
index 4e2ae82..a0e760e 100644 (file)
  *
  * After this it is safe to call the "C" handlers
  *-------------------------------------------------------------*/
-.macro EXCEPTION_PROLOGUE
+.macro EXCEPTION_PROLOGUE_KEEP_AE
 
        /* Need at least 1 reg to code the early exception prologue */
        PROLOG_FREEUP_REG r9, @ex_saved_reg1
        ; OUTPUT: r10 has ECR expected by EV_Trap
 .endm
 
+.macro EXCEPTION_PROLOGUE
+
+       EXCEPTION_PROLOGUE_KEEP_AE      ; return ECR in r10
+
+       lr  r0, [efa]
+       mov r1, sp
+
+       FAKE_RET_FROM_EXCPN             ; clobbers r9
+.endm
+
 /*--------------------------------------------------------------
  * Restore all registers used by system call or Exceptions
  * SP should always be pointing to the next free stack element
index a7e6a21..2e49c81 100644 (file)
@@ -125,11 +125,6 @@ ENTRY(mem_service)
 
        EXCEPTION_PROLOGUE
 
-       lr  r0, [efa]
-       mov r1, sp
-
-       FAKE_RET_FROM_EXCPN
-
        bl  do_memory_error
        b   ret_from_exception
 END(mem_service)
@@ -138,11 +133,6 @@ ENTRY(EV_Misaligned)
 
        EXCEPTION_PROLOGUE
 
-       lr  r0, [efa]   ; Faulting Data address
-       mov r1, sp
-
-       FAKE_RET_FROM_EXCPN
-
        SAVE_CALLEE_SAVED_USER
        mov r2, sp              ; callee_regs
 
@@ -163,11 +153,6 @@ ENTRY(EV_TLBProtV)
 
        EXCEPTION_PROLOGUE
 
-       lr  r0, [efa]   ; Faulting Data address
-       mov r1, sp      ; pt_regs
-
-       FAKE_RET_FROM_EXCPN
-
        mov blink, ret_from_exception
        b   do_page_fault
 
index 77f0090..774c03c 100644 (file)
@@ -256,16 +256,6 @@ ENTRY(EV_TLBProtV)
 
        EXCEPTION_PROLOGUE      ; ECR returned in r10
 
-       lr  r0, [efa]   ; Faulting Data address (not part of pt_regs saved above)
-
-       ; Exception auto-disables further Intr/exceptions.
-       ; Re-enable them by pretending to return from exception
-       ; (so rest of handler executes in pure K mode)
-
-       FAKE_RET_FROM_EXCPN
-
-       mov   r1, sp    ; Handle to pt_regs
-
        ;------ (5) Type of Protection Violation? ----------
        ;
        ; ProtV Hardware Exception is triggered for Access Faults of 2 types
@@ -301,9 +291,6 @@ END(EV_TLBProtV)
 ENTRY(call_do_page_fault)
 
        EXCEPTION_PROLOGUE
-       lr  r0, [efa]   ; Faulting Data address
-       mov   r1, sp
-       FAKE_RET_FROM_EXCPN
 
        mov blink, ret_from_exception
        b  do_page_fault
index 46582fb..089f668 100644 (file)
@@ -80,11 +80,6 @@ ENTRY(instr_service)
 
        EXCEPTION_PROLOGUE
 
-       lr  r0, [efa]
-       mov r1, sp
-
-       FAKE_RET_FROM_EXCPN
-
        bl  do_insterror_or_kprobe
        b   ret_from_exception
 END(instr_service)
@@ -95,7 +90,7 @@ END(instr_service)
 
 ENTRY(EV_MachineCheck)
 
-       EXCEPTION_PROLOGUE      ; ECR returned in r10
+       EXCEPTION_PROLOGUE_KEEP_AE      ; ECR returned in r10
 
        lr  r0, [efa]
        mov r1, sp
@@ -128,11 +123,6 @@ ENTRY(EV_PrivilegeV)
 
        EXCEPTION_PROLOGUE
 
-       lr  r0, [efa]
-       mov r1, sp
-
-       FAKE_RET_FROM_EXCPN
-
        bl  do_privilege_fault
        b   ret_from_exception
 END(EV_PrivilegeV)
@@ -144,11 +134,6 @@ ENTRY(EV_Extension)
 
        EXCEPTION_PROLOGUE
 
-       lr  r0, [efa]
-       mov r1, sp
-
-       FAKE_RET_FROM_EXCPN
-
        bl  do_extension_fault
        b   ret_from_exception
 END(EV_Extension)
@@ -229,7 +214,7 @@ trap_with_param:
 
 ENTRY(EV_Trap)
 
-       EXCEPTION_PROLOGUE
+       EXCEPTION_PROLOGUE_KEEP_AE
 
        lr  r12, [efa]