* 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.
This commit is contained in:
Nick Clifton 2014-11-13 10:18:57 +00:00
parent 58d35b961e
commit b7d6a7c805
5 changed files with 129 additions and 51 deletions

View File

@ -1,6 +1,15 @@
2014-11-13 Nick Clifton <nickc@redhat.com>
* 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 <radhermit@gmail.com> 2014-10-22 Tim Harder <radhermit@gmail.com>
* msp430/Makefile.in: respect DESTDIR during install * msp430/Makefile.in: Respect DESTDIR during install.
2014-09-22 Peter A. Bigot <pab@pabigot.com> 2014-09-22 Peter A. Bigot <pab@pabigot.com>

View File

@ -82,6 +82,7 @@ CIO_OBJS = ciosyscalls.o \
# crt0.s with -DL0 via the default rule below. # crt0.s with -DL0 via the default rule below.
CRT_OBJS = \ CRT_OBJS = \
crt_bss.o \ crt_bss.o \
crt_high_bss.o \
crt_movedata.o \ crt_movedata.o \
crt_main.o \ crt_main.o \
crt_main_minrt.o \ crt_main_minrt.o \

View File

@ -54,6 +54,24 @@ __crt0_init_bss:
call_ #memset call_ #memset
#endif #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 #if Lmovedata
.section ".crt_0200movedata", "ax", @progbits .section ".crt_0200movedata", "ax", @progbits

View File

