* [PATCH 06/13] Nested Virtualization: trap
@ 2010-09-01 15:03 Christoph Egger
0 siblings, 0 replies; 3+ messages in thread
From: Christoph Egger @ 2010-09-01 15:03 UTC (permalink / raw)
To: xen-devel@lists.xensource.com; +Cc: Dong, Eddie, Tim Deegan
[-- Attachment #1: Type: text/plain, Size: 322 bytes --]
Signed-off-by: Christoph Egger <Christoph.Egger@amd.com>
--
---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
[-- Attachment #2: xen_nh06_trap.diff --]
[-- Type: text/x-diff, Size: 2790 bytes --]
# 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)
{
[-- Attachment #3: Type: text/plain, Size: 138 bytes --]
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH 06/13] Nested Virtualization: trap
@ 2010-10-15 13:03 Christoph Egger
0 siblings, 0 replies; 3+ messages in thread
From: Christoph Egger @ 2010-10-15 13:03 UTC (permalink / raw)
To: xen-devel@lists.xensource.com; +Cc: Dong, Eddie, Tim Deegan
[-- Attachment #1: Type: text/plain, Size: 264 bytes --]
--
---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
[-- Attachment #2: xen_nh06_trap.diff --]
[-- Type: text/x-diff, Size: 2239 bytes --]
# HG changeset patch
# User cegger
# Date 1287134070 -7200
When injecting an exception into L2 guest,
inject a #VMEXIT if L1 guest intercepts the exception
Signed-off-by: Christoph Egger <Christoph.Egger@amd.com>
diff -r 37f3c02d20c4 -r c564d64bdb8e xen/arch/x86/hvm/hvm.c
--- a/xen/arch/x86/hvm/hvm.c
+++ b/xen/arch/x86/hvm/hvm.c
@@ -966,6 +966,47 @@ void hvm_triple_fault(void)
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_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;
+ }
+
+ 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 gfn)
{
p2m_type_t p2mt;
diff -r 37f3c02d20c4 -r c564d64bdb8e xen/include/asm-x86/hvm/hvm.h
--- a/xen/include/asm-x86/hvm/hvm.h
+++ b/xen/include/asm-x86/hvm/hvm.h
@@ -282,11 +282,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)
{
[-- Attachment #3: Type: text/plain, Size: 138 bytes --]
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH 06/13] Nested Virtualization: trap
@ 2010-11-12 18:42 Christoph Egger
0 siblings, 0 replies; 3+ messages in thread
From: Christoph Egger @ 2010-11-12 18:42 UTC (permalink / raw)
To: xen-devel
[-- Attachment #1: Type: text/plain, Size: 264 bytes --]
--
---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
[-- Attachment #2: xen_nh06_trap.diff --]
[-- Type: text/x-diff, Size: 2244 bytes --]
# HG changeset patch
# User cegger
# Date 1289574163 -3600
When injecting an exception into L2 guest,
inject a #VMEXIT if L1 guest intercepts the exception
Signed-off-by: Christoph Egger <Christoph.Egger@amd.com>
diff -r 7edc8a5266f9 -r 4d45204a61ed xen/arch/x86/hvm/hvm.c
--- a/xen/arch/x86/hvm/hvm.c
+++ b/xen/arch/x86/hvm/hvm.c
@@ -953,6 +953,47 @@ void hvm_triple_fault(void)
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 gfn)
{
p2m_type_t p2mt;
diff -r 7edc8a5266f9 -r 4d45204a61ed xen/include/asm-x86/hvm/hvm.h
--- a/xen/include/asm-x86/hvm/hvm.h
+++ b/xen/include/asm-x86/hvm/hvm.h
@@ -278,11 +278,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)
{
[-- Attachment #3: Type: text/plain, Size: 138 bytes --]
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2010-11-12 18:42 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-09-01 15:03 [PATCH 06/13] Nested Virtualization: trap Christoph Egger
-- strict thread matches above, loose matches on Subject: below --
2010-10-15 13:03 Christoph Egger
2010-11-12 18:42 Christoph Egger
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.