ACK: [SRU][Bionic][PATCH v2] powerpc/powernv/idle: Restore AMR/UAMOR/AMOR after idle

Kleber Souza kleber.souza at canonical.com
Tue Apr 21 09:38:25 UTC 2020


On 21.04.20 11:27, Juerg Haefliger wrote:
> From: Michael Ellerman <mpe at ellerman.id.au>
> 
> BugLink: https://bugs.launchpad.net/bugs/1874005
> 
> In order to implement KUAP (Kernel Userspace Access Protection) on
> Power9 we will be using the AMR, and therefore indirectly the
> UAMOR/AMOR.
> 
> So save/restore these regs in the idle code.
> 
> Signed-off-by: Michael Ellerman <mpe at ellerman.id.au>
> 
> (cherry picked from commit 53a712bae5dd919521a58d7bad773b949358add0)
> Signed-off-by: Juerg Haefliger <juergh at canonical.com>

Acked-by: Kleber Sacilotto de Souza <kleber.souza at canonical.com>

> ---
>  arch/powerpc/kernel/idle_book3s.S | 27 +++++++++++++++++++++++----
>  1 file changed, 23 insertions(+), 4 deletions(-)
> 
> diff --git a/arch/powerpc/kernel/idle_book3s.S b/arch/powerpc/kernel/idle_book3s.S
> index 785d67255b29..a02e7f2a2f65 100644
> --- a/arch/powerpc/kernel/idle_book3s.S
> +++ b/arch/powerpc/kernel/idle_book3s.S
> @@ -168,8 +168,11 @@ core_idle_lock_held:
>  	bne-	core_idle_lock_held
>  	blr
>  
> -/* Reuse an unused pt_regs slot for IAMR */
> +/* Reuse some unused pt_regs slots for AMR/IAMR/UAMOR/UAMOR */
> +#define PNV_POWERSAVE_AMR	_TRAP
>  #define PNV_POWERSAVE_IAMR	_DAR
> +#define PNV_POWERSAVE_UAMOR	_DSISR
> +#define PNV_POWERSAVE_AMOR	RESULT
>  
>  /*
>   * Pass requested state in r3:
> @@ -203,8 +206,16 @@ pnv_powersave_common:
>  	SAVE_NVGPRS(r1)
>  
>  BEGIN_FTR_SECTION
> +	mfspr	r4, SPRN_AMR
>  	mfspr	r5, SPRN_IAMR
> +	mfspr	r6, SPRN_UAMOR
> +	std	r4, PNV_POWERSAVE_AMR(r1)
>  	std	r5, PNV_POWERSAVE_IAMR(r1)
> +	std	r6, PNV_POWERSAVE_UAMOR(r1)
> +BEGIN_FTR_SECTION_NESTED(42)
> +	mfspr	r7, SPRN_AMOR
> +	std	r7, PNV_POWERSAVE_AMOR(r1)
> +END_FTR_SECTION_NESTED_IFSET(CPU_FTR_HVMODE, 42)
>  END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
>  
>  	mfcr	r5
> @@ -968,12 +979,20 @@ END_FTR_SECTION_IFSET(CPU_FTR_HVMODE)
>  	REST_GPR(2, r1)
>  
>  BEGIN_FTR_SECTION
> -	/* IAMR was saved in pnv_powersave_common() */
> +	/* These regs were saved in pnv_powersave_common() */
> +	ld	r4, PNV_POWERSAVE_AMR(r1)
>  	ld	r5, PNV_POWERSAVE_IAMR(r1)
> +	ld	r6, PNV_POWERSAVE_UAMOR(r1)
> +	mtspr	SPRN_AMR, r4
>  	mtspr	SPRN_IAMR, r5
> +	mtspr	SPRN_UAMOR, r6
> +BEGIN_FTR_SECTION_NESTED(42)
> +	ld	r7, PNV_POWERSAVE_AMOR(r1)
> +	mtspr	SPRN_AMOR, r7
> +END_FTR_SECTION_NESTED_IFSET(CPU_FTR_HVMODE, 42)
>  	/*
> -	 * We don't need an isync here because the upcoming mtmsrd is
> -	 * execution synchronizing.
> +	 * We don't need an isync here after restoring IAMR because the upcoming
> +	 * mtmsrd is execution synchronizing.
>  	 */
>  END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
>  
> 




More information about the kernel-team mailing list