All of lore.kernel.org
 help / color / mirror / Atom feed
* [RFC PATCH 0/3] x86, kvm: Unify CPUID computation and fix MSR accessing
@ 2015-11-14 10:37 Borislav Petkov
  2015-11-14 10:37 ` [RFC PATCH 1/3] x86/cpu: Unify CPU family, model, stepping calculation Borislav Petkov
                   ` (2 more replies)
  0 siblings, 3 replies; 12+ messages in thread
From: Borislav Petkov @ 2015-11-14 10:37 UTC (permalink / raw)
  To: LKML; +Cc: Paolo Bonzini, X86 ML, KVM

From: Borislav Petkov <bp@suse.de>

Hi all,

so this is something which should help fixing the MSR access to IC_CFG
on AMD.

The usefulness should come, however, from the unification and the
additional family, model, stepping helpers in kvm in case one wants to
know those of the guest CPU. Who knows, might be much more useful in the
future.

Quick testing shows it works, I'll hammer on it more after rc1 is out.

Thanks.

Borislav Petkov (3):
  x86/cpu: Unify CPU family, model, stepping calculation
  kvm: Add accessors for guest CPU's family, model, stepping
  x86/cpu/amd, kvm: Satisfy guest kernel reads of IC_CFG MSR

 arch/x86/include/asm/cpu.h            |  3 +++
 arch/x86/include/asm/microcode.h      | 31 +++----------------------------
 arch/x86/include/asm/msr-index.h      |  1 +
 arch/x86/kernel/cpu/amd.c             |  4 ++--
 arch/x86/kernel/cpu/common.c          | 11 +++--------
 arch/x86/kernel/cpu/microcode/core.c  |  6 +++---
 arch/x86/kernel/cpu/microcode/intel.c | 16 ++++++----------
 arch/x86/kvm/cpuid.h                  | 34 ++++++++++++++++++++++++++++++++++
 arch/x86/kvm/svm.c                    | 17 +++++++++++++++++
 arch/x86/lib/Makefile                 |  2 +-
 arch/x86/lib/cpu.c                    | 35 +++++++++++++++++++++++++++++++++++
 11 files changed, 108 insertions(+), 52 deletions(-)
 create mode 100644 arch/x86/lib/cpu.c

-- 
2.3.5


^ permalink raw reply	[flat|nested] 12+ messages in thread

* [RFC PATCH 1/3] x86/cpu: Unify CPU family, model, stepping calculation
  2015-11-14 10:37 [RFC PATCH 0/3] x86, kvm: Unify CPUID computation and fix MSR accessing Borislav Petkov
@ 2015-11-14 10:37 ` Borislav Petkov
  2015-11-18 11:10   ` Paolo Bonzini
  2015-11-14 10:37 ` [RFC PATCH 2/3] kvm: Add accessors for guest CPU's family, model, stepping Borislav Petkov
  2015-11-14 10:37 ` [RFC PATCH 3/3] x86/cpu/amd, kvm: Satisfy guest kernel reads of IC_CFG MSR Borislav Petkov
  2 siblings, 1 reply; 12+ messages in thread
From: Borislav Petkov @ 2015-11-14 10:37 UTC (permalink / raw)
  To: LKML; +Cc: Paolo Bonzini, X86 ML, KVM

From: Borislav Petkov <bp@suse.de>

Add generic functions which calc family, model and stepping from the
CPUID_1.EAX leaf and stick them into the library we have.

No functionality change.

Signed-off-by: Borislav Petkov <bp@suse.de>
---
 arch/x86/include/asm/cpu.h            |  3 +++
 arch/x86/include/asm/microcode.h      | 31 +++----------------------------
 arch/x86/kernel/cpu/common.c          | 11 +++--------
 arch/x86/kernel/cpu/microcode/core.c  |  6 +++---
 arch/x86/kernel/cpu/microcode/intel.c | 16 ++++++----------
 arch/x86/lib/Makefile                 |  2 +-
 arch/x86/lib/cpu.c                    | 35 +++++++++++++++++++++++++++++++++++
 7 files changed, 54 insertions(+), 50 deletions(-)
 create mode 100644 arch/x86/lib/cpu.c

diff --git a/arch/x86/include/asm/cpu.h b/arch/x86/include/asm/cpu.h
index bf2caa1dedc5..678637ad7476 100644
--- a/arch/x86/include/asm/cpu.h
+++ b/arch/x86/include/asm/cpu.h
@@ -36,4 +36,7 @@ extern int _debug_hotplug_cpu(int cpu, int action);
 
 int mwait_usable(const struct cpuinfo_x86 *);
 
+unsigned int x86_family(unsigned int sig);
+unsigned int x86_model(unsigned int sig);
+unsigned int x86_stepping(unsigned int sig);
 #endif /* _ASM_X86_CPU_H */
diff --git a/arch/x86/include/asm/microcode.h b/arch/x86/include/asm/microcode.h
index 34e62b1dcfce..0419cc4ab4fd 100644
--- a/arch/x86/include/asm/microcode.h
+++ b/arch/x86/include/asm/microcode.h
@@ -1,6 +1,7 @@
 #ifndef _ASM_X86_MICROCODE_H
 #define _ASM_X86_MICROCODE_H
 
+#include <asm/cpu.h>
 #include <linux/earlycpio.h>
 
 #define native_rdmsr(msr, val1, val2)			\
@@ -118,40 +119,14 @@ static inline int x86_vendor(void)
 	return X86_VENDOR_UNKNOWN;
 }
 
-static inline unsigned int __x86_family(unsigned int sig)
-{
-	unsigned int x86;
-
-	x86 = (sig >> 8) & 0xf;
-
-	if (x86 == 0xf)
-		x86 += (sig >> 20) & 0xff;
-
-	return x86;
-}
-
-static inline unsigned int x86_family(void)
+static inline unsigned int x86_family_cpuid(void)
 {
 	u32 eax = 0x00000001;
 	u32 ebx, ecx = 0, edx;
 
 	native_cpuid(&eax, &ebx, &ecx, &edx);
 
-	return __x86_family(eax);
-}
-
-static inline unsigned int x86_model(unsigned int sig)
-{
-	unsigned int x86, model;
-
-	x86 = __x86_family(sig);
-
-	model = (sig >> 4) & 0xf;
-
-	if (x86 == 0x6 || x86 == 0xf)
-		model += ((sig >> 16) & 0xf) << 4;
-
-	return model;
+	return x86_family(eax);
 }
 
 #ifdef CONFIG_MICROCODE
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c
index 4ddd780aeac9..c311b51efe15 100644
--- a/arch/x86/kernel/cpu/common.c
+++ b/arch/x86/kernel/cpu/common.c
@@ -582,14 +582,9 @@ void cpu_detect(struct cpuinfo_x86 *c)
 		u32 junk, tfms, cap0, misc;
 
 		cpuid(0x00000001, &tfms, &misc, &junk, &cap0);
