1/*
2 * Copyright (c) 2022 Intel Corporation
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7/**
8 * @file
9 * @brief Linker command/script file
10 *
11 * Linker script for the intel_apl_adsp platform
12 */
13
14OUTPUT_ARCH(xtensa)
15
16#include <zephyr/devicetree.h>
17#include <xtensa/config/core-isa.h>
18#include <zephyr/linker/sections.h>
19#include <adsp-vectors.h>
20#include <adsp_memory.h>
21
22#include <zephyr/linker/linker-defs.h>
23#include <zephyr/linker/linker-tool.h>
24
25ENTRY(rom_entry);
26
27/* DSP RAM regions (all of them) are mapped twice on the DSP.  One
28 * mapping is set up to bypass the L1 cache, so it must be used when
29 * multiprocessor coherence is desired, where the latter mapping is
30 * best used for processor-local data (e.g. stacks) or shared data
31 * that is managed with explicit cache flush/invalidate operations.
32 *
33 * These macros will set up a segment start address correctly,
34 * including alignment to a cache line.  Be sure to also emit the
35 * section to ">ram" or ">ucram" as appropriate, to prevent the linker
36 * from filling in 512MB of sparse zeros.
37 */
38#ifdef CONFIG_KERNEL_COHERENCE
39#define RPO_SET(addr, reg) ((addr & 0x1fffffff) | (reg << 29))
40#ifdef CONFIG_MMU
41#define SEGSTART_CACHED   RPO_SET(ALIGN(CONFIG_MMU_PAGE_SIZE), CONFIG_XTENSA_CACHED_REGION)
42#define SEGSTART_UNCACHED RPO_SET(ALIGN(CONFIG_MMU_PAGE_SIZE), CONFIG_XTENSA_UNCACHED_REGION)
43#else
44#define SEGSTART_CACHED   RPO_SET(ALIGN(64), CONFIG_XTENSA_CACHED_REGION)
45#define SEGSTART_UNCACHED RPO_SET(ALIGN(64), CONFIG_XTENSA_UNCACHED_REGION)
46#endif
47#else
48#ifdef CONFIG_MMU
49#define SEGSTART_CACHED   ALIGN(CONFIG_MMU_PAGE_SIZE)
50#define SEGSTART_UNCACHED ALIGN(CONFIG_MMU_PAGE_SIZE)
51#else
52#define SEGSTART_CACHED   .
53#define SEGSTART_UNCACHED .
54#endif
55#define ucram ram
56#endif
57
58/* intlist.ld needs an IDT_LIST memory region */
59#define IDT_BASE 0xe0000000
60#define IDT_SIZE 0x2000
61
62/* rimage module sections are C struct data, and thus flagged ALLOC.
63 * The xcc linker demands they be in a declared memory region even if
64 * the enclosing output section is (NOLOAD).  Put them here.
65 */
66#define NOLOAD_BASE 0x20000
67#define NOLOAD_SIZE 0x100000
68
69#ifdef CONFIG_MMU
70#define MMU_PAGE_ALIGN . = ALIGN(CONFIG_MMU_PAGE_SIZE);
71#define HDR_MMU_PAGE_ALIGN ALIGN(CONFIG_MMU_PAGE_SIZE)
72#define HDR_4K_OR_MMU_PAGE_ALIGN ALIGN(CONFIG_MMU_PAGE_SIZE)
73#else
74#define MMU_PAGE_ALIGN
75#define HDR_MMU_PAGE_ALIGN
76#define HDR_4K_OR_MMU_PAGE_ALIGN ALIGN(4096)
77#endif
78
79#define SMEM_PARTITION_ALIGN(size) MMU_PAGE_ALIGN
80
81MEMORY {
82  vector_base_text :
83	org = VECBASE_RESET_PADDR_SRAM,
84        len = MEM_VECBASE_LIT_SIZE
85  vector_int2_lit :
86	org = INTLEVEL2_VECTOR_PADDR_SRAM - MEM_VECT_LIT_SIZE,
87        len = MEM_VECT_LIT_SIZE
88  vector_int2_text :
89        org = INTLEVEL2_VECTOR_PADDR_SRAM,
90        len = MEM_VECT_TEXT_SIZE
91  vector_int3_lit :
92	org = INTLEVEL3_VECTOR_PADDR_SRAM - MEM_VECT_LIT_SIZE,
93        len = MEM_VECT_LIT_SIZE
94  vector_int3_text :
95	org = INTLEVEL3_VECTOR_PADDR_SRAM,
96        len = MEM_VECT_TEXT_SIZE
97  vector_int4_lit :
98	org = INTLEVEL4_VECTOR_PADDR_SRAM - MEM_VECT_LIT_SIZE,
99        len = MEM_VECT_LIT_SIZE
100  vector_int4_text :
101	org = INTLEVEL4_VECTOR_PADDR_SRAM,
102        len = MEM_VECT_TEXT_SIZE
103  vector_int7_lit :
104	org = INTLEVEL7_VECTOR_PADDR_SRAM - MEM_VECT_LIT_SIZE,
105        len = MEM_VECT_LIT_SIZE
106  vector_int7_text :
107	org = INTLEVEL7_VECTOR_PADDR_SRAM,
108        len = MEM_VECT_TEXT_SIZE
109  vector_kernel_lit :
110	org = KERNEL_VECTOR_PADDR_SRAM - MEM_VECT_LIT_SIZE,
111        len = MEM_VECT_LIT_SIZE
112  vector_kernel_text :
113	org = KERNEL_VECTOR_PADDR_SRAM,
114        len = MEM_VECT_TEXT_SIZE
115  vector_user_lit :
116	org = USER_VECTOR_PADDR_SRAM - MEM_VECT_LIT_SIZE,
117        len = MEM_VECT_LIT_SIZE
118  vector_user_text :
119	org = USER_VECTOR_PADDR_SRAM,
120        len = MEM_VECT_TEXT_SIZE
121  vector_double_lit :
122	org = DOUBLEEXC_VECTOR_PADDR_SRAM - MEM_VECT_LIT_SIZE,
123        len = MEM_VECT_LIT_SIZE
124  vector_double_text :
125	org = DOUBLEEXC_VECTOR_PADDR_SRAM,
126        len = MEM_VECT_TEXT_SIZE
127#ifdef CONFIG_XTENSA_MMU
128  xtensa_vector_code :
129	org = DOUBLEEXC_VECTOR_PADDR_SRAM + MEM_VECT_TEXT_SIZE,
130	len = RAM_BASE - (DOUBLEEXC_VECTOR_PADDR_SRAM + MEM_VECT_TEXT_SIZE)
131#endif
132  imr :
133        org = IMR_BOOT_LDR_TEXT_ENTRY_BASE,
134        len = 0x100000
135  ram :
136	org = RAM_BASE,
137	len = RAM_SIZE
138#ifdef CONFIG_KERNEL_COHERENCE
139  ucram :
140	org = RPO_SET(RAM_BASE, CONFIG_XTENSA_UNCACHED_REGION),
141	len = RAM_SIZE
142#endif
143#ifdef CONFIG_GEN_ISR_TABLES
144  IDT_LIST :
145	org = IDT_BASE,
146	len = IDT_SIZE
147#endif
148  lpram :
149	org = LP_SRAM_BASE,
150	len = LP_SRAM_SIZE
151  noload :
152        org = NOLOAD_BASE,
153        len = NOLOAD_SIZE
154}
155
156SECTIONS {
157
158  /* Boot loader code in IMR memory */
159  .imr : {
160    _imr_start = .;
161    /* Entry point MUST be here per external configuration */
162    KEEP (*(.boot_entry.text))
163    *(.imr .imr.*)
164  } >imr
165
166  /* Boot loader data.  Note that rimage seems to want this
167   * page-aligned or it will throw an error, not sure why since all
168   * the ROM cares about is a contiguous region.  And it's
169   * particularly infuriating as it precludes linker .rodata next to
170   * .text.
171   */
172  .imrdata : ALIGN(4096) {
173    *(.imrdata .imrdata.*)
174  } >imr
175
176  /* Cold code in IMR memory */
177  .cold : ALIGN(4096) {
178    __cold_start = .;
179    *(.cold .cold.* )
180    __cold_end = .;
181  } >imr
182
183  /* Cold data. */
184  .coldrodata : ALIGN(4096) {
185    __coldrodata_start = .;
186    *(.coldrodata .coldrodata.*)
187    _imr_end = .;
188  } >imr
189
190   .WindowVectors.text : {
191    _WindowVectors_text_start = .;
192    KEEP (*(.WindowVectors.text))
193    _WindowVectors_text_end = .;
194  } >vector_base_text
195  .Level2InterruptVector.literal : {
196    _Level2InterruptVector_literal_start = .;
197    *(.Level2InterruptVector.literal)
198    _Level2InterruptVector_literal_end = .;
199  } >vector_int2_lit
200  .Level2InterruptVector.text : {
201    _Level2InterruptVector_text_start = .;
202    KEEP (*(.Level2InterruptVector.text))
203    _Level2InterruptVector_text_end = .;
204  } >vector_int2_text
205  .Level3InterruptVector.literal : {
206    _Level3InterruptVector_literal_start = .;
207    *(.Level3InterruptVector.literal)
208    _Level3InterruptVector_literal_end = .;
209  } >vector_int3_lit
210  .Level3InterruptVector.text : {
211    _Level3InterruptVector_text_start = .;
212    KEEP (*(.Level3InterruptVector.text))
213    _Level3InterruptVector_text_end = .;
214  } >vector_int3_text
215  .Level4InterruptVector.literal : {
216    _Level4InterruptVector_literal_start = .;
217    *(.Level4InterruptVector.literal)
218    _Level4InterruptVector_literal_end = .;
219  } >vector_int4_lit
220  .Level4InterruptVector.text : {
221    _Level4InterruptVector_text_start = .;
222    KEEP (*(.Level4InterruptVector.text))
223    _Level4InterruptVector_text_end = .;
224  } >vector_int4_text
225  .DebugExceptionVector.literal : {
226    _DebugExceptionVector_literal_start = .;
227    *(.DebugExceptionVector.literal)
228    _DebugExceptionVector_literal_end = .;
229  } >vector_int4_lit
230  .DebugExceptionVector.text : {
231    _DebugExceptionVector_text_start = .;
232    KEEP (*(.DebugExceptionVector.text))
233    _DebugExceptionVector_text_end = .;
234  } >vector_int4_text
235  .NMIExceptionVector.literal : {
236    _NMIExceptionVector_literal_start = .;
237    *(.NMIExceptionVector.literal)
238    _NMIExceptionVector_literal_end = .;
239  } >vector_int7_lit
240  .NMIExceptionVector.text : {
241    _NMIExceptionVector_text_start = .;
242    KEEP (*(.NMIExceptionVector.text))
243    _NMIExceptionVector_text_end = .;
244  } >vector_int7_text
245  .KernelExceptionVector.literal : {
246    _KernelExceptionVector_literal_start = .;
247    *(.KernelExceptionVector.literal)
248    _KernelExceptionVector_literal_end = .;
249  } >vector_kernel_lit
250  .KernelExceptionVector.text : {
251    _KernelExceptionVector_text_start = .;
252    KEEP (*(.KernelExceptionVector.text))
253    _KernelExceptionVector_text_end = .;
254  } >vector_kernel_text
255  .UserExceptionVector.literal : {
256    _UserExceptionVector_literal_start = .;
257    *(.UserExceptionVector.literal)
258    _UserExceptionVector_literal_end = .;
259  } >vector_user_lit
260  .UserExceptionVector.text : {
261    _UserExceptionVector_text_start = .;
262    KEEP (*(.UserExceptionVector.text))
263    _UserExceptionVector_text_end = .;
264  } >vector_user_text
265  .DoubleExceptionVector.literal : {
266    _DoubleExceptionVector_literal_start = .;
267    *(.DoubleExceptionVector.literal)
268    _DoubleExceptionVector_literal_end = .;
269  } >vector_double_lit
270  .DoubleExceptionVector.text : {
271    _DoubleExceptionVector_text_start = .;
272    KEEP (*(.DoubleExceptionVector.text))
273    _DoubleExceptionVector_text_end = .;
274  } >vector_double_text
275
276#ifdef CONFIG_XTENSA_MMU
277  .xtensa_vector_code : {
278    /* There is not much space between .DoubleExceptionVector
279     * and the beginning of .text. So need to be careful on
280     * what to put in this section. It would mostly be things
281     * that are required to handle exceptions and interrupts.
282     * Also things we want to avoid TLB misses during exception
283     * handling.
284     */
285
286    *libarch__xtensa__core.a:xtensa_asm2_util.S.obj(.literal)
287    *libarch__xtensa__core.a:xtensa_asm2_util.S.obj(.iram.text)
288    *libarch__xtensa__core.a:xtensa_asm2_util.S.obj(.text)
289
290    *libarch__xtensa__core.a:window_vectors.S.obj(.iram.text)
291
292    /* For _Level1Vector */
293    *libarch__xtensa__core.a:vector_handlers_util.S.obj(.iram0.text)
294
295    *libarch__xtensa__core.a:vector_handlers.c.obj(.literal.xtensa_int?_c)
296    *libarch__xtensa__core.a:vector_handlers.c.obj(.text.xtensa_int?_c)
297
298    *libarch__xtensa__core.a:userspace.S.obj(.literal.xtensa_do_syscall)
299    *libarch__xtensa__core.a:userspace.S.obj(.text.xtensa_do_syscall)
300
301#ifdef CONFIG_XTENSA_SYSCALL_USE_HELPER
302    *libarch__xtensa__core.a:syscall_helper.c.obj(.text.xtensa_syscall_helper*)
303#endif /* CONFIG_XTENSA_SYSCALL_USE_HELPER */
304
305  } > xtensa_vector_code
306#endif /* CONFIG_XTENSA_MMU */
307
308  .text : HDR_MMU_PAGE_ALIGN
309  {
310    __text_region_start = .;
311    _image_ram_start = .;
312    z_mapped_start = .;
313    *(.iram1 .iram1.*)
314    *(.entry.text)
315    *(.init.literal)
316    *(.iram0.text)
317
318#ifdef CONFIG_XTENSA_MMU
319    /*
320     * The C handle blows up in size significantly when logging is enabled.
321     * So we can't keep this in .xtensa_vector_code above. Though we try to
322     * leep these close enough that, hopefully, we can avoid TLB misses.
323     */
324    *libarch__xtensa__core.a:vector_handlers.c.obj(.literal.xtensa_excint1_c)
325    *libarch__xtensa__core.a:vector_handlers.c.obj(.text.xtensa_excint1_c)
326
327    /*
328     * Experiment shows that system would not boot if this is away from
329     * VECBASE more than a few pages. So workaround the issue by putting
330     * xtensa_mmu_init() here.
331     */
332    *libarch__xtensa__core.a:ptables.c.obj(.literal.xtensa_mmu_init)
333    *libarch__xtensa__core.a:ptables.c.obj(.text.xtensa_mmu_init)
334#endif
335
336    KEEP(*(.init))
337    KEEP(*(.lps_vector))
338    *(.stub .gnu.warning .gnu.linkonce.literal.* .gnu.linkonce.t.*.literal .gnu.linkonce.t.*)
339    MMU_PAGE_ALIGN
340    *(.literal .text)
341    *(.literal.* .text.*)
342    *(.fini.literal)
343    KEEP(*(.fini))
344    *(.gnu.version)
345#include <zephyr/linker/kobject-text.ld>
346    MMU_PAGE_ALIGN
347    __text_region_end = .;
348  } >ram
349
350  .rodata : HDR_4K_OR_MMU_PAGE_ALIGN
351  {
352    __rodata_region_start = .;
353    *(.rodata)
354    *(.rodata.*)
355    *(.gnu.linkonce.r.*)
356    *(.rodata1)
357
358    . = ALIGN(4);
359    #include <snippets-rodata.ld>
360    #include <zephyr/linker/kobject-rom.ld>
361
362    __XT_EXCEPTION_TABLE__ = .;
363    KEEP (*(.xt_except_table))
364    KEEP (*(.gcc_except_table .gcc_except_table.*))
365    *(.gnu.linkonce.e.*)
366    *(.gnu.version_r)
367    KEEP (*(.eh_frame))
368    KEEP (*crtbegin.o(.ctors))
369    KEEP (*crtbegin.o(.dtors))
370    KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))
371    KEEP (*(SORT(.dtors.*)))
372    KEEP (*(.dtors))
373    __XT_EXCEPTION_DESCS__ = .;
374    *(.xt_except_desc)
375    *(.gnu.linkonce.h.*)
376    __XT_EXCEPTION_DESCS_END__ = .;
377    *(.xt_except_desc_end)
378    *(.dynamic)
379    *(.gnu.version_d)
380    _bss_table_start = .;
381    LONG(_bss_start)
382    LONG(_bss_end)
383    _bss_table_end = .;
384    MMU_PAGE_ALIGN
385  } >ram
386
387  .module_init : HDR_MMU_PAGE_ALIGN {
388    _module_init_start = .;
389    *(*.initcall)
390    _module_init_end = .;
391  } >ram
392
393#define RAMABLE_REGION ram
394#define ROMABLE_REGION ram
395
396  __common_rom_region_start = SEGSTART_CACHED;
397#include <zephyr/linker/common-rom.ld>
398/* Located in generated directory. This file is populated by calling
399 * zephyr_linker_sources(ROM_SECTIONS ...). Useful for grouping iterable RO structs.
400 */
401#include <snippets-rom-sections.ld>
402   __rodata_region_end = .;
403  __common_rom_region_end = .;
404    __rodata_region_end = .;
405
406  .noinit SEGSTART_UNCACHED : HDR_MMU_PAGE_ALIGN {
407    __data_start = .;
408    *(.noinit)
409    *(.noinit.*)
410  } >ucram
411
412#include <zephyr/linker/kobject-priv-stacks.ld>
413    . = SEGSTART_UNCACHED;
414
415  .data SEGSTART_UNCACHED : HDR_MMU_PAGE_ALIGN {
416    *(.data)
417    *(.data.*)
418    *(.gnu.linkonce.d.*)
419    KEEP(*(.gnu.linkonce.d.*personality*))
420    *(.data1)
421    *(.sdata)
422    *(.sdata.*)
423    *(.gnu.linkonce.s.*)
424    *(.sdata2)
425    *(.sdata2.*)
426    *(.gnu.linkonce.s2.*)
427    KEEP(*(.jcr))
428    _trace_ctx_start = ABSOLUTE(.);
429    *(.trace_ctx)
430    _trace_ctx_end = ABSOLUTE(.);
431    *(.gna_model)
432    __data_end = .;
433    MMU_PAGE_ALIGN
434  } >ucram
435
436  .lit4 SEGSTART_CACHED : {
437    _lit4_start = .;
438    *(*.lit4)
439    *(.lit4.*)
440    *(.gnu.linkonce.lit4.*)
441    _lit4_end = .;
442  } >ram
443
444/* These values need to change in our scheme, where the common-ram
445 * sections need to be linked in safe/uncached memory but common-rom
446 * wants to use the cache
447 */
448. = SEGSTART_UNCACHED;
449#undef RAMABLE_REGION
450#undef ROMABLE_REGION
451#define RAMABLE_REGION ucram
452#define ROMABLE_REGION ucram
453
454  .fw_ready SEGSTART_UNCACHED : {
455    KEEP(*(".fw_ready"));
456    KEEP (*(.fw_ready_metadata))
457  } > ucram
458
459  __common_ram_region_start = .;
460
461#ifdef CONFIG_USERSPACE
462
463#define APP_SHARED_ALIGN MMU_PAGE_ALIGN
464#define EMPTY_APP_SHARED_ALIGN APP_SHARED_ALIGN
465
466	/* APP SHARED MEMORY REGION */
467#include <app_smem.ld>
468	_app_smem_size = _app_smem_end - _app_smem_start;
469	_app_smem_num_words = _app_smem_size >> 2;
470	_app_smem_rom_start = LOADADDR(_APP_SMEM_SECTION_NAME);
471#endif /* CONFIG_USERSPACE */
472
473#include <zephyr/linker/common-ram.ld>
474#include <zephyr/linker/kobject-data.ld>
475  __common_ram_region_end = .;
476
477  .tm_clone_table : {
478    *(.tm_clone_table)
479  } >ram
480
481  /* This section is cached.  By default it contains only declared
482  * thread stacks, but applications can put symbols here too.
483  */
484  .cached SEGSTART_CACHED : {
485     _cached_start = .;
486    *(.cached .cached.*)
487#ifdef CONFIG_USERSPACE
488    z_user_stacks_start = .;
489    *(.user_stacks*)
490    z_user_stacks_end = .;
491#endif
492    _cached_end = .;
493  } >ram
494
495  /* Rimage requires 4k alignment between "DATA" and "BSS", can't do
496   * this in the section declaration below because we're also changing
497   * cacheability and that leaves a gap in the image large enough for
498   * binutils to decide to warn about (no way to turn that off, it
499   * seems, --warn-section-align is on by default)
500   */
501  . = ALIGN(4096);
502
503  .bss SEGSTART_UNCACHED (NOLOAD) :
504  {
505    _bss_start = .;
506    *(.dynsbss)
507    *(.sbss)
508    *(.sbss.*)
509    *(.gnu.linkonce.sb.*)
510    *(.scommon)
511    *(.sbss2)
512    *(.sbss2.*)
513    *(.gnu.linkonce.sb2.*)
514    *(.dynbss)
515    *(.bss)
516    *(.bss.*)
517    *(.gnu.linkonce.b.*)
518    *(COMMON)
519    . = ALIGN(8);
520    MMU_PAGE_ALIGN
521    _bss_end = .;
522  } >ucram
523
524  . = SEGSTART_UNCACHED;
525  _end = ALIGN(8);
526
527  /* Heap start and end markers. Used to reserve system heap memory. */
528  .heap_mem SEGSTART_UNCACHED (NOLOAD) :
529  {
530    _heap_start = .;
531    *(.heap_mem)
532  } >ucram
533
534  .unused_ram_start_marker SEGSTART_CACHED (NOLOAD) :
535  {
536    . = ALIGN(4096);
537    _unused_ram_start_marker = .;
538    *(.unused_ram_start_marker)
539    *(.unused_ram_start_marker.*)
540    z_mapped_end = .;
541  } >ram
542
543  /* Heap start and end markers. Used with libc malloc code. */
544  . = SEGSTART_UNCACHED;
545  _end = ALIGN(8);
546  . = SEGSTART_CACHED;
547  z_mapped_end = .;
548  . = L2_SRAM_BASE + L2_SRAM_SIZE;
549  . = SEGSTART_UNCACHED;
550  _heap_end = .;
551  _heap_sentry = .;
552  . = SEGSTART_CACHED;
553  _image_ram_end = .;
554
555  /* dma buffers */
556  .lpbuf (NOLOAD): {
557    _dma_buf_start = .;
558    *(.dma_buffers)
559    _dma_buf_end = .;
560  } >lpram
561
562  /* Non-loadable sections below.  Back to cached memory so
563   * the cache remap script doesn't try to move them around needlessly.
564   */
565  . = SEGSTART_CACHED;
566
567  /* rimage module manifest headers */
568  .module.boot : { KEEP(*(.module.boot)) } >noload
569  .module.cold : { KEEP(*(.module.cold)) } >noload
570  .module.main : { KEEP(*(.module.main)) } >noload
571
572 .static_uuid_entries : {
573    *(*.static_uuids)
574  } >noload
575
576  .static_log_entries : {
577    *(*.static_log*)
578  } >noload
579
580  /* This is the "extended manifest" data (mostly versioning stuff)
581   * emitted by SOF and inspected by the kernel driver.  It doesn't
582   * appear directly in the image, but rimage will parse and repack
583   * this into the output file header, so requires this be present
584   * even if empty.  Alignment and padding to 16 bytes is required,
585   * otherwise rimage will complain about the size being wrong (which
586   * sounds like a struct should be declared packed somewhere...)
587   */
588  .fw_metadata : ALIGN(16) {
589    KEEP (*(.fw_metadata))
590    . = ALIGN(16);
591  } >noload
592
593#include <snippets-sections.ld>
594
595#include <zephyr/linker/debug-sections.ld>
596
597   /DISCARD/ : { *(.note.GNU-stack) }
598
599  .xtensa.info 0 : { *(.xtensa.info) }
600  .xt.insn 0 : {
601    KEEP (*(.xt.insn))
602    KEEP (*(.gnu.linkonce.x.*))
603  }
604  .xt.prop 0 : {
605    KEEP (*(.xt.prop))
606    KEEP (*(.xt.prop.*))
607    KEEP (*(.gnu.linkonce.prop.*))
608  }
609  .xt.lit 0 : {
610    KEEP (*(.xt.lit))
611    KEEP (*(.xt.lit.*))
612    KEEP (*(.gnu.linkonce.p.*))
613  }
614  .xt.profile_range 0 : {
615    KEEP (*(.xt.profile_range))
616    KEEP (*(.gnu.linkonce.profile_range.*))
617  }
618  .xt.profile_ranges 0 : {
619    KEEP (*(.xt.profile_ranges))
620    KEEP (*(.gnu.linkonce.xt.profile_ranges.*))
621  }
622  .xt.profile_files 0 : {
623    KEEP (*(.xt.profile_files))
624    KEEP (*(.gnu.linkonce.xt.profile_files.*))
625  }
626
627#ifdef CONFIG_GEN_ISR_TABLES
628#include <zephyr/linker/intlist.ld>
629#endif
630
631#ifdef CONFIG_LLEXT
632#include <zephyr/linker/llext-sections.ld>
633#endif
634}
635