All of lore.kernel.org
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: Borislav Petkov <bp@alien8.de>
Cc: LKML <linux-kernel@vger.kernel.org>, X86 ML <x86@kernel.org>,
	KVM <kvm@vger.kernel.org>
Subject: Re: [RFC PATCH 1/3] x86/cpu: Unify CPU family, model, stepping calculation
Date: Thu, 19 Nov 2015 10:34:07 +0100	[thread overview]
Message-ID: <564D978F.5060000@redhat.com> (raw)
In-Reply-To: <20151118185013.GH4138@pd.tnic>



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);
> 

  reply	other threads:[~2015-11-19  9:34 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
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 [this message]
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

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=564D978F.5060000@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=bp@alien8.de \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=x86@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.