diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2023-10-30 12:10:24 -1000 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2023-10-30 12:10:24 -1000 | 
| commit | ca2e9c3beec67dc90944f3d2a72f77652fb9cefc (patch) | |
| tree | 3e41a5a3394c741ba6adfe5fcd535a2488a36522 /arch/x86 | |
| parent | 9ab021a1b57007a22761f6f41d91eb4aae10d145 (diff) | |
| parent | b5034c63858d8cb44587bb1ce5a0790a1b4e4a05 (diff) | |
Merge tag 'x86_cpu_for_6.7_rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull x86 cpuid updates from Borislav Petkov:
 - Make sure the "svm" feature flag is cleared from /proc/cpuinfo when
   virtualization support is disabled in the BIOS on AMD and Hygon
   platforms
 - A minor cleanup
* tag 'x86_cpu_for_6.7_rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  x86/cpu/amd: Remove redundant 'break' statement
  x86/cpu: Clear SVM feature if disabled by BIOS
Diffstat (limited to 'arch/x86')
| -rw-r--r-- | arch/x86/include/asm/msr-index.h | 6 | ||||
| -rw-r--r-- | arch/x86/include/asm/svm.h | 6 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/amd.c | 11 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/hygon.c | 10 | ||||
| -rw-r--r-- | arch/x86/kvm/svm/svm.c | 8 | 
5 files changed, 25 insertions, 16 deletions
| diff --git a/arch/x86/include/asm/msr-index.h b/arch/x86/include/asm/msr-index.h index b37abb55e948..61705dd0e94a 100644 --- a/arch/x86/include/asm/msr-index.h +++ b/arch/x86/include/asm/msr-index.h @@ -1117,12 +1117,16 @@  #define MSR_IA32_VMX_MISC_INTEL_PT                 (1ULL << 14)  #define MSR_IA32_VMX_MISC_VMWRITE_SHADOW_RO_FIELDS (1ULL << 29)  #define MSR_IA32_VMX_MISC_PREEMPTION_TIMER_SCALE   0x1F -/* AMD-V MSRs */ +/* AMD-V MSRs */  #define MSR_VM_CR                       0xc0010114  #define MSR_VM_IGNNE                    0xc0010115  #define MSR_VM_HSAVE_PA                 0xc0010117 +#define SVM_VM_CR_VALID_MASK		0x001fULL +#define SVM_VM_CR_SVM_LOCK_MASK		0x0008ULL +#define SVM_VM_CR_SVM_DIS_MASK		0x0010ULL +  /* Hardware Feedback Interface */  #define MSR_IA32_HW_FEEDBACK_PTR        0x17d0  #define MSR_IA32_HW_FEEDBACK_CONFIG     0x17d1 diff --git a/arch/x86/include/asm/svm.h b/arch/x86/include/asm/svm.h index 3ac0ffc4f3e2..87a7b917d30e 100644 --- a/arch/x86/include/asm/svm.h +++ b/arch/x86/include/asm/svm.h @@ -229,10 +229,6 @@ struct __attribute__ ((__packed__)) vmcb_control_area {  #define SVM_IOIO_SIZE_MASK (7 << SVM_IOIO_SIZE_SHIFT)  #define SVM_IOIO_ASIZE_MASK (7 << SVM_IOIO_ASIZE_SHIFT) -#define SVM_VM_CR_VALID_MASK	0x001fULL -#define SVM_VM_CR_SVM_LOCK_MASK 0x0008ULL -#define SVM_VM_CR_SVM_DIS_MASK  0x0010ULL -  #define SVM_NESTED_CTL_NP_ENABLE	BIT(0)  #define SVM_NESTED_CTL_SEV_ENABLE	BIT(1)  #define SVM_NESTED_CTL_SEV_ES_ENABLE	BIT(2) @@ -572,8 +568,6 @@ struct vmcb {  #define SVM_CPUID_FUNC 0x8000000a -#define SVM_VM_CR_SVM_DISABLE 4 -  #define SVM_SELECTOR_S_SHIFT 4  #define SVM_SELECTOR_DPL_SHIFT 5  #define SVM_SELECTOR_P_SHIFT 7 diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c index ece2b5b7b0fe..d97d473545a6 100644 --- a/arch/x86/kernel/cpu/amd.c +++ b/arch/x86/kernel/cpu/amd.c @@ -1014,7 +1014,6 @@ static bool cpu_has_zenbleed_microcode(void)  	default:  		return false; -		break;  	}  	if (boot_cpu_data.microcode < good_rev) @@ -1044,6 +1043,8 @@ static void zenbleed_check(struct cpuinfo_x86 *c)  static void init_amd(struct cpuinfo_x86 *c)  { +	u64 vm_cr; +  	early_init_amd(c);  	/* @@ -1095,6 +1096,14 @@ static void init_amd(struct cpuinfo_x86 *c)  	init_amd_cacheinfo(c); +	if (cpu_has(c, X86_FEATURE_SVM)) { +		rdmsrl(MSR_VM_CR, vm_cr); +		if (vm_cr & SVM_VM_CR_SVM_DIS_MASK) { +			pr_notice_once("SVM disabled (by BIOS) in MSR_VM_CR\n"); +			clear_cpu_cap(c, X86_FEATURE_SVM); +		} +	} +  	if (!cpu_has(c, X86_FEATURE_LFENCE_RDTSC) && cpu_has(c, X86_FEATURE_XMM2)) {  		/*  		 * Use LFENCE for execution serialization.  On families which diff --git a/arch/x86/kernel/cpu/hygon.c b/arch/x86/kernel/cpu/hygon.c index defdc594be14..16f34639ecf7 100644 --- a/arch/x86/kernel/cpu/hygon.c +++ b/arch/x86/kernel/cpu/hygon.c @@ -290,6 +290,8 @@ static void early_init_hygon(struct cpuinfo_x86 *c)  static void init_hygon(struct cpuinfo_x86 *c)  { +	u64 vm_cr; +  	early_init_hygon(c);  	/* @@ -320,6 +322,14 @@ static void init_hygon(struct cpuinfo_x86 *c)  	init_hygon_cacheinfo(c); +	if (cpu_has(c, X86_FEATURE_SVM)) { +		rdmsrl(MSR_VM_CR, vm_cr); +		if (vm_cr & SVM_VM_CR_SVM_DIS_MASK) { +			pr_notice_once("SVM disabled (by BIOS) in MSR_VM_CR\n"); +			clear_cpu_cap(c, X86_FEATURE_SVM); +		} +	} +  	if (cpu_has(c, X86_FEATURE_XMM2)) {  		/*  		 * Use LFENCE for execution serialization.  On families which diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c index beea99c8e8e0..ded1d80d72cb 100644 --- a/arch/x86/kvm/svm/svm.c +++ b/arch/x86/kvm/svm/svm.c @@ -531,8 +531,6 @@ static bool __kvm_is_svm_supported(void)  	int cpu = smp_processor_id();  	struct cpuinfo_x86 *c = &cpu_data(cpu); -	u64 vm_cr; -  	if (c->x86_vendor != X86_VENDOR_AMD &&  	    c->x86_vendor != X86_VENDOR_HYGON) {  		pr_err("CPU %d isn't AMD or Hygon\n", cpu); @@ -549,12 +547,6 @@ static bool __kvm_is_svm_supported(void)  		return false;  	} -	rdmsrl(MSR_VM_CR, vm_cr); -	if (vm_cr & (1 << SVM_VM_CR_SVM_DISABLE)) { -		pr_err("SVM disabled (by BIOS) in MSR_VM_CR on CPU %d\n", cpu); -		return false; -	} -  	return true;  } | 
