On Thu, Mar 22, 2012 at 09:50:43AM +0100, Stefan Bader wrote:
> >From eaee58e1433e1b16e686cfcdcbc207d4310a239f Mon Sep 17 00:00:00 2001
> From: =?UTF-8?q?Stephan=20B=C3=A4rwolf?= <stephan.baerw...@tu-ilmenau.de>
> Date: Thu, 12 Jan 2012 16:43:03 +0100
> Subject: [PATCH 7/8] KVM: x86: extend "struct x86_emulate_ops" with
>  "get_cpuid"
> 
> In order to be able to proceed checks on CPU-specific properties
> within the emulator, function "get_cpuid" is introduced.
> With "get_cpuid" it is possible to virtually call the guests
> "cpuid"-opcode without changing the VM's context.
> 
> [mtosatti: cleanup/beautify code]
> 
> Signed-off-by: Stephan Baerwolf <stephan.baerw...@tu-ilmenau.de>
> Signed-off-by: Marcelo Tosatti <mtosa...@redhat.com>
> 
> (cherry-picked from commit bdb42f5afebe208eae90406959383856ae2caf2b upstream)
> Signed-off-by: Stefan Bader <stefan.ba...@canonical.com>
> ---
>  arch/x86/include/asm/kvm_emulate.h |    3 +++
>  arch/x86/kvm/x86.c                 |   23 +++++++++++++++++++++++
>  2 files changed, 26 insertions(+), 0 deletions(-)
> 
> diff --git a/arch/x86/include/asm/kvm_emulate.h 
> b/arch/x86/include/asm/kvm_emulate.h
> index 0049211..18e54f1 100644
> --- a/arch/x86/include/asm/kvm_emulate.h
> +++ b/arch/x86/include/asm/kvm_emulate.h
> @@ -189,6 +189,9 @@ struct x86_emulate_ops {
>       int (*intercept)(struct x86_emulate_ctxt *ctxt,
>                        struct x86_instruction_info *info,
>                        enum x86_intercept_stage stage);
> +
> +     bool (*get_cpuid)(struct x86_emulate_ctxt *ctxt,
> +                      u32 *eax, u32 *ebx, u32 *ecx, u32 *edx);
>  };
>  
>  typedef u32 __attribute__((vector_size(16))) sse128_t;
> diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
> index bc58ede..8e15578 100644
> --- a/arch/x86/kvm/x86.c
> +++ b/arch/x86/kvm/x86.c
> @@ -4436,6 +4436,28 @@ static int emulator_intercept(struct x86_emulate_ctxt 
> *ctxt,
>       return kvm_x86_ops->check_intercept(emul_to_vcpu(ctxt), info, stage);
>  }
>  
> +static bool emulator_get_cpuid(struct x86_emulate_ctxt *ctxt,
> +                            u32 *eax, u32 *ebx, u32 *ecx, u32 *edx)
> +{
> +     struct kvm_cpuid_entry2 *cpuid = NULL;
> +
> +     if (eax && ecx)
> +             cpuid = kvm_find_cpuid_entry(emul_to_vcpu(ctxt),
> +                                         *eax, *ecx);
> +
> +     if (cpuid) {
> +             *eax = cpuid->eax;
> +             *ecx = cpuid->ecx;
> +             if (ebx)
> +                     *ebx = cpuid->ebx;
> +             if (edx)
> +                     *edx = cpuid->edx;
> +             return true;
> +     }
> +
> +     return false;
> +}
> +
>  static struct x86_emulate_ops emulate_ops = {
>       .read_std            = kvm_read_guest_virt_system,
>       .write_std           = kvm_write_guest_virt_system,
> @@ -4466,6 +4488,7 @@ static struct x86_emulate_ops emulate_ops = {
>       .get_fpu             = emulator_get_fpu,
>       .put_fpu             = emulator_put_fpu,
>       .intercept           = emulator_intercept,
> +     .get_cpuid           = emulator_get_cpuid,
>  };
>  
>  static void cache_all_regs(struct kvm_vcpu *vcpu)

ACK
--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to