From: Jan Beulich Date: Mon, 26 May 2014 10:25:01 +0000 (+0200) Subject: ACPI/ERST: fix table mapping X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~4953 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=fca69b1fc606ece62430076ca4a157e4bed749a8;p=xen.git ACPI/ERST: fix table mapping acpi_get_table(), when executed before reaching SYS_STATE_active, will return a mapping valid only until the next invocation of that funciton. Consequently storing the returned pointer for later use is incorrect. Copy the logic used in VT-d's DMAR handling. Signed-off-by: Jan Beulich --- diff --git a/xen/drivers/acpi/apei/erst.c b/xen/drivers/acpi/apei/erst.c index 2fafe7fcf7..21593cfa1a 100644 --- a/xen/drivers/acpi/apei/erst.c +++ b/xen/drivers/acpi/apei/erst.c @@ -383,6 +383,8 @@ static int erst_get_erange(struct erst_erange *range) return 0; } +#ifndef NDEBUG /* currently dead code */ + static ssize_t __erst_get_record_count(void) { struct apei_exec_context ctx; @@ -447,6 +449,8 @@ int erst_get_next_record_id(u64 *record_id) return rc; } +#endif /* currently dead code */ + static int __erst_write_to_storage(u64 offset) { struct apei_exec_context ctx; @@ -777,21 +781,27 @@ int __init erst_init(void) { int rc = 0; acpi_status status; + acpi_physical_address erst_addr; + acpi_native_uint erst_len; struct apei_exec_context ctx; if (acpi_disabled) return -ENODEV; - status = acpi_get_table(ACPI_SIG_ERST, 0, - (struct acpi_table_header **)&erst_tab); + status = acpi_get_table_phys(ACPI_SIG_ERST, 0, &erst_addr, &erst_len); if (status == AE_NOT_FOUND) { printk(KERN_INFO "ERST table was not found\n"); return -ENODEV; - } else if (ACPI_FAILURE(status)) { + } + if (ACPI_FAILURE(status)) { const char *msg = acpi_format_exception(status); printk(KERN_WARNING "Failed to get ERST table: %s\n", msg); return -EINVAL; } + map_pages_to_xen((unsigned long)__va(erst_addr), PFN_DOWN(erst_addr), + PFN_UP(erst_addr + erst_len) - PFN_DOWN(erst_addr), + PAGE_HYPERVISOR); + erst_tab = __va(erst_addr); rc = erst_check_table(erst_tab); if (rc) {