Current-Users archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: EFI boot failing on new machine



It's amazing what a night's sleep can do. I figured it out. It seems
the firmware likely removes write access from text pages - or pages not
otherwise marked. It wasn't actually the AllocatePages that was hanging,
it was the function pointer assignment immediately after the allocation
that (I assume) was generating an exception and causing the hang. Given
it was a simple pointer assignment, I hadn't bothered considering it.

Patch attached - with this, NetBSD boots off the USB stick. I've also
fixed multiboot64 which was broken in a similar way, but is untested.

-- 
Paul Ripke
"Great minds discuss ideas, average minds discuss events, small minds
 discuss people."
-- Disputed: Often attributed to Eleanor Roosevelt. 1948.
diff --git a/sys/arch/i386/stand/efiboot/bootx64/efibootx64.c b/sys/arch/i386/stand/efiboot/bootx64/efibootx64.c
index feb51595eda2..b34505461bc4 100644
--- a/sys/arch/i386/stand/efiboot/bootx64/efibootx64.c
+++ b/sys/arch/i386/stand/efiboot/bootx64/efibootx64.c
@@ -30,14 +30,14 @@
 
 #include <sys/bootblock.h>
 
-void startprog64_start(physaddr_t, physaddr_t, physaddr_t, u_long,
+extern void startprog64_start(physaddr_t, physaddr_t, physaddr_t, u_long,
     void *, physaddr_t);
-extern void (*startprog64)(physaddr_t, physaddr_t, physaddr_t, u_long,
+void (*startprog64)(physaddr_t, physaddr_t, physaddr_t, u_long,
     void *, physaddr_t);
 extern u_int startprog64_size;
 
-void multiboot64_start(physaddr_t, physaddr_t, uint32_t);
-extern void (*multiboot64)(physaddr_t, physaddr_t, uint32_t);
+extern void multiboot64_start(physaddr_t, physaddr_t, uint32_t);
+void (*multiboot64)(physaddr_t, physaddr_t, uint32_t);
 extern u_int multiboot64_size;
 
 void
diff --git a/sys/arch/i386/stand/efiboot/bootx64/multiboot64.S b/sys/arch/i386/stand/efiboot/bootx64/multiboot64.S
index 96757aeccc03..cb040d27b86a 100644
--- a/sys/arch/i386/stand/efiboot/bootx64/multiboot64.S
+++ b/sys/arch/i386/stand/efiboot/bootx64/multiboot64.S
@@ -6,10 +6,6 @@
 #define DATA_SEGMENT    0x10
 
 	.align	16
-	.globl _C_LABEL(multiboot64)
-_C_LABEL(multiboot64):
-	.quad 0
-
 	.globl _C_LABEL(multiboot64_size)
 _C_LABEL(multiboot64_size):
 	.long multiboot64_end - _C_LABEL(multiboot64_start)
diff --git a/sys/arch/i386/stand/efiboot/bootx64/startprog64.S b/sys/arch/i386/stand/efiboot/bootx64/startprog64.S
index 050e3068a243..0c2643a7254d 100644
--- a/sys/arch/i386/stand/efiboot/bootx64/startprog64.S
+++ b/sys/arch/i386/stand/efiboot/bootx64/startprog64.S
@@ -66,10 +66,6 @@ WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 #define	DATA_SEGMENT	0x10
 
 	.align	16
-	.globl _C_LABEL(startprog64)
-_C_LABEL(startprog64):
-	.quad 0
-
 	.globl _C_LABEL(startprog64_size)
 _C_LABEL(startprog64_size):
 	.long startprog64_end - _C_LABEL(startprog64_start)


Home | Main Index | Thread Index | Old Index