diff options
Diffstat (limited to 'xen/drivers/acpi/osl.c')
-rw-r--r-- | xen/drivers/acpi/osl.c | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/xen/drivers/acpi/osl.c b/xen/drivers/acpi/osl.c index dd96a1a20e..8761747e50 100644 --- a/xen/drivers/acpi/osl.c +++ b/xen/drivers/acpi/osl.c @@ -82,14 +82,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) @@ -132,9 +138,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; @@ -152,7 +157,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; } @@ -160,9 +165,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: @@ -178,7 +181,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; } |