Skip to content

Commit

Permalink
xen/pvh: correctly setup the PV EFI interface for dom0
Browse files Browse the repository at this point in the history
This involves initializing the boot params EFI related fields and the
efi global variable.

Without this fix a PVH dom0 doesn't detect when booted from EFI, and
thus doesn't support accessing any of the EFI related data.

Reported-by: PGNet Dev <pgnet.dev@gmail.com>
Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>
Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Cc: stable@vger.kernel.org # 4.19+
  • Loading branch information
Roger Pau Monne authored and Boris Ostrovsky committed Apr 25, 2019
1 parent c9f804d commit 72813bf
Show file tree
Hide file tree
Showing 5 changed files with 18 additions and 14 deletions.
8 changes: 4 additions & 4 deletions arch/x86/platform/pvh/enlighten.c
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,6 @@ void __init __weak mem_map_via_hcall(struct boot_params *ptr __maybe_unused)

static void __init init_pvh_bootparams(bool xen_guest)
{
memset(&pvh_bootparams, 0, sizeof(pvh_bootparams));

if ((pvh_start_info.version > 0) && (pvh_start_info.memmap_entries)) {
struct hvm_memmap_table_entry *ep;
int i;
Expand Down Expand Up @@ -103,7 +101,7 @@ static void __init init_pvh_bootparams(bool xen_guest)
* If we are trying to boot a Xen PVH guest, it is expected that the kernel
* will have been configured to provide the required override for this routine.
*/
void __init __weak xen_pvh_init(void)
void __init __weak xen_pvh_init(struct boot_params *boot_params)
{
xen_raw_printk("Error: Missing xen PVH initialization\n");
BUG();
Expand All @@ -112,7 +110,7 @@ void __init __weak xen_pvh_init(void)
static void hypervisor_specific_init(bool xen_guest)
{
if (xen_guest)
xen_pvh_init();
xen_pvh_init(&pvh_bootparams);
}

/*
Expand All @@ -131,6 +129,8 @@ void __init xen_prepare_pvh(void)
BUG();
}

memset(&pvh_bootparams, 0, sizeof(pvh_bootparams));

hypervisor_specific_init(xen_guest);

init_pvh_bootparams(xen_guest);
Expand Down
12 changes: 6 additions & 6 deletions arch/x86/xen/efi.c
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,7 @@ static enum efi_secureboot_mode xen_efi_get_secureboot(void)
return efi_secureboot_mode_unknown;
}

void __init xen_efi_init(void)
void __init xen_efi_init(struct boot_params *boot_params)
{
efi_system_table_t *efi_systab_xen;

Expand All @@ -167,12 +167,12 @@ void __init xen_efi_init(void)
if (efi_systab_xen == NULL)
return;

strncpy((char *)&boot_params.efi_info.efi_loader_signature, "Xen",
sizeof(boot_params.efi_info.efi_loader_signature));
boot_params.efi_info.efi_systab = (__u32)__pa(efi_systab_xen);
boot_params.efi_info.efi_systab_hi = (__u32)(__pa(efi_systab_xen) >> 32);
strncpy((char *)&boot_params->efi_info.efi_loader_signature, "Xen",
sizeof(boot_params->efi_info.efi_loader_signature));
boot_params->efi_info.efi_systab = (__u32)__pa(efi_systab_xen);
boot_params->efi_info.efi_systab_hi = (__u32)(__pa(efi_systab_xen) >> 32);

boot_params.secure_boot = xen_efi_get_secureboot();
boot_params->secure_boot = xen_efi_get_secureboot();

set_bit(EFI_BOOT, &efi.flags);
set_bit(EFI_PARAVIRT, &efi.flags);
Expand Down
2 changes: 1 addition & 1 deletion arch/x86/xen/enlighten_pv.c
Original file line number Diff line number Diff line change
Expand Up @@ -1403,7 +1403,7 @@ asmlinkage __visible void __init xen_start_kernel(void)
/* We need this for printk timestamps */
xen_setup_runstate_info(0);

xen_efi_init();
xen_efi_init(&boot_params);

/* Start the world */
#ifdef CONFIG_X86_32
Expand Down
6 changes: 5 additions & 1 deletion arch/x86/xen/enlighten_pvh.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@

#include <xen/interface/memory.h>

#include "xen-ops.h"

/*
* PVH variables.
*
Expand All @@ -21,7 +23,7 @@
*/
bool xen_pvh __attribute__((section(".data"))) = 0;

void __init xen_pvh_init(void)
void __init xen_pvh_init(struct boot_params *boot_params)
{
u32 msr;
u64 pfn;
Expand All @@ -33,6 +35,8 @@ void __init xen_pvh_init(void)
msr = cpuid_ebx(xen_cpuid_base() + 2);
pfn = __pa(hypercall_page);
wrmsr_safe(msr, (u32)pfn, (u32)(pfn >> 32));

xen_efi_init(boot_params);
}

void __init mem_map_via_hcall(struct boot_params *boot_params_p)
Expand Down
4 changes: 2 additions & 2 deletions arch/x86/xen/xen-ops.h
Original file line number Diff line number Diff line change
Expand Up @@ -122,9 +122,9 @@ static inline void __init xen_init_vga(const struct dom0_vga_console_info *info,
void __init xen_init_apic(void);

#ifdef CONFIG_XEN_EFI
extern void xen_efi_init(void);
extern void xen_efi_init(struct boot_params *boot_params);
#else
static inline void __init xen_efi_init(void)
static inline void __init xen_efi_init(struct boot_params *boot_params)
{
}
#endif
Expand Down

0 comments on commit 72813bf

Please sign in to comment.