We are using the same trick in previous patch. Introduce a "bool is_phys" to early_alloc_acpi_override_tables_buf(). When it is true, convert all golbal variables va to pa, so that we can access them on 32bit before paging is enabled. NOTE: Do not call printk() on 32bit before paging is enabled because it will use global variables. Signed-off-by: Tang Chen <tangchen@xxxxxxxxxxxxxx> --- arch/x86/kernel/setup.c | 2 +- drivers/acpi/osl.c | 11 ++++++++--- include/linux/acpi.h | 2 +- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index 1290ea7..5729cd2 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c @@ -1071,7 +1071,7 @@ void __init setup_arch(char **cmdline_p) #if defined(CONFIG_ACPI) && defined(CONFIG_BLK_DEV_INITRD) /* Allocate buffer to store acpi override tables in brk. */ - early_alloc_acpi_override_tables_buf(); + early_alloc_acpi_override_tables_buf(false); #endif /* diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c index ccdb5a6..25ba68d 100644 --- a/drivers/acpi/osl.c +++ b/drivers/acpi/osl.c @@ -560,10 +560,15 @@ u8 __init acpi_table_checksum(u8 *buffer, u32 length) /* Reserve 256KB in BRK to store acpi override tables */ #define ACPI_OVERRIDE_TABLES_SIZE (256 * 1024) RESERVE_BRK(acpi_override_tables_alloc, ACPI_OVERRIDE_TABLES_SIZE); -void __init early_alloc_acpi_override_tables_buf(void) +void __init early_alloc_acpi_override_tables_buf(bool is_phys) { - acpi_tables_addr = __pa(extend_brk(ACPI_OVERRIDE_TABLES_SIZE, - PAGE_SIZE, false)); + u64 *acpi_tables_addr_p; + + acpi_tables_addr_p = is_phys ? (u64 *)__pa_nodebug(&acpi_tables_addr) : + (u64 *)&acpi_tables_addr; + + *acpi_tables_addr_p = __pa_nodebug(extend_brk(ACPI_OVERRIDE_TABLES_SIZE, + PAGE_SIZE, is_phys)); } /** diff --git a/include/linux/acpi.h b/include/linux/acpi.h index af4da51..17f2e8e 100644 --- a/include/linux/acpi.h +++ b/include/linux/acpi.h @@ -81,7 +81,7 @@ typedef int (*acpi_tbl_entry_handler)(struct acpi_subtable_header *header, #ifdef CONFIG_ACPI_INITRD_TABLE_OVERRIDE void acpi_initrd_override(void *data, size_t size, bool is_phys); -void early_alloc_acpi_override_tables_buf(void); +void early_alloc_acpi_override_tables_buf(bool is_phys); #else static inline void acpi_initrd_override(void *data, size_t size, bool is_phys) { -- 1.7.1 -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html