From mboxrd@z Thu Jan 1 00:00:00 1970 From: Boris Ostrovsky Subject: Re: [PATCH 3/6] AMD-PVH: call hvm_emulate_one instead of handle_mmio Date: Mon, 22 Jun 2015 15:29:49 -0400 Message-ID: <5588622D.1030508@oracle.com> References: <1434991058-6585-1-git-send-email-elena.ufimtseva@oracle.com> <1434991058-6585-4-git-send-email-elena.ufimtseva@oracle.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii"; Format="flowed" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1434991058-6585-4-git-send-email-elena.ufimtseva@oracle.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: elena.ufimtseva@oracle.com, xen-devel@lists.xen.org Cc: keir@xen.org, jbeulich@suse.com, tim@xen.org, Aravind.Gopalakrishnan@amd.com, suravee.suthikulpanit@amd.com, Mukesh Rathor , roger.pau@citrix.com List-Id: xen-devel@lists.xenproject.org On 06/22/2015 12:37 PM, elena.ufimtseva@oracle.com wrote: > From: Elena Ufimtseva > > Certain IOIO instructions and CR access instructions like > lmsw/clts etc need to be emulated. handle_mmio is incorrectly called to > accomplish this. Create svm_emulate() to call hvm_emulate_one which is more > appropriate, and works for pvh as well. handle_mmio call is > forbidden for pvh. > > Signed-off-by: Mukesh Rathor > --- > xen/arch/x86/hvm/svm/svm.c | 27 +++++++++++++++++++++++---- > 1 file changed, 23 insertions(+), 4 deletions(-) > > diff --git a/xen/arch/x86/hvm/svm/svm.c b/xen/arch/x86/hvm/svm/svm.c > index 28792fe..e7262c9 100644 > --- a/xen/arch/x86/hvm/svm/svm.c > +++ b/xen/arch/x86/hvm/svm/svm.c > @@ -2289,6 +2289,23 @@ static struct hvm_function_table __initdata svm_function_table = { > .nhvm_hap_walk_L1_p2m = nsvm_hap_walk_L1_p2m, > }; > > +static void svm_emulate(struct cpu_user_regs *regs) > +{ > + int rc; > + struct hvm_emulate_ctxt ctxt; > + > + hvm_emulate_prepare(&ctxt, regs); > + rc = hvm_emulate_one(&ctxt); > + > + if ( rc != X86EMUL_OKAY ) > + { > + if ( ctxt.exn_pending ) > + hvm_inject_trap(&ctxt.trap); > + else > + hvm_inject_hw_exception(TRAP_gp_fault, 0); > + } > +} > + > void svm_vmexit_handler(struct cpu_user_regs *regs) > { > uint64_t exit_reason; > @@ -2555,16 +2572,16 @@ void svm_vmexit_handler(struct cpu_user_regs *regs) > if ( handle_pio(port, bytes, dir) ) > __update_guest_eip(regs, vmcb->exitinfo2 - vmcb->rip); > } > - else if ( !handle_mmio() ) > - hvm_inject_hw_exception(TRAP_gp_fault, 0); > + else > + svm_emulate(regs); > break; > > case VMEXIT_CR0_READ ... VMEXIT_CR15_READ: > case VMEXIT_CR0_WRITE ... VMEXIT_CR15_WRITE: > if ( cpu_has_svm_decode && (vmcb->exitinfo1 & (1ULL << 63)) ) > svm_vmexit_do_cr_access(vmcb, regs); > - else if ( !handle_mmio() ) > - hvm_inject_hw_exception(TRAP_gp_fault, 0); > + else > + svm_emulate(regs); > break; > > case VMEXIT_INVLPG: > @@ -2575,6 +2592,8 @@ void svm_vmexit_handler(struct cpu_user_regs *regs) > } > else if ( !handle_mmio() ) > hvm_inject_hw_exception(TRAP_gp_fault, 0); > + else > + svm_emulate(regs); > break; > > case VMEXIT_INVLPGA: handle_mmio() will pop the assertion on PVH ('ASSERT(!is_pvh_vcpu(curr))'). I think just calling svm_emulate() should be sufficient, just like it is for CR registers. -boris