efi: xen: Set EFI_PARAVIRT for Xen dom0 boot on all architectures
authorArd Biesheuvel <ardb@kernel.org>
Sat, 1 Oct 2022 15:17:36 +0000 (17:17 +0200)
committerArd Biesheuvel <ardb@kernel.org>
Fri, 18 Nov 2022 08:14:09 +0000 (09:14 +0100)
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: Ard Biesheuvel <ardb@kernel.org>
arch/x86/platform/efi/efi.c
arch/x86/platform/efi/memmap.c
drivers/firmware/efi/fdtparams.c
drivers/firmware/efi/memmap.c

index ebc98a68c4005b9dc61f704da788ec29d518360c..7e51c14a1ef06d83d854a0c165ec605bbf3919db 100644 (file)
@@ -214,9 +214,11 @@ int __init efi_memblock_x86_reserve_range(void)
        data.desc_size          = e->efi_memdesc_size;
        data.desc_version       = e->efi_memdesc_version;
 
-       rv = efi_memmap_init_early(&data);
-       if (rv)
-               return rv;
+       if (!efi_enabled(EFI_PARAVIRT)) {
+               rv = efi_memmap_init_early(&data);
+               if (rv)
+                       return rv;
+       }
 
        if (add_efi_memmap || do_efi_soft_reserve())
                do_add_efi_memmap();
index 928e8c978859892f859411448c7ed9765fcbe2ac..c69f8471e6d036761832c367eca9a0dda5968036 100644 (file)
@@ -94,6 +94,9 @@ int __init efi_memmap_install(struct efi_memory_map_data *data)
 {
        efi_memmap_unmap();
 
+       if (efi_enabled(EFI_PARAVIRT))
+               return 0;
+
        return __efi_memmap_init(data);
 }
 
index e901f8564ca0c5741b3755f8333812fdbd69591e..0ec83ba580972f24a19f4f4d10f609119197cfc2 100644 (file)
@@ -30,11 +30,13 @@ static __initconst const char name[][22] = {
 
 static __initconst const struct {
        const char      path[17];
+       u8              paravirt;
        const char      params[PARAMCOUNT][26];
 } dt_params[] = {
        {
 #ifdef CONFIG_XEN    //  <-------17------>
                .path = "/hypervisor/uefi",
+               .paravirt = 1,
                .params = {
                        [SYSTAB] = "xen,uefi-system-table",
                        [MMBASE] = "xen,uefi-mmap-start",
@@ -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);
                        return 0;
                }
+               if (dt_params[i].paravirt)
+                       set_bit(EFI_PARAVIRT, &efi.flags);
                return systab;
        }
 notfound:
index e6256c48284e1df622f6f2859a8209720493c200..a1180461a445cf5b68d948b6dc3a923327953e55 100644 (file)
@@ -39,9 +39,6 @@ int __init __efi_memmap_init(struct efi_memory_map_data *data)
        struct efi_memory_map map;
        phys_addr_t phys_map;
 
-       if (efi_enabled(EFI_PARAVIRT))
-               return 0;
-
        phys_map = data->phys_map;
 
        if (data->flags & EFI_MEMMAP_LATE)