-		c->x86 = (tfms >> 8) & 0xf;
-		c->x86_model = (tfms >> 4) & 0xf;
-		c->x86_mask = tfms & 0xf;
-
-		if (c->x86 == 0xf)
-			c->x86 += (tfms >> 20) & 0xff;
-		if (c->x86 >= 0x6)
-			c->x86_model += ((tfms >> 16) & 0xf) << 4;
+		c->x86		= x86_family(tfms);
+		c->x86_model	= x86_model(tfms);
+		c->x86_mask	= x86_stepping(tfms);
 
 		if (cap0 & (1<<19)) {
 			c->x86_clflush_size = ((misc >> 8) & 0xff) * 8;
diff --git a/arch/x86/kernel/cpu/microcode/core.c b/arch/x86/kernel/cpu/microcode/core.c
index 7fc27f1cca58..e98c3487c9d3 100644
--- a/arch/x86/kernel/cpu/microcode/core.c
+++ b/arch/x86/kernel/cpu/microcode/core.c
@@ -130,7 +130,7 @@ void __init load_ucode_bsp(void)
 		return;
 
 	vendor = x86_vendor();
-	family = x86_family();
+	family = x86_family_cpuid();
 
 	switch (vendor) {
 	case X86_VENDOR_INTEL:
@@ -166,7 +166,7 @@ void load_ucode_ap(void)
 		return;
 
 	vendor = x86_vendor();
-	family = x86_family();
+	family = x86_family_cpuid();
 
 	switch (vendor) {
 	case X86_VENDOR_INTEL:
@@ -207,7 +207,7 @@ void reload_early_microcode(void)
 	int vendor, family;
 
 	vendor = x86_vendor();
-	family = x86_family();
+	family = x86_family_cpuid();
 
 	switch (vendor) {
 	case X86_VENDOR_INTEL:
diff --git a/arch/x86/kernel/cpu/microcode/intel.c b/arch/x86/kernel/cpu/microcode/intel.c
index ce47402eb2f9..ee81c544ee0d 100644
--- a/arch/x86/kernel/cpu/microcode/intel.c
+++ b/arch/x86/kernel/cpu/microcode/intel.c
@@ -145,10 +145,10 @@ matching_model_microcode(struct microcode_header_intel *mc_header,
 	int ext_sigcount, i;
 	struct extended_signature *ext_sig;
 
-	fam   = __x86_family(sig);
+	fam   = x86_family(sig);
 	model = x86_model(sig);
 
-	fam_ucode   = __x86_family(mc_header->sig);
+	fam_ucode   = x86_family(mc_header->sig);
 	model_ucode = x86_model(mc_header->sig);
 
 	if (fam == fam_ucode && model == model_ucode)
@@ -163,7 +163,7 @@ matching_model_microcode(struct microcode_header_intel *mc_header,
 	ext_sigcount = ext_header->count;
 
 	for (i = 0; i < ext_sigcount; i++) {
-		fam_ucode   = __x86_family(ext_sig->sig);
+		fam_ucode   = x86_family(ext_sig->sig);
 		model_ucode = x86_model(ext_sig->sig);
 
 		if (fam == fam_ucode && model == model_ucode)
@@ -365,7 +365,7 @@ static int collect_cpu_info_early(struct ucode_cpu_info *uci)
 	native_cpuid(&eax, &ebx, &ecx, &edx);
 	csig.sig = eax;
 
-	family = __x86_family(csig.sig);
+	family = x86_family(csig.sig);
 	model  = x86_model(csig.sig);
 
 	if ((model >= 5) || (family > 6)) {
@@ -521,16 +521,12 @@ static bool __init load_builtin_intel_microcode(struct cpio_data *cp)
 {
 #ifdef CONFIG_X86_64
 	unsigned int eax = 0x00000001, ebx, ecx = 0, edx;
-	unsigned int family, model, stepping;
 	char name[30];
 
 	native_cpuid(&eax, &ebx, &ecx, &edx);
 
-	family   = __x86_family(eax);
-	model    = x86_model(eax);
-	stepping = eax & 0xf;
-
-	sprintf(name, "intel-ucode/%02x-%02x-%02x", family, model, stepping);
+	sprintf(name, "intel-ucode/%02x-%02x-%02x",
+		      x86_family(eax), x86_model(eax), x86_stepping(eax));
 
 	return get_builtin_firmware(cp, name);
 #else
diff --git a/arch/x86/lib/Makefile b/arch/x86/lib/Makefile
index f2587888d987..a501fa25da41 100644
--- a/arch/x86/lib/Makefile
+++ b/arch/x86/lib/Makefile
@@ -16,7 +16,7 @@ clean-files := inat-tables.c
 
 obj-$(CONFIG_SMP) += msr-smp.o cache-smp.o
 
-lib-y := delay.o misc.o cmdline.o
+lib-y := delay.o misc.o cmdline.o cpu.o
 lib-y += usercopy_$(BITS).o usercopy.o getuser.o putuser.o
 lib-y += memcpy_$(BITS).o
 lib-$(CONFIG_RWSEM_XCHGADD_ALGORITHM) += rwsem.o
diff --git a/arch/x86/lib/cpu.c b/arch/x86/lib/cpu.c
new file mode 100644
index 000000000000..aa417a97511c
--- /dev/null
+++ b/arch/x86/lib/cpu.c
@@ -0,0 +1,35 @@
+#include <linux/module.h>
+
+unsigned int x86_family(unsigned int sig)
+{
+	unsigned int x86;
+
+	x86 = (sig >> 8) & 0xf;
+
+	if (x86 == 0xf)
+		x86 += (sig >> 20) & 0xff;
+
+	return x86;
+}
+EXPORT_SYMBOL_GPL(x86_family);
+
+unsigned int x86_model(unsigned int sig)
+{
+	unsigned int fam, model;
+
+	 fam = x86_family(sig);
+
+	model = (sig >> 4) & 0xf;
+
+	if (fam >= 0x6)
+		model += ((sig >> 16) & 0xf) << 4;
+
+	return model;
+}
+EXPORT_SYMBOL_GPL(x86_model);
+
+unsigned int x86_stepping(unsigned int sig)
+{
+	return sig & 0xf;
+}
+EXPORT_SYMBOL_GPL(x86_stepping);
-- 
2.3.5


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [RFC PATCH 2/3] kvm: Add accessors for guest CPU's family, model, stepping
  2015-11-14 10:37 [RFC PATCH 0/3] x86, kvm: Unify CPUID computation and fix MSR accessing Borislav Petkov
  2015-11-14 10:37 ` [RFC PATCH 1/3] x86/cpu: Unify CPU family, model, stepping calculation Borislav Petkov
@ 2015-11-14 10:37 ` Borislav Petkov
  2015-11-18 11:10   ` Paolo Bonzini
  2015-11-14 10:37 ` [RFC PATCH 3/3] x86/cpu/amd, kvm: Satisfy guest kernel reads of IC_CFG MSR Borislav Petkov
  2 siblings, 1 reply; 12+ messages in thread
From: Borislav Petkov @ 2015-11-14 10:37 UTC (permalink / raw)
  To: LKML; +Cc: Paolo Bonzini, X86 ML, KVM

From: Borislav Petkov <bp@suse.de>

Those give the family, model and stepping of the guest vcpu.

Signed-off-by: Borislav Petkov <bp@suse.de>
Cc: Paolo Bonzini <pbonzini@redhat.com>
---
 arch/x86/kvm/cpuid.h | 34 ++++++++++++++++++++++++++++++++++
 1 file changed, 34 insertions(+)

diff --git a/arch/x86/kvm/cpuid.h b/arch/x86/kvm/cpuid.h
index 06332cb7e7d1..5d47e0d95ef1 100644
--- a/arch/x86/kvm/cpuid.h
+++ b/arch/x86/kvm/cpuid.h
@@ -2,6 +2,7 @@
 #define ARCH_X86_KVM_CPUID_H
 
 #include "x86.h"
+#include <asm/cpu.h>
 
 int kvm_update_cpuid(struct kvm_vcpu *vcpu);
 struct kvm_cpuid_entry2 *kvm_find_cpuid_entry(struct kvm_vcpu *vcpu,
@@ -170,4 +171,37 @@ static inline bool guest_cpuid_has_nrips(struct kvm_vcpu *vcpu)
 }
 #undef BIT_NRIPS
 
+static inline int guest_cpuid_family(struct kvm_vcpu *vcpu)
+{
+	struct kvm_cpuid_entry2 *best;
+
+	best = kvm_find_cpuid_entry(vcpu, 0x1, 0);
+	if (!best)
+		return -1;
+
+	return x86_family(best->eax);
+}
+
+static inline int guest_cpuid_model(struct kvm_vcpu *vcpu)
+{
+	struct kvm_cpuid_entry2 *best;
+
+	best = kvm_find_cpuid_entry(vcpu, 0x1, 0);
+	if (!best)
+		return -1;
+
+	return x86_model(best->eax);
+}
+
+static inline int guest_cpuid_stepping(struct kvm_vcpu *vcpu)
+{
+	struct kvm_cpuid_entry2 *best;
+
+	best = kvm_find_cpuid_entry(vcpu, 0x1, 0);
+	if (!best)
+		return -1;
+
+	return x86_stepping(best->eax);
+}
+
 #endif
-- 
2.3.5


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [RFC PATCH 3/3] x86/cpu/amd, kvm: Satisfy guest kernel reads of IC_CFG MSR
  2015-11-14 10:37 [RFC PATCH 0/3] x86, kvm: Unify CPUID computation and fix MSR accessing Borislav Petkov
  2015-11-14 10:37 ` [RFC PATCH 1/3] x86/cpu: Unify CPU family, model, stepping calculation Borislav Petkov
  2015-11-14 10:37 ` [RFC PATCH 2/3] kvm: Add accessors for guest CPU's family, model, stepping Borislav Petkov
@ 2015-11-14 10:37 ` Borislav Petkov
  2015-11-18 11:11   ` Paolo Bonzini
  2 siblings, 1 reply; 12+ messages in thread
From: Borislav Petkov @ 2015-11-14 10:37 UTC (permalink / raw)
  To: LKML; +Cc: Paolo Bonzini, X86 ML, KVM

From: Borislav Petkov <bp@suse.de>

The kernel accesses IC_CFG MSR (0xc0011021) on AMD because it checks
whether the way access filter is enabled on some F15h models, and, if
so, disables it.

kvm doesn't handle that MSR access and complains about it, which can
get really noisy in dmesg when one starts kvm guests all the time for
testing. And it is useless anyway - guest kernel shouldn't be doing such
changes anyway so tell it that that filter is disabled.

Signed-off-by: Borislav Petkov <bp@suse.de>
Cc: Paolo Bonzini <pbonzini@redhat.com>
---
 arch/x86/include/asm/msr-index.h |  1 +
 arch/x86/kernel/cpu/amd.c        |  4 ++--
 arch/x86/kvm/svm.c               | 17 +++++++++++++++++
 3 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/arch/x86/include/asm/msr-index.h b/arch/x86/include/asm/msr-index.h
index 9f3905697f12..5384485f8569 100644
--- a/arch/x86/include/asm/msr-index.h
+++ b/arch/x86/include/asm/msr-index.h
@@ -322,6 +322,7 @@
 #define MSR_F15H_PERF_CTR		0xc0010201
 #define MSR_F15H_NB_PERF_CTL		0xc0010240
 #define MSR_F15H_NB_PERF_CTR		0xc0010241
+#define MSR_F15H_IC_CFG			0xc0011021
 
 /* Fam 10h MSRs */
 #define MSR_FAM10H_MMIO_CONF_BASE	0xc0010058
diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c
index 4a70fc6d400a..1d76dcdf7e55 100644
--- a/arch/x86/kernel/cpu/amd.c
+++ b/arch/x86/kernel/cpu/amd.c
@@ -665,9 +665,9 @@ static void init_amd_bd(struct cpuinfo_x86 *c)
 	 * Disable it on the affected CPUs.
 	 */
 	if ((c->x86_model >= 0x02) && (c->x86_model < 0x20)) {
-		if (!rdmsrl_safe(0xc0011021, &value) && !(value & 0x1E)) {
+		if (!rdmsrl_safe(MSR_F15H_IC_CFG, &value) && !(value & 0x1E)) {
 			value |= 0x1E;
-			wrmsrl_safe(0xc0011021, value);
+			wrmsrl_safe(MSR_F15H_IC_CFG, value);
 		}
 	}
 }
diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
index 83a1c643f9a5..58b64c17c4a8 100644
--- a/arch/x86/kvm/svm.c
+++ b/arch/x86/kvm/svm.c
@@ -3053,6 +3053,23 @@ static int svm_get_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
 	case MSR_IA32_UCODE_REV:
 		msr_info->data = 0x01000065;
 		break;
+	case MSR_F15H_IC_CFG: {
+
+		int family, model;
+
+		family = guest_cpuid_family(vcpu);
+		model  = guest_cpuid_model(vcpu);
+
+		if (family < 0 || model < 0)
+			return kvm_get_msr_common(vcpu, msr_info);
+
+		msr_info->data = 0;
+
+		if (family == 0x15 &&
+		    (model >= 0x2 && model < 0x20))
+			msr_info->data = 0x1E;
+		}
+		break;
 	default:
 		return kvm_get_msr_common(vcpu, msr_info);
 	}
-- 
2.3.5


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [RFC PATCH 1/3] x86/cpu: Unify CPU family, model, stepping calculation
  2015-11-14 10:37 ` [RFC PATCH 1/3] x86/cpu: Unify CPU family, model, stepping calculation Borislav Petkov
@ 2015-11-18 11:10   ` Paolo Bonzini
  2015-11-18 11:28     ` Borislav Petkov
  0 siblings, 1 reply; 12+ messages in thread
From: Paolo Bonzini @ 2015-11-18 11:10 UTC (permalink / raw)
  To: Borislav Petkov, LKML; +Cc: X86 ML, KVM



On 14/11/2015 11:37, Borislav Petkov wrote:
>  	vendor = x86_vendor();
> -	family = x86_family();
> +	family = x86_family_cpuid();

What about renaming x86_vendor() so that this looks like

-	vendor = x86_vendor();
-	family = x86_family();
+	vendor = x86_cpuid_vendor();
+	family = x86_cpuid_family();

Otherwise looks good.

Paolo

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [RFC PATCH 2/3] kvm: Add accessors for guest CPU's family, model, stepping
  2015-11-14 10:37 ` [RFC PATCH 2/3] kvm: Add accessors for guest CPU's family, model, stepping Borislav Petkov
@ 2015-11-18 11:10   ` Paolo Bonzini
  0 siblings, 0 replies; 12+ messages in thread
From: Paolo Bonzini @ 2015-11-18 11:10 UTC (permalink / raw)
  To: Borislav Petkov, LKML; +Cc: X86 ML, KVM



On 14/11/2015 11:37, Borislav Petkov wrote:
> From: Borislav Petkov <bp@suse.de>
> 
> Those give the family, model and stepping of the guest vcpu.
> 
> Signed-off-by: Borislav Petkov <bp@suse.de>
> Cc: Paolo Bonzini <pbonzini@redhat.com>
> ---
>  arch/x86/kvm/cpuid.h | 34 ++++++++++++++++++++++++++++++++++
>  1 file changed, 34 insertions(+)
> 
> diff --git a/arch/x86/kvm/cpuid.h b/arch/x86/kvm/cpuid.h
> index 06332cb7e7d1..5d47e0d95ef1 100644
> --- a/arch/x86/kvm/cpuid.h
> +++ b/arch/x86/kvm/cpuid.h
> @@ -2,6 +2,7 @@
>  #define ARCH_X86_KVM_CPUID_H
>  
>  #include "x86.h"
> +#include <asm/cpu.h>
>  
>  int kvm_update_cpuid(struct kvm_vcpu *vcpu);
>  struct kvm_cpuid_entry2 *kvm_find_cpuid_entry(struct kvm_vcpu *vcpu,
> @@ -170,4 +171,37 @@ static inline bool guest_cpuid_has_nrips(struct kvm_vcpu *vcpu)
>  }
>  #undef BIT_NRIPS
>  
> +static inline int guest_cpuid_family(struct kvm_vcpu *vcpu)
> +{
> +	struct kvm_cpuid_entry2 *best;
> +
> +	best = kvm_find_cpuid_entry(vcpu, 0x1, 0);
> +	if (!best)
> +		return -1;
> +
> +	return x86_family(best->eax);
> +}
> +
> +static inline int guest_cpuid_model(struct kvm_vcpu *vcpu)
> +{
> +	struct kvm_cpuid_entry2 *best;
> +
> +	best = kvm_find_cpuid_entry(vcpu, 0x1, 0);
> +	if (!best)
> +		return -1;
> +
> +	return x86_model(best->eax);
> +}
> +
> +static inline int guest_cpuid_stepping(struct kvm_vcpu *vcpu)
> +{
> +	struct kvm_cpuid_entry2 *best;
> +
> +	best = kvm_find_cpuid_entry(vcpu, 0x1, 0);
> +	if (!best)
> +		return -1;
> +
> +	return x86_stepping(best->eax);
> +}
> +
>  #endif
> 

Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [RFC PATCH 3/3] x86/cpu/amd, kvm: Satisfy guest kernel reads of IC_CFG MSR
  2015-11-14 10:37 ` [RFC PATCH 3/3] x86/cpu/amd, kvm: Satisfy guest kernel reads of IC_CFG MSR Borislav Petkov
@ 2015-11-18 11:11   ` Paolo Bonzini
  0 siblings, 0 replies; 12+ messages in thread
From: Paolo Bonzini @ 2015-11-18 11:11 UTC (permalink / raw)
  To: Borislav Petkov, LKML; +Cc: X86 ML, KVM



On 14/11/2015 11:37, Borislav Petkov wrote:
> From: Borislav Petkov <bp@suse.de>
> 
> The kernel accesses IC_CFG MSR (0xc0011021) on AMD because it checks
> whether the way access filter is enabled on some F15h models, and, if
> so, disables it.
> 
> kvm doesn't handle that MSR access and complains about it, which can
> get really noisy in dmesg when one starts kvm guests all the time for
> testing. And it is useless anyway - guest kernel shouldn't be doing such
> changes anyway so tell it that that filter is disabled.
> 
> Signed-off-by: Borislav Petkov <bp@suse.de>
> Cc: Paolo Bonzini <pbonzini@redhat.com>
> ---
>  arch/x86/include/asm/msr-index.h |  1 +
>  arch/x86/kernel/cpu/amd.c        |  4 ++--
>  arch/x86/kvm/svm.c               | 17 +++++++++++++++++
>  3 files changed, 20 insertions(+), 2 deletions(-)
> 
> diff --git a/arch/x86/include/asm/msr-index.h b/arch/x86/include/asm/msr-index.h
> index 9f3905697f12..5384485f8569 100644
> --- a/arch/x86/include/asm/msr-index.h
> +++ b/arch/x86/include/asm/msr-index.h
> @@ -322,6 +322,7 @@
>  #define MSR_F15H_PERF_CTR		0xc0010201
>  #define MSR_F15H_NB_PERF_CTL		0xc0010240
>  #define MSR_F15H_NB_PERF_CTR		0xc0010241
> +#define MSR_F15H_IC_CFG			0xc0011021
>  
>  /* Fam 10h MSRs */
>  #define MSR_FAM10H_MMIO_CONF_BASE	0xc0010058
> diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c
> index 4a70fc6d400a..1d76dcdf7e55 100644
> --- a/arch/x86/kernel/cpu/amd.c
> +++ b/arch/x86/kernel/cpu/amd.c
> @@ -665,9 +665,9 @@ static void init_amd_bd(struct cpuinfo_x86 *c)
>  	 * Disable it on the affected CPUs.
>  	 */
>  	if ((c->x86_model >= 0x02) && (c->x86_model < 0x20)) {
> -		if (!rdmsrl_safe(0xc0011021, &value) && !(value & 0x1E)) {
> +		if (!rdmsrl_safe(MSR_F15H_IC_CFG, &value) && !(value & 0x1E)) {
>  			value |= 0x1E;
> -			wrmsrl_safe(0xc0011021, value);
> +			wrmsrl_safe(MSR_F15H_IC_CFG, value);
>  		}
>  	}
>  }
> diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
> index 83a1c643f9a5..58b64c17c4a8 100644
> --- a/arch/x86/kvm/svm.c
> +++ b/arch/x86/kvm/svm.c
> @@ -3053,6 +3053,23 @@ static int svm_get_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
>  	case MSR_IA32_UCODE_REV:
>  		msr_info->data = 0x01000065;
>  		break;
> +	case MSR_F15H_IC_CFG: {
> +
> +		int family, model;
> +
> +		family = guest_cpuid_family(vcpu);
> +		model  = guest_cpuid_model(vcpu);
> +
> +		if (family < 0 || model < 0)
> +			return kvm_get_msr_common(vcpu, msr_info);
> +
> +		msr_info->data = 0;
> +
> +		if (family == 0x15 &&
> +		    (model >= 0x2 && model < 0x20))
> +			msr_info->data = 0x1E;
> +		}
> +		break;
>  	default:
>  		return kvm_get_msr_common(vcpu, msr_info);
>  	}
> 

Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [RFC PATCH 1/3] x86/cpu: Unify CPU family, model, stepping calculation
  2015-11-18 11:10   ` Paolo Bonzini
@ 2015-11-18 11:28     ` Borislav Petkov
  2015-11-18 11:35       ` Paolo Bonzini
  0 siblings, 1 reply; 12+ messages in thread
From: Borislav Petkov @ 2015-11-18 11:28 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: LKML, X86 ML, KVM

On Wed, Nov 18, 2015 at 12:10:08PM +0100, Paolo Bonzini wrote:
> On 14/11/2015 11:37, Borislav Petkov wrote:
> >  	vendor = x86_vendor();
> > -	family = x86_family();
> > +	family = x86_family_cpuid();
> 
> What about renaming x86_vendor() so that this looks like
> 
> -	vendor = x86_vendor();
> -	family = x86_family();
> +	vendor = x86_cpuid_vendor();
> +	family = x86_cpuid_family();

The idea is that x86_family_cpuid() gives the family *after* having
executed CPUID while x86_family() only computes the family from a
supplied CPUID_1_EAX. I.e., the last saves us the CPUID call.

Hmm, maybe I should make that more clear ...

-- 
Regards/Gruss,
    Boris.

ECO tip #101: Trim your mails when you reply.

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [RFC PATCH 1/3] x86/cpu: Unify CPU family, model, stepping calculation
  2015-11-18 11:28     ` Borislav Petkov
@ 2015-11-18 11:35       ` Paolo Bonzini
  2015-11-18 18:50         ` Borislav Petkov
  0 siblings, 1 reply; 12+ messages in thread
From: Paolo Bonzini @ 2015-11-18 11:35 UTC (permalink / raw)
  To: Borislav Petkov; +Cc: LKML, X86 ML, KVM



On 18/11/2015 12:28, Borislav Petkov wrote:
>> On 14/11/2015 11:37, Borislav Petkov wrote:
>>> > >  	vendor = x86_vendor();
>>> > > -	family = x86_family();
>>> > > +	family = x86_family_cpuid();
>> > 
>> > What about renaming x86_vendor() so that this looks like
>> > 
>> > -	vendor = x86_vendor();
>> > -	family = x86_family();
>> > +	vendor = x86_cpuid_vendor();
>> > +	family = x86_cpuid_family();
> 
> The idea is that x86_family_cpuid() gives the family *after* having
> executed CPUID while x86_family() only computes the family from a
> supplied CPUID_1_EAX. I.e., the last saves us the CPUID call.

Yes, exactly.  I'm suggesting that the same applies to x86_vendor().  I
also prefer x86_cpuid_* to x86_*_cpuid because, once you add two
functions in the same family it's nice that they share a prefix.

Paolo

> Hmm, maybe I should make that more clear ...

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [RFC PATCH 1/3] x86/cpu: Unify CPU family, model, stepping calculation
  2015-11-18 11:35       ` Paolo Bonzini
@ 2015-11-18 18:50         ` Borislav Petkov
  2015-11-19  9:34           ` Paolo Bonzini
  0 siblings, 1 reply; 12+ messages in thread
From: Borislav Petkov @ 2015-11-18 18:50 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: LKML, X86 ML, KVM

On Wed, Nov 18, 2015 at 12:35:24PM +0100, Paolo Bonzini wrote:
> Yes, exactly.  I'm suggesting that the same applies to x86_vendor().  I
> also prefer x86_cpuid_* to x86_*_cpuid because, once you add two
> functions in the same family it's nice that they share a prefix.

Ok, makes sense:

---
commit 804437270083a1aabf87f65f65b32e2ae23121b6
Author: Borislav Petkov <bp@suse.de>
Date:   Sat Nov 14 10:54:22 2015 +0100

    x86/cpu: Unify CPU family, model, stepping calculation
    
    Add generic functions which calc family, model and stepping from the
    CPUID_1.EAX leaf and stick them into the library we have.
    
    Rename those which do call CPUID with the prefix "x86_cpuid" as
    suggested by Paolo Bonzini.
    
    No functionality change.
    
    Signed-off-by: Borislav Petkov <bp@suse.de>

diff --git a/arch/x86/include/asm/cpu.h b/arch/x86/include/asm/cpu.h
index bf2caa1dedc5..678637ad7476 100644
--- a/arch/x86/include/asm/cpu.h
+++ b/arch/x86/include/asm/cpu.h
@@ -36,4 +36,7 @@ extern int _debug_hotplug_cpu(int cpu, int action);
 
 int mwait_usable(const struct cpuinfo_x86 *);
 
+unsigned int x86_family(unsigned int sig);
+unsigned int x86_model(unsigned int sig);
+unsigned int x86_stepping(unsigned int sig);
 #endif /* _ASM_X86_CPU_H */
diff --git a/arch/x86/include/asm/microcode.h b/arch/x86/include/asm/microcode.h
index 34e62b1dcfce..1e1b07a5a738 100644
--- a/arch/x86/include/asm/microcode.h
+++ b/arch/x86/include/asm/microcode.h
@@ -1,6 +1,7 @@
 #ifndef _ASM_X86_MICROCODE_H
 #define _ASM_X86_MICROCODE_H
 
+#include <asm/cpu.h>
 #include <linux/earlycpio.h>
 
 #define native_rdmsr(msr, val1, val2)			\
@@ -95,14 +96,14 @@ static inline void __exit exit_amd_microcode(void) {}
 
 /*
  * In early loading microcode phase on BSP, boot_cpu_data is not set up yet.
- * x86_vendor() gets vendor id for BSP.
+ * x86_cpuid_vendor() gets vendor id for BSP.
  *
  * In 32 bit AP case, accessing boot_cpu_data needs linear address. To simplify
- * coding, we still use x86_vendor() to get vendor id for AP.
+ * coding, we still use x86_cpuid_vendor() to get vendor id for AP.
  *
- * x86_vendor() gets vendor information directly from CPUID.
+ * x86_cpuid_vendor() gets vendor information directly from CPUID.
  */
-static inline int x86_vendor(void)
+static inline int x86_cpuid_vendor(void)
 {
 	u32 eax = 0x00000000;
 	u32 ebx, ecx = 0, edx;
@@ -118,40 +119,14 @@ static inline int x86_vendor(void)
 	return X86_VENDOR_UNKNOWN;
 }
 
-static inline unsigned int __x86_family(unsigned int sig)
-{
-	unsigned int x86;
-
-	x86 = (sig >> 8) & 0xf;
-
-	if (x86 == 0xf)
-		x86 += (sig >> 20) & 0xff;
-
-	return x86;
-}
-
-static inline unsigned int x86_family(void)
+static inline unsigned int x86_cpuid_family(void)
 {
 	u32 eax = 0x00000001;
 	u32 ebx, ecx = 0, edx;
 
 	native_cpuid(&eax, &ebx, &ecx, &edx);
 
-	return __x86_family(eax);
-}
-
-static inline unsigned int x86_model(unsigned int sig)
-{
-	unsigned int x86, model;
-
-	x86 = __x86_family(sig);
-
-	model = (sig >> 4) & 0xf;
-
-	if (x86 == 0x6 || x86 == 0xf)
-		model += ((sig >> 16) & 0xf) << 4;
-
-	return model;
+	return x86_family(eax);
 }
 
 #ifdef CONFIG_MICROCODE
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c
index 4ddd780aeac9..c311b51efe15 100644
--- a/arch/x86/kernel/cpu/common.c
+++ b/arch/x86/kernel/cpu/common.c
@@ -582,14 +582,9 @@ void cpu_detect(struct cpuinfo_x86 *c)
 		u32 junk, tfms, cap0, misc;
 
 		cpuid(0x00000001, &tfms, &misc, &junk, &cap0);
-		c->x86 = (tfms >> 8) & 0xf;
-		c->x86_model = (tfms >> 4) & 0xf;
-		c->x86_mask = tfms & 0xf;
-
-		if (c->x86 == 0xf)
-			c->x86 += (tfms >> 20) & 0xff;
-		if (c->x86 >= 0x6)
-			c->x86_model += ((tfms >> 16) & 0xf) << 4;
+		c->x86		= x86_family(tfms);
+		c->x86_model	= x86_model(tfms);
+		c->x86_mask	= x86_stepping(tfms);
 
 		if (cap0 & (1<<19)) {
 			c->x86_clflush_size = ((misc >> 8) & 0xff) * 8;
diff --git a/arch/x86/kernel/cpu/microcode/core.c b/arch/x86/kernel/cpu/microcode/core.c
index 7fc27f1cca58..3aaffb601c91 100644
--- a/arch/x86/kernel/cpu/microcode/core.c
+++ b/arch/x86/kernel/cpu/microcode/core.c
@@ -129,8 +129,8 @@ void __init load_ucode_bsp(void)
 	if (!have_cpuid_p())
 		return;
 
-	vendor = x86_vendor();
-	family = x86_family();
+	vendor = x86_cpuid_vendor();
+	family = x86_cpuid_family();
 
 	switch (vendor) {
 	case X86_VENDOR_INTEL:
@@ -165,8 +165,8 @@ void load_ucode_ap(void)
 	if (!have_cpuid_p())
 		return;
 
-	vendor = x86_vendor();
-	family = x86_family();
+	vendor = x86_cpuid_vendor();
+	family = x86_cpuid_family();
 
 	switch (vendor) {
 	case X86_VENDOR_INTEL:
@@ -206,8 +206,8 @@ void reload_early_microcode(void)
 {
 	int vendor, family;
 
-	vendor = x86_vendor();
-	family = x86_family();
+	vendor = x86_cpuid_vendor();
+	family = x86_cpuid_family();
 
 	switch (vendor) {
 	case X86_VENDOR_INTEL:
diff --git a/arch/x86/kernel/cpu/microcode/intel.c b/arch/x86/kernel/cpu/microcode/intel.c
index ce47402eb2f9..ee81c544ee0d 100644
--- a/arch/x86/kernel/cpu/microcode/intel.c
+++ b/arch/x86/kernel/cpu/microcode/intel.c
@@ -145,10 +145,10 @@ matching_model_microcode(struct microcode_header_intel *mc_header,
 	int ext_sigcount, i;
 	struct extended_signature *ext_sig;
 
-	fam   = __x86_family(sig);
+	fam   = x86_family(sig);
 	model = x86_model(sig);
 
-	fam_ucode   = __x86_family(mc_header->sig);
+	fam_ucode   = x86_family(mc_header->sig);
 	model_ucode = x86_model(mc_header->sig);
 
 	if (fam == fam_ucode && model == model_ucode)
@@ -163,7 +163,7 @@ matching_model_microcode(struct microcode_header_intel *mc_header,
 	ext_sigcount = ext_header->count;
 
 	for (i = 0; i < ext_sigcount; i++) {
-		fam_ucode   = __x86_family(ext_sig->sig);
+		fam_ucode   = x86_family(ext_sig->sig);
 		model_ucode = x86_model(ext_sig->sig);
 
 		if (fam == fam_ucode && model == model_ucode)
@@ -365,7 +365,7 @@ static int collect_cpu_info_early(struct ucode_cpu_info *uci)
 	native_cpuid(&eax, &ebx, &ecx, &edx);
 	csig.sig = eax;
 
-	family = __x86_family(csig.sig);
+	family = x86_family(csig.sig);
 	model  = x86_model(csig.sig);
 
 	if ((model >= 5) || (family > 6)) {
@@ -521,16 +521,12 @@ static bool __init load_builtin_intel_microcode(struct cpio_data *cp)
 {
 #ifdef CONFIG_X86_64
 	unsigned int eax = 0x00000001, ebx, ecx = 0, edx;
-	unsigned int family, model, stepping;
 	char name[30];
 
 	native_cpuid(&eax, &ebx, &ecx, &edx);
 
-	family   = __x86_family(eax);
-	model    = x86_model(eax);
-	stepping = eax & 0xf;
-
-	sprintf(name, "intel-ucode/%02x-%02x-%02x", family, model, stepping);
+	sprintf(name, "intel-ucode/%02x-%02x-%02x",
+		      x86_family(eax), x86_model(eax), x86_stepping(eax));
 
 	return get_builtin_firmware(cp, name);
 #else
diff --git a/arch/x86/lib/Makefile b/arch/x86/lib/Makefile
index f2587888d987..a501fa25da41 100644
--- a/arch/x86/lib/Makefile
+++ b/arch/x86/lib/Makefile
@@ -16,7 +16,7 @@ clean-files := inat-tables.c
 
 obj-$(CONFIG_SMP) += msr-smp.o cache-smp.o
 
-lib-y := delay.o misc.o cmdline.o
+lib-y := delay.o misc.o cmdline.o cpu.o
 lib-y += usercopy_$(BITS).o usercopy.o getuser.o putuser.o
 lib-y += memcpy_$(BITS).o
 lib-$(CONFIG_RWSEM_XCHGADD_ALGORITHM) += rwsem.o
diff --git a/arch/x86/lib/cpu.c b/arch/x86/lib/cpu.c
new file mode 100644
index 000000000000..aa417a97511c
--- /dev/null
+++ b/arch/x86/lib/cpu.c
@@ -0,0 +1,35 @@
+#include <linux/module.h>
+
+unsigned int x86_family(unsigned int sig)
+{
+	unsigned int x86;
+
+	x86 = (sig >> 8) & 0xf;
+
+	if (x86 == 0xf)
+		x86 += (sig >> 20) & 0xff;
+
+	return x86;
+}
+EXPORT_SYMBOL_GPL(x86_family);
+
+unsigned int x86_model(unsigned int sig)
+{
+	unsigned int fam, model;
+
+	 fam = x86_family(sig);
+
+	model = (sig >> 4) & 0xf;
+
+	if (fam >= 0x6)
+		model += ((sig >> 16) & 0xf) << 4;
+
+	return model;
+}
+EXPORT_SYMBOL_GPL(x86_model);
+
+unsigned int x86_stepping(unsigned int sig)
+{
+	return sig & 0xf;
+}
+EXPORT_SYMBOL_GPL(x86_stepping);

-- 
Regards/Gruss,
    Boris.

ECO tip #101: Trim your mails when you reply.

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [RFC PATCH 1/3] x86/cpu: Unify CPU family, model, stepping calculation
  2015-11-18 18:50         ` Borislav Petkov
@ 2015-11-19  9:34           ` Paolo Bonzini
  2015-11-19  9:47             ` Borislav Petkov
  0 siblings, 1 reply; 12+ messages in thread
From: Paolo Bonzini @ 2015-11-19  9:34 UTC (permalink / raw)
  To: Borislav Petkov; +Cc: LKML, X86 ML, KVM



On 18/11/2015 19:50, Borislav Petkov wrote:
> On Wed, Nov 18, 2015 at 12:35:24PM +0100, Paolo Bonzini wrote:
>> Yes, exactly.  I'm suggesting that the same applies to x86_vendor().  I
>> also prefer x86_cpuid_* to x86_*_cpuid because, once you add two
>> functions in the same family it's nice that they share a prefix.
> 
> Ok, makes sense:
> 
> ---
> commit 804437270083a1aabf87f65f65b32e2ae23121b6
> Author: Borislav Petkov <bp@suse.de>
> Date:   Sat Nov 14 10:54:22 2015 +0100
> 
>     x86/cpu: Unify CPU family, model, stepping calculation
>     
>     Add generic functions which calc family, model and stepping from the
>     CPUID_1.EAX leaf and stick them into the library we have.
>     
>     Rename those which do call CPUID with the prefix "x86_cpuid" as
>     suggested by Paolo Bonzini.
>     
>     No functionality change.
>     
>     Signed-off-by: Borislav Petkov <bp@suse.de>

Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>

Let me know if I should include this patch via the KVM tree.  Do you
want it in 4.4?

Paolo

> diff --git a/arch/x86/include/asm/cpu.h b/arch/x86/include/asm/cpu.h
> index bf2caa1dedc5..678637ad7476 100644
> --- a/arch/x86/include/asm/cpu.h
> +++ b/arch/x86/include/asm/cpu.h
> @@ -36,4 +36,7 @@ extern int _debug_hotplug_cpu(int cpu, int action);
>  
>  int mwait_usable(const struct cpuinfo_x86 *);
>  
> +unsigned int x86_family(unsigned int sig);
> +unsigned int x86_model(unsigned int sig);
> +unsigned int x86_stepping(unsigned int sig);
>  #endif /* _ASM_X86_CPU_H */
> diff --git a/arch/x86/include/asm/microcode.h b/arch/x86/include/asm/microcode.h
> index 34e62b1dcfce..1e1b07a5a738 100644
> --- a/arch/x86/include/asm/microcode.h
> +++ b/arch/x86/include/asm/microcode.h
> @@ -1,6 +1,7 @@
>  #ifndef _ASM_X86_MICROCODE_H
>  #define _ASM_X86_MICROCODE_H
>  
> +#include <asm/cpu.h>
>  #include <linux/earlycpio.h>
>  
>  #define native_rdmsr(msr, val1, val2)			\
> @@ -95,14 +96,14 @@ static inline void __exit exit_amd_microcode(void) {}
>  
>  /*
>   * In early loading microcode phase on BSP, boot_cpu_data is not set up yet.
> - * x86_vendor() gets vendor id for BSP.
> + * x86_cpuid_vendor() gets vendor id for BSP.
>   *
>   * In 32 bit AP case, accessing boot_cpu_data needs linear address. To simplify
> - * coding, we still use x86_vendor() to get vendor id for AP.
> + * coding, we still use x86_cpuid_vendor() to get vendor id for AP.
>   *
> - * x86_vendor() gets vendor information directly from CPUID.
> + * x86_cpuid_vendor() gets vendor information directly from CPUID.
>   */
> -static inline int x86_vendor(void)
> +static inline int x86_cpuid_vendor(void)
>  {
>  	u32 eax = 0x00000000;
>  	u32 ebx, ecx = 0, edx;
> @@ -118,40 +119,14 @@ static inline int x86_vendor(void)
>  	return X86_VENDOR_UNKNOWN;
>  }
>  
> -static inline unsigned int __x86_family(unsigned int sig)
> -{
> -	unsigned int x86;
> -
> -	x86 = (sig >> 8) & 0xf;
> -
> -	if (x86 == 0xf)
> -		x86 += (sig >> 20) & 0xff;
> -
> -	return x86;
> -}
> -
> -static inline unsigned int x86_family(void)
> +static inline unsigned int x86_cpuid_family(void)
>  {
>  	u32 eax = 0x00000001;
>  	u32 ebx, ecx = 0, edx;
>  
>  	native_cpuid(&eax, &ebx, &ecx, &edx);
>  
> -	return __x86_family(eax);
> -}
> -
> -static inline unsigned int x86_model(unsigned int sig)
> -{
> -	unsigned int x86, model;
> -
> -	x86 = __x86_family(sig);
> -
> -	model = (sig >> 4) & 0xf;
> -
> -	if (x86 == 0x6 || x86 == 0xf)
> -		model += ((sig >> 16) & 0xf) << 4;
> -
> -	return model;
> +	return x86_family(eax);
>  }
>  
>  #ifdef CONFIG_MICROCODE
> diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c
> index 4ddd780aeac9..c311b51efe15 100644
> --- a/arch/x86/kernel/cpu/common.c
> +++ b/arch/x86/kernel/cpu/common.c
> @@ -582,14 +582,9 @@ void cpu_detect(struct cpuinfo_x86 *c)
>  		u32 junk, tfms, cap0, misc;
>  
>  		cpuid(0x00000001, &tfms, &misc, &junk, &cap0);
> -		c->x86 = (tfms >> 8) & 0xf;
> -		c->x86_model = (tfms >> 4) & 0xf;
> -		c->x86_mask = tfms & 0xf;
> -
> -		if (c->x86 == 0xf)
> -			c->x86 += (tfms >> 20) & 0xff;
> -		if (c->x86 >= 0x6)
> -			c->x86_model += ((tfms >> 16) & 0xf) << 4;
> +		c->x86		= x86_family(tfms);
> +		c->x86_model	= x86_model(tfms);
> +		c->x86_mask	= x86_stepping(tfms);
>  
>  		if (cap0 & (1<<19)) {
>  			c->x86_clflush_size = ((misc >> 8) & 0xff) * 8;
> diff --git a/arch/x86/kernel/cpu/microcode/core.c b/arch/x86/kernel/cpu/microcode/core.c
> index 7fc27f1cca58..3aaffb601c91 100644
> --- a/arch/x86/kernel/cpu/microcode/core.c
> +++ b/arch/x86/kernel/cpu/microcode/core.c
> @@ -129,8 +129,8 @@ void __init load_ucode_bsp(void)
>  	if (!have_cpuid_p())
>  		return;
>  
> -	vendor = x86_vendor();
> -	family = x86_family();
> +	vendor = x86_cpuid_vendor();
> +	family = x86_cpuid_family();
>  
>  	switch (vendor) {
>  	case X86_VENDOR_INTEL:
> @@ -165,8 +165,8 @@ void load_ucode_ap(void)
>  	if (!have_cpuid_p())
>  		return;
>  
> -	vendor = x86_vendor();
> -	family = x86_family();
> +	vendor = x86_cpuid_vendor();
> +	family = x86_cpuid_family();
>  
>  	switch (vendor) {
>  	case X86_VENDOR_INTEL:
> @@ -206,8 +206,8 @@ void reload_early_microcode(void)
>  {
>  	int vendor, family;
>  
> -	vendor = x86_vendor();
> -	family = x86_family();
> +	vendor = x86_cpuid_vendor();
> +	family = x86_cpuid_family();
>  
>  	switch (vendor) {
>  	case X86_VENDOR_INTEL:
> diff --git a/arch/x86/kernel/cpu/microcode/intel.c b/arch/x86/kernel/cpu/microcode/intel.c
> index ce47402eb2f9..ee81c544ee0d 100644
> --- a/arch/x86/kernel/cpu/microcode/intel.c
> +++ b/arch/x86/kernel/cpu/microcode/intel.c
> @@ -145,10 +145,10 @@ matching_model_microcode(struct microcode_header_intel *mc_header,
>  	int ext_sigcount, i;
>  	struct extended_signature *ext_sig;
>  
> -	fam   = __x86_family(sig);
> +	fam   = x86_family(sig);
>  	model = x86_model(sig);
>  
> -	fam_ucode   = __x86_family(mc_header->sig);
> +	fam_ucode   = x86_family(mc_header->sig);
>  	model_ucode = x86_model(mc_header->sig);
>  
>  	if (fam == fam_ucode && model == model_ucode)
> @@ -163,7 +163,7 @@ matching_model_microcode(struct microcode_header_intel *mc_header,
>  	ext_sigcount = ext_header->count;
>  
>  	for (i = 0; i < ext_sigcount; i++) {
> -		fam_ucode   = __x86_family(ext_sig->sig);
> +		fam_ucode   = x86_family(ext_sig->sig);
>  		model_ucode = x86_model(ext_sig->sig);
>  
>  		if (fam == fam_ucode && model == model_ucode)
> @@ -365,7 +365,7 @@ static int collect_cpu_info_early(struct ucode_cpu_info *uci)
>  	native_cpuid(&eax, &ebx, &ecx, &edx);
>  	csig.sig = eax;
>  
> -	family = __x86_family(csig.sig);
> +	family = x86_family(csig.sig);
>  	model  = x86_model(csig.sig);
>  
>  	if ((model >= 5) || (family > 6)) {
> @@ -521,16 +521,12 @@ static bool __init load_builtin_intel_microcode(struct cpio_data *cp)
>  {
>  #ifdef CONFIG_X86_64
>  	unsigned int eax = 0x00000001, ebx, ecx = 0, edx;
> -	unsigned int family, model, stepping;
>  	char name[30];
>  
>  	native_cpuid(&eax, &ebx, &ecx, &edx);
>  
> -	family   = __x86_family(eax);
> -	model    = x86_model(eax);
> -	stepping = eax & 0xf;
> -
> -	sprintf(name, "intel-ucode/%02x-%02x-%02x", family, model, stepping);
> +	sprintf(name, "intel-ucode/%02x-%02x-%02x",
> +		      x86_family(eax), x86_model(eax), x86_stepping(eax));
>  
>  	return get_builtin_firmware(cp, name);
>  #else
> diff --git a/arch/x86/lib/Makefile b/arch/x86/lib/Makefile
> index f2587888d987..a501fa25da41 100644
> --- a/arch/x86/lib/Makefile
> +++ b/arch/x86/lib/Makefile
> @@ -16,7 +16,7 @@ clean-files := inat-tables.c
>  
>  obj-$(CONFIG_SMP) += msr-smp.o cache-smp.o
>  
> -lib-y := delay.o misc.o cmdline.o
> +lib-y := delay.o misc.o cmdline.o cpu.o
>  lib-y += usercopy_$(BITS).o usercopy.o getuser.o putuser.o
>  lib-y += memcpy_$(BITS).o
>  lib-$(CONFIG_RWSEM_XCHGADD_ALGORITHM) += rwsem.o
> diff --git a/arch/x86/lib/cpu.c b/arch/x86/lib/cpu.c
> new file mode 100644
> index 000000000000..aa417a97511c
> --- /dev/null
> +++ b/arch/x86/lib/cpu.c
> @@ -0,0 +1,35 @@
> +#include <linux/module.h>
> +
> +unsigned int x86_family(unsigned int sig)
> +{
> +	unsigned int x86;
> +
> +	x86 = (sig >> 8) & 0xf;
> +
> +	if (x86 == 0xf)
> +		x86 += (sig >> 20) & 0xff;
> +
> +	return x86;
> +}
> +EXPORT_SYMBOL_GPL(x86_family);
> +
> +unsigned int x86_model(unsigned int sig)
> +{
> +	unsigned int fam, model;
> +
> +	 fam = x86_family(sig);
> +
> +	model = (sig >> 4) & 0xf;
> +
> +	if (fam >= 0x6)
> +		model += ((sig >> 16) & 0xf) << 4;
> +
> +	return model;
> +}
> +EXPORT_SYMBOL_GPL(x86_model);
> +
> +unsigned int x86_stepping(unsigned int sig)
> +{
> +	return sig & 0xf;
> +}
> +EXPORT_SYMBOL_GPL(x86_stepping);
> 

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [RFC PATCH 1/3] x86/cpu: Unify CPU family, model, stepping calculation
  2015-11-19  9:34           ` Paolo Bonzini
@ 2015-11-19  9:47             ` Borislav Petkov
  0 siblings, 0 replies; 12+ messages in thread
From: Borislav Petkov @ 2015-11-19  9:47 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: LKML, X86 ML, KVM

On Thu, Nov 19, 2015 at 10:34:07AM +0100, Paolo Bonzini wrote:
> Let me know if I should include this patch via the KVM tree.  Do you
> want it in 4.4?

Nah, no need.

I'll send the whole pile with your Reviewed-by's to Ingo so that they
all go together. I'll run them some more on my boxes first though...

Thanks.

-- 
Regards/Gruss,
    Boris.

ECO tip #101: Trim your mails when you reply.

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2015-11-19  9:47 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-11-14 10:37 [RFC PATCH 0/3] x86, kvm: Unify CPUID computation and fix MSR accessing Borislav Petkov
2015-11-14 10:37 ` [RFC PATCH 1/3] x86/cpu: Unify CPU family, model, stepping calculation Borislav Petkov
2015-11-18 11:10   ` Paolo Bonzini
2015-11-18 11:28     ` Borislav Petkov
2015-11-18 11:35       ` Paolo Bonzini
2015-11-18 18:50         ` Borislav Petkov
2015-11-19  9:34           ` Paolo Bonzini
2015-11-19  9:47             ` Borislav Petkov
2015-11-14 10:37 ` [RFC PATCH 2/3] kvm: Add accessors for guest CPU's family, model, stepping Borislav Petkov
2015-11-18 11:10   ` Paolo Bonzini
2015-11-14 10:37 ` [RFC PATCH 3/3] x86/cpu/amd, kvm: Satisfy guest kernel reads of IC_CFG MSR Borislav Petkov
2015-11-18 11:11   ` Paolo Bonzini

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.