[PATCH v2] powerpc: flexible GPR range save/restore macros
Christophe Leroy
christophe.leroy at csgroup.eu
Fri Oct 22 18:45:30 AEDT 2021
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 at kernel.crashing.org>
> Signed-off-by: Nicholas Piggin <npiggin at gmail.com>
Reviewed-by: Christophe Leroy <christophe.leroy at 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 */
>
More information about the Linuxppc-dev
mailing list