mirror of
https://github.com/torvalds/linux.git
synced 2025-11-03 18:20:25 +02:00
Consolidate the whole logic which determines whether the microcode loader
should be enabled or not into a single function and call it everywhere.
Well, almost everywhere - not in mk_early_pgtbl_32() because there the kernel
is running without paging enabled and checking dis_ucode_ldr et al would
require physical addresses and uglification of the code.
But since this is 32-bit, the easier thing to do is to simply map the initrd
unconditionally especially since that mapping is getting removed later anyway
by zap_early_initrd_mapping() and avoid the uglification.
In doing so, address the issue of old 486er machines without CPUID
support, not booting current kernels.
[ mingo: Fix no previous prototype for ‘microcode_loader_disabled’ [-Wmissing-prototypes] ]
Fixes: 4c585af718 ("x86/boot/32: Temporarily map initrd for microcode loading")
Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
Cc: <stable@kernel.org>
Link: https://lore.kernel.org/r/CANpbe9Wm3z8fy9HbgS8cuhoj0TREYEEkBipDuhgkWFvqX0UoVQ@mail.gmail.com
91 lines
2.2 KiB
C
91 lines
2.2 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef _ASM_X86_MICROCODE_H
|
|
#define _ASM_X86_MICROCODE_H
|
|
|
|
struct cpu_signature {
|
|
unsigned int sig;
|
|
unsigned int pf;
|
|
unsigned int rev;
|
|
};
|
|
|
|
struct ucode_cpu_info {
|
|
struct cpu_signature cpu_sig;
|
|
void *mc;
|
|
};
|
|
|
|
#ifdef CONFIG_MICROCODE
|
|
void load_ucode_bsp(void);
|
|
void load_ucode_ap(void);
|
|
void microcode_bsp_resume(void);
|
|
bool __init microcode_loader_disabled(void);
|
|
#else
|
|
static inline void load_ucode_bsp(void) { }
|
|
static inline void load_ucode_ap(void) { }
|
|
static inline void microcode_bsp_resume(void) { }
|
|
static inline bool __init microcode_loader_disabled(void) { return false; }
|
|
#endif
|
|
|
|
extern unsigned long initrd_start_early;
|
|
|
|
#ifdef CONFIG_CPU_SUP_INTEL
|
|
/* Intel specific microcode defines. Public for IFS */
|
|
struct microcode_header_intel {
|
|
unsigned int hdrver;
|
|
unsigned int rev;
|
|
unsigned int date;
|
|
unsigned int sig;
|
|
unsigned int cksum;
|
|
unsigned int ldrver;
|
|
unsigned int pf;
|
|
unsigned int datasize;
|
|
unsigned int totalsize;
|
|
unsigned int metasize;
|
|
unsigned int min_req_ver;
|
|
unsigned int reserved;
|
|
};
|
|
|
|
struct microcode_intel {
|
|
struct microcode_header_intel hdr;
|
|
unsigned int bits[];
|
|
};
|
|
|
|
#define DEFAULT_UCODE_DATASIZE (2000)
|
|
#define MC_HEADER_SIZE (sizeof(struct microcode_header_intel))
|
|
#define MC_HEADER_TYPE_MICROCODE 1
|
|
#define MC_HEADER_TYPE_IFS 2
|
|
|
|
static inline int intel_microcode_get_datasize(struct microcode_header_intel *hdr)
|
|
{
|
|
return hdr->datasize ? : DEFAULT_UCODE_DATASIZE;
|
|
}
|
|
|
|
static inline u32 intel_get_microcode_revision(void)
|
|
{
|
|
u32 rev, dummy;
|
|
|
|
native_wrmsrl(MSR_IA32_UCODE_REV, 0);
|
|
|
|
/* As documented in the SDM: Do a CPUID 1 here */
|
|
native_cpuid_eax(1);
|
|
|
|
/* get the current revision from MSR 0x8B */
|
|
native_rdmsr(MSR_IA32_UCODE_REV, dummy, rev);
|
|
|
|
return rev;
|
|
}
|
|
#endif /* !CONFIG_CPU_SUP_INTEL */
|
|
|
|
bool microcode_nmi_handler(void);
|
|
void microcode_offline_nmi_handler(void);
|
|
|
|
#ifdef CONFIG_MICROCODE_LATE_LOADING
|
|
DECLARE_STATIC_KEY_FALSE(microcode_nmi_handler_enable);
|
|
static __always_inline bool microcode_nmi_handler_enabled(void)
|
|
{
|
|
return static_branch_unlikely(µcode_nmi_handler_enable);
|
|
}
|
|
#else
|
|
static __always_inline bool microcode_nmi_handler_enabled(void) { return false; }
|
|
#endif
|
|
|
|
#endif /* _ASM_X86_MICROCODE_H */
|