diff --git a/tools/firmware/hvmloader/e820.c b/tools/firmware/hvmloader/e820.c index c490a0bc79..86d39544e8 100644 --- a/tools/firmware/hvmloader/e820.c +++ b/tools/firmware/hvmloader/e820.c @@ -210,6 +210,10 @@ int build_e820_table(struct e820entry *e820, * space reuse by an ACPI unaware / buggy bootloader, option ROM, etc. * before an ACPI OS takes control. This is possible due to the fact that * ACPI NVS memory is explicitly described as non-reclaimable in ACPI spec. + * + * Furthermore, Xen relies on accessing ACPI tables from within the AML + * code exposed to guests. So Xen's ACPI tables are not, in general, + * reclaimable. */ if ( acpi_enabled ) diff --git a/tools/libs/light/libxl_x86.c b/tools/libs/light/libxl_x86.c index 0a7f64ad46..0b1c2d3a96 100644 --- a/tools/libs/light/libxl_x86.c +++ b/tools/libs/light/libxl_x86.c @@ -737,12 +737,22 @@ static int domain_construct_memmap(libxl__gc *gc, nr++; } + /* + * Mark populated reserved memory that contains ACPI tables as ACPI NVS. + * That should help the guest to treat it correctly later: e.g. pass to + * the next kernel on kexec. + * + * Furthermore, Xen relies on accessing ACPI tables from within the AML + * code exposed to guests. So Xen's ACPI tables are not, in general, + * reclaimable. + */ + for (i = 0; i < MAX_ACPI_MODULES; i++) { if (dom->acpi_modules[i].length) { e820[nr].addr = dom->acpi_modules[i].guest_addr_out & ~(page_size - 1); e820[nr].size = dom->acpi_modules[i].length + (dom->acpi_modules[i].guest_addr_out & (page_size - 1)); - e820[nr].type = E820_ACPI; + e820[nr].type = E820_NVS; nr++; } }