linuxppc-dev.lists.ozlabs.org archive mirror
 help / color / mirror / Atom feed
* BOOKE KVM calling load_up_fpu from C?
@ 2013-02-12  3:29 Michael Neuling
  2013-02-12  3:37 ` Bhushan Bharat-R65777
  0 siblings, 1 reply; 13+ messages in thread
From: Michael Neuling @ 2013-02-12  3:29 UTC (permalink / raw)
  To: Scott Wood; +Cc: linuxppc-dev

Scott,

I was looking at changing how load_up_fpu works and I found this in
arch/powerpc/kvm/booke.h:

static inline void kvmppc_load_guest_fp(struct kvm_vcpu *vcpu)
{
#ifdef CONFIG_PPC_FPU
	if (vcpu->fpu_active && !(current->thread.regs->msr & MSR_FP)) {
		load_up_fpu();
		current->thread.regs->msr |= MSR_FP;
	}
#endif
}

I'm wondering how this is suppose to work since load_up_fpu is suppose
to have MSR in R12?

Mikey

^ permalink raw reply	[flat|nested] 13+ messages in thread

* RE: BOOKE KVM calling load_up_fpu from C?
  2013-02-12  3:29 BOOKE KVM calling load_up_fpu from C? Michael Neuling
@ 2013-02-12  3:37 ` Bhushan Bharat-R65777
  2013-02-12  3:46   ` Michael Neuling
  0 siblings, 1 reply; 13+ messages in thread
From: Bhushan Bharat-R65777 @ 2013-02-12  3:37 UTC (permalink / raw)
  To: Michael Neuling, Wood Scott-B07421; +Cc: linuxppc-dev@lists.ozlabs.org



> -----Original Message-----
> From: Linuxppc-dev [mailto:linuxppc-dev-
> bounces+bharat.bhushan=3Dfreescale.com@lists.ozlabs.org] On Behalf Of Mic=
hael
> Neuling
> Sent: Tuesday, February 12, 2013 8:59 AM
> To: Wood Scott-B07421
> Cc: linuxppc-dev@lists.ozlabs.org
> Subject: BOOKE KVM calling load_up_fpu from C?
>=20
> Scott,
>=20
> I was looking at changing how load_up_fpu works and I found this in
> arch/powerpc/kvm/booke.h:
>=20
> static inline void kvmppc_load_guest_fp(struct kvm_vcpu *vcpu) { #ifdef
> CONFIG_PPC_FPU
> 	if (vcpu->fpu_active && !(current->thread.regs->msr & MSR_FP)) {
> 		load_up_fpu();
> 		current->thread.regs->msr |=3D MSR_FP;
> 	}
> #endif
> }
>=20
> I'm wondering how this is suppose to work since load_up_fpu is suppose to=
 have
> MSR in R12?

Is not the load_up_fpu() does mfmsr:

_GLOBAL(load_up_fpu)
        mfmsr   r5
        ori     r5,r5,MSR_FP
#ifdef CONFIG_VSX
BEGIN_FTR_SECTION
        oris    r5,r5,MSR_VSX@h
END_FTR_SECTION_IFSET(CPU_FTR_VSX)
#endif
        SYNC
        MTMSRD(r5)                      /* enable use of fpu now */
        isync
<snip>

-Bharat

>=20
> Mikey
> _______________________________________________
> Linuxppc-dev mailing list
> Linuxppc-dev@lists.ozlabs.org
> https://lists.ozlabs.org/listinfo/linuxppc-dev

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: BOOKE KVM calling load_up_fpu from C?
  2013-02-12  3:37 ` Bhushan Bharat-R65777
@ 2013-02-12  3:46   ` Michael Neuling
  2013-02-12  3:58     ` Bhushan Bharat-R65777
  0 siblings, 1 reply; 13+ messages in thread
From: Michael Neuling @ 2013-02-12  3:46 UTC (permalink / raw)
  To: Bhushan Bharat-R65777; +Cc: Wood Scott-B07421, linuxppc-dev@lists.ozlabs.org

Bhushan Bharat-R65777 <R65777@freescale.com> wrote:

> 
> 
> > -----Original Message-----
> > From: Linuxppc-dev [mailto:linuxppc-dev-
> > bounces+bharat.bhushan=freescale.com@lists.ozlabs.org] On Behalf Of Michael
> > Neuling
> > Sent: Tuesday, February 12, 2013 8:59 AM
> > To: Wood Scott-B07421
> > Cc: linuxppc-dev@lists.ozlabs.org
> > Subject: BOOKE KVM calling load_up_fpu from C?
> > 
> > Scott,
> > 
> > I was looking at changing how load_up_fpu works and I found this in
> > arch/powerpc/kvm/booke.h:
> > 
> > static inline void kvmppc_load_guest_fp(struct kvm_vcpu *vcpu) { #ifdef
> > CONFIG_PPC_FPU
> > 	if (vcpu->fpu_active && !(current->thread.regs->msr & MSR_FP)) {
> > 		load_up_fpu();
> > 		current->thread.regs->msr |= MSR_FP;
> > 	}
> > #endif
> > }
> > 
> > I'm wondering how this is suppose to work since load_up_fpu is suppose to have
> > MSR in R12?
> 
> Is not the load_up_fpu() does mfmsr:
> 
> _GLOBAL(load_up_fpu)
>         mfmsr   r5
>         ori     r5,r5,MSR_FP
> #ifdef CONFIG_VSX
> BEGIN_FTR_SECTION
>         oris    r5,r5,MSR_VSX@h
> END_FTR_SECTION_IFSET(CPU_FTR_VSX)
> #endif
>         SYNC
>         MTMSRD(r5)                      /* enable use of fpu now */
>         isync
> <snip>

