From mboxrd@z Thu Jan 1 00:00:00 1970 From: Christoph Egger Subject: [PATCH 06/13] Nested Virtualization: trap Date: Wed, 1 Sep 2010 17:03:02 +0200 Message-ID: <201009011703.03569.Christoph.Egger@amd.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="Boundary-00=_nsmfM5vjvw+c52S" Return-path: List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: "xen-devel@lists.xensource.com" Cc: "Dong, Eddie" , Tim Deegan List-Id: xen-devel@lists.xenproject.org --Boundary-00=_nsmfM5vjvw+c52S Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline Signed-off-by: Christoph Egger -- ---to satisfy European Law for business letters: Advanced Micro Devices GmbH Einsteinring 24, 85609 Dornach b. Muenchen Geschaeftsfuehrer: Alberto Bozzo, Andrew Bowd Sitz: Dornach, Gemeinde Aschheim, Landkreis Muenchen Registergericht Muenchen, HRB Nr. 43632 --Boundary-00=_nsmfM5vjvw+c52S Content-Type: text/x-diff; charset="iso 8859-15"; name="xen_nh06_trap.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="xen_nh06_trap.diff" # HG changeset patch # User cegger # Date 1283345880 -7200 When injecting an exception into L2 guest, inject a #VMEXIT if L1 guest intercepts the exception diff -r e0eae5b67977 -r 5901bcc24f94 xen/arch/x86/hvm/hvm.c --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -966,6 +966,62 @@ void hvm_triple_fault(void) domain_shutdown(v->domain, SHUTDOWN_reboot); } +void hvm_inject_exception(unsigned int trapnr, int errcode, unsigned long cr2) +{ + uint64_t exitcode; + bool_t is_intercepted; + struct vcpu *v = current; + struct nestedhvm *hvm = &vcpu_nestedhvm(v); + + if ( !nestedhvm_enabled(v->domain) ) { + hvm_funcs.inject_exception(trapnr, errcode, cr2); + return; + } + + if ( nestedhvm_vmentry_emulate(v) ) { + hvm_funcs.inject_exception(trapnr, errcode, cr2); + return; + } + + if ( !nestedhvm_vcpu_in_guestmode(v) ) { + hvm_funcs.inject_exception(trapnr, errcode, cr2); + return; + } + + exitcode = nestedhvm_exception2exitcode(trapnr); + hvm->nh_hostflags.fields.forcevmexit = 1; + hvm->nh_forcevmexit.exitcode = exitcode; + is_intercepted = hvm_nestedhvm_vm_intercepted_by_guest(v, exitcode); + hvm->nh_hostflags.fields.forcevmexit = 0; + + if ( is_intercepted ) + { + enum nestedhvm_vmexits nsret; + + hvm->nh_forcevmexit.exitcode = exitcode; + hvm->nh_forcevmexit.exitinfo1 = errcode; + hvm->nh_forcevmexit.exitinfo2 = cr2; + + hvm->nh_hostflags.fields.forcevmexit = 1; + nsret = nestedhvm_vcpu_vmexit(v, guest_cpu_user_regs(), 0 /* dummy */); + hvm->nh_hostflags.fields.forcevmexit = 0; + + switch (nsret) { + case NESTEDHVM_VMEXIT_DONE: + case NESTEDHVM_VMEXIT_ERROR: /* L1 guest will crash L2 guest */ + return; + case NESTEDHVM_VMEXIT_HOST: + case NESTEDHVM_VMEXIT_CONTINUE: + case NESTEDHVM_VMEXIT_FATALERROR: + default: + gdprintk(XENLOG_ERR, "unexpected nestedhvm error %i\n", nsret); + return; + } + } + + hvm_funcs.inject_exception(trapnr, errcode, cr2); +} + bool_t hvm_hap_nested_page_fault(unsigned long gfn) { p2m_type_t p2mt; diff -r e0eae5b67977 -r 5901bcc24f94 xen/include/asm-x86/hvm/hvm.h --- a/xen/include/asm-x86/hvm/hvm.h +++ b/xen/include/asm-x86/hvm/hvm.h @@ -279,11 +279,7 @@ void hvm_migrate_timers(struct vcpu *v); void hvm_do_resume(struct vcpu *v); void hvm_migrate_pirqs(struct vcpu *v); -static inline void -hvm_inject_exception(unsigned int trapnr, int errcode, unsigned long cr2) -{ - hvm_funcs.inject_exception(trapnr, errcode, cr2); -} +void hvm_inject_exception(unsigned int trapnr, int errcode, unsigned long cr2); static inline int hvm_event_pending(struct vcpu *v) { --Boundary-00=_nsmfM5vjvw+c52S Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel --Boundary-00=_nsmfM5vjvw+c52S--