From: Jan Kiszka <jan.kiszka@web.de>
To: qemu-devel <qemu-devel@nongnu.org>
Subject: [Qemu-devel] [PATCH][STABLE] kvm: Fix cpuid initialization
Date: Mon, 13 Apr 2009 10:53:06 +0200 [thread overview]
Message-ID: <49E2FD72.6000101@web.de> (raw)
[-- Attachment #1: Type: text/plain, Size: 4610 bytes --]
[ Looks like we need more kvm users via upstream qemu... ]
Fix (more or less) spurious guest boot failures due to corrupted cpuid
states. The reason was insufficient initialization of cpuid entries
before passing them to the kernel.
At this chance also fix improper entry pointer progression and simplify
the code a bit.
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---
target-i386/kvm.c | 60 ++++++++++++++++++-----------------------------------
1 files changed, 20 insertions(+), 40 deletions(-)
diff --git a/target-i386/kvm.c b/target-i386/kvm.c
index 4f437c2..2de8b81 100644
--- a/target-i386/kvm.c
+++ b/target-i386/kvm.c
@@ -41,12 +41,11 @@ int kvm_arch_init_vcpu(CPUState *env)
struct kvm_cpuid_entry2 entries[100];
} __attribute__((packed)) cpuid_data;
uint32_t limit, i, j, cpuid_i;
- uint32_t eax, ebx, ecx, edx;
+ uint32_t unused;
cpuid_i = 0;
- cpu_x86_cpuid(env, 0, 0, &eax, &ebx, &ecx, &edx);
- limit = eax;
+ cpu_x86_cpuid(env, 0, 0, &limit, &unused, &unused, &unused);
for (i = 0; i <= limit; i++) {
struct kvm_cpuid_entry2 *c = &cpuid_data.entries[cpuid_i++];
@@ -56,26 +55,17 @@ int kvm_arch_init_vcpu(CPUState *env)
/* Keep reading function 2 till all the input is received */
int times;
- cpu_x86_cpuid(env, i, 0, &eax, &ebx, &ecx, &edx);
- times = eax & 0xff;
-
c->function = i;
- c->flags |= KVM_CPUID_FLAG_STATEFUL_FUNC;
- c->flags |= KVM_CPUID_FLAG_STATE_READ_NEXT;
- c->eax = eax;
- c->ebx = ebx;
- c->ecx = ecx;
- c->edx = edx;
+ c->flags = KVM_CPUID_FLAG_STATEFUL_FUNC |
+ KVM_CPUID_FLAG_STATE_READ_NEXT;
+ cpu_x86_cpuid(env, i, 0, &c->eax, &c->ebx, &c->ecx, &c->edx);
+ times = c->eax & 0xff;
for (j = 1; j < times; ++j) {
- cpu_x86_cpuid(env, i, 0, &eax, &ebx, &ecx, &edx);
+ c = &cpuid_data.entries[cpuid_i++];
c->function = i;
- c->flags |= KVM_CPUID_FLAG_STATEFUL_FUNC;
- c->eax = eax;
- c->ebx = ebx;
- c->ecx = ecx;
- c->edx = edx;
- c = &cpuid_data.entries[++cpuid_i];
+ c->flags = KVM_CPUID_FLAG_STATEFUL_FUNC;
+ cpu_x86_cpuid(env, i, 0, &c->eax, &c->ebx, &c->ecx, &c->edx);
}
break;
}
@@ -83,46 +73,36 @@ int kvm_arch_init_vcpu(CPUState *env)
case 0xb:
case 0xd:
for (j = 0; ; j++) {
- cpu_x86_cpuid(env, i, j, &eax, &ebx, &ecx, &edx);
c->function = i;
c->flags = KVM_CPUID_FLAG_SIGNIFCANT_INDEX;
c->index = j;
- c->eax = eax;
- c->ebx = ebx;
- c->ecx = ecx;
- c->edx = edx;
- c = &cpuid_data.entries[++cpuid_i];
+ cpu_x86_cpuid(env, i, j, &c->eax, &c->ebx, &c->ecx, &c->edx);
- if (i == 4 && eax == 0)
+ if (i == 4 && c->eax == 0)
break;
- if (i == 0xb && !(ecx & 0xff00))
+ if (i == 0xb && !(c->ecx & 0xff00))
break;
- if (i == 0xd && eax == 0)
+ if (i == 0xd && c->eax == 0)
break;
+
+ c = &cpuid_data.entries[cpuid_i++];
}
break;
default:
- cpu_x86_cpuid(env, i, 0, &eax, &ebx, &ecx, &edx);
c->function = i;
- c->eax = eax;
- c->ebx = ebx;
- c->ecx = ecx;
- c->edx = edx;
+ c->flags = 0;
+ cpu_x86_cpuid(env, i, 0, &c->eax, &c->ebx, &c->ecx, &c->edx);
break;
}
}
- cpu_x86_cpuid(env, 0x80000000, 0, &eax, &ebx, &ecx, &edx);
- limit = eax;
+ cpu_x86_cpuid(env, 0x80000000, 0, &limit, &unused, &unused, &unused);
for (i = 0x80000000; i <= limit; i++) {
struct kvm_cpuid_entry2 *c = &cpuid_data.entries[cpuid_i++];
- cpu_x86_cpuid(env, i, 0, &eax, &ebx, &ecx, &edx);
c->function = i;
- c->eax = eax;
- c->ebx = ebx;
- c->ecx = ecx;
- c->edx = edx;
+ c->flags = 0;
+ cpu_x86_cpuid(env, i, 0, &c->eax, &c->ebx, &c->ecx, &c->edx);
}
cpuid_data.cpuid.nent = cpuid_i;
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 257 bytes --]
next reply other threads:[~2009-04-13 8:53 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-04-13 8:53 Jan Kiszka [this message]
2009-04-13 14:07 ` [Qemu-devel] [PATCH][STABLE] kvm: Fix cpuid initialization Christoph Hellwig
2009-04-13 16:20 ` [Qemu-devel] " Jan Kiszka
2009-04-13 18:21 ` Christoph Hellwig
2009-04-17 21:21 ` [Qemu-devel] " Anthony Liguori
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=49E2FD72.6000101@web.de \
--to=jan.kiszka@web.de \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).