Skip to content

Commit 250b3c0

Browse files
ricardonPeter Zijlstra
authored andcommitted
x86/cpu: Add helper function to get the type of the current hybrid CPU
On processors with Intel Hybrid Technology (i.e., one having more than one type of CPU in the same package), all CPUs support the same instruction set and enumerate the same features on CPUID. Thus, all software can run on any CPU without restrictions. However, there may be model-specific differences among types of CPUs. For instance, each type of CPU may support a different number of performance counters. Also, machine check error banks may be wired differently. Even though most software will not care about these differences, kernel subsystems dealing with these differences must know. Add and expose a new helper function get_this_hybrid_cpu_type() to query the type of the current hybrid CPU. The function will be used later in the perf subsystem. The Intel Software Developer's Manual defines the CPU type as 8-bit identifier. Signed-off-by: Ricardo Neri <[email protected]> Signed-off-by: Peter Zijlstra (Intel) <[email protected]> Reviewed-by: Tony Luck <[email protected]> Reviewed-by: Len Brown <[email protected]> Acked-by: Borislav Petkov <[email protected]> Link: https://lkml.kernel.org/r/[email protected]
1 parent a161545 commit 250b3c0

File tree

2 files changed

+22
-0
lines changed

2 files changed

+22
-0
lines changed

arch/x86/include/asm/cpu.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ extern void __init cpu_set_core_cap_bits(struct cpuinfo_x86 *c);
4545
extern void switch_to_sld(unsigned long tifn);
4646
extern bool handle_user_split_lock(struct pt_regs *regs, long error_code);
4747
extern bool handle_guest_split_lock(unsigned long ip);
48+
u8 get_this_hybrid_cpu_type(void);
4849
#else
4950
static inline void __init cpu_set_core_cap_bits(struct cpuinfo_x86 *c) {}
5051
static inline void switch_to_sld(unsigned long tifn) {}
@@ -57,6 +58,11 @@ static inline bool handle_guest_split_lock(unsigned long ip)
5758
{
5859
return false;
5960
}
61+
62+
static inline u8 get_this_hybrid_cpu_type(void)
63+
{
64+
return 0;
65+
}
6066
#endif
6167
#ifdef CONFIG_IA32_FEAT_CTL
6268
void init_ia32_feat_ctl(struct cpuinfo_x86 *c);

arch/x86/kernel/cpu/intel.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1195,3 +1195,19 @@ void __init cpu_set_core_cap_bits(struct cpuinfo_x86 *c)
11951195
cpu_model_supports_sld = true;
11961196
split_lock_setup();
11971197
}
1198+
1199+
#define X86_HYBRID_CPU_TYPE_ID_SHIFT 24
1200+
1201+
/**
1202+
* get_this_hybrid_cpu_type() - Get the type of this hybrid CPU
1203+
*
1204+
* Returns the CPU type [31:24] (i.e., Atom or Core) of a CPU in
1205+
* a hybrid processor. If the processor is not hybrid, returns 0.
1206+
*/
1207+
u8 get_this_hybrid_cpu_type(void)
1208+
{
1209+
if (!cpu_feature_enabled(X86_FEATURE_HYBRID_CPU))
1210+
return 0;
1211+
1212+
return cpuid_eax(0x0000001a) >> X86_HYBRID_CPU_TYPE_ID_SHIFT;
1213+
}

0 commit comments

Comments
 (0)