6#define EXTERN_C extern "C"
12extern uint32_t snrt_cls_base_addr();
16static inline void snrt_init_tls() {
17 extern volatile uint32_t __tdata_start, __tdata_end;
18 extern volatile uint32_t __tbss_start, __tbss_end;
21 volatile uint32_t tls_ptr;
26 if (snrt_is_dm_core()) {
27 size = (size_t)(&__tdata_end) - (size_t)(&__tdata_start);
30 asm volatile(
"mv %0, tp" :
"=r"(tls_ptr) : :);
37 size_t tls_offset = (1 << SNRT_LOG2_STACK_SIZE) + 8;
38 for (
int i = 1; i < snrt_cluster_core_num(); i++) {
44 size = (size_t)(&__tbss_end) - (size_t)(&__tbss_start);
45 for (
int i = 0; i < snrt_cluster_core_num(); i++) {
46 snrt_dma_memset((
void*)(tls_ptr + i * tls_offset), 0, size);
51 snrt_cluster_hw_barrier();
56static inline void snrt_init_bss() {
57 extern volatile uint32_t __bss_start, __bss_end;
60 if (snrt_cluster_idx() == 0) {
61 if (snrt_is_dm_core()) {
62 size_t size = (size_t)(&__bss_end) - (size_t)(&__bss_start);
63 snrt_dma_memset((
void*)&__bss_start, 0, size);
66 snrt_cluster_hw_barrier();
72static inline void snrt_wake_up() {
74 if (snrt_cluster_idx() == 0 && snrt_cluster_core_idx() == 0) {
77 for (
int i = 0; i < snrt_cluster_num(); i++) {
78 if (snrt_cluster_idx() != i) {
79 snrt_cluster(i)->peripheral_reg.cl_clint_set.f.cl_clint_set =
80 (1 << snrt_cluster_core_num()) - 1;
87 snrt_cluster_hw_barrier();
95static inline void snrt_init_cls() {
96 extern volatile uint32_t __cdata_start, __cdata_end;
97 extern volatile uint32_t __cbss_start, __cbss_end;
100 if (snrt_is_dm_core()) {
101 uint64_t ptr = (uint64_t)snrt_cls_base_addr();
105 size = (size_t)(&__cdata_end) - (size_t)(&__cdata_start);
110 size = (size_t)(&__cbss_end) - (size_t)(&__cbss_start);
111 snrt_dma_memset((
void*)ptr, 0, size);
115 _cls_ptr = (
cls_t*)snrt_cls_base_addr();
116 snrt_cluster_hw_barrier();
121static inline void snrt_init_libs() {
130extern void snrt_exit_default(
int exit_code);
131#ifndef SNRT_CRT0_ALTERNATE_EXIT
132extern void snrt_exit(
int exit_code);
137EXTERN_C
void snrt_main() {
139 if (snrt_cluster_idx() == 0) {
143#ifdef SNRT_CRT0_CALLBACK0
144 snrt_crt0_callback0();
155#ifdef SNRT_CRT0_CALLBACK1
156 snrt_crt0_callback1();
163#ifdef SNRT_CRT0_CALLBACK2
164 snrt_crt0_callback2();
171#ifdef SNRT_CRT0_CALLBACK3
172 snrt_crt0_callback3();
179#ifdef SNRT_CRT0_CALLBACK4
180 snrt_crt0_callback4();
183#ifdef SNRT_CRT0_PRE_BARRIER
184 snrt_cluster_hw_barrier();
187#ifdef SNRT_CRT0_CALLBACK5
188 snrt_crt0_callback5();
191#ifdef SNRT_INVOKE_MAIN
196#ifdef SNRT_CRT0_CALLBACK6
197 snrt_crt0_callback6();
200#ifdef SNRT_CRT0_POST_BARRIER
201 snrt_cluster_hw_barrier();
204#ifdef SNRT_CRT0_CALLBACK7
205 snrt_crt0_callback7();
209 snrt_exit(exit_code);
212#ifdef SNRT_CRT0_CALLBACK8
213 snrt_crt0_callback8();
static uint32_t snrt_dma_start_1d(uint64_t dst, uint64_t src, size_t size, const uint32_t channel=0)
Start an asynchronous 1D DMA transfer with 64-bit wide pointers on a specific DMA channel.
Definition dma.h:31
static void snrt_dma_wait_all(const uint32_t channel=0)
Block until a specific DMA channel is idle.
Definition dma.h:239
Definition cls_decls.h:11