• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1OUTPUT_ARCH( "riscv" )
2ENTRY(_start)
3
4#ifdef LOSCFG_DEBUG_KASAN
5#define MAX_BIN_SIZE           3M
6#else
7#define MAX_BIN_SIZE           2M
8#endif
9
10#ifdef HI_BOARD_ASIC
11#ifdef HI_ON_FLASH
12
13#ifdef CONFIG_CHIP_PKT_48K
14#define RAM_SIZE               264K /* PKT_B:48K */
15#define RAM_START              0x000dc000 /* PKT_B:48K */
16#else
17#define RAM_SIZE               280K /* PKT_B:32K*/
18#define RAM_START              0x000d8000 /* PKT_B:32K */
19#endif
20
21#else
22#define RAM_SIZE               248K /* PKT_B:64K + NO DC */
23#define RAM_START              0x000e0000 /* PKT_B:64K */
24#endif
25#else
26#ifdef HI_ON_FLASH
27#ifdef LOSCFG_DEBUG_KASAN
28#define RAM_SIZE               896K
29#else
30#define RAM_SIZE               1M
31#endif
32#define RAM_START              0x00100000
33#else
34#define RAM_SIZE               248K /* PKT_B:64K + NO DC */
35#define RAM_START              0x000e0000 /* PKT_B:64K */
36#endif
37#endif
38
39#ifdef LOSCFG_DEBUG_KASAN
40#define FLASH_SIZE             3M
41#else
42#define FLASH_SIZE             2M
43#endif
44
45#ifdef CONFIG_FLASH_ENCRYPT_SUPPORT
46#define CRYPTO_RAM_LEN         4096
47#endif
48
49STACK_SIZE      = 2k;               /* needs to be calculated for your application */
50IRQ_STACK_SIZE  = 3K;
51EXC_STACK_SIZE  = 2K;
52#if (defined CONFIG_TEE_HUKS_SUPPORT) || (defined CONFIG_TARGET_SIG_RSA_V15) || (defined CONFIG_TARGET_SIG_RSA_PSS) || (defined CONFIG_TARGET_SIG_ECC)
53NMI_STACK_SIZE  = 2K;
54#else
55NMI_STACK_SIZE  = 0K;
56#endif
57DOWNLOAD_STACK_SIZE = 4K;
58DOWNLOAD_IRQ_STACK_SIZE = 2K;
59
60/* actually rom data0 size is 944 byte, when rom fixed, may all data can be placed in rom. */
61#define ROM_DATA0_LEN          32     /* 32 bytes align */
62
63#ifdef LOSCFG_DEBUG_KASAN
64#define ROM_DATA1_LEN          5056   /* 32 bytes align */
65#else
66#define ROM_DATA1_LEN          2016   /* 32 bytes align */
67#endif
68
69#define ROM_BSS_LEN            11776  /* 32 bytes align */
70#define PATCH_BSS_LEN          1024   /* 1024 bytes align */
71
72#ifdef HI_ON_FLASH
73#define SECURE_HEAD            0  /* iot has no Signature head */
74#else
75#define SECURE_HEAD            0x5A0  /* non-iot Signature lenth */
76#endif
77
78#define ROM_TEXT_LEN           (278K - ROM_DATA0_LEN)
79#define CHECK_INFO_LEN         0x40
80#if (defined HI_BOARD_ASIC) || (!defined HI_ON_FLASH)
81#define STACK_LEN              (STACK_SIZE + IRQ_STACK_SIZE + EXC_STACK_SIZE + NMI_STACK_SIZE)
82#endif
83
84#define ROM_RAM_LEN            (ROM_DATA0_LEN + ROM_DATA1_LEN + ROM_BSS_LEN + CHECK_INFO_LEN)
85#define ROM_RAM_START          (0x11DFFF - ROM_RAM_LEN + 1)
86#define ROM_START              0x003b8000
87#define FLASH_START            0x00400000
88#define BIN_START              FLASH_FIRM_START /* The value of <FLASH_FIRM_START> macro is transfered by scons. And the value varies with the signature. */
89
90#ifndef HI_BOARD_ASIC
91/* only use in FPGA. */
92#define RAM_FPGA_START         0x11E000
93#define RAM_FPGA_LEN           (1M - 120K)
94#endif
95
96#if defined(ROM_BIN_TEST)
97#define TEST_OFFSET            7
98#else
99#define TEST_OFFSET            0
100#endif
101
102#define ROM_TEXT_VMA           ROM_START
103
104#define ROM_BSS_VMA            ROM_RAM_START
105#define ROM_DATA0_VMA          (ROM_RAM_START + ROM_BSS_LEN)
106#define ROM_DATA1_VMA          (ROM_DATA0_VMA + ROM_DATA0_LEN)
107#define CHECK_INFO_VMA         (ROM_DATA1_VMA + ROM_DATA1_LEN)
108#define PATCH_BSS_START        RAM_START
109#ifdef CONFIG_FLASH_ENCRYPT_SUPPORT
110#define CRYPTO_RAM_START       (PATCH_BSS_START + PATCH_BSS_LEN + SECURE_HEAD)
111#define NON_ROM_RAM_START      (CRYPTO_RAM_START + CRYPTO_RAM_LEN)
112#else
113#define NON_ROM_RAM_START      (PATCH_BSS_START + PATCH_BSS_LEN + SECURE_HEAD)
114#endif
115#if (defined HI_BOARD_ASIC) || (!defined HI_ON_FLASH)
116#define STACK_VMA              ROM_RAM_START - STACK_LEN
117#endif
118
119#define ROM_TEXT_LMA           (BIN_START - ROM_TEXT_LEN - ROM_DATA0_LEN)
120#define ROM_DATA0_LMA          (ROM_TEXT_LMA + ROM_TEXT_LEN)
121
122#ifdef HI_ON_FLASH
123#define NON_ROM_TEXT_REGION     FLASH
124#else
125#define NON_ROM_TEXT_REGION     RAM
126#endif
127
128#ifdef CONFIG_FLASH_ENCRYPT_SUPPORT
129#define RAM_CRYPTO_TEXT_LMA     (ROM_DATA0_LMA + ROM_DATA0_LEN)
130#define NON_ROM_TEXT_LMA        (RAM_CRYPTO_TEXT_LMA + CRYPTO_RAM_LEN)
131#else
132#define NON_ROM_TEXT_LMA        (ROM_DATA0_LMA + ROM_DATA0_LEN)
133#endif
134
135#define ZINIT_NO_ROM_TEXT_LMA   ((NON_ROM_TEXT_LMA + SIZEOF (.text_non_rom) + (0x20) - 1) & ~ ((0x20) - 1))
136#define RAM_TEXT_LMA            ((ZINIT_NO_ROM_TEXT_LMA + SIZEOF (.zInit) + (0x20) - 1) & ~ ((0x20) - 1))
137#define NON_ROM_DATA_LMA        ((RAM_TEXT_LMA + SIZEOF (.ram_text) + (0x20) -1) & ~ ((0x20) - 1))
138#define ROM_DATA1_LMA           ((NON_ROM_DATA_LMA + SIZEOF(.data) + (0x20) - 1) & ~ ((0x20) - 1))
139
140#if (defined HI_BOARD_ASIC) || (!defined HI_ON_FLASH)
141
142#ifdef CONFIG_FLASH_ENCRYPT_SUPPORT
143#define RAM_LEN (RAM_SIZE - ROM_RAM_LEN - PATCH_BSS_LEN - STACK_LEN- SECURE_HEAD - CRYPTO_RAM_LEN)
144#else
145#define RAM_LEN (RAM_SIZE - ROM_RAM_LEN - PATCH_BSS_LEN - STACK_LEN - SECURE_HEAD)
146#endif
147
148#else
149#define RAM_LEN (RAM_SIZE - ROM_RAM_LEN - PATCH_BSS_LEN - SECURE_HEAD)
150#endif
151
152#define KEEP_SORT_GCC_TEXT(obj) KEEP(SORT(*libgcc.a:obj)(.text*))
153#define KEEP_SORT_GCC_RODATA(obj) KEEP(SORT(*libgcc.a:obj)(.rodata*))
154#define KEEP_SORT_GCC_DATA(obj) KEEP(SORT(*libgcc.a:obj)(.data*))
155#define KEEP_SORT_GCC_BSS(obj) KEEP(SORT(*libgcc.a:obj)(.bss*))
156#define LIBGCC_ROM_FUN(func) func(save-restore.o) func(_clzsi2.o) func(_umoddi3.o) func(_clz.o) func(_ashldi3.o) func(_lshrdi3.o) func(fixdfsi.o) func(_udivdi3.o)
157
158MEMORY
159{
160    BIN(rx) :          ORIGIN = BIN_START,           LENGTH = MAX_BIN_SIZE
161    ROM_TEXT(rx) :     ORIGIN = ROM_TEXT_VMA,        LENGTH = ROM_TEXT_LEN        /* code and rodata of download,kernel,lib,bsp,wifi... */
162    ROM_DATA0(rwx) :   ORIGIN = ROM_DATA0_VMA,       LENGTH = ROM_DATA0_LEN       /* data used by download rom code */
163    ROM_DATA1(rwx) :   ORIGIN = ROM_DATA1_VMA,       LENGTH = 1768                /* data used by other rom code:1768 byte */
164    ROM_BSS(rwx) :     ORIGIN = ROM_BSS_VMA,         LENGTH = ROM_BSS_LEN         /* bss used by rom code */
165#if (defined HI_BOARD_ASIC) || (!defined HI_ON_FLASH)
166    STACK(rw) :        ORIGIN = STACK_VMA,           LENGTH = STACK_LEN           /* stack */
167#endif
168    CHECK_INFO(rw) :   ORIGIN = CHECK_INFO_VMA,      LENGTH = CHECK_INFO_LEN      /* check info used by rom code */
169#ifdef CONFIG_FLASH_ENCRYPT_SUPPORT
170    FLASH(rwx) :       ORIGIN = FLASH_FIRM_START + CRYPTO_RAM_LEN,    LENGTH = FLASH_START + FLASH_SIZE - FLASH_FIRM_START - CRYPTO_RAM_LEN
171#else
172    FLASH(rwx) :       ORIGIN = FLASH_FIRM_START,    LENGTH = FLASH_START + FLASH_SIZE - FLASH_FIRM_START
173#endif
174    PATCH_BSS(rwx) :   ORIGIN = PATCH_BSS_START,     LENGTH = PATCH_BSS_LEN       /* flash patch remap */
175#ifdef CONFIG_FLASH_ENCRYPT_SUPPORT
176    CRYPTO_RAM(rwx) :  ORIGIN = CRYPTO_RAM_START,    LENGTH = CRYPTO_RAM_LEN      /* 4K kernel crypto */
177#endif
178    RAM(rwx) :         ORIGIN = NON_ROM_RAM_START,   LENGTH = RAM_LEN             /* non rom data,bss,stack,heap */
179    EXTERN_ROM_DATA1_BSS(rwx) :        ORIGIN = 0x11dec8,   LENGTH = ROM_DATA1_LEN-1768    /* use extern rom data 1 as non_rom bss */
180#if (defined HI_BOARD_FPGA) && (defined HI_ON_FLASH)
181    RAM_FPGA(rwx) :    ORIGIN = RAM_FPGA_START,      LENGTH = RAM_FPGA_LEN        /* FPGA stack and heap */
182#endif
183}
184
185SECTIONS
186{
187    .text_rom : AT (ROM_TEXT_LMA)
188    {
189        . = ALIGN(0x20);
190        __rom_text_begin__ = .;
191        __text_cache_start1_ = .;
192        _rom_size_download_start = .;
193        KEEP(SORT(*)(.text.download_entry))
194        . = ALIGN(0x4);
195        KEEP(SORT(*)(.text.trap_download_vector))
196        KEEP(SORT(*)(.text.download_assemble))
197        . = ALIGN(0x4);
198        _rom_size_download_end = .;
199        _rom_size_download = _rom_size_download_end - _rom_size_download_start;
200        KEEP(SORT(libwifi_base.o)(.text*))
201        KEEP(SORT(*)(.wifi.rom.text*))
202        . = ALIGN(0x20);
203        _rom_wifi_rom_end = .;
204        _rom_size_libwifi = _rom_wifi_rom_end - _rom_size_download;
205        KEEP(SORT(libbsp_base.o)(.text*))
206        _rom_bsp_rom_end = .;
207        _rom_size_libbsp = _rom_bsp_rom_end - _rom_wifi_rom_end;
208        KEEP(SORT(liblitekernel_base.o)(.text*))
209        _rom_kernel_rom_end = .;
210        _rom_size_kernel = _rom_kernel_rom_end - _rom_bsp_rom_end;
211        LIBGCC_ROM_FUN(KEEP_SORT_GCC_TEXT)
212        _rom_libgcc_end = .;
213        _rom_size_libgcc = _rom_libgcc_end - _rom_kernel_rom_end;
214        KEEP(SORT(libc_base.o)(.text*))
215        _rom_libc_rom_end = .;
216        _rom_size_libc = _rom_libc_rom_end - _rom_libgcc_end;
217        KEEP(SORT(libsec_base.o)(.text*))
218        _rom_sec_rom_end = .;
219        _rom_size_libsec = _rom_sec_rom_end - _rom_libc_rom_end;
220        __text_cache_end1_ = .;
221        KEEP(SORT(libwifi_base.o)(.rodata*))
222        KEEP(SORT(*)(.wifi.rom.rodata*))
223        . = ALIGN(0x4);
224        _rom_hi1131_wifi_rom_rodata_end = .;
225        _rom_size_rodata_wifi = _rom_hi1131_wifi_rom_rodata_end - _rom_sec_rom_end;
226        KEEP(SORT(libbsp_base.o)(.rodata*))
227        KEEP(SORT(*)(.bsp.rom.rodata))
228        _rom_libbsp_rom_rodata_end = .;
229        _rom_size_rodata_bsp = _rom_libbsp_rom_rodata_end - _rom_hi1131_wifi_rom_rodata_end;
230        KEEP(SORT(liblitekernel_base.o)(.rodata*))
231        _rom_litekenel_rom_rodata_end = .;
232        _rom_size_rodata_kernel = _rom_litekenel_rom_rodata_end - _rom_size_rodata_bsp;
233        LIBGCC_ROM_FUN(KEEP_SORT_GCC_RODATA)
234        _rom_libgcc_rodata_end = .;
235        _rom_size_rodata_libgcc = _rom_libgcc_rodata_end - _rom_litekenel_rom_rodata_end;
236        KEEP(SORT(libc_base.o)(.rodata*))
237        _rom_libcrom_rodata_end = .;
238        _rom_size_rodata_libc = _rom_libcrom_rodata_end - _rom_libgcc_rodata_end;
239        KEEP(SORT(libsec_base.o)(.rodata*))
240        _rom_libsec_rom_rodata_end = .;
241        _rom_size_rodata_sec = _rom_libsec_rom_rodata_end - _rom_libcrom_rodata_end;
242        __rom_text_end__ = .;
243    } > ROM_TEXT
244    __rom_text_size__ = __rom_text_end__ - __rom_text_begin__;
245
246    .data_rom0 : AT (ROM_DATA0_LMA)
247    {
248        . = ALIGN(0x20);
249        __rom_data0_begin__ = .;
250        KEEP(SORT(liblitekernel_base.o) (.data.kernel.rom*))
251        KEEP(SORT(*)(.bsp.rom.data0))
252        . = ALIGN(0x4);
253        __rom_data0_end__ = .;
254    } > ROM_DATA0
255    __rom_data0_size__ = __rom_data0_end__ - __rom_data0_begin__;
256    _rom_size_total = __rom_data0_size__ + __rom_text_size__;
257    __rom_data0_load = ROM_TEXT_VMA + ROM_TEXT_LEN;
258
259#if defined(CONFIG_FLASH_ENCRYPT_SUPPORT)
260    .crypto_ram_text : AT (RAM_CRYPTO_TEXT_LMA)
261    {
262        __crypto_ram_text_load = LOADADDR(.crypto_ram_text);
263        __crypto_ram_text_start = .;
264        . = ALIGN(0x20);
265        KEEP(*(.crypto.ram.text))
266        . = ALIGN(0x20);
267        __crypto_ram_text_end = .;
268    } > CRYPTO_RAM
269    __crypto_ram_text_size = __crypto_ram_text_end - __crypto_ram_text_start;
270#endif
271
272    .text_non_rom : AT (NON_ROM_TEXT_LMA)
273    {
274        . = ALIGN(0x20);
275        __text_cache_start2_ = .;
276        KEEP(*(.entry.text))
277        . = ALIGN(0x20);
278        #if defined(ROM_BIN_TEST)
279        . += TEST_OFFSET;
280        #endif
281        SORT(*)(.init*)
282        SORT(*)(.rom.text.patch)
283        SORT(*)(EXCLUDE_FILE(*libasm_flash.o) .text*)
284        /* temply add the following for hks. */
285        SORT(*)(EXCLUDE_FILE(*libasm_flash.o) .got*)
286        . = ALIGN(0x20);
287        __text_cache_end2_ = .;
288        SORT(*)(.rodata*)
289        . = ALIGN(0x20);
290        __text_rodata_end_ = .;
291        . = ALIGN(0x20);
292    } > NON_ROM_TEXT_REGION
293
294    /* zInit code and data - will be freed after init */
295    .zInit : AT (ADDR(.text_non_rom) + SIZEOF(.text_non_rom))
296    {
297       __zinitcall_bsp_start = .;
298       KEEP (*(.zinitcall.bsp0.init))
299       KEEP (*(.zinitcall.bsp1.init))
300       KEEP (*(.zinitcall.bsp2.init))
301       KEEP (*(.zinitcall.bsp3.init))
302       KEEP (*(.zinitcall.bsp4.init))
303       __zinitcall_bsp_end = .;
304       __zinitcall_device_start = .;
305       KEEP (*(.zinitcall.device0.init))
306       KEEP (*(.zinitcall.device1.init))
307       KEEP (*(.zinitcall.device2.init))
308       KEEP (*(.zinitcall.device3.init))
309       KEEP (*(.zinitcall.device4.init))
310       __zinitcall_device_end = .;
311       __zinitcall_core_start = .;
312       KEEP (*(.zinitcall.core0.init))
313       KEEP (*(.zinitcall.core1.init))
314       KEEP (*(.zinitcall.core2.init))
315       KEEP (*(.zinitcall.core3.init))
316       KEEP (*(.zinitcall.core4.init))
317       __zinitcall_core_end = .;
318       __zinitcall_sys_service_start = .;
319       KEEP (*(.zinitcall.sys.service0.init))
320       KEEP (*(.zinitcall.sys.service1.init))
321       KEEP (*(.zinitcall.sys.service2.init))
322       KEEP (*(.zinitcall.sys.service3.init))
323       KEEP (*(.zinitcall.sys.service4.init))
324       __zinitcall_sys_service_end = .;
325       __zinitcall_sys_feature_start = .;
326       KEEP (*(.zinitcall.sys.feature0.init))
327       KEEP (*(.zinitcall.sys.feature1.init))
328       KEEP (*(.zinitcall.sys.feature2.init))
329       KEEP (*(.zinitcall.sys.feature3.init))
330       KEEP (*(.zinitcall.sys.feature4.init))
331       __zinitcall_sys_feature_end = .;
332       __zinitcall_run_start = .;
333       KEEP (*(.zinitcall.run0.init))
334       KEEP (*(.zinitcall.run1.init))
335       KEEP (*(.zinitcall.run2.init))
336       KEEP (*(.zinitcall.run3.init))
337       KEEP (*(.zinitcall.run4.init))
338       __zinitcall_run_end = .;
339       __zinitcall_app_service_start = .;
340       KEEP (*(.zinitcall.app.service0.init))
341       KEEP (*(.zinitcall.app.service1.init))
342       KEEP (*(.zinitcall.app.service2.init))
343       KEEP (*(.zinitcall.app.service3.init))
344       KEEP (*(.zinitcall.app.service4.init))
345       __zinitcall_app_service_end = .;
346       __zinitcall_app_feature_start = .;
347       KEEP (*(.zinitcall.app.feature0.init))
348       KEEP (*(.zinitcall.app.feature1.init))
349       KEEP (*(.zinitcall.app.feature2.init))
350       KEEP (*(.zinitcall.app.feature3.init))
351       KEEP (*(.zinitcall.app.feature4.init))
352       __zinitcall_app_feature_end = .;
353       __zinitcall_test_start = .;
354       KEEP (*(.zinitcall.test0.init))
355       KEEP (*(.zinitcall.test1.init))
356       KEEP (*(.zinitcall.test2.init))
357       KEEP (*(.zinitcall.test3.init))
358       KEEP (*(.zinitcall.test4.init))
359       __zinitcall_test_end = .;
360       __zinitcall_exit_start = .;
361       KEEP (*(.zinitcall.exit0.init))
362       KEEP (*(.zinitcall.exit1.init))
363       KEEP (*(.zinitcall.exit2.init))
364       KEEP (*(.zinitcall.exit3.init))
365       KEEP (*(.zinitcall.exit4.init))
366       __zinitcall_exit_end = .;
367    } > NON_ROM_TEXT_REGION
368
369    .ram_text : AT (RAM_TEXT_LMA)
370    {
371        __ram_text_load = LOADADDR(.ram_text);
372        __ram_text_start = .;
373        . = ALIGN(0x20);
374        #if defined(ROM_BIN_TEST)
375        . += TEST_OFFSET;
376        #endif
377        #if defined(HI1131TEST)
378        KEEP(*(.trap_vector.text))
379        KEEP(*(.kernel.ram.text))
380        KEEP(*(.ram.kernel))
381        KEEP(*(.bsp.ram.text))
382        KEEP(SORT(libasm_flash.o)(.text*))
383        #else
384        SORT(*)(.trap_vector.text)
385        SORT(*)(.kernel.ram.text)
386        SORT(*)(.ram.kernel)
387        SORT(*)(.bsp.ram.text)
388        SORT(libasm_flash.o)(.text*)
389        #endif
390        . = ALIGN(0x20);
391        __ram_text_end = .;
392    } > RAM
393    __ram_text_size = __ram_text_end - __ram_text_start;
394
395    /* data section */
396    .data : AT (NON_ROM_DATA_LMA)
397    {
398#if defined(HI_ON_FLASH)
399        __data_load = LOADADDR(.data);
400#else
401        __data_load = LOADADDR(.data) - ORIGIN(FLASH) + ORIGIN(RAM);
402#endif
403       . = ALIGN(0x20);
404        __data_start = .;
405        #if defined(ROM_BIN_TEST)
406        . += TEST_OFFSET;
407        #endif
408        SORT(*)(EXCLUDE_FILE(*liblitekernel_base.o *libc_base.o *libsec_base.o *libwifi_base.o *libbsp_base.o) .data*)
409        SORT(*)(EXCLUDE_FILE(*.o) .wifi.rom.data*)
410        SORT(*)(EXCLUDE_FILE(*.o) .data.system.rom*)
411        SORT(*)(.rom.data.patch)
412        SORT(*)(.sdata*)
413        . = ALIGN(4);
414        INCLUDE system_config.ld
415        . = ALIGN(0x20);
416        __data_end = .;
417    } > RAM
418    __data_size = __data_end - __data_start;
419
420    .data_rom1 : AT (ROM_DATA1_LMA)
421    {
422#if defined(HI_ON_FLASH)
423        __rom_data1_load = LOADADDR(.data_rom1);
424#else
425        __rom_data1_load = LOADADDR(.data_rom1) - ORIGIN(FLASH) + ORIGIN(RAM);
426#endif
427        . = ALIGN(0x20);
428        __rom_data1_begin__ = .;
429        LIBGCC_ROM_FUN(KEEP_SORT_GCC_DATA)
430        KEEP(SORT(liblitekernel_base.o) (.data*))
431        KEEP(SORT(libbsp_base.o) (.data*))
432        KEEP(SORT(*)(.data.system.rom*))
433        KEEP(SORT(libc_base.o) (.data*))
434        KEEP(SORT(libsec_base.o) (.data*))
435        KEEP(SORT(libwifi_base.o) (.data*))
436        KEEP(SORT(*)(.wifi.rom.data*))
437        . = ALIGN(4);
438        __rom_data1_end__ = .;
439    } > ROM_DATA1
440    __rom_data1_size__ = __rom_data1_end__ - __rom_data1_begin__;
441
442    /* used for fpb remap table g_fpbRemap declaration in los_fpb.c */
443    .patch_bss (NOLOAD) :
444    {
445        __patch_bss_start = .;
446        KEEP(SORT(*)(.fpb.remap))
447        . = ALIGN(4);
448        __patch_bss_end__ = .;
449    } > PATCH_BSS
450
451    .bss_rom (NOLOAD) :
452    {
453        . = ALIGN(0x20);
454        __rom_bss_begin__ = .;
455        __global_pointer$ = .;
456        LIBGCC_ROM_FUN(KEEP_SORT_GCC_BSS)
457        KEEP(SORT(liblitekernel_base.o )(.bss*))
458        KEEP(SORT(libc_base.o)(.bss*))
459        KEEP(SORT(libsec_base.o)(.bss*))
460        KEEP(SORT(libbsp_base.o)(.bss*))
461        KEEP(SORT(libwifi_base.o) (.bss*))
462        KEEP(SORT(*)(.wifi.rom.bss*))
463        . = ALIGN(4);
464        __rom_bss_end__ = .;
465        /* ԭrom_bssδװ����������ӷ�rom bss(1568 byte:1.53K) */
466        SORT(*)(.extern.rom.bss*)
467        . = ALIGN(4);
468        __extern_rom_bss_end__ = .;
469    } > ROM_BSS
470    __rom_bss_size__ = __extern_rom_bss_end__ - __rom_bss_begin__;
471
472    /* rom_data_extern1 section */
473    .extern_rom_data1_bss (NOLOAD) :
474    {
475	   . = ALIGN(0x20);
476       __extern_rom_data1_bss_begin__ = .;
477        #if defined(ROM_BIN_TEST)
478        . += TEST_OFFSET;
479        #endif
480        SORT(*)(.extern.rom.data1.bss*)
481        . = ALIGN(4);
482        __extern_rom_data1_bss_end__ = .;
483    } > EXTERN_ROM_DATA1_BSS
484    __extern_rom_data1_bss_size__ = __extern_rom_data1_bss_end__ - __extern_rom_data1_bss_begin__;
485
486    __RAM_BEGIN__ = ORIGIN(RAM);
487    __RAM_SIZE__ = LENGTH(RAM);
488    __DOWNLOAD_IRQ_STACK = ORIGIN(ROM_BSS) - DOWNLOAD_STACK_SIZE; /* overlap with STACK*/
489    __DOWNLOAD_STACK_END = ORIGIN(ROM_BSS); /* relate to KERNEL_MALLOC_STAR_ADDR and KERNEL_MALLOC_END_ADDR */
490
491    /* bss section */
492#ifdef LOSCFG_DEBUG_KASAN
493    .bss (NOLOAD) : ALIGN(0x20)
494    {
495        . = ALIGN(0x20);
496        __bss_begin = .;
497        #if defined(ROM_BIN_TEST)
498        . += TEST_OFFSET;
499        #endif
500        SORT(*)(.bss*)
501        SORT(*)(.rom.bss.patch)
502        SORT(*)(.sbss*)
503        . = ALIGN(0x20);
504        __bss_end = .;
505    } > RAM_FPGA
506#else
507    .bss (NOLOAD) : ALIGN(0x20)
508    {
509        . = ALIGN(0x20);
510        __bss_begin = .;
511        #if defined(ROM_BIN_TEST)
512        . += TEST_OFFSET;
513        #endif
514        SORT(*)(.bss*)
515        SORT(*)(.rom.bss.patch)
516        SORT(*)(.sbss*)
517        . = ALIGN(0x20);
518        __bss_end = .;
519    } > RAM
520#endif
521    __bss_size__ = __bss_end - __bss_begin;
522
523    /* End of uninitialized data segment */
524    _end = .;
525#if (defined HI_BOARD_ASIC) || (!defined HI_ON_FLASH)
526    .heap (NOLOAD) :
527    {
528        . = ALIGN(64);
529        __HEAP_BEGIN__ = ABSOLUTE(.);
530    } > RAM
531    __HEAP_SIZE__  = (__RAM_BEGIN__ + __RAM_SIZE__) - __HEAP_BEGIN__;
532
533    .stack (NOLOAD) : ALIGN(0x20)
534    {
535        __SYSTEM_STACK_BEGIN__ = .;
536        . += STACK_SIZE;
537        __SYSTEM_STACK_END__ = .;
538        . = ALIGN(0x20);
539        __irq_stack_bottom = .;
540        . += IRQ_STACK_SIZE;
541        __irq_stack_top = .;
542	. = ALIGN(0x20);
543        __nmi_stack_bottom = .;
544        . += NMI_STACK_SIZE;
545        __nmi_stack_top = .;
546        . = ALIGN(0x20);
547        __exc_stack_bottom = .;
548        . += EXC_STACK_SIZE;
549        __exc_stack_top = .;
550    } > STACK
551    __SYSTEM_STACK_SIZE__ = __SYSTEM_STACK_END__ - __SYSTEM_STACK_BEGIN__;
552
553    .check_info (NOLOAD) :
554    {
555        __check_info_addr = .;
556        KEEP(SORT(*)(.lowpower.ram.bss*))
557    } > CHECK_INFO
558#else
559    .stack (NOLOAD) : ALIGN(0x20)
560    {
561        __SYSTEM_STACK_BEGIN__ = .;
562        . += STACK_SIZE;
563        __SYSTEM_STACK_END__ = .;
564        . = ALIGN(0x20);
565        __irq_stack_bottom = .;
566        . += IRQ_STACK_SIZE;
567        __irq_stack_top = .;
568        . = ALIGN(0x20);
569        __nmi_stack_bottom = .;
570        . += NMI_STACK_SIZE;
571        __nmi_stack_top = .;
572        __exc_stack_bottom = .;
573        . += EXC_STACK_SIZE;
574        __exc_stack_top = .;
575        . = ALIGN(0x20);
576    } > RAM_FPGA
577    __SYSTEM_STACK_SIZE__ = __SYSTEM_STACK_END__ - __SYSTEM_STACK_BEGIN__;
578
579    .heap (NOLOAD) :
580    {
581        . = ALIGN(64);
582        __HEAP_BEGIN__ = ABSOLUTE(.);
583    } > RAM_FPGA
584    __HEAP_SIZE__  = (RAM_FPGA_START + RAM_FPGA_LEN) - __HEAP_BEGIN__;
585
586    .check_info (NOLOAD) :
587    {
588        __check_info_addr = .;
589        KEEP(SORT(*)(.lowpower.ram.bss*))
590    } > CHECK_INFO
591#endif
592    __ram_start = RAM_START;
593    __ram_end = RAM_START + RAM_SIZE;
594    . = ALIGN(4);
595    end = . ;
596}
597
598