[PATCH v4 04/11] libgloss: mips: Boot and startup code improvements inc. linker script fixes
Jovan Dmitrovic <[email protected]>
| Newsgroups | gmane.comp.lib.newlib |
|---|---|
| Message-ID | <[email protected]> |
From: Robert Suchanek <[email protected]> Add .eh_frame_hdr and .gnu_extab to linker scripts for compactEH Fix orphaned .gcc_except_table sections in uhi32.ld. Fix orphaned .gcc_except_table sections in mti32.ld. Signed-off-by: Jovan Dmitrović <[email protected]> --- libgloss/mips/boot/reset.S | 7 ++++++ libgloss/mips/boot/reset_predef.S | 18 ++++++++++++-- libgloss/mips/hal/minicrt.S | 24 ++++++++++++------ libgloss/mips/mti32.ld | 19 ++++++++++++-- libgloss/mips/uhi32.ld | 41 ++++++++++++++++++++++--------- libgloss/mips/uhi64_64.ld | 41 ++++++++++++++++++++++--------- libgloss/mips/uhi64_n32.ld | 41 ++++++++++++++++++++++--------- 7 files changed, 144 insertions(+), 47 deletions(-) diff --git a/libgloss/mips/boot/reset.S b/libgloss/mips/boot/reset.S index 163933b0b..3abae9528 100644 --- a/libgloss/mips/boot/reset.S +++ b/libgloss/mips/boot/reset.S @@ -148,6 +148,13 @@ $Lcopy_to_ram_done: eret $Lall_done: + /* Allow an exit hook to intercept the end of execution */ + .weak __boot_exit_hook + lui a2, %hi(__boot_exit_hook) + addiu a2, a2, %lo(__boot_exit_hook) + beqz a2, 1f + jalr a2 +1: /* * If _start returns it will return to this point. * Just spin here reporting the exit. diff --git a/libgloss/mips/boot/reset_predef.S b/libgloss/mips/boot/reset_predef.S index 592b592b9..b50d9e4f3 100644 --- a/libgloss/mips/boot/reset_predef.S +++ b/libgloss/mips/boot/reset_predef.S @@ -73,6 +73,8 @@ $Lnot_nmi: /* Init CP0 Status, Count, Compare, Watch*, and Cause */ jal __init_cp0 +#if !defined(HCI) + #if (defined(SLINE_ENC) && SLINE_ENC != 0) || (defined(MEM_MAPPED_L2C) && MEM_MAPPED_L2C != 0) /* * Initialise L2/L3 cache @@ -81,10 +83,12 @@ $Lnot_nmi: jal __init_l23cache #endif - #if defined(ILINE_ENC) && ILINE_ENC != 0 /* Initialize the L1 instruction cache */ jal __init_icache +#endif + +#endif /* !defined(HCI) */ /* * The changing of Kernel mode cacheability must be done from KSEG1 @@ -97,7 +101,8 @@ $Lnot_nmi: li a1, 0xf ins a2, a1, 29, 1 /* changed to KSEG1 address by setting bit 29 */ jalr a2 -#endif + +#if !defined(HCI) #if (defined(SLINE_ENC) && SLINE_ENC != 0) || (defined(MEM_MAPPED_L2C) && MEM_MAPPED_L2C != 0) /* Support initialising L2 with L1 cache enabled */ @@ -109,6 +114,8 @@ $Lnot_nmi: jal __init_dcache #endif +#endif /* !defined(HCI) */ + #if defined(HAVE_TLB) && HAVE_TLB /* Initialize the TLB */ jal __init_tlb @@ -168,6 +175,13 @@ $Lcopy_to_ram_done: eret $Lall_done: + /* Allow an exit hook to intercept the end of execution */ + .weak __boot_exit_hook + lui a2, %hi(__boot_exit_hook) + addiu a2, a2, %lo(__boot_exit_hook) + beqz a2, 1f + jalr a2 +1: /* * If _start returns it will return to this point. * Just spin here reporting the exit. diff --git a/libgloss/mips/hal/minicrt.S b/libgloss/mips/hal/minicrt.S index fa4759499..bcf6caf77 100644 --- a/libgloss/mips/hal/minicrt.S +++ b/libgloss/mips/hal/minicrt.S @@ -1,7 +1,13 @@ #include <mips/asm.h> +#include <mips/m32c0.h> #include <mips/regdef.h> LEAF(_start) +#ifdef __mips_dsp + mfc0 t0, C0_STATUS + or t0, t0, SR_MX + mtc0 t0, C0_STATUS +#endif /* Preserve return address */ move s0, ra /* Set up global pointer for small data access */ @@ -9,13 +15,13 @@ LEAF(_start) /* Set up stack pointer */ LA sp, __stack /* Zero the BSS */ - LA v0, _fbss - LA v1, _end - beq v0,v1,2f + LA t0, _fbss + LA t1, _end + beq t0,t1,2f 1: - addiu v0,v0,4 - sw zero,-4(v0) - bne v0,v1,1b + addiu t0,t0,4 + sw zero,-4(t0) + bne t0,t1,1b 2: /* Set arguments to be null for main */ li a0, 0 @@ -24,8 +30,12 @@ LEAF(_start) addiu sp, sp, -(NARGSAVE * SZARG) /* Jump to C code */ jal main - + /* Call the exit handler */ + move a0, va0 + jal __exit /* Return to boot */ move ra, s0 + .weak __exit +AENT(__exit) jr ra END(_start) diff --git a/libgloss/mips/mti32.ld b/libgloss/mips/mti32.ld index 9e2b18fb5..f54fdac7f 100644 --- a/libgloss/mips/mti32.ld +++ b/libgloss/mips/mti32.ld @@ -55,15 +55,30 @@ SECTIONS PROVIDE (etext = .); _etext = .; - .eh_frame_hdr : { *(.eh_frame_hdr) } + .eh_frame_hdr : { *(.eh_frame_hdr) *(.eh_frame_entry .eh_frame_entry.*) } .eh_frame : { /* The .eh_frame section from the crtend file contains the end of eh_frame marker and it must be last. */ KEEP (*(EXCLUDE_FILE (*crtend.o) .eh_frame)) KEEP (*(.eh_frame)) } - .gcc_except_table : { *(.gcc_except_table) } + .gcc_except_table : { *(.gcc_except_table .gcc_except_table.*) } + .gnu_extab : { *(.gnu_extab .gnu_extab.*) } .jcr : { KEEP (*(.jcr)) } + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array)) + PROVIDE_HIDDEN (__init_array_end = .); + } + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array)) + PROVIDE_HIDDEN (__fini_array_end = .); + } .ctors : { /* gcc uses crtbegin.o to find the start of diff --git a/libgloss/mips/uhi32.ld b/libgloss/mips/uhi32.ld index d9df8e5e0..96f697add 100644 --- a/libgloss/mips/uhi32.ld +++ b/libgloss/mips/uhi32.ld @@ -125,10 +125,12 @@ SECTIONS . = ALIGN(8); } = 0 - PROVIDE (__flash_app_start = SIZEOF(.bootrom) + __flash_start); + PROVIDE (__flash_app_start = DEFINED(__xip) + ? ALIGN(__flash_start + SIZEOF(.bootrom), 0x1000) + : __flash_start + SIZEOF(.bootrom)); __aligned_app_start = DEFINED(__xip) - ? __bev_override + SIZEOF(.bootrom) + ? ALIGN(__bev_override + SIZEOF(.bootrom), 0x1000) : ALIGN(__app_start, 0x1000); PROVIDE (__ebase_size = 0x200); @@ -155,7 +157,7 @@ SECTIONS . = ALIGN(8); } = 0 - .text . : AT (LOADADDR (.exception_vector) + SIZEOF(.exception_vector)) { + .text : { _ftext = . ; PROVIDE (eprol = .); *(.text) @@ -164,13 +166,13 @@ SECTIONS *(.mips16.fn.*) *(.mips16.call.*) } - .init . : AT (LOADADDR (.text) + SIZEOF(.text)) { + .init : { KEEP (*(.init)) } - .fini . : AT (LOADADDR (.init) + SIZEOF(.init)) { + .fini : { KEEP (*(.fini)) } - .rel.sdata . : AT (LOADADDR (.fini) + SIZEOF(.fini)) { + .rel.sdata : { PROVIDE (__runtime_reloc_start = .); *(.rel.sdata) PROVIDE (__runtime_reloc_stop = .); @@ -178,11 +180,26 @@ SECTIONS PROVIDE (etext = .); _etext = .; - .eh_frame_hdr . : AT (LOADADDR (.rel.sdata) + SIZEOF(.rel.sdata)) { *(.eh_frame_hdr) } - .eh_frame . : AT (LOADADDR (.eh_frame_hdr) + SIZEOF(.eh_frame_hdr)) { KEEP (*(.eh_frame)) } - .gcc_except_table . : AT (LOADADDR (.eh_frame) + SIZEOF(.eh_frame)) { *(.gcc_except_table) } - .jcr . : AT (LOADADDR (.gcc_except_table) + SIZEOF(.gcc_except_table)) { KEEP (*(.jcr)) } - .ctors . : AT (LOADADDR (.jcr) + SIZEOF(.jcr)) + .eh_frame_hdr : { *(.eh_frame_hdr) *(.eh_frame_entry .eh_frame_entry.*) } + .eh_frame : { KEEP (*(.eh_frame)) } + .gcc_except_table : { *(.gcc_except_table .gcc_except_table.*) } + .gnu_extab : { *(.gnu_extab .gnu_extab.*) } + .jcr : { KEEP (*(.jcr)) } + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array)) + PROVIDE_HIDDEN (__init_array_end = .); + } + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array)) + PROVIDE_HIDDEN (__fini_array_end = .); + } + .ctors : { /* gcc uses crtbegin.o to find the start of the constructors, so we make sure it is @@ -206,7 +223,7 @@ SECTIONS KEEP (*(.ctors)) } - .dtors . : AT (LOADADDR (.ctors) + SIZEOF(.ctors)) + .dtors : { KEEP (*crtbegin.o(.dtors)) KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors)) diff --git a/libgloss/mips/uhi64_64.ld b/libgloss/mips/uhi64_64.ld index 15aeb2ecc..1aece1bf2 100644 --- a/libgloss/mips/uhi64_64.ld +++ b/libgloss/mips/uhi64_64.ld @@ -125,10 +125,12 @@ SECTIONS . = ALIGN(8); } = 0 - PROVIDE (__flash_app_start = SIZEOF(.bootrom) + __flash_start); + PROVIDE (__flash_app_start = DEFINED(__xip) + ? ALIGN(__flash_start + SIZEOF(.bootrom), 0x1000) + : __flash_start + SIZEOF(.bootrom)); __aligned_app_start = DEFINED(__xip) - ? __bev_override + SIZEOF(.bootrom) + ? ALIGN(__bev_override + SIZEOF(.bootrom), 0x1000) : ALIGN(__app_start, 0x1000); PROVIDE (__ebase_size = 0x200); @@ -155,7 +157,7 @@ SECTIONS . = ALIGN(8); } = 0 - .text . : AT (LOADADDR (.exception_vector) + SIZEOF(.exception_vector)) { + .text : { _ftext = . ; PROVIDE (eprol = .); *(.text) @@ -164,13 +166,13 @@ SECTIONS *(.mips16.fn.*) *(.mips16.call.*) } - .init . : AT (LOADADDR (.text) + SIZEOF(.text)) { + .init : { KEEP (*(.init)) } - .fini . : AT (LOADADDR (.init) + SIZEOF(.init)) { + .fini : { KEEP (*(.fini)) } - .rel.sdata . : AT (LOADADDR (.fini) + SIZEOF(.fini)) { + .rel.sdata : { PROVIDE (__runtime_reloc_start = .); *(.rel.sdata) PROVIDE (__runtime_reloc_stop = .); @@ -178,11 +180,26 @@ SECTIONS PROVIDE (etext = .); _etext = .; - .eh_frame_hdr . : AT (LOADADDR (.rel.sdata) + SIZEOF(.rel.sdata)) { *(.eh_frame_hdr) } - .eh_frame . : AT (LOADADDR (.eh_frame_hdr) + SIZEOF(.eh_frame_hdr)) { KEEP (*(.eh_frame)) } - .gcc_except_table . : AT (LOADADDR (.eh_frame) + SIZEOF(.eh_frame)) { *(.gcc_except_table) } - .jcr . : AT (LOADADDR (.gcc_except_table) + SIZEOF(.gcc_except_table)) { KEEP (*(.jcr)) } - .ctors . : AT (LOADADDR (.jcr) + SIZEOF(.jcr)) + .eh_frame_hdr : { *(.eh_frame_hdr) *(.eh_frame_entry .eh_frame_entry.*) } + .eh_frame : { KEEP (*(.eh_frame)) } + .gcc_except_table : { *(.gcc_except_table .gcc_except_table.*) } + .gnu_extab : { *(.gnu_extab .gnu_extab.*) } + .jcr : { KEEP (*(.jcr)) } + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array)) + PROVIDE_HIDDEN (__init_array_end = .); + } + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array)) + PROVIDE_HIDDEN (__fini_array_end = .); + } + .ctors : { /* gcc uses crtbegin.o to find the start of the constructors, so we make sure it is @@ -206,7 +223,7 @@ SECTIONS KEEP (*(.ctors)) } - .dtors . : AT (LOADADDR (.ctors) + SIZEOF(.ctors)) + .dtors : { KEEP (*crtbegin.o(.dtors)) KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors)) diff --git a/libgloss/mips/uhi64_n32.ld b/libgloss/mips/uhi64_n32.ld index d68f2eaaa..2ca0b4c11 100644 --- a/libgloss/mips/uhi64_n32.ld +++ b/libgloss/mips/uhi64_n32.ld @@ -125,10 +125,12 @@ SECTIONS . = ALIGN(8); } = 0 - PROVIDE (__flash_app_start = SIZEOF(.bootrom) + __flash_start); + PROVIDE (__flash_app_start = DEFINED(__xip) + ? ALIGN(__flash_start + SIZEOF(.bootrom), 0x1000) + : __flash_start + SIZEOF(.bootrom)); __aligned_app_start = DEFINED(__xip) - ? __bev_override + SIZEOF(.bootrom) + ? ALIGN(__bev_override + SIZEOF(.bootrom), 0x1000) : ALIGN(__app_start, 0x1000); PROVIDE (__ebase_size = 0x200); @@ -155,7 +157,7 @@ SECTIONS . = ALIGN(8); } = 0 - .text . : AT (LOADADDR (.exception_vector) + SIZEOF(.exception_vector)) { + .text : { _ftext = . ; PROVIDE (eprol = .); *(.text) @@ -164,13 +166,13 @@ SECTIONS *(.mips16.fn.*) *(.mips16.call.*) } - .init . : AT (LOADADDR (.text) + SIZEOF(.text)) { + .init : { KEEP (*(.init)) } - .fini . : AT (LOADADDR (.init) + SIZEOF(.init)) { + .fini : { KEEP (*(.fini)) } - .rel.sdata . : AT (LOADADDR (.fini) + SIZEOF(.fini)) { + .rel.sdata : { PROVIDE (__runtime_reloc_start = .); *(.rel.sdata) PROVIDE (__runtime_reloc_stop = .); @@ -178,11 +180,26 @@ SECTIONS PROVIDE (etext = .); _etext = .; - .eh_frame_hdr . : AT (LOADADDR (.rel.sdata) + SIZEOF(.rel.sdata)) { *(.eh_frame_hdr) } - .eh_frame . : AT (LOADADDR (.eh_frame_hdr) + SIZEOF(.eh_frame_hdr)) { KEEP (*(.eh_frame)) } - .gcc_except_table . : AT (LOADADDR (.eh_frame) + SIZEOF(.eh_frame)) { *(.gcc_except_table) } - .jcr . : AT (LOADADDR (.gcc_except_table) + SIZEOF(.gcc_except_table)) { KEEP (*(.jcr)) } - .ctors . : AT (LOADADDR (.jcr) + SIZEOF(.jcr)) + .eh_frame_hdr : { *(.eh_frame_hdr) *(.eh_frame_entry .eh_frame_entry.*) } + .eh_frame : { KEEP (*(.eh_frame)) } + .gcc_except_table : { *(.gcc_except_table .gcc_except_table.*) } + .gnu_extab : { *(.gnu_extab .gnu_extab.*) } + .jcr : { KEEP (*(.jcr)) } + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array)) + PROVIDE_HIDDEN (__init_array_end = .); + } + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array)) + PROVIDE_HIDDEN (__fini_array_end = .); + } + .ctors : { /* gcc uses crtbegin.o to find the start of the constructors, so we make sure it is @@ -206,7 +223,7 @@ SECTIONS KEEP (*(.ctors)) } - .dtors . : AT (LOADADDR (.ctors) + SIZEOF(.ctors)) + .dtors : { KEEP (*crtbegin.o(.dtors)) KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors)) -- 2.34.1