diff -r b6195e277da5 xen/drivers/acpi/osl.c --- a/xen/drivers/acpi/osl.c Wed Jan 16 14:15:44 2013 +0000 +++ b/xen/drivers/acpi/osl.c Tue Jan 22 11:07:49 2013 +0000 @@ -83,13 +83,13 @@ } } -void __iomem *__init +void __iomem * acpi_os_map_memory(acpi_physical_address phys, acpi_size size) { return __acpi_map_table((unsigned long)phys, size); } -void __init acpi_os_unmap_memory(void __iomem * virt, acpi_size size) +void acpi_os_unmap_memory(void __iomem * virt, acpi_size size) { } diff -r b6195e277da5 xen/drivers/acpi/tables/Makefile --- a/xen/drivers/acpi/tables/Makefile Wed Jan 16 14:15:44 2013 +0000 +++ b/xen/drivers/acpi/tables/Makefile Tue Jan 22 11:07:49 2013 +0000 @@ -1,5 +1,5 @@ obj-bin-y += tbfadt.init.o -obj-bin-y += tbinstal.init.o +obj-y += tbinstal.o obj-y += tbutils.o -obj-bin-y += tbxface.init.o +obj-y += tbxface.o obj-bin-y += tbxfroot.init.o diff -r b6195e277da5 xen/drivers/acpi/tables/tbinstal.c --- a/xen/drivers/acpi/tables/tbinstal.c Wed Jan 16 14:15:44 2013 +0000 +++ b/xen/drivers/acpi/tables/tbinstal.c Tue Jan 22 11:07:49 2013 +0000 @@ -59,7 +59,7 @@ * DESCRIPTION: this function is called to verify and map table * *****************************************************************************/ -acpi_status __init acpi_tb_verify_table(struct acpi_table_desc *table_desc) +acpi_status acpi_tb_verify_table(struct acpi_table_desc *table_desc) { acpi_status status = AE_OK; diff -r b6195e277da5 xen/drivers/acpi/tables/tbutils.c --- a/xen/drivers/acpi/tables/tbutils.c Wed Jan 16 14:15:44 2013 +0000 +++ b/xen/drivers/acpi/tables/tbutils.c Tue Jan 22 11:07:49 2013 +0000 @@ -175,7 +175,7 @@ * ******************************************************************************/ -acpi_status __init +acpi_status acpi_tb_verify_checksum(struct acpi_table_header *table, u32 length) { u8 checksum; diff -r b6195e277da5 xen/drivers/acpi/tables/tbxface.c --- a/xen/drivers/acpi/tables/tbxface.c Wed Jan 16 14:15:44 2013 +0000 +++ b/xen/drivers/acpi/tables/tbxface.c Tue Jan 22 11:07:49 2013 +0000 @@ -164,7 +164,7 @@ * DESCRIPTION: Finds and verifies an ACPI table. * *****************************************************************************/ -acpi_status __init +acpi_status acpi_get_table(char *signature, acpi_native_uint instance, struct acpi_table_header **out_table) { diff -r b6195e277da5 xen/drivers/passthrough/vtd/dmar.c --- a/xen/drivers/passthrough/vtd/dmar.c Wed Jan 16 14:15:44 2013 +0000 +++ b/xen/drivers/passthrough/vtd/dmar.c Tue Jan 22 11:07:49 2013 +0000 @@ -46,7 +46,6 @@ static LIST_HEAD_READ_MOSTLY(acpi_atsr_units); static LIST_HEAD_READ_MOSTLY(acpi_rhsa_units); -static struct acpi_table_header *__read_mostly dmar_table; static int __read_mostly dmar_flags; static u64 __read_mostly igd_drhd_address; @@ -821,14 +820,27 @@ /* SINIT saved in SinitMleData in TXT heap (which is DMA protected) */ #define parse_dmar_table(h) tboot_parse_dmar_table(h) +static struct acpi_table_header *get_dmar(void) +{ + struct acpi_table_header *dmar_table = NULL; + unsigned long flags; + + /* Disabling IRQs avoids cross-CPU TLB flush in map_pages_to_xen(). */ + local_irq_save(flags); + acpi_get_table(ACPI_SIG_DMAR, 0, &dmar_table); + local_irq_restore(flags); + + return dmar_table; +} + int __init acpi_dmar_init(void) { - acpi_get_table(ACPI_SIG_DMAR, 0, &dmar_table); return parse_dmar_table(acpi_parse_dmar); } void acpi_dmar_reinstate(void) { + struct acpi_table_header *dmar_table = get_dmar(); /* needs to be dynamically fetched here as acpi_get_table reuses the returned virtual address */ if ( dmar_table == NULL ) return; dmar_table->signature[0] = 'D'; @@ -837,6 +849,7 @@ void acpi_dmar_zap(void) { + struct acpi_table_header *dmar_table = get_dmar(); if ( dmar_table == NULL ) return; dmar_table->signature[0] = 'X';