|   xen-devel
[Xen-devel] pre-cleanup2  for nested VMX 
| To: | "Dong, Eddie" <eddie.dong@xxxxxxxxx>, Tim Deegan <Tim.Deegan@xxxxxxxxxx>, 	Keir Fraser <keir@xxxxxxx> |  
| Subject: | [Xen-devel] pre-cleanup2  for nested VMX |  
| From: | "Dong, Eddie" <eddie.dong@xxxxxxxxx> |  
| Date: | Wed, 1 Jun 2011 11:47:16 +0800 |  
| Accept-language: | en-US |  
| Acceptlanguage: | en-US |  
| Cc: | "xen-devel@xxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxx>, "Dong,	Eddie" <eddie.dong@xxxxxxxxx> |  
| Delivery-date: | Tue, 31 May 2011 20:50:09 -0700 |  
| Envelope-to: | www-data@xxxxxxxxxxxxxxxxxxx |  
| List-help: | <mailto:xen-devel-request@lists.xensource.com?subject=help> |  
| List-id: | Xen developer discussion <xen-devel.lists.xensource.com> |  
| List-post: | <mailto:xen-devel@lists.xensource.com> |  
| List-subscribe: | <http://lists.xensource.com/mailman/listinfo/xen-devel>,	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe> |  
| List-unsubscribe: | <http://lists.xensource.com/mailman/listinfo/xen-devel>,	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe> |  
| References: | <osstest-7468-mainreport@xxxxxxx> |  
| Sender: | xen-devel-bounces@xxxxxxxxxxxxxxxxxxx |  
| Thread-index: | AcwgAhjDwUdZ/2BOTBqtK+IA8ti/WgAC9edgAAAdViA= |  
| Thread-topic: | [Xen-devel] pre-cleanup2  for nested VMX |  
| Move IDT_VECTORING processing code out of intr_assist for simplicity.
Thx, Eddie
diff -r 9aa31694b91e xen/arch/x86/hvm/vmx/vmx.c
--- a/xen/arch/x86/hvm/vmx/vmx.c        Tue May 31 17:58:09 2011 +0800
+++ b/xen/arch/x86/hvm/vmx/vmx.c        Wed Jun 01 08:44:03 2011 +0800
@@ -2098,6 +2098,33 @@
     return 0;
 }
 
+static void vmx_idtv_reinject(unsigned long idtv_info)
+{
+
+    /* Event delivery caused this intercept? Queue for redelivery. */
+    if ( unlikely(idtv_info & INTR_INFO_VALID_MASK) )
+    {
+        if ( hvm_event_needs_reinjection((idtv_info>>8)&7, idtv_info&0xff) )
+        {
+            /* See SDM 3B 25.7.1.1 and .2 for info about masking resvd bits. */
+            __vmwrite(VM_ENTRY_INTR_INFO,
+                      idtv_info & ~INTR_INFO_RESVD_BITS_MASK);
+            if ( idtv_info & INTR_INFO_DELIVER_CODE_MASK )
+                __vmwrite(VM_ENTRY_EXCEPTION_ERROR_CODE,
+                          __vmread(IDT_VECTORING_ERROR_CODE));
+        }
+
+        /*
+         * Clear NMI-blocking interruptibility info if an NMI delivery faulted.
+         * Re-delivery will re-set it (see SDM 3B 25.7.1.2).
+         */
+        if ( (idtv_info & INTR_INFO_INTR_TYPE_MASK) == (X86_EVENTTYPE_NMI<<8) )
+            __vmwrite(GUEST_INTERRUPTIBILITY_INFO,
+                      __vmread(GUEST_INTERRUPTIBILITY_INFO) &
+                      ~VMX_INTR_SHADOW_NMI);
+    }
+}
+
 asmlinkage void vmx_vmexit_handler(struct cpu_user_regs *regs)
 {
     unsigned int exit_reason, idtv_info, intr_info = 0, vector = 0;
@@ -2187,30 +2214,9 @@
 
     hvm_maybe_deassert_evtchn_irq();
 
-    /* Event delivery caused this intercept? Queue for redelivery. */
     idtv_info = __vmread(IDT_VECTORING_INFO);
-    if ( unlikely(idtv_info & INTR_INFO_VALID_MASK) &&
-         (exit_reason != EXIT_REASON_TASK_SWITCH) )
-    {
-        if ( hvm_event_needs_reinjection((idtv_info>>8)&7, idtv_info&0xff) )
-        {
-            /* See SDM 3B 25.7.1.1 and .2 for info about masking resvd bits. */
-            __vmwrite(VM_ENTRY_INTR_INFO,
-                      idtv_info & ~INTR_INFO_RESVD_BITS_MASK);
-            if ( idtv_info & INTR_INFO_DELIVER_CODE_MASK )
-                __vmwrite(VM_ENTRY_EXCEPTION_ERROR_CODE,
-                          __vmread(IDT_VECTORING_ERROR_CODE));
-        }
-
-        /*
-         * Clear NMI-blocking interruptibility info if an NMI delivery faulted.
-         * Re-delivery will re-set it (see SDM 3B 25.7.1.2).
-         */
-        if ( (idtv_info & INTR_INFO_INTR_TYPE_MASK) == (X86_EVENTTYPE_NMI<<8) )
-            __vmwrite(GUEST_INTERRUPTIBILITY_INFO,
-                      __vmread(GUEST_INTERRUPTIBILITY_INFO) &
-                      ~VMX_INTR_SHADOW_NMI);
-    }
+    if ( exit_reason != EXIT_REASON_TASK_SWITCH )
+        vmx_idtv_reinject(idtv_info);
 
     switch ( exit_reason )
     {
 pre01 Description: pre01
 _______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
 | 
 
| <Prev in Thread] | Current Thread | [Next in Thread> |  | 
[Xen-devel] [xen-4.1-testing test] 7468: tolerable FAIL - PUSHED, xen . org
[Xen-devel] pre-cleanup1  for nested VMX, Dong, Eddie
[Xen-devel] pre-cleanup2  for nested VMX,
Dong, Eddie <=
[Xen-devel]  RFC: Nested VMX patch series 01: data structure, Dong, Eddie
[Xen-devel]  RFC: Nested VMX patch series 02: wrap APIs, Dong, Eddie
[Xen-devel]  RFC: Nested VMX patch series 03: vmxon_off, Dong, Eddie
[Xen-devel]  RFC: Nested VMX patch series 05: vmptrld, Dong, Eddie
[Xen-devel]  RFC: Nested VMX patch series 04: virtual VMCS	structure and APIs, Dong, Eddie
RE: [Xen-devel]  RFC: Nested VMX patch series 05: vmptrst, Dong, Eddie
[Xen-devel]  RFC: Nested VMX patch series 07: vmclear, Dong, Eddie
[Xen-devel]  RFC: Nested VMX patch series 08: vmwrite, Dong, Eddie
RE: [Xen-devel]  RFC: Nested VMX patch series 09: vmread, Dong, Eddie
[Xen-devel]  RFC: Nested VMX patch series 10: vmcs switching API, Dong, Eddie
 |  |  |