Re: Solaris 10 doesn't work under KVM

Avi Kivity
2007-02-12T09:48:49Z

[-- Attachment #1: Type: text/plain, Size: 1555 bytes --]

Waba wrote:
> It took me a while, but I figured it out... nearly!
>
> Everything SIGILLs after the fs-root service is started. Its start
> method does several things, but the problematic bit is replacing the
> libc with an optimised version (namely, /usr/lib/libc/libc_hwcap1.so.1,
> which makes use of the SSE, MMX, CMOV, SEP and FPU instruction sets
> according to file(1)).
>
> All these flags are indeed advertised in the CPUID (isainfo -v: sse2 sse
> fxsr mmx cmov sep cx8 tsc fpu)). If the amd_sysc bit had been present,
> the hwcap2 version would have been selected by moe(1), I guess (adds
> SSE2 support and replaces SEP by AMD_SYSC).
>
> Disabling the libc replacement in /lib/svc/method/fs-root entirely
> workarounds the problem.
>
> Further investigating, I tricked ls(1) into using the optimised libc
> through LD_LIBRARY_PATH and obtained a core. mdb(1) told me that the
> culprit was hiding at libc`memset+0x74. And finally, dis(1) revealed
> that the faulty instruction is "movups (%esp), %xmm0", a SSE feature.
> The %xmm0 register is apparently for storage purposes only, as the only
> instructions used to access it are movups, movntps and movaps.
>
> At this point I hope that it makes a lot of sense to you, because I
> have no idea why it works fine on Avi's Opteron, etc.
>
> Let me know if you need any additional debugging.
>

Let's look at the control registers at the time of the SIGILL. Can you
reproduce the error with the attached patch and send dmesg?

--
error compiling committee.c: too many arguments to function

[-- Attachment #2: ud-print-cr0-cr4.patch --]
[-- Type: text/x-patch, Size: 1233 bytes --]

Index: svm.c
===================================================================
--- svm.c (revision 4412)
+++ svm.c (working copy)
@@ -481,7 +481,7 @@
INTERCEPT_DR5_MASK |
INTERCEPT_DR7_MASK;

- control->intercept_exceptions = 1 << PF_VECTOR;
+ control->intercept_exceptions = (1 << PF_VECTOR) | (1 << UD_VECTOR);

control->intercept = (1ULL << INTERCEPT_INTR) |
@@ -1247,6 +1247,15 @@
return 1;
}

+static int ud_interception(struct kvm_vcpu *vcpu, struct kvm_run *run)
+{
+ printk(KERN_ERR "#ud: cr0 %lx (%llx) cr4 %lx (%llx)\n",
+ vcpu->cr0, vcpu->svm->vmcb->save.cr0,
+ vcpu->cr4, vcpu->svm->vmcb->save.cr4);
+ run->exit_reason = KVM_EXIT_SHUTDOWN;
+ return 0;
+}
+
static int (*svm_exit_handlers[])(struct kvm_vcpu *vcpu,
struct kvm_run *kvm_run) = {
[SVM_EXIT_READ_CR0] = emulate_on_interception,
@@ -1267,6 +1276,7 @@
[SVM_EXIT_WRITE_DR5] = emulate_on_interception,
[SVM_EXIT_WRITE_DR7] = emulate_on_interception,
[SVM_EXIT_EXCP_BASE + PF_VECTOR] = pf_interception,
+ [SVM_EXIT_EXCP_BASE + UD_VECTOR] = ud_interception,
[SVM_EXIT_INTR] = nop_on_interception,
[SVM_EXIT_NMI] = nop_on_interception,
[SVM_EXIT_SMI] = nop_on_interception,

[-- Attachment #3: Type: text/plain, Size: 374 bytes --]

-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier.
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642

[-- Attachment #4: Type: text/plain, Size: 186 bytes --]

_______________________________________________
kvm-devel mailing list
kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org