Re: [PATCH v5 10/35] x86/lib: Add CPUID(0x1) CPU family and model calculation
Borislav Petkov <[email protected]> Wed, 4 Mar 2026 20:43:34 +0100
| Newsgroups | dev.linux.lists.x86-cpuid,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <20260304194334.GEaaiLZqPuGUuBDWzi@fat_crate.local> |
On Fri, Sep 05, 2025 at 02:14:50PM +0200, Ahmed S. Darwish wrote: > The x86 library code provides x86_family() and x86_model(). They take > raw CPUID(0x1) register output, extract the necessary fields with bitwise > operations, then calculate the CPU family and model out of that. > > In follow-up work, the x86 subystem will use parsed CPUID access, along Unknown word [subystem] in commit message. Suggestions: ['subsystem'... Please introduce a spellchecker into your patch creation workflow. > with its auto-generated <asm/cpuid/leaf_types.h> CPUID leaf data types, > instead of direct CPUID access. > > Introduce x86 family and model calculation functions to x86/lib that take > such auto-generateds 'struct leaf_0x1_0' data types. Refactor the Unknown word [auto-generateds] in commit message. > original bitwise operations code so that no logic is duplicated. > > Signed-off-by: Ahmed S. Darwish <[email protected]> > --- > arch/x86/include/asm/cpu.h | 6 ++++++ > arch/x86/lib/cpu.c | 41 ++++++++++++++++++++++---------------- > 2 files changed, 30 insertions(+), 17 deletions(-) > > diff --git a/arch/x86/include/asm/cpu.h b/arch/x86/include/asm/cpu.h > index ad235dda1ded..90902cd91335 100644 > --- a/arch/x86/include/asm/cpu.h > +++ b/arch/x86/include/asm/cpu.h > @@ -7,7 +7,9 @@ > #include <linux/topology.h> > #include <linux/nodemask.h> > #include <linux/percpu.h> > + > #include <asm/ibt.h> > +#include <asm/cpuid/leaf_types.h> > > #ifndef CONFIG_SMP > #define cpu_physical_id(cpu) boot_cpu_physical_apicid > @@ -25,6 +27,10 @@ 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); > + > +unsigned int cpuid_family(const struct leaf_0x1_0 *l); > +unsigned int cpuid_model(const struct leaf_0x1_0 *l); > + > #ifdef CONFIG_X86_BUS_LOCK_DETECT > extern void __init sld_setup(struct cpuinfo_x86 *c); > extern bool handle_user_split_lock(struct pt_regs *regs, long error_code); > diff --git a/arch/x86/lib/cpu.c b/arch/x86/lib/cpu.c > index 7ad68917a51e..eac217d637ac 100644 > --- a/arch/x86/lib/cpu.c > +++ b/arch/x86/lib/cpu.c > @@ -1,36 +1,43 @@ > // SPDX-License-Identifier: GPL-2.0-only > #include <linux/types.h> > #include <linux/export.h> > + > #include <asm/cpu.h> > +#include <asm/cpuid/leaf_types.h> > > -unsigned int x86_family(unsigned int sig) > +static unsigned int __x86_family(unsigned int base_fam, unsigned int ext_fam) > { > - unsigned int x86; > - > - x86 = (sig >> 8) & 0xf; > + return (base_fam == 0xf) ? base_fam + ext_fam : base_fam; Please keep the old simpler code: if (base_fam == 0xf) base_fam += ext_fam; return base_fam; This is way easier to parse than a ternary expression oneliner. Ditto below. > +} > > - if (x86 == 0xf) > - x86 += (sig >> 20) & 0xff; > +static unsigned int > +__x86_model(unsigned int family, unsigned int base_model, unsigned int ext_model) > +{ > + return (family >= 0x6) ? base_model | ext_model << 4 : base_model; > +} Thx. -- Regards/Gruss, Boris. https://people.kernel.org/tglx/notes-about-netiquette