Look further down...

#ifdef CONFIG_PPC32
	mfspr	r5,SPRN_SPRG_THREAD		/* current task's THREAD (phys) */
	lwz	r4,THREAD_FPEXC_MODE(r5)
	ori	r9,r9,MSR_FP		/* enable FP for current */
	or	r9,r9,r4
#else
	ld	r4,PACACURRENT(r13)
	addi	r5,r4,THREAD		/* Get THREAD */
	lwz	r4,THREAD_FPEXC_MODE(r5)
	ori	r12,r12,MSR_FP
	or	r12,r12,r4
	std	r12,_MSR(r1)
#endif

R12 is loaded with SRR1 in the exception prolog before load_up_fpu is
called.  It's the MSR of the user process, not the current MSR.

Mikey

^ permalink raw reply	[flat|nested] 13+ messages in thread

* RE: BOOKE KVM calling load_up_fpu from C?
  2013-02-12  3:46   ` Michael Neuling
@ 2013-02-12  3:58     ` Bhushan Bharat-R65777
  2013-02-12  4:16       ` Michael Neuling
  0 siblings, 1 reply; 13+ messages in thread
From: Bhushan Bharat-R65777 @ 2013-02-12  3:58 UTC (permalink / raw)
  To: Michael Neuling; +Cc: Wood Scott-B07421, linuxppc-dev@lists.ozlabs.org



> -----Original Message-----
> From: Michael Neuling [mailto:mikey@neuling.org]
> Sent: Tuesday, February 12, 2013 9:16 AM
> To: Bhushan Bharat-R65777
> Cc: Wood Scott-B07421; linuxppc-dev@lists.ozlabs.org
> Subject: Re: BOOKE KVM calling load_up_fpu from C?
>=20
> Bhushan Bharat-R65777 <R65777@freescale.com> wrote:
>=20
> >
> >
> > > -----Original Message-----
> > > From: Linuxppc-dev [mailto:linuxppc-dev-
> > > bounces+bharat.bhushan=3Dfreescale.com@lists.ozlabs.org] On Behalf Of
> > > bounces+Michael
> > > Neuling
> > > Sent: Tuesday, February 12, 2013 8:59 AM
> > > To: Wood Scott-B07421
> > > Cc: linuxppc-dev@lists.ozlabs.org
> > > Subject: BOOKE KVM calling load_up_fpu from C?
> > >
> > > Scott,
> > >
> > > I was looking at changing how load_up_fpu works and I found this in
> > > arch/powerpc/kvm/booke.h:
> > >
> > > static inline void kvmppc_load_guest_fp(struct kvm_vcpu *vcpu) {
> > > #ifdef CONFIG_PPC_FPU
> > > 	if (vcpu->fpu_active && !(current->thread.regs->msr & MSR_FP)) {
> > > 		load_up_fpu();
> > > 		current->thread.regs->msr |=3D MSR_FP;
> > > 	}
> > > #endif
> > > }
> > >
> > > I'm wondering how this is suppose to work since load_up_fpu is
> > > suppose to have MSR in R12?
> >
> > Is not the load_up_fpu() does mfmsr:
> >
> > _GLOBAL(load_up_fpu)
> >         mfmsr   r5
> >         ori     r5,r5,MSR_FP
> > #ifdef CONFIG_VSX
> > BEGIN_FTR_SECTION
> >         oris    r5,r5,MSR_VSX@h
> > END_FTR_SECTION_IFSET(CPU_FTR_VSX)
> > #endif
> >         SYNC
> >         MTMSRD(r5)                      /* enable use of fpu now */
> >         isync
> > <snip>
>=20
> Look further down...
>=20
> #ifdef CONFIG_PPC32
> 	mfspr	r5,SPRN_SPRG_THREAD		/* current task's THREAD (phys) */
> 	lwz	r4,THREAD_FPEXC_MODE(r5)
> 	ori	r9,r9,MSR_FP		/* enable FP for current */
> 	or	r9,r9,r4
> #else
> 	ld	r4,PACACURRENT(r13)
> 	addi	r5,r4,THREAD		/* Get THREAD */
> 	lwz	r4,THREAD_FPEXC_MODE(r5)
> 	ori	r12,r12,MSR_FP
> 	or	r12,r12,r4
> 	std	r12,_MSR(r1)
> #endif
>=20
> R12 is loaded with SRR1 in the exception prolog before load_up_fpu is cal=
led.

Yes it is SRR1 not MSR.
Also on 32bit it looks like that R9 is assumed to have SRR1.

-Bharat

> It's the MSR of the user process, not the current MSR.
>=20
> Mikey

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: BOOKE KVM calling load_up_fpu from C?
  2013-02-12  3:58     ` Bhushan Bharat-R65777
@ 2013-02-12  4:16       ` Michael Neuling
  2013-02-12  9:01         ` Bhushan Bharat-R65777
  0 siblings, 1 reply; 13+ messages in thread
From: Michael Neuling @ 2013-02-12  4:16 UTC (permalink / raw)
  To: Bhushan Bharat-R65777; +Cc: Wood Scott-B07421, linuxppc-dev@lists.ozlabs.org

Bhushan Bharat-R65777 <R65777@freescale.com> wrote:

