/* * Copyright (c) 2019 Carlo Caione * * SPDX-License-Identifier: Apache-2.0 */ /** * @file * @brief Full C support initialization * * Initialization of full C support: zero the .bss and call z_cstart(). * * Stack is available in this module, but not the global data/bss until their * initialization is performed. */ #include #include __weak void z_arm64_mm_init(bool is_primary_core) { } extern FUNC_NORETURN void z_cstart(void); extern void z_arm64_mm_init(bool is_primary_core); static inline void z_arm64_bss_zero(void) { uint64_t *p = (uint64_t *)__bss_start; uint64_t *end = (uint64_t *)__bss_end; while (p < end) { *p++ = 0U; } } /** * * @brief Prepare to and run C code * * This routine prepares for the execution of and runs C code. * * @return N/A */ void z_arm64_prep_c(void) { /* Initialize tpidrro_el0 with our struct _cpu instance address */ write_tpidrro_el0((uintptr_t)&_kernel.cpus[0]); z_arm64_bss_zero(); #ifdef CONFIG_XIP z_data_copy(); #endif z_arm64_mm_init(true); z_arm64_interrupt_init(); z_cstart(); CODE_UNREACHABLE; } #if CONFIG_MP_NUM_CPUS > 1 extern FUNC_NORETURN void z_arm64_secondary_start(void); void z_arm64_secondary_prep_c(void) { z_arm64_secondary_start(); CODE_UNREACHABLE; } #endif