Skip to content

Commit 9cd8235

Browse files
committed
Use picolibc instead of newlib-nano
Add picolibc bits to linker scripts. Support picolibc stdio. Add _exit stub. Switch to picolibc.specs Signed-off-by: Keith Packard <[email protected]>
1 parent c150f48 commit 9cd8235

File tree

10 files changed

+227
-20
lines changed

10 files changed

+227
-20
lines changed

bl2/ext/mcuboot/include/flash_map/flash_map.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,9 @@ uint32_t flash_area_align(const struct flash_area *area);
165165
int flash_area_get_sectors(int fa_id, uint32_t *count,
166166
struct flash_sector *sectors);
167167

168+
int flash_area_get_sector(const struct flash_area *fa, uint32_t off,
169+
struct flash_sector *sector);
170+
168171
/*
169172
* Similar to flash_area_get_sectors(), but return the values in an
170173
* array of struct flash_area instead.

platform/ext/common/gcc/tfm_common_bl2.ld

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,24 @@ SECTIONS
153153
} > RAM AT > FLASH
154154
Image$$ER_DATA$$Base = ADDR(.data);
155155

156+
.tdata : /* For ld.lld: ALIGN(__tls_align) */ ALIGN_WITH_INPUT {
157+
*(.tdata .tdata.* .gnu.linkonce.td.*)
158+
PROVIDE(__data_end = .);
159+
PROVIDE(__tdata_end = .);
160+
} >RAM AT>FLASH
161+
162+
.tbss (NOLOAD) : {
163+
*(.tbss .tbss.* .gnu.linkonce.tb.*)
164+
*(.tcommon)
165+
PROVIDE( __tls_end = . );
166+
PROVIDE( __tbss_end = . );
167+
} >RAM AT>RAM
168+
169+
.tbss_space (NOLOAD) : {
170+
. = ADDR(.tbss);
171+
. = . + SIZEOF(.tbss);
172+
} >RAM AT>RAM
173+
156174
.bss : ALIGN(4)
157175
{
158176
. = ALIGN(4);
@@ -161,8 +179,18 @@ SECTIONS
161179
*(COMMON)
162180
. = ALIGN(4);
163181
__bss_end__ = .;
182+
__bss_end = .;
164183
} > RAM
165184

185+
PROVIDE(__data_start = ADDR(.data));
186+
PROVIDE(__data_source = LOADADDR(.data));
187+
PROVIDE(__data_size = __data_end - __data_start);
188+
PROVIDE( __tls_base = SIZEOF(.tdata) ? ADDR(.tdata) : ADDR(.tbss) );
189+
PROVIDE( __tls_align = MAX(ALIGNOF(.tdata), ALIGNOF(.tbss)) );
190+
PROVIDE( __arm32_tls_tcb_offset = MAX(8, __tls_align) );
191+
PROVIDE( __bss_start = ADDR(.tbss));
192+
PROVIDE( __bss_size = __bss_end - __bss_start );
193+
166194
#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
167195
.msp_stack (NOLOAD) : ALIGN(32)
168196
{
@@ -193,11 +221,15 @@ SECTIONS
193221
__end__ = .;
194222
PROVIDE(end = .);
195223
__HeapBase = .;
224+
__heap_start = .;
196225
. += __heap_size__;
197226
__HeapLimit = .;
198227
__heap_limit = .; /* Add for _sbrk */
228+
__heap_end = .;
199229
} > RAM
200230
Image$$ARM_LIB_HEAP$$ZI$$Limit = ADDR(.heap) + SIZEOF(.heap);
201231

202232
PROVIDE(__stack = Image$$ARM_LIB_STACK$$ZI$$Limit);
233+
PROVIDE(__heap_start = ADDR(.heap));
234+
PROVIDE(__heap_end = ADDR(.heap) + SIZEOF(.heap));
203235
}

platform/ext/common/gcc/tfm_common_ns.ld

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -128,22 +128,50 @@ SECTIONS
128128

129129
KEEP(*(.jcr*))
130130
. = ALIGN(4);
131-
/* All data end */
132-
__data_end__ = .;
133131

134132
} > RAM
135133

