WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] Clean up some VMX IO handler code:

# HG changeset patch
# User kaf24@xxxxxxxxxxxxxxxxxxxx
# Node ID 551d099dae3a80ae913377f2de8e008bb88dadf5
# Parent  7155eafc858adc2bb3581cc69793a26fe1bec224
Clean up some VMX IO handler code:
1. Clean up some definitions.
2. change d to v, if it means vcpu.
3. remove some tailing spaces.

TODO:
split current VMX IO handler list to 2, one for port IO,
and the other for MMIO.

Signed-off-by: Xin Li <xin.b.li@xxxxxxxxx>

diff -r 7155eafc858a -r 551d099dae3a xen/arch/x86/vmx_intercept.c
--- a/xen/arch/x86/vmx_intercept.c      Tue Oct 18 10:07:55 2005
+++ b/xen/arch/x86/vmx_intercept.c      Tue Oct 18 10:09:36 2005
@@ -32,31 +32,36 @@
 
 #ifdef CONFIG_VMX
 
-/* Check if the request is handled inside xen
-   return value: 0 --not handled; 1 --handled */
+/*
+ * Check if the request is handled inside xen
+ * return value: 0 --not handled; 1 --handled
+ */
 int vmx_io_intercept(ioreq_t *p, int type)
 {
-    struct vcpu *d = current;
-    struct vmx_handler_t *handler = 
&(d->domain->arch.vmx_platform.vmx_handler);
+    struct vcpu *v = current;
+    struct vmx_io_handler *handler =
+                           &(v->domain->arch.vmx_platform.vmx_io_handler);
     int i;
-    unsigned long addr, offset;
+    unsigned long addr, size;
+
     for (i = 0; i < handler->num_slot; i++) {
         if( type != handler->hdl_list[i].type)
             continue;
-        addr   = handler->hdl_list[i].addr;
-        offset = handler->hdl_list[i].offset;
+        addr = handler->hdl_list[i].addr;
+        size = handler->hdl_list[i].size;
         if (p->addr >= addr &&
-            p->addr <  addr + offset)
+            p->addr <  addr + size)
             return handler->hdl_list[i].action(p);
     }
     return 0;
 }
 
-int register_io_handler(unsigned long addr, unsigned long offset, 
+int register_io_handler(unsigned long addr, unsigned long size,
                         intercept_action_t action, int type)
 {
-    struct vcpu *d = current;
-    struct vmx_handler_t *handler = 
&(d->domain->arch.vmx_platform.vmx_handler);
+    struct vcpu *v = current;
+    struct vmx_io_handler *handler =
+                             &(v->domain->arch.vmx_platform.vmx_io_handler);
     int num = handler->num_slot;
 
     if (num >= MAX_IO_HANDLER) {
@@ -65,15 +70,15 @@
     }
 
     handler->hdl_list[num].addr = addr;
-    handler->hdl_list[num].offset = offset;
+    handler->hdl_list[num].size = size;
     handler->hdl_list[num].action = action;
     handler->hdl_list[num].type = type;
     handler->num_slot++;
+
     return 1;
-
-}
-
-static void pit_cal_count(struct vmx_virpit_t *vpit)
+}
+
+static void pit_cal_count(struct vmx_virpit *vpit)
 {
     u64 nsec_delta = (unsigned int)((NOW() - vpit->inject_point));
     if (nsec_delta > vpit->period)
@@ -81,7 +86,7 @@
     vpit->count = vpit->init_val - ((nsec_delta * PIT_FREQ / 1000000000ULL) % 
vpit->init_val );
 }
 