> 
> 
> > -----Original Message-----
> > From: Michael Neuling [mailto:mikey@neuling.org]
> > Sent: Tuesday, February 12, 2013 9:16 AM
> > To: Bhushan Bharat-R65777
> > Cc: Wood Scott-B07421; linuxppc-dev@lists.ozlabs.org
> > Subject: Re: BOOKE KVM calling load_up_fpu from C?
> > 
> > Bhushan Bharat-R65777 <R65777@freescale.com> wrote:
> > 
> > >
> > >
> > > > -----Original Message-----
> > > > From: Linuxppc-dev [mailto:linuxppc-dev-
> > > > bounces+bharat.bhushan=freescale.com@lists.ozlabs.org] On Behalf Of
> > > > bounces+Michael
> > > > Neuling
> > > > Sent: Tuesday, February 12, 2013 8:59 AM
> > > > To: Wood Scott-B07421
> > > > Cc: linuxppc-dev@lists.ozlabs.org
> > > > Subject: BOOKE KVM calling load_up_fpu from C?
> > > >
> > > > Scott,
> > > >
> > > > I was looking at changing how load_up_fpu works and I found this in
> > > > arch/powerpc/kvm/booke.h:
> > > >
> > > > static inline void kvmppc_load_guest_fp(struct kvm_vcpu *vcpu) {
> > > > #ifdef CONFIG_PPC_FPU
> > > > 	if (vcpu->fpu_active && !(current->thread.regs->msr & MSR_FP)) {
> > > > 		load_up_fpu();
> > > > 		current->thread.regs->msr |= MSR_FP;
> > > > 	}
> > > > #endif
> > > > }
> > > >
> > > > I'm wondering how this is suppose to work since load_up_fpu is
> > > > suppose to have MSR in R12?
> > >
> > > Is not the load_up_fpu() does mfmsr:
> > >
> > > _GLOBAL(load_up_fpu)
> > >         mfmsr   r5
> > >         ori     r5,r5,MSR_FP
> > > #ifdef CONFIG_VSX
> > > BEGIN_FTR_SECTION
> > >         oris    r5,r5,MSR_VSX@h
> > > END_FTR_SECTION_IFSET(CPU_FTR_VSX)
> > > #endif
> > >         SYNC
> > >         MTMSRD(r5)                      /* enable use of fpu now */
> > >         isync
> > > <snip>
> > 
> > Look further down...
> > 
> > #ifdef CONFIG_PPC32
> > 	mfspr	r5,SPRN_SPRG_THREAD		/* current task's THREAD (phys) */
> > 	lwz	r4,THREAD_FPEXC_MODE(r5)
> > 	ori	r9,r9,MSR_FP		/* enable FP for current */
> > 	or	r9,r9,r4
> > #else
> > 	ld	r4,PACACURRENT(r13)
> > 	addi	r5,r4,THREAD		/* Get THREAD */
> > 	lwz	r4,THREAD_FPEXC_MODE(r5)
> > 	ori	r12,r12,MSR_FP
> > 	or	r12,r12,r4
> > 	std	r12,_MSR(r1)
> > #endif
> > 
> > R12 is loaded with SRR1 in the exception prolog before load_up_fpu is called.
> 
> Yes it is SRR1 not MSR.

Yes, SRR1 == the MSR of the user process, not the current MSR.

> Also on 32bit it looks like that R9 is assumed to have SRR1.

Yep that too.  

So any idea how it's suppose to work or is it broken?

Mikey

^ permalink raw reply	[flat|nested] 13+ messages in thread

