Re: Boot failures on Qemu due to P6_NOPS

Previous thread: PROBLEM: uvesafb broken as of Linux 2.6.24.x by Mihai Moldovan on Monday, July 7, 2008 - 1:17 pm. (2 messages)

Next thread: [PATCH] UML - fix gcc ICEs and unresolved externs by Jeff Dike on Monday, July 7, 2008 - 1:36 pm. (1 message)
To: <linux-kernel@...>
Date: Monday, July 7, 2008 - 1:23 pm

Hi,

this might well be a bug in Qemu but even then, it would be nice if the
linux kernel could do a work around.

I tried to boot a current git kernel (around 2.6.26-rc8) on qemu and
got the an invalid opcode oops on boot (full oops data below).

The illegal instruction is 0x0f 0x1f 0x00 aka P6_NOP3.

I have verified that this opcode gets patched in because
apply_alternatives() or more precisely add_nops() uses P6 nops
on this CPU type while padding after patching in an fxsave
instruction. More precisely the code that oopses is:

fxsave (%eax)
btl $0x7,0x2(%eax)
jae 0x804833e <main+26>
fnclex
nopl (%eax) <==== Faulting instruction

P6 nops are used when patching because init_intel() sets X86_FEATURE_P3 for
family 6 CPUs and X86_FEATURE_P3 in turn enables the P6 NOPS.

The Qemu CPU identifies itself as follows:

processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 3
model name : Pentium II (Klamath)
stepping : 3
cpu MHz : 1862.133

I have no idea if this specific CPU type should support this specific
instruction. If it really should this is obviously a Qemu bug but it
might be reasonable to work around this in the linux kernel.

The kernel is configured with CONFIG_M586 but without CONFIG_X86_GENERIC
(full config upon request). Apparently setting CONFIG_X86_GENERIC works
around the problem.

========== ooops data follows ===================================
invalid opcode: 0000 [#1] SMP
Modules linked in:

Pid: 0, comm: swapper Not tainted (2.6.26-rc9 #1)
EIP: 0060:[<c0102035>] EFLAGS: 00000202 CPU: 0
EIP is at prepare_to_copy+0x1d/0x43
EAX: c781de00 EBX: 00000000 ECX: c03f3f9c EDX: c03c23e0
ESI: fffffff4 EDI: c03c23e0 EBP: 00000000 ESP: c03f3f08
DS: 007b ES: 007b FS: 00d8 GS: 0000 SS: 0068
Process swapper (pid: 0, ti=c03f2000 task=c03c23e0 task.ti=c03f2000)
Stack: c011c653 c03f3f9c 00000000 00800b00 00000286 00000000 00000000 00000000
00800b00 c03f3f9...

To: Christian Ehrhardt <lk@...>
Cc: <linux-kernel@...>
Date: Monday, July 7, 2008 - 2:01 pm

It is a Qemu bug. Microsoft Virtual Server 2005 have it too.

One *major* problems with virtualizers is that they uniformly use an
existing CPU identifier, even though they might have their own sets of
bugs. This makes it much harder to work around bugs in them.

-hpa
--

To: <linux-kernel@...>
Date: Thursday, August 21, 2008 - 12:07 pm

But it would be possible to have kernel command line options to enable
the workarounds. Having this would be great to enhance Linux'
compatibility.

For people who are uniformly using Microsoft, Linux not running on
Virtual Server is a Linux problem, and they're going to ditch Linux if
it doesn't run there.

Greetings
Marc

--
-----------------------------------------------------------------------------
Marc Haber | "I don't trust Computers. They | Mailadresse im Header
Mannheim, Germany | lose things." Winona Ryder | Fon: *49 621 72739834
Nordisch by Nature | How to make an American Quilt | Fax: *49 3221 2323190
--

Previous thread: PROBLEM: uvesafb broken as of Linux 2.6.24.x by Mihai Moldovan on Monday, July 7, 2008 - 1:17 pm. (2 messages)

Next thread: [PATCH] UML - fix gcc ICEs and unresolved externs by Jeff Dike on Monday, July 7, 2008 - 1:36 pm. (1 message)