On Wed Aug 24, 2022 at 12:05 PM AEST, Rohan McLure wrote: > 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. >
Reviewed-by: Nicholas Piggin <npig...@gmail.com> > Signed-off-by: Rohan McLure <rmcl...@linux.ibm.com> > --- > V1 -> V2: Update summary > V2 -> V3: Update summary regarding exclusions for the SAVE_GPR marco. > Acknowledge new name for ZEROIZE_GPR{,S} macros. > --- > arch/powerpc/kernel/interrupt_64.S | 43 ++++++---------------------- > 1 file changed, 9 insertions(+), 34 deletions(-) > > diff --git a/arch/powerpc/kernel/interrupt_64.S > b/arch/powerpc/kernel/interrupt_64.S > index a8065209dd8c..ad302ad93433 100644 > --- a/arch/powerpc/kernel/interrupt_64.S > +++ b/arch/powerpc/kernel/interrupt_64.S > @@ -71,12 +71,7 @@ _ASM_NOKPROBE_SYMBOL(system_call_vectored_\name) > mfcr r12 > li r11,0 > /* Save syscall parameters in r3-r8 */ > - 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) > @@ -157,17 +152,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 > > /* > @@ -189,7 +177,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR) > ld r4,_LINK(r1) > ld r5,_XER(r1) > > - ld r0,GPR0(r1) > + REST_GPR(0, r1) > mtcr r2 > mtctr r3 > mtlr r4 > @@ -257,12 +245,7 @@ END_BTB_FLUSH_SECTION > mfcr r12 > li r11,0 > /* Save syscall parameters in r3-r8 */ > - 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) > @@ -360,16 +343,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: > @@ -394,7 +369,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR) > ld r4,_XER(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: > -- > 2.34.1