* RE: BOOKE KVM calling load_up_fpu from C?
  2013-02-12  4:16       ` Michael Neuling
@ 2013-02-12  9:01         ` Bhushan Bharat-R65777
  2013-02-12 18:33           ` Scott Wood
  0 siblings, 1 reply; 13+ messages in thread
From: Bhushan Bharat-R65777 @ 2013-02-12  9:01 UTC (permalink / raw)
  To: Michael Neuling; +Cc: Wood Scott-B07421, linuxppc-dev@lists.ozlabs.org



> -----Original Message-----
> From: Michael Neuling [mailto:mikey@neuling.org]
> Sent: Tuesday, February 12, 2013 9:46 AM
> To: Bhushan Bharat-R65777
> Cc: Wood Scott-B07421; linuxppc-dev@lists.ozlabs.org
> Subject: Re: BOOKE KVM calling load_up_fpu from C?
>=20
> Bhushan Bharat-R65777 <R65777@freescale.com> wrote:
>=20
> >
> >
> > > -----Original Message-----
> > > From: Michael Neuling [mailto:mikey@neuling.org]
> > > Sent: Tuesday, February 12, 2013 9:16 AM
> > > To: Bhushan Bharat-R65777
> > > Cc: Wood Scott-B07421; linuxppc-dev@lists.ozlabs.org
> > > Subject: Re: BOOKE KVM calling load_up_fpu from C?
> > >
> > > Bhushan Bharat-R65777 <R65777@freescale.com> wrote:
> > >
> > > >
> > > >
> > > > > -----Original Message-----
> > > > > From: Linuxppc-dev [mailto:linuxppc-dev-
> > > > > bounces+bharat.bhushan=3Dfreescale.com@lists.ozlabs.org] On Behal=
f
> > > > > bounces+Of Michael
> > > > > Neuling
> > > > > Sent: Tuesday, February 12, 2013 8:59 AM
> > > > > To: Wood Scott-B07421
> > > > > Cc: linuxppc-dev@lists.ozlabs.org
> > > > > Subject: BOOKE KVM calling load_up_fpu from C?
> > > > >
> > > > > Scott,
> > > > >
> > > > > I was looking at changing how load_up_fpu works and I found this
> > > > > in
> > > > > arch/powerpc/kvm/booke.h:
> > > > >
> > > > > static inline void kvmppc_load_guest_fp(struct kvm_vcpu *vcpu) {
> > > > > #ifdef CONFIG_PPC_FPU
> > > > > 	if (vcpu->fpu_active && !(current->thread.regs->msr & MSR_FP)) {
> > > > > 		load_up_fpu();
> > > > > 		current->thread.regs->msr |=3D MSR_FP;
> > > > > 	}
> > > > > #endif
> > > > > }
> > > > >
> > > > > I'm wondering how this is suppose to work since load_up_fpu is
> > > > > suppose to have MSR in R12?
> > > >
> > > > Is not the load_up_fpu() does mfmsr:
> > > >
> > > > _GLOBAL(load_up_fpu)
> > > >         mfmsr   r5
> > > >         ori     r5,r5,MSR_FP
> > > > #ifdef CONFIG_VSX
> > > > BEGIN_FTR_SECTION
> > > >         oris    r5,r5,MSR_VSX@h
> > > > END_FTR_SECTION_IFSET(CPU_FTR_VSX)
> > > > #endif
> > > >         SYNC
> > > >         MTMSRD(r5)                      /* enable use of fpu now */
> > > >         isync
> > > > <snip>
> > >
> > > Look further down...
> > >
> > > #ifdef CONFIG_PPC32
> > > 	mfspr	r5,SPRN_SPRG_THREAD		/* current task's THREAD (phys) */
> > > 	lwz	r4,THREAD_FPEXC_MODE(r5)
> > > 	ori	r9,r9,MSR_FP		/* enable FP for current */
> > > 	or	r9,r9,r4
> > > #else
> > > 	ld	r4,PACACURRENT(r13)
> > > 	addi	r5,r4,THREAD		/* Get THREAD */
> > > 	lwz	r4,THREAD_FPEXC_MODE(r5)
> > > 	ori	r12,r12,MSR_FP
> > > 	or	r12,r12,r4
> > > 	std	r12,_MSR(r1)
> > > #endif
> > >
> > > R12 is loaded with SRR1 in the exception prolog before load_up_fpu is
> called.
> >
> > Yes it is SRR1 not MSR.
>=20
> Yes, SRR1 =3D=3D the MSR of the user process, not the current MSR.
>=20
> > Also on 32bit it looks like that R9 is assumed to have SRR1.
>=20
> Yep that too.
>=20
> So any idea how it's suppose to work or is it broken?

To me this looks wrong. And this seems to works because the thread->reg->ms=
r is not actually used to write SRR1 (and eventually the thread MSR) when d=
oing rfi to enter guest. Infact Guest(shadow_msr) MSR is used as SRR1 and w=
hich will have proper MSR (including FP set).

But Yes, Scott is right person to comment, So let us wait for him comment.

Thanks
-Bharat

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: BOOKE KVM calling load_up_fpu from C?
  2013-02-12  9:01         ` Bhushan Bharat-R65777
@ 2013-02-12 18:33           ` Scott Wood
  2013-02-12 22:51             ` Michael Neuling
  2013-02-13  1:18             ` Bhushan Bharat-R65777
  0 siblings, 2 replies; 13+ messages in thread
From: Scott Wood @ 2013-02-12 18:33 UTC (permalink / raw)
  To: Bhushan Bharat-R65777
  Cc: Wood Scott-B07421, Michael Neuling, linuxppc-dev@lists.ozlabs.org

On 02/12/2013 03:01:07 AM, Bhushan Bharat-R65777 wrote:
>=20
>=20
> > -----Original Message-----
> > From: Michael Neuling [mailto:mikey@neuling.org]
> > Sent: Tuesday, February 12, 2013 9:46 AM
> > To: Bhushan Bharat-R65777
> > Cc: Wood Scott-B07421; linuxppc-dev@lists.ozlabs.org
> > Subject: Re: BOOKE KVM calling load_up_fpu from C?
> >
> > Bhushan Bharat-R65777 <R65777@freescale.com> wrote:
> >
> > >
> > >
> > > > -----Original Message-----
> > > > From: Michael Neuling [mailto:mikey@neuling.org]
> > > > Sent: Tuesday, February 12, 2013 9:16 AM
> > > > To: Bhushan Bharat-R65777
> > > > Cc: Wood Scott-B07421; linuxppc-dev@lists.ozlabs.org
> > > > Subject: Re: BOOKE KVM calling load_up_fpu from C?
> > > >
> > > > Look further down...
> > > >
> > > > #ifdef CONFIG_PPC32
> > > > 	mfspr	r5,SPRN_SPRG_THREAD		/* current =20
> task's THREAD (phys) */
> > > > 	lwz	r4,THREAD_FPEXC_MODE(r5)
> > > > 	ori	r9,r9,MSR_FP		/* enable FP for =20
> current */
> > > > 	or	r9,r9,r4
> > > > #else
> > > > 	ld	r4,PACACURRENT(r13)
> > > > 	addi	r5,r4,THREAD		/* Get THREAD */
> > > > 	lwz	r4,THREAD_FPEXC_MODE(r5)
> > > > 	ori	r12,r12,MSR_FP
> > > > 	or	r12,r12,r4
> > > > 	std	r12,_MSR(r1)
> > > > #endif
> > > >
> > > > R12 is loaded with SRR1 in the exception prolog before =20
> load_up_fpu is
> > called.
> > >
> > > Yes it is SRR1 not MSR.
> >
> > Yes, SRR1 =3D=3D the MSR of the user process, not the current MSR.
> >
> > > Also on 32bit it looks like that R9 is assumed to have SRR1.
> >
> > Yep that too.
> >
> > So any idea how it's suppose to work or is it broken?
>=20
> To me this looks wrong. And this seems to works because the =20
> thread->reg->msr is not actually used to write SRR1 (and eventually =20
> the thread MSR) when doing rfi to enter guest. Infact =20
> Guest(shadow_msr) MSR is used as SRR1 and which will have proper MSR =20
> (including FP set).
>=20
> But Yes, Scott is right person to comment, So let us wait for him =20
> comment.

I don't think it's actually a problem on 32-bit, since r9 is modified =20
but never actually used for anything.  On 64-bit, though, there's a =20
store to the caller's stack frame (yuck) which the kvm/booke.h caller =20
is not prepared for.  Indeed, book3s's kvmppc_load_up_fpu creates an =20
interrupt-like stack frame, but does not load r9 or r12.

It would be really nice if assumptions like these were put in a code =20
comment above load_up_fpu...  and if we didn't have so many random =20
differences between 32-bit and 64-bit. :-P

-Scott=

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: BOOKE KVM calling load_up_fpu from C?
  2013-02-12 18:33           ` Scott Wood
