1/*
2 * Copyright (c) 2016 Cadence Design Systems, Inc.
3 * Copyright (c) 2017 Intel Corporation
4 * Copyright (c) 2024 Espressif Systems (Shanghai) Co., Ltd.
5 * SPDX-License-Identifier: Apache-2.0
6 */
7
8#include <zephyr/devicetree.h>
9#include <zephyr/linker/sections.h>
10#include <zephyr/linker/linker-defs.h>
11#include <zephyr/linker/linker-tool.h>
12
13#include "memory.h"
14
15/* User available SRAM memory segments */
16procpu_iram_end = USER_IRAM_END - APPCPU_SRAM_SIZE;
17procpu_iram_org = SRAM0_IRAM_START + SRAM0_CACHE_SIZE;
18procpu_iram_len = procpu_iram_end - procpu_iram_org;
19
20procpu_dram_end = SRAM2_DRAM_END;
21procpu_dram_org = SRAM2_DRAM_USER_START + CONFIG_ESP32_BT_RESERVE_DRAM;
22procpu_dram_len = SRAM2_DRAM_USER_SIZE - CONFIG_ESP32_BT_RESERVE_DRAM;
23
24user_dram_2_seg_org = SRAM1_DRAM_USER_START;
25user_dram_2_seg_len = SRAM1_USER_SIZE;
26
27/* Aliases */
28#define FLASH_CODE_REGION   irom0_0_seg
29#define RODATA_REGION       drom0_0_seg
30#define IRAM_REGION         iram0_0_seg
31#define DRAM_REGION         dram0_0_seg
32#define RAMABLE_REGION      dram0_0_seg
33#define ROMABLE_REGION      FLASH
34
35#undef GROUP_DATA_LINK_IN
36#define GROUP_DATA_LINK_IN(vregion, lregion) > vregion AT > lregion
37
38#undef GROUP_NOLOAD_LINK_IN
39#define GROUP_NOLOAD_LINK_IN(vregion, lregion) > vregion
40
41/* Flash segments (rodata and text) should be mapped in virtual address space by providing VMA.
42 * Executing directly from LMA is not possible. */
43#undef GROUP_ROM_LINK_IN
44#define GROUP_ROM_LINK_IN(vregion, lregion) > RODATA_REGION AT > lregion
45
46/* Make sure new sections have consistent alignment between input and output sections */
47#undef SECTION_DATA_PROLOGUE
48#define SECTION_DATA_PROLOGUE(name, options, align) name options : ALIGN_WITH_INPUT
49
50#undef SECTION_PROLOGUE
51#define SECTION_PROLOGUE SECTION_DATA_PROLOGUE
52
53MEMORY
54{
55#ifdef CONFIG_BOOTLOADER_MCUBOOT
56  mcuboot_hdr (R): org = 0x0,  len = 0x20
57  metadata (R):    org = 0x20, len = 0x20
58  FLASH (R):       org = 0x40, len = FLASH_SIZE - 0x40
59#else
60  /* Make safety margin in the FLASH memory size so the
61   * (esp_img_header + (n*esp_seg_headers)) would fit */
62  FLASH (R):       org = 0x0,  len = FLASH_SIZE - 0x100
63#endif /* CONFIG_BOOTLOADER_MCUBOOT */
64
65  iram0_0_seg(RX): org = procpu_iram_org, len = procpu_iram_len
66  dram0_0_seg(RW): org = procpu_dram_org, len = procpu_dram_len
67
68  irom0_0_seg(RX): org = IROM_SEG_ORG, len = IROM_SEG_LEN
69  drom0_0_seg(R):  org = DROM_SEG_ORG, len = DROM_SEG_LEN
70
71  rtc_iram_seg(RWX): org = 0x400c0000, len = 0x2000
72  rtc_slow_seg(RW):  org = 0x50000000, len = 0x1000
73
74#ifdef CONFIG_ESP_SPIRAM
75  ext_ram_seg(RW): org = 0x3f800000, len = CONFIG_ESP_SPIRAM_SIZE
76#endif /* CONFIG_ESP_SPIRAM */
77
78#ifdef CONFIG_GEN_ISR_TABLES
79  IDT_LIST(RW): org = 0x3ebfe010, len = 0x2000
80#endif /* CONFIG_GEN_ISR_TABLES */
81}
82
83/*  Default entry point:  */
84ENTRY(CONFIG_KERNEL_ENTRY)
85
86_rom_store_table = 0;
87
88PROVIDE(_memmap_vecbase_reset = 0x40000450);
89PROVIDE(_memmap_reset_vector = 0x40000400);
90
91_heap_sentry = SRAM2_DRAM_END;
92
93SECTIONS
94{
95#ifdef CONFIG_BOOTLOADER_MCUBOOT
96  /* Reserve space for MCUboot header in the binary */
97  .mcuboot_header :
98  {
99    QUAD(0x0)
100    QUAD(0x0)
101    QUAD(0x0)
102    QUAD(0x0)
103  } > mcuboot_hdr
104  .metadata :
105  {
106    /* 0. Magic byte for load header */
107    LONG(0xace637d3)
108
109    /* 1. Application entry point address */
110    KEEP(*(.entry_addr))
111
112    /* IRAM load:
113     * 2. Destination address (VMA) for IRAM region
114     * 3. Flash offset (LMA) for start of IRAM region
115     * 4. Size of IRAM region
116     */
117    LONG(ADDR(.iram0.vectors))
118    LONG(LOADADDR(.iram0.vectors))
119    LONG(LOADADDR(.iram0.text) + SIZEOF(.iram0.text) - LOADADDR(.iram0.vectors))
120
121    /* DRAM load:
122     * 5. Destination address (VMA) for DRAM region
123     * 6. Flash offset (LMA) for start of DRAM region
124     * 7. Size of DRAM region
125     */
126    LONG(ADDR(.dram0.data))
127    LONG(LOADADDR(.dram0.data))
128    LONG(LOADADDR(.dram0.end) + SIZEOF(.dram0.end) - LOADADDR(.dram0.data))
129  } > metadata
130#endif /* CONFIG_BOOTLOADER_MCUBOOT */
131
132  #include <zephyr/linker/rel-sections.ld>
133
134#ifdef CONFIG_LLEXT
135  #include <zephyr/linker/llext-sections.ld>
136#endif
137
138  /* --- RTC BEGIN --- */
139
140  /* RTC fast memory holds RTC wake stub code,
141   * including from any source file named rtc_wake_stub*.c
142   */
143  .rtc.text :
144  {
145    . = ALIGN(4);
146    *(.rtc.literal .rtc.text)
147    *rtc_wake_stub*.o(.literal .text .literal.* .text.*)
148  } GROUP_DATA_LINK_IN(rtc_iram_seg, ROMABLE_REGION)
149
150  /* RTC slow memory holds RTC wake stub
151   * data/rodata, including from any source file
152   * named rtc_wake_stub*.c
153   */
154  .rtc.data :
155  {
156    _rtc_data_start = ABSOLUTE(.);
157    *(.rtc.data)
158    *(.rtc.rodata)
159    *rtc_wake_stub*.o(.data .rodata .data.* .rodata.* .bss .bss.*)
160    _rtc_data_end = ABSOLUTE(.);
161  } GROUP_DATA_LINK_IN(rtc_slow_seg, ROMABLE_REGION)
162
163  /* RTC bss, from any source file named rtc_wake_stub*.c */
164  .rtc.bss (NOLOAD) :
165  {
166    _rtc_bss_start = ABSOLUTE(.);
167    *rtc_wake_stub*.o(.bss .bss.*)
168    *rtc_wake_stub*.o(COMMON)
169    _rtc_bss_end = ABSOLUTE(.);
170  } GROUP_LINK_IN(rtc_slow_seg)
171
172  /* This section located in RTC SLOW Memory area.
173   * It holds data marked with RTC_SLOW_ATTR attribute.
174   * See the file "esp_attr.h" for more information.
175   */
176  .rtc.force_slow :
177  {
178    . = ALIGN(4);
179    _rtc_force_slow_start = ABSOLUTE(.);
180    *(.rtc.force_slow .rtc.force_slow.*)
181    . = ALIGN(4) ;
182    _rtc_force_slow_end = ABSOLUTE(.);
183  } > rtc_slow_seg
184
185  /* Get size of rtc slow data */
186  _rtc_slow_length = (_rtc_force_slow_end - _rtc_data_start);
187
188  /* --- RTC END --- */
189
190  /* --- IRAM BEGIN --- */
191
192  .iram0.vectors : ALIGN(4)
193  {
194    /* Vectors go to IRAM */
195    _init_start = ABSOLUTE(.);
196    /* Vectors according to builds/RF-2015.2-win32/esp108_v1_2_s5_512int_2/config.html */
197    . = 0x0;
198    KEEP(*(.WindowVectors.text));
199    . = 0x180;
200    KEEP(*(.Level2InterruptVector.text));
201    . = 0x1c0;
202    KEEP(*(.Level3InterruptVector.text));
203    . = 0x200;
204    KEEP(*(.Level4InterruptVector.text));
205    . = 0x240;
206    KEEP(*(.Level5InterruptVector.text));
207    . = 0x280;
208    KEEP(*(.DebugExceptionVector.text));
209    . = 0x2c0;
210    KEEP(*(.NMIExceptionVector.text));
211    . = 0x300;
212    KEEP(*(.KernelExceptionVector.text));
213    . = 0x340;
214    KEEP(*(.UserExceptionVector.text));
215    . = 0x3C0;
216    KEEP(*(.DoubleExceptionVector.text));
217    . = 0x400;
218    *(.*Vector.literal)
219
220    *(.UserEnter.literal);
221    *(.UserEnter.text);
222    . = ALIGN (16);
223    *(.entry.text)
224    *(.init.literal)
225    *(.init)
226    _init_end = ABSOLUTE(.);
227    _iram_start = ABSOLUTE(.);
228  } GROUP_DATA_LINK_IN(IRAM_REGION, ROMABLE_REGION)
229
230  .iram0.text : ALIGN(4)
231  {
232    /* Code marked as running out of IRAM */
233    _iram_text_start = ABSOLUTE(.);
234    *(.iram1 .iram1.*)
235    *(.iram0.literal .iram.literal .iram.text.literal .iram0.text .iram.text)
236    *libarch__xtensa__core.a:(.literal .text .literal.* .text.*)
237    *libkernel.a:(.literal .text .literal.* .text.*)
238    *libgcc.a:lib2funcs.*(.literal .text .literal.* .text.*)
239    *libzephyr.a:windowspill_asm.*(.literal .text .literal.* .text.*)
240    *libzephyr.a:cbprintf_complete.*(.literal .text .literal.* .text.*)
241    *libzephyr.a:printk.*(.literal.printk .literal.vprintk .literal.char_out .text.printk .text.vprintk .text.char_out)
242    *libzephyr.a:log_noos.*(.literal .text .literal.* .text.*)
243    *libzephyr.a:log_core.*(.literal .text .literal.* .text.*)
244    *libzephyr.a:log_msg.*(.literal .text .literal.* .text.*)
245    *libzephyr.a:log_list.*(.literal .text .literal.* .text.*)
246    *libzephyr.a:log_output.*(.literal .text .literal.* .text.*)
247    *libzephyr.a:log_backend_uart.*(.literal .text .literal.* .text.*)
248    *libzephyr.a:loader.*(.literal .text .literal.* .text.*)
249    *libzephyr.a:flash_init.*(.literal .text .literal.* .text.*)
250    *libzephyr.a:soc_flash_init.*(.literal .text .literal.* .text.*)
251    *libzephyr.a:console_init.*(.literal .text .literal.* .text.*)
252    *libzephyr.a:soc_random.*(.literal .text .literal.* .text.*)
253    *libzephyr.a:soc_init.*(.literal .text .literal.* .text.*)
254    *libzephyr.a:hw_init.*(.literal .text .literal.* .text.*)
255    *libzephyr.a:rtc_*.*(.literal .text .literal.* .text.*)
256    *libzephyr.a:cpu_util.*(.literal .text .literal.* .text.*)
257    *libdrivers__flash.a:flash_esp32.*(.literal .text .literal.* .text.*)
258    *libdrivers__timer.a:xtensa_sys_timer.*(.literal .text .literal.* .text.*)
259    *libdrivers__console.a:uart_console.*(.literal.console_out .text.console_out)
260    *liblib__libc__picolib.a:abort.*(.literal .text .literal.* .text.*)
261    *liblib__libc__minimal.a:string.*(.literal .text .literal.* .text.*)
262    *liblib__libc__newlib.a:string.*(.literal .text .literal.* .text.*)
263    *libc.a:*(.literal .text .literal.* .text.*)
264    *libphy.a:( .phyiram .phyiram.*)
265    *libgcov.a:(.literal .text .literal.* .text.*)
266
267    /* [mapping:esp_psram] */
268    *libzephyr.a:mmu_psram_flash.*(.literal .literal.* .text .text.*)
269    *libzephyr.a:esp_psram_impl_quad.*(.literal .literal.* .text .text.*)
270
271    /* [mapping:hal] */
272    *libzephyr.a:mmu_hal.*(.literal .literal.* .text .text.*)
273    *libzephyr.a:cache_utils.*(.literal .text .literal.* .text.*)
274    *libzephyr.a:cache_esp32.*(.literal .text .literal.* .text.*)
275    *libzephyr.a:cache_hal_esp32.*(.literal .text .literal.* .text.*)
276    *libzephyr.a:ledc_hal_iram.*(.literal .literal.* .text .text.*)
277    *libzephyr.a:i2c_hal_iram.*(.literal .literal.* .text .text.*)
278    *libzephyr.a:wdt_hal_iram.*(.literal .literal.* .text .text.*)
279    *libzephyr.a:spi_flash_hal_iram.*(.literal .literal.* .text .text.*)
280    *libzephyr.a:spi_flash_encrypt_hal_iram.*(.literal .literal.* .text .text.*)
281
282    /* [mapping:soc] */
283    *libzephyr.a:lldesc.*(.literal .literal.* .text .text.*)
284
285    /* [mapping:log] */
286    *(.literal.esp_log_write .text.esp_log_write)
287    *(.literal.esp_log_timestamp .text.esp_log_timestamp)
288    *(.literal.esp_log_early_timestamp .text.esp_log_early_timestamp)
289    *(.literal.esp_log_impl_lock .text.esp_log_impl_lock)
290    *(.literal.esp_log_impl_lock_timeout .text.esp_log_impl_lock_timeout)
291    *(.literal.esp_log_impl_unlock .text.esp_log_impl_unlock)
292
293    /* [mapping:spi_flash] */
294    *libzephyr.a:spi_flash_chip_boya.*(.literal .literal.* .text .text.*)
295    *libzephyr.a:spi_flash_chip_gd.*(.literal .literal.* .text .text.*)
296    *libzephyr.a:spi_flash_chip_generic.*(.literal .literal.* .text .text.*)
297    *libzephyr.a:spi_flash_chip_issi.*(.literal .literal.* .text .text.*)
298    *libzephyr.a:spi_flash_chip_mxic.*(.literal .literal.* .text .text.*)
299    *libzephyr.a:spi_flash_chip_mxic_opi.*(.literal .literal.* .text .text.*)
300    *libzephyr.a:spi_flash_chip_th.*(.literal .literal.* .text .text.*)
301    *libzephyr.a:spi_flash_chip_winbond.*(.literal .literal.* .text .text.*)
302    *libzephyr.a:memspi_host_driver.*(.literal .literal.* .text .text.*)
303    *libzephyr.a:flash_brownout_hook.*(.literal .literal.* .text .text.*)
304    *libzephyr.a:spi_flash_wrap.*(.literal .literal.* .text .text.*)
305    *libzephyr.a:spi_flash_hpm_enable.*(.literal .literal.* .text .text.*)
306    *libzephyr.a:flash_ops.*(.literal .literal.* .text .text.*)
307
308    /* [mapping:esp_system] */
309    *libzephyr.a:esp_err.*(.literal .literal.* .text .text.*)
310    *(.literal.esp_system_abort .text.esp_system_abort)
311
312    /* [mapping:esp_hw_support] */
313    *(.literal.esp_cpu_stall .text.esp_cpu_stall)
314    *(.literal.esp_cpu_unstall .text.esp_cpu_unstall)
315    *(.literal.esp_cpu_reset .text.esp_cpu_reset)
316    *(.literal.esp_cpu_wait_for_intr .text.esp_cpu_wait_for_intr)
317    *(.literal.esp_cpu_compare_and_set .text.esp_cpu_compare_and_set)
318    *(.literal.esp_gpio_reserve_pins .text.esp_gpio_reserve_pins)
319    *(.literal.esp_gpio_is_pin_reserved .text.esp_gpio_is_pin_reserved)
320    *(.literal.rtc_vddsdio_get_config .text.rtc_vddsdio_get_config)
321    *(.literal.rtc_vddsdio_set_config .text.rtc_vddsdio_set_config)
322    *libzephyr.a:esp_memory_utils.*(.literal .literal.* .text .text.*)
323    *libzephyr.a:rtc_init.*(.literal .literal.* .text .text.*)
324    *libzephyr.a:rtc_clk.*(.literal .literal.* .text .text.*)
325    *libzephyr.a:rtc_clk_init.*(.literal .literal.* .text .text.*)
326    *libzephyr.a:rtc_sleep.*(.literal .literal.* .text .text.*)
327    *libzephyr.a:rtc_time.*(.literal .literal.* .text .text.*)
328    *libzephyr.a:systimer.*(.literal .literal.* .text .text.*)
329    *libzephyr.a:mspi_timing_config.*(.literal .literal.* .text .text.*)
330    *libzephyr.a:mspi_timing_tuning.*(.literal .literal.* .text .text.*)
331    *libzephyr.a:periph_ctrl.*(.literal .text .literal.* .text.*)
332    *(.literal.sar_periph_ctrl_power_enable .text.sar_periph_ctrl_power_enable)
333
334    *libzephyr.a:esp_system_chip.*(.literal.esp_system_abort .text.esp_system_abort)
335    *libzephyr.a:spi_hal_iram.*(.literal .literal.* .text .text.*)
336    *libzephyr.a:spi_slave_hal_iram.*(.literal .literal.* .text .text.*)
337    *libzephyr.a:flash_brownout_hook.*(.literal .literal.* .text .text.*)
338    *libzephyr.a:heap_caps_zephyr.*(.literal .literal.* .text .text.*)
339
340    /* [mapping:soc_pm] */
341    *(.literal.GPIO_HOLD_MASK .text.GPIO_HOLD_MASK)
342
343    /* [mapping:esp_rom] */
344    *libzephyr.a:esp_rom_spiflash.*(.literal .literal.* .text .text.*)
345    *libzephyr.a:esp_rom_systimer.*(.literal .literal.* .text .text.*)
346    *libzephyr.a:esp_rom_wdt.*(.literal .literal.* .text .text.*)
347    *libzephyr.a:esp_rom_efuse.*(.literal .literal.* .text .text.*)
348
349    /* [mapping:esp_mm] */
350    *libzephyr.a:esp_cache.*(.literal .literal.* .text .text.*)
351    *libzephyr.a:cache_esp32.*(.literal .literal.* .text .text.*)
352
353    *libzephyr.a:bootloader_soc.*(.literal .text .literal.* .text.*)
354    *libzephyr.a:bootloader_random*.*(.literal.bootloader_random_disable .text.bootloader_random_disable)
355    *libzephyr.a:bootloader_random*.*(.literal.bootloader_random_enable .text.bootloader_random_enable)
356
357#if defined(CONFIG_ESP32_WIFI_IRAM_OPT)
358    *libnet80211.a:( .wifi0iram  .wifi0iram.* .wifislpiram .wifislpiram.* .wifiextrairam .wifiextrairam.*)
359    *libpp.a:( .wifi0iram  .wifi0iram.* .wifislpiram .wifislpiram.* .wifiorslpiram .wifiorslpiram.* .wifiextrairam .wifiextrairam.*)
360
361    /* [mapping:esp_wifi] */
362    *(.literal.wifi_clock_enable_wrapper .text.wifi_clock_enable_wrapper)
363    *(.literal.wifi_clock_disable_wrapper .text.wifi_clock_disable_wrapper)
364
365    /* [mapping:esp_phy] */
366    *(.literal.esp_phy_enable .text.esp_phy_enable)
367    *(.literal.esp_phy_disable .text.esp_phy_disable)
368    *(.literal.esp_wifi_bt_power_domain_off .text.esp_wifi_bt_power_domain_off)
369#endif /* CONFIG_ESP32_WIFI_IRAM_OPT */
370
371#if defined(CONFIG_ESP32_WIFI_RX_IRAM_OPT)
372    *libnet80211.a:( .wifirxiram  .wifirxiram.* .wifislprxiram .wifislprxiram.*)
373    *libpp.a:( .wifirxiram  .wifirxiram.* .wifislprxiram .wifislprxiram.*)
374#endif /* CONFIG_ESP32_WIFI_RX_IRAM_OPT */
375
376    . = ALIGN(4);
377
378  } GROUP_DATA_LINK_IN(IRAM_REGION, ROMABLE_REGION)
379
380#ifdef CONFIG_ESP_SIMPLE_BOOT
381  .loader.text :
382  {
383    . =  ALIGN(4);
384    *libzephyr.a:bootloader_clock_init.*(.literal .text .literal.* .text.*)
385    *libzephyr.a:bootloader_wdt.*(.literal .text .literal.* .text.*)
386    *libzephyr.a:bootloader_flash.*(.literal .text .literal.* .text.*)
387    *libzephyr.a:bootloader_clock_loader.*(.literal .text .literal.* .text.*)
388    *libzephyr.a:bootloader_random.*(.literal .text .literal.* .text.*)
389    *libzephyr.a:bootloader_efuse.*(.literal .text .literal.* .text.*)
390    *libzephyr.a:bootloader_utility.*(.literal .text .literal.* .text.*)
391    *libzephyr.a:bootloader_sha.*(.literal .text .literal.* .text.*)
392    *libzephyr.a:bootloader_panic.*(.literal .text .literal.* .text.*)
393
394    *libzephyr.a:esp_image_format.*(.literal .text .literal.* .text.*)
395    *libzephyr.a:flash_encrypt.*(.literal .text .literal.* .text.*)
396    *libzephyr.a:flash_encryption_secure_features.*(.literal .text .literal.* .text.*)
397    *libzephyr.a:flash_partitions.*(.literal .text .literal.* .text.*)
398    *libzephyr.a:spi_flash_hal.*(.literal .literal.* .text .text.*)
399    *libzephyr.a:spi_flash_hal_common.*(.literal .literal.* .text .text.*)
400    *libzephyr.a:esp_flash_api.*(.literal .text .literal.* .text.*)
401    *libzephyr.a:esp_flash_spi_init.*(.literal .text .literal.* .text.*)
402
403    *libzephyr.a:secure_boot.*(.literal .text .literal.* .text.*)
404    *libzephyr.a:secure_boot_secure_features.*(.literal .text .literal.* .text.*)
405    *libzephyr.a:secure_boot_signatures_bootloader.*(.literal .text .literal.* .text.*)
406
407    *libzephyr.a:efuse_hal.*(.literal .text .literal.* .text.*)
408    *libzephyr.a:esp_efuse_table.*(.literal .text .literal.* .text.*)
409    *libzephyr.a:esp_efuse_fields.*(.literal .text .literal.* .text.*)
410    *libzephyr.a:esp_efuse_api.*(.literal .text .literal.* .text.*)
411    *libzephyr.a:esp_efuse_utility.*(.literal .text .literal.* .text.*)
412    *libzephyr.a:esp_efuse_api_key_esp32.*(.literal .text .literal.* .text.*)
413
414    *libzephyr.a:app_cpu_start.*(.literal .text .literal.* .text.*)
415    *libzephyr.a:mpu_hal.*(.literal .text .literal.* .text.*)
416    *libzephyr.a:cpu_region_protect.*(.literal .text .literal.* .text.*)
417
418    /* NOTE: to overcome the bug in esptool making Simple boot compatible image */
419    . += 16;
420    . = ALIGN(16);
421  } GROUP_DATA_LINK_IN(IRAM_REGION, ROMABLE_REGION)
422#endif /* CONFIG_ESP_SIMPLE_BOOT */
423
424  /* Marks the end of IRAM code segment */
425  .iram0.text_end (NOLOAD) :
426  {
427    /* ESP32 memprot requires 16B padding for possible CPU
428     * prefetch and 256B alignment for PMS split lines */
429    . += 16;
430    . = ALIGN(0x100);
431    _iram_text_end = ABSOLUTE(.);
432  } GROUP_LINK_IN(IRAM_REGION)
433
434  .iram0.data :
435  {
436    . = ALIGN(16);
437    *(.iram.data)
438    *(.iram.data*)
439  } GROUP_DATA_LINK_IN(IRAM_REGION, ROMABLE_REGION)
440
441  .iram0.bss (NOLOAD) :
442  {
443    . = ALIGN(16);
444    _iram_bss_start = ABSOLUTE(.);
445    *(.iram.bss)
446    *(.iram.bss.*)
447    _iram_bss_end = ABSOLUTE(.);
448
449    . = ALIGN(4);
450    _iram_end = ABSOLUTE(.);
451  } GROUP_LINK_IN(IRAM_REGION)
452
453  /* This symbol is here to check SRAM1 usage in case it is used for data too */
454  _iram_end_at_dram_addr = SRAM1_IRAM_DRAM_CALC(_iram_end);
455  _unallocated_iram_memory_size = ORIGIN(iram0_0_seg) + LENGTH(iram0_0_seg) - _iram_end;
456
457  ASSERT(((_iram_end - ORIGIN(iram0_0_seg)) <= LENGTH(iram0_0_seg)), "IRAM code does not fit.")
458
459  /* --- IRAM END --- */
460
461  /* --- DRAM BEGIN --- */
462
463  .dram0.data :
464  {
465    _dram_data_start = ABSOLUTE(.);
466    _data_start = ABSOLUTE(.);
467
468    _btdm_data_start = ABSOLUTE(.);
469    *libbtdm_app.a:(.data .data.*)
470    . = ALIGN (4);
471    _btdm_data_end = ABSOLUTE(.);
472
473    *(.data)
474    *(.data.*)
475    *(.gnu.linkonce.d.*)
476    *(.data1)
477    *(.sdata)
478    *(.sdata.*)
479    *(.gnu.linkonce.s.*)
480    *(.sdata2)
481    *(.sdata2.*)
482    *(.gnu.linkonce.s2.*)
483    /* rodata for panic handler(libarch__xtensa__core.a) and all
484     * dependent functions should be placed in DRAM to avoid issue
485     * when flash cache is disabled */
486    *libarch__xtensa__core.a:(.rodata .rodata.*)
487    *libkernel.a:fatal.*(.rodata .rodata.*)
488    *libkernel.a:init.*(.rodata .rodata.*)
489    *libzephyr.a:cbprintf_complete*(.rodata .rodata.*)
490    *libzephyr.a:log_core.*(.rodata .rodata.*)
491    *libzephyr.a:log_backend_uart.*(.rodata .rodata.*)
492    *libzephyr.a:log_output.*(.rodata .rodata.*)
493    *libzephyr.a:loader.*(.rodata .rodata.*)
494    *libzephyr.a:flash_init.*(.rodata .rodata.*)
495    *libzephyr.a:soc_flash_init.*(.rodata .rodata.*)
496    *libzephyr.a:console_init.*(.rodata .rodata.*)
497    *libzephyr.a:soc_random.*(.rodata .rodata.*)
498    *libzephyr.a:soc_init.*(.rodata .rodata.*)
499    *libzephyr.a:hw_init.*(.rodata .rodata.*)
500    *libdrivers__flash.a:flash_esp32.*(.rodata .rodata.*)
501    *libdrivers__serial.a:uart_esp32.*(.rodata .rodata.*)
502    *libzephyr.a:esp_memory_utils.*(.rodata .rodata.* .sdata2 .sdata2.* .srodata .srodata.*)
503
504    /* [mapping:esp_psram] */
505    *libzephyr.a:mmu_psram_flash.*(.rodata .rodata.*)
506    *libzephyr.a:esp_psram_impl_quad.*(.rodata .rodata.*)
507
508    /* [mapping:hal] */
509    *libzephyr.a:mmu_hal.*(.rodata .rodata.*)
510    *libzephyr.a:spi_flash_hal_iram.*(.rodata .rodata.*)
511    *libzephyr.a:spi_flash_encrypt_hal_iram.*(.rodata .rodata.*)
512    *libzephyr.a:cache_utils.*(.rodata .rodata.*)
513    *libzephyr.a:cache_esp32.*(.rodata .rodata.*)
514    *libzephyr.a:cache_hal_esp32.*(.rodata .rodata.*)
515    *libzephyr.a:ledc_hal_iram.*(.rodata .rodata.*)
516    *libzephyr.a:i2c_hal_iram.*(.rodata .rodata.*)
517    *libzephyr.a:wdt_hal_iram.*(.rodata .rodata.*)
518    *libzephyr.a:systimer_hal.*(.rodata .rodata.*)
519    *libzephyr.a:spi_flash_hal_gpspi.*(.rodata .rodata.*)
520
521    /* [mapping:soc] */
522    *libzephyr.a:lldesc.*(.rodata .rodata.*)
523
524    /* [mapping:log] */
525    *(.rodata.esp_log_write)
526    *(.rodata.esp_log_timestamp)
527    *(.rodata.esp_log_early_timestamp)
528    *(.rodata.esp_log_impl_lock)
529    *(.rodata.esp_log_impl_lock_timeout)
530    *(.rodata.esp_log_impl_unlock)
531
532    /* [mapping:spi_flash] */
533    *libzephyr.a:spi_flash_chip_boya.*(.rodata .rodata.* .sdata2 .sdata2.* .srodata .srodata.*)
534    *libzephyr.a:spi_flash_chip_gd.*(.rodata .rodata.* .sdata2 .sdata2.* .srodata .srodata.*)
535    *libzephyr.a:spi_flash_chip_generic.*(.rodata .rodata.* .sdata2 .sdata2.* .srodata .srodata.*)
536    *libzephyr.a:spi_flash_chip_issi.*(.rodata .rodata.* .sdata2 .sdata2.* .srodata .srodata.*)
537    *libzephyr.a:spi_flash_chip_mxic.*(.rodata .rodata.* .sdata2 .sdata2.* .srodata .srodata.*)
538    *libzephyr.a:spi_flash_chip_mxic_opi.*(.rodata .rodata.* .sdata2 .sdata2.* .srodata .srodata.*)
539    *libzephyr.a:spi_flash_chip_th.*(.rodata .rodata.* .sdata2 .sdata2.* .srodata .srodata.*)
540    *libzephyr.a:spi_flash_chip_winbond.*(.rodata .rodata.* .sdata2 .sdata2.* .srodata .srodata.*)
541    *libzephyr.a:memspi_host_driver.*(.rodata .rodata.*)
542    *libzephyr.a:flash_brownout_hook.*(.rodata .rodata.*)
543    *libzephyr.a:spi_flash_wrap.*(.rodata .rodata.*)
544    *libzephyr.a:spi_flash_hpm_enable.*(.rodata .rodata.*)
545    *libzephyr.a:flash_ops.*(.rodata .rodata.* .sdata2 .sdata2.* .srodata .srodata.*)
546
547    /* [mapping:esp_mm] */
548    *libzephyr.a:esp_cache.*(.rodata .rodata.*)
549
550    /* [mapping:esp_hw_support] */
551    *(.rodata.esp_cpu_stall)
552    *(.rodata.esp_cpu_unstall)
553    *(.rodata.esp_cpu_reset)
554    *(.rodata.esp_cpu_wait_for_intr)
555    *(.rodata.esp_cpu_compare_and_set)
556    *(.rodata.esp_gpio_reserve_pins)
557    *(.rodata.esp_gpio_is_pin_reserved)
558    *(.rodata.rtc_vddsdio_get_config)
559    *(.rodata.rtc_vddsdio_set_config)
560    *libzephyr.a:esp_memory_utils.*(.rodata .rodata.*)
561    *libzephyr.a:rtc_clk.*(.rodata .rodata.*)
562    *libzephyr.a:rtc_clk_init.*(.rodata .rodata.*)
563    *libzephyr.a:systimer.*(.rodata .rodata.*)
564    *libzephyr.a:mspi_timing_config.*(.rodata .rodata.*)
565    *libzephyr.a:mspi_timing_tuning.*(.rodata .rodata.*)
566    *(.rodata.sar_periph_ctrl_power_enable)
567
568    *libzephyr.a:cache_esp32.*(.rodata .rodata.* .sdata2 .sdata2.* .srodata .srodata.*)
569    *libzephyr.a:esp_cache.*(.rodata .rodata.* .sdata2 .sdata2.* .srodata .srodata.*)
570    *libzephyr.a:esp_err.*(.rodata .rodata.* .sdata2 .sdata2.* .srodata .srodata.*)
571    *libzephyr.a:i2c_hal_iram.*(.rodata .rodata.* .sdata2 .sdata2.* .srodata .srodata.*)
572    *libzephyr.a:ledc_hal_iram.*(.rodata .rodata.* .sdata2 .sdata2.* .srodata .srodata.*)
573    *libzephyr.a:mmu_hal.*(.rodata .rodata.* .sdata2 .sdata2.* .srodata .srodata.*)
574    *libzephyr.a:spi_flash_encrypt_hal_iram.*(.rodata .rodata.* .sdata2 .sdata2.* .srodata .srodata.*)
575    *libzephyr.a:spi_flash_hal.*(.rodata .rodata.* .sdata2 .sdata2.* .srodata .srodata.*)
576    *libzephyr.a:spi_flash_hal_iram.*(.rodata .rodata.* .sdata2 .sdata2.* .srodata .srodata.*)
577    *libzephyr.a:spi_flash_hal_common.*(.rodata .rodata.* .sdata2 .sdata2.* .srodata .srodata.*)
578    *libzephyr.a:spi_hal_iram.*(.rodata .rodata.* .sdata2 .sdata2.* .srodata .srodata.*)
579    *libzephyr.a:spi_slave_hal_iram.*(.rodata .rodata.* .sdata2 .sdata2.* .srodata .srodata.*)
580    *libzephyr.a:flash_brownout_hook.*(.rodata .rodata.* .sdata2 .sdata2.* .srodata .srodata.*)
581    *libzephyr.a:memspi_host_driver.*(.rodata .rodata.* .sdata2 .sdata2.* .srodata .srodata.*)
582    *libzephyr.a:spi_flash_wrap.*(.rodata .rodata.* .sdata2 .sdata2.* .srodata .srodata.*)
583    /* TODO: fix other socs */
584    *libzephyr.a:heap_caps_zephyr.*(.rodata .rodata.* .sdata2 .sdata2.* .srodata .srodata.*)
585
586    /* [mapping:esp_rom] */
587    *libzephyr.a:esp_rom_spiflash.*(.rodata .rodata.* .sdata2 .sdata2.* .srodata .srodata.*)
588    *libzephyr.a:esp_rom_systimer.*(.rodata .rodata.*)
589    *libzephyr.a:esp_rom_wdt.*(.rodata .rodata.*)
590    *libzephyr.a:esp_rom_efuse.*(.rodata .rodata.*)
591
592    KEEP(*(.jcr))
593    *(.dram1 .dram1.*)
594
595    . = ALIGN(4);
596    #include <snippets-rwdata.ld>
597    . = ALIGN(4);
598  } GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION)
599
600#ifdef CONFIG_ESP_SIMPLE_BOOT
601  .loader.data :
602  {
603    . = ALIGN(4);
604    _loader_data_start = ABSOLUTE(.);
605    *libzephyr.a:bootloader_esp32.*(.rodata .rodata.* .sdata2 .sdata2.* .srodata .srodata.*)
606    *libzephyr.a:bootloader_clock_init.*(.rodata .rodata.* .sdata2 .sdata2.* .srodata .srodata.*)
607    *libzephyr.a:bootloader_wdt.*(.rodata .rodata.* .sdata2 .sdata2.* .srodata .srodata.*)
608    *libzephyr.a:bootloader_flash.*(.rodata .rodata.* .sdata2 .sdata2.* .srodata .srodata.*)
609    *libzephyr.a:bootloader_efuse.*(.rodata .rodata.* .sdata2 .sdata2.* .srodata .srodata.*)
610
611    *libzephyr.a:cpu_util.*(.rodata .rodata.* .sdata2 .sdata2.* .srodata .srodata.*)
612    *libzephyr.a:clk.*(.rodata .rodata.* .sdata2 .sdata2.* .srodata .srodata.*)
613    *libzephyr.a:esp_clk.*(.rodata .rodata.* .sdata2 .sdata2.* .srodata .srodata.*)
614    *libzephyr.a:rtc_clk_init.*(.rodata .rodata.* .sdata2 .sdata2.* .srodata .srodata.*)
615    *libzephyr.a:rtc_time.*(.rodata .rodata.* .sdata2 .sdata2.* .srodata .srodata.*)
616    *libzephyr.a:efuse_hal.*(.rodata .rodata.* .sdata2 .sdata2.* .srodata .srodata.*)
617    *libzephyr.a:cpu_region_protect.*(.rodata .rodata.* .sdata2 .sdata2.* .srodata .srodata.*)
618
619    *libzephyr.a:periph_ctrl.*(.rodata .rodata.* .sdata2 .sdata2.* .srodata .srodata.*)
620
621    *libzephyr.a:esp_flash_api.*(.rodata .rodata.* .sdata2 .sdata2.* .srodata .srodata.*)
622    *libzephyr.a:esp_flash_spi_init.*(.rodata .rodata.* .sdata2 .sdata2.* .srodata .srodata.*)
623
624    . = ALIGN(4);
625    _loader_data_end = ABSOLUTE(.);
626  } GROUP_DATA_LINK_IN(DRAM_REGION, ROMABLE_REGION)
627#endif /* CONFIG_ESP_SIMPLE_BOOT */
628
629  #include <snippets-data-sections.ld>
630  #include <zephyr/linker/common-ram.ld>
631  #include <snippets-ram-sections.ld>
632  #include <zephyr/linker/cplusplus-ram.ld>
633
634  /* logging sections should be placed in RAM area to avoid flash cache disabled issues */
635  #pragma push_macro("GROUP_ROM_LINK_IN")
636  #undef GROUP_ROM_LINK_IN
637  #define GROUP_ROM_LINK_IN GROUP_DATA_LINK_IN
638  #include <zephyr/linker/common-rom/common-rom-logging.ld>
639  #pragma pop_macro("GROUP_ROM_LINK_IN")
640
641  .dram0.end :
642  {
643    __data_end = ABSOLUTE(.);
644    _data_end = ABSOLUTE(.);
645  } GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION)
646
647  /* Shared RAM */
648  .dram0.bss (NOLOAD) :
649  {
650    . = ALIGN (8);
651    _bss_start = ABSOLUTE(.); /* required by bluetooth library */
652    __bss_start = ABSOLUTE(.);
653
654    _btdm_bss_start = ABSOLUTE(.);
655    *libbtdm_app.a:(.bss .bss.* COMMON)
656    . = ALIGN (4);
657    _btdm_bss_end = ABSOLUTE(.);
658
659    /* Buffer for system heap should be placed in dram0_0_seg */
660    *libkernel.a:mempool.*(.noinit.kheap_buf__system_heap .noinit.*.kheap_buf__system_heap)
661
662    *(.dynsbss)
663    *(.sbss)
664    *(.sbss.*)
665    *(.gnu.linkonce.sb.*)
666    *(.scommon)
667    *(.sbss2)
668    *(.sbss2.*)
669    *(.gnu.linkonce.sb2.*)
670    *(.dynbss)
671    *(.bss)
672    *(.bss.*)
673    *(.share.mem)
674    *(.gnu.linkonce.b.*)
675    *(COMMON)
676    . = ALIGN (8);
677    __bss_end = ABSOLUTE(.);
678    _bss_end = ABSOLUTE(.);
679  } GROUP_LINK_IN(RAMABLE_REGION)
680
681  .dram0.noinit (NOLOAD) :
682  {
683    . = ALIGN (4);
684    __dram_noinit_start = ABSOLUTE(.);
685#ifdef CONFIG_ESP32_WIFI_NET_ALLOC_SPIRAM
686    *(EXCLUDE_FILE(
687      *libdrivers__wifi.a:*
688      *libsubsys__net__l2__ethernet.a:*
689      *libsubsys__net__lib__config.a:*
690      *libsubsys__net__ip.a:*
691      *libsubsys__net.a:* ) .noinit)
692    *(EXCLUDE_FILE(
693      *libdrivers__wifi.a:*
694      *libsubsys__net__l2__ethernet.a:*
695      *libsubsys__net__lib__config.a:*
696      *libsubsys__net__ip.a:*
697      *libsubsys__net.a:* ) .noinit.*)
698#else
699    *(.noinit)
700    *(.noinit.*)
701#endif /* CONFIG_ESP32_WIFI_NET_ALLOC_SPIRAM */
702    __dram_noinit_end = ABSOLUTE(.);
703    . = ALIGN (4);
704  } GROUP_LINK_IN(RAMABLE_REGION)
705
706  /* Provide total SRAM usage, including IRAM and DRAM */
707  _image_ram_start = _dram_data_start;
708  #include <zephyr/linker/ram-end.ld>
709  _image_ram_size += _iram_end - _init_start;
710
711  ASSERT(((_end - ORIGIN(dram0_0_seg)) <= LENGTH(dram0_0_seg)), "DRAM data does not fit.")
712
713  /* --- DRAM END --- */
714
715  /* --- SPIRAM BEGIN --- */
716
717#ifdef CONFIG_ESP_SPIRAM
718  .ext_ram.bss (NOLOAD):
719  {
720    _ext_ram_start = ABSOLUTE(.);
721    _ext_ram_noinit_start = ABSOLUTE(.);
722
723#ifdef CONFIG_ESP32_WIFI_NET_ALLOC_SPIRAM
724    *libdrivers__wifi.a:(.noinit .noinit.*)
725    *libsubsys__net__l2__ethernet.a:(.noinit .noinit.*)
726    *libsubsys__net__lib__config.a:(.noinit .noinit.*)
727    *libsubsys__net__ip.a:(.noinit .noinit.*)
728    *libsubsys__net.a:(.noinit .noinit.*)
729#endif /* CONFIG_ESP32_WIFI_NET_ALLOC_SPIRAM */
730    . = ALIGN(16);
731    _ext_ram_noinit_end = ABSOLUTE(.);
732
733    _ext_ram_bss_start = ABSOLUTE(.);
734    *(.ext_ram.bss*)
735    . = ALIGN(16);
736    _ext_ram_bss_end = ABSOLUTE(.);
737
738    _spiram_heap_start = ABSOLUTE(.);
739    . = . + CONFIG_ESP_SPIRAM_HEAP_SIZE;
740    . = ALIGN(4);
741
742    _ext_ram_end = ABSOLUTE(.);
743  } GROUP_LINK_IN(ext_ram_seg)
744#endif /* CONFIG_ESP_SPIRAM */
745
746  /* --- SPIRAM END --- */
747
748  /* --- RODATA BEGIN --- */
749
750  .flash.rodata_dummy (NOLOAD) :
751  {
752    . = ALIGN(CACHE_ALIGN);
753  } GROUP_LINK_IN(ROMABLE_REGION)
754
755  _image_drom_start = LOADADDR(.flash.rodata);
756  _image_drom_size = LOADADDR(.flash.rodata_end) - LOADADDR(.flash.rodata);
757  _image_drom_vaddr = ADDR(.flash.rodata);
758
759  .flash.rodata : ALIGN(CACHE_ALIGN)
760  {
761    _rodata_start = ABSOLUTE(.);
762    _rodata_reserved_start = ABSOLUTE(.);
763
764    . = ALIGN(4);
765    #include <snippets-rodata.ld>
766    . = ALIGN(4);
767
768    *(.rodata .rodata.* .sdata2 .sdata2.* .srodata .srodata.* )
769
770    _flash_rodata_start = ABSOLUTE(.);
771    __rodata_region_start = ABSOLUTE(.);
772
773    *(.irom1.text) /* catch stray ICACHE_RODATA_ATTR */
774    *(.gnu.linkonce.r.*)
775    *(.rodata1)
776    __XT_EXCEPTION_TABLE_ = ABSOLUTE(.);
777    *(.xt_except_table)
778    *(.gcc_except_table .gcc_except_table.*)
779    *(.gnu.linkonce.e.*)
780    *(.gnu.version_r)
781    . = (. + 3) & ~ 3;
782    __eh_frame = ABSOLUTE(.);
783    KEEP(*(.eh_frame))
784    . = (. + 7) & ~ 3;
785
786    /* C++ exception handlers table:  */
787    __XT_EXCEPTION_DESCS_ = ABSOLUTE(.);
788    *(.xt_except_desc)
789    *(.gnu.linkonce.h.*)
790    __XT_EXCEPTION_DESCS_END__ = ABSOLUTE(.);
791    *(.xt_except_desc_end)
792    *(.dynamic)
793    *(.gnu.version_d)
794    . = ALIGN(4);
795    __rodata_region_end = ABSOLUTE(.);
796    /* Literals are also RO data. */
797    _lit4_start = ABSOLUTE(.);
798    *(*.lit4)
799    *(.lit4.*)
800    *(.gnu.linkonce.lit4.*)
801    _lit4_end = ABSOLUTE(.);
802    . = ALIGN(4);
803
804    *(.rodata_wlog)
805    *(.rodata_wlog*)
806    . = ALIGN(4);
807  } GROUP_DATA_LINK_IN(RODATA_REGION, ROMABLE_REGION)
808
809  #include <zephyr/linker/cplusplus-rom.ld>
810  #include <zephyr/linker/common-rom/common-rom-init.ld>
811  #include <zephyr/linker/common-rom/common-rom-kernel-devices.ld>
812  #include <zephyr/linker/common-rom/common-rom-ztest.ld>
813  #include <zephyr/linker/common-rom/common-rom-net.ld>
814  #include <zephyr/linker/common-rom/common-rom-bt.ld>
815  #include <zephyr/linker/common-rom/common-rom-debug.ld>
816  #include <zephyr/linker/common-rom/common-rom-misc.ld>
817  #include <zephyr/linker/thread-local-storage.ld>
818  #include <snippets-sections.ld>
819
820  /* Create an explicit section at the end of all the data that shall be mapped into drom.
821   * This is used to calculate the size of the _image_drom_size variable */
822  .flash.rodata_end :
823  {
824    /* This is a symbol marking the flash.rodata end, this
825     * can be used for mmu driver to maintain virtual address
826     * We don't need to include the noload rodata in this section
827     */
828    . = ALIGN(CONFIG_MMU_PAGE_SIZE);
829
830    _rodata_end = ABSOLUTE(.);
831    _rodata_reserved_end = ABSOLUTE(.);
832  } GROUP_DATA_LINK_IN(RODATA_REGION, ROMABLE_REGION)
833
834  /* --- RODATA END --- */
835
836  /* --- FLASH TEXT BEGIN --- */
837
838  .flash.text_dummy (NOLOAD):
839  {
840    . = ALIGN(CACHE_ALIGN);
841  } GROUP_LINK_IN(ROMABLE_REGION)
842
843  _image_irom_start = LOADADDR(.flash.text);
844  _image_irom_size = LOADADDR(.flash.text) + SIZEOF(.flash.text) - _image_irom_start;
845  _image_irom_vaddr = ADDR(.flash.text);
846
847  .flash.text : ALIGN(CACHE_ALIGN)
848  {
849    _stext = .;
850    _instruction_reserved_start = ABSOLUTE(.);  /* This is a symbol marking the flash.text start, this can be used for mmu driver to maintain virtual address */
851    _text_start = ABSOLUTE(.);
852    __text_region_start = ABSOLUTE(.);
853    __rom_region_start = ABSOLUTE(.);
854
855#ifndef CONFIG_ESP32_WIFI_IRAM_OPT
856    *libnet80211.a:( .wifi0iram  .wifi0iram.* .wifislpiram .wifislpiram.* .wifiextrairam .wifiextrairam.*)
857    *libpp.a:( .wifi0iram  .wifi0iram.* .wifislpiram .wifislpiram.* .wifiorslpiram .wifiorslpiram.* .wifiextrairam .wifiextrairam.*)
858#endif
859
860#ifndef CONFIG_ESP32_WIFI_RX_IRAM_OPT
861    *libnet80211.a:( .wifirxiram  .wifirxiram.* .wifislprxiram .wifislprxiram.*)
862    *libpp.a:( .wifirxiram  .wifirxiram.* .wifislprxiram .wifislprxiram.*)
863#endif
864
865    *(.fini.literal)
866    *(.fini)
867
868    *(.literal .text .literal.* .text.*)
869    . = ALIGN(4);
870    _text_end = ABSOLUTE(.);
871    _instruction_reserved_end = ABSOLUTE(.);  /* This is a symbol marking the flash.text end, this can be used for mmu driver to maintain virtual address */
872    __text_region_end = ABSOLUTE(.);
873    __rom_region_end = ABSOLUTE(.);
874    _etext = .;
875  } GROUP_DATA_LINK_IN(FLASH_CODE_REGION, ROMABLE_REGION)
876
877  /* --- FLASH TEXT END --- */
878
879  /* --- XTENSA GLUE AND DEBUG BEGIN --- */
880
881#include <zephyr/linker/debug-sections.ld>
882
883  .xtensa.info  0 :  { *(.xtensa.info) }
884  .xt.insn 0 :
885  {
886    KEEP (*(.xt.insn))
887    KEEP (*(.gnu.linkonce.x.*))
888  }
889  .xt.prop 0 :
890  {
891    KEEP (*(.xt.prop))
892    KEEP (*(.xt.prop.*))
893    KEEP (*(.gnu.linkonce.prop.*))
894  }
895  .xt.lit 0 :
896  {
897    KEEP (*(.xt.lit))
898    KEEP (*(.xt.lit.*))
899    KEEP (*(.gnu.linkonce.p.*))
900  }
901  .xt.profile_range 0 :
902  {
903    KEEP (*(.xt.profile_range))
904    KEEP (*(.gnu.linkonce.profile_range.*))
905  }
906  .xt.profile_ranges 0 :
907  {
908    KEEP (*(.xt.profile_ranges))
909    KEEP (*(.gnu.linkonce.xt.profile_ranges.*))
910  }
911  .xt.profile_files 0 :
912  {
913    KEEP (*(.xt.profile_files))
914    KEEP (*(.gnu.linkonce.xt.profile_files.*))
915  }
916
917#ifdef CONFIG_GEN_ISR_TABLES
918#include <zephyr/linker/intlist.ld>
919#endif
920
921}
922
923  /* --- XTENSA GLUE AND DEBUG END --- */
924
925#ifdef CONFIG_ESP_SPIRAM
926ASSERT(((_ext_ram_end - _ext_ram_start) <= CONFIG_ESP_SPIRAM_SIZE),
927          "External SPIRAM overflowed.")
928#endif /* CONFIG_ESP_SPIRAM */
929