RE: [PATCH] kvm/ppc/booke64: fix build breakage from Altivec, and disable e6500

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> -----Original Message-----
> From: Alexander Graf [mailto:agraf@xxxxxxx]
> Sent: Friday, May 10, 2013 4:16 PM
> To: Caraman Mihai Claudiu-B02008
> Cc: Wood Scott-B07421; kvm-ppc@xxxxxxxxxxxxxxx; kvm@xxxxxxxxxxxxxxx
> Subject: Re: [PATCH] kvm/ppc/booke64: fix build breakage from Altivec,
> and disable e6500
> 
> 
> On 10.05.2013, at 11:40, Caraman Mihai Claudiu-B02008 wrote:
> 
> >> -----Original Message-----
> >> From: Wood Scott-B07421
> >> Sent: Friday, May 10, 2013 6:15 AM
> >> To: Alexander Graf
> >> Cc: kvm-ppc@xxxxxxxxxxxxxxx; kvm@xxxxxxxxxxxxxxx; Wood Scott-B07421;
> >> Caraman Mihai Claudiu-B02008
> >> Subject: [PATCH] kvm/ppc/booke64: fix build breakage from Altivec, and
> >> disable e6500
> >>
> >> BookE altivec support brought two new exceptions, but KVM was not
> >> updated, so the build broke for all 64-bit booke with KVM enabled.
> >
> > We couldn't do that in KVM before having
> BOOKE_INTERRUPT_ALTIVEC_UNAVAIL/
> > BOOKE_INTERRUPT_ALTIVEC_ASSIST. As Tiejun noticed earlier we should
> have
> > done this in Kumar's tree but we missed that chance. We will face
> similar
> > issues every time an exception handler will be added.
> 
> How hard would it be to add? I suppose it's broken in 3.10, so we need
> something quick before it gets released?

Not so hard. Yes. I was surprised by this patch given the fact that we have
planned to send altivec support upstream this days and that we already have
a similar patch from Tiejun on our list.

> 
> >
> >>
> >> Add the new vectors, but there's more than this required to make
> >> Altivec work in the guest, and we can't prevent the guest from turning
> >> on Altivec (which can corrupt host state until state save/restore is
> >> implemented).  Disable e6500 on KVM until this is fixed.
> >
> > To be more precise it can corrupt Altivec host state.
> >
> >>
> >> Signed-off-by: Scott Wood <scottwood@xxxxxxxxxxxxx>
> >> Cc: Mihai Caraman <mihai.caraman@xxxxxxxxxxxxx>
> >> ---
> >> arch/powerpc/kvm/bookehv_interrupts.S |    4 ++++
> >> arch/powerpc/kvm/e500mc.c             |    2 --
> >> 2 files changed, 4 insertions(+), 2 deletions(-)
> >>
> >> diff --git a/arch/powerpc/kvm/bookehv_interrupts.S
> >> b/arch/powerpc/kvm/bookehv_interrupts.S
> >> index e8ed7d6..6397613 100644
> >> --- a/arch/powerpc/kvm/bookehv_interrupts.S
> >> +++ b/arch/powerpc/kvm/bookehv_interrupts.S
> >> @@ -309,6 +309,10 @@ kvm_handler BOOKE_INTERRUPT_DOORBELL_CRITICAL,
> >> EX_PARAMS(CRIT), \
> >> 	SPRN_CSRR0, SPRN_CSRR1, 0
> >> kvm_handler BOOKE_INTERRUPT_HV_PRIV, EX_PARAMS(GEN), \
> >> 	SPRN_SRR0, SPRN_SRR1, NEED_EMU
> >> +kvm_handler BOOKE_INTERRUPT_ALTIVEC_UNAVAIL, EX_PARAMS(GEN), \
> >> +	SPRN_SRR0, SPRN_SRR1, 0
> >> +kvm_handler BOOKE_INTERRUPT_ALTIVEC_ASSIST, EX_PARAMS(GEN), \
> >> +	SPRN_SRR0, SPRN_SRR1, 0
> >
> > Why not NEED_ESR as we did in our SDK?
> >
> >> kvm_handler BOOKE_INTERRUPT_HV_SYSCALL, EX_PARAMS(GEN), \
> >> 	SPRN_SRR0, SPRN_SRR1, 0
> >> kvm_handler BOOKE_INTERRUPT_GUEST_DBELL, EX_PARAMS(GDBELL), \
> >> diff --git a/arch/powerpc/kvm/e500mc.c b/arch/powerpc/kvm/e500mc.c
> >> index 753cc99..19c8379 100644
> >> --- a/arch/powerpc/kvm/e500mc.c
> >> +++ b/arch/powerpc/kvm/e500mc.c
> >> @@ -177,8 +177,6 @@ int kvmppc_core_check_processor_compat(void)
> >> 		r = 0;
> >> 	else if (strcmp(cur_cpu_spec->cpu_name, "e5500") == 0)
> >> 		r = 0;
> >> -	else if (strcmp(cur_cpu_spec->cpu_name, "e6500") == 0)
> >> -		r = 0;
> >
> > Hmm ... I made it clear in the commit message that Altivec is not
> > supported, why couldn't we be more gentle:
> >
> > diff --git a/arch/powerpc/kvm/e500mc.c b/arch/powerpc/kvm/e500mc.c
> > index c3bdc0a..4f43a36 100644
> > --- a/arch/powerpc/kvm/e500mc.c
> > +++ b/arch/powerpc/kvm/e500mc.c
> > @@ -172,8 +172,11 @@ int kvmppc_core_check_processor_compat(void)
> >                r = 0;
> >        else if (strcmp(cur_cpu_spec->cpu_name, "e5500") == 0)
> >                r = 0;
> > +#ifndef CONFIG_ALTIVEC
> 
> This would still be wrong, since running 2 guests with altivec would
> break each other.

It's wrong if you expect to have altivec supported in the VM which is not
the case. Guests that executes altivec instructions will get a program
(unimplemented op) exception see below.

Do we really need to remove e6500 all together for this?

> 
> Alex
> 
> > +/* ALTIVEC is not supported now by KVM so only one of them can work */
> >        else if (strcmp(cur_cpu_spec->cpu_name, "e6500") == 0)
> >                r = 0;
> > +#endif
> >        else
> >                r = -ENOTSUPP;
> > diff --git a/arch/powerpc/kvm/booke.c b/arch/powerpc/kvm/booke.c
> > index 82f155e..bb1a9e0 100644
> > --- a/arch/powerpc/kvm/booke.c
> > +++ b/arch/powerpc/kvm/booke.c
> > @@ -973,6 +973,16 @@ int kvmppc_handle_exit(struct kvm_run *run, struct
> kvm_vcpu *vcpu,
> >                break;
> > #endif
> >
> > +       case BOOKE_INTERRUPT_ALTIVEC_UNAVAIL:
> > +       case BOOKE_INTERRUPT_ALTIVEC_ASSIST:
> > +               /*
> > +                * Guest wants ALTIVEC, but host kernel doesn't support
> it.
> > +                * send an "unimplemented operation" program check to
> the guest.
> > +                */
> > +               kvmppc_core_queue_program(vcpu, ESR_PUO | ESR_SPV);
> > +               r = RESUME_GUEST;
> > +               break;
> > +
> >        case BOOKE_INTERRUPT_DATA_STORAGE:
> >                kvmppc_core_queue_data_storage(vcpu, vcpu-
> >arch.fault_dear,
> >                                               vcpu->arch.fault_esr);
> >
> >
> > Kconfig should also be updated (in both proposals).
> >

-Mike


--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux