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.koz...@synopsys.com>
Signed-off-by: Vineet Gupta <vgu...@kernel.org>
---
 arch/arc/include/asm/entry-arcv2.h   | 12 +++++++++++-
 arch/arc/include/asm/entry-compact.h | 12 +++++++++++-
 arch/arc/kernel/entry-arcv2.S        | 15 ---------------
 arch/arc/kernel/entry-compact.S      | 13 -------------
 arch/arc/kernel/entry.S              | 19 ++-----------------
 5 files changed, 24 insertions(+), 47 deletions(-)

diff --git a/arch/arc/include/asm/entry-arcv2.h 
b/arch/arc/include/asm/entry-arcv2.h
index a38ed505b3de..11b48ab39154 100644
--- a/arch/arc/include/asm/entry-arcv2.h
+++ b/arch/arc/include/asm/entry-arcv2.h
@@ -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
@@ -104,6 +104,16 @@
        ; 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
diff --git a/arch/arc/include/asm/entry-compact.h 
b/arch/arc/include/asm/entry-compact.h
index 4e2ae82779ed..a0e760eb35a8 100644
--- a/arch/arc/include/asm/entry-compact.h
+++ b/arch/arc/include/asm/entry-compact.h
@@ -140,7 +140,7 @@
  *
  * 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
@@ -179,6 +179,16 @@
        ; 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
diff --git a/arch/arc/kernel/entry-arcv2.S b/arch/arc/kernel/entry-arcv2.S
index a7e6a2174187..2e49c81c8086 100644
--- a/arch/arc/kernel/entry-arcv2.S
+++ b/arch/arc/kernel/entry-arcv2.S
@@ -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
 
diff --git a/arch/arc/kernel/entry-compact.S b/arch/arc/kernel/entry-compact.S
index 77f0090554c5..774c03cc1d1a 100644
--- a/arch/arc/kernel/entry-compact.S
+++ b/arch/arc/kernel/entry-compact.S
@@ -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
diff --git a/arch/arc/kernel/entry.S b/arch/arc/kernel/entry.S
index 46582fbebcf2..089f6680518f 100644
--- a/arch/arc/kernel/entry.S
+++ b/arch/arc/kernel/entry.S
@@ -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]
 
-- 
2.34.1


_______________________________________________
linux-snps-arc mailing list
linux-snps-arc@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-snps-arc

Reply via email to