powerpc/64s: Use {ZEROIZE,SAVE,REST}_GPRS macros in sc, scv 0 handlers
authorRohan McLure <rmclure@linux.ibm.com>
Wed, 21 Sep 2022 06:55:44 +0000 (16:55 +1000)
committerMichael Ellerman <mpe@ellerman.id.au>
Mon, 26 Sep 2022 13:00:15 +0000 (23:00 +1000)
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
arch/powerpc/kernel/interrupt_64.S

index 9d6c8c5..931f984 100644 (file)
@@ -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: