| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- /* Copyright 2018 Canaan Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- #include <stdlib.h>
- #include "atomic.h"
- #include "clint.h"
- #include "dmac.h"
- #include "entry.h"
- #include "fpioa.h"
- #include "platform.h"
- #include "plic.h"
- #include "syscalls.h"
- #include "sysctl.h"
- #include "syslog.h"
- #include "uart.h"
- extern volatile uint64_t g_wake_up[2];
- core_instance_t core1_instance;
- volatile char *const ram = (volatile char *)RAM_BASE_ADDR;
- extern char _heap_start[];
- extern char _heap_end[];
- void __attribute__((weak)) initialize_kendryte_ide_hook(void) {}
- void thread_entry(int core_id)
- {
- while(!atomic_read(&g_wake_up[core_id]))
- ;
- }
- void core_enable(int core_id)
- {
- clint_ipi_send(core_id);
- atomic_set(&g_wake_up[core_id], 1);
- }
- int register_core1(core_function func, void *ctx)
- {
- if(func == NULL)
- return -1;
- core1_instance.callback = func;
- core1_instance.ctx = ctx;
- core_enable(1);
- return 0;
- }
- int __attribute__((weak)) os_entry(int core_id, int number_of_cores, int (*user_main)(int, char **))
- {
- /* Call main if there is no OS */
- return user_main(0, 0);
- }
- void _init_bsp(int core_id, int number_of_cores)
- {
- extern int main(int argc, char *argv[]);
- extern void __libc_init_array(void);
- extern void __libc_fini_array(void);
- if(core_id == 0)
- {
- /* Initialize bss data to 0 */
- init_bss();
- /* Init UART */
- fpioa_set_function(4, FUNC_UART3_RX);
- fpioa_set_function(5, FUNC_UART3_TX);
- uart_debug_init(UART_DEVICE_3);
- dmac_init();
- /* Init FPIOA */
- fpioa_init();
- /* Register finalization function */
- atexit(__libc_fini_array);
- /* Init libc array for C++ */
- __libc_init_array();
- /* Get reset status */
- sysctl_get_reset_status();
- /* Init plic */
- plic_init();
- /* Enable global interrupt */
- sysctl_enable_irq();
- /* Hook entry for kendryte IDE */
- initialize_kendryte_ide_hook();
- }
- int ret = 0;
- if(core_id == 0)
- {
- core1_instance.callback = NULL;
- core1_instance.ctx = NULL;
- ret = os_entry(core_id, number_of_cores, main);
- } else
- {
- plic_init();
- sysctl_enable_irq();
- thread_entry(core_id);
- if(core1_instance.callback == NULL)
- asm volatile("wfi");
- else
- ret = core1_instance.callback(core1_instance.ctx);
- }
- exit(ret);
- }
- int pthread_setcancelstate(int __state, int *__oldstate)
- {
- return 0;
- }
|