Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a23d3bb0 authored by Ard Biesheuvel's avatar Ard Biesheuvel
Browse files

efi: add API to reserve memory persistently across kexec reboot



Add kernel plumbing to reserve memory regions persistently on a EFI
system by adding entries to the MEMRESERVE linked list.

Tested-by: default avatarJeremy Linton <jeremy.linton@arm.com>
Signed-off-by: default avatarArd Biesheuvel <ard.biesheuvel@linaro.org>
parent b844470f
Loading
Loading
Loading
Loading
+32 −0
Original line number Diff line number Diff line
@@ -962,6 +962,38 @@ bool efi_is_table_address(unsigned long phys_addr)
	return false;
}

static DEFINE_SPINLOCK(efi_mem_reserve_persistent_lock);

int efi_mem_reserve_persistent(phys_addr_t addr, u64 size)
{
	struct linux_efi_memreserve *rsv, *parent;

	if (efi.mem_reserve == EFI_INVALID_TABLE_ADDR)
		return -ENODEV;

	rsv = kmalloc(sizeof(*rsv), GFP_KERNEL);
	if (!rsv)
		return -ENOMEM;

	parent = memremap(efi.mem_reserve, sizeof(*rsv), MEMREMAP_WB);
	if (!parent) {
		kfree(rsv);
		return -ENOMEM;
	}

	rsv->base = addr;
	rsv->size = size;

	spin_lock(&efi_mem_reserve_persistent_lock);
	rsv->next = parent->next;
	parent->next = __pa(rsv);
	spin_unlock(&efi_mem_reserve_persistent_lock);

	memunmap(parent);

	return 0;
}

#ifdef CONFIG_KEXEC
static int update_efi_random_seed(struct notifier_block *nb,
				  unsigned long code, void *unused)
+1 −0
Original line number Diff line number Diff line
@@ -1043,6 +1043,7 @@ extern int __init efi_uart_console_only (void);
extern u64 efi_mem_desc_end(efi_memory_desc_t *md);
extern int efi_mem_desc_lookup(u64 phys_addr, efi_memory_desc_t *out_md);
extern void efi_mem_reserve(phys_addr_t addr, u64 size);
extern int efi_mem_reserve_persistent(phys_addr_t addr, u64 size);
extern void efi_initialize_iomem_resources(struct resource *code_resource,
		struct resource *data_resource, struct resource *bss_resource);
extern void efi_reserve_boot_services(void);