diff options
-rw-r--r-- | xen/arch/x86/acpi/lib.c | 2 | ||||
-rw-r--r-- | xen/drivers/acpi/osl.c | 23 | ||||
-rw-r--r-- | xen/include/xen/acpi.h | 2 |
3 files changed, 15 insertions, 12 deletions
diff --git a/xen/arch/x86/acpi/lib.c b/xen/arch/x86/acpi/lib.c index e8e69d1cb4..1f98c316c3 100644 --- a/xen/arch/x86/acpi/lib.c +++ b/xen/arch/x86/acpi/lib.c @@ -39,7 +39,7 @@ u32 __read_mostly x86_acpiid_to_apicid[MAX_MADT_ENTRIES] = * from the fixed base. That's why we start at FIX_ACPI_END and * count idx down while incrementing the phys address. */ -char *__acpi_map_table(unsigned long phys, unsigned long size) +char *__acpi_map_table(paddr_t phys, unsigned long size) { unsigned long base, offset, mapped_size; int idx; diff --git a/xen/drivers/acpi/osl.c b/xen/drivers/acpi/osl.c index 1b60be621c..4cba3c06cb 100644 --- a/xen/drivers/acpi/osl.c +++ b/xen/drivers/acpi/osl.c @@ -83,14 +83,20 @@ acpi_physical_address __init acpi_os_get_root_pointer(void) } } -void __iomem *__init +static DEFINE_SPINLOCK(map_lock); + +void __iomem * acpi_os_map_memory(acpi_physical_address phys, acpi_size size) { - return __acpi_map_table((unsigned long)phys, size); + if (system_state >= SYS_STATE_active) + spin_lock(&map_lock); + return __acpi_map_table(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) { + if (system_state >= SYS_STATE_active) + spin_unlock(&map_lock); } acpi_status acpi_os_read_port(acpi_io_address port, u32 * value, u32 width) @@ -133,9 +139,8 @@ acpi_status acpi_os_read_memory(acpi_physical_address phys_addr, u32 * value, u32 width) { u32 dummy; - void __iomem *virt_addr; + void __iomem *virt_addr = acpi_os_map_memory(phys_addr, width >> 3); - virt_addr = map_domain_page(phys_addr>>PAGE_SHIFT); if (!value) value = &dummy; @@ -153,7 +158,7 @@ acpi_os_read_memory(acpi_physical_address phys_addr, u32 * value, u32 width) BUG(); } - unmap_domain_page(virt_addr); + acpi_os_unmap_memory(virt_addr, width >> 3); return AE_OK; } @@ -161,9 +166,7 @@ acpi_os_read_memory(acpi_physical_address phys_addr, u32 * value, u32 width) acpi_status acpi_os_write_memory(acpi_physical_address phys_addr, u32 value, u32 width) { - void __iomem *virt_addr; - - virt_addr = map_domain_page(phys_addr>>PAGE_SHIFT); + void __iomem *virt_addr = acpi_os_map_memory(phys_addr, width >> 3); switch (width) { case 8: @@ -179,7 +182,7 @@ acpi_os_write_memory(acpi_physical_address phys_addr, u32 value, u32 width) BUG(); } - unmap_domain_page(virt_addr); + acpi_os_unmap_memory(virt_addr, width >> 3); return AE_OK; } diff --git a/xen/include/xen/acpi.h b/xen/include/xen/acpi.h index 8f3cdca314..aedec65a28 100644 --- a/xen/include/xen/acpi.h +++ b/xen/include/xen/acpi.h @@ -56,7 +56,7 @@ typedef int (*acpi_table_handler) (struct acpi_table_header *table); typedef int (*acpi_table_entry_handler) (struct acpi_subtable_header *header, const unsigned long end); unsigned int acpi_get_processor_id (unsigned int cpu); -char * __acpi_map_table (unsigned long phys_addr, unsigned long size); +char * __acpi_map_table (paddr_t phys_addr, unsigned long size); int acpi_boot_init (void); int acpi_boot_table_init (void); int acpi_numa_init (void); |