ACPI: move tables.c fully into .init.*
authorJan Beulich <jbeulich@suse.com>
Thu, 20 Sep 2012 07:22:55 +0000 (09:22 +0200)
committerJan Beulich <jbeulich@suse.com>
Thu, 20 Sep 2012 07:22:55 +0000 (09:22 +0200)
The only non-init item was the space reserved for the initial tables,
but we can as well dynamically allocate that array.

Signed-off-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Keir Fraser <keir@xen.org>
xen/drivers/acpi/Makefile
xen/drivers/acpi/osl.c
xen/drivers/acpi/tables.c
xen/include/acpi/platform/aclinux.h

index abc66f8a07721a0cd4ef6ac36d5116e05f5053fc..bbb06a74684890df2d12d60cb138c417051b3625 100644 (file)
@@ -2,7 +2,7 @@ subdir-y += tables
 subdir-y += utilities
 subdir-$(x86) += apei
 
-obj-y += tables.o
+obj-bin-y += tables.init.o
 obj-y += numa.o
 obj-y += osl.o
 obj-y += pmstat.o
index dd96a1a20e5deda8c4f6b5f2a0c50f5a47f9a213..1b60be621cced25a794e27fa9d15a39f3df3703e 100644 (file)
@@ -27,6 +27,7 @@
 #include <asm/io.h>
 #include <xen/config.h>
 #include <xen/init.h>
+#include <xen/pfn.h>
 #include <xen/types.h>
 #include <xen/errno.h>
 #include <xen/acpi.h>
@@ -182,3 +183,38 @@ acpi_os_write_memory(acpi_physical_address phys_addr, u32 value, u32 width)
 
        return AE_OK;
 }
+
+#define is_xmalloc_memory(ptr) ((unsigned long)(ptr) & (PAGE_SIZE - 1))
+
+void *__init acpi_os_alloc_memory(size_t sz)
+{
+       void *ptr;
+
+       if (system_state == SYS_STATE_early_boot)
+               return mfn_to_virt(alloc_boot_pages(PFN_UP(sz), 1));
+
+       ptr = xmalloc_bytes(sz);
+       ASSERT(!ptr || is_xmalloc_memory(ptr));
+       return ptr;
+}
+
+void *__init acpi_os_zalloc_memory(size_t sz)
+{
+       void *ptr;
+
+       if (system_state != SYS_STATE_early_boot) {
+               ptr = xzalloc_bytes(sz);
+               ASSERT(!ptr || is_xmalloc_memory(ptr));
+               return ptr;
+       }
+       ptr = acpi_os_alloc_memory(sz);
+       return ptr ? memset(ptr, 0, sz) : NULL;
+}
+
+void __init acpi_os_free_memory(void *ptr)
+{
+       if (is_xmalloc_memory(ptr))
+               xfree(ptr);
+       else if (ptr && system_state == SYS_STATE_early_boot)
+               init_boot_pages(__pa(ptr), __pa(ptr) + PAGE_SIZE);
+}
index d1136a8f80834d2f378b35fc3d5197d9e9dd3d1a..a0e9c163a814eb8a3c86c7fbc6712a3bd1c9a54a 100644 (file)
@@ -41,8 +41,6 @@ mps_inti_flags_polarity[] = { "dfl", "high", "res", "low" };
 static const char *__initdata
 mps_inti_flags_trigger[] = { "dfl", "edge", "res", "level" };
 
-static struct acpi_table_desc initial_tables[ACPI_MAX_TABLES];
-
 static int acpi_apic_instance __initdata;
 
 void __init acpi_table_print_madt_entry(struct acpi_subtable_header *header)
@@ -324,7 +322,7 @@ static void __init check_multiple_madt(void)
 
 int __init acpi_table_init(void)
 {
-       acpi_initialize_tables(initial_tables, ACPI_MAX_TABLES, 0);
+       acpi_initialize_tables(NULL, ACPI_MAX_TABLES, 0);
        check_multiple_madt();
        return 0;
 }
index daa2d7e9858dfb214128ee5e05eda60aabdf60f5..239ced235219c3a3c6f854a973753c88af7b3d1b 100644 (file)
 
 #define acpi_thread_id struct vcpu *
 
-#define ACPI_ALLOCATE(a)       xmalloc_bytes(a)
-#define ACPI_ALLOCATE_ZEROED(a)        xzalloc_bytes(a)
-#define ACPI_FREE(a)           xfree(a)
+void *acpi_os_alloc_memory(size_t);
+void *acpi_os_zalloc_memory(size_t);
+void acpi_os_free_memory(void *);
+
+#define ACPI_ALLOCATE(a)       acpi_os_alloc_memory(a)
+#define ACPI_ALLOCATE_ZEROED(a)        acpi_os_zalloc_memory(a)
+#define ACPI_FREE(a)           acpi_os_free_memory(a)
 
 #endif                         /* __ACLINUX_H__ */