Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 37f3ac49 authored by Vineet Gupta's avatar Vineet Gupta
Browse files

ARC: Exception Handlers Code consolidation



After the recent cleanups, all the exception handlers now have same
boilerplate prologue code. Move that into common macro.

This reduces readability but helps greatly with sharing / duplicating
entry code with ARCv2 ISA where the handlers are pretty much the same,
just the entry prologue is different (due to hardware assist).

Also while at it, add the missing FAKE_RET_FROM_EXCPN calls in couple of
places to drop down to pure kernel mode (from exception mode) before
jumping off into "C" code.

Signed-off-by: default avatarVineet Gupta <vgupta@synopsys.com>
parent fe240f11
Loading
Loading
Loading
Loading
+23 −1
Original line number Diff line number Diff line
@@ -365,7 +365,7 @@
 * it to memory (non-SMP case) or SCRATCH0 Aux Reg (SMP).
 *
 * Before saving the full regfile - this reg is restored back, only
 * to be saved again on kernel mode stack, as part of ptregs.
 * to be saved again on kernel mode stack, as part of pt_regs.
 *-------------------------------------------------------------*/
.macro EXCPN_PROLOG_FREEUP_REG	reg
#ifdef CONFIG_SMP
@@ -383,6 +383,28 @@
#endif
.endm

/*--------------------------------------------------------------
 * Exception Entry prologue
 * -Switches stack to K mode (if not already)
 * -Saves the register file
 *
 * After this it is safe to call the "C" handlers
 *-------------------------------------------------------------*/
.macro EXCEPTION_PROLOGUE

	/* Need at least 1 reg to code the early exception prologue */
	EXCPN_PROLOG_FREEUP_REG r9

	/* U/K mode at time of exception (stack not switched if already K) */
	lr  r9, [erstatus]

	/* ARC700 doesn't provide auto-stack switching */
	SWITCH_TO_KERNEL_STK

	/* save the regfile */
	SAVE_ALL_SYS
.endm

/*--------------------------------------------------------------
 * Save all registers used by Exceptions (TLB Miss, Prot-V, Mem err etc)
 * Requires SP to be already switched to kernel mode Stack
+13 −43
Original line number Diff line number Diff line
@@ -267,12 +267,7 @@ ARC_EXIT handle_interrupt_level1

ARC_ENTRY instr_service

	EXCPN_PROLOG_FREEUP_REG r9

	lr  r9, [erstatus]

	SWITCH_TO_KERNEL_STK
	SAVE_ALL_SYS
	EXCEPTION_PROLOGUE

	lr  r0, [efa]
	mov r1, sp
@@ -289,15 +284,13 @@ ARC_EXIT instr_service

ARC_ENTRY mem_service

	EXCPN_PROLOG_FREEUP_REG r9

	lr  r9, [erstatus]

	SWITCH_TO_KERNEL_STK
	SAVE_ALL_SYS
	EXCEPTION_PROLOGUE

	lr  r0, [efa]
	mov r1, sp

	FAKE_RET_FROM_EXCPN r9

	bl  do_memory_error
	b   ret_from_exception
ARC_EXIT mem_service
@@ -308,11 +301,7 @@ ARC_EXIT mem_service

ARC_ENTRY EV_MachineCheck

	EXCPN_PROLOG_FREEUP_REG r9
	lr  r9, [erstatus]

	SWITCH_TO_KERNEL_STK
	SAVE_ALL_SYS
	EXCEPTION_PROLOGUE

	lr  r2, [ecr]
	lr  r0, [efa]
@@ -342,13 +331,7 @@ ARC_EXIT EV_MachineCheck

ARC_ENTRY EV_TLBProtV

	EXCPN_PROLOG_FREEUP_REG r9

	;Which mode (user/kernel) was the system in when Exception occured
	lr  r9, [erstatus]

	SWITCH_TO_KERNEL_STK
	SAVE_ALL_SYS
	EXCEPTION_PROLOGUE

	;---------(3) Save some more regs-----------------
	;  vineetg: Mar 6th: Random Seg Fault issue #1
@@ -406,12 +389,7 @@ ARC_EXIT EV_TLBProtV
; ---------------------------------------------
ARC_ENTRY EV_PrivilegeV

	EXCPN_PROLOG_FREEUP_REG r9

	lr  r9, [erstatus]

	SWITCH_TO_KERNEL_STK
	SAVE_ALL_SYS
	EXCEPTION_PROLOGUE

	lr  r0, [efa]
	mov r1, sp
@@ -427,14 +405,13 @@ ARC_EXIT EV_PrivilegeV
; ---------------------------------------------
ARC_ENTRY EV_Extension

	EXCPN_PROLOG_FREEUP_REG r9
	lr  r9, [erstatus]

	SWITCH_TO_KERNEL_STK
	SAVE_ALL_SYS
	EXCEPTION_PROLOGUE

	lr  r0, [efa]
	mov r1, sp

	FAKE_RET_FROM_EXCPN r9

	bl  do_extension_fault
	b   ret_from_exception
ARC_EXIT EV_Extension
@@ -526,14 +503,7 @@ trap_with_param:

ARC_ENTRY EV_Trap

	; Need at least 1 reg to code the early exception prolog
	EXCPN_PROLOG_FREEUP_REG r9

	;Which mode (user/kernel) was the system in when intr occured
	lr  r9, [erstatus]

	SWITCH_TO_KERNEL_STK
	SAVE_ALL_SYS
	EXCEPTION_PROLOGUE

	;------- (4) What caused the Trap --------------
	lr     r12, [ecr]
+1 −7
Original line number Diff line number Diff line
@@ -371,13 +371,7 @@ do_slow_path_pf:

	; Slow path TLB Miss handled as a regular ARC Exception
	; (stack switching / save the complete reg-file).
	; That requires freeing up r9
	EXCPN_PROLOG_FREEUP_REG r9

	lr  r9, [erstatus]

	SWITCH_TO_KERNEL_STK
	SAVE_ALL_SYS
	EXCEPTION_PROLOGUE

	; ------- setup args for Linux Page fault Hanlder ---------
	mov_s r0, sp