This is the mail archive of the newlib@sourceware.org mailing list for the newlib project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Commit: MSP430: Add support for upper and lower sections


Hi Guys,

  I am applying the patch below to add support for upper and lower
  sections to the MSP430's msp430xl-sim.ld linker script.  These
  sections are used to help partition a program betweem low (< 64K) and
  high (> 64K) memory regions which are found on a number MSP430 chips.

Cheers
  Nick

libgloss/ChangeLog
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.

Index: libgloss/msp430/Makefile.in
===================================================================
RCS file: /cvs/src/src/libgloss/msp430/Makefile.in,v
retrieving revision 1.6
diff -u -3 -p -r1.6 Makefile.in
--- libgloss/msp430/Makefile.in	23 Oct 2014 01:49:49 -0000	1.6
+++ libgloss/msp430/Makefile.in	13 Nov 2014 10:14:46 -0000
@@ -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 \
Index: libgloss/msp430/crt0.S
===================================================================
RCS file: /cvs/src/src/libgloss/msp430/crt0.S,v
retrieving revision 1.2
diff -u -3 -p -r1.2 crt0.S
--- libgloss/msp430/crt0.S	30 Jan 2014 02:46:34 -0000	1.2
+++ libgloss/msp430/crt0.S	13 Nov 2014 10:14:46 -0000
@@ -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
 
Index: libgloss/msp430/msp430-sim.ld
===================================================================
RCS file: /cvs/src/src/libgloss/msp430/msp430-sim.ld,v
retrieving revision 1.3
diff -u -3 -p -r1.3 msp430-sim.ld
--- libgloss/msp430/msp430-sim.ld	30 Jan 2014 02:46:34 -0000	1.3
+++ libgloss/msp430/msp430-sim.ld	13 Nov 2014 10:14:46 -0000
@@ -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.  */
Index: libgloss/msp430/msp430xl-sim.ld
===================================================================
RCS file: /cvs/src/src/libgloss/msp430/msp430xl-sim.ld,v
retrieving revision 1.3
diff -u -3 -p -r1.3 msp430xl-sim.ld
--- libgloss/msp430/msp430xl-sim.ld	30 Jan 2014 02:46:34 -0000	1.3
+++ libgloss/msp430/msp430xl-sim.ld	13 Nov 2014 10:14:46 -0000
@@ -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
+
+  .upper.text :
+  {
+    . = ALIGN(2);
+    *(.upper.text.* .upper.text)
+  } > HIFRAM
 
-  .text           :
+  .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)

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]