1 /*
2 * Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
3 * Copyright (c) 2020-2022 Huawei Device Co., Ltd. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without modification,
6 * are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice, this list of
9 *    conditions and the following disclaimer.
10 *
11 * 2. Redistributions in binary form must reproduce the above copyright notice, this list
12 *    of conditions and the following disclaimer in the documentation and/or other materials
13 *    provided with the distribution.
14 *
15 * 3. Neither the name of the copyright holder nor the names of its contributors may be used
16 *    to endorse or promote products derived from this software without specific prior written
17 *    permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
21 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
23 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
24 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
26 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
27 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
28 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
29 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 */
31
32OUTPUT_FORMAT("elf32-littleriscv", "elf32-littleriscv", "elf32-littleriscv")
33OUTPUT_ARCH("riscv")
34ENTRY(_start)
35
36RAM_ADDR_START            = 0x80000000;
37RAM_ADDR_SIZE             = 128M;
38FLASH_LOAD_START          = RAM_ADDR_START;
39FLASH_LOAD_SIZE           = RAM_ADDR_SIZE;
40EXCEPT_STACK_SIZE         = 2K;
41NMI_STACK_SIZE            = 1K;
42START_AND_IRQ_STACK_SIZE  = 8K;
43
44MEMORY
45{
46   ram(rwx) : ORIGIN = RAM_ADDR_START, LENGTH = RAM_ADDR_SIZE
47   flash(rwx) : ORIGIN = FLASH_LOAD_START, LENGTH = FLASH_LOAD_SIZE
48}
49SECTIONS
50{
51  .text : ALIGN(0x20)
52  {
53    __text_start = .;
54    . = ALIGN(0x10);
55    *(.start.text)
56    *(.interrupt.*)
57    *(.text .text.*)
58    . = ALIGN(0x20);
59    __rodata_start = .;
60    . = ALIGN(0x10);
61    *(.rodata .rodata.* .srodata .srodata.*)
62    . = ALIGN(0x20);
63    __text_end = .;
64    _hdf_drivers_start = .;
65    KEEP(*(.hdf.driver))
66    _hdf_drivers_end = .;
67  } > ram AT > flash
68  .data : ALIGN(0x20)
69  {
70    __global_pointer$ = . + 0x800;
71    __data_load_start = LOADADDR(.data);
72    __data_start = .;
73    /* preinit_array */
74    . = ALIGN(4);
75    PROVIDE_HIDDEN (__preinit_array_start = .);
76    KEEP (*(.preinit_array))
77    PROVIDE_HIDDEN (__preinit_array_end = .);
78    /* init_array */
79    . = ALIGN(4);
80    PROVIDE_HIDDEN (__init_array_start = .);
81    KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*)))
82    KEEP (*(.init_array))
83    PROVIDE_HIDDEN (__init_array_end = .);
84    /* fini_array */
85    . = ALIGN(4);
86    PROVIDE_HIDDEN (__fini_array_start = .);
87    KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*)))
88    KEEP (*(.fini_array))
89    PROVIDE_HIDDEN (__fini_array_end = .);
90    . = ALIGN(0x10);
91    *(.data .data.* .sdata .sdata.*)
92    . = ALIGN(0x20);
93    __data_end = .;
94    _edata = .;
95  } > ram AT > flash
96  __data_load_size = SIZEOF(.data);
97  /* zInit code and data - will be freed after init */
98  .zInit (.) :
99  {
100    __zinitcall_bsp_start = .;
101    KEEP (*(.zinitcall.bsp0.init))
102    KEEP (*(.zinitcall.bsp1.init))
103    KEEP (*(.zinitcall.bsp2.init))
104    KEEP (*(.zinitcall.bsp3.init))
105    KEEP (*(.zinitcall.bsp4.init))
106    __zinitcall_bsp_end = .;
107    . = ALIGN(4);
108    __zinitcall_device_start = .;
109    KEEP (*(.zinitcall.device0.init))
110    KEEP (*(.zinitcall.device1.init))
111    KEEP (*(.zinitcall.device2.init))
112    KEEP (*(.zinitcall.device3.init))
113    KEEP (*(.zinitcall.device4.init))
114    __zinitcall_device_end = .;
115    . = ALIGN(4);
116    __zinitcall_core_start = .;
117    KEEP (*(.zinitcall.core0.init))
118    KEEP (*(.zinitcall.core1.init))
119    KEEP (*(.zinitcall.core2.init))
120    KEEP (*(.zinitcall.core3.init))
121    KEEP (*(.zinitcall.core4.init))
122    __zinitcall_core_end = .;
123    . = ALIGN(4);
124    __zinitcall_sys_service_start = .;
125    KEEP (*(.zinitcall.sys.service0.init))
126    KEEP (*(.zinitcall.sys.service1.init))
127    KEEP (*(.zinitcall.sys.service2.init))
128    KEEP (*(.zinitcall.sys.service3.init))
129    KEEP (*(.zinitcall.sys.service4.init))
130    __zinitcall_sys_service_end = .;
131    . = ALIGN(4);
132    __zinitcall_sys_feature_start = .;
133    KEEP (*(.zinitcall.sys.feature0.init))
134    KEEP (*(.zinitcall.sys.feature1.init))
135    KEEP (*(.zinitcall.sys.feature2.init))
136    KEEP (*(.zinitcall.sys.feature3.init))
137    KEEP (*(.zinitcall.sys.feature4.init))
138    __zinitcall_sys_feature_end = .;
139    . = ALIGN(4);
140    __zinitcall_run_start = .;
141    KEEP (*(.zinitcall.run0.init))
142    KEEP (*(.zinitcall.run1.init))
143    KEEP (*(.zinitcall.run2.init))
144    KEEP (*(.zinitcall.run3.init))
145    KEEP (*(.zinitcall.run4.init))
146    __zinitcall_run_end = .;
147    . = ALIGN(4);
148    __zinitcall_app_service_start = .;
149    KEEP (*(.zinitcall.app.service0.init))
150    KEEP (*(.zinitcall.app.service1.init))
151    KEEP (*(.zinitcall.app.service2.init))
152    KEEP (*(.zinitcall.app.service3.init))
153    KEEP (*(.zinitcall.app.service4.init))
154    __zinitcall_app_service_end = .;
155    . = ALIGN(4);
156    __zinitcall_app_feature_start = .;
157    KEEP (*(.zinitcall.app.feature0.init))
158    KEEP (*(.zinitcall.app.feature1.init))
159    KEEP (*(.zinitcall.app.feature2.init))
160    KEEP (*(.zinitcall.app.feature3.init))
161    KEEP (*(.zinitcall.app.feature4.init))
162    __zinitcall_app_feature_end = .;
163    . = ALIGN(4);
164    __zinitcall_test_start = .;
165    KEEP (*(.zinitcall.test0.init))
166    KEEP (*(.zinitcall.test1.init))
167    KEEP (*(.zinitcall.test2.init))
168    KEEP (*(.zinitcall.test3.init))
169    KEEP (*(.zinitcall.test4.init))
170    __zinitcall_test_end = .;
171    . = ALIGN(4);
172    __zinitcall_exit_start = .;
173    KEEP (*(.zinitcall.exit0.init))
174    KEEP (*(.zinitcall.exit1.init))
175    KEEP (*(.zinitcall.exit2.init))
176    KEEP (*(.zinitcall.exit3.init))
177    KEEP (*(.zinitcall.exit4.init))
178    __zinitcall_exit_end = .;
179    . = ALIGN(4);
180  } > ram
181  .bss (NOLOAD): ALIGN(0x20)
182  {
183    __bss_start = .;
184    . = ALIGN(0x10);
185    *(.kernel.bss*)
186    *(.bss.* .sbss.*)
187    . = ALIGN(0x20);
188    __bss_end = .;
189  } > ram
190  .stack (NOLOAD): ALIGN(0x40)
191  {
192    __stack_bootom = .;
193    . += EXCEPT_STACK_SIZE;
194    __except_stack_top = .;
195    . += START_AND_IRQ_STACK_SIZE;
196    __start_and_irq_stack_top = .;
197  } > ram
198
199  .heap (NOLOAD): ALIGN(0x40)
200  {
201    __heap_start = .;
202  } > ram
203
204  __heap_size = RAM_ADDR_SIZE - (__heap_start - __text_start);
205  _end = .;
206  end = .;
207}
208