136-
.bss :
134+
.tdata : AT (__etext + SIZEOF(.data))
137135
{
136+
*(.tdata .tdata.* .gnu.linkonce.td.*)
137+
PROVIDE(__data_end = .);
138+
PROVIDE(__data_end__ = .);
139+
PROVIDE(__tdata_end = .);
140+
} > RAM
141+
142+
.tbss (NOLOAD) : {
138143
. = ALIGN(4);
139144
__bss_start__ = .;
145+
*(.tbss .tbss.* .gnu.linkonce.tb.*)
146+
*(.tcommon)
147+
PROVIDE( __tls_end = . );
148+
PROVIDE( __tbss_end = . );
149+
} > RAM
150+
151+
.tbss_space (NOLOAD) : {
152+
. = ADDR(.tbss);
153+
. = . + SIZEOF(.tbss);
154+
} > RAM
155+
156+
.bss :
157+
{
158+
. = ALIGN(4);
140159
*(.bss*)
141160
*(COMMON)
142161
. = ALIGN(4);
143162
__bss_end__ = .;
163+
PROVIDE(__bss_end = .);
144164
} > RAM
145165

146166
bss_size = __bss_end__ - __bss_start__;
167+
PROVIDE(__data_start = ADDR(.data));
168+
PROVIDE(__data_source = LOADADDR(.data));
169+
PROVIDE(__data_size = __data_end - __data_start );
170+
PROVIDE( __bss_start = ADDR(.tbss));
171+
PROVIDE( __bss_size = __bss_end - __bss_start );
172+
PROVIDE( __tls_base = SIZEOF(.tdata) ? ADDR(.tdata) : ADDR(.tbss) );
173+
PROVIDE( __tls_align = MAX(ALIGNOF(.tdata), ALIGNOF(.tbss)) );
174+
PROVIDE(__arm32_tls_tcb_offset = MAX(8, __tls_align) );
147175

148176
.stack : ALIGN(32)
149177
{
@@ -158,9 +186,11 @@ SECTIONS
158186
__end__ = .;
159187
PROVIDE(end = .);
160188
__HeapBase = .;
189+
PROVIDE(__heap_start = .);
161190
. += __heap_size__;
162191
__HeapLimit = .;
163192
__heap_limit = .; /* Add for _sbrk */
193+
PROVIDE(__heap_end = .);
164194
} > RAM
165195

166196
PROVIDE(__stack = __StackTop);

platform/ext/common/gcc/tfm_common_s.ld

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -477,13 +477,34 @@ SECTIONS
477477
. = ALIGN(4);
478478

479479
} > RAM AT> FLASH
480+
481+
.TFM_TDATA : ALIGN_WITH_INPUT {
482+
*(.tdata .tdata.* .gnu.linkonce.td.*)
483+
PROVIDE(__data_end = .);
484+
PROVIDE(__tdata_end = .);
485+
} > RAM AT> FLASH
486+
480487
Image$$ER_TFM_DATA$$RW$$Base = ADDR(.TFM_DATA);
481-
Image$$ER_TFM_DATA$$RW$$Limit = ADDR(.TFM_DATA) + SIZEOF(.TFM_DATA);
488+
Image$$ER_TFM_DATA$$RW$$Limit = ADDR(.TFM_TDATA) + SIZEOF(.TFM_TDATA);
482489

