From: Anthony Liguori <aliguori@us.ibm.com>
To: Glauber Costa <glommer@redhat.com>
Cc: qemu-devel@nongnu.org
Subject: [Qemu-devel] Re: [PATCH 1/3] expose paravirt feature list to cpuid
Date: Wed, 28 Jan 2009 15:36:40 -0600 [thread overview]
Message-ID: <4980CFE8.5050808@us.ibm.com> (raw)
In-Reply-To: <1233169325-5487-2-git-send-email-glommer@redhat.com>
Glauber Costa wrote:
> Expose the paravirt features provided by the host to the guest.
> The features exposed uses qemu just as a medium, since they only
> depend on a negotiation between the host and guest directly.
>
> As a direct result, we're now able to run the kvm pvclock in qemu
> based kvm guests.
>
> Signed-off-by: Glauber Costa <glommer@redhat.com>
> ---
> kvm.h | 1 +
> target-i386/kvm.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++--
> 2 files changed, 48 insertions(+), 2 deletions(-)
>
> diff --git a/kvm.h b/kvm.h
> index efce145..db58baa 100644
> --- a/kvm.h
> +++ b/kvm.h
> @@ -17,6 +17,7 @@
> #include "config.h"
>
> #ifdef CONFIG_KVM
> +#include <linux/kvm_para.h>
> extern int kvm_allowed;
>
> #define kvm_enabled() (kvm_allowed)
> diff --git a/target-i386/kvm.c b/target-i386/kvm.c
> index 2412ae4..7f4e5aa 100644
> --- a/target-i386/kvm.c
> +++ b/target-i386/kvm.c
> @@ -33,16 +33,61 @@
> do { } while (0)
> #endif
>
> +struct kvm_para_features {
> + int cap;
> + int feature;
> +} para_features[] = {
> +#ifdef KVM_CAP_CLOCKSOURCE
> + { KVM_CAP_CLOCKSOURCE, KVM_FEATURE_CLOCKSOURCE },
> +#endif
> +#ifdef KVM_CAP_NOP_IO_DELAY
> + { KVM_CAP_NOP_IO_DELAY, KVM_FEATURE_NOP_IO_DELAY },
> +#endif
> +#ifdef KVM_CAP_PV_MMU
> + { KVM_CAP_PV_MMU, KVM_FEATURE_MMU_OP },
> +#endif
> +#ifdef KVM_CAP_CR3_CACHE
> + { KVM_CAP_CR3_CACHE, KVM_FEATURE_CR3_CACHE },
> +#endif
> +};
> +
> +static uint32_t get_para_features(CPUState *env)
> +{
> + uint32_t i, features = 0;
> +
> + for (i = 0; i < ARRAY_SIZE(para_features); i++) {
> + if (kvm_ioctl(env->kvm_state, KVM_CHECK_EXTENSION, para_features[i].cap))
> + features |= (1 << para_features[i].feature);
> + }
> +
> + return features;
> +}
> int kvm_arch_init_vcpu(CPUState *env)
> {
> struct {
> struct kvm_cpuid cpuid;
> struct kvm_cpuid_entry entries[100];
> } __attribute__((packed)) cpuid_data;
> - uint32_t limit, i, cpuid_i;
> + uint32_t limit, i, cpuid_i = 0;
> uint32_t eax, ebx, ecx, edx;
> +#ifdef KVM_CPUID_SIGNATURE
> + struct kvm_cpuid_entry *pv_ent;
> +
> + /* Paravirtualization CPUIDs */
> + pv_ent = &cpuid_data.entries[cpuid_i++];
> + memset(pv_ent, 0, sizeof(*pv_ent));
> + pv_ent->function = KVM_CPUID_SIGNATURE;
> + pv_ent->eax = 0;
> + pv_ent->ebx = 0x4b4d564b; /* KVMKVMK */
> + pv_ent->ecx = 0x564b4d56; /* VMKV */
> + pv_ent->edx = 0x0000004d; /* M */
> +
> + pv_ent = &cpuid_data.entries[cpuid_i++];
> + memset(pv_ent, 0, sizeof(*pv_ent));
> + pv_ent->function = KVM_CPUID_FEATURES;
> + pv_ent->eax = get_para_features(env);
>
I think this would be better suited for target-i386/helper.c in
cpu_x86_cpuid(). It can be in an if (kvm_enabled()) for now but there
should be a comment mentioning that we could enable some of these
features in normal QEMU.
It can call a kvm helper function from target-i386/kvm.c to determine
which features are supported (that could be later hooked by TCG).
Regards,
Anthony Liguori
> +#endif
>
> - cpuid_i = 0;
>
> cpu_x86_cpuid(env, 0, &eax, &ebx, &ecx, &edx);
> limit = eax;
>
prev parent reply other threads:[~2009-01-28 21:37 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-01-28 19:02 [Qemu-devel] [PATCH 0/3] Enhance kvm cpuid Glauber Costa
2009-01-28 19:02 ` [Qemu-devel] [PATCH 1/3] expose paravirt feature list to cpuid Glauber Costa
2009-01-28 19:02 ` [Qemu-devel] [PATCH 2/3] convert cpuid registration to KVM_SET_CPUID2 Glauber Costa
2009-01-28 19:02 ` [Qemu-devel] [PATCH 3/3] mask out forbidden cpuid features Glauber Costa
2009-01-28 21:36 ` Anthony Liguori [this message]
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=4980CFE8.5050808@us.ibm.com \
--to=aliguori@us.ibm.com \
--cc=glommer@redhat.com \
--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 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.