[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-3.2-testing] hvm: Clean up CPUID_0000_0001 return values.
# HG changeset patch # User Keir Fraser <keir.fraser@xxxxxxxxxx> # Date 1203343447 0 # Node ID 1d9487ed5e6f22fe0ca727caa6fc256fc75f15f4 # Parent 20b20c4532825a74ff3f3c087d9d56152fdbec72 hvm: Clean up CPUID_0000_0001 return values. The fix to EBX.ApicID was pointed out by Andre Przywara <andre.przywara@xxxxxxx>. Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx> xen-unstable changeset: 16990:199f81c4b882467aac41d9d53ed69184f7c7a393 xen-unstable date: Thu Feb 07 10:31:48 2008 +0000 --- xen/include/asm-x86/hvm/vmx/cpu.h | 45 ------------------------------------- xen/arch/x86/hvm/hvm.c | 37 +++++++++++++++++++++++++++--- xen/arch/x86/hvm/svm/svm.c | 19 +++------------ xen/arch/x86/hvm/vmx/realmode.c | 1 xen/arch/x86/hvm/vmx/vmx.c | 17 ++----------- xen/include/asm-x86/hvm/vmx/vmcs.h | 1 6 files changed, 40 insertions(+), 80 deletions(-) diff -r 20b20c453282 -r 1d9487ed5e6f xen/arch/x86/hvm/hvm.c --- a/xen/arch/x86/hvm/hvm.c Mon Feb 18 14:01:05 2008 +0000 +++ b/xen/arch/x86/hvm/hvm.c Mon Feb 18 14:04:07 2008 +0000 @@ -1403,6 +1403,7 @@ void hvm_print_line(struct vcpu *v, cons spin_unlock(&hd->pbuf_lock); } +#define bitmaskof(idx) (1U << ((idx) & 31)) void hvm_cpuid(unsigned int input, unsigned int *eax, unsigned int *ebx, unsigned int *ecx, unsigned int *edx) { @@ -1416,16 +1417,44 @@ void hvm_cpuid(unsigned int input, unsig switch ( input ) { case 0x00000001: - __clear_bit(X86_FEATURE_MWAIT & 31, ecx); - + /* Clear #threads count and poke initial VLAPIC ID. */ + *ebx &= 0x0000FFFFu; + *ebx |= (current->vcpu_id * 2) << 24; + + *ecx &= (bitmaskof(X86_FEATURE_XMM3) | + bitmaskof(X86_FEATURE_SSSE3) | + bitmaskof(X86_FEATURE_CX16) | + bitmaskof(X86_FEATURE_SSE4_1) | + bitmaskof(X86_FEATURE_SSE4_2) | + bitmaskof(X86_FEATURE_POPCNT)); + + *edx &= (bitmaskof(X86_FEATURE_FPU) | + bitmaskof(X86_FEATURE_VME) | + bitmaskof(X86_FEATURE_DE) | + bitmaskof(X86_FEATURE_PSE) | + bitmaskof(X86_FEATURE_TSC) | + bitmaskof(X86_FEATURE_MSR) | + bitmaskof(X86_FEATURE_PAE) | + bitmaskof(X86_FEATURE_MCE) | + bitmaskof(X86_FEATURE_CX8) | + bitmaskof(X86_FEATURE_APIC) | + bitmaskof(X86_FEATURE_SEP) | + bitmaskof(X86_FEATURE_MTRR) | + bitmaskof(X86_FEATURE_PGE) | + bitmaskof(X86_FEATURE_MCA) | + bitmaskof(X86_FEATURE_CMOV) | + bitmaskof(X86_FEATURE_PAT) | + bitmaskof(X86_FEATURE_CLFLSH) | + bitmaskof(X86_FEATURE_MMX) | + bitmaskof(X86_FEATURE_FXSR) | + bitmaskof(X86_FEATURE_XMM) | + bitmaskof(X86_FEATURE_XMM2)); if ( vlapic_hw_disabled(vcpu_vlapic(v)) ) __clear_bit(X86_FEATURE_APIC & 31, edx); - #if CONFIG_PAGING_LEVELS >= 3 if ( !v->domain->arch.hvm_domain.params[HVM_PARAM_PAE_ENABLED] ) #endif __clear_bit(X86_FEATURE_PAE & 31, edx); - __clear_bit(X86_FEATURE_PSE36 & 31, edx); break; case 0x80000001: diff -r 20b20c453282 -r 1d9487ed5e6f xen/arch/x86/hvm/svm/svm.c --- a/xen/arch/x86/hvm/svm/svm.c Mon Feb 18 14:01:05 2008 +0000 +++ b/xen/arch/x86/hvm/svm/svm.c Mon Feb 18 14:04:07 2008 +0000 @@ -967,11 +967,6 @@ static void svm_do_no_device_fault(struc vmcb->cr0 &= ~X86_CR0_TS; } -/* Reserved bits ECX: [31:14], [12:4], [2:1]*/ -#define SVM_VCPU_CPUID_L1_ECX_RESERVED 0xffffdff6 -/* Reserved bits EDX: [31:29], [27], [22:20], [18], [10] */ -#define SVM_VCPU_CPUID_L1_EDX_RESERVED 0xe8740400 - #define bitmaskof(idx) (1U << ((idx) & 31)) static void svm_vmexit_do_cpuid(struct vmcb_struct *vmcb, struct cpu_user_regs *regs) @@ -986,16 +981,10 @@ static void svm_vmexit_do_cpuid(struct v switch ( input ) { case 0x00000001: - /* Clear out reserved bits. */ - ecx &= ~SVM_VCPU_CPUID_L1_ECX_RESERVED; - edx &= ~SVM_VCPU_CPUID_L1_EDX_RESERVED; - - /* Guest should only see one logical processor. - * See details on page 23 of AMD CPUID Specification. - */ - __clear_bit(X86_FEATURE_HT & 31, &edx); - ebx &= 0xFF00FFFF; /* clear the logical processor count when HTT=0 */ - ebx |= 0x00010000; /* set to 1 just for precaution */ + /* Mask Intel-only features. */ + ecx &= ~(bitmaskof(X86_FEATURE_SSSE3) | + bitmaskof(X86_FEATURE_SSE4_1) | + bitmaskof(X86_FEATURE_SSE4_2)); break; case 0x80000001: diff -r 20b20c453282 -r 1d9487ed5e6f xen/arch/x86/hvm/vmx/realmode.c --- a/xen/arch/x86/hvm/vmx/realmode.c Mon Feb 18 14:01:05 2008 +0000 +++ b/xen/arch/x86/hvm/vmx/realmode.c Mon Feb 18 14:04:07 2008 +0000 @@ -18,7 +18,6 @@ #include <asm/hvm/support.h> #include <asm/hvm/vmx/vmx.h> #include <asm/hvm/vmx/vmcs.h> -#include <asm/hvm/vmx/cpu.h> #include <asm/x86_emulate.h> struct realmode_emulate_ctxt { diff -r 20b20c453282 -r 1d9487ed5e6f xen/arch/x86/hvm/vmx/vmx.c --- a/xen/arch/x86/hvm/vmx/vmx.c Mon Feb 18 14:01:05 2008 +0000 +++ b/xen/arch/x86/hvm/vmx/vmx.c Mon Feb 18 14:04:07 2008 +0000 @@ -41,7 +41,6 @@ #include <asm/hvm/support.h> #include <asm/hvm/vmx/vmx.h> #include <asm/hvm/vmx/vmcs.h> -#include <asm/hvm/vmx/cpu.h> #include <public/sched.h> #include <public/hvm/ioreq.h> #include <asm/hvm/vpic.h> @@ -1285,23 +1284,13 @@ void vmx_cpuid_intercept( switch ( input ) { case 0x00000001: - *ecx &= ~VMX_VCPU_CPUID_L1_ECX_RESERVED; - *ebx &= NUM_THREADS_RESET_MASK; - *ecx &= ~(bitmaskof(X86_FEATURE_VMXE) | - bitmaskof(X86_FEATURE_EST) | - bitmaskof(X86_FEATURE_TM2) | - bitmaskof(X86_FEATURE_CID) | - bitmaskof(X86_FEATURE_PDCM) | - bitmaskof(X86_FEATURE_DSCPL)); - *edx &= ~(bitmaskof(X86_FEATURE_HT) | - bitmaskof(X86_FEATURE_ACPI) | - bitmaskof(X86_FEATURE_ACC) | - bitmaskof(X86_FEATURE_DS)); + /* Mask AMD-only features. */ + *ecx &= ~(bitmaskof(X86_FEATURE_POPCNT)); break; case 0x00000004: cpuid_count(input, count, eax, ebx, ecx, edx); - *eax &= NUM_CORES_RESET_MASK; + *eax &= 0x3FFF; /* one core */ break; case 0x00000006: diff -r 20b20c453282 -r 1d9487ed5e6f xen/include/asm-x86/hvm/vmx/cpu.h --- a/xen/include/asm-x86/hvm/vmx/cpu.h Mon Feb 18 14:01:05 2008 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,45 +0,0 @@ -/* - * cpu.h: Virtual CPU state - * Copyright (c) 2004, Intel Corporation. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., 59 Temple - * Place - Suite 330, Boston, MA 02111-1307 USA. - * - */ -#ifndef __ASM_X86_HVM_VMX_CPU_H__ -#define __ASM_X86_HVM_VMX_CPU_H__ - -/* - * Virtual CPU - */ -struct arch_state_struct { - unsigned long mode_flags; /* vm86, 32-bit, 64-bit, etc. */ - /* debug registers */ - /* MSRs */ -}; - -#define VMX_MF_VM86 0 -#define VMX_MF_32 1 -#define VMX_MF_64 2 - -#define NUM_CORES_RESET_MASK 0x00003FFF -#define NUM_THREADS_RESET_MASK 0xFF00FFFF - -#define VMX_VCPU_CPUID_L1_ECX_RESERVED_18 0x00040000 -#define VMX_VCPU_CPUID_L1_ECX_RESERVED_6 0x00000040 - -#define VMX_VCPU_CPUID_L1_ECX_RESERVED \ - ( VMX_VCPU_CPUID_L1_ECX_RESERVED_18 | \ - VMX_VCPU_CPUID_L1_ECX_RESERVED_6 ) - -#endif /* __ASM_X86_HVM_VMX_CPU_H__ */ diff -r 20b20c453282 -r 1d9487ed5e6f xen/include/asm-x86/hvm/vmx/vmcs.h --- a/xen/include/asm-x86/hvm/vmx/vmcs.h Mon Feb 18 14:01:05 2008 +0000 +++ b/xen/include/asm-x86/hvm/vmx/vmcs.h Mon Feb 18 14:04:07 2008 +0000 @@ -21,7 +21,6 @@ #include <asm/config.h> #include <asm/hvm/io.h> -#include <asm/hvm/vmx/cpu.h> #ifdef VMXASSIST #include <public/hvm/vmx_assist.h> _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |