[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 4/6] x86/hvm: Move hvm_funcs.cpuid_intercept() handling into hvm_cpuid()
This reduces the net complexity of CPUID handling by having all adjustments in at the same place. Remove the now-unused hvm_funcs.cpuid_intercept infrastructure. Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> --- CC: Jan Beulich <JBeulich@xxxxxxxx> CC: Jun Nakajima <jun.nakajima@xxxxxxxxx> CC: Kevin Tian <kevin.tian@xxxxxxxxx> CC: Boris Ostrovsky <boris.ostrovsky@xxxxxxxxxx> CC: Suravee Suthikulpanit <suravee.suthikulpanit@xxxxxxx> --- xen/arch/x86/hvm/emulate.c | 2 +- xen/arch/x86/hvm/hvm.c | 21 +++++++++++++++------ xen/arch/x86/hvm/svm/svm.c | 39 ++------------------------------------- xen/arch/x86/hvm/vmx/vmx.c | 31 ++----------------------------- xen/include/asm-x86/hvm/hvm.h | 3 --- 5 files changed, 20 insertions(+), 76 deletions(-) diff --git a/xen/arch/x86/hvm/emulate.c b/xen/arch/x86/hvm/emulate.c index e9b8f8c..540458c 100644 --- a/xen/arch/x86/hvm/emulate.c +++ b/xen/arch/x86/hvm/emulate.c @@ -1558,7 +1558,7 @@ int hvmemul_cpuid( hvm_check_cpuid_faulting(current) ) return X86EMUL_EXCEPTION; - hvm_funcs.cpuid_intercept(eax, ebx, ecx, edx); + hvm_cpuid(*eax, eax, ebx, ecx, edx); return X86EMUL_OKAY; } diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c index afd14c4..862ab76 100644 --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -906,12 +906,7 @@ const char *hvm_efer_valid(const struct vcpu *v, uint64_t value, ASSERT(v->domain == current->domain); hvm_cpuid(0x80000000, &level, NULL, NULL, NULL); if ( (level >> 16) == 0x8000 && level > 0x80000000 ) - { - unsigned int dummy; - - level = 0x80000001; - hvm_funcs.cpuid_intercept(&level, &dummy, &ext1_ecx, &ext1_edx); - } + hvm_cpuid(0x80000001, NULL, NULL, &ext1_ecx, &ext1_edx); } else { @@ -3676,6 +3671,12 @@ void hvm_cpuid(unsigned int input, unsigned int *eax, unsigned int *ebx, if ( !(hvm_pae_enabled(v) || hvm_long_mode_enabled(v)) ) *edx &= ~cpufeat_mask(X86_FEATURE_PSE36); } + + /* SYSCALL is hidden outside of long mode on Intel. */ + if ( d->arch.x86_vendor == X86_VENDOR_INTEL && + !hvm_long_mode_enabled(v)) + *edx &= ~cpufeat_mask(X86_FEATURE_SYSCALL); + break; case 0x80000007: @@ -3700,6 +3701,14 @@ void hvm_cpuid(unsigned int input, unsigned int *eax, unsigned int *ebx, *ebx &= hvm_featureset[FEATURESET_e8b]; break; + + case 0x8000001c: + if ( !(v->arch.xcr0 & XSTATE_LWP) ) + *eax = 0; + else if ( cpu_has_svm && cpu_has_lwp ) + /* Turn on available bit and other features specified in lwp_cfg. */ + *eax = (*edx & v->arch.hvm_svm.guest_lwp_cfg) | 1; + break; } } diff --git a/xen/arch/x86/hvm/svm/svm.c b/xen/arch/x86/hvm/svm/svm.c index c9dbbea..0668717 100644 --- a/xen/arch/x86/hvm/svm/svm.c +++ b/xen/arch/x86/hvm/svm/svm.c @@ -1562,41 +1562,6 @@ static void svm_fpu_dirty_intercept(void) vmcb_set_cr0(vmcb, vmcb_get_cr0(vmcb) & ~X86_CR0_TS); } -static void svm_cpuid_intercept( - unsigned int *eax, unsigned int *ebx, - unsigned int *ecx, unsigned int *edx) -{ - unsigned int input = *eax; - struct vcpu *v = current; - - hvm_cpuid(input, eax, ebx, ecx, edx); - - switch (input) { - case 0x8000001c: - { - /* LWP capability CPUID */ - uint64_t lwp_cfg = v->arch.hvm_svm.guest_lwp_cfg; - - if ( cpu_has_lwp ) - { - if ( !(v->arch.xcr0 & XSTATE_LWP) ) - { - *eax = 0x0; - break; - } - - /* turn on available bit and other features specified in lwp_cfg */ - *eax = (*edx & lwp_cfg) | 0x00000001; - } - break; - } - default: - break; - } - - HVMTRACE_5D (CPUID, input, *eax, *ebx, *ecx, *edx); -} - static void svm_vmexit_do_cpuid(struct cpu_user_regs *regs) { unsigned int eax, ebx, ecx, edx, inst_len; @@ -1609,7 +1574,8 @@ static void svm_vmexit_do_cpuid(struct cpu_user_regs *regs) ecx = regs->ecx; edx = regs->edx; - svm_cpuid_intercept(&eax, &ebx, &ecx, &edx); + hvm_cpuid(regs->_eax, &eax, &ebx, &ecx, &edx); + HVMTRACE_5D(CPUID, regs->_eax, eax, ebx, ecx, edx); regs->eax = eax; regs->ebx = ebx; @@ -2253,7 +2219,6 @@ static struct hvm_function_table __initdata svm_function_table = { .init_hypercall_page = svm_init_hypercall_page, .event_pending = svm_event_pending, .invlpg = svm_invlpg, - .cpuid_intercept = svm_cpuid_intercept, .wbinvd_intercept = svm_wbinvd_intercept, .fpu_dirty_intercept = svm_fpu_dirty_intercept, .msr_read_intercept = svm_msr_read_intercept, diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c index 2238d74..5a73076 100644 --- a/xen/arch/x86/hvm/vmx/vmx.c +++ b/xen/arch/x86/hvm/vmx/vmx.c @@ -73,9 +73,6 @@ static void vmx_install_vlapic_mapping(struct vcpu *v); static void vmx_update_guest_cr(struct vcpu *v, unsigned int cr); static void vmx_update_guest_efer(struct vcpu *v); static void vmx_update_guest_vendor(struct vcpu *v); -static void vmx_cpuid_intercept( - unsigned int *eax, unsigned int *ebx, - unsigned int *ecx, unsigned int *edx); static void vmx_wbinvd_intercept(void); static void vmx_fpu_dirty_intercept(void); static int vmx_msr_read_intercept(unsigned int msr, uint64_t *msr_content); @@ -2166,7 +2163,6 @@ static struct hvm_function_table __initdata vmx_function_table = { .invlpg = vmx_invlpg, .cpu_up = vmx_cpu_up, .cpu_down = vmx_cpu_down, - .cpuid_intercept = vmx_cpuid_intercept, .wbinvd_intercept = vmx_wbinvd_intercept, .fpu_dirty_intercept = vmx_fpu_dirty_intercept, .msr_read_intercept = vmx_msr_read_intercept, @@ -2402,30 +2398,6 @@ static void vmx_fpu_dirty_intercept(void) } } -static void vmx_cpuid_intercept( - unsigned int *eax, unsigned int *ebx, - unsigned int *ecx, unsigned int *edx) -{ - unsigned int input = *eax; - struct vcpu *v = current; - - hvm_cpuid(input, eax, ebx, ecx, edx); - - switch ( input ) - { - case 0x80000001: - /* SYSCALL is visible iff running in long mode. */ - if ( hvm_long_mode_enabled(v) ) - *edx |= cpufeat_mask(X86_FEATURE_SYSCALL); - else - *edx &= ~(cpufeat_mask(X86_FEATURE_SYSCALL)); - - break; - } - - HVMTRACE_5D (CPUID, input, *eax, *ebx, *ecx, *edx); -} - static int vmx_do_cpuid(struct cpu_user_regs *regs) { unsigned int eax, ebx, ecx, edx; @@ -2445,7 +2417,8 @@ static int vmx_do_cpuid(struct cpu_user_regs *regs) leaf = regs->eax; subleaf = regs->ecx; - vmx_cpuid_intercept(&eax, &ebx, &ecx, &edx); + hvm_cpuid(leaf, &eax, &ebx, &ecx, &edx); + HVMTRACE_5D(CPUID, leaf, eax, ebx, ecx, edx); regs->eax = eax; regs->ebx = ebx; diff --git a/xen/include/asm-x86/hvm/hvm.h b/xen/include/asm-x86/hvm/hvm.h index 7e7462e..8e366c0 100644 --- a/xen/include/asm-x86/hvm/hvm.h +++ b/xen/include/asm-x86/hvm/hvm.h @@ -169,9 +169,6 @@ struct hvm_function_table { unsigned int (*get_insn_bytes)(struct vcpu *v, uint8_t *buf); /* Instruction intercepts: non-void return values are X86EMUL codes. */ - void (*cpuid_intercept)( - unsigned int *eax, unsigned int *ebx, - unsigned int *ecx, unsigned int *edx); void (*wbinvd_intercept)(void); void (*fpu_dirty_intercept)(void); int (*msr_read_intercept)(unsigned int msr, uint64_t *msr_content); -- 2.1.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |