Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1855c543 authored by Michael Ellerman's avatar Michael Ellerman Committed by Greg Kroah-Hartman
Browse files

powerpc/powernv/idle: Restore AMR/UAMOR/AMOR after idle



commit 53a712bae5dd919521a58d7bad773b949358add0 upstream.

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: default avatarMichael Ellerman <mpe@ellerman.id.au>
[ajd: Backport to 4.19 tree, CVE-2020-11669]
Signed-off-by: default avatarAndrew Donnellan <ajd@linux.ibm.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 5f547e7c
Loading
Loading
Loading
Loading
+23 −4
Original line number Original line Diff line number Diff line
@@ -170,8 +170,11 @@ core_idle_lock_held:
	bne-	core_idle_lock_held
	bne-	core_idle_lock_held
	blr
	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_IAMR	_DAR
#define PNV_POWERSAVE_UAMOR	_DSISR
#define PNV_POWERSAVE_AMOR	RESULT


/*
/*
 * Pass requested state in r3:
 * Pass requested state in r3:
@@ -205,8 +208,16 @@ pnv_powersave_common:
	SAVE_NVGPRS(r1)
	SAVE_NVGPRS(r1)


BEGIN_FTR_SECTION
BEGIN_FTR_SECTION
	mfspr	r4, SPRN_AMR
	mfspr	r5, SPRN_IAMR
	mfspr	r5, SPRN_IAMR
	mfspr	r6, SPRN_UAMOR
	std	r4, PNV_POWERSAVE_AMR(r1)
	std	r5, PNV_POWERSAVE_IAMR(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)
END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)


	mfcr	r5
	mfcr	r5
@@ -935,12 +946,20 @@ END_FTR_SECTION_IFSET(CPU_FTR_HVMODE)
	REST_GPR(2, r1)
	REST_GPR(2, r1)


BEGIN_FTR_SECTION
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	r5, PNV_POWERSAVE_IAMR(r1)
	ld	r6, PNV_POWERSAVE_UAMOR(r1)
	mtspr	SPRN_AMR, r4
	mtspr	SPRN_IAMR, r5
	mtspr	SPRN_IAMR, r5
	/*
	mtspr	SPRN_UAMOR, r6
	 * We don't need an isync here because the upcoming mtmsrd is
BEGIN_FTR_SECTION_NESTED(42)
	 * execution synchronizing.
	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 after restoring IAMR because the upcoming
	 * mtmsrd is execution synchronizing.
	 */
	 */
END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)