[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <4B02B654.9080304@internode.on.net>
Date: Wed, 18 Nov 2009 01:12:28 +1030
From: indexer <indexer@...ernode.on.net>
To: linux-kernel@...r.kernel.org
Subject: Regression in efi.c 2.6.32-rc7
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 <asm/time.h>
#include <asm/cacheflush.h>
#include <asm/tlbflush.h>
+#include <asm/x86_init.h>
#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;
View attachment ".config" of type "text/plain" (71584 bytes)
Powered by blists - more mailing lists