x86/ACPI: fix mapping of FACS
authorJan Beulich <jbeulich@suse.com>
Tue, 24 Nov 2020 10:26:02 +0000 (11:26 +0100)
committerHans van Kranenburg <hans@knorrie.org>
Sat, 27 Nov 2021 14:14:32 +0000 (15:14 +0100)
acpi_fadt_parse_sleep_info() runs when the system is already in
SYS_STATE_boot. Hence its direct call to __acpi_map_table() won't work
anymore. This call should probably have been replaced long ago already,
as the layering violation hasn't been necessary for quite some time.

Fixes: 1c4aa69ca1e1 ("xen/acpi: Rework acpi_os_map_memory() and acpi_os_unmap_memory()")
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Roger Pau Monné <roger.pau@citrix.com>
(cherry picked from commit 8b6d55c1261820bb9db8d867ce9ee77397d05203)

xen/arch/x86/acpi/boot.c

index 38c2b76e00e1bb55b353d61a6bf6c084b9bae3ae..3ad41053518757fbb918f049f5292c3b549db02c 100644 (file)
@@ -422,8 +422,7 @@ acpi_fadt_parse_sleep_info(const struct acpi_table_fadt *fadt)
        if (!facs_pa)
                goto bad;
 
-       facs = (struct acpi_table_facs *)
-               __acpi_map_table(facs_pa, sizeof(struct acpi_table_facs));
+       facs = acpi_os_map_memory(facs_pa, sizeof(*facs));
        if (!facs)
                goto bad;
 
@@ -448,11 +447,16 @@ acpi_fadt_parse_sleep_info(const struct acpi_table_fadt *fadt)
                offsetof(struct acpi_table_facs, firmware_waking_vector);
        acpi_sinfo.vector_width = 32;
 
+       acpi_os_unmap_memory(facs, sizeof(*facs));
+
        printk(KERN_INFO PREFIX
               "            wakeup_vec[%"PRIx64"], vec_size[%x]\n",
               acpi_sinfo.wakeup_vector, acpi_sinfo.vector_width);
        return;
-bad:
+
+ bad:
+       if (facs)
+               acpi_os_unmap_memory(facs, sizeof(*facs));
        memset(&acpi_sinfo, 0,
               offsetof(struct acpi_sleep_info, sleep_control));
        memset(&acpi_sinfo.sleep_status + 1, 0,