-
Notifications
You must be signed in to change notification settings - Fork 146
Expand file tree
/
Copy pathRISCV64-mpfs250.ld
More file actions
126 lines (106 loc) · 3.42 KB
/
RISCV64-mpfs250.ld
File metadata and controls
126 lines (106 loc) · 3.42 KB
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
/* PolarFire SoC MPFS250 Linker Script for test application */
/* Memory configuration for PolarFire SoC MPFS250 test app */
/* TODO: Update with actual memory map for MPFS250 */
_Min_Heap_Size = 0x00002000; /* required amount of heap */
_Min_Stack_Size = 0x00002000; /* required amount of stack */
OUTPUT_ARCH( "riscv" )
ENTRY( _reset )
/* Provide M-mode symbols as dummy values for test-app (not used at runtime) */
PROVIDE(_main_hart_hls = 0);
/* Memory areas */
MEMORY
{
/* For RAM boot (NO_XIP), use WOLFBOOT_LOAD_ADDRESS for execution
* For XIP boot, use WOLFBOOT_TEST_APP_ADDRESS (partition + header) */
IRAM (rwx) :ORIGIN = @WOLFBOOT_LOAD_ADDRESS@, LENGTH = @WOLFBOOT_TEST_APP_SIZE@
DDR (rwx) :ORIGIN = 0x80000000, LENGTH = 1M
LSRAM (rwx) :ORIGIN = 0x08000000, LENGTH = 128K
}
/* Define output sections */
SECTIONS
{
/* Entry point must be first for raw binary (.bin) boot.
* _reset() initializes GP, SP, BSS, then calls main().
* For ELF boot the ENTRY(_reset) directive handles this,
* but for .bin wolfBoot jumps to the load address directly. */
.init :
{
. = ALIGN(8);
KEEP(*(.init))
. = ALIGN(8);
} >IRAM
/* Interrupt/trap vector table */
.isr_vector :
{
. = ALIGN(8);
_start_vector = .;
KEEP(*(.isr_vector))
. = ALIGN(8);
} >IRAM
/* The program code and other data goes into IRAM */
.text :
{
. = ALIGN(8);
_start_text = .;
*(.text) /* .text sections (code) */
*(.text*) /* .text* sections (code) */
*(.rodata) /* .rodata sections (constants, strings, etc.) */
*(.rodata*) /* .rodata* sections (constants, strings, etc.) */
KEEP (*(.fini))
. = ALIGN(8);
_etext = .; /* define a global symbol at end of code */
} >IRAM
/* used by the startup to initialize data */
_stored_data = .;
/* Initialized data sections - keep in same region as code for RAM boot */
.data : AT (_stored_data)
{
. = ALIGN(8);
_start_data = .; /* create a global symbol at data start */
*(.data) /* .data sections */
*(.data*) /* .data* sections */
*(.RamFunc) /* .RamFunc sections */
*(.RamFunc*) /* .RamFunc* sections */
. = ALIGN(8);
_end_data = .; /* define a global symbol at data end */
} >IRAM
/* Uninitialized data section */
/* Mark as NOLOAD so it's not included in binary (zero-initialized at runtime) */
. = ALIGN(8);
.bss (NOLOAD) :
{
/* This is used by the startup in order to initialize the .bss section */
_start_bss = .; /* define a global symbol at bss start */
__bss_start__ = _start_bss;
*(.bss)
*(.bss*)
/* *(COMMON) */
. = ALIGN(8);
_end_bss = .; /* define a global symbol at bss end */
__bss_end__ = _end_bss;
} >IRAM
/* User_heap_stack section, used to check that there is enough RAM left */
/* Mark as NOLOAD so it's not included in binary (zero-initialized at runtime) */
._user_heap_stack (NOLOAD) :
{
. = ALIGN(8);
PROVIDE ( end = . );
PROVIDE ( _end = . );
PROVIDE ( _start_heap = . );
. = . + _Min_Heap_Size;
. = . + _Min_Stack_Size;
. = ALIGN(8);
PROVIDE ( END_STACK = . );
PROVIDE ( _end_stack = . );
} >IRAM
/* Global pointer for RISC-V */
. = ALIGN(8);
_global_pointer = .;
/* Remove information from the standard libraries */
/DISCARD/ :
{
libc.a ( * )
libm.a ( * )
libgcc.a ( * )
}
}