diff options
Diffstat (limited to 'arch/x86/kernel')
| -rw-r--r-- | arch/x86/kernel/eisa.c | 3 | ||||
| -rw-r--r-- | arch/x86/kernel/nmi.c | 24 | ||||
| -rw-r--r-- | arch/x86/kernel/probe_roms.c | 10 | ||||
| -rw-r--r-- | arch/x86/kernel/setup.c | 3 | ||||
| -rw-r--r-- | arch/x86/kernel/sev.c | 27 | ||||
| -rw-r--r-- | arch/x86/kernel/x86_init.c | 2 | 
6 files changed, 31 insertions, 38 deletions
| diff --git a/arch/x86/kernel/eisa.c b/arch/x86/kernel/eisa.c index e963344b0449..53935b4d62e3 100644 --- a/arch/x86/kernel/eisa.c +++ b/arch/x86/kernel/eisa.c @@ -2,6 +2,7 @@  /*   * EISA specific code   */ +#include <linux/cc_platform.h>  #include <linux/ioport.h>  #include <linux/eisa.h>  #include <linux/io.h> @@ -12,7 +13,7 @@ static __init int eisa_bus_probe(void)  {  	void __iomem *p; -	if (xen_pv_domain() && !xen_initial_domain()) +	if ((xen_pv_domain() && !xen_initial_domain()) || cc_platform_has(CC_ATTR_GUEST_SEV_SNP))  		return 0;  	p = ioremap(0x0FFFD9, 4); diff --git a/arch/x86/kernel/nmi.c b/arch/x86/kernel/nmi.c index 9a5b372c706f..ed163c8c8604 100644 --- a/arch/x86/kernel/nmi.c +++ b/arch/x86/kernel/nmi.c @@ -580,7 +580,7 @@ EXPORT_SYMBOL_GPL(asm_exc_nmi_kvm_vmx);  static char *nmi_check_stall_msg[] = {  /*									*/ -/* +--------- nsp->idt_seq_snap & 0x1: CPU is in NMI handler.		*/ +/* +--------- nmi_seq & 0x1: CPU is currently in NMI handler.		*/  /* | +------ cpu_is_offline(cpu)					*/  /* | | +--- nsp->idt_calls_snap != atomic_long_read(&nsp->idt_calls):	*/  /* | | |	NMI handler has been invoked.				*/ @@ -628,22 +628,26 @@ void nmi_backtrace_stall_check(const struct cpumask *btp)  		nmi_seq = READ_ONCE(nsp->idt_nmi_seq);  		if (nsp->idt_nmi_seq_snap + 1 == nmi_seq && (nmi_seq & 0x1)) {  			msgp = "CPU entered NMI handler function, but has not exited"; -		} else if ((nsp->idt_nmi_seq_snap & 0x1) != (nmi_seq & 0x1)) { -			msgp = "CPU is handling NMIs"; -		} else { -			idx = ((nsp->idt_seq_snap & 0x1) << 2) | +		} else if (nsp->idt_nmi_seq_snap == nmi_seq || +			   nsp->idt_nmi_seq_snap + 1 == nmi_seq) { +			idx = ((nmi_seq & 0x1) << 2) |  			      (cpu_is_offline(cpu) << 1) |  			      (nsp->idt_calls_snap != atomic_long_read(&nsp->idt_calls));  			msgp = nmi_check_stall_msg[idx];  			if (nsp->idt_ignored_snap != READ_ONCE(nsp->idt_ignored) && (idx & 0x1))  				modp = ", but OK because ignore_nmis was set"; -			if (nmi_seq & 0x1) -				msghp = " (CPU currently in NMI handler function)"; -			else if (nsp->idt_nmi_seq_snap + 1 == nmi_seq) +			if (nsp->idt_nmi_seq_snap + 1 == nmi_seq)  				msghp = " (CPU exited one NMI handler function)"; +			else if (nmi_seq & 0x1) +				msghp = " (CPU currently in NMI handler function)"; +			else +				msghp = " (CPU was never in an NMI handler function)"; +		} else { +			msgp = "CPU is handling NMIs";  		} -		pr_alert("%s: CPU %d: %s%s%s, last activity: %lu jiffies ago.\n", -			 __func__, cpu, msgp, modp, msghp, j - READ_ONCE(nsp->recv_jiffies)); +		pr_alert("%s: CPU %d: %s%s%s\n", __func__, cpu, msgp, modp, msghp); +		pr_alert("%s: last activity: %lu jiffies ago.\n", +			 __func__, j - READ_ONCE(nsp->recv_jiffies));  	}  } diff --git a/arch/x86/kernel/probe_roms.c b/arch/x86/kernel/probe_roms.c index 319fef37d9dc..cc2c34ba7228 100644 --- a/arch/x86/kernel/probe_roms.c +++ b/arch/x86/kernel/probe_roms.c @@ -203,16 +203,6 @@ void __init probe_roms(void)  	unsigned char c;  	int i; -	/* -	 * The ROM memory range is not part of the e820 table and is therefore not -	 * pre-validated by BIOS. The kernel page table maps the ROM region as encrypted -	 * memory, and SNP requires encrypted memory to be validated before access. -	 * Do that here. -	 */ -	snp_prep_memory(video_rom_resource.start, -			((system_rom_resource.end + 1) - video_rom_resource.start), -			SNP_PAGE_STATE_PRIVATE); -  	/* video rom */  	upper = adapter_rom_resources[0].start;  	for (start = video_rom_resource.start; start < upper; start += 2048) { diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index ef206500ed6f..0109e6c510e0 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c @@ -9,7 +9,6 @@  #include <linux/console.h>  #include <linux/crash_dump.h>  #include <linux/dma-map-ops.h> -#include <linux/dmi.h>  #include <linux/efi.h>  #include <linux/ima.h>  #include <linux/init_ohci1394_dma.h> @@ -902,7 +901,7 @@ void __init setup_arch(char **cmdline_p)  		efi_init();  	reserve_ibft_region(); -	dmi_setup(); +	x86_init.resources.dmi_setup();  	/*  	 * VMware detection requires dmi to be available, so this diff --git a/arch/x86/kernel/sev.c b/arch/x86/kernel/sev.c index b59b09c2f284..7e1e63cc48e6 100644 --- a/arch/x86/kernel/sev.c +++ b/arch/x86/kernel/sev.c @@ -23,6 +23,7 @@  #include <linux/platform_device.h>  #include <linux/io.h>  #include <linux/psp-sev.h> +#include <linux/dmi.h>  #include <uapi/linux/sev-guest.h>  #include <asm/init.h> @@ -795,21 +796,6 @@ void __init early_snp_set_memory_shared(unsigned long vaddr, unsigned long paddr  	early_set_pages_state(vaddr, paddr, npages, SNP_PAGE_STATE_SHARED);  } -void __init snp_prep_memory(unsigned long paddr, unsigned int sz, enum psc_op op) -{ -	unsigned long vaddr, npages; - -	vaddr = (unsigned long)__va(paddr); -	npages = PAGE_ALIGN(sz) >> PAGE_SHIFT; - -	if (op == SNP_PAGE_STATE_PRIVATE) -		early_snp_set_memory_private(vaddr, paddr, npages); -	else if (op == SNP_PAGE_STATE_SHARED) -		early_snp_set_memory_shared(vaddr, paddr, npages); -	else -		WARN(1, "invalid memory op %d\n", op); -} -  static unsigned long __set_pages_state(struct snp_psc_desc *data, unsigned long vaddr,  				       unsigned long vaddr_end, int op)  { @@ -2136,6 +2122,17 @@ void __head __noreturn snp_abort(void)  	sev_es_terminate(SEV_TERM_SET_GEN, GHCB_SNP_UNSUPPORTED);  } +/* + * SEV-SNP guests should only execute dmi_setup() if EFI_CONFIG_TABLES are + * enabled, as the alternative (fallback) logic for DMI probing in the legacy + * ROM region can cause a crash since this region is not pre-validated. + */ +void __init snp_dmi_setup(void) +{ +	if (efi_enabled(EFI_CONFIG_TABLES)) +		dmi_setup(); +} +  static void dump_cpuid_table(void)  {  	const struct snp_cpuid_table *cpuid_table = snp_cpuid_get_table(); diff --git a/arch/x86/kernel/x86_init.c b/arch/x86/kernel/x86_init.c index a42830dc151b..d5dc5a92635a 100644 --- a/arch/x86/kernel/x86_init.c +++ b/arch/x86/kernel/x86_init.c @@ -3,6 +3,7 @@   *   *  For licencing details see kernel-base/COPYING   */ +#include <linux/dmi.h>  #include <linux/init.h>  #include <linux/ioport.h>  #include <linux/export.h> @@ -66,6 +67,7 @@ struct x86_init_ops x86_init __initdata = {  		.probe_roms		= probe_roms,  		.reserve_resources	= reserve_standard_io_resources,  		.memory_setup		= e820__memory_setup_default, +		.dmi_setup		= dmi_setup,  	},  	.mpparse = { |