# 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
|