(sorry for the double post - I mistyped the address of the list)
Hi Uri, Avi,
I think I debugged the
kvm: unhandled wrmsr: 0xc0000083
on guest reboot with recent KVM userspace.
The "root" cause is this commit from Uri:
commit 5e1accfc9e7a7d79244c862c04621f7ba23c6d38
Author: Uri Lublin <[EMAIL PROTECTED]>
Date: Tue Jun 19 20:28:02 2007 +0300
kvm: configure: for i386 machines make x86_64-softmmu the target
To execute the ifdef X86_64 blocks on both sides
diff --git a/configure b/configure
index e4d1ec6..d9292fe 100755
--- a/configure
+++ b/configure
@@ -74,7 +74,7 @@ fi
target_cpu() {
if [[ $(uname -m) = i?86 ]]; then
- echo i386
+ echo x86_64
else
uname -m
fi
which enabled the compilation of code depending on TARGET_X86_64.
Problems arise when the host is in 32 bit mode; Avi fixed part of the
issue with d9ff68d1 (masking the LM bit when the host is 32 bit).
The MSR issue is caused by load_regs (qemu/qemu-kvm.c); at line 304 (git
current) you can see:
#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);
#endif
But the kernel side part (vmx.c) cannot handle those MSRs when using a
32 bit kernel (hence the "unhandled wrmsr").
As a side note: MSC_CSTAR (syscall target for compat mode) is supported
*only* on AMD processors (there's no syscall on Intel in 32 bit mode);
is it safe to use it unconditionally? (AFAICS vmx.c would do wrmsrl,
maybe it's not documented but supported?).
In order to fix this bug I hijacked "lm_capable_kernel" (introduced by
Avi) so that {load,save}_regs don't touch 64bit-only MSRs while the host
is in 32bit mode:
---
qemu-kvm.c | 22 +++++++++++++---------
1 file changed, 13 insertions(+), 9 deletions(-)
diff --git a/qemu/qemu-kvm.c b/qemu/qemu-kvm.c
index 4ba93d8..b8065db 100644
--- a/qemu/qemu-kvm.c
+++ b/qemu/qemu-kvm.c
@@ -9,6 +9,7 @@
#endif
int kvm_allowed = KVM_ALLOWED_DEFAULT;
+static int lm_capable_kernel;
#ifdef USE_KVM
@@ -302,10 +303,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);
@@ -439,10 +442,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) {
@@ -1001,7 +1006,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);
get_msr_entry should be fine, cpu_save/cpu_load (used by savevm -
qemu/vl.c) may need a similar fix.
The patch stops the "unhandled wrmsr", but reboot is still not working
(guest is stuck using 100% of the CPU). The last working userspace is
KVM-28, and I tested it with recent kernel modules. Any idea on this
one?
Luca
--
Runtime error 6D at f000:a12f : user incompetente
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
kvm-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/kvm-devel