Move data objects at the end of flash.
[gnuk/gnuk.git] / src / gnuk.ld.in
index 91e6c12..cb65772 100644 (file)
@@ -1,40 +1,21 @@
-/*
-    ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010 Giovanni Di Sirio.
-
-    This file is part of ChibiOS/RT.
-
-    ChibiOS/RT is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 3 of the License, or
-    (at your option) any later version.
-
-    ChibiOS/RT is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-                                      ---
-
-    A special exception to the GPL can be applied should you wish to distribute
-    a combined work that includes ChibiOS/RT, without being obliged to provide
-    the source code for any proprietary components. See the file exception.txt
-    for full details of how and when the exception can be applied.
-*/
-
 /*
  * ST32F103 memory setup.
  */
-__main_stack_size__     = 0x0400;
-__process_stack_size__  = 0x0200;
-__stacks_total_size__   = __main_stack_size__ + __process_stack_size__;
+__main_stack_size__      = 0x0080;      /* Exception handlers     */
+__process0_stack_size__  = 0x0100;      /* main */
+__process1_stack_size__  = 0x01a0;      /* ccid */
+__process2_stack_size__  = 0x0180;      /* rng */
+__process3_stack_size__  = 0x1640;      /* gpg */
+__process4_stack_size__  = 0;           /* --- */
+__process5_stack_size__  = @MSC_SIZE@;  /* msc */
+__process6_stack_size__  = @TIM_SIZE@;  /* intr: timer */
+__process7_stack_size__  = @EXT_SIZE@;  /* intr: ext */
 
 MEMORY
 {
-    flash : org = @ORIGIN@, len = @FLASH_SIZE@k
-    ram : org = 0x20000000, len = 20k
+    flash0 : org = @ORIGIN@, len = 4k
+    flash  : org = @ORIGIN@+0x1000, len = @FLASH_SIZE@k - 4k
+    ram : org = 0x20000000, len = @MEMORY_SIZE@k
 }
 
 __ram_start__           = ORIGIN(ram);