@ 2013-02-12 22:51             ` Michael Neuling
  2013-02-13  1:18             ` Bhushan Bharat-R65777
  1 sibling, 0 replies; 13+ messages in thread
From: Michael Neuling @ 2013-02-12 22:51 UTC (permalink / raw)
  To: Scott Wood
  Cc: Wood Scott-B07421, linuxppc-dev@lists.ozlabs.org,
	Bhushan Bharat-R65777

Scott Wood <scottwood@freescale.com> wrote:

> On 02/12/2013 03:01:07 AM, Bhushan Bharat-R65777 wrote:
> > 
> > 
> > > -----Original Message-----
> > > From: Michael Neuling [mailto:mikey@neuling.org]
> > > Sent: Tuesday, February 12, 2013 9:46 AM
> > > To: Bhushan Bharat-R65777
> > > Cc: Wood Scott-B07421; linuxppc-dev@lists.ozlabs.org
> > > Subject: Re: BOOKE KVM calling load_up_fpu from C?
> > >
> > > Bhushan Bharat-R65777 <R65777@freescale.com> wrote:
> > >
> > > >
> > > >
> > > > > -----Original Message-----
> > > > > From: Michael Neuling [mailto:mikey@neuling.org]
> > > > > Sent: Tuesday, February 12, 2013 9:16 AM
> > > > > To: Bhushan Bharat-R65777
> > > > > Cc: Wood Scott-B07421; linuxppc-dev@lists.ozlabs.org
> > > > > Subject: Re: BOOKE KVM calling load_up_fpu from C?
> > > > >
> > > > > Look further down...
> > > > >
> > > > > #ifdef CONFIG_PPC32
> > > > > 	mfspr	r5,SPRN_SPRG_THREAD		/* current  
> > task's THREAD (phys) */
> > > > > 	lwz	r4,THREAD_FPEXC_MODE(r5)
> > > > > 	ori	r9,r9,MSR_FP		/* enable FP for  
> > current */
> > > > > 	or	r9,r9,r4
> > > > > #else
> > > > > 	ld	r4,PACACURRENT(r13)
> > > > > 	addi	r5,r4,THREAD		/* Get THREAD */
> > > > > 	lwz	r4,THREAD_FPEXC_MODE(r5)
> > > > > 	ori	r12,r12,MSR_FP
> > > > > 	or	r12,r12,r4
> > > > > 	std	r12,_MSR(r1)
> > > > > #endif
> > > > >
> > > > > R12 is loaded with SRR1 in the exception prolog before  
> > load_up_fpu is
> > > called.
> > > >
> > > > Yes it is SRR1 not MSR.
> > >
> > > Yes, SRR1 == the MSR of the user process, not the current MSR.
> > >
> > > > Also on 32bit it looks like that R9 is assumed to have SRR1.
> > >
> > > Yep that too.
> > >
> > > So any idea how it's suppose to work or is it broken?
> > 
> > To me this looks wrong. And this seems to works because the  
> > thread->reg->msr is not actually used to write SRR1 (and eventually  
> > the thread MSR) when doing rfi to enter guest. Infact  
> > Guest(shadow_msr) MSR is used as SRR1 and which will have proper MSR  
> > (including FP set).
> > 
> > But Yes, Scott is right person to comment, So let us wait for him  
> > comment.
> 
> I don't think it's actually a problem on 32-bit, since r9 is modified  
> but never actually used for anything.  On 64-bit, though, there's a  
> store to the caller's stack frame (yuck) which the kvm/booke.h caller  
> is not prepared for.  Indeed, book3s's kvmppc_load_up_fpu creates an  
> interrupt-like stack frame, but does not load r9 or r12.

Yep.

> It would be really nice if assumptions like these were put in a code  
> comment above load_up_fpu...  and if we didn't have so many random  
> differences between 32-bit and 64-bit. :-P

Yep.. I won't NACK that patch when you send it :-)

It was pretty much assumed that load_up_fpu was going to be called right
after the exception prolog.  Calling it any other way was going to be
tricky.

Mikey

^ permalink raw reply	[flat|nested] 13+ messages in thread

* RE: BOOKE KVM calling load_up_fpu from C?
  2013-02-12 18:33           ` Scott Wood
  2013-02-12 22:51             ` Michael Neuling
