| /* |
| * Copyright (c) 2019 Carlo Caione <ccaione@baylibre.com> |
| * |
| * 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 <kernel_internal.h> |
| #include <zephyr/linker/linker-defs.h> |
| |
| __weak void z_arm64_mm_init(bool is_primary_core) { } |
| |
| extern void z_arm64_mm_init(bool is_primary_core); |
| |
| /* |
| * These simple memset/memcpy alternatives are necessary as the optimized |
| * ones depend on the MMU to be active (see commit c5b898743a20). |
| */ |
| void z_early_memset(void *dst, int c, size_t n) |
| { |
| uint8_t *d = dst; |
| |
| while (n--) { |
| *d++ = c; |
| } |
| } |
| |
| void z_early_memcpy(void *dst, const void *src, size_t n) |
| { |
| uint8_t *d = dst; |
| const uint8_t *s = src; |
| |
| while (n--) { |
| *d++ = *s++; |
| } |
| } |
| |
| /** |
| * |
| * @brief Prepare to and run C code |
| * |
| * This routine prepares for the execution of and runs C code. |
| * |
| */ |
| void z_arm64_prep_c(void) |
| { |
| /* Initialize tpidrro_el0 with our struct _cpu instance address */ |
| write_tpidrro_el0((uintptr_t)&_kernel.cpus[0]); |
| |
| z_bss_zero(); |
| z_data_copy(); |
| 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 |