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