6#define EXTERN_C extern "C"
12extern uint32_t snrt_cls_base_addr();
15#ifdef SNRT_INVOKE_MAIN
20static inline void snrt_init_tls() {
21 extern volatile uint32_t __tdata_start, __tdata_end;
22 extern volatile uint32_t __tbss_start, __tbss_end;
25 volatile uint32_t tls_ptr;
30 if (snrt_is_dm_core()) {
31 size = (size_t)(&__tdata_end) - (size_t)(&__tdata_start);
34 asm volatile(
"mv %0, tp" :
"=r"(tls_ptr) : :);
35 snrt_dma_start_1d(tls_ptr, (uint64_t)&__tdata_start, size);
41 size_t tls_offset = (1 << SNRT_LOG2_STACK_SIZE) + 8;
42 for (
int i = 1; i < snrt_cluster_core_num(); i++) {
43 snrt_dma_start_1d(tls_ptr + i * tls_offset, tls_ptr, size);
48 size = (size_t)(&__tbss_end) - (size_t)(&__tbss_start);
49 for (
int i = 0; i < snrt_cluster_core_num(); i++) {
50 snrt_dma_memset((
void*)(tls_ptr + i * tls_offset), 0, size);
55 snrt_cluster_hw_barrier();
60static inline void snrt_init_bss() {
61 extern volatile uint32_t __bss_start, __bss_end;
64 if (snrt_cluster_idx() == 0) {
65 if (snrt_is_dm_core()) {
66 size_t size = (size_t)(&__bss_end) - (size_t)(&__bss_start);
67 snrt_dma_memset((
void*)&__bss_start, 0, size);
70 snrt_cluster_hw_barrier();
76static inline void snrt_wake_up() {
78 if (snrt_cluster_idx() == 0 && snrt_cluster_core_idx() == 0) {
81 for (
int i = 0; i < snrt_cluster_num(); i++) {
82 if (snrt_cluster_idx() != i) {
83 snrt_cluster(i)->peripheral_reg.cl_clint_set.f.cl_clint_set =
84 (1 << snrt_cluster_core_num()) - 1;
91 snrt_cluster_hw_barrier();
99static inline void snrt_init_cls() {
100 extern volatile uint32_t __cdata_start, __cdata_end;
101 extern volatile uint32_t __cbss_start, __cbss_end;
104 if (snrt_is_dm_core()) {
105 uint64_t ptr = (uint64_t)snrt_cls_base_addr();
109 size = (size_t)(&__cdata_end) - (size_t)(&__cdata_start);
110 snrt_dma_start_1d(ptr, (uint64_t)(&__cdata_start), size);
114 size = (size_t)(&__cbss_end) - (size_t)(&__cbss_start);
115 snrt_dma_memset((
void*)ptr, 0, size);
119 _cls_ptr = (
cls_t*)snrt_cls_base_addr();
120 snrt_cluster_hw_barrier();
125static inline void snrt_init_libs() {
134extern void snrt_exit_default(
int exit_code);
135#ifndef SNRT_CRT0_ALTERNATE_EXIT
136extern void snrt_exit(
int exit_code);
141EXTERN_C
void snrt_main() {
143 if (snrt_cluster_idx() == 0) {
147#ifdef SNRT_CRT0_CALLBACK0
148 snrt_crt0_callback0();
159#ifdef SNRT_CRT0_CALLBACK1
160 snrt_crt0_callback1();
167#ifdef SNRT_CRT0_CALLBACK2
168 snrt_crt0_callback2();
175#ifdef SNRT_CRT0_CALLBACK3
176 snrt_crt0_callback3();
183#ifdef SNRT_CRT0_CALLBACK4
184 snrt_crt0_callback4();
187#ifdef SNRT_CRT0_PRE_BARRIER
188 snrt_cluster_hw_barrier();
191#ifdef SNRT_CRT0_CALLBACK5
192 snrt_crt0_callback5();
195#ifdef SNRT_INVOKE_MAIN
199#ifdef SNRT_CRT0_CALLBACK6
200 snrt_crt0_callback6();
203#ifdef SNRT_CRT0_POST_BARRIER
204 snrt_cluster_hw_barrier();
207#ifdef SNRT_CRT0_CALLBACK7
208 snrt_crt0_callback7();
212 snrt_exit(exit_code);
215#ifdef SNRT_CRT0_CALLBACK8
216 snrt_crt0_callback8();
static void snrt_dma_wait_all(const uint32_t channel=0)
Block until a specific DMA channel is idle.
Definition dma.h:392
Definition cls_decls.h:11