ACK: [SRU][Bionic][PATCH v2] powerpc/powernv/idle: Restore AMR/UAMOR/AMOR after idle
Colin Ian King
colin.king at canonical.com
Tue Apr 21 09:33:25 UTC 2020
On 21/04/2020 10: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>
> ---
> 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)
>
>
Clean cherry pick, been around since 2019, so looks good. Thanks Juerg.
Acked-by: Colin Ian King <colin.king at canonical.com>
More information about the kernel-team
mailing list