[PATCH] powerpc/kvm: Save and restore AMR instead of zeroing

Russell Currey ruscur at russell.cc
Thu Feb 21 15:00:16 AEDT 2019


On Thu, 2019-02-21 at 10:55 +1100, Paul Mackerras wrote:
> On Wed, Feb 20, 2019 at 03:59:58PM +1100, Russell Currey wrote:
> > Using the hash MMU on P7+, the AMR is used for pkeys.  It's
> > important
> 
> This needs a bit of rewording.  The "Using" ... "used" construct is a
> bit confusing on the first read.  Also, there was a processor called
> P7+, but I think you're trying to say P7 and subsequent processors.

Okay, will do.

> 
> > that the host and guest never end up with each other's AMR value,
> > since
> > this could disrupt operations and break things.
> 
> What sort of breakage?  Guest kernel crash?  Host kernel crash?

Well you'll have incorrect pkeys.  It wouldn't cause a kernel crash,
but it could mean a userspace program could no longer access data it
had protected, or that its protected data is now unprotected.

> 
> > The AMR gets correctly restored on context switch, however before
> > this
> > happens (i.e. in a program like qemu) having the host value of the
> > AMR
> > be zero would interfere with that program using pkeys.
> > 
> > In addition, the AMR on Radix can control kernel access to
> > userspace
> > data, which you wouldn't want to be zeroed.
> > 
> > So, just save and restore it like the other registers that get
> > saved and
> > restored.
> > 
> > Fixes: cf43d3b26452 ("powerpc: Enable pkey subsystem")
> > Cc: <stable at vger.kernel.org> # v4.16+
> > Signed-off-by: Russell Currey <ruscur at russell.cc>
> > ---
> > I'm not entirely sure the stack frame numbers are correct, I've
> > tested it
> > and it works but it'd be good if someone could double check this.
> > 
> >  arch/powerpc/kvm/book3s_hv_rmhandlers.S | 13 +++++++++----
> >  1 file changed, 9 insertions(+), 4 deletions(-)
> > 
> > diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S
> > b/arch/powerpc/kvm/book3s_hv_rmhandlers.S
> > index 9b8d50a7cbaf..6291751c4ad9 100644
> > --- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S
> > +++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S
> > @@ -47,7 +47,7 @@ END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_300)
> >  #define NAPPING_NOVCPU	2
> >  
> >  /* Stack frame offsets for kvmppc_hv_entry */
> > -#define SFS			208
> > +#define SFS			224		/* must be
> > divisible by 16 */
> 
> I don't think this needs to be increased.  What's happening here is
> that we have a "short path" where most SPRs are saved/loaded/restored
> etc. in C code in book3s_hv.c, and that path uses 144 bytes on the
> stack to save/restore 18 GPR values (r14 - r31).  Your patch needs to
> add code to context-switch AMR in kvmhv_p9_guest_entry() to fix that
> path.

Michael has already sent a separate patch to do this - separate because
that path is only used with radix guests on a radix host, right?  And
since radix doesn't make use of the AMR (yet) it's not a bug.

http://patchwork.ozlabs.org/patch/1045215/

(with an incorrect title)

> 
> Alternatively there is the slow path where we go to real mode and do
> most of the SPR loading in assembler code.  That path uses the stack
> to store host SPR values in STACK_SLOT_TID, PSSCR, PID, etc.
> 
> >  #define STACK_SLOT_TRAP		(SFS-4)
> >  #define STACK_SLOT_SHORT_PATH	(SFS-8)
> >  #define STACK_SLOT_TID		(SFS-16)
> > @@ -58,8 +58,9 @@ END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_300)
> >  #define STACK_SLOT_DAWR		(SFS-56)
> >  #define STACK_SLOT_DAWRX	(SFS-64)
> >  #define STACK_SLOT_HFSCR	(SFS-72)
> > +#define STACK_SLOT_AMR		(SFS-80)
> >  /* the following is used by the P9 short path */
> > -#define STACK_SLOT_NVGPRS	(SFS-152)	/* 18 gprs */
> > +#define STACK_SLOT_NVGPRS	(SFS-160)	/* 18 gprs */
> 
> I don't see why you need to change this either.

So I can just add the AMR at -80 and leave everything else?

> 
> >  
> >  /*
> >   * Call kvmppc_hv_entry in real mode.
> > @@ -743,6 +744,9 @@ BEGIN_FTR_SECTION
> >  	std	r7, STACK_SLOT_DAWRX(r1)
> >  END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
> >  
> > +	mfspr	r5, SPRN_AMR
> > +	std	r5, STACK_SLOT_AMR(r1)
> > +
> >  BEGIN_FTR_SECTION
> >  	/* Set partition DABR */
> >  	/* Do this before re-enabling PMU to avoid P7 DABR corruption
> > bug */
> > @@ -1640,13 +1644,14 @@ BEGIN_FTR_SECTION
> >  END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_300)
> >  8:
> >  
> > -	/* Save and reset AMR and UAMOR before turning on the MMU */
> > +	/* Save and restore/reset AMR and UAMOR before turning on the
> > MMU */
> >  	mfspr	r5,SPRN_AMR
> >  	mfspr	r6,SPRN_UAMOR
> >  	std	r5,VCPU_AMR(r9)
> >  	std	r6,VCPU_UAMOR(r9)
> > +	ld	r5,STACK_SLOT_AMR(r1)
> >  	li	r6,0
> > -	mtspr	SPRN_AMR,r6
> > +	mtspr	SPRN_AMR, r5
> >  	mtspr	SPRN_UAMOR, r6
> >  
> >  	/* Switch DSCR back to host value */
> > -- 
> > 2.20.1
> 
> Rest looks fine, but as I said, the patch needs to hit
> kvmhv_p9_guest_entry() also.
> 
> Paul.



More information about the Linuxppc-dev mailing list