mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-09 23:39:18 +00:00
ARC: entry: SAVE_ABI_CALLEE_REG: ISA/ABI specific helper
And for ARcompact variant replace the PUSH/POP macros with gas provided push/pop pseudo-instructions This allows ISA specific implementation e.g. Current ARCv2 PUSH/POP could be replaced with STD/LDL to save 2 registers at a time (w/o bothering with SP update each time) or perhaps use ENTER_S/LEAVE_S to reduce code size For ARCv3 ABI changed so callee regs are now r14-r26 (vs. r13-r25) thus would need a different implementation. Signed-off-by: Vineet Gupta <vgupta@kernel.org>
This commit is contained in:
parent
33cc938e65
commit
9de7fc30f2
@ -291,4 +291,36 @@
|
|||||||
/* M = 8-1 N = 8 */
|
/* M = 8-1 N = 8 */
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
|
.macro SAVE_ABI_CALLEE_REGS
|
||||||
|
push r13
|
||||||
|
push r14
|
||||||
|
push r15
|
||||||
|
push r16
|
||||||
|
push r17
|
||||||
|
push r18
|
||||||
|
push r19
|
||||||
|
push r20
|
||||||
|
push r21
|
||||||
|
push r22
|
||||||
|
push r23
|
||||||
|
push r24
|
||||||
|
push r25
|
||||||
|
.endm
|
||||||
|
|
||||||
|
.macro RESTORE_ABI_CALLEE_REGS
|
||||||
|
pop r25
|
||||||
|
pop r24
|
||||||
|
pop r23
|
||||||
|
pop r22
|
||||||
|
pop r21
|
||||||
|
pop r20
|
||||||
|
pop r19
|
||||||
|
pop r18
|
||||||
|
pop r17
|
||||||
|
pop r16
|
||||||
|
pop r15
|
||||||
|
pop r14
|
||||||
|
pop r13
|
||||||
|
.endm
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -33,6 +33,38 @@
|
|||||||
#include <asm/irqflags-compact.h>
|
#include <asm/irqflags-compact.h>
|
||||||
#include <asm/thread_info.h> /* For THREAD_SIZE */
|
#include <asm/thread_info.h> /* For THREAD_SIZE */
|
||||||
|
|
||||||
|
.macro SAVE_ABI_CALLEE_REGS
|
||||||
|
push r13
|
||||||
|
push r14
|
||||||
|
push r15
|
||||||
|
push r16
|
||||||
|
push r17
|
||||||
|
push r18
|
||||||
|
push r19
|
||||||
|
push r20
|
||||||
|
push r21
|
||||||
|
push r22
|
||||||
|
push r23
|
||||||
|
push r24
|
||||||
|
push r25
|
||||||
|
.endm
|
||||||
|
|
||||||
|
.macro RESTORE_ABI_CALLEE_REGS
|
||||||
|
pop r25
|
||||||
|
pop r24
|
||||||
|
pop r23
|
||||||
|
pop r22
|
||||||
|
pop r21
|
||||||
|
pop r20
|
||||||
|
pop r19
|
||||||
|
pop r18
|
||||||
|
pop r17
|
||||||
|
pop r16
|
||||||
|
pop r15
|
||||||
|
pop r14
|
||||||
|
pop r13
|
||||||
|
.endm
|
||||||
|
|
||||||
/*--------------------------------------------------------------
|
/*--------------------------------------------------------------
|
||||||
* Switch to Kernel Mode stack if SP points to User Mode stack
|
* Switch to Kernel Mode stack if SP points to User Mode stack
|
||||||
*
|
*
|
||||||
|
@ -87,48 +87,12 @@
|
|||||||
|
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
/*--------------------------------------------------------------
|
|
||||||
* Helpers to save/restore callee-saved regs:
|
|
||||||
* used by several macros below
|
|
||||||
*-------------------------------------------------------------*/
|
|
||||||
.macro SAVE_R13_TO_R25
|
|
||||||
PUSH r13
|
|
||||||
PUSH r14
|
|
||||||
PUSH r15
|
|
||||||
PUSH r16
|
|
||||||
PUSH r17
|
|
||||||
PUSH r18
|
|
||||||
PUSH r19
|
|
||||||
PUSH r20
|
|
||||||
PUSH r21
|
|
||||||
PUSH r22
|
|
||||||
PUSH r23
|
|
||||||
PUSH r24
|
|
||||||
PUSH r25
|
|
||||||
.endm
|
|
||||||
|
|
||||||
.macro RESTORE_R25_TO_R13
|
|
||||||
POP r25
|
|
||||||
POP r24
|
|
||||||
POP r23
|
|
||||||
POP r22
|
|
||||||
POP r21
|
|
||||||
POP r20
|
|
||||||
POP r19
|
|
||||||
POP r18
|
|
||||||
POP r17
|
|
||||||
POP r16
|
|
||||||
POP r15
|
|
||||||
POP r14
|
|
||||||
POP r13
|
|
||||||
.endm
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* save user mode callee regs as struct callee_regs
|
* save user mode callee regs as struct callee_regs
|
||||||
* - needed by fork/do_signal/unaligned-access-emulation.
|
* - needed by fork/do_signal/unaligned-access-emulation.
|
||||||
*/
|
*/
|
||||||
.macro SAVE_CALLEE_SAVED_USER
|
.macro SAVE_CALLEE_SAVED_USER
|
||||||
SAVE_R13_TO_R25
|
SAVE_ABI_CALLEE_REGS
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -136,18 +100,18 @@
|
|||||||
* - could have been changed by ptrace tracer or unaligned-access fixup
|
* - could have been changed by ptrace tracer or unaligned-access fixup
|
||||||
*/
|
*/
|
||||||
.macro RESTORE_CALLEE_SAVED_USER
|
.macro RESTORE_CALLEE_SAVED_USER
|
||||||
RESTORE_R25_TO_R13
|
RESTORE_ABI_CALLEE_REGS
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* save/restore kernel mode callee regs at the time of context switch
|
* save/restore kernel mode callee regs at the time of context switch
|
||||||
*/
|
*/
|
||||||
.macro SAVE_CALLEE_SAVED_KERNEL
|
.macro SAVE_CALLEE_SAVED_KERNEL
|
||||||
SAVE_R13_TO_R25
|
SAVE_ABI_CALLEE_REGS
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
.macro RESTORE_CALLEE_SAVED_KERNEL
|
.macro RESTORE_CALLEE_SAVED_KERNEL
|
||||||
RESTORE_R25_TO_R13
|
RESTORE_ABI_CALLEE_REGS
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
/*--------------------------------------------------------------
|
/*--------------------------------------------------------------
|
||||||
|
@ -54,6 +54,10 @@ struct pt_regs {
|
|||||||
ecr_reg ecr;
|
ecr_reg ecr;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct callee_regs {
|
||||||
|
unsigned long r25, r24, r23, r22, r21, r20, r19, r18, r17, r16, r15, r14, r13;
|
||||||
|
};
|
||||||
|
|
||||||
#define MAX_REG_OFFSET offsetof(struct pt_regs, ecr)
|
#define MAX_REG_OFFSET offsetof(struct pt_regs, ecr)
|
||||||
|
|
||||||
#else
|
#else
|
||||||
@ -92,16 +96,14 @@ struct pt_regs {
|
|||||||
unsigned long status32;
|
unsigned long status32;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define MAX_REG_OFFSET offsetof(struct pt_regs, status32)
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Callee saved registers - need to be saved only when you are scheduled out */
|
|
||||||
|
|
||||||
struct callee_regs {
|
struct callee_regs {
|
||||||
unsigned long r25, r24, r23, r22, r21, r20, r19, r18, r17, r16, r15, r14, r13;
|
unsigned long r25, r24, r23, r22, r21, r20, r19, r18, r17, r16, r15, r14, r13;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define MAX_REG_OFFSET offsetof(struct pt_regs, status32)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
#define instruction_pointer(regs) ((regs)->ret)
|
#define instruction_pointer(regs) ((regs)->ret)
|
||||||
#define profile_pc(regs) instruction_pointer(regs)
|
#define profile_pc(regs) instruction_pointer(regs)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user