@ 2013-02-13  1:18             ` Bhushan Bharat-R65777
  2013-02-13  1:23               ` Scott Wood
  1 sibling, 1 reply; 13+ messages in thread
From: Bhushan Bharat-R65777 @ 2013-02-13  1:18 UTC (permalink / raw)
  To: Wood Scott-B07421; +Cc: Michael Neuling, linuxppc-dev@lists.ozlabs.org



> -----Original Message-----
> From: Wood Scott-B07421
> Sent: Wednesday, February 13, 2013 12:03 AM
> To: Bhushan Bharat-R65777
> Cc: Michael Neuling; Wood Scott-B07421; linuxppc-dev@lists.ozlabs.org
> Subject: Re: BOOKE KVM calling load_up_fpu from C?
>=20
> On 02/12/2013 03:01:07 AM, Bhushan Bharat-R65777 wrote:
> >
> >
> > > -----Original Message-----
> > > From: Michael Neuling [mailto:mikey@neuling.org]
> > > Sent: Tuesday, February 12, 2013 9:46 AM
> > > To: Bhushan Bharat-R65777
> > > Cc: Wood Scott-B07421; linuxppc-dev@lists.ozlabs.org
> > > Subject: Re: BOOKE KVM calling load_up_fpu from C?
> > >
> > > Bhushan Bharat-R65777 <R65777@freescale.com> wrote:
> > >
> > > >
> > > >
> > > > > -----Original Message-----
> > > > > From: Michael Neuling [mailto:mikey@neuling.org]
> > > > > Sent: Tuesday, February 12, 2013 9:16 AM
> > > > > To: Bhushan Bharat-R65777
> > > > > Cc: Wood Scott-B07421; linuxppc-dev@lists.ozlabs.org
> > > > > Subject: Re: BOOKE KVM calling load_up_fpu from C?
> > > > >
> > > > > Look further down...
> > > > >
> > > > > #ifdef CONFIG_PPC32
> > > > > 	mfspr	r5,SPRN_SPRG_THREAD		/* current
> > task's THREAD (phys) */
> > > > > 	lwz	r4,THREAD_FPEXC_MODE(r5)
> > > > > 	ori	r9,r9,MSR_FP		/* enable FP for
> > current */
> > > > > 	or	r9,r9,r4
> > > > > #else
> > > > > 	ld	r4,PACACURRENT(r13)
> > > > > 	addi	r5,r4,THREAD		/* Get THREAD */
> > > > > 	lwz	r4,THREAD_FPEXC_MODE(r5)
> > > > > 	ori	r12,r12,MSR_FP
> > > > > 	or	r12,r12,r4
> > > > > 	std	r12,_MSR(r1)
> > > > > #endif
> > > > >
> > > > > R12 is loaded with SRR1 in the exception prolog before
> > load_up_fpu is
> > > called.
> > > >
> > > > Yes it is SRR1 not MSR.
> > >
> > > Yes, SRR1 =3D=3D the MSR of the user process, not the current MSR.
> > >
> > > > Also on 32bit it looks like that R9 is assumed to have SRR1.
> > >
> > > Yep that too.
> > >
> > > So any idea how it's suppose to work or is it broken?
> >
> > To me this looks wrong. And this seems to works because the
> > thread->reg->msr is not actually used to write SRR1 (and eventually
> > the thread MSR) when doing rfi to enter guest. Infact
> > Guest(shadow_msr) MSR is used as SRR1 and which will have proper MSR
> > (including FP set).
> >
> > But Yes, Scott is right person to comment, So let us wait for him
> > comment.
>=20
> I don't think it's actually a problem on 32-bit, since r9 is modified but=
 never
> actually used for anything.

Is not the epilog loads srr1 in r9 and load_up_fpu() changes r9 and then r9=
 is written back in srr1 ?


>  On 64-bit, though, there's a store to the caller's
> stack frame (yuck) which the kvm/booke.h caller is not prepared for.

So if caller is using r12 then it can lead to come corruption, right ?

>  Indeed,
> book3s's kvmppc_load_up_fpu creates an interrupt-like stack frame, but do=
es not
> load r9 or r12.
>=20
> It would be really nice if assumptions like these were put in a code comm=
ent
> above load_up_fpu...  and if we didn't have so many random differences be=
tween
> 32-bit and 64-bit. :-P

:)

Thanks
-Bharat

>=20
> -Scott

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: BOOKE KVM calling load_up_fpu from C?
  2013-02-13  1:18             ` Bhushan Bharat-R65777
@ 2013-02-13  1:23               ` Scott Wood
  2013-02-13  1:26                 ` Bhushan Bharat-R65777
  2013-02-13  4:17                 ` Bhushan Bharat-R65777
  0 siblings, 2 replies; 13+ messages in thread
From: Scott Wood @ 2013-02-13  1:23 UTC (permalink / raw)
  To: Bhushan Bharat-R65777
  Cc: Wood Scott-B07421, Michael Neuling, linuxppc-dev@lists.ozlabs.org

