aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuca Tettamanti <kronos.it@gmail.com>2007-08-11 23:25:20 +0200
committerAvi Kivity <avi@qumranet.com>2007-08-13 12:08:35 +0300
commit1a0ada84c7b4e7be4d3441addc30f3973dedb243 (patch)
treef3836dfbdb0536c21c513d3fadbb2c03e7c8d33c
parent9700a343623ff77ba5c620fc4be18fd4ef3b30e9 (diff)
kvm: fix unhandled wrmsr MSR_CSTAR on i386kvm-34
MSR_CSTAR doesn't exist on 32-bit hosts, so avoid using it.
-rw-r--r--qemu-kvm.c22
1 files changed, 13 insertions, 9 deletions
diff --git a/qemu-kvm.c b/qemu-kvm.c
index 29b27c9ce..709e714c5 100644
--- a/qemu-kvm.c
+++ b/qemu-kvm.c
@@ -9,6 +9,7 @@
#endif
int kvm_allowed = KVM_ALLOWED_DEFAULT;
+static int lm_capable_kernel;
#ifdef USE_KVM
@@ -304,10 +305,12 @@ static void load_regs(CPUState *env)
set_msr_entry(&msrs[n++], MSR_STAR, env->star);
set_msr_entry(&msrs[n++], MSR_IA32_TSC, env->tsc);
#ifdef TARGET_X86_64
- set_msr_entry(&msrs[n++], MSR_CSTAR, env->cstar);
- set_msr_entry(&msrs[n++], MSR_KERNELGSBASE, env->kernelgsbase);
- set_msr_entry(&msrs[n++], MSR_FMASK, env->fmask);
- set_msr_entry(&msrs[n++], MSR_LSTAR , env->lstar);
+ if (lm_capable_kernel) {
+ set_msr_entry(&msrs[n++], MSR_CSTAR, env->cstar);
+ set_msr_entry(&msrs[n++], MSR_KERNELGSBASE, env->kernelgsbase);
+ set_msr_entry(&msrs[n++], MSR_FMASK, env->fmask);
+ set_msr_entry(&msrs[n++], MSR_LSTAR , env->lstar);
+ }
#endif
rc = kvm_set_msrs(kvm_context, env->cpu_index, msrs, n);
@@ -441,10 +444,12 @@ static void save_regs(CPUState *env)
msrs[n++].index = MSR_STAR;
msrs[n++].index = MSR_IA32_TSC;
#ifdef TARGET_X86_64
- msrs[n++].index = MSR_CSTAR;
- msrs[n++].index = MSR_KERNELGSBASE;
- msrs[n++].index = MSR_FMASK;
- msrs[n++].index = MSR_LSTAR;
+ if (lm_capable_kernel) {
+ msrs[n++].index = MSR_CSTAR;
+ msrs[n++].index = MSR_KERNELGSBASE;
+ msrs[n++].index = MSR_FMASK;
+ msrs[n++].index = MSR_LSTAR;
+ }
#endif
rc = kvm_get_msrs(kvm_context, env->cpu_index, msrs, n);
if (rc == -1) {
@@ -1060,7 +1065,6 @@ static void do_cpuid_ent(struct kvm_cpuid_entry *e, uint32_t function,
if (function == 0x80000001) {
uint32_t h_eax, h_edx;
struct utsname utsname;
- int lm_capable_kernel;
host_cpuid(function, &h_eax, NULL, NULL, &h_edx);
uname(&utsname);