powerpc/64s: Use {ZEROIZE,SAVE,REST}_GPRS macros in sc, scv 0 handlers
Use the convenience macros for saving/clearing/restoring gprs in keeping with syscall calling conventions. The plural variants of these macros can store a range of registers for concision. This works well when the user gpr value we are hoping to save is still live. In the syscall interrupt handlers, user register state is sometimes juggled between registers. Hold-off from issuing the SAVE_GPR macro for applicable neighbouring lines to highlight the delicate register save logic. Signed-off-by: Rohan McLure <rmclure@linux.ibm.com> Reviewed-by: Nicholas Piggin <npiggin@gmail.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/20220921065605.1051927-5-rmclure@linux.ibm.com
This commit is contained in:
committed by
Michael Ellerman
parent
9d54a5ce3a
commit
2b1dac4b5f
@@ -61,12 +61,7 @@ _ASM_NOKPROBE_SYMBOL(system_call_vectored_\name)
|
||||
mfcr r12
|
||||
li r11,0
|
||||
/* Can we avoid saving r3-r8 in common case? */
|
||||
std r3,GPR3(r1)
|
||||
std r4,GPR4(r1)
|
||||
std r5,GPR5(r1)
|
||||
std r6,GPR6(r1)
|
||||
std r7,GPR7(r1)
|
||||
std r8,GPR8(r1)
|
||||
SAVE_GPRS(3, 8, r1)
|
||||
/* Zero r9-r12, this should only be required when restoring all GPRs */
|
||||
std r11,GPR9(r1)
|
||||
std r11,GPR10(r1)
|
||||
@@ -139,17 +134,10 @@ END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
|
||||
/* Could zero these as per ABI, but we may consider a stricter ABI
|
||||
* which preserves these if libc implementations can benefit, so
|
||||
* restore them for now until further measurement is done. */
|
||||
ld r0,GPR0(r1)
|
||||
ld r4,GPR4(r1)
|
||||
ld r5,GPR5(r1)
|
||||
ld r6,GPR6(r1)
|
||||
ld r7,GPR7(r1)
|
||||
ld r8,GPR8(r1)
|
||||
REST_GPR(0, r1)
|
||||
REST_GPRS(4, 8, r1)
|
||||
/* Zero volatile regs that may contain sensitive kernel data */
|
||||
li r9,0
|
||||
li r10,0
|
||||
li r11,0
|
||||
li r12,0
|
||||
ZEROIZE_GPRS(9, 12)
|
||||
mtspr SPRN_XER,r0
|
||||
|
||||
/*
|
||||
@@ -172,7 +160,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
|
||||
ld r5,_XER(r1)
|
||||
|
||||
REST_NVGPRS(r1)
|
||||
ld r0,GPR0(r1)
|
||||
REST_GPR(0, r1)
|
||||
mtcr r2
|
||||
mtctr r3
|
||||
mtlr r4
|
||||
@@ -240,12 +228,7 @@ END_BTB_FLUSH_SECTION
|
||||
mfcr r12
|
||||
li r11,0
|
||||
/* Can we avoid saving r3-r8 in common case? */
|
||||
std r3,GPR3(r1)
|
||||
std r4,GPR4(r1)
|
||||
std r5,GPR5(r1)
|
||||
std r6,GPR6(r1)
|
||||
std r7,GPR7(r1)
|
||||
std r8,GPR8(r1)
|
||||
SAVE_GPRS(3, 8, r1)
|
||||
/* Zero r9-r12, this should only be required when restoring all GPRs */
|
||||
std r11,GPR9(r1)
|
||||
std r11,GPR10(r1)
|
||||
@@ -335,16 +318,8 @@ END_FTR_SECTION_IFCLR(CPU_FTR_STCX_CHECKS_ADDRESS)
|
||||
cmpdi r3,0
|
||||
bne .Lsyscall_restore_regs
|
||||
/* Zero volatile regs that may contain sensitive kernel data */
|
||||
li r0,0
|
||||
li r4,0
|
||||
li r5,0
|
||||
li r6,0
|
||||
li r7,0
|
||||
li r8,0
|
||||
li r9,0
|
||||
li r10,0
|
||||
li r11,0
|
||||
li r12,0
|
||||
ZEROIZE_GPR(0)
|
||||
ZEROIZE_GPRS(4, 12)
|
||||
mtctr r0
|
||||
mtspr SPRN_XER,r0
|
||||
.Lsyscall_restore_regs_cont:
|
||||
@@ -370,7 +345,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
|
||||
REST_NVGPRS(r1)
|
||||
mtctr r3
|
||||
mtspr SPRN_XER,r4
|
||||
ld r0,GPR0(r1)
|
||||
REST_GPR(0, r1)
|
||||
REST_GPRS(4, 12, r1)
|
||||
b .Lsyscall_restore_regs_cont
|
||||
.Lsyscall_rst_end:
|
||||
|
||||
Reference in New Issue
Block a user