diff options
Diffstat (limited to 'drivers/firmware/efi/libstub/x86-stub.c')
| -rw-r--r-- | drivers/firmware/efi/libstub/x86-stub.c | 28 | 
1 files changed, 26 insertions, 2 deletions
diff --git a/drivers/firmware/efi/libstub/x86-stub.c b/drivers/firmware/efi/libstub/x86-stub.c index d5a8182cf2e1..1983fd3bf392 100644 --- a/drivers/firmware/efi/libstub/x86-stub.c +++ b/drivers/firmware/efi/libstub/x86-stub.c @@ -776,6 +776,26 @@ static void error(char *str)  	efi_warn("Decompression failed: %s\n", str);  } +static const char *cmdline_memmap_override; + +static efi_status_t parse_options(const char *cmdline) +{ +	static const char opts[][14] = { +		"mem=", "memmap=", "efi_fake_mem=", "hugepages=" +	}; + +	for (int i = 0; i < ARRAY_SIZE(opts); i++) { +		const char *p = strstr(cmdline, opts[i]); + +		if (p == cmdline || (p > cmdline && isspace(p[-1]))) { +			cmdline_memmap_override = opts[i]; +			break; +		} +	} + +	return efi_parse_options(cmdline); +} +  static efi_status_t efi_decompress_kernel(unsigned long *kernel_entry)  {  	unsigned long virt_addr = LOAD_PHYSICAL_ADDR; @@ -807,6 +827,10 @@ static efi_status_t efi_decompress_kernel(unsigned long *kernel_entry)  		    !memcmp(efistub_fw_vendor(), ami, sizeof(ami))) {  			efi_debug("AMI firmware v2.0 or older detected - disabling physical KASLR\n");  			seed[0] = 0; +		} else if (cmdline_memmap_override) { +			efi_info("%s detected on the kernel command line - disabling physical KASLR\n", +				 cmdline_memmap_override); +			seed[0] = 0;  		}  		boot_params_ptr->hdr.loadflags |= KASLR_FLAG; @@ -883,7 +907,7 @@ void __noreturn efi_stub_entry(efi_handle_t handle,  	}  #ifdef CONFIG_CMDLINE_BOOL -	status = efi_parse_options(CONFIG_CMDLINE); +	status = parse_options(CONFIG_CMDLINE);  	if (status != EFI_SUCCESS) {  		efi_err("Failed to parse options\n");  		goto fail; @@ -892,7 +916,7 @@ void __noreturn efi_stub_entry(efi_handle_t handle,  	if (!IS_ENABLED(CONFIG_CMDLINE_OVERRIDE)) {  		unsigned long cmdline_paddr = ((u64)hdr->cmd_line_ptr |  					       ((u64)boot_params->ext_cmd_line_ptr << 32)); -		status = efi_parse_options((char *)cmdline_paddr); +		status = parse_options((char *)cmdline_paddr);  		if (status != EFI_SUCCESS) {  			efi_err("Failed to parse options\n");  			goto fail;  |