@ -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, 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 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 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 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 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) OUTPUT_ARCH(msp430)
ENTRY(_start) ENTRY(_start)
/* Do we need any of these for elf?
__DYNAMIC = 0; */
INCLUDE intr_vectors.ld INCLUDE intr_vectors.ld
MEMORY MEMORY
{ {
RAM (w) : ORIGIN = 0x00200, LENGTH = 0x0ee00 RAM (w) : ORIGIN = 0x00200, LENGTH = 0x0ee00
RESETVEC (w) : ORIGIN = 0x0fffe, LENGTH = 0x00002
} }
SECTIONS SECTIONS
@ -31,11 +27,13 @@ SECTIONS
.resetvec : .resetvec :
{ {
*(.resetvec) *(.resetvec)
} > RESETVEC } > VECT31
.rodata : { .rodata :
{
. = ALIGN(2); . = ALIGN(2);
*(.plt) *(.plt)
*(.lower.rodata.* .lower.rodata)
*(.rodata .rodata.* .gnu.linkonce.r.* .const .const:*) *(.rodata .rodata.* .gnu.linkonce.r.* .const .const:*)
*(.rodata1) *(.rodata1)
*(.eh_frame_hdr) *(.eh_frame_hdr)
@ -81,7 +79,9 @@ SECTIONS
. = ALIGN(2); . = ALIGN(2);
PROVIDE (_start = .); PROVIDE (_start = .);
KEEP (*(SORT(.crt_*))) 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*)) KEEP (*(.text.*personality*))
/* .gnu.warning sections are handled specially by elf32.em. */ /* .gnu.warning sections are handled specially by elf32.em. */
*(.gnu.warning) *(.gnu.warning)
@ -95,10 +95,12 @@ SECTIONS
KEEP (*(.tm_clone_table)) KEEP (*(.tm_clone_table))
} > RAM } > RAM
.data : { .data :
{
. = ALIGN(2); . = ALIGN(2);
PROVIDE (__datastart = .); PROVIDE (__datastart = .);
*(.lower.data.* .lower.data)
KEEP (*(.jcr)) KEEP (*(.jcr))
*(.data.rel.ro.local) *(.data.rel.ro*) *(.data.rel.ro.local) *(.data.rel.ro*)
*(.dynamic) *(.dynamic)
@ -126,9 +128,11 @@ SECTIONS
PROVIDE(__romdatastart = LOADADDR(.data)); PROVIDE(__romdatastart = LOADADDR(.data));
PROVIDE (__romdatacopysize = SIZEOF(.data)); PROVIDE (__romdatacopysize = SIZEOF(.data));
.bss : { .bss :
{
. = ALIGN(2); . = ALIGN(2);
PROVIDE (__bssstart = .); PROVIDE (__bssstart = .);
*(.lower.bss.* .lower.bss)
*(.dynbss) *(.dynbss)
*(.sbss .sbss.*) *(.sbss .sbss.*)
*(.bss .bss.* .gnu.linkonce.b.*) *(.bss .bss.* .gnu.linkonce.b.*)
@ -137,7 +141,8 @@ SECTIONS
PROVIDE (__bsssize = SIZEOF(.bss)); PROVIDE (__bsssize = SIZEOF(.bss));
/* This section contains data that is not initialised at startup. */ /* This section contains data that is not initialised at startup. */
.noinit : { .noinit (NOLOAD) :
{
. = ALIGN(2); . = ALIGN(2);
PROVIDE (__noinit_start = .); PROVIDE (__noinit_start = .);
*(.noinit) *(.noinit)
@ -155,6 +160,16 @@ SECTIONS
*(.stack) *(.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. */ /* The rest are all not normally part of the runtime image. */
.MP430.attributes 0 : .MP430.attributes 0 :
@ -175,13 +190,13 @@ SECTIONS
/* DWARF debug sections. /* DWARF debug sections.
Symbols in the DWARF debugging sections are relative to the beginning Symbols in the DWARF debugging sections are relative to the beginning
of the section so we begin them at 0. */ of the section so we begin them at 0. */
/* DWARF 1 */ /* DWARF 1. */
.debug 0 : { *(.debug) } .debug 0 : { *(.debug) }
.line 0 : { *(.line) } .line 0 : { *(.line) }
/* GNU DWARF 1 extensions */ /* GNU DWARF 1 extensions. */
.debug_srcinfo 0 : { *(.debug_srcinfo) } .debug_srcinfo 0 : { *(.debug_srcinfo) }
.debug_sfnames 0 : { *(.debug_sfnames) } .debug_sfnames 0 : { *(.debug_sfnames) }
/* DWARF 1.1 and DWARF 2 */ /* DWARF 1.1 and DWARF 2. */
.debug_aranges 0 : { *(.debug_aranges) } .debug_aranges 0 : { *(.debug_aranges) }
.debug_pubnames 0 : { *(.debug_pubnames) } .debug_pubnames 0 : { *(.debug_pubnames) }
/* DWARF 2 */ /* DWARF 2 */
@ -192,12 +207,12 @@ SECTIONS
.debug_str 0 : { *(.debug_str) } .debug_str 0 : { *(.debug_str) }
.debug_loc 0 : { *(.debug_loc) } .debug_loc 0 : { *(.debug_loc) }
.debug_macinfo 0 : { *(.debug_macinfo) } .debug_macinfo 0 : { *(.debug_macinfo) }
/* SGI/MIPS DWARF 2 extensions */ /* SGI/MIPS DWARF 2 extensions. */
.debug_weaknames 0 : { *(.debug_weaknames) } .debug_weaknames 0 : { *(.debug_weaknames) }
.debug_funcnames 0 : { *(.debug_funcnames) } .debug_funcnames 0 : { *(.debug_funcnames) }
.debug_typenames 0 : { *(.debug_typenames) } .debug_typenames 0 : { *(.debug_typenames) }
.debug_varnames 0 : { *(.debug_varnames) } .debug_varnames 0 : { *(.debug_varnames) }
/* DWARF 3 */ /* DWARF 3. */
.debug_pubtypes 0 : { *(.debug_pubtypes) } .debug_pubtypes 0 : { *(.debug_pubtypes) }
.debug_ranges 0 : { *(.debug_ranges) } .debug_ranges 0 : { *(.debug_ranges) }
/* DWARF Extension. */ /* DWARF Extension. */

View File

@ -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, 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 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 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 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 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) OUTPUT_ARCH(msp430)
ENTRY(_start) ENTRY(_start)
/* Do we need any of these for elf?
__DYNAMIC = 0; */
INCLUDE intr_vectors.ld INCLUDE intr_vectors.ld
MEMORY { MEMORY
RAM (rx) : ORIGIN = 0x00200, LENGTH = 0x0ee00 {
LOWROM (w) : ORIGIN = 0x0f000, LENGTH = 0x00800 RAM (w) : ORIGIN = 0x00200, LENGTH = 0x01e00
ROM (w) : ORIGIN = 0x10000, LENGTH = 0x80000 ROM (rx) : ORIGIN = 0x02000, LENGTH = 0x0df00
RESETVEC (w) : ORIGIN = 0x0fffe, LENGTH = 0x00002 HIFRAM (rxw) : ORIGIN = 0x10000, LENGTH = 0x80000
} }
SECTIONS SECTIONS
@ -33,13 +29,22 @@ SECTIONS
.resetvec : .resetvec :
{ {
*(.resetvec) *(.resetvec)
} > RESETVEC } > VECT31
.rodata : { .upper.rodata :
{
. = ALIGN(2);
*(.upper.rodata.* .upper.rodata)
} > HIFRAM
.rodata :
{
. = ALIGN(2); . = ALIGN(2);
*(.plt) *(.plt)
*(.lower.rodata.* .lower.rodata)
*(.rodata .rodata.* .gnu.linkonce.r.* .const .const:*) *(.rodata .rodata.* .gnu.linkonce.r.* .const .const:*)
*(.rodata1) *(.rodata1)
*(.eh_frame_hdr) *(.eh_frame_hdr)
KEEP (*(.eh_frame)) KEEP (*(.eh_frame))
KEEP (*(.gcc_except_table)) *(.gcc_except_table.*) KEEP (*(.gcc_except_table)) *(.gcc_except_table.*)
@ -78,10 +83,19 @@ SECTIONS
KEEP (*(.dtors)) KEEP (*(.dtors))
} > ROM } > ROM
.data : { .upper.data :
{
. = ALIGN(2);
*(.upper.data.* .upper.data)
} > HIFRAM
.data :
{
. = ALIGN(2); . = ALIGN(2);
PROVIDE (__datastart = .); PROVIDE (__datastart = .);
*(.lower.data.* .lower.data)
. = ALIGN(2);
KEEP (*(.jcr)) KEEP (*(.jcr))
*(.data.rel.ro.local) *(.data.rel.ro*) *(.data.rel.ro.local) *(.data.rel.ro*)
*(.dynamic) *(.dynamic)
@ -99,19 +113,30 @@ SECTIONS
*(.sdata .sdata.* .gnu.linkonce.s.* D_2 D_1) *(.sdata .sdata.* .gnu.linkonce.s.* D_2 D_1)
. = ALIGN(2); . = ALIGN(2);
_edata = .; _edata = .;
PROVIDE (edata = .); PROVIDE (edata = .);
PROVIDE (__dataend = .); PROVIDE (__dataend = .);
} > RAM AT>ROM } > RAM
/* Note that crt0 assumes this is a multiple of two; all the /* Note that crt0 assumes this is a multiple of two; all the
start/stop symbols are also assumed word-aligned. */ start/stop symbols are also assumed word-aligned. */
PROVIDE(__romdatastart = LOADADDR(.data)); PROVIDE(__romdatastart = LOADADDR(.data));
PROVIDE (__romdatacopysize = SIZEOF(.data)); PROVIDE (__romdatacopysize = SIZEOF(.data));
.bss : { .upper.bss :
{
. = ALIGN(2);
PROVIDE (__high_bssstart = .);
*(.upper.bss.* .upper.bss)
PROVIDE (__high_bssend = .);
} > HIFRAM
.bss :
{
. = ALIGN(2); . = ALIGN(2);
PROVIDE (__bssstart = .); PROVIDE (__bssstart = .);
*(.lower.bss.* .lower.bss)
*(.dynbss) *(.dynbss)
*(.sbss .sbss.*) *(.sbss .sbss.*)
*(.bss .bss.* .gnu.linkonce.b.*) *(.bss .bss.* .gnu.linkonce.b.*)
@ -121,7 +146,8 @@ SECTIONS
PROVIDE (__bsssize = SIZEOF(.bss)); PROVIDE (__bsssize = SIZEOF(.bss));
/* This section contains data that is not initialised at startup. */ /* This section contains data that is not initialised at startup. */
.noinit : { .noinit (NOLOAD) :
{
. = ALIGN(2); . = ALIGN(2);
PROVIDE (__noinit_start = .); PROVIDE (__noinit_start = .);
*(.noinit) *(.noinit)
@ -133,25 +159,34 @@ SECTIONS
_end = .; _end = .;
PROVIDE (end = .); PROVIDE (end = .);
.stack (ORIGIN (RAM) + LENGTH(RAM)) : .stack (ORIGIN (HIFRAM) + LENGTH(HIFRAM)) :
{ {
PROVIDE (__stack = .); PROVIDE (__stack = .);
*(.stack) *(.stack)
} }
/* This is just for crt0.S */ /* This is just for crt0.S and interrupt handlers. */
.lowtext : .lowtext :
{ {
PROVIDE (_start = .); PROVIDE (_start = .);
. = ALIGN(2); . = ALIGN(2);
KEEP (*(SORT(.crt_*))) KEEP (*(SORT(.crt_*)))
KEEP (*(.lowtext)) KEEP (*(.lowtext))
} > LOWROM } > ROM
.upper.text :
{
. = ALIGN(2);
*(.upper.text.* .upper.text)
} > HIFRAM
.text : .text :
{ {
. = ALIGN(2);
*(.lower.text.* .lower.text)
. = ALIGN(2); . = ALIGN(2);
*(.text .stub .text.* .gnu.linkonce.t.* .text:*) *(.text .stub .text.* .gnu.linkonce.t.* .text:*)
KEEP (*(.text.*personality*)) KEEP (*(.text.*personality*))
/* .gnu.warning sections are handled specially by elf32.em. */ /* .gnu.warning sections are handled specially by elf32.em. */
*(.gnu.warning) *(.gnu.warning)
@ -185,16 +220,16 @@ SECTIONS
/* DWARF debug sections. /* DWARF debug sections.
Symbols in the DWARF debugging sections are relative to the beginning Symbols in the DWARF debugging sections are relative to the beginning
of the section so we begin them at 0. */ of the section so we begin them at 0. */
/* DWARF 1 */ /* DWARF 1. */
.debug 0 : { *(.debug) } .debug 0 : { *(.debug) }
.line 0 : { *(.line) } .line 0 : { *(.line) }
/* GNU DWARF 1 extensions */ /* GNU DWARF 1 extensions. */
.debug_srcinfo 0 : { *(.debug_srcinfo) } .debug_srcinfo 0 : { *(.debug_srcinfo) }
.debug_sfnames 0 : { *(.debug_sfnames) } .debug_sfnames 0 : { *(.debug_sfnames) }
/* DWARF 1.1 and DWARF 2 */ /* DWARF 1.1 and DWARF 2. */
.debug_aranges 0 : { *(.debug_aranges) } .debug_aranges 0 : { *(.debug_aranges) }
.debug_pubnames 0 : { *(.debug_pubnames) } .debug_pubnames 0 : { *(.debug_pubnames) }
/* DWARF 2 */ /* DWARF 2. */
.debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
.debug_abbrev 0 : { *(.debug_abbrev) } .debug_abbrev 0 : { *(.debug_abbrev) }
.debug_line 0 : { *(.debug_line .debug_line.* .debug_line_end ) } .debug_line 0 : { *(.debug_line .debug_line.* .debug_line_end ) }
@ -202,7 +237,7 @@ SECTIONS
.debug_str 0 : { *(.debug_str) } .debug_str 0 : { *(.debug_str) }
.debug_loc 0 : { *(.debug_loc) } .debug_loc 0 : { *(.debug_loc) }
.debug_macinfo 0 : { *(.debug_macinfo) } .debug_macinfo 0 : { *(.debug_macinfo) }
/* SGI/MIPS DWARF 2 extensions */ /* SGI/MIPS DWARF 2 extensions. */
.debug_weaknames 0 : { *(.debug_weaknames) } .debug_weaknames 0 : { *(.debug_weaknames) }
.debug_funcnames 0 : { *(.debug_funcnames) } .debug_funcnames 0 : { *(.debug_funcnames) }
.debug_typenames 0 : { *(.debug_typenames) } .debug_typenames 0 : { *(.debug_typenames) }