# HG changeset patch
# User kfraser@xxxxxxxxxxxxxxxxxxxxx
# Date 1172230345 0
# Node ID cdc765772f692f2e8cf53cdada703adac24e5af0
# Parent 38fb6c392decc247b7c17cf1eb79749092e3cf7a
hvm: Clean up initialisation of hvm_funcs.
Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>
---
xen/arch/x86/hvm/hvm.c | 11 +++---
xen/arch/x86/hvm/svm/svm.c | 63 +++++++++++++++--------------------
xen/arch/x86/hvm/vmx/vmx.c | 67 ++++++++++++++------------------------
xen/include/asm-x86/hvm/hvm.h | 7 +--
xen/include/asm-x86/hvm/support.h | 2 -
5 files changed, 62 insertions(+), 88 deletions(-)
diff -r 38fb6c392dec -r cdc765772f69 xen/arch/x86/hvm/hvm.c
--- a/xen/arch/x86/hvm/hvm.c Fri Feb 23 10:47:55 2007 +0000
+++ b/xen/arch/x86/hvm/hvm.c Fri Feb 23 11:32:25 2007 +0000
@@ -49,18 +49,18 @@
#include <public/version.h>
#include <public/memory.h>
-int hvm_enabled;
-
-unsigned int opt_hvm_debug_level;
+int hvm_enabled __read_mostly;
+
+unsigned int opt_hvm_debug_level __read_mostly;
integer_param("hvm_debug", opt_hvm_debug_level);
-struct hvm_function_table hvm_funcs;
+struct hvm_function_table hvm_funcs __read_mostly;
/* I/O permission bitmap is globally shared by all HVM guests. */
char __attribute__ ((__section__ (".bss.page_aligned")))
hvm_io_bitmap[3*PAGE_SIZE];
-void hvm_enable(void)
+void hvm_enable(struct hvm_function_table *fns)
{
if ( hvm_enabled )
return;
@@ -72,6 +72,7 @@ void hvm_enable(void)
memset(hvm_io_bitmap, ~0, sizeof(hvm_io_bitmap));
clear_bit(0x80, hvm_io_bitmap);
+ hvm_funcs = *fns;
hvm_enabled = 1;
}
diff -r 38fb6c392dec -r cdc765772f69 xen/arch/x86/hvm/svm/svm.c
--- a/xen/arch/x86/hvm/svm/svm.c Fri Feb 23 10:47:55 2007 +0000
+++ b/xen/arch/x86/hvm/svm/svm.c Fri Feb 23 11:32:25 2007 +0000
@@ -988,6 +988,32 @@ static int svm_event_injection_faulted(s
return vmcb->exitintinfo.fields.v;
}
+static struct hvm_function_table svm_function_table = {
+ .disable = stop_svm,
+ .vcpu_initialise = svm_vcpu_initialise,
+ .vcpu_destroy = svm_vcpu_destroy,
+ .store_cpu_guest_regs = svm_store_cpu_guest_regs,
+ .load_cpu_guest_regs = svm_load_cpu_guest_regs,
+ .save_cpu_ctxt = svm_save_vmcb_ctxt,
+ .load_cpu_ctxt = svm_load_vmcb_ctxt,
+ .paging_enabled = svm_paging_enabled,
+ .long_mode_enabled = svm_long_mode_enabled,
+ .pae_enabled = svm_pae_enabled,
+ .guest_x86_mode = svm_guest_x86_mode,
+ .get_guest_ctrl_reg = svm_get_ctrl_reg,
+ .get_segment_base = svm_get_segment_base,
+ .get_segment_register = svm_get_segment_register,
+ .update_host_cr3 = svm_update_host_cr3,
+ .update_guest_cr3 = svm_update_guest_cr3,
+ .update_vtpr = svm_update_vtpr,
+ .stts = svm_stts,
+ .set_tsc_offset = svm_set_tsc_offset,
+ .inject_exception = svm_hvm_inject_exception,
+ .init_ap_context = svm_init_ap_context,
+ .init_hypercall_page = svm_init_hypercall_page,
+ .event_injection_faulted = svm_event_injection_faulted
+};
+
int start_svm(void)
{
u32 eax, ecx, edx;
@@ -1031,42 +1057,7 @@ int start_svm(void)
if (cpu == 0)
setup_vmcb_dump();
- /* Setup HVM interfaces */
- hvm_funcs.disable = stop_svm;
-
- hvm_funcs.vcpu_initialise = svm_vcpu_initialise;
- hvm_funcs.vcpu_destroy = svm_vcpu_destroy;
-
- hvm_funcs.store_cpu_guest_regs = svm_store_cpu_guest_regs;
- hvm_funcs.load_cpu_guest_regs = svm_load_cpu_guest_regs;
-
- hvm_funcs.save_cpu_ctxt = svm_save_vmcb_ctxt;
- hvm_funcs.load_cpu_ctxt = svm_load_vmcb_ctxt;
-
- hvm_funcs.paging_enabled = svm_paging_enabled;
- hvm_funcs.long_mode_enabled = svm_long_mode_enabled;
- hvm_funcs.pae_enabled = svm_pae_enabled;
- hvm_funcs.guest_x86_mode = svm_guest_x86_mode;
- hvm_funcs.get_guest_ctrl_reg = svm_get_ctrl_reg;
- hvm_funcs.get_segment_base = svm_get_segment_base;
- hvm_funcs.get_segment_register = svm_get_segment_register;
-
- hvm_funcs.update_host_cr3 = svm_update_host_cr3;
- hvm_funcs.update_guest_cr3 = svm_update_guest_cr3;
-
- hvm_funcs.update_vtpr = svm_update_vtpr;
-
- hvm_funcs.stts = svm_stts;
- hvm_funcs.set_tsc_offset = svm_set_tsc_offset;
-
- hvm_funcs.inject_exception = svm_hvm_inject_exception;
-
- hvm_funcs.init_ap_context = svm_init_ap_context;
- hvm_funcs.init_hypercall_page = svm_init_hypercall_page;
-
- hvm_funcs.event_injection_faulted = svm_event_injection_faulted;
-
- hvm_enable();
+ hvm_enable(&svm_function_table);
return 1;
}
diff -r 38fb6c392dec -r cdc765772f69 xen/arch/x86/hvm/vmx/vmx.c
--- a/xen/arch/x86/hvm/vmx/vmx.c Fri Feb 23 10:47:55 2007 +0000
+++ b/xen/arch/x86/hvm/vmx/vmx.c Fri Feb 23 11:32:25 2007 +0000
@@ -1000,44 +1000,31 @@ static int vmx_event_injection_faulted(s
return (idtv_info_field & INTR_INFO_VALID_MASK);
}
-/* Setup HVM interfaces */
-static void vmx_setup_hvm_funcs(void)
-{
- hvm_funcs.disable = stop_vmx;
-
- hvm_funcs.vcpu_initialise = vmx_vcpu_initialise;
- hvm_funcs.vcpu_destroy = vmx_vcpu_destroy;
-
- hvm_funcs.store_cpu_guest_regs = vmx_store_cpu_guest_regs;
- hvm_funcs.load_cpu_guest_regs = vmx_load_cpu_guest_regs;
-
- hvm_funcs.save_cpu_ctxt = vmx_save_vmcs_ctxt;
- hvm_funcs.load_cpu_ctxt = vmx_load_vmcs_ctxt;
-
- hvm_funcs.paging_enabled = vmx_paging_enabled;
- hvm_funcs.long_mode_enabled = vmx_long_mode_enabled;
- hvm_funcs.pae_enabled = vmx_pae_enabled;
- hvm_funcs.guest_x86_mode = vmx_guest_x86_mode;
- hvm_funcs.get_guest_ctrl_reg = vmx_get_ctrl_reg;
- hvm_funcs.get_segment_base = vmx_get_segment_base;
- hvm_funcs.get_segment_register = vmx_get_segment_register;
-
- hvm_funcs.update_host_cr3 = vmx_update_host_cr3;
- hvm_funcs.update_guest_cr3 = vmx_update_guest_cr3;
-
- hvm_funcs.update_vtpr = vmx_update_vtpr;
-
- hvm_funcs.stts = vmx_stts;
- hvm_funcs.set_tsc_offset = vmx_set_tsc_offset;
-
- hvm_funcs.inject_exception = vmx_inject_exception;
-
- hvm_funcs.init_ap_context = vmx_init_ap_context;
-
- hvm_funcs.init_hypercall_page = vmx_init_hypercall_page;
-
- hvm_funcs.event_injection_faulted = vmx_event_injection_faulted;
-}
+static struct hvm_function_table vmx_function_table = {
+ .disable = stop_vmx,
+ .vcpu_initialise = vmx_vcpu_initialise,
+ .vcpu_destroy = vmx_vcpu_destroy,
+ .store_cpu_guest_regs = vmx_store_cpu_guest_regs,
+ .load_cpu_guest_regs = vmx_load_cpu_guest_regs,
+ .save_cpu_ctxt = vmx_save_vmcs_ctxt,
+ .load_cpu_ctxt = vmx_load_vmcs_ctxt,
+ .paging_enabled = vmx_paging_enabled,
+ .long_mode_enabled = vmx_long_mode_enabled,
+ .pae_enabled = vmx_pae_enabled,
+ .guest_x86_mode = vmx_guest_x86_mode,
+ .get_guest_ctrl_reg = vmx_get_ctrl_reg,
+ .get_segment_base = vmx_get_segment_base,
+ .get_segment_register = vmx_get_segment_register,
+ .update_host_cr3 = vmx_update_host_cr3,
+ .update_guest_cr3 = vmx_update_guest_cr3,
+ .update_vtpr = vmx_update_vtpr,
+ .stts = vmx_stts,
+ .set_tsc_offset = vmx_set_tsc_offset,
+ .inject_exception = vmx_inject_exception,
+ .init_ap_context = vmx_init_ap_context,
+ .init_hypercall_page = vmx_init_hypercall_page,
+ .event_injection_faulted = vmx_event_injection_faulted
+};
int start_vmx(void)
{
@@ -1095,9 +1082,7 @@ int start_vmx(void)
vmx_save_host_msrs();
- vmx_setup_hvm_funcs();
-
- hvm_enable();
+ hvm_enable(&vmx_function_table);
return 1;
}
diff -r 38fb6c392dec -r cdc765772f69 xen/include/asm-x86/hvm/hvm.h
--- a/xen/include/asm-x86/hvm/hvm.h Fri Feb 23 10:47:55 2007 +0000
+++ b/xen/include/asm-x86/hvm/hvm.h Fri Feb 23 11:32:25 2007 +0000
@@ -146,8 +146,7 @@ static inline void
static inline void
hvm_disable(void)
{
- if ( hvm_funcs.disable )
- hvm_funcs.disable();
+ hvm_funcs.disable();
}
int hvm_domain_initialise(struct domain *d);
@@ -225,9 +224,7 @@ static inline unsigned long
static inline unsigned long
hvm_get_guest_ctrl_reg(struct vcpu *v, unsigned int num)
{
- if ( hvm_funcs.get_guest_ctrl_reg )
- return hvm_funcs.get_guest_ctrl_reg(v, num);
- return 0; /* force to fail */
+ return hvm_funcs.get_guest_ctrl_reg(v, num);
}
static inline unsigned long
diff -r 38fb6c392dec -r cdc765772f69 xen/include/asm-x86/hvm/support.h
--- a/xen/include/asm-x86/hvm/support.h Fri Feb 23 10:47:55 2007 +0000
+++ b/xen/include/asm-x86/hvm/support.h Fri Feb 23 11:32:25 2007 +0000
@@ -260,7 +260,7 @@ extern char hvm_io_bitmap[];
extern char hvm_io_bitmap[];
extern int hvm_enabled;
-void hvm_enable(void);
+void hvm_enable(struct hvm_function_table *);
int hvm_copy_to_guest_phys(paddr_t paddr, void *buf, int size);
int hvm_copy_from_guest_phys(void *buf, paddr_t paddr, int size);
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|