483-
.TFM_BSS ALIGN(4) (NOLOAD) :
484-
{
490+
.TFM_TBSS (NOLOAD) : {
485491
__bss_start__ = .;
486492

493+
*(.tbss .tbss.* .gnu.linkonce.tb.*)
494+
*(.tcommon)
495+
PROVIDE( __tls_end = . );
496+
PROVIDE( __tbss_end = . );
497+
} > RAM AT> RAM
498+
PROVIDE( __tls_align = MAX(ALIGNOF(.TFM_TDATA), ALIGNOF(.TFM_TBSS)) );
499+
PROVIDE( __arm32_tls_tcb_offset = MAX(8, __tls_align) );
500+
501+
.TFM_TBSS_SPACE (NOLOAD) : {
502+
. = ADDR(.TFM_TBSS);
503+
. = . + SIZEOF(.TFM_TBSS);
504+
} > RAM AT> RAM
505+
506+
.TFM_BSS ALIGN(4) (NOLOAD) :
507+
{
487508
/* The runtime partition placed order is same as load partition */
488509
__partition_runtime_start__ = .;
489510
KEEP(*(.bss.part_runtime_priority_00))
@@ -504,16 +525,26 @@ SECTIONS
504525
*(COMMON)
505526
. = ALIGN(4);
506527
__bss_end__ = .;
528+
__bss_end = .;
507529
} > RAM AT> RAM
508-
Image$$ER_TFM_DATA$$ZI$$Base = ADDR(.TFM_BSS);
530+
Image$$ER_TFM_DATA$$ZI$$Base = ADDR(.TFM_TBSS);
509531
Image$$ER_TFM_DATA$$ZI$$Limit = ADDR(.TFM_BSS) + SIZEOF(.TFM_BSS);
510532
Image$$ER_PART_RT_POOL$$ZI$$Base = __partition_runtime_start__;
511533
Image$$ER_PART_RT_POOL$$ZI$$Limit = __partition_runtime_end__;
512534
Image$$ER_SERV_RT_POOL$$ZI$$Base = __service_runtime_start__;
513535
Image$$ER_SERV_RT_POOL$$ZI$$Limit = __service_runtime_end__;
514536

515537
Image$$ER_TFM_DATA$$Base = ADDR(.TFM_DATA);
516-
Image$$ER_TFM_DATA$$Limit = ADDR(.TFM_DATA) + SIZEOF(.TFM_DATA) + SIZEOF(.TFM_BSS);
538+
Image$$ER_TFM_DATA$$Limit = ADDR(.TFM_BSS) + SIZEOF(.TFM_BSS);
539+
540+
PROVIDE(__data_start = ADDR(.TFM_DATA));
541+
PROVIDE(__data_source = LOADADDR(.TFM_DATA));
542+
PROVIDE(__data_size = __data_end - __data_start );
543+
PROVIDE( __bss_start = ADDR(.TFM_TBSS));
544+
PROVIDE( __bss_size = __bss_end - __bss_start );
545+
PROVIDE( __tls_base = SIZEOF(.TFM_TDATA) ? ADDR(.TFM_TDATA) : ADDR(.TFM_TBSS) );
546+
PROVIDE( __tls_align = MAX(ALIGNOF(.TFM_TDATA), ALIGNOF(.TFM_TBSS)) );
547+
PROVIDE(__arm32_tls_tcb_offset = MAX(8, __tls_align) );
517548

518549
#if defined(CONFIG_TFM_USE_TRUSTZONE)
519550
Image$$ER_VENEER$$Base = ADDR(.gnu.sgstubs);

platform/ext/common/syscalls_stub.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,3 +53,12 @@ __attribute__((weak))
5353
void _write(void)
5454
{
5555
}
56+
57+
#ifdef __PICOLIBC__
58+
void
59+
_exit(int status)
60+
{
61+
(void) status;
62+
for(;;);
63+
}
64+
#endif

platform/ext/common/uart_stdout.c

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,36 @@ int fputc(int ch, FILE *f)
6969
/* Return character written */
7070
return ch;
7171
}
72+
#elif defined(__PICOLIBC__)
73+
74+
static int
75+
_getc(FILE *file)
76+
{
77+
(void) file;
78+
return EOF;
79+
}
80+
81+
static int
82+
_putc(char c, FILE *file)
83+
{
84+
(void) file;
85+
(void) stdio_output_string((const unsigned char *) &c,1);
86+
87+
return (unsigned char) c;
88+
}
89+
90+
static FILE __stdio = FDEV_SETUP_STREAM(_putc, _getc, NULL, _FDEV_SETUP_RW);
91+
92+
#ifdef __strong_reference
93+
#define STDIO_ALIAS(x) __strong_reference(stdin, x);
94+
#else
95+
#define STDIO_ALIAS(x) FILE *const x = &__stdio;
96+
#endif
97+
98+
FILE *const stdin = &__stdio;
99+
STDIO_ALIAS(stdout);
100+
STDIO_ALIAS(stderr);
101+
72102
#elif defined(__GNUC__)
73103
/* Redirects printf to STDIO_DRIVER in case of GNUARM */
74104
int _write(int fd, char *str, int len)

platform/ext/target/adi/max32657/device/gcc/max32657_sla.ld

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,16 +156,48 @@ SECTIONS
156156
} > RAM AT > FLASH
157157
Image$$ER_DATA$$Base = ADDR(.data);
158158

159-
.bss : ALIGN(4)
159+
.tdata :
160160
{
161+
*(.tdata .tdata.* .gnu.linkonce.td.*)
162+
PROVIDE(__data_end = .);
163+
PROVIDE(__data_end__ = .);
164+
PROVIDE(__tdata_end = .);
165+
} > RAM AT > FLASH
166+
167+
.tbss (NOLOAD) : {
161168
. = ALIGN(4);
162169
__bss_start__ = .;
170+
*(.tbss .tbss.* .gnu.linkonce.tb.*)
171+
*(.tcommon)
172+
PROVIDE( __tls_end = . );
173+
PROVIDE( __tbss_end = . );
174+
} > RAM
175+
176+
.tbss_space (NOLOAD) : {
177+
. = ADDR(.tbss);
178+
. = . + SIZEOF(.tbss);
179+
} > RAM
180+
181+
.bss : ALIGN(4)
182+
{
183+
. = ALIGN(4);
163184
*(.bss*)
164185
*(COMMON)
165186
. = ALIGN(4);
166187
__bss_end__ = .;
188+
PROVIDE(__bss_end = .);
167189
} > RAM
168190

