I would like to report a possible regression in efi.c with kernels 2.6.31 , 2.6.32-rc5 and 2.6.32.rc7. Attempting to boot x86_64 with elilo succeeds using 2.6.30 . Using the same config cannot boot with any of the 3 afore mentioned kernels. Elilo freezes at bootloader as system attempts to initiate. Cannot attach a serial console for debug, and no errors appear on screen. No version of refit, elilo, efi firmware changes, only the kernel in question. This results in an unbootable system using efi. I have already followed the patch described here, http://bugzilla.kernel.org/show_bug.cgi?id=14466 , it does not change the situation on 2.6.31 or 2.6.32-rc5, and no need to patch 2.6.32-rc7 as it was merged already. The below diff shows the differences in efi.c between 2.6.30 and 2.6.32-rc7. Please also find attached my .config for 2.6.32.rc7 --- linux-2.6.30-gentoo-r5/arch/x86/kernel/efi.c 2009-06-10 12:35:27.000000000 +0930 +++ linux-2.6.32-rc7/arch/x86/kernel/efi.c 2009-11-18 01:10:09.000000000 +1030 @@ -42,6 +42,7 @@ #include #include #include +#include #define EFI_DEBUG 1 #define PFX "EFI: " @@ -240,10 +241,35 @@ unsigned long long size = md->num_pages << EFI_PAGE_SHIFT; int e820_type; - if (md->attribute & EFI_MEMORY_WB) - e820_type = E820_RAM; - else + switch (md->type) { + case EFI_LOADER_CODE: + case EFI_LOADER_DATA: + case EFI_BOOT_SERVICES_CODE: + case EFI_BOOT_SERVICES_DATA: + case EFI_CONVENTIONAL_MEMORY: + if (md->attribute & EFI_MEMORY_WB) + e820_type = E820_RAM; + else + e820_type = E820_RESERVED; + break; + case EFI_ACPI_RECLAIM_MEMORY: + e820_type = E820_ACPI; + break; + case EFI_ACPI_MEMORY_NVS: + e820_type = E820_NVS; + break; + case EFI_UNUSABLE_MEMORY: + e820_type = E820_UNUSABLE; + break; + default: + /* + * EFI_RESERVED_TYPE EFI_RUNTIME_SERVICES_CODE + * EFI_RUNTIME_SERVICES_DATA EFI_MEMORY_MAPPED_IO + * EFI_MEMORY_MAPPED_IO_PORT_SPACE EFI_PAL_CODE + */ e820_type = E820_RESERVED; + break; + } e820_add_region(start, size, e820_type); } sanitize_e820_map(e820.map, ARRAY_SIZE(e820.map), &e820.nr_map); @@ -329,7 +355,7 @@ */ c16 = tmp = early_ioremap(efi.systab->fw_vendor, 2); if (c16) { - for (i = 0; i < sizeof(vendor) && *c16; ++i) + for (i = 0; i < sizeof(vendor) - 1 && *c16; ++i) vendor[i] = *c16++; vendor[i] = '\0'; } else @@ -428,6 +454,11 @@ if (add_efi_memmap) do_add_efi_memmap(); +#ifdef CONFIG_X86_32 + x86_platform.get_wallclock = efi_get_time; + x86_platform.set_wallclock = efi_set_rtc_mmss; +#endif + /* Setup for EFI runtime service */ reboot_type = BOOT_EFI; @@ -487,7 +518,7 @@ && end_pfn <= max_pfn_mapped)) va = __va(md->phys_addr); else - va = efi_ioremap(md->phys_addr, size); + va = efi_ioremap(md->phys_addr, size, md->type); md->virt_addr = (u64) (unsigned long) va;