[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH v2 3/6] efi: xen: Set EFI_PARAVIRT for Xen dom0 boot on all architectures



Currently, the EFI_PARAVIRT flag is only used by 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@xxxxxxxxxx>
---
 arch/x86/platform/efi/efi.c      | 8 +++++---
 arch/x86/platform/efi/memmap.c   | 3 +++
 drivers/firmware/efi/fdtparams.c | 4 ++++
 drivers/firmware/efi/memmap.c    | 3 ---
 4 files changed, 12 insertions(+), 6 deletions(-)

diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c
index 6e598bd78eef..6a6f2a585a3d 100644
--- a/arch/x86/platform/efi/efi.c
+++ b/arch/x86/platform/efi/efi.c
@@ -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();
diff --git a/arch/x86/platform/efi/memmap.c b/arch/x86/platform/efi/memmap.c
index 44b886acf301..18e14ec16720 100644
--- a/arch/x86/platform/efi/memmap.c
+++ b/arch/x86/platform/efi/memmap.c
@@ -93,6 +93,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);
 }
 
diff --git a/drivers/firmware/efi/fdtparams.c b/drivers/firmware/efi/fdtparams.c
index e901f8564ca0..0ec83ba58097 100644
--- a/drivers/firmware/efi/fdtparams.c
+++ b/drivers/firmware/efi/fdtparams.c
@@ -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:
diff --git a/drivers/firmware/efi/memmap.c b/drivers/firmware/efi/memmap.c
index 3501d3814f22..9508082af907 100644
--- a/drivers/firmware/efi/memmap.c
+++ b/drivers/firmware/efi/memmap.c
@@ -44,9 +44,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)
-- 
2.35.1




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.