* Support for cpuid functions with subleaves
@ 2009-01-13 10:47 Amit Shah
0 siblings, 0 replies; 5+ messages in thread
From: Amit Shah @ 2009-01-13 10:47 UTC (permalink / raw)
To: avi; +Cc: kvm
These patches add support for handling sub-leaf values of some cpuid functions.
The kernel patch updates a userspace-visible for a typo. That value is not
yet used in the userspace so this should be harmless.
With these patches, a VM with the core2duo cpu type boots successfully.
Amit.
^ permalink raw reply [flat|nested] 5+ messages in thread
* Support for cpuid functions with subleaves
@ 2009-01-14 16:51 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-15 9:39 ` Support for cpuid functions with subleaves Avi Kivity
0 siblings, 2 replies; 5+ messages in thread
From: Amit Shah @ 2009-01-14 16:51 UTC (permalink / raw)
To: avi; +Cc: kvm
Hello,
v3 of the patch uses the KVM_SET_CPUID2 interface to not cause any userspace
and kernel incompatibilities.
With these patches applied, I can run a VM with a newer CPU type (core2duo).
Fixes bug #2413430
Please apply
Amit
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH] kvm: libkvm: Add a wrapper for an ioctl for the KVM_SET_CPUID2 interface
2009-01-14 16:51 Support for cpuid functions with subleaves Amit Shah
@ 2009-01-14 16:51 ` Amit Shah
2009-01-14 16:51 ` [PATCH] kvm: userspace: Fetch sub-leaf cpuid values for functions 4, 0xb, 0xd Amit Shah
2009-01-15 9:39 ` Support for cpuid functions with subleaves Avi Kivity
1 sibling, 1 reply; 5+ messages in thread
From: Amit Shah @ 2009-01-14 16:51 UTC (permalink / raw)
To: avi; +Cc: kvm, Amit Shah
kvm_set_cpuid2() builds on top of kvm_set_cpuid() and correctly populates
cpuid functions that have sub-leaves.
Signed-off-by: Amit Shah <amit.shah@redhat.com>
---
libkvm/libkvm-x86.c | 21 +++++++++++++++++++++
libkvm/libkvm.h | 16 ++++++++++++++++
2 files changed, 37 insertions(+), 0 deletions(-)
diff --git a/libkvm/libkvm-x86.c b/libkvm/libkvm-x86.c
index a8cca15..dcef548 100644
--- a/libkvm/libkvm-x86.c
+++ b/libkvm/libkvm-x86.c
@@ -475,6 +475,27 @@ int kvm_setup_cpuid(kvm_context_t kvm, int vcpu, int nent,
return r;
}
+int kvm_setup_cpuid2(kvm_context_t kvm, int vcpu, int nent,
+ struct kvm_cpuid_entry2 *entries)
+{
+ struct kvm_cpuid2 *cpuid;
+ int r;
+
+ cpuid = malloc(sizeof(*cpuid) + nent * sizeof(*entries));
+ if (!cpuid)
+ return -ENOMEM;
+
+ cpuid->nent = nent;
+ memcpy(cpuid->entries, entries, nent * sizeof(*entries));
+ r = ioctl(kvm->vcpu_fd[vcpu], KVM_SET_CPUID2, cpuid);
+ if (r == -1) {
+ fprintf(stderr, "kvm_setup_cpuid2: %m\n");
+ return -errno;
+ }
+ free(cpuid);
+ return r;
+}
+
int kvm_set_shadow_pages(kvm_context_t kvm, unsigned int nrshadow_pages)
{
#ifdef KVM_CAP_MMU_SHADOW_CACHE_CONTROL
diff --git a/libkvm/libkvm.h b/libkvm/libkvm.h
index ee1ba68..5728b1c 100644
--- a/libkvm/libkvm.h
+++ b/libkvm/libkvm.h
@@ -373,6 +373,22 @@ int kvm_setup_cpuid(kvm_context_t kvm, int vcpu, int nent,
struct kvm_cpuid_entry *entries);
/*!
+ * \brief Setup a vcpu's cpuid instruction emulation
+ *
+ * Set up a table of cpuid function to cpuid outputs.
+ * This call replaces the older kvm_setup_cpuid interface by adding a few
+ * parameters to support cpuid functions that have sub-leaf values.
+ *
+ * \param kvm Pointer to the current kvm_context
+ * \param vcpu Which virtual CPU should be initialized
+ * \param nent number of entries to be installed
+ * \param entries cpuid function entries table
+ * \return 0 on success, or -errno on error
+ */
+int kvm_setup_cpuid2(kvm_context_t kvm, int vcpu, int nent,
+ struct kvm_cpuid_entry2 *entries);
+
+/*!
* \brief Setting the number of shadow pages to be allocated to the vm
*
* \param kvm pointer to kvm_context
--
1.6.0.6
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH] kvm: userspace: Fetch sub-leaf cpuid values for functions 4, 0xb, 0xd.
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 ` Amit Shah
0 siblings, 0 replies; 5+ messages in thread
From: Amit Shah @ 2009-01-14 16:51 UTC (permalink / raw)
To: avi; +Cc: kvm, Amit Shah
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.
We also switch to the kvm_set_cpuid2() ioctl for this; kvm_set_cpuid() can't
handle the extra parameters we need to support sub-leaves.
Signed-off-by: Amit Shah <amit.shah@redhat.com>
---
qemu/qemu-kvm-x86.c | 37 ++++++++++++++++++++++++++++---------
1 files changed, 28 insertions(+), 9 deletions(-)
diff --git a/qemu/qemu-kvm-x86.c b/qemu/qemu-kvm-x86.c
index 4fad2af..52ddd33 100644
--- a/qemu/qemu-kvm-x86.c
+++ b/qemu/qemu-kvm-x86.c
@@ -462,10 +462,11 @@ void kvm_arch_save_regs(CPUState *env)
}
}
-static void do_cpuid_ent(struct kvm_cpuid_entry *e, uint32_t function,
- CPUState *env)
+static void do_cpuid_ent(struct kvm_cpuid_entry2 *e, uint32_t function,
+ 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];
@@ -507,14 +508,14 @@ static int get_para_features(kvm_context_t kvm_context)
int kvm_arch_qemu_init_env(CPUState *cenv)
{
- struct kvm_cpuid_entry cpuid_ent[100];
+ struct kvm_cpuid_entry2 cpuid_ent[100];
#ifdef KVM_CPUID_SIGNATURE
- struct kvm_cpuid_entry *pv_ent;
+ struct kvm_cpuid_entry2 *pv_ent;
uint32_t signature[3];
#endif
int cpuid_nent = 0;
CPUState copy;
- uint32_t i, limit;
+ uint32_t i, j, limit;
copy = *cenv;
@@ -539,17 +540,35 @@ 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, ©);
+
+ cpuid_ent[cpuid_nent].flags = KVM_CPUID_FLAG_SIGNIFCANT_INDEX;
+ cpuid_ent[cpuid_nent].index = j;
+
+ cpuid_nent++;
+
+ 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);
+ kvm_setup_cpuid2(kvm_context, cenv->cpu_index, cpuid_nent, cpuid_ent);
return 0;
}
--
1.6.0.6
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: Support for cpuid functions with subleaves
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-15 9:39 ` Avi Kivity
1 sibling, 0 replies; 5+ messages in thread
From: Avi Kivity @ 2009-01-15 9:39 UTC (permalink / raw)
To: Amit Shah; +Cc: kvm
Amit Shah wrote:
> Hello,
>
> v3 of the patch uses the KVM_SET_CPUID2 interface to not cause any userspace
> and kernel incompatibilities.
>
> With these patches applied, I can run a VM with a newer CPU type (core2duo).
>
> Fixes bug #2413430
>
> Please apply
>
Applied both, thanks.
--
error compiling committee.c: too many arguments to function
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2009-01-15 9:39 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
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
2009-01-15 9:39 ` Support for cpuid functions with subleaves Avi Kivity
-- strict thread matches above, loose matches on Subject: below --
2009-01-13 10:47 Amit Shah
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox