# HG changeset patch
# User cegger
# Date 1298892112 -3600
# Node ID c856533343bf2de46b507ac4f815097e4779806f
# Parent f9ba1b2ba93d1c168ce597c48681a7ac3434792e
When injecting an exception into L2 guest,
inject a #VMEXIT if L1 guest intercepts the exception
Signed-off-by: Christoph Egger <Christoph.Egger@xxxxxxx>
Acked-by: Eddie Dong <eddie.dong@xxxxxxxxx>
Acked-by: Tim Deegan <Tim.Deegan@xxxxxxxxxx>
Committed-by: Tim Deegan <Tim.Deegan@xxxxxxxxxx>
---
diff -r f9ba1b2ba93d -r c856533343bf xen/arch/x86/hvm/hvm.c
--- a/xen/arch/x86/hvm/hvm.c Mon Feb 28 12:21:49 2011 +0100
+++ b/xen/arch/x86/hvm/hvm.c Mon Feb 28 12:21:52 2011 +0100
@@ -1117,6 +1117,47 @@
domain_shutdown(v->domain, SHUTDOWN_reboot);
}
+void hvm_inject_exception(unsigned int trapnr, int errcode, unsigned long cr2)
+{
+ struct vcpu *v = current;
+
+ if ( !nestedhvm_enabled(v->domain) ) {
+ hvm_funcs.inject_exception(trapnr, errcode, cr2);
+ return;
+ }
+
+ if ( nestedhvm_vmswitch_in_progress(v) ) {
+ hvm_funcs.inject_exception(trapnr, errcode, cr2);
+ return;
+ }
+
+ if ( !nestedhvm_vcpu_in_guestmode(v) ) {
+ hvm_funcs.inject_exception(trapnr, errcode, cr2);
+ return;
+ }
+
+ if ( nhvm_vmcx_guest_intercepts_trap(v, trapnr) )
+ {
+ enum nestedhvm_vmexits nsret;
+
+ nsret = nhvm_vcpu_vmexit_trap(v, trapnr, errcode, cr2);
+
+ 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 gpa,
bool_t gla_valid,
unsigned long gla,
diff -r f9ba1b2ba93d -r c856533343bf xen/include/asm-x86/hvm/hvm.h
--- a/xen/include/asm-x86/hvm/hvm.h Mon Feb 28 12:21:49 2011 +0100
+++ b/xen/include/asm-x86/hvm/hvm.h Mon Feb 28 12:21:52 2011 +0100
@@ -278,11 +278,7 @@
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)
{
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|