@@ -45,10 +26,35 @@ SECTIONS
 {
     . = 0;
 
+    .sys : ALIGN(4) SUBALIGN(4)
+    {
+       _sys = .;
+       KEEP(*(.vectors))
+       . = ALIGN(16);
+       KEEP(*(.sys.version))
+       KEEP(*(.sys.board_id))
+       KEEP(*(.sys.board_name))
+       build/sys-*.o(.text)
+       build/sys-*.o(.text.*)
+       build/sys-*.o(.rodata)
+       build/sys-*.o(.rodata.*)
+       . = ALIGN(1024);
+       *(.sys.0)
+       *(.sys.1)
+       *(.sys.2)
+    } > flash0
+
+    _text = .;
+
+    .startup : ALIGN(128) SUBALIGN(128)
+    {
+        KEEP(*(.startup.vectors))
+        . = ALIGN (16);
+    } > flash =0xffffffff
+
     .text : ALIGN(16) SUBALIGN(16)
     {
-        _text = .;
-        KEEP(*(vectors))
+        *(.text.startup.*)
         *(.text)
         *(.text.*)
         *(.rodata)
@@ -56,65 +62,99 @@ SECTIONS
         *(.glue_7t)
         *(.glue_7)
         *(.gcc*)
+       . = ALIGN(8);
     } > flash
 
-    .ctors :
-    {
-        PROVIDE(_ctors_start_ = .);
-        KEEP(*(SORT(.ctors.*)))
-        KEEP(*(.ctors))
-        PROVIDE(_ctors_end_ = .);
-    } > flash
-
-    .dtors :
-    {
-        PROVIDE(_dtors_start_ = .);
-        KEEP(*(SORT(.dtors.*)))
-        KEEP(*(.dtors))
-        PROVIDE(_dtors_end_ = .);
-    } > flash
+    .ARM.extab : {*(.ARM.extab* .gnu.linkonce.armextab.*)} > flash
 
-    .ARM.extab : {*(.ARM.extab* .gnu.linkonce.armextab.*)}
+    .ARM.exidx : {
+        PROVIDE(__exidx_start = .);
+        *(.ARM.exidx* .gnu.linkonce.armexidx.*)
+        PROVIDE(__exidx_end = .);
+     } > flash
 
-    __exidx_start = .;
-    .ARM.exidx : {*(.ARM.exidx* .gnu.linkonce.armexidx.*)} > flash
-    __exidx_end = .;
+    .eh_frame_hdr : {*(.eh_frame_hdr)} > flash
 
-    .eh_frame_hdr : {*(.eh_frame_hdr)}
+    .eh_frame : ONLY_IF_RO {*(.eh_frame)} > flash
 
-    .eh_frame : ONLY_IF_RO {*(.eh_frame)}
+    .textalign : ONLY_IF_RO { . = ALIGN(8); } > flash
 
-    . = ALIGN(4);
     _etext = .;
     _textdata = _etext;
 
+    .stacks :
+    {
+        . = ALIGN(8);
+        __main_stack_base__ = .;
+        . += __main_stack_size__;
+        . = ALIGN(8);
+        __main_stack_end__ = .;
+        __process0_stack_base__ = .;
+        . += __process0_stack_size__;
+        . = ALIGN(8);
+        __process0_stack_end__ = .;
+        __process1_stack_base__ = .;
+        . += __process1_stack_size__;
+        . = ALIGN(8);
+        __process1_stack_end__ = .;
+        __process2_stack_base__ = .;
+        . += __process2_stack_size__;
+        . = ALIGN(8);
+        __process2_stack_end__ = .;
+        __process3_stack_base__ = .;
+        . += __process3_stack_size__;
+        . = ALIGN(8);
+        __process3_stack_end__ = .;
+        __process4_stack_base__ = .;
+        . += __process4_stack_size__;
+        . = ALIGN(8);
+        __process4_stack_end__ = .;
+        __process5_stack_base__ = .;
+        . += __process5_stack_size__;
+        . = ALIGN(8);
+        __process5_stack_end__ = .;
+        __process6_stack_base__ = .;
+        . += __process6_stack_size__;
+        . = ALIGN(8);
+        __process6_stack_end__ = .;
+        __process7_stack_base__ = .;
+        . += __process7_stack_size__;
+        . = ALIGN(8);
+        __process7_stack_end__ = .;
+        . = ALIGN(8);
+    } > ram
+
     .data :
     {
-        _data = .;
+        . = ALIGN(4);
+        PROVIDE(_data = .);
         *(.data)
         . = ALIGN(4);
         *(.data.*)
         . = ALIGN(4);
         *(.ramtext)
         . = ALIGN(4);
-        _edata = .;
+        PROVIDE(_edata = .);
     } > ram AT > flash
 
     .bss :
     {
-        _bss_start = .;
+        . = ALIGN(4);
+        PROVIDE(_bss_start = .);
         *(.bss)
         . = ALIGN(4);
         *(.bss.*)
         . = ALIGN(4);
         *(COMMON)
         . = ALIGN(4);
-        _bss_end = .;
+        PROVIDE(_bss_end = .);
     } > ram
 
+    . = ALIGN(16);
     PROVIDE(end = .);
     _end            = .;
     . = ALIGN(512);
+
     _regnual_start = .;
 
 @CERTDO_SUPPORT_START@
@@ -122,8 +162,8 @@ SECTIONS
     {
         . = ALIGN (@FLASH_PAGE_SIZE@);
         ch_certificate_start = .;
-       LONG(0xffffffff);
-       . += 1920;
+        LONG(0xffffffff);
+        . += 1920;
         . = ALIGN (@FLASH_PAGE_SIZE@);
     } > flash =0xffffffff
 @CERTDO_SUPPORT_END@
@@ -131,15 +171,22 @@ SECTIONS
     .gnuk_flash :
     {
         . = ALIGN (@FLASH_PAGE_SIZE@);
-       _data_pool = .;
-       KEEP(*(.gnuk_data))
-       . = ALIGN(@FLASH_PAGE_SIZE@);
-       . += @FLASH_PAGE_SIZE@;
-       _keystore_pool = .;
-       . += 512*3;
-       . = ALIGN(@FLASH_PAGE_SIZE@);
+        _keystore_pool = .;
+        . += 512;
+        . = ALIGN(@FLASH_PAGE_SIZE@);
+        . += 512;
+        . = ALIGN(@FLASH_PAGE_SIZE@);
+        . += 512;
+        . = ALIGN(@FLASH_PAGE_SIZE@);
+        _updatekey_store = .;
+        . += 1024;
+        . = ALIGN(@FLASH_PAGE_SIZE@);
+        _data_pool = .;
+        KEEP(*(.gnuk_data))
+        . = ALIGN(@FLASH_PAGE_SIZE@);
+        . += @FLASH_PAGE_SIZE@;
     } > flash =0xffffffff
 }
 
 __heap_base__   = _end;
-__heap_end__    = __ram_end__ - __stacks_total_size__;
+__heap_end__    = __ram_end__;