Commit d85e3e34 authored by Ard Biesheuvel's avatar Ard Biesheuvel

efi: xen: Set EFI_PARAVIRT for Xen dom0 boot on all architectures

Currently, the EFI_PARAVIRT flag is only used by Xen dom0 boot on x86,
even though other architectures also support pseudo-EFI boot, where the
core kernel is invoked directly and provided with a set of data tables
that resemble the ones constructed by the EFI stub, which never actually
runs in that case.

Let's fix this inconsistency, and always set this flag when booting dom0
via the EFI boot path. Note that Xen on x86 does not provide the EFI
memory map in this case, whereas other architectures do, so move the
associated EFI_PARAVIRT check into the x86 platform code.
Signed-off-by: default avatarArd Biesheuvel <ardb@kernel.org>
parent fdc6d38d
...@@ -214,9 +214,11 @@ int __init efi_memblock_x86_reserve_range(void) ...@@ -214,9 +214,11 @@ int __init efi_memblock_x86_reserve_range(void)
data.desc_size = e->efi_memdesc_size; data.desc_size = e->efi_memdesc_size;
data.desc_version = e->efi_memdesc_version; data.desc_version = e->efi_memdesc_version;
rv = efi_memmap_init_early(&data); if (!efi_enabled(EFI_PARAVIRT)) {
if (rv) rv = efi_memmap_init_early(&data);
return rv; if (rv)
return rv;
}
if (add_efi_memmap || do_efi_soft_reserve()) if (add_efi_memmap || do_efi_soft_reserve())
do_add_efi_memmap(); do_add_efi_memmap();
......
...@@ -94,6 +94,9 @@ int __init efi_memmap_install(struct efi_memory_map_data *data) ...@@ -94,6 +94,9 @@ int __init efi_memmap_install(struct efi_memory_map_data *data)
{ {
efi_memmap_unmap(); efi_memmap_unmap();
if (efi_enabled(EFI_PARAVIRT))
return 0;
return __efi_memmap_init(data); return __efi_memmap_init(data);
} }
......
...@@ -30,11 +30,13 @@ static __initconst const char name[][22] = { ...@@ -30,11 +30,13 @@ static __initconst const char name[][22] = {
static __initconst const struct { static __initconst const struct {
const char path[17]; const char path[17];
u8 paravirt;
const char params[PARAMCOUNT][26]; const char params[PARAMCOUNT][26];
} dt_params[] = { } dt_params[] = {
{ {
#ifdef CONFIG_XEN // <-------17------> #ifdef CONFIG_XEN // <-------17------>
.path = "/hypervisor/uefi", .path = "/hypervisor/uefi",
.paravirt = 1,
.params = { .params = {
[SYSTAB] = "xen,uefi-system-table", [SYSTAB] = "xen,uefi-system-table",
[MMBASE] = "xen,uefi-mmap-start", [MMBASE] = "xen,uefi-mmap-start",
...@@ -121,6 +123,8 @@ u64 __init efi_get_fdt_params(struct efi_memory_map_data *mm) ...@@ -121,6 +123,8 @@ u64 __init efi_get_fdt_params(struct efi_memory_map_data *mm)
pr_err("Can't find property '%s' in DT!\n", pname); pr_err("Can't find property '%s' in DT!\n", pname);
return 0; return 0;
} }
if (dt_params[i].paravirt)
set_bit(EFI_PARAVIRT, &efi.flags);
return systab; return systab;
} }
notfound: notfound:
......
...@@ -39,9 +39,6 @@ int __init __efi_memmap_init(struct efi_memory_map_data *data) ...@@ -39,9 +39,6 @@ int __init __efi_memmap_init(struct efi_memory_map_data *data)
struct efi_memory_map map; struct efi_memory_map map;
phys_addr_t phys_map; phys_addr_t phys_map;
if (efi_enabled(EFI_PARAVIRT))
return 0;
phys_map = data->phys_map; phys_map = data->phys_map;
if (data->flags & EFI_MEMMAP_LATE) if (data->flags & EFI_MEMMAP_LATE)
......
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