[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH-for-4.11] tools: add quirk for loading PVH RSDP into low memory
Commit 4a5733771e6f33918eba07b584cccce564a67ac1 ("libxl: put RSDP for PVH guest near 4GB") broke PVH guests with Linux kernels before 4.17 as those kernels are not taking the RSDP address from the PVH start_info structure, but are searching it as on legacy system by scanning low memory. Add a quirk to the domain config to enable loading the RSDP at low addresses again. Specifying "pvh_quirk_rsdp=1" will accomplish that. Signed-off-by: Juergen Gross <jgross@xxxxxxxx> --- docs/man/xl.cfg.pod.5.in | 8 ++++++++ tools/libxl/libxl_create.c | 1 + tools/libxl/libxl_types.idl | 1 + tools/libxl/libxl_x86_acpi.c | 8 ++++++-- tools/xl/xl_parse.c | 2 ++ 5 files changed, 18 insertions(+), 2 deletions(-) diff --git a/docs/man/xl.cfg.pod.5.in b/docs/man/xl.cfg.pod.5.in index 47d88243b1..4c00bc2d2f 100644 --- a/docs/man/xl.cfg.pod.5.in +++ b/docs/man/xl.cfg.pod.5.in @@ -541,6 +541,14 @@ If supplied, appended to the value for pvshim_cmdline. Default is empty. Ignored if pvhsim is false. +=item B<pvh_quirk_rsdp=BOOLEAN> + +Linux kernels older than 4.17 need that set to true in order to enable +them to find the RSDP table. From Linux 4.17 on this is no longer necessary +as the kernel will use the RSDP address put by Xen into its boot parameters. + +Default is false. + =back =head3 Other Options diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c index 692461a5a1..fd9070416a 100644 --- a/tools/libxl/libxl_create.c +++ b/tools/libxl/libxl_create.c @@ -400,6 +400,7 @@ int libxl__domain_build_info_setdefault(libxl__gc *gc, b_info->u.pvh.pvshim_cmdline = libxl__strdup(NOGC, PVSHIM_CMDLINE); } + libxl_defbool_setdefault(&b_info->u.pvh.quirk_rsdp, false); break; default: diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl index 01ec1d1afa..76eabe31c0 100644 --- a/tools/libxl/libxl_types.idl +++ b/tools/libxl/libxl_types.idl @@ -596,6 +596,7 @@ libxl_domain_build_info = Struct("domain_build_info",[ ("pvshim_path", string), ("pvshim_cmdline", string), ("pvshim_extra", string), # eg "loglvl=all guest_loglvl=all apic_verbosity=debug e820-verbose" + ("quirk_rsdp", libxl_defbool), ])), ("invalid", None), ], keyvar_init_val = "LIBXL_DOMAIN_TYPE_INVALID")), diff --git a/tools/libxl/libxl_x86_acpi.c b/tools/libxl/libxl_x86_acpi.c index fe87418bc1..a54025ed48 100644 --- a/tools/libxl/libxl_x86_acpi.c +++ b/tools/libxl/libxl_x86_acpi.c @@ -23,6 +23,7 @@ /* Number of pages holding ACPI tables */ #define NUM_ACPI_PAGES 16 #define ACPI_INFO_PHYSICAL_ADDRESS 0xfc000000 +#define QUIRK_RSDP_ADDRESS (0x100000 - 64) struct libxl_acpi_ctxt { struct acpi_ctxt c; @@ -218,8 +219,11 @@ int libxl__dom_load_acpi(libxl__gc *gc, dom->acpi_modules[0].data = (void *)config.rsdp; dom->acpi_modules[0].length = 64; - dom->acpi_modules[0].guest_addr_out = ACPI_INFO_PHYSICAL_ADDRESS + - (1 + acpi_pages_num) * libxl_ctxt.page_size; + if (libxl_defbool_val(b_info->u.pvh.quirk_rsdp)) + dom->acpi_modules[0].guest_addr_out = QUIRK_RSDP_ADDRESS; + else + dom->acpi_modules[0].guest_addr_out = ACPI_INFO_PHYSICAL_ADDRESS + + (1 + acpi_pages_num) * libxl_ctxt.page_size; dom->acpi_modules[1].data = (void *)config.infop; dom->acpi_modules[1].length = 4096; diff --git a/tools/xl/xl_parse.c b/tools/xl/xl_parse.c index e6c54483e0..222705121e 100644 --- a/tools/xl/xl_parse.c +++ b/tools/xl/xl_parse.c @@ -973,6 +973,8 @@ void parse_config_data(const char *config_source, if (!xlu_cfg_get_string(config, "pvshim_extra", &buf, 0)) xlu_cfg_replace_string(config, "pvshim_extra", &b_info->u.pvh.pvshim_extra, 0); + xlu_cfg_get_defbool(config, "pvh_quirk_rsdp", + &b_info->u.pvh.quirk_rsdp, 0); } if (blkdev_start) -- 2.13.6 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |