# HG changeset patch # User Taylor R Campbell # Date 1779372352 0 # Thu May 21 14:05:52 2026 +0000 # Branch trunk # Node ID f8101fbaaf4762b5fe8ffbf927e9c3d93b81450d # Parent a538b6bc17860f7c185b3ff93d7882d622ea6a2e # EXP-Topic riastradh-pr59151-x86efiboottextwrite x86/efiboot: Put writable variables in .data, not .text. And define them in the .c file where they're used; no need to have extra unnecessary .S stuff just to define a global variable. Based on patch by Paul Ripke to bootx64.efi, adapted for bootia32.efi too. PR kern/59151: efiboot hangs on new motherboard diff -r a538b6bc1786 -r f8101fbaaf47 sys/arch/i386/stand/efiboot/bootia32/efibootia32.c --- a/sys/arch/i386/stand/efiboot/bootia32/efibootia32.c Tue May 19 18:59:16 2026 +0000 +++ b/sys/arch/i386/stand/efiboot/bootia32/efibootia32.c Thu May 21 14:05:52 2026 +0000 @@ -32,12 +32,12 @@ void startprog32_start(physaddr_t, uint32_t, uint32_t *, physaddr_t, physaddr_t, physaddr_t, u_long, void *); -extern void (*startprog32)(physaddr_t, uint32_t, uint32_t *, physaddr_t, +void (*startprog32)(physaddr_t, uint32_t, uint32_t *, physaddr_t, physaddr_t, physaddr_t, u_long, void *); extern u_int startprog32_size; void multiboot32_start(physaddr_t, physaddr_t, uint32_t); -extern void (*multiboot32)(physaddr_t, physaddr_t, uint32_t); +void (*multiboot32)(physaddr_t, physaddr_t, uint32_t); extern u_int multiboot32_size; void diff -r a538b6bc1786 -r f8101fbaaf47 sys/arch/i386/stand/efiboot/bootia32/multiboot32.S --- a/sys/arch/i386/stand/efiboot/bootia32/multiboot32.S Tue May 19 18:59:16 2026 +0000 +++ b/sys/arch/i386/stand/efiboot/bootia32/multiboot32.S Thu May 21 14:05:52 2026 +0000 @@ -4,10 +4,6 @@ #include .align 16 - .globl _C_LABEL(multiboot32) -_C_LABEL(multiboot32): - .quad 0 - .globl _C_LABEL(multiboot32_size) _C_LABEL(multiboot32_size): .long multiboot32_end - _C_LABEL(multiboot32_start) diff -r a538b6bc1786 -r f8101fbaaf47 sys/arch/i386/stand/efiboot/bootia32/startprog32.S --- a/sys/arch/i386/stand/efiboot/bootia32/startprog32.S Tue May 19 18:59:16 2026 +0000 +++ b/sys/arch/i386/stand/efiboot/bootia32/startprog32.S Thu May 21 14:05:52 2026 +0000 @@ -59,10 +59,6 @@ #define DATA_SEGMENT 0x10 .align 16 - .globl _C_LABEL(startprog32) -_C_LABEL(startprog32): - .quad 0 - .globl _C_LABEL(startprog32_size) _C_LABEL(startprog32_size): .long startprog32_end - _C_LABEL(startprog32_start) diff -r a538b6bc1786 -r f8101fbaaf47 sys/arch/i386/stand/efiboot/bootx64/efibootx64.c --- a/sys/arch/i386/stand/efiboot/bootx64/efibootx64.c Tue May 19 18:59:16 2026 +0000 +++ b/sys/arch/i386/stand/efiboot/bootx64/efibootx64.c Thu May 21 14:05:52 2026 +0000 @@ -32,12 +32,12 @@ 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); +void (*multiboot64)(physaddr_t, physaddr_t, uint32_t); extern u_int multiboot64_size; void diff -r a538b6bc1786 -r f8101fbaaf47 sys/arch/i386/stand/efiboot/bootx64/multiboot64.S --- a/sys/arch/i386/stand/efiboot/bootx64/multiboot64.S Tue May 19 18:59:16 2026 +0000 +++ b/sys/arch/i386/stand/efiboot/bootx64/multiboot64.S Thu May 21 14:05:52 2026 +0000 @@ -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 -r a538b6bc1786 -r f8101fbaaf47 sys/arch/i386/stand/efiboot/bootx64/startprog64.S --- a/sys/arch/i386/stand/efiboot/bootx64/startprog64.S Tue May 19 18:59:16 2026 +0000 +++ b/sys/arch/i386/stand/efiboot/bootx64/startprog64.S Thu May 21 14:05:52 2026 +0000 @@ -66,10 +66,6 @@ WITH THE USE OR PERFORMANCE OF THIS SOFT #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)