191+
bss_size = __bss_end__ - __bss_start__;
192+
PROVIDE(__data_start = ADDR(.data));
193+
PROVIDE(__data_source = LOADADDR(.data));
194+
PROVIDE(__data_size = __data_end - __data_start );
195+
PROVIDE( __bss_start = ADDR(.tbss));
196+
PROVIDE( __bss_size = __bss_end - __bss_start );
197+
PROVIDE( __tls_base = SIZEOF(.tdata) ? ADDR(.tdata) : ADDR(.tbss) );
198+
PROVIDE( __tls_align = MAX(ALIGNOF(.tdata), ALIGNOF(.tbss)) );
199+
PROVIDE(__arm32_tls_tcb_offset = MAX(8, __tls_align) );
200+
169201
#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
170202
.msp_stack (NOLOAD) : ALIGN(32)
171203
{
@@ -196,9 +228,11 @@ SECTIONS
196228
__end__ = .;
197229
PROVIDE(end = .);
198230
__HeapBase = .;
231+
PROVIDE(__heap_start = .);
199232
. += __heap_size__;
200233
__HeapLimit = .;
201234
__heap_limit = .; /* Add for _sbrk */
235+
PROVIDE(__heap_end = .);
202236
} > RAM
203237
Image$$ARM_LIB_HEAP$$ZI$$Limit = ADDR(.heap) + SIZEOF(.heap);
204238

platform/ext/target/stm/common/hal/template/gcc/bl2.ld

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -169,24 +169,56 @@ SECTIONS
169169

170170
KEEP(*(.jcr*))
171171
. = ALIGN(4);
172+
173+
} > RAM
174+
175+
.tdata : ALIGN_WITH_INPUT {
176+
*(.tdata .tdata.* .gnu.linkonce.td.*)
177+
PROVIDE(__data_end = .);
178+
PROVIDE(__tdata_end = .);
172179
/* All data end */
173180
__data_end__ = .;
181+
} > RAM
174182

175-
} > RAM
176183
Image$$ER_CODE$$Base = __Vectors ;
177-
Image$$ER_CODE$$Limit = __etext + + SIZEOF(.data);
184+
Image$$ER_CODE$$Limit = __etext + + SIZEOF(.data) + SIZEOF(.tdata);
185+
186+
.tbss (NOLOAD) : {
187+
. = ALIGN(4);
188+
__bss_start__ = .;
189+
*(.tbss .tbss.* .gnu.linkonce.tb.*)
190+
*(.tcommon)
191+
PROVIDE( __tls_end = . );
192+
PROVIDE( __tbss_end = . );
193+
} > RAM
194+
195+
.tbss_space (NOLOAD) : {
196+
. = ADDR(.tbss);
197+
. = . + SIZEOF(.tbss);
198+
} > RAM
199+
178200
.bss :
179201
{
180202
. = ALIGN(4);
181-
__bss_start__ = .;
182203
*(.bss*)
183204
*(COMMON)
184205
. = ALIGN(4);
185206
__bss_end__ = .;
207+
PROVIDE(__bss_end = .);
186208
} > RAM
187209

188210
bss_size = __bss_end__ - __bss_start__;
189211

212+
PROVIDE( __tls_align = MAX(ALIGNOF(.tdata), ALIGNOF(.tbss)) );
213+
PROVIDE( __arm32_tls_tcb_offset = MAX(8, __tls_align) );
214+
PROVIDE(__data_source = LOADADDR(.data));
215+
PROVIDE(__data_start = ADDR(.data));
216+
PROVIDE( __data_size = __data_end - __data_start );
217+
PROVIDE( __bss_start = ADDR(.tbss));
218+
PROVIDE( __bss_size = __bss_end - __bss_start );
219+
PROVIDE( __tls_first = SIZEOF(.tdata) ? ADDR(.tdata) : ADDR(.tbss) );
220+
PROVIDE( __tls_base = __tls_first );
221+
190222
.msp_stack :
191223
{
192224
. = ALIGN(8);
@@ -208,4 +240,8 @@ SECTIONS
208240
} > RAM
209241

210242
PROVIDE(__stack = Image$$ARM_LIB_STACK$$ZI$$Limit);
243+
244+
PROVIDE(__heap_start = ADDR(.heap));
245+
PROVIDE(__heap_end = ADDR(.heap) + SIZEOF(.heap));
246+
211247
}

0 commit comments

Comments
 (0)