aboutsummaryrefslogtreecommitdiff
path: root/embassy-mcxa/ram.ld
blob: 816ab6819c50bc4de4425f91cd6b02fea598b161 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
/* Simple RAM execution linker script for MCXA276 */
MEMORY
{
  RAM : ORIGIN = 0x20000000, LENGTH = 128K
}

/* Pull in device default interrupt symbol aliases (e.g., CMC = DefaultHandler) */
INCLUDE device.x


/* Provide core exception weak aliases if not supplied by cortex-m-rt's link.x */
PROVIDE(NonMaskableInt = DefaultHandler);
PROVIDE(HardFault = DefaultHandler);
PROVIDE(MemoryManagement = DefaultHandler);
PROVIDE(BusFault = DefaultHandler);
PROVIDE(UsageFault = DefaultHandler);
PROVIDE(SecureFault = DefaultHandler);
PROVIDE(SVCall = DefaultHandler);
PROVIDE(DebugMonitor = DefaultHandler);
PROVIDE(PendSV = DefaultHandler);
PROVIDE(SysTick = DefaultHandler);

/* In RAM-run we have no FLASH sidata; copy from sdata */
__sidata = __sdata;

/* Ensure the PAC interrupt table is kept */
EXTERN(__INTERRUPTS);


/* Pull in defmt's linker script to generate the defmt table that host decoders expect */
INCLUDE defmt.x

ENTRY(Reset)
EXTERN(VECTOR_TABLE)
EXTERN(Reset)
EXTERN(main)

/* Define _stack_start at end of RAM BEFORE it's used in vector table */
_stack_start = ORIGIN(RAM) + LENGTH(RAM);

SECTIONS
{
  .vector_table ORIGIN(RAM) :
  {
    /* Slot 0: Initial stack pointer - use our explicitly set _stack_start */
    LONG(_stack_start);
    /* Slot 1: Reset vector - address of Reset function with Thumb bit set */
    LONG(Reset | 1);
    /* Cortex-M33 core exceptions (slots 2-14) */
    KEEP(*(.vector_table.exceptions));
    /* Peripheral interrupt vectors provided by PAC (slots 16+) */
    KEEP(*(.vector_table.interrupts));
  } > RAM

  .text :
  {
    KEEP(*(.text.Reset));
    KEEP(*(.text.main));
    *(.text .text.*);
  } > RAM

  /* Keep defmt table and fragments so host decoders can find metadata */
  .defmt :
  {
    KEEP(*(.defmt));
    KEEP(*(.defmt.*));
  } > RAM

  .rodata :
  {
    *(.rodata .rodata.*);
  } > RAM

  .data :
  {
    . = ALIGN(4);
    __sdata = .;
    *(.data .data.*);
    . = ALIGN(4);
    __edata = .;
  } > RAM

  /* Ensure RTT control block with "SEGGER RTT" signature is loaded to RAM */
  .rtt :
  {
    KEEP(*(.rtt));
  } > RAM

  /* Place uninitialized buffers (like defmt-rtt) in RAM; load is fine for RAM-run */
  .uninit :
  {
    *(.uninit .uninit.*);
  } > RAM

  .bss :
  {
    . = ALIGN(4);
    __sbss = .;
    *(.bss .bss.*);
    . = ALIGN(4);
    __ebss = .;
  } > RAM

  /* Discard exception unwinding info */
  /DISCARD/ :
  {
    *(.ARM.exidx .ARM.exidx.*);
  }
}