On 02/12/2013 07:18:14 PM, Bhushan Bharat-R65777 wrote:
>=20
>=20
> > -----Original Message-----
> > From: Wood Scott-B07421
> > Sent: Wednesday, February 13, 2013 12:03 AM
> > To: Bhushan Bharat-R65777
> > Cc: Michael Neuling; Wood Scott-B07421; =20
> linuxppc-dev@lists.ozlabs.org
> > Subject: Re: BOOKE KVM calling load_up_fpu from C?
> >
> > On 02/12/2013 03:01:07 AM, Bhushan Bharat-R65777 wrote:
> > > To me this looks wrong. And this seems to works because the
> > > thread->reg->msr is not actually used to write SRR1 (and =20
> eventually
> > > the thread MSR) when doing rfi to enter guest. Infact
> > > Guest(shadow_msr) MSR is used as SRR1 and which will have proper =20
> MSR
> > > (including FP set).
> > >
> > > But Yes, Scott is right person to comment, So let us wait for him
> > > comment.
> >
> > I don't think it's actually a problem on 32-bit, since r9 is =20
> modified but never
> > actually used for anything.
>=20
> Is not the epilog loads srr1 in r9 and load_up_fpu() changes r9 and =20
> then r9 is written back in srr1 ?

What epilog?  We're talking about the case where it's called from C =20
code.

When it's called from an exception handler, then r9 is used, but in =20
that case it's also initialized before calling load_up_fpu, by the =20
prolog.

> >  On 64-bit, though, there's a store to the caller's
> > stack frame (yuck) which the kvm/booke.h caller is not prepared for.
>=20
> So if caller is using r12 then it can lead to come corruption, right ?

No, r12 is a volatile register in the ABI, as is r9.  The issue is that =20
the stack can be corrupted.

-Scott=

^ permalink raw reply	[flat|nested] 13+ messages in thread

* RE: BOOKE KVM calling load_up_fpu from C?
  2013-02-13  1:23               ` Scott Wood
@ 2013-02-13  1:26                 ` Bhushan Bharat-R65777
  2013-02-13  4:17                 ` Bhushan Bharat-R65777
  1 sibling, 0 replies; 13+ messages in thread
From: Bhushan Bharat-R65777 @ 2013-02-13  1:26 UTC (permalink / raw)
  To: Wood Scott-B07421; +Cc: Michael Neuling, linuxppc-dev@lists.ozlabs.org



> -----Original Message-----
> From: Wood Scott-B07421
> Sent: Wednesday, February 13, 2013 6:53 AM
> To: Bhushan Bharat-R65777
> Cc: Wood Scott-B07421; Michael Neuling; linuxppc-dev@lists.ozlabs.org
> Subject: Re: BOOKE KVM calling load_up_fpu from C?
>=20
> On 02/12/2013 07:18:14 PM, Bhushan Bharat-R65777 wrote:
> >
> >
> > > -----Original Message-----
> > > From: Wood Scott-B07421
> > > Sent: Wednesday, February 13, 2013 12:03 AM
> > > To: Bhushan Bharat-R65777
> > > Cc: Michael Neuling; Wood Scott-B07421;
> > linuxppc-dev@lists.ozlabs.org
> > > Subject: Re: BOOKE KVM calling load_up_fpu from C?
> > >
> > > On 02/12/2013 03:01:07 AM, Bhushan Bharat-R65777 wrote:
> > > > To me this looks wrong. And this seems to works because the
> > > > thread->reg->msr is not actually used to write SRR1 (and
> > eventually
> > > > the thread MSR) when doing rfi to enter guest. Infact
> > > > Guest(shadow_msr) MSR is used as SRR1 and which will have proper
> > MSR
> > > > (including FP set).
> > > >
> > > > But Yes, Scott is right person to comment, So let us wait for him
> > > > comment.
> > >
> > > I don't think it's actually a problem on 32-bit, since r9 is
> > modified but never
> > > actually used for anything.
> >
> > Is not the epilog loads srr1 in r9 and load_up_fpu() changes r9 and
> > then r9 is written back in srr1 ?
>=20
> What epilog?  We're talking about the case where it's called from C code
>=20
> When it's called from an exception handler, then r9 is used, but in that =
case
> it's also initialized before calling load_up_fpu, by the prolog.

Agree. Was just confirming the exception handler case.

>=20
> > >  On 64-bit, though, there's a store to the caller's stack frame
> > > (yuck) which the kvm/booke.h caller is not prepared for.
> >
> > So if caller is using r12 then it can lead to come corruption, right ?
>=20
> No, r12 is a volatile register in the ABI, as is r9.  The issue is that t=
he
> stack can be corrupted.

Ok, Thanks
-Bharat

>=20
> -Scott

^ permalink raw reply	[flat|nested] 13+ messages in thread

* RE: BOOKE KVM calling load_up_fpu from C?
  2013-02-13  1:23               ` Scott Wood
  2013-02-13  1:26                 ` Bhushan Bharat-R65777
@ 2013-02-13  4:17                 ` Bhushan Bharat-R65777
  2013-02-13 17:37                   ` Scott Wood
  1 sibling, 1 reply; 13+ messages in thread
From: Bhushan Bharat-R65777 @ 2013-02-13  4:17 UTC (permalink / raw)
  To: Wood Scott-B07421; +Cc: Michael Neuling, linuxppc-dev@lists.ozlabs.org



> -----Original Message-----
> From: Wood Scott-B07421
> Sent: Wednesday, February 13, 2013 6:53 AM
> To: Bhushan Bharat-R65777
> Cc: Wood Scott-B07421; Michael Neuling; linuxppc-dev@lists.ozlabs.org
> Subject: Re: BOOKE KVM calling load_up_fpu from C?
>=20
> On 02/12/2013 07:18:14 PM, Bhushan Bharat-R65777 wrote:
> >
> >
> > > -----Original Message-----
> > > From: Wood Scott-B07421
> > > Sent: Wednesday, February 13, 2013 12:03 AM
> > > To: Bhushan Bharat-R65777
> > > Cc: Michael Neuling; Wood Scott-B07421;
> > linuxppc-dev@lists.ozlabs.org
> > > Subject: Re: BOOKE KVM calling load_up_fpu from C?
> > >
> > > On 02/12/2013 03:01:07 AM, Bhushan Bharat-R65777 wrote:
> > > > To me this looks wrong. And this seems to works because the
> > > > thread->reg->msr is not actually used to write SRR1 (and
> > eventually
> > > > the thread MSR) when doing rfi to enter guest. Infact
> > > > Guest(shadow_msr) MSR is used as SRR1 and which will have proper
> > MSR
> > > > (including FP set).
> > > >
> > > > But Yes, Scott is right person to comment, So let us wait for him
> > > > comment.
> > >
> > > I don't think it's actually a problem on 32-bit, since r9 is
> > modified but never
> > > actually used for anything.
> >
> > Is not the epilog loads srr1 in r9 and load_up_fpu() changes r9 and
> > then r9 is written back in srr1 ?
>=20
> What epilog?  We're talking about the case where it's called from C code.
>=20
> When it's called from an exception handler, then r9 is used, but in that =
case
> it's also initialized before calling load_up_fpu, by the prolog.
>=20
> > >  On 64-bit, though, there's a store to the caller's stack frame
> > > (yuck) which the kvm/booke.h caller is not prepared for.
> >
> > So if caller is using r12 then it can lead to come corruption, right ?
>=20
> No, r12 is a volatile register in the ABI, as is r9.  The issue is that t=
he
> stack can be corrupted.

What do you mean by stack is corrupted?
My understanding is that when calling the assembly function from C function=
 then stack frame will not be pushed and assembly function uses the caller =
stack frame.  Example function1() calls function2() which calls assembly_ro=
utine()


functio1()=20

|---------------------|
|     Stack Frame 1   |
| <function1 caller   |
|  registers etc>     |
|---------------------|


Calls function 2

|----------------------|
|     Stack Frame 2    |
| <function1 registers |
|   etc >              |
|----------------------|
|     Stack Frame 1    |
| <function1 caller    |
|  registers etc>      |
|----------------------|

calls assembly_routine();
Now no stack frame push; And the assembly_routine() changes register values=
 saved in stack. So when stack will be unrolled then registers of function1=
() will get corrupted, right?

Thanks
-Bharat

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: BOOKE KVM calling load_up_fpu from C?
  2013-02-13  4:17                 ` Bhushan Bharat-R65777
