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 <[email protected]>
> > ---
> > 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.
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html