Commit dc912ba9 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'efi-fixes-for-v6.6-2' of git://git.kernel.org/pub/scm/linux/kernel/git/efi/efi

Pull EFI fix from Ard Biesheuvel:
 "Follow-up fix for the unaccepted memory fix merged last week as part
  of the first EFI fixes batch.

  The unaccepted memory table needs to be accessible very early, even in
  cases (such as crashkernels) where the direct map does not cover all
  of DRAM, and so it is added to memblock explicitly, and subsequently
  memblock_reserve()'d as before"

* tag 'efi-fixes-for-v6.6-2' of git://git.kernel.org/pub/scm/linux/kernel/git/efi/efi:
  efi/unaccepted: Make sure unaccepted table is mapped
parents 48bb67d3 8dbe3395
...@@ -623,6 +623,34 @@ static __init int match_config_table(const efi_guid_t *guid, ...@@ -623,6 +623,34 @@ static __init int match_config_table(const efi_guid_t *guid,
return 0; return 0;
} }
/**
* reserve_unaccepted - Map and reserve unaccepted configuration table
* @unaccepted: Pointer to unaccepted memory table
*
* memblock_add() makes sure that the table is mapped in direct mapping. During
* normal boot it happens automatically because the table is allocated from
* usable memory. But during crashkernel boot only memory specifically reserved
* for crash scenario is mapped. memblock_add() forces the table to be mapped
* in crashkernel case.
*
* Align the range to the nearest page borders. Ranges smaller than page size
* are not going to be mapped.
*
* memblock_reserve() makes sure that future allocations will not touch the
* table.
*/
static __init void reserve_unaccepted(struct efi_unaccepted_memory *unaccepted)
{
phys_addr_t start, size;
start = PAGE_ALIGN_DOWN(efi.unaccepted);
size = PAGE_ALIGN(sizeof(*unaccepted) + unaccepted->size);
memblock_add(start, size);
memblock_reserve(start, size);
}
int __init efi_config_parse_tables(const efi_config_table_t *config_tables, int __init efi_config_parse_tables(const efi_config_table_t *config_tables,
int count, int count,
const efi_config_table_type_t *arch_tables) const efi_config_table_type_t *arch_tables)
...@@ -751,11 +779,9 @@ int __init efi_config_parse_tables(const efi_config_table_t *config_tables, ...@@ -751,11 +779,9 @@ int __init efi_config_parse_tables(const efi_config_table_t *config_tables,
unaccepted = early_memremap(efi.unaccepted, sizeof(*unaccepted)); unaccepted = early_memremap(efi.unaccepted, sizeof(*unaccepted));
if (unaccepted) { if (unaccepted) {
unsigned long size;
if (unaccepted->version == 1) { if (unaccepted->version == 1) {
size = sizeof(*unaccepted) + unaccepted->size; reserve_unaccepted(unaccepted);
memblock_reserve(efi.unaccepted, size);
} else { } else {
efi.unaccepted = EFI_INVALID_TABLE_ADDR; efi.unaccepted = EFI_INVALID_TABLE_ADDR;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment