From b7d6a7c805565ab550458c863ad1aaa7031de2b0 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Thu, 13 Nov 2014 10:18:57 +0000 Subject: [PATCH] * msp430/Makefile.in (CRT_OBJS): Add crt_high_bss.o. * msp430/crt0.S (high_bss): Add. * msp430/msp430-sim.ld: Add error message if .upper sections are detected. * msp430/msp430xl-sim.ld (MEMORY): Adjust to better mimic real life MCUs. Add support for upper and lower sections. --- libgloss/ChangeLog | 11 +++- libgloss/msp430/Makefile.in | 1 + libgloss/msp430/crt0.S | 18 +++++++ libgloss/msp430/msp430-sim.ld | 59 +++++++++++++-------- libgloss/msp430/msp430xl-sim.ld | 91 +++++++++++++++++++++++---------- 5 files changed, 129 insertions(+), 51 deletions(-) diff --git a/libgloss/ChangeLog b/libgloss/ChangeLog index 739626f5b..0caaa2d73 100644 --- a/libgloss/ChangeLog +++ b/libgloss/ChangeLog @@ -1,6 +1,15 @@ +2014-11-13 Nick Clifton + + * msp430/Makefile.in (CRT_OBJS): Add crt_high_bss.o. + * msp430/crt0.S (high_bss): Add. + * msp430/msp430-sim.ld: Add error message if .upper sections are + detected. + * msp430/msp430xl-sim.ld (MEMORY): Adjust to better mimic real + life MCUs. Add support for upper and lower sections. + 2014-10-22 Tim Harder - * msp430/Makefile.in: respect DESTDIR during install + * msp430/Makefile.in: Respect DESTDIR during install. 2014-09-22 Peter A. Bigot diff --git a/libgloss/msp430/Makefile.in b/libgloss/msp430/Makefile.in index b9f5a6aff..286cd8963 100644 --- a/libgloss/msp430/Makefile.in +++ b/libgloss/msp430/Makefile.in @@ -82,6 +82,7 @@ CIO_OBJS = ciosyscalls.o \ # crt0.s with -DL0 via the default rule below. CRT_OBJS = \ crt_bss.o \ + crt_high_bss.o \ crt_movedata.o \ crt_main.o \ crt_main_minrt.o \ diff --git a/libgloss/msp430/crt0.S b/libgloss/msp430/crt0.S index 9ea25c131..c511959d0 100644 --- a/libgloss/msp430/crt0.S +++ b/libgloss/msp430/crt0.S @@ -54,6 +54,24 @@ __crt0_init_bss: call_ #memset #endif +#ifdef __MSP430X_LARGE__ +#if Lhigh_bss +;; Note - this section is only included in the +;; startup code of the application if it is needed. + + .section ".crt_0150high_bss", "ax", @progbits + + .global __crt0_init_high_bss +__crt0_init_high_bss: + + mov_ #llo(__high_bssstart), R12 + mov_ #lhi(__high_bssstart), R13 + mov.w #llo(__high_bsssize), R14 + mov.w #lhi(__high_bsssize), R15 + call_ #memset +#endif /* Lhigh_bss */ +#endif /* __MSP430X_LARGE__ */ + #if Lmovedata .section ".crt_0200movedata", "ax", @progbits diff --git a/libgloss/msp430/msp430-sim.ld b/libgloss/msp430/msp430-sim.ld index 35a91ea3b..01b3f217c 100644 --- a/libgloss/msp430/msp430-sim.ld +++ b/libgloss/msp430/msp430-sim.ld @@ -1,4 +1,4 @@ -/* Copyright (c) 2005,2008,2009,2011,2013 Red Hat, Inc. All rights reserved. +/* Copyright (c) 2013-2014 Red Hat, Inc. All rights reserved. This copyrighted material is made available to anyone wishing to use, modify, copy, or redistribute it subject to the terms and conditions of the BSD @@ -8,22 +8,18 @@ is available at http://www.opensource.org/licenses. Any Red Hat trademarks that are incorporated in the source code or documentation are not subject to the BSD License and may only be used or replicated with the express permission of - Red Hat, Inc. -*/ + Red Hat, Inc. */ + +/* Default linker script, for normal MSP430 executables. */ -/* Default linker script, for normal executables */ OUTPUT_ARCH(msp430) ENTRY(_start) -/* Do we need any of these for elf? - __DYNAMIC = 0; */ - INCLUDE intr_vectors.ld MEMORY { - RAM (w) : ORIGIN = 0x00200, LENGTH = 0x0ee00 - RESETVEC (w) : ORIGIN = 0x0fffe, LENGTH = 0x00002 + RAM (w) : ORIGIN = 0x00200, LENGTH = 0x0ee00 } SECTIONS @@ -31,11 +27,13 @@ SECTIONS .resetvec : { *(.resetvec) - } > RESETVEC + } > VECT31 - .rodata : { + .rodata : + { . = ALIGN(2); *(.plt) + *(.lower.rodata.* .lower.rodata) *(.rodata .rodata.* .gnu.linkonce.r.* .const .const:*) *(.rodata1) *(.eh_frame_hdr) @@ -76,12 +74,14 @@ SECTIONS KEEP (*(.dtors)) } > RAM - .text : + .text : { . = ALIGN(2); PROVIDE (_start = .); KEEP (*(SORT(.crt_*))) - *(.lowtext .text .stub .text.* .gnu.linkonce.t.* .text:*) + *(.lowtext) + *(.lower.text.* .lower.text) + *(.text .stub .text.* .gnu.linkonce.t.* .text:*) KEEP (*(.text.*personality*)) /* .gnu.warning sections are handled specially by elf32.em. */ *(.gnu.warning) @@ -95,10 +95,12 @@ SECTIONS KEEP (*(.tm_clone_table)) } > RAM - .data : { + .data : + { . = ALIGN(2); PROVIDE (__datastart = .); + *(.lower.data.* .lower.data) KEEP (*(.jcr)) *(.data.rel.ro.local) *(.data.rel.ro*) *(.dynamic) @@ -126,9 +128,11 @@ SECTIONS PROVIDE(__romdatastart = LOADADDR(.data)); PROVIDE (__romdatacopysize = SIZEOF(.data)); - .bss : { + .bss : + { . = ALIGN(2); PROVIDE (__bssstart = .); + *(.lower.bss.* .lower.bss) *(.dynbss) *(.sbss .sbss.*) *(.bss .bss.* .gnu.linkonce.b.*) @@ -137,7 +141,8 @@ SECTIONS PROVIDE (__bsssize = SIZEOF(.bss)); /* This section contains data that is not initialised at startup. */ - .noinit : { + .noinit (NOLOAD) : + { . = ALIGN(2); PROVIDE (__noinit_start = .); *(.noinit) @@ -145,7 +150,7 @@ SECTIONS *(COMMON) PROVIDE (__noinit_end = .); } > RAM - + _end = .; PROVIDE (end = .); @@ -155,6 +160,16 @@ SECTIONS *(.stack) } + /* Make sure that .upper sections are not used without -mlarge support. */ + .upper : + { + *(.upper.rodata.* .upper.rodata) + *(.upper.data.* .upper.data) + *(.upper.bss.* .upper.bss) + *(.upper.text.* .upper.text) + ASSERT (SIZEOF(.upper) == 0, ".upper sections present in a binary linked without -mlarge support"); + } + /* The rest are all not normally part of the runtime image. */ .MP430.attributes 0 : @@ -175,13 +190,13 @@ SECTIONS /* DWARF debug sections. Symbols in the DWARF debugging sections are relative to the beginning of the section so we begin them at 0. */ - /* DWARF 1 */ + /* DWARF 1. */ .debug 0 : { *(.debug) } .line 0 : { *(.line) } - /* GNU DWARF 1 extensions */ + /* GNU DWARF 1 extensions. */ .debug_srcinfo 0 : { *(.debug_srcinfo) } .debug_sfnames 0 : { *(.debug_sfnames) } - /* DWARF 1.1 and DWARF 2 */ + /* DWARF 1.1 and DWARF 2. */ .debug_aranges 0 : { *(.debug_aranges) } .debug_pubnames 0 : { *(.debug_pubnames) } /* DWARF 2 */ @@ -192,12 +207,12 @@ SECTIONS .debug_str 0 : { *(.debug_str) } .debug_loc 0 : { *(.debug_loc) } .debug_macinfo 0 : { *(.debug_macinfo) } - /* SGI/MIPS DWARF 2 extensions */ + /* SGI/MIPS DWARF 2 extensions. */ .debug_weaknames 0 : { *(.debug_weaknames) } .debug_funcnames 0 : { *(.debug_funcnames) } .debug_typenames 0 : { *(.debug_typenames) } .debug_varnames 0 : { *(.debug_varnames) } - /* DWARF 3 */ + /* DWARF 3. */ .debug_pubtypes 0 : { *(.debug_pubtypes) } .debug_ranges 0 : { *(.debug_ranges) } /* DWARF Extension. */ diff --git a/libgloss/msp430/msp430xl-sim.ld b/libgloss/msp430/msp430xl-sim.ld index 3bd146375..31ff85a70 100644 --- a/libgloss/msp430/msp430xl-sim.ld +++ b/libgloss/msp430/msp430xl-sim.ld @@ -1,4 +1,4 @@ -/* Copyright (c) 2013 Red Hat, Inc. All rights reserved. +/* Copyright (c) 2013-2014 Red Hat, Inc. All rights reserved. This copyrighted material is made available to anyone wishing to use, modify, copy, or redistribute it subject to the terms and conditions of the BSD @@ -8,24 +8,20 @@ is available at http://www.opensource.org/licenses. Any Red Hat trademarks that are incorporated in the source code or documentation are not subject to the BSD License and may only be used or replicated with the express permission of - Red Hat, Inc. + Red Hat, Inc. */ -*/ +/* Default linker script, for large MSP430X executables. */ -/* Default linker script, for normal executables */ OUTPUT_ARCH(msp430) ENTRY(_start) -/* Do we need any of these for elf? - __DYNAMIC = 0; */ - INCLUDE intr_vectors.ld -MEMORY { - RAM (rx) : ORIGIN = 0x00200, LENGTH = 0x0ee00 - LOWROM (w) : ORIGIN = 0x0f000, LENGTH = 0x00800 - ROM (w) : ORIGIN = 0x10000, LENGTH = 0x80000 - RESETVEC (w) : ORIGIN = 0x0fffe, LENGTH = 0x00002 +MEMORY +{ + RAM (w) : ORIGIN = 0x00200, LENGTH = 0x01e00 + ROM (rx) : ORIGIN = 0x02000, LENGTH = 0x0df00 + HIFRAM (rxw) : ORIGIN = 0x10000, LENGTH = 0x80000 } SECTIONS @@ -33,13 +29,22 @@ SECTIONS .resetvec : { *(.resetvec) - } > RESETVEC + } > VECT31 - .rodata : { + .upper.rodata : + { + . = ALIGN(2); + *(.upper.rodata.* .upper.rodata) + } > HIFRAM + + .rodata : + { . = ALIGN(2); *(.plt) + *(.lower.rodata.* .lower.rodata) *(.rodata .rodata.* .gnu.linkonce.r.* .const .const:*) *(.rodata1) + *(.eh_frame_hdr) KEEP (*(.eh_frame)) KEEP (*(.gcc_except_table)) *(.gcc_except_table.*) @@ -78,10 +83,19 @@ SECTIONS KEEP (*(.dtors)) } > ROM - .data : { + .upper.data : + { + . = ALIGN(2); + *(.upper.data.* .upper.data) + } > HIFRAM + + .data : + { . = ALIGN(2); PROVIDE (__datastart = .); + *(.lower.data.* .lower.data) + . = ALIGN(2); KEEP (*(.jcr)) *(.data.rel.ro.local) *(.data.rel.ro*) *(.dynamic) @@ -99,19 +113,30 @@ SECTIONS *(.sdata .sdata.* .gnu.linkonce.s.* D_2 D_1) . = ALIGN(2); + _edata = .; PROVIDE (edata = .); PROVIDE (__dataend = .); - } > RAM AT>ROM + } > RAM /* Note that crt0 assumes this is a multiple of two; all the start/stop symbols are also assumed word-aligned. */ PROVIDE(__romdatastart = LOADADDR(.data)); PROVIDE (__romdatacopysize = SIZEOF(.data)); - .bss : { + .upper.bss : + { + . = ALIGN(2); + PROVIDE (__high_bssstart = .); + *(.upper.bss.* .upper.bss) + PROVIDE (__high_bssend = .); + } > HIFRAM + + .bss : + { . = ALIGN(2); PROVIDE (__bssstart = .); + *(.lower.bss.* .lower.bss) *(.dynbss) *(.sbss .sbss.*) *(.bss .bss.* .gnu.linkonce.b.*) @@ -121,7 +146,8 @@ SECTIONS PROVIDE (__bsssize = SIZEOF(.bss)); /* This section contains data that is not initialised at startup. */ - .noinit : { + .noinit (NOLOAD) : + { . = ALIGN(2); PROVIDE (__noinit_start = .); *(.noinit) @@ -133,25 +159,34 @@ SECTIONS _end = .; PROVIDE (end = .); - .stack (ORIGIN (RAM) + LENGTH(RAM)) : + .stack (ORIGIN (HIFRAM) + LENGTH(HIFRAM)) : { PROVIDE (__stack = .); *(.stack) } - /* This is just for crt0.S */ - .lowtext : + /* This is just for crt0.S and interrupt handlers. */ + .lowtext : { PROVIDE (_start = .); . = ALIGN(2); KEEP (*(SORT(.crt_*))) KEEP (*(.lowtext)) - } > LOWROM + } > ROM - .text : + .upper.text : { + . = ALIGN(2); + *(.upper.text.* .upper.text) + } > HIFRAM + + .text : + { + . = ALIGN(2); + *(.lower.text.* .lower.text) . = ALIGN(2); *(.text .stub .text.* .gnu.linkonce.t.* .text:*) + KEEP (*(.text.*personality*)) /* .gnu.warning sections are handled specially by elf32.em. */ *(.gnu.warning) @@ -185,16 +220,16 @@ SECTIONS /* DWARF debug sections. Symbols in the DWARF debugging sections are relative to the beginning of the section so we begin them at 0. */ - /* DWARF 1 */ + /* DWARF 1. */ .debug 0 : { *(.debug) } .line 0 : { *(.line) } - /* GNU DWARF 1 extensions */ + /* GNU DWARF 1 extensions. */ .debug_srcinfo 0 : { *(.debug_srcinfo) } .debug_sfnames 0 : { *(.debug_sfnames) } - /* DWARF 1.1 and DWARF 2 */ + /* DWARF 1.1 and DWARF 2. */ .debug_aranges 0 : { *(.debug_aranges) } .debug_pubnames 0 : { *(.debug_pubnames) } - /* DWARF 2 */ + /* DWARF 2. */ .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } .debug_abbrev 0 : { *(.debug_abbrev) } .debug_line 0 : { *(.debug_line .debug_line.* .debug_line_end ) } @@ -202,7 +237,7 @@ SECTIONS .debug_str 0 : { *(.debug_str) } .debug_loc 0 : { *(.debug_loc) } .debug_macinfo 0 : { *(.debug_macinfo) } - /* SGI/MIPS DWARF 2 extensions */ + /* SGI/MIPS DWARF 2 extensions. */ .debug_weaknames 0 : { *(.debug_weaknames) } .debug_funcnames 0 : { *(.debug_funcnames) } .debug_typenames 0 : { *(.debug_typenames) }