All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH][3/9] Implement the I/O bitmap vm execution control.
@ 2005-07-25 21:01 Arun Sharma
  0 siblings, 0 replies; only message in thread
From: Arun Sharma @ 2005-07-25 21:01 UTC (permalink / raw)
  To: Ian Pratt, Keir Fraser; +Cc: xen-devel

Implement the I/O bitmap vm execution control.

With this patch, we should not bee seeing any vmexits for debug port
accesses.

Signed-off-by: Edwin Zhai <edwin.zhai@intel.com>
Signed-off-by: Arun Sharma <arun.sharma@intel.com>

--- a/xen/arch/x86/domain.c	Mon Jul 25 20:44:41 2005
+++ b/xen/arch/x86/domain.c	Mon Jul 25 13:48:04 2005
@@ -373,6 +373,14 @@
 
 out:
     free_vmcs(vmcs);
+    if(v->arch.arch_vmx.io_bitmap_a != 0) {
+        free_xenheap_pages(v->arch.arch_vmx.io_bitmap_a, get_order(0x1000));
+        v->arch.arch_vmx.io_bitmap_a = 0;
+    }
+    if(v->arch.arch_vmx.io_bitmap_b != 0) {
+        free_xenheap_pages(v->arch.arch_vmx.io_bitmap_b, get_order(0x1000));
+        v->arch.arch_vmx.io_bitmap_b = 0;
+    }
     v->arch.arch_vmx.vmcs = 0;
     return error;
 }
@@ -926,6 +934,14 @@
 
     BUG_ON(v->arch.arch_vmx.vmcs == NULL);
     free_vmcs(v->arch.arch_vmx.vmcs);
+    if(v->arch.arch_vmx.io_bitmap_a != 0) {
+        free_xenheap_pages(v->arch.arch_vmx.io_bitmap_a, get_order(0x1000));
+        v->arch.arch_vmx.io_bitmap_a = 0;
+    }
+    if(v->arch.arch_vmx.io_bitmap_b != 0) {
+        free_xenheap_pages(v->arch.arch_vmx.io_bitmap_b, get_order(0x1000));
+        v->arch.arch_vmx.io_bitmap_b = 0;
+    }
     v->arch.arch_vmx.vmcs = 0;
     
     free_monitor_pagetable(v);
diff -r 8ce9ac95de9e xen/arch/x86/vmx.c
--- a/xen/arch/x86/vmx.c	Mon Jul 25 20:44:41 2005
+++ b/xen/arch/x86/vmx.c	Mon Jul 25 13:48:04 2005
@@ -608,11 +608,6 @@
         addr = (exit_qualification >> 16) & (0xffff);
     else
         addr = regs->edx & 0xffff;
-
-    if (addr == 0x80) {
-        __update_guest_eip(inst_len);
-        return;
-    }
 
     vio = get_vio(d->domain, d->vcpu_id);
     if (vio == 0) {
diff -r 8ce9ac95de9e xen/arch/x86/vmx_vmcs.c
--- a/xen/arch/x86/vmx_vmcs.c	Mon Jul 25 20:44:41 2005
+++ b/xen/arch/x86/vmx_vmcs.c	Mon Jul 25 13:48:04 2005
@@ -59,9 +59,11 @@
     free_xenheap_pages(vmcs, order);
 }
 
-static inline int construct_vmcs_controls(void)
+static inline int construct_vmcs_controls(struct arch_vmx_struct *arch_vmx)
 {
     int error = 0;
+    void *io_bitmap_a;
+    void *io_bitmap_b;
 
     error |= __vmwrite(PIN_BASED_VM_EXEC_CONTROL, 
                        MONITOR_PIN_BASED_EXEC_CONTROLS);
@@ -72,6 +74,20 @@
     error |= __vmwrite(VM_EXIT_CONTROLS, MONITOR_VM_EXIT_CONTROLS);
 
     error |= __vmwrite(VM_ENTRY_CONTROLS, MONITOR_VM_ENTRY_CONTROLS);
+
+    /* need to use 0x1000 instead of PAGE_SIZE */
+    io_bitmap_a = (void*) alloc_xenheap_pages(get_order(0x1000)); 
+    io_bitmap_b = (void*) alloc_xenheap_pages(get_order(0x1000)); 
+    memset(io_bitmap_a, 0xff, 0x1000);
+    /* don't bother debug port access */
+    clear_bit(PC_DEBUG_PORT, io_bitmap_a);
+    memset(io_bitmap_b, 0xff, 0x1000);
+
+    error |= __vmwrite(IO_BITMAP_A, (u64) virt_to_phys(io_bitmap_a));
+    error |= __vmwrite(IO_BITMAP_B, (u64) virt_to_phys(io_bitmap_b));
+
+    arch_vmx->io_bitmap_a = io_bitmap_a;
+    arch_vmx->io_bitmap_b = io_bitmap_b;
 
     return error;
 }
@@ -432,7 +448,7 @@
                (unsigned long) vmcs_phys_ptr);
         return -EINVAL; 
     }
-    if ((error = construct_vmcs_controls())) {
+    if ((error = construct_vmcs_controls(arch_vmx))) {
         printk("construct_vmcs: construct_vmcs_controls failed\n");
         return -EINVAL;         
     }
diff -r 8ce9ac95de9e xen/include/asm-x86/vmx.h
--- a/xen/include/asm-x86/vmx.h	Mon Jul 25 20:44:41 2005
+++ b/xen/include/asm-x86/vmx.h	Mon Jul 25 13:48:04 2005
@@ -61,6 +61,7 @@
     CPU_BASED_INVDPG_EXITING | \
     CPU_BASED_MWAIT_EXITING | \
     CPU_BASED_MOV_DR_EXITING | \
+    CPU_BASED_ACTIVATE_IO_BITMAP | \
     CPU_BASED_UNCOND_IO_EXITING \
     )
 
diff -r 8ce9ac95de9e xen/include/asm-x86/vmx_vmcs.h
--- a/xen/include/asm-x86/vmx_vmcs.h	Mon Jul 25 20:44:41 2005
+++ b/xen/include/asm-x86/vmx_vmcs.h	Mon Jul 25 13:48:04 2005
@@ -69,6 +69,8 @@
     unsigned long shadow_gs;
 };
 
+#define PC_DEBUG_PORT   0x80 
+
 struct arch_vmx_struct {
     struct vmcs_struct      *vmcs;  /* VMCS pointer in virtual */
     unsigned long           flags;  /* VMCS flags */
@@ -76,6 +78,7 @@
     unsigned long           cpu_cr3;
     unsigned long           cpu_state;
     struct msr_state        msr_content;
+    void                   *io_bitmap_a, *io_bitmap_b;
 };
 
 #define vmx_schedule_tail(next)         \

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2005-07-25 21:01 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-07-25 21:01 [PATCH][3/9] Implement the I/O bitmap vm execution control Arun Sharma

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.