-static void pit_latch_io(struct vmx_virpit_t *vpit)
+static void pit_latch_io(struct vmx_virpit *vpit)
 {
     pit_cal_count(vpit);
 
@@ -103,11 +108,11 @@
         vpit->count_MSB_latched=1;
         break;
     default:
-        BUG();
-    }
-}
-
-static int pit_read_io(struct vmx_virpit_t *vpit)
+        domain_crash_synchronous();
+    }
+}
+
+static int pit_read_io(struct vmx_virpit *vpit)
 {
     if(vpit->count_LSB_latched) {
         /* Read Least Significant Byte */
@@ -168,8 +173,8 @@
 /* the intercept action for PIT DM retval:0--not handled; 1--handled */
 int intercept_pit_io(ioreq_t *p)
 {
-    struct vcpu *d = current;
-    struct vmx_virpit_t *vpit = &(d->domain->arch.vmx_platform.vmx_pit);
+    struct vcpu *v = current;
+    struct vmx_virpit *vpit = &(v->domain->arch.vmx_platform.vmx_pit);
 
     if (p->size != 1 ||
         p->pdata_valid ||
@@ -197,7 +202,7 @@
 /* hooks function for the PIT initialization response iopacket */
 static void pit_timer_fn(void *data)
 {
-    struct vmx_virpit_t *vpit = data;
+    struct vmx_virpit *vpit = data;
     s_time_t   next;
     int        missed_ticks;
 
@@ -221,18 +226,18 @@
 /* Only some PIT operations such as load init counter need a hypervisor hook.
  * leave all other operations in user space DM
  */
-void vmx_hooks_assist(struct vcpu *d)
-{
-    vcpu_iodata_t * vio = get_vio(d->domain, d->vcpu_id);
+void vmx_hooks_assist(struct vcpu *v)
+{
+    vcpu_iodata_t *vio = get_vio(v->domain, v->vcpu_id);
     ioreq_t *p = &vio->vp_ioreq;
-    shared_iopage_t *sp = get_sp(d->domain);
+    shared_iopage_t *sp = get_sp(v->domain);
     u64 *intr = &(sp->sp_global.pic_intr[0]);
-    struct vmx_virpit_t *vpit = &(d->domain->arch.vmx_platform.vmx_pit);
+    struct vmx_virpit *vpit = &(v->domain->arch.vmx_platform.vmx_pit);
     int rw_mode, reinit = 0;
     int oldvec = 0;
 
     /* load init count*/
-    if (p->state == STATE_IORESP_HOOK) { 
+    if (p->state == STATE_IORESP_HOOK) {
         /* set up actimer, handle re-init */
         if ( active_ac_timer(&(vpit->pit_timer)) ) {
             VMX_DBG_LOG(DBG_LEVEL_1, "VMX_PIT: guest reset PIT with channel 
%lx!\n", (unsigned long) ((p->u.data >> 24) & 0x3) );
@@ -241,12 +246,12 @@
             oldvec = vpit->vector;
         }
         else
-            init_ac_timer(&vpit->pit_timer, pit_timer_fn, vpit, d->processor);
+            init_ac_timer(&vpit->pit_timer, pit_timer_fn, vpit, v->processor);
 
         /* init count for this channel */
-        vpit->init_val = (p->u.data & 0xFFFF) ; 
+        vpit->init_val = (p->u.data & 0xFFFF) ;
         /* frequency(ns) of pit */
-        vpit->period = DIV_ROUND(((vpit->init_val) * 1000000000ULL), 
PIT_FREQ); 
+        vpit->period = DIV_ROUND(((vpit->init_val) * 1000000000ULL), PIT_FREQ);
         VMX_DBG_LOG(DBG_LEVEL_1,"VMX_PIT: guest set init pit freq:%u ns, 
initval:0x%x\n", vpit->period, vpit->init_val);
         if (vpit->period < 900000) { /* < 0.9 ms */
             printk("VMX_PIT: guest programmed too small an init_val: %x\n",
@@ -283,7 +288,7 @@
         }
 
         vpit->intr_bitmap = intr;
-        vpit->v = d;
+        vpit->v = v;
 
         vpit->scheduled = NOW() + vpit->period;
         set_ac_timer(&vpit->pit_timer, vpit->scheduled);
diff -r 7155eafc858a -r 551d099dae3a xen/arch/x86/vmx_io.c
--- a/xen/arch/x86/vmx_io.c     Tue Oct 18 10:07:55 2005
+++ b/xen/arch/x86/vmx_io.c     Tue Oct 18 10:09:36 2005
@@ -848,7 +848,8 @@
 static inline void
 interrupt_post_injection(struct vcpu * v, int vector, int type)
 {
-    struct vmx_virpit_t *vpit = &(v->domain->arch.vmx_platform.vmx_pit);
+    struct vmx_virpit *vpit = &(v->domain->arch.vmx_platform.vmx_pit);
+
     switch(type)
     {
     case VLAPIC_DELIV_MODE_EXT:
diff -r 7155eafc858a -r 551d099dae3a xen/arch/x86/vmx_vmcs.c
--- a/xen/arch/x86/vmx_vmcs.c   Tue Oct 18 10:07:55 2005
+++ b/xen/arch/x86/vmx_vmcs.c   Tue Oct 18 10:09:36 2005
@@ -142,7 +142,7 @@
 #endif
 };
 
-static void vmx_setup_platform(struct vcpu *v)
+static void get_io_shared_page(struct vcpu *v)
 {
     int i;
     unsigned char e820_map_nr;
@@ -150,6 +150,9 @@
     unsigned char *p;
     unsigned long mpfn;
     unsigned long gpfn = 0;
+
+    if (!(VMX_DOMAIN(v) && (v->vcpu_id == 0)))
+        return;
 
     local_flush_tlb_pge();
 
@@ -203,6 +206,12 @@
 
     clear_bit(iopacket_port(v->domain),
               &v->domain->shared_info->evtchn_mask[0]);
+}
+
+static void vmx_setup_platform(struct vcpu *v)
+{
+    if (v->vcpu_id == 0)
+        get_io_shared_page(v);
 }
 
 static void vmx_set_host_env(struct vcpu *v)
diff -r 7155eafc858a -r 551d099dae3a xen/include/asm-x86/vmx_intercept.h
--- a/xen/include/asm-x86/vmx_intercept.h       Tue Oct 18 10:07:55 2005
+++ b/xen/include/asm-x86/vmx_intercept.h       Tue Oct 18 10:09:36 2005
@@ -8,49 +8,52 @@
 #include <xen/errno.h>
 #include <public/io/ioreq.h>
 
-#define MAX_IO_HANDLER 10
+#define MAX_IO_HANDLER              4
 
-typedef int (*intercept_action_t)(ioreq_t*);
+#define VMX_PORTIO                  0
+#define VMX_MMIO                    1
 
-enum {PORTIO, MMIO};
+typedef int (*intercept_action_t)(ioreq_t *);
 
-struct vmx_handler_t {
-    int num_slot;
-    struct {
-        unsigned long       addr;
-        int type;
-        unsigned long       offset;
-        intercept_action_t  action;
-    } hdl_list[MAX_IO_HANDLER];
+struct io_handler {
+    int                 type;
+    unsigned long       addr;
+    unsigned long       size;
+    intercept_action_t  action;
+};
+
+struct vmx_io_handler {
+    int     num_slot;
+    struct  io_handler hdl_list[MAX_IO_HANDLER];
 };
 
 /* global io interception point in HV */
 extern int vmx_io_intercept(ioreq_t *p, int type);
-extern int register_io_handler(unsigned long addr, unsigned long offset, 
+extern int register_io_handler(unsigned long addr, unsigned long size,
                                intercept_action_t action, int type);
 
 static inline int vmx_portio_intercept(ioreq_t *p)
 {
-    return vmx_io_intercept(p, PORTIO);
+    return vmx_io_intercept(p, VMX_PORTIO);
 }
 
 static inline int vmx_mmio_intercept(ioreq_t *p)
 {
-    return vmx_io_intercept(p, MMIO);
+    return vmx_io_intercept(p, VMX_MMIO);
 }
 
-static inline int register_portio_handler(unsigned long addr, 
-                                          unsigned long offset, 
+static inline int register_portio_handler(unsigned long addr,
+                                          unsigned long size,
                                           intercept_action_t action)
 {
-    return register_io_handler(addr, offset, action, PORTIO);
+    return register_io_handler(addr, size, action, VMX_PORTIO);
 }
 
-static inline int register_mmio_handler(unsigned long addr, 
-                                        unsigned long offset, 
+static inline int register_mmio_handler(unsigned long addr,
+                                        unsigned long size,
                                         intercept_action_t action)
 {
-    return register_io_handler(addr, offset, action, MMIO);
+    return register_io_handler(addr, size, action, VMX_MMIO);
 }
 
 #endif /* _VMX_INTERCEPT_H */
diff -r 7155eafc858a -r 551d099dae3a xen/include/asm-x86/vmx_platform.h
--- a/xen/include/asm-x86/vmx_platform.h        Tue Oct 18 10:07:55 2005
+++ b/xen/include/asm-x86/vmx_platform.h        Tue Oct 18 10:09:36 2005
@@ -77,10 +77,9 @@
 #define MAX_INST_LEN      32
 
 struct virtual_platform_def {
-    unsigned long          *real_mode_data; /* E820, etc. */
     unsigned long          shared_page_va;
-    struct vmx_virpit_t    vmx_pit;
-    struct vmx_handler_t   vmx_handler;
+    struct vmx_virpit      vmx_pit;
+    struct vmx_io_handler  vmx_io_handler;
 };
 
 extern void handle_mmio(unsigned long, unsigned long);
diff -r 7155eafc858a -r 551d099dae3a xen/include/asm-x86/vmx_virpit.h
--- a/xen/include/asm-x86/vmx_virpit.h  Tue Oct 18 10:07:55 2005
+++ b/xen/include/asm-x86/vmx_virpit.h  Tue Oct 18 10:09:36 2005
@@ -16,7 +16,7 @@
 #define LSByte_multiple 2
 #define MSByte_multiple 3
 
-struct vmx_virpit_t {
+struct vmx_virpit {
     /* for simulation of counter 0 in mode 2*/
     int vector;    /* the pit irq vector */
     unsigned int period;  /* the frequency. e.g. 10ms*/
@@ -39,6 +39,6 @@
 };
 
 /* to hook the ioreq packet to get the PIT initializaiton info */
-extern void vmx_hooks_assist(struct vcpu *d);
+extern void vmx_hooks_assist(struct vcpu *v);
 
 #endif /* _VMX_VIRPIT_H_ */
diff -r 7155eafc858a -r 551d099dae3a xen/include/asm-x86/vmx_vmcs.h
--- a/xen/include/asm-x86/vmx_vmcs.h    Tue Oct 18 10:07:55 2005
+++ b/xen/include/asm-x86/vmx_vmcs.h    Tue Oct 18 10:09:36 2005
@@ -29,7 +29,7 @@
 
 #if defined (__x86_64__)
 extern void vmx_load_msrs(struct vcpu *n);
-void vmx_restore_msrs(struct vcpu *d);
+void vmx_restore_msrs(struct vcpu *v);
 #else
 #define vmx_load_msrs(_n)          ((void)0)
 #define vmx_restore_msrs(_v)       ((void)0)
@@ -55,7 +55,7 @@
 
 extern int vmcs_size;
 
-enum { 
+enum {
     VMX_INDEX_MSR_LSTAR = 0,
     VMX_INDEX_MSR_STAR,
     VMX_INDEX_MSR_CSTAR,
@@ -79,7 +79,7 @@
     struct cpu_user_regs   *inst_decoder_regs; /* current context */
 };
 
-#define PC_DEBUG_PORT   0x80 
+#define PC_DEBUG_PORT   0x80
 
 struct arch_vmx_struct {
     struct vmcs_struct      *vmcs;  /* VMCS pointer in virtual */
@@ -98,7 +98,7 @@
 #define vmx_schedule_tail(next)         \
     (next)->thread.arch_vmx.arch_vmx_schedule_tail((next))
 
-#define VMX_DOMAIN(ed)   ((ed)->arch.arch_vmx.flags)
+#define VMX_DOMAIN(v)   ((v)->arch.arch_vmx.flags)
 
 #define ARCH_VMX_VMCS_LOADED    0       /* VMCS has been loaded and active */
 #define ARCH_VMX_VMCS_LAUNCH    1       /* Needs VMCS launch */
@@ -278,7 +278,8 @@
 extern unsigned int opt_vmx_debug_level;
 #define VMX_DBG_LOG(level, _f, _a...)           \
     if ((level) & opt_vmx_debug_level)          \
-        printk("[VMX]" _f "\n", ## _a )
+        printk("[VMX:%d.%d] " _f "\n",          \
+                current->domain->domain_id, current->vcpu_id, ## _a)
 #else
 #define VMX_DBG_LOG(level, _f, _a...)
 #endif

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] Clean up some VMX IO handler code:, Xen patchbot -unstable <=