From: Ingo Molnar - Teach acpi to not access physical memory instead of virtual. It dies with PAE and the 4g split. - the reason why PAE triggers the bug and !PAE doesnt is the following: there's a small window between pagetable_init() and zap_low_mappings() in which window eg. the ACPI code runs - in this window the low mappings still exist. In the PAE case the low mappings dont exist at all (they are not set up). The patch below makes the code more consistent and zaps the low mappings earlier. --- arch/i386/kernel/acpi/boot.c | 2 +- arch/i386/mm/init.c | 19 +++++++++---------- 2 files changed, 10 insertions(+), 11 deletions(-) diff -puN arch/i386/mm/init.c~4g4g-acpi-low-mappings-fix arch/i386/mm/init.c --- 25/arch/i386/mm/init.c~4g4g-acpi-low-mappings-fix 2004-01-14 11:18:36.000000000 -0800 +++ 25-akpm/arch/i386/mm/init.c 2004-01-14 11:18:36.000000000 -0800 @@ -376,7 +376,15 @@ void __init paging_init(void) set_in_cr4(X86_CR4_PAE); #endif __flush_tlb_all(); - + /* + * Subtle. SMP is doing it's boot stuff late (because it has to + * fork idle threads) - but it also needs low mappings for the + * protected-mode entry to work. We zap these entries only after + * the WP-bit has been tested. + */ +#ifndef CONFIG_SMP + zap_low_mappings(); +#endif kmap_init(); zone_sizes_init(); } @@ -501,15 +509,6 @@ void __init mem_init(void) if (boot_cpu_data.wp_works_ok < 0) test_wp_bit(); - /* - * Subtle. SMP is doing it's boot stuff late (because it has to - * fork idle threads) - but it also needs low mappings for the - * protected-mode entry to work. We zap these entries only after - * the WP-bit has been tested. - */ -#ifndef CONFIG_SMP - zap_low_mappings(); -#endif entry_trampoline_setup(); default_ldt_page = virt_to_page(default_ldt); load_LDT(&init_mm.context); diff -puN arch/i386/kernel/acpi/boot.c~4g4g-acpi-low-mappings-fix arch/i386/kernel/acpi/boot.c --- 25/arch/i386/kernel/acpi/boot.c~4g4g-acpi-low-mappings-fix 2004-01-14 11:18:38.000000000 -0800 +++ 25-akpm/arch/i386/kernel/acpi/boot.c 2004-01-14 11:18:43.000000000 -0800 @@ -334,7 +334,7 @@ acpi_scan_rsdp ( * RSDP signature. */ for (offset = 0; offset < length; offset += 16) { - if (strncmp((char *) (start + offset), "RSD PTR ", sig_len)) + if (strncmp((char *) __va(start + offset), "RSD PTR ", sig_len)) continue; return (start + offset); } _