All of lore.kernel.org
 help / color / mirror / Atom feed
From: Gleb Natapov <gleb@redhat.com>
To: Paolo Bonzini <pbonzini@redhat.com>
Cc: Bandan Das <bsd@redhat.com>,
	kvm@vger.kernel.org, Marcelo Tosatti <mtosatti@redhat.com>
Subject: Re: [PATCH 1/2] kvm: make vendor_intel a generic function
Date: Thu, 30 May 2013 09:07:38 +0300	[thread overview]
Message-ID: <20130530060738.GA28405@redhat.com> (raw)
In-Reply-To: <51A6E5F5.8010605@redhat.com>

On Thu, May 30, 2013 at 07:39:01AM +0200, Paolo Bonzini wrote:
> Il 29/05/2013 23:40, Bandan Das ha scritto:
> > Make vendor_intel generic so that functions in x86.c
> > can use it.
> > 
> > Signed-off-by: Bandan Das <bsd@redhat.com>
> > ---
> >  arch/x86/include/asm/kvm_emulate.h | 13 -------------
> >  arch/x86/include/asm/kvm_host.h    | 28 ++++++++++++++++++++++++++++
> >  arch/x86/kvm/emulate.c             | 15 +++------------
> >  arch/x86/kvm/x86.c                 |  3 ---
> >  4 files changed, 31 insertions(+), 28 deletions(-)
> > 
> > diff --git a/arch/x86/include/asm/kvm_emulate.h b/arch/x86/include/asm/kvm_emulate.h
> > index 15f960c..611a55f 100644
> > --- a/arch/x86/include/asm/kvm_emulate.h
> > +++ b/arch/x86/include/asm/kvm_emulate.h
> > @@ -319,19 +319,6 @@ struct x86_emulate_ctxt {
> >  #define REPE_PREFIX	0xf3
> >  #define REPNE_PREFIX	0xf2
> >  
> > -/* CPUID vendors */
> > -#define X86EMUL_CPUID_VENDOR_AuthenticAMD_ebx 0x68747541
> > -#define X86EMUL_CPUID_VENDOR_AuthenticAMD_ecx 0x444d4163
> > -#define X86EMUL_CPUID_VENDOR_AuthenticAMD_edx 0x69746e65
> > -
> > -#define X86EMUL_CPUID_VENDOR_AMDisbetterI_ebx 0x69444d41
> > -#define X86EMUL_CPUID_VENDOR_AMDisbetterI_ecx 0x21726574
> > -#define X86EMUL_CPUID_VENDOR_AMDisbetterI_edx 0x74656273
> > -
> > -#define X86EMUL_CPUID_VENDOR_GenuineIntel_ebx 0x756e6547
> > -#define X86EMUL_CPUID_VENDOR_GenuineIntel_ecx 0x6c65746e
> > -#define X86EMUL_CPUID_VENDOR_GenuineIntel_edx 0x49656e69
> > -
> >  enum x86_intercept_stage {
> >  	X86_ICTP_NONE = 0,   /* Allow zero-init to not match anything */
> >  	X86_ICPT_PRE_EXCEPT,
> > diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
> > index 3741c65..d2ab1ff 100644
> > --- a/arch/x86/include/asm/kvm_host.h
> > +++ b/arch/x86/include/asm/kvm_host.h
> > @@ -144,6 +144,23 @@ enum {
> >  
> >  #include <asm/kvm_emulate.h>
> >  
> > +/* CPUID vendors */
> > +#define X86EMUL_CPUID_VENDOR_AuthenticAMD_ebx 0x68747541
> > +#define X86EMUL_CPUID_VENDOR_AuthenticAMD_ecx 0x444d4163
> > +#define X86EMUL_CPUID_VENDOR_AuthenticAMD_edx 0x69746e65
> > +
> > +#define X86EMUL_CPUID_VENDOR_AMDisbetterI_ebx 0x69444d41
> > +#define X86EMUL_CPUID_VENDOR_AMDisbetterI_ecx 0x21726574
> > +#define X86EMUL_CPUID_VENDOR_AMDisbetterI_edx 0x74656273
> > +
> > +#define X86EMUL_CPUID_VENDOR_GenuineIntel_ebx 0x756e6547
> > +#define X86EMUL_CPUID_VENDOR_GenuineIntel_ecx 0x6c65746e
> > +#define X86EMUL_CPUID_VENDOR_GenuineIntel_edx 0x49656e69
> > +
> > +void kvm_cpuid(struct kvm_vcpu *vcpu, u32 *eax, u32 *ebx, u32 *ecx, u32 *edx);
> > +#define emul_to_vcpu(ctxt) \
> > +	container_of(ctxt, struct kvm_vcpu, arch.emulate_ctxt)
> > +
> >  #define KVM_NR_MEM_OBJS 40
> >  
> >  #define KVM_NR_DB_REGS	4
> > @@ -942,6 +959,17 @@ static inline unsigned long read_msr(unsigned long msr)
> >  }
> >  #endif
> >  
> > +static inline bool vendor_intel(struct kvm_vcpu *vcpu)
> > +{
> > +	u32 eax, ebx, ecx, edx;
> > +
> > +	eax = ecx = 0;
> > +	kvm_cpuid(vcpu, &eax, &ebx, &ecx, &edx);
> > +	return ebx == X86EMUL_CPUID_VENDOR_GenuineIntel_ebx
> > +		&& ecx == X86EMUL_CPUID_VENDOR_GenuineIntel_ecx
> > +		&& edx == X86EMUL_CPUID_VENDOR_GenuineIntel_edx;
> > +}
> > +
> >  static inline u32 get_rdx_init_val(void)
> >  {
> >  	return 0x600; /* P6 family */
> > diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
> > index 8db0010..dfa28a3 100644
> > --- a/arch/x86/kvm/emulate.c
> > +++ b/arch/x86/kvm/emulate.c
> > @@ -2280,17 +2280,6 @@ setup_syscalls_segments(struct x86_emulate_ctxt *ctxt,
> >  	ss->avl = 0;
> >  }
> >  
> > -static bool vendor_intel(struct x86_emulate_ctxt *ctxt)
> > -{
> > -	u32 eax, ebx, ecx, edx;
> > -
> > -	eax = ecx = 0;
> > -	ctxt->ops->get_cpuid(ctxt, &eax, &ebx, &ecx, &edx);
> > -	return ebx == X86EMUL_CPUID_VENDOR_GenuineIntel_ebx
> > -		&& ecx == X86EMUL_CPUID_VENDOR_GenuineIntel_ecx
> > -		&& edx == X86EMUL_CPUID_VENDOR_GenuineIntel_edx;
> > -}
> > -
> >  static bool em_syscall_is_enabled(struct x86_emulate_ctxt *ctxt)
> >  {
> >  	const struct x86_emulate_ops *ops = ctxt->ops;
> > @@ -2396,6 +2385,8 @@ static int em_syscall(struct x86_emulate_ctxt *ctxt)
> >  static int em_sysenter(struct x86_emulate_ctxt *ctxt)
> >  {
> >  	const struct x86_emulate_ops *ops = ctxt->ops;
> > +	struct kvm_vcpu *vcpu = emul_to_vcpu(ctxt);
> 
> Unfortunately, this is not acceptable.  The emulator is not supposed to
> know about the vcpu.  Everything has to go through the context; in
> principle, the emulator should be usable outside of KVM.
> 
> I would just duplicate the code in kvm_guest_vcpu_model (perhaps you can
> rename it to kvm_cpuid_get_intel_model or something like that; having
> both "guest" and "vcpu" in the name is a pleonasm :)).
> 
I thought having inline function that gets &eax, &ebx, &ecx, &edx as a
parameter and returns a vendor.

> Paolo
> 
> > +
> >  	struct desc_struct cs, ss;
> >  	u64 msr_data;
> >  	u16 cs_sel, ss_sel;
> > @@ -2411,7 +2402,7 @@ static int em_sysenter(struct x86_emulate_ctxt *ctxt)
> >  	 * mode).
> >  	 */
> >  	if ((ctxt->mode == X86EMUL_MODE_PROT32) && (efer & EFER_LMA)
> > -	    && !vendor_intel(ctxt))
> > +	    && !vendor_intel(vcpu))
> >  		return emulate_ud(ctxt);
> >  
> >  	/* XXX sysenter/sysexit have not been tested in 64bit mode.
> > diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
> > index 094b5d9..2fb4faf 100644
> > --- a/arch/x86/kvm/x86.c
> > +++ b/arch/x86/kvm/x86.c
> > @@ -68,9 +68,6 @@
> >  #define KVM_MAX_MCE_BANKS 32
> >  #define KVM_MCE_CAP_SUPPORTED (MCG_CTL_P | MCG_SER_P)
> >  
> > -#define emul_to_vcpu(ctxt) \
> > -	container_of(ctxt, struct kvm_vcpu, arch.emulate_ctxt)
> > -
> >  /* EFER defaults:
> >   * - enable syscall per default because its emulated by KVM
> >   * - enable LME and LMA per default on 64 bit KVM
> > 
> 

--
			Gleb.

  reply	other threads:[~2013-05-30  6:07 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-05-29 21:40 [PATCH 0/2] kvm: x86: Emulate MSR_PLATFORM_INFO Bandan Das
2013-05-29 21:40 ` [PATCH 1/2] kvm: make vendor_intel a generic function Bandan Das
2013-05-30  5:39   ` Paolo Bonzini
2013-05-30  6:07     ` Gleb Natapov [this message]
2013-05-30  6:32       ` Paolo Bonzini
2013-06-04 16:10         ` Bandan Das
2013-05-29 21:40 ` [PATCH 2/2] kvm: x86: emulate MSR_PLATFORM_INFO Bandan Das

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=20130530060738.GA28405@redhat.com \
    --to=gleb@redhat.com \
    --cc=bsd@redhat.com \
    --cc=kvm@vger.kernel.org \
    --cc=mtosatti@redhat.com \
    --cc=pbonzini@redhat.com \
    /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.