From mboxrd@z Thu Jan 1 00:00:00 1970 From: Christian Zigotzky Date: Fri, 18 Mar 2016 09:04:45 +0000 Subject: [PATCH kernel] KVM: PPC: Create a virtual-mode only TCE table handlers Message-Id: <56EBC4AD.5040302@xenosoft.de> List-Id: References: <1458269442-24292-1-git-send-email-aik@ozlabs.ru> In-Reply-To: <1458269442-24292-1-git-send-email-aik@ozlabs.ru> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: Alexey Kardashevskiy , kvm-ppc@vger.kernel.org, Paolo Bonzini , Paul Mackerras , kvm@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, David Gibson Hi Alexey, Many thanks for your really fast response. I successfully compiled the latest Git kernel with your new patch today. After that, I successfully tested it with Mac-on-Linux/PR KVM. Mac OS X Tiger PowerPC (virtual G3 CPU) works fantastic in MoL/PR KVM with the latest patched Git kernel. Screenshot: https://plus.google.com/115515624056477014971/posts/hsQ2m6rYBdr Have a nice day and thanks a lot to all for your hard work. Cheers, Christian On 18 March 2016 at 03:50 AM, Alexey Kardashevskiy wrote: > Upcoming in-kernel VFIO acceleration needs different handling in real > and virtual modes which makes it hard to support both modes in > the same handler. > > This creates a copy of kvmppc_rm_h_stuff_tce and kvmppc_rm_h_put_tce > in addition to the existing kvmppc_rm_h_put_tce_indirect. > > This also fixes linker breakage when only PR KVM was selected (leaving > HV KVM off): the kvmppc_h_put_tce/kvmppc_h_stuff_tce functions > would not compile at all and the linked would fail. > > Signed-off-by: Alexey Kardashevskiy > --- > arch/powerpc/kvm/book3s_64_vio.c | 52 +++++++++++++++++++++++++++++++++ > arch/powerpc/kvm/book3s_64_vio_hv.c | 8 ++--- > arch/powerpc/kvm/book3s_hv_rmhandlers.S | 4 +-- > 3 files changed, 57 insertions(+), 7 deletions(-) > > diff --git a/arch/powerpc/kvm/book3s_64_vio.c b/arch/powerpc/kvm/book3s_64_vio.c > index 2c2d103..75469f6 100644 > --- a/arch/powerpc/kvm/book3s_64_vio.c > +++ b/arch/powerpc/kvm/book3s_64_vio.c > @@ -209,6 +209,32 @@ fail: > return ret; > } > > +long kvmppc_h_put_tce(struct kvm_vcpu *vcpu, unsigned long liobn, > + unsigned long ioba, unsigned long tce) > +{ > + struct kvmppc_spapr_tce_table *stt = kvmppc_find_table(vcpu, liobn); > + long ret; > + > + /* udbg_printf("H_PUT_TCE(): liobn=0x%lx ioba=0x%lx, tce=0x%lx\n", */ > + /* liobn, ioba, tce); */ > + > + if (!stt) > + return H_TOO_HARD; > + > + ret = kvmppc_ioba_validate(stt, ioba, 1); > + if (ret != H_SUCCESS) > + return ret; > + > + ret = kvmppc_tce_validate(stt, tce); > + if (ret != H_SUCCESS) > + return ret; > + > + kvmppc_tce_put(stt, ioba >> stt->page_shift, tce); > + > + return H_SUCCESS; > +} > +EXPORT_SYMBOL_GPL(kvmppc_h_put_tce); > + > long kvmppc_h_put_tce_indirect(struct kvm_vcpu *vcpu, > unsigned long liobn, unsigned long ioba, > unsigned long tce_list, unsigned long npages) > @@ -264,3 +290,29 @@ unlock_exit: > return ret; > } > EXPORT_SYMBOL_GPL(kvmppc_h_put_tce_indirect); > + > +long kvmppc_h_stuff_tce(struct kvm_vcpu *vcpu, > + unsigned long liobn, unsigned long ioba, > + unsigned long tce_value, unsigned long npages) > +{ > + struct kvmppc_spapr_tce_table *stt; > + long i, ret; > + > + stt = kvmppc_find_table(vcpu, liobn); > + if (!stt) > + return H_TOO_HARD; > + > + ret = kvmppc_ioba_validate(stt, ioba, npages); > + if (ret != H_SUCCESS) > + return ret; > + > + /* Check permission bits only to allow userspace poison TCE for debug */ > + if (tce_value & (TCE_PCI_WRITE | TCE_PCI_READ)) > + return H_PARAMETER; > + > + for (i = 0; i < npages; ++i, ioba += (1ULL << stt->page_shift)) > + kvmppc_tce_put(stt, ioba >> stt->page_shift, tce_value); > + > + return H_SUCCESS; > +} > +EXPORT_SYMBOL_GPL(kvmppc_h_stuff_tce); > diff --git a/arch/powerpc/kvm/book3s_64_vio_hv.c b/arch/powerpc/kvm/book3s_64_vio_hv.c > index 44be73e..18f0227 100644 > --- a/arch/powerpc/kvm/book3s_64_vio_hv.c > +++ b/arch/powerpc/kvm/book3s_64_vio_hv.c > @@ -180,8 +180,8 @@ long kvmppc_gpa_to_ua(struct kvm *kvm, unsigned long gpa, > EXPORT_SYMBOL_GPL(kvmppc_gpa_to_ua); > > #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE > -long kvmppc_h_put_tce(struct kvm_vcpu *vcpu, unsigned long liobn, > - unsigned long ioba, unsigned long tce) > +long kvmppc_rm_h_put_tce(struct kvm_vcpu *vcpu, unsigned long liobn, > + unsigned long ioba, unsigned long tce) > { > struct kvmppc_spapr_tce_table *stt = kvmppc_find_table(vcpu, liobn); > long ret; > @@ -204,7 +204,6 @@ long kvmppc_h_put_tce(struct kvm_vcpu *vcpu, unsigned long liobn, > > return H_SUCCESS; > } > -EXPORT_SYMBOL_GPL(kvmppc_h_put_tce); > > static long kvmppc_rm_ua_to_hpa(struct kvm_vcpu *vcpu, > unsigned long ua, unsigned long *phpa) > @@ -296,7 +295,7 @@ unlock_exit: > return ret; > } > > -long kvmppc_h_stuff_tce(struct kvm_vcpu *vcpu, > +long kvmppc_rm_h_stuff_tce(struct kvm_vcpu *vcpu, > unsigned long liobn, unsigned long ioba, > unsigned long tce_value, unsigned long npages) > { > @@ -320,7 +319,6 @@ long kvmppc_h_stuff_tce(struct kvm_vcpu *vcpu, > > return H_SUCCESS; > } > -EXPORT_SYMBOL_GPL(kvmppc_h_stuff_tce); > > long kvmppc_h_get_tce(struct kvm_vcpu *vcpu, unsigned long liobn, > unsigned long ioba) > diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S b/arch/powerpc/kvm/book3s_hv_rmhandlers.S > index 85b32f1..81b0b51 100644 > --- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S > +++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S > @@ -1942,7 +1942,7 @@ hcall_real_table: > .long DOTSYM(kvmppc_h_clear_ref) - hcall_real_table > .long DOTSYM(kvmppc_h_protect) - hcall_real_table > .long DOTSYM(kvmppc_h_get_tce) - hcall_real_table > - .long DOTSYM(kvmppc_h_put_tce) - hcall_real_table > + .long DOTSYM(kvmppc_rm_h_put_tce) - hcall_real_table > .long 0 /* 0x24 - H_SET_SPRG0 */ > .long DOTSYM(kvmppc_h_set_dabr) - hcall_real_table > .long 0 /* 0x2c */ > @@ -2020,7 +2020,7 @@ hcall_real_table: > .long 0 /* 0x12c */ > .long 0 /* 0x130 */ > .long DOTSYM(kvmppc_h_set_xdabr) - hcall_real_table > - .long DOTSYM(kvmppc_h_stuff_tce) - hcall_real_table > + .long DOTSYM(kvmppc_rm_h_stuff_tce) - hcall_real_table > .long DOTSYM(kvmppc_rm_h_put_tce_indirect) - hcall_real_table > .long 0 /* 0x140 */ > .long 0 /* 0x144 */