From: Christophe Leroy <christophe.leroy@csgroup.eu>
To: Nicholas Piggin <npiggin@gmail.com>, linuxppc-dev@lists.ozlabs.org
Subject: Re: [PATCH v2] powerpc: flexible GPR range save/restore macros
Date: Fri, 22 Oct 2021 09:45:30 +0200 [thread overview]
Message-ID: <47b88d64-c30d-1d0e-99aa-2f4002c9d705@csgroup.eu> (raw)
In-Reply-To: <20211022061322.2671178-1-npiggin@gmail.com>
Le 22/10/2021 à 08:13, Nicholas Piggin a écrit :
> Introduce macros that operate on a (start, end) range of GPRs, which
> reduces lines of code and need to do mental arithmetic while reading the
> code.
>
> Reviewed-by: Segher Boessenkool <segher@kernel.crashing.org>
> Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
Reviewed-by: Christophe Leroy <christophe.leroy@csgroup.eu>
> ---
> Since v1:
> - Removed unused OP_REG_IDX macro
> - Commented OP_REG macro
>
> arch/powerpc/boot/crt0.S | 31 +++++++------
> arch/powerpc/crypto/md5-asm.S | 10 ++---
> arch/powerpc/crypto/sha1-powerpc-asm.S | 6 +--
> arch/powerpc/include/asm/ppc_asm.h | 43 ++++++++++++-------
> arch/powerpc/kernel/entry_32.S | 23 ++++------
> arch/powerpc/kernel/exceptions-64e.S | 14 ++----
> arch/powerpc/kernel/exceptions-64s.S | 6 +--
> arch/powerpc/kernel/head_32.h | 3 +-
> arch/powerpc/kernel/head_booke.h | 3 +-
> arch/powerpc/kernel/interrupt_64.S | 34 ++++++---------
> arch/powerpc/kernel/optprobes_head.S | 4 +-
> arch/powerpc/kernel/tm.S | 15 ++-----
> .../powerpc/kernel/trace/ftrace_64_mprofile.S | 15 +++----
> arch/powerpc/kvm/book3s_hv_rmhandlers.S | 5 +--
> .../lib/test_emulate_step_exec_instr.S | 8 ++--
> 15 files changed, 94 insertions(+), 126 deletions(-)
>
> diff --git a/arch/powerpc/boot/crt0.S b/arch/powerpc/boot/crt0.S
> index 1d83966f5ef6..e8f10a599659 100644
> --- a/arch/powerpc/boot/crt0.S
> +++ b/arch/powerpc/boot/crt0.S
> @@ -226,16 +226,19 @@ p_base: mflr r10 /* r10 now points to runtime addr of p_base */
> #ifdef __powerpc64__
>
> #define PROM_FRAME_SIZE 512
> -#define SAVE_GPR(n, base) std n,8*(n)(base)
> -#define REST_GPR(n, base) ld n,8*(n)(base)
> -#define SAVE_2GPRS(n, base) SAVE_GPR(n, base); SAVE_GPR(n+1, base)
> -#define SAVE_4GPRS(n, base) SAVE_2GPRS(n, base); SAVE_2GPRS(n+2, base)
> -#define SAVE_8GPRS(n, base) SAVE_4GPRS(n, base); SAVE_4GPRS(n+4, base)
> -#define SAVE_10GPRS(n, base) SAVE_8GPRS(n, base); SAVE_2GPRS(n+8, base)
> -#define REST_2GPRS(n, base) REST_GPR(n, base); REST_GPR(n+1, base)
> -#define REST_4GPRS(n, base) REST_2GPRS(n, base); REST_2GPRS(n+2, base)
> -#define REST_8GPRS(n, base) REST_4GPRS(n, base); REST_4GPRS(n+4, base)
> -#define REST_10GPRS(n, base) REST_8GPRS(n, base); REST_2GPRS(n+8, base)
> +
> +.macro OP_REGS op, width, start, end, base, offset
> + .Lreg=\start
> + .rept (\end - \start + 1)
> + \op .Lreg,\offset+\width*.Lreg(\base)
> + .Lreg=.Lreg+1
> + .endr
> +.endm
> +
> +#define SAVE_GPRS(start, end, base) OP_REGS std, 8, start, end, base, 0
> +#define REST_GPRS(start, end, base) OP_REGS ld, 8, start, end, base, 0
> +#define SAVE_GPR(n, base) SAVE_GPRS(n, n, base)
> +#define REST_GPR(n, base) REST_GPRS(n, n, base)
>
> /* prom handles the jump into and return from firmware. The prom args pointer
> is loaded in r3. */
> @@ -246,9 +249,7 @@ prom:
> stdu r1,-PROM_FRAME_SIZE(r1) /* Save SP and create stack space */
>
> SAVE_GPR(2, r1)
> - SAVE_GPR(13, r1)
> - SAVE_8GPRS(14, r1)
> - SAVE_10GPRS(22, r1)
> + SAVE_GPRS(13, 31, r1)
> mfcr r10
> std r10,8*32(r1)
> mfmsr r10
> @@ -283,9 +284,7 @@ prom:
>
> /* Restore other registers */
> REST_GPR(2, r1)
> - REST_GPR(13, r1)
> - REST_8GPRS(14, r1)
> - REST_10GPRS(22, r1)
> + REST_GPRS(13, 31, r1)
> ld r10,8*32(r1)
> mtcr r10
>
> diff --git a/arch/powerpc/crypto/md5-asm.S b/arch/powerpc/crypto/md5-asm.S
> index 948d100a2934..fa6bc440cf4a 100644
> --- a/arch/powerpc/crypto/md5-asm.S
> +++ b/arch/powerpc/crypto/md5-asm.S
> @@ -38,15 +38,11 @@
>
> #define INITIALIZE \
> PPC_STLU r1,-INT_FRAME_SIZE(r1); \
> - SAVE_8GPRS(14, r1); /* push registers onto stack */ \
> - SAVE_4GPRS(22, r1); \
> - SAVE_GPR(26, r1)
> + SAVE_GPRS(14, 26, r1) /* push registers onto stack */
>
> #define FINALIZE \
> - REST_8GPRS(14, r1); /* pop registers from stack */ \
> - REST_4GPRS(22, r1); \
> - REST_GPR(26, r1); \
> - addi r1,r1,INT_FRAME_SIZE;
> + REST_GPRS(14, 26, r1); /* pop registers from stack */ \
> + addi r1,r1,INT_FRAME_SIZE
>
> #ifdef __BIG_ENDIAN__
> #define LOAD_DATA(reg, off) \
> diff --git a/arch/powerpc/crypto/sha1-powerpc-asm.S b/arch/powerpc/crypto/sha1-powerpc-asm.S
> index 23e248beff71..f0d5ed557ab1 100644
> --- a/arch/powerpc/crypto/sha1-powerpc-asm.S
> +++ b/arch/powerpc/crypto/sha1-powerpc-asm.S
> @@ -125,8 +125,7 @@
>
> _GLOBAL(powerpc_sha_transform)
> PPC_STLU r1,-INT_FRAME_SIZE(r1)
> - SAVE_8GPRS(14, r1)
> - SAVE_10GPRS(22, r1)
> + SAVE_GPRS(14, 31, r1)
>
> /* Load up A - E */
> lwz RA(0),0(r3) /* A */
> @@ -184,7 +183,6 @@ _GLOBAL(powerpc_sha_transform)
> stw RD(0),12(r3)
> stw RE(0),16(r3)
>
> - REST_8GPRS(14, r1)
> - REST_10GPRS(22, r1)
> + REST_GPRS(14, 31, r1)
> addi r1,r1,INT_FRAME_SIZE
> blr
> diff --git a/arch/powerpc/include/asm/ppc_asm.h b/arch/powerpc/include/asm/ppc_asm.h
> index 1c538a9a11e0..fe6cb940d136 100644
> --- a/arch/powerpc/include/asm/ppc_asm.h
> +++ b/arch/powerpc/include/asm/ppc_asm.h
> @@ -16,30 +16,41 @@
>
> #define SZL (BITS_PER_LONG/8)
>
> +/*
> + * This expands to a sequence of operations with reg incrementing from
> + * start to end inclusive, of this form:
> + *
> + * op reg, (offset + (width * reg))(base)
> + *
> + * Note that offset is not the offset of the first operation unless start
> + * is zero (or width is zero).
> + */
> +.macro OP_REGS op, width, start, end, base, offset
> + .Lreg=\start
> + .rept (\end - \start + 1)
> + \op .Lreg, \offset + \width * .Lreg(\base)
> + .Lreg=.Lreg+1
> + .endr
> +.endm
> +
> /*
> * Macros for storing registers into and loading registers from
> * exception frames.
> */
> #ifdef __powerpc64__
> -#define SAVE_GPR(n, base) std n,GPR0+8*(n)(base)
> -#define REST_GPR(n, base) ld n,GPR0+8*(n)(base)
> -#define SAVE_NVGPRS(base) SAVE_8GPRS(14, base); SAVE_10GPRS(22, base)
> -#define REST_NVGPRS(base) REST_8GPRS(14, base); REST_10GPRS(22, base)
> +#define SAVE_GPRS(start, end, base) OP_REGS std, 8, start, end, base, GPR0
> +#define REST_GPRS(start, end, base) OP_REGS ld, 8, start, end, base, GPR0
> +#define SAVE_NVGPRS(base) SAVE_GPRS(14, 31, base)
> +#define REST_NVGPRS(base) REST_GPRS(14, 31, base)
> #else
> -#define SAVE_GPR(n, base) stw n,GPR0+4*(n)(base)
> -#define REST_GPR(n, base) lwz n,GPR0+4*(n)(base)
> -#define SAVE_NVGPRS(base) stmw 13, GPR0+4*13(base)
> -#define REST_NVGPRS(base) lmw 13, GPR0+4*13(base)
> +#define SAVE_GPRS(start, end, base) OP_REGS stw, 4, start, end, base, GPR0
> +#define REST_GPRS(start, end, base) OP_REGS lwz, 4, start, end, base, GPR0
> +#define SAVE_NVGPRS(base) stmw 13, GPR0+4*13(base)
> +#define REST_NVGPRS(base) lmw 13, GPR0+4*13(base)
> #endif
>
> -#define SAVE_2GPRS(n, base) SAVE_GPR(n, base); SAVE_GPR(n+1, base)
> -#define SAVE_4GPRS(n, base) SAVE_2GPRS(n, base); SAVE_2GPRS(n+2, base)
> -#define SAVE_8GPRS(n, base) SAVE_4GPRS(n, base); SAVE_4GPRS(n+4, base)
> -#define SAVE_10GPRS(n, base) SAVE_8GPRS(n, base); SAVE_2GPRS(n+8, base)
> -#define REST_2GPRS(n, base) REST_GPR(n, base); REST_GPR(n+1, base)
> -#define REST_4GPRS(n, base) REST_2GPRS(n, base); REST_2GPRS(n+2, base)
> -#define REST_8GPRS(n, base) REST_4GPRS(n, base); REST_4GPRS(n+4, base)
> -#define REST_10GPRS(n, base) REST_8GPRS(n, base); REST_2GPRS(n+8, base)
> +#define SAVE_GPR(n, base) SAVE_GPRS(n, n, base)
> +#define REST_GPR(n, base) REST_GPRS(n, n, base)
>
> #define SAVE_FPR(n, base) stfd n,8*TS_FPRWIDTH*(n)(base)
> #define SAVE_2FPRS(n, base) SAVE_FPR(n, base); SAVE_FPR(n+1, base)
> diff --git a/arch/powerpc/kernel/entry_32.S b/arch/powerpc/kernel/entry_32.S
> index 61fdd53cdd9a..c62dd9815965 100644
> --- a/arch/powerpc/kernel/entry_32.S
> +++ b/arch/powerpc/kernel/entry_32.S
> @@ -90,8 +90,7 @@ transfer_to_syscall:
> stw r12,8(r1)
> stw r2,_TRAP(r1)
> SAVE_GPR(0, r1)
> - SAVE_4GPRS(3, r1)
> - SAVE_2GPRS(7, r1)
> + SAVE_GPRS(3, 8, r1)
> addi r2,r10,-THREAD
> SAVE_NVGPRS(r1)
>
> @@ -139,7 +138,7 @@ syscall_exit_finish:
> mtxer r5
> lwz r0,GPR0(r1)
> lwz r3,GPR3(r1)
> - REST_8GPRS(4,r1)
> + REST_GPRS(4, 11, r1)
> lwz r12,GPR12(r1)
> b 1b
>
> @@ -232,9 +231,9 @@ fast_exception_return:
> beq 3f /* if not, we've got problems */
> #endif
>
> -2: REST_4GPRS(3, r11)
> +2: REST_GPRS(3, 6, r11)
> lwz r10,_CCR(r11)
> - REST_2GPRS(1, r11)
> + REST_GPRS(1, 2, r11)
> mtcr r10
> lwz r10,_LINK(r11)
> mtlr r10
> @@ -298,16 +297,14 @@ ALT_FTR_SECTION_END_IFCLR(CPU_FTR_STCX_CHECKS_ADDRESS)
> * the reliable stack unwinder later on. Clear it.
> */
> stw r0,8(r1)
> - REST_4GPRS(7, r1)
> - REST_2GPRS(11, r1)
> + REST_GPRS(7, 12, r1)
>
> mtcr r3
> mtlr r4
> mtctr r5
> mtspr SPRN_XER,r6
>
> - REST_4GPRS(2, r1)
> - REST_GPR(6, r1)
> + REST_GPRS(2, 6, r1)
> REST_GPR(0, r1)
> REST_GPR(1, r1)
> rfi
> @@ -341,8 +338,7 @@ ALT_FTR_SECTION_END_IFCLR(CPU_FTR_STCX_CHECKS_ADDRESS)
> lwz r6,_CCR(r1)
> li r0,0
>
> - REST_4GPRS(7, r1)
> - REST_2GPRS(11, r1)
> + REST_GPRS(7, 12, r1)
>
> mtlr r3
> mtctr r4
> @@ -354,7 +350,7 @@ ALT_FTR_SECTION_END_IFCLR(CPU_FTR_STCX_CHECKS_ADDRESS)
> */
> stw r0,8(r1)
>
> - REST_4GPRS(2, r1)
> + REST_GPRS(2, 5, r1)
>
> bne- cr1,1f /* emulate stack store */
> mtcr r6
> @@ -430,8 +426,7 @@ _ASM_NOKPROBE_SYMBOL(interrupt_return)
> bne interrupt_return; \
> lwz r0,GPR0(r1); \
> lwz r2,GPR2(r1); \
> - REST_4GPRS(3, r1); \
> - REST_2GPRS(7, r1); \
> + REST_GPRS(3, 8, r1); \
> lwz r10,_XER(r1); \
> lwz r11,_CTR(r1); \
> mtspr SPRN_XER,r10; \
> diff --git a/arch/powerpc/kernel/exceptions-64e.S b/arch/powerpc/kernel/exceptions-64e.S
> index 711c66b76df1..67dc4e3179a0 100644
> --- a/arch/powerpc/kernel/exceptions-64e.S
> +++ b/arch/powerpc/kernel/exceptions-64e.S
> @@ -198,8 +198,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_EMB_HV)
>
> stdcx. r0,0,r1 /* to clear the reservation */
>
> - REST_4GPRS(2, r1)
> - REST_4GPRS(6, r1)
> + REST_GPRS(2, 9, r1)
>
> ld r10,_CTR(r1)
> ld r11,_XER(r1)
> @@ -375,9 +374,7 @@ ret_from_mc_except:
> exc_##n##_common: \
> std r0,GPR0(r1); /* save r0 in stackframe */ \
> std r2,GPR2(r1); /* save r2 in stackframe */ \
> - SAVE_4GPRS(3, r1); /* save r3 - r6 in stackframe */ \
> - SAVE_2GPRS(7, r1); /* save r7, r8 in stackframe */ \
> - std r9,GPR9(r1); /* save r9 in stackframe */ \
> + SAVE_GPRS(3, 9, r1); /* save r3 - r9 in stackframe */ \
> std r10,_NIP(r1); /* save SRR0 to stackframe */ \
> std r11,_MSR(r1); /* save SRR1 to stackframe */ \
> beq 2f; /* if from kernel mode */ \
> @@ -1061,9 +1058,7 @@ bad_stack_book3e:
> std r11,_ESR(r1)
> std r0,GPR0(r1); /* save r0 in stackframe */ \
> std r2,GPR2(r1); /* save r2 in stackframe */ \
> - SAVE_4GPRS(3, r1); /* save r3 - r6 in stackframe */ \
> - SAVE_2GPRS(7, r1); /* save r7, r8 in stackframe */ \
> - std r9,GPR9(r1); /* save r9 in stackframe */ \
> + SAVE_GPRS(3, 9, r1); /* save r3 - r9 in stackframe */ \
> ld r3,PACA_EXGEN+EX_R10(r13);/* get back r10 */ \
> ld r4,PACA_EXGEN+EX_R11(r13);/* get back r11 */ \
> mfspr r5,SPRN_SPRG_GEN_SCRATCH;/* get back r13 XXX can be wrong */ \
> @@ -1077,8 +1072,7 @@ bad_stack_book3e:
> std r10,_LINK(r1)
> std r11,_CTR(r1)
> std r12,_XER(r1)
> - SAVE_10GPRS(14,r1)
> - SAVE_8GPRS(24,r1)
> + SAVE_GPRS(14, 31, r1)
> lhz r12,PACA_TRAP_SAVE(r13)
> std r12,_TRAP(r1)
> addi r11,r1,INT_FRAME_SIZE
> diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S
> index eaf1f72131a1..277eccf0f086 100644
> --- a/arch/powerpc/kernel/exceptions-64s.S
> +++ b/arch/powerpc/kernel/exceptions-64s.S
> @@ -574,8 +574,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_CFAR)
> ld r10,IAREA+EX_CTR(r13)
> std r10,_CTR(r1)
> std r2,GPR2(r1) /* save r2 in stackframe */
> - SAVE_4GPRS(3, r1) /* save r3 - r6 in stackframe */
> - SAVE_2GPRS(7, r1) /* save r7, r8 in stackframe */
> + SAVE_GPRS(3, 8, r1) /* save r3 - r8 in stackframe */
> mflr r9 /* Get LR, later save to stack */
> ld r2,PACATOC(r13) /* get kernel TOC into r2 */
> std r9,_LINK(r1)
> @@ -693,8 +692,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_CFAR)
> mtlr r9
> ld r9,_CCR(r1)
> mtcr r9
> - REST_8GPRS(2, r1)
> - REST_4GPRS(10, r1)
> + REST_GPRS(2, 13, r1)
> REST_GPR(0, r1)
> /* restore original r1. */
> ld r1,GPR1(r1)
> diff --git a/arch/powerpc/kernel/head_32.h b/arch/powerpc/kernel/head_32.h
> index 6b1ec9e3541b..25887303651a 100644
> --- a/arch/powerpc/kernel/head_32.h
> +++ b/arch/powerpc/kernel/head_32.h
> @@ -115,8 +115,7 @@ _ASM_NOKPROBE_SYMBOL(\name\()_virt)
> stw r10,8(r1)
> li r10, \trapno
> stw r10,_TRAP(r1)
> - SAVE_4GPRS(3, r1)
> - SAVE_2GPRS(7, r1)
> + SAVE_GPRS(3, 8, r1)
> SAVE_NVGPRS(r1)
> stw r2,GPR2(r1)
> stw r12,_NIP(r1)
> diff --git a/arch/powerpc/kernel/head_booke.h b/arch/powerpc/kernel/head_booke.h
> index e5503420b6c6..0ae26396639d 100644
> --- a/arch/powerpc/kernel/head_booke.h
> +++ b/arch/powerpc/kernel/head_booke.h
> @@ -87,8 +87,7 @@ END_BTB_FLUSH_SECTION
> stw r10, 8(r1)
> li r10, \trapno
> stw r10,_TRAP(r1)
> - SAVE_4GPRS(3, r1)
> - SAVE_2GPRS(7, r1)
> + SAVE_GPRS(3, 8, r1)
> SAVE_NVGPRS(r1)
> stw r2,GPR2(r1)
> stw r12,_NIP(r1)
> diff --git a/arch/powerpc/kernel/interrupt_64.S b/arch/powerpc/kernel/interrupt_64.S
> index ec950b08a8dc..2ad223597ca2 100644
> --- a/arch/powerpc/kernel/interrupt_64.S
> +++ b/arch/powerpc/kernel/interrupt_64.S
> @@ -162,10 +162,9 @@ END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
> * The value of AMR only matters while we're in the kernel.
> */
> mtcr r2
> - ld r2,GPR2(r1)
> - ld r3,GPR3(r1)
> - ld r13,GPR13(r1)
> - ld r1,GPR1(r1)
> + REST_GPRS(2, 3, r1)
> + REST_GPR(13, r1)
> + REST_GPR(1, r1)
> RFSCV_TO_USER
> b . /* prevent speculative execution */
>
> @@ -183,9 +182,8 @@ END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
> mtctr r3
> mtlr r4
> mtspr SPRN_XER,r5
> - REST_10GPRS(2, r1)
> - REST_2GPRS(12, r1)
> - ld r1,GPR1(r1)
> + REST_GPRS(2, 13, r1)
> + REST_GPR(1, r1)
> RFI_TO_USER
> .Lsyscall_vectored_\name\()_rst_end:
>
> @@ -374,10 +372,9 @@ END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
> * The value of AMR only matters while we're in the kernel.
> */
> mtcr r2
> - ld r2,GPR2(r1)
> - ld r3,GPR3(r1)
> - ld r13,GPR13(r1)
> - ld r1,GPR1(r1)
> + REST_GPRS(2, 3, r1)
> + REST_GPR(13, r1)
> + REST_GPR(1, r1)
> RFI_TO_USER
> b . /* prevent speculative execution */
>
> @@ -388,8 +385,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
> mtctr r3
> mtspr SPRN_XER,r4
> ld r0,GPR0(r1)
> - REST_8GPRS(4, r1)
> - ld r12,GPR12(r1)
> + REST_GPRS(4, 12, r1)
> b .Lsyscall_restore_regs_cont
> .Lsyscall_rst_end:
>
> @@ -518,17 +514,14 @@ ALT_FTR_SECTION_END_IFCLR(CPU_FTR_STCX_CHECKS_ADDRESS)
> ld r6,_XER(r1)
> li r0,0
>
> - REST_4GPRS(7, r1)
> - REST_2GPRS(11, r1)
> - REST_GPR(13, r1)
> + REST_GPRS(7, 13, r1)
>
> mtcr r3
> mtlr r4
> mtctr r5
> mtspr SPRN_XER,r6
>
> - REST_4GPRS(2, r1)
> - REST_GPR(6, r1)
> + REST_GPRS(2, 6, r1)
> REST_GPR(0, r1)
> REST_GPR(1, r1)
> .ifc \srr,srr
> @@ -625,8 +618,7 @@ ALT_FTR_SECTION_END_IFCLR(CPU_FTR_STCX_CHECKS_ADDRESS)
> ld r6,_CCR(r1)
> li r0,0
>
> - REST_4GPRS(7, r1)
> - REST_2GPRS(11, r1)
> + REST_GPRS(7, 12, r1)
>
> mtlr r3
> mtctr r4
> @@ -638,7 +630,7 @@ ALT_FTR_SECTION_END_IFCLR(CPU_FTR_STCX_CHECKS_ADDRESS)
> */
> std r0,STACK_FRAME_OVERHEAD-16(r1)
>
> - REST_4GPRS(2, r1)
> + REST_GPRS(2, 5, r1)
>
> bne- cr1,1f /* emulate stack store */
> mtcr r6
> diff --git a/arch/powerpc/kernel/optprobes_head.S b/arch/powerpc/kernel/optprobes_head.S
> index 19ea3312403c..5c7f0b4b784b 100644
> --- a/arch/powerpc/kernel/optprobes_head.S
> +++ b/arch/powerpc/kernel/optprobes_head.S
> @@ -10,8 +10,8 @@
> #include <asm/asm-offsets.h>
>
> #ifdef CONFIG_PPC64
> -#define SAVE_30GPRS(base) SAVE_10GPRS(2,base); SAVE_10GPRS(12,base); SAVE_10GPRS(22,base)
> -#define REST_30GPRS(base) REST_10GPRS(2,base); REST_10GPRS(12,base); REST_10GPRS(22,base)
> +#define SAVE_30GPRS(base) SAVE_GPRS(2, 31, base)
> +#define REST_30GPRS(base) REST_GPRS(2, 31, base)
> #define TEMPLATE_FOR_IMM_LOAD_INSNS nop; nop; nop; nop; nop
> #else
> #define SAVE_30GPRS(base) stmw r2, GPR2(base)
> diff --git a/arch/powerpc/kernel/tm.S b/arch/powerpc/kernel/tm.S
> index 2b91f233b05d..3beecc32940b 100644
> --- a/arch/powerpc/kernel/tm.S
> +++ b/arch/powerpc/kernel/tm.S
> @@ -226,11 +226,8 @@ _GLOBAL(tm_reclaim)
>
> /* Sync the userland GPRs 2-12, 14-31 to thread->regs: */
> SAVE_GPR(0, r7) /* user r0 */
> - SAVE_GPR(2, r7) /* user r2 */
> - SAVE_4GPRS(3, r7) /* user r3-r6 */
> - SAVE_GPR(8, r7) /* user r8 */
> - SAVE_GPR(9, r7) /* user r9 */
> - SAVE_GPR(10, r7) /* user r10 */
> + SAVE_GPRS(2, 6, r7) /* user r2-r6 */
> + SAVE_GPRS(8, 10, r7) /* user r8-r10 */
> ld r3, GPR1(r1) /* user r1 */
> ld r4, GPR7(r1) /* user r7 */
> ld r5, GPR11(r1) /* user r11 */
> @@ -445,12 +442,8 @@ restore_gprs:
> ld r6, THREAD_TM_PPR(r3)
>
> REST_GPR(0, r7) /* GPR0 */
> - REST_2GPRS(2, r7) /* GPR2-3 */
> - REST_GPR(4, r7) /* GPR4 */
> - REST_4GPRS(8, r7) /* GPR8-11 */
> - REST_2GPRS(12, r7) /* GPR12-13 */
> -
> - REST_NVGPRS(r7) /* GPR14-31 */
> + REST_GPRS(2, 4, r7) /* GPR2-4 */
> + REST_GPRS(8, 31, r7) /* GPR8-31 */
>
> /* Load up PPR and DSCR here so we don't run with user values for long */
> mtspr SPRN_DSCR, r5
> diff --git a/arch/powerpc/kernel/trace/ftrace_64_mprofile.S b/arch/powerpc/kernel/trace/ftrace_64_mprofile.S
> index f9fd5f743eba..d636fc755f60 100644
> --- a/arch/powerpc/kernel/trace/ftrace_64_mprofile.S
> +++ b/arch/powerpc/kernel/trace/ftrace_64_mprofile.S
> @@ -41,15 +41,14 @@ _GLOBAL(ftrace_regs_caller)
>
> /* Save all gprs to pt_regs */
> SAVE_GPR(0, r1)
> - SAVE_10GPRS(2, r1)
> + SAVE_GPRS(2, 11, r1)
>
> /* Ok to continue? */
> lbz r3, PACA_FTRACE_ENABLED(r13)
> cmpdi r3, 0
> beq ftrace_no_trace
>
> - SAVE_10GPRS(12, r1)
> - SAVE_10GPRS(22, r1)
> + SAVE_GPRS(12, 31, r1)
>
> /* Save previous stack pointer (r1) */
> addi r8, r1, SWITCH_FRAME_SIZE
> @@ -108,10 +107,8 @@ ftrace_regs_call:
> #endif
>
> /* Restore gprs */
> - REST_GPR(0,r1)
> - REST_10GPRS(2,r1)
> - REST_10GPRS(12,r1)
> - REST_10GPRS(22,r1)
> + REST_GPR(0, r1)
> + REST_GPRS(2, 31, r1)
>
> /* Restore possibly modified LR */
> ld r0, _LINK(r1)
> @@ -157,7 +154,7 @@ _GLOBAL(ftrace_caller)
> stdu r1, -SWITCH_FRAME_SIZE(r1)
>
> /* Save all gprs to pt_regs */
> - SAVE_8GPRS(3, r1)
> + SAVE_GPRS(3, 10, r1)
>
> lbz r3, PACA_FTRACE_ENABLED(r13)
> cmpdi r3, 0
> @@ -194,7 +191,7 @@ ftrace_call:
> mtctr r3
>
> /* Restore gprs */
> - REST_8GPRS(3,r1)
> + REST_GPRS(3, 10, r1)
>
> /* Restore callee's TOC */
> ld r2, 24(r1)
> diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S b/arch/powerpc/kvm/book3s_hv_rmhandlers.S
> index eb776d0c5d8e..28be10db895d 100644
> --- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S
> +++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S
> @@ -2711,8 +2711,7 @@ kvmppc_bad_host_intr:
> std r0, GPR0(r1)
> std r9, GPR1(r1)
> std r2, GPR2(r1)
> - SAVE_4GPRS(3, r1)
> - SAVE_2GPRS(7, r1)
> + SAVE_GPRS(3, 8, r1)
> srdi r0, r12, 32
> clrldi r12, r12, 32
> std r0, _CCR(r1)
> @@ -2735,7 +2734,7 @@ kvmppc_bad_host_intr:
> ld r9, HSTATE_SCRATCH2(r13)
> ld r12, HSTATE_SCRATCH0(r13)
> GET_SCRATCH0(r0)
> - SAVE_4GPRS(9, r1)
> + SAVE_GPRS(9, 12, r1)
> std r0, GPR13(r1)
> SAVE_NVGPRS(r1)
> ld r5, HSTATE_CFAR(r13)
> diff --git a/arch/powerpc/lib/test_emulate_step_exec_instr.S b/arch/powerpc/lib/test_emulate_step_exec_instr.S
> index 9ef941d958d8..5473f9d03df3 100644
> --- a/arch/powerpc/lib/test_emulate_step_exec_instr.S
> +++ b/arch/powerpc/lib/test_emulate_step_exec_instr.S
> @@ -37,7 +37,7 @@ _GLOBAL(exec_instr)
> * The stack pointer (GPR1) and the thread pointer (GPR13) are not
> * saved as these should not be modified anyway.
> */
> - SAVE_2GPRS(2, r1)
> + SAVE_GPRS(2, 3, r1)
> SAVE_NVGPRS(r1)
>
> /*
> @@ -75,8 +75,7 @@ _GLOBAL(exec_instr)
>
> /* Load GPRs from pt_regs */
> REST_GPR(0, r31)
> - REST_10GPRS(2, r31)
> - REST_GPR(12, r31)
> + REST_GPRS(2, 12, r31)
> REST_NVGPRS(r31)
>
> /* Placeholder for the test instruction */
> @@ -99,8 +98,7 @@ _GLOBAL(exec_instr)
> subi r3, r3, GPR0
> SAVE_GPR(0, r3)
> SAVE_GPR(2, r3)
> - SAVE_8GPRS(4, r3)
> - SAVE_GPR(12, r3)
> + SAVE_GPRS(4, 12, r3)
> SAVE_NVGPRS(r3)
>
> /* Save resulting LR to pt_regs */
>
next prev parent reply other threads:[~2021-10-22 7:46 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-10-22 6:13 [PATCH v2] powerpc: flexible GPR range save/restore macros Nicholas Piggin
2021-10-22 7:45 ` Christophe Leroy [this message]
2021-12-07 13:26 ` Michael Ellerman
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=47b88d64-c30d-1d0e-99aa-2f4002c9d705@csgroup.eu \
--to=christophe.leroy@csgroup.eu \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=npiggin@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.