# HG changeset patch
# User kaf24@xxxxxxxxxxxxxxxxxxxx
# Node ID 6f874e089244ec193922236de975bffb1c1c2910
# Parent 4ca6f052cdf6f1c18209042e4c9960ca41e75d4b
Fix HVM MSR save/restore.
Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>
Signed-off-by: Yunhong Jiang <yunhong.jiang@xxxxxxxxx>
Signed-off-by: Xin Li <xin.b.li@xxxxxxxxx>
diff -r 4ca6f052cdf6 -r 6f874e089244 xen/arch/x86/domain.c
--- a/xen/arch/x86/domain.c Fri Feb 17 11:49:11 2006
+++ b/xen/arch/x86/domain.c Fri Feb 17 15:29:24 2006
@@ -435,8 +435,6 @@
if ( !hvm_initialize_guest_resources(v) )
return -EINVAL;
-
- hvm_switch_on = 1;
}
update_pagetables(v);
@@ -685,6 +683,8 @@
CTXT_SWITCH_STACK_BYTES);
unlazy_fpu(p);
save_segments(p);
+ if ( HVM_DOMAIN(p) )
+ hvm_load_msrs();
}
if ( !is_idle_vcpu(n) )
@@ -710,6 +710,10 @@
set_int80_direct_trap(n);
switch_kernel_stack(n, cpu);
}
+ else
+ {
+ hvm_restore_msrs(next);
+ }
}
if ( p->domain != n->domain )
@@ -765,16 +769,10 @@
/* Re-enable interrupts before restoring state which may fault. */
local_irq_enable();
- if ( HVM_DOMAIN(next) )
- {
- hvm_restore_msrs(next);
- }
- else
+ if ( !HVM_DOMAIN(next) )
{
load_LDT(next);
load_segments(next);
- if ( HVM_DOMAIN(next) )
- hvm_load_msrs(next);
}
}
diff -r 4ca6f052cdf6 -r 6f874e089244 xen/arch/x86/hvm/hvm.c
--- a/xen/arch/x86/hvm/hvm.c Fri Feb 17 11:49:11 2006
+++ b/xen/arch/x86/hvm/hvm.c Fri Feb 17 15:29:24 2006
@@ -46,7 +46,6 @@
#include <public/hvm/hvm_info_table.h>
int hvm_enabled = 0;
-int hvm_switch_on = 0;
unsigned int opt_hvm_debug_level = 0;
integer_param("hvm_debug", opt_hvm_debug_level);
diff -r 4ca6f052cdf6 -r 6f874e089244 xen/arch/x86/hvm/svm/svm.c
--- a/xen/arch/x86/hvm/svm/svm.c Fri Feb 17 11:49:11 2006
+++ b/xen/arch/x86/hvm/svm/svm.c Fri Feb 17 15:29:24 2006
@@ -251,13 +251,10 @@
* are not modified once set for generic domains, we don't save them,
* but simply reset them to the values set at percpu_traps_init().
*/
-void svm_load_msrs(struct vcpu *n)
+void svm_load_msrs(void)
{
struct svm_msr_state *host_state = &percpu_msr[smp_processor_id()];
int i;
-
- if ( !hvm_switch_on )
- return;
while ( host_state->flags )
{
diff -r 4ca6f052cdf6 -r 6f874e089244 xen/arch/x86/hvm/vmx/vmx.c
--- a/xen/arch/x86/hvm/vmx/vmx.c Fri Feb 17 11:49:11 2006
+++ b/xen/arch/x86/hvm/vmx/vmx.c Fri Feb 17 15:29:24 2006
@@ -124,13 +124,10 @@
* are not modified once set for generic domains, we don't save them,
* but simply reset them to the values set at percpu_traps_init().
*/
-void vmx_load_msrs(struct vcpu *n)
+void vmx_load_msrs(void)
{
struct vmx_msr_state *host_state = &percpu_msr[smp_processor_id()];
int i;
-
- if ( !hvm_switch_on )
- return;
while ( host_state->flags )
{
diff -r 4ca6f052cdf6 -r 6f874e089244 xen/include/asm-x86/hvm/hvm.h
--- a/xen/include/asm-x86/hvm/hvm.h Fri Feb 17 11:49:11 2006
+++ b/xen/include/asm-x86/hvm/hvm.h Fri Feb 17 15:29:24 2006
@@ -50,7 +50,7 @@
void (*load_cpu_guest_regs)(struct vcpu *v, struct cpu_user_regs *r);
#ifdef __x86_64__
void (*save_segments)(struct vcpu *v);
- void (*load_msrs)(struct vcpu *v);
+ void (*load_msrs)(void);
void (*restore_msrs)(struct vcpu *v);
#endif
void (*store_cpu_guest_ctrl_regs)(struct vcpu *v, unsigned long crs[8]);
@@ -116,10 +116,10 @@
}
static inline void
-hvm_load_msrs(struct vcpu *v)
+hvm_load_msrs(void)
{
if (hvm_funcs.load_msrs)
- hvm_funcs.load_msrs(v);
+ hvm_funcs.load_msrs();
}
static inline void
diff -r 4ca6f052cdf6 -r 6f874e089244 xen/include/asm-x86/hvm/support.h
--- a/xen/include/asm-x86/hvm/support.h Fri Feb 17 11:49:11 2006
+++ b/xen/include/asm-x86/hvm/support.h Fri Feb 17 15:29:24 2006
@@ -133,7 +133,6 @@
} while (0)
extern int hvm_enabled;
-extern int hvm_switch_on;
enum { HVM_COPY_IN = 0, HVM_COPY_OUT };
extern int hvm_copy(void *buf, unsigned long vaddr, int size, int dir);
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|