@ 2013-02-13 17:37                   ` Scott Wood
  0 siblings, 0 replies; 13+ messages in thread
From: Scott Wood @ 2013-02-13 17:37 UTC (permalink / raw)
  To: Bhushan Bharat-R65777
  Cc: Wood Scott-B07421, Michael Neuling, linuxppc-dev@lists.ozlabs.org

On 02/12/2013 10:17:00 PM, Bhushan Bharat-R65777 wrote:
>=20
>=20
> > -----Original Message-----
> > From: Wood Scott-B07421
> > Sent: Wednesday, February 13, 2013 6:53 AM
> > To: Bhushan Bharat-R65777
> > Cc: Wood Scott-B07421; Michael Neuling; =20
> linuxppc-dev@lists.ozlabs.org
> > Subject: Re: BOOKE KVM calling load_up_fpu from C?
> >
> > On 02/12/2013 07:18:14 PM, Bhushan Bharat-R65777 wrote:
> > >
> > >
> > > > -----Original Message-----
> > > > From: Wood Scott-B07421
> > > > Sent: Wednesday, February 13, 2013 12:03 AM
> > > > To: Bhushan Bharat-R65777
> > > > Cc: Michael Neuling; Wood Scott-B07421;
> > > linuxppc-dev@lists.ozlabs.org
> > > > Subject: Re: BOOKE KVM calling load_up_fpu from C?
> > > >
> > > >  On 64-bit, though, there's a store to the caller's stack frame
> > > > (yuck) which the kvm/booke.h caller is not prepared for.
> > >
> > > So if caller is using r12 then it can lead to come corruption, =20
> right ?
> >
> > No, r12 is a volatile register in the ABI, as is r9.  The issue is =20
> that the
> > stack can be corrupted.
>=20
> What do you mean by stack is corrupted?

load_up_fpu() makes assumptions about the caller's stack frame that =20
aren't true when called from C code.

> My understanding is that when calling the assembly function from C =20
> function then stack frame will not be pushed and assembly function =20
> uses the caller stack frame.

Huh?  Assembly functions obey the same ABI as C functions (at least, =20
asm functions meant to be callable from C do).  If the above were true, =20
how would C code know that it's calling an asm function, and how would =20
it know how much stack to create and which portions would be clobbered?

The issue with load_up_fpu() is that it was apparently not meant to be =20
called directly from C code.

-Scott=

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2013-02-13 17:37 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-02-12  3:29 BOOKE KVM calling load_up_fpu from C? Michael Neuling
2013-02-12  3:37 ` Bhushan Bharat-R65777
2013-02-12  3:46   ` Michael Neuling
2013-02-12  3:58     ` Bhushan Bharat-R65777
2013-02-12  4:16       ` Michael Neuling
2013-02-12  9:01         ` Bhushan Bharat-R65777
2013-02-12 18:33           ` Scott Wood
2013-02-12 22:51             ` Michael Neuling
2013-02-13  1:18             ` Bhushan Bharat-R65777
2013-02-13  1:23               ` Scott Wood
2013-02-13  1:26                 ` Bhushan Bharat-R65777
2013-02-13  4:17                 ` Bhushan Bharat-R65777
2013-02-13 17:37                   ` Scott Wood

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).