From: Amit Shah <amit.shah@redhat.com>
To: avi@redhat.com
Cc: kvm@vger.kernel.org, Amit Shah <amit.shah@redhat.com>
Subject: [PATCH] KVM: userspace: Fetch sub-leaf cpuid values for functions 4, 0xb, 0xd.
Date: Mon, 12 Jan 2009 11:59:13 +0000 [thread overview]
Message-ID: <1231761553-13055-1-git-send-email-amit.shah@redhat.com> (raw)
CPUID functions 4, 0xb and 0xd have sub-leaf values which depend on the
input value of ECX. Fetch these cpuid values and pass them on to the kernel.
Signed-off-by: Amit Shah <amit.shah@redhat.com>
---
qemu/qemu-kvm-x86.c | 24 +++++++++++++++++++-----
1 files changed, 19 insertions(+), 5 deletions(-)
diff --git a/qemu/qemu-kvm-x86.c b/qemu/qemu-kvm-x86.c
index 4fad2af..fbcd2bd 100644
--- a/qemu/qemu-kvm-x86.c
+++ b/qemu/qemu-kvm-x86.c
@@ -463,9 +463,10 @@ void kvm_arch_save_regs(CPUState *env)
}
static void do_cpuid_ent(struct kvm_cpuid_entry *e, uint32_t function,
- CPUState *env)
+ uint32_t count, CPUState *env)
{
env->regs[R_EAX] = function;
+ env->regs[R_ECX] = count;
qemu_kvm_cpuid_on_env(env);
e->function = function;
e->eax = env->regs[R_EAX];
@@ -514,7 +515,7 @@ int kvm_arch_qemu_init_env(CPUState *cenv)
#endif
int cpuid_nent = 0;
CPUState copy;
- uint32_t i, limit;
+ uint32_t i, j, limit;
copy = *cenv;
@@ -539,15 +540,28 @@ int kvm_arch_qemu_init_env(CPUState *cenv)
qemu_kvm_cpuid_on_env(©);
limit = copy.regs[R_EAX];
- for (i = 0; i <= limit; ++i)
- do_cpuid_ent(&cpuid_ent[cpuid_nent++], i, ©);
+ for (i = 0; i <= limit; ++i) {
+ if (i == 4 || i == 0xb || i == 0xd) {
+ for (j = 0; ; ++j) {
+ do_cpuid_ent(&cpuid_ent[cpuid_nent++], i, j, ©);
+
+ if (i == 4 && copy.regs[R_EAX] == 0)
+ break;
+ if (i == 0xb && !(copy.regs[R_ECX] & 0xff00))
+ break;
+ if (i == 0xd && copy.regs[R_EAX] == 0)
+ break;
+ }
+ } else
+ do_cpuid_ent(&cpuid_ent[cpuid_nent++], i, 0, ©);
+ }
copy.regs[R_EAX] = 0x80000000;
qemu_kvm_cpuid_on_env(©);
limit = copy.regs[R_EAX];
for (i = 0x80000000; i <= limit; ++i)
- do_cpuid_ent(&cpuid_ent[cpuid_nent++], i, ©);
+ do_cpuid_ent(&cpuid_ent[cpuid_nent++], i, 0, ©);
kvm_setup_cpuid(kvm_context, cenv->cpu_index, cpuid_nent, cpuid_ent);
return 0;
--
1.6.0.6
next reply other threads:[~2009-01-12 11:59 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-01-12 11:59 Amit Shah [this message]
2009-01-14 16:51 Support for cpuid functions with subleaves Amit Shah
2009-01-14 16:51 ` [PATCH] kvm: libkvm: Add a wrapper for an ioctl for the KVM_SET_CPUID2 interface Amit Shah
2009-01-14 16:51 ` [PATCH] kvm: userspace: Fetch sub-leaf cpuid values for functions 4, 0xb, 0xd Amit Shah
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=1231761553-13055-1-git-send-email-amit.shah@redhat.com \
--to=amit.shah@redhat.com \
--cc=avi@redhat.com \
--cc=kvm@vger.kernel.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.