Skip to content

Commit

Permalink
efi/x86: Remove runtime table address from kexec EFI setup data
Browse files Browse the repository at this point in the history
Since commit 33b8544 ("efi/x86: Drop two near identical versions
of efi_runtime_init()"), we no longer map the EFI runtime services table
before calling SetVirtualAddressMap(), which means we don't need the 1:1
mapped physical address of this table, and so there is no point in passing
the address via EFI setup data on kexec boot.

Note that the kexec tools will still look for this address in sysfs, so
we still need to provide it.

Tested-by: Tony Luck <tony.luck@intel.com> # arch/ia64
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
  • Loading branch information
Ard Biesheuvel committed Feb 23, 2020
1 parent 06c0bd9 commit 0a67361
Show file tree
Hide file tree
Showing 3 changed files with 1 addition and 5 deletions.
1 change: 0 additions & 1 deletion arch/x86/include/asm/efi.h
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,6 @@ extern void __init efi_uv1_memmap_phys_epilog(pgd_t *save_pgd);

struct efi_setup_data {
u64 fw_vendor;
u64 runtime;
u64 tables;
u64 smbios;
u64 reserved[8];
Expand Down
1 change: 0 additions & 1 deletion arch/x86/kernel/kexec-bzimage64.c
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,6 @@ prepare_add_efi_setup_data(struct boot_params *params,
struct efi_setup_data *esd = (void *)sd + sizeof(struct setup_data);

esd->fw_vendor = efi.fw_vendor;
esd->runtime = efi.runtime;
esd->tables = efi.config_table;
esd->smbios = efi.smbios;

Expand Down
4 changes: 1 addition & 3 deletions arch/x86/platform/efi/efi.c
Original file line number Diff line number Diff line change
Expand Up @@ -376,6 +376,7 @@ static int __init efi_systab_init(u64 phys)
systab64->con_out > U32_MAX ||
systab64->stderr_handle > U32_MAX ||
systab64->stderr > U32_MAX ||
systab64->runtime > U32_MAX ||
systab64->boottime > U32_MAX;

if (efi_setup) {
Expand All @@ -388,17 +389,14 @@ static int __init efi_systab_init(u64 phys)
}

efi_systab.fw_vendor = (unsigned long)data->fw_vendor;
efi_systab.runtime = (void *)(unsigned long)data->runtime;
efi_systab.tables = (unsigned long)data->tables;

over4g |= data->fw_vendor > U32_MAX ||
data->runtime > U32_MAX ||
data->tables > U32_MAX;

early_memunmap(data, sizeof(*data));
} else {
over4g |= systab64->fw_vendor > U32_MAX ||
systab64->runtime > U32_MAX ||
systab64->tables > U32_MAX;
}
} else {
Expand Down

0 comments on commit 0a67361

Please sign in to comment.