[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] Re: CPU type qemu64 breaks guest code
From: |
Alexander Graf |
Subject: |
[Qemu-devel] Re: CPU type qemu64 breaks guest code |
Date: |
Tue, 22 Mar 2011 08:18:35 +0100 |
On 21.03.2011, at 22:46, Andre Przywara wrote:
> On 03/14/2011 03:13 PM, Alexander Graf wrote:
>> Hi guys,
>>
>> While I was off on vacation a pretty nasty bug emerged. It's our old
>> friend the non-existent -cpu qemu64 CPU type. To refresh your memories,
>> this is the definition of the default 64-bit CPU type in Qemu:
>>
>> {
>> .name = "qemu64",
>> .level = 4,
>> .vendor1 = CPUID_VENDOR_AMD_1,
>> .vendor2 = CPUID_VENDOR_AMD_2,
>> .vendor3 = CPUID_VENDOR_AMD_3,
>> .family = 6,
>> .model = 2,
>> .stepping = 3,
> > ...
>
> Well, yes, this is strange, and a different CPU model mimicking some really
> existing CPU would be better. But in my experience this opens up a can of
> worms, since a different family will trigger a lot of other nasty code that
> was silent before. Although I think that eventually we will not get around it
> doing so, but we should use a lot of testing before triggering tons of
> regressions.
> What about the kvm64 CPU model? Back then I used quite some testing to find a
> model which runs pretty well, so I came up with 15/6/1, which seemed to be
> relatively sane. We could try copying this F/M/S over to qemu64, I suppose
> with emulation the issues are easier to fix than in KVM.
>
> Another idea I think I already posted some time ago was to make kvm64 the new
> default if KVM is enabled. This wouldn't solve the above issue for TCG of
> course, but would make further development easier, since we would have a
> better separation between KVM and TCG and could tweak each independently.
>
>> Before I left, we already had weird build breakages where gcc simply
> > abort()ed when running inside of KVM. This breakage has been tracked
>> down to libgmp, which has this code
>> (http://gmplib.org:8000/gmp-5.0/file/1ebe39104437/mpn/x86_64/fat/fat.c):
> > ....
>
>>
>> if (strcmp (vendor_string, "GenuineIntel") == 0)
>> {
>> ....
>> }
>> else if (strcmp (vendor_string, "AuthenticAMD") == 0)
>> {
>> switch (family)
>> {
>> case 5:
>> case 6:
>> abort ();
>> break;
>> case 15:
>> /* CPUVEC_SETUP_athlon */
>> break;
>> }
>>
>> The reasoning behind it is that for AMD, all 64-bit CPUs were family
>> 15.
>
> I guess that should be fixed there, as it is obviously nonsense. I haven't
> check what they actually need that family 6 does not provide, if it is long
> mode, then this bit should be checked.
Michael (IIRC) already tried that one, but the libgmp guys refuse to change the
code here, as is works on real hardware...
>
>> This breakage is obviously pretty bad for guests running qemu and
>> shows once again that deriving from real hardware is a bad idea. I guess
>> the best way to move forward is to change the CPU type to something that
>> actually exists in the real world - even if we have to strip off some
>> features.
>
> I found that there is no valid combination for both Intel and AMD. We had to
> go to family 15, and it seems that there is no F/M/S combination that were
> both a valid K8 and a Pentium4 processor. The 15/6/1 mentioned before was the
> closest match I could find.
>
> Summarizing I would suggest:
> 1) Make kvm64 the new default model if KVM is used. Maybe we could tie
> this to the qemu-0.15 machine type.
> 2) Test as many OSes as possible whether they show strange behavior.
> In my experience we could catch most of the stuff with just booting
> the system, with Linux "-kernel vmlinuz" suffices (without a rootfs).
> 3) If we are happy with that, tweak the qemu64 model to those values,
> too.
> 4) Write some note somewhere to let users know what they could do to
> fix problems that rise due to the new model.
>
> I can easily send patches and will try to contribute to testing, if that plan
> sounds OK.
I love that plan! Please make sure to provide the current qemu64 type when -M
pc-0.14 is selected, so people can still choose the old type for migration.
Alex