diff options
Diffstat (limited to 'FreeRTOS/Demo/RISC-V_RV32_SiFive_HiFive1_FreedomStudio/freedom-metal/src/cpu.c')
-rw-r--r-- | FreeRTOS/Demo/RISC-V_RV32_SiFive_HiFive1_FreedomStudio/freedom-metal/src/cpu.c | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/FreeRTOS/Demo/RISC-V_RV32_SiFive_HiFive1_FreedomStudio/freedom-metal/src/cpu.c b/FreeRTOS/Demo/RISC-V_RV32_SiFive_HiFive1_FreedomStudio/freedom-metal/src/cpu.c new file mode 100644 index 000000000..2c415a846 --- /dev/null +++ b/FreeRTOS/Demo/RISC-V_RV32_SiFive_HiFive1_FreedomStudio/freedom-metal/src/cpu.c @@ -0,0 +1,59 @@ +/* Copyright 2018 SiFive, Inc */ +/* SPDX-License-Identifier: Apache-2.0 */ + +#include <metal/cpu.h> +#include <metal/machine.h> + +struct metal_cpu* metal_cpu_get(int hartid) +{ + if (hartid < __METAL_DT_MAX_HARTS) { + return (struct metal_cpu *)__metal_cpu_table[hartid]; + } + return NULL; +} + +int metal_cpu_get_current_hartid() +{ +#ifdef __riscv + int mhartid; + asm volatile("csrr %0, mhartid" : "=r" (mhartid)); + return mhartid; +#endif +} + +int metal_cpu_get_num_harts() +{ + return __METAL_DT_MAX_HARTS; +} + +extern inline unsigned long long metal_cpu_get_timer(struct metal_cpu *cpu); + +extern inline unsigned long long metal_cpu_get_timebase(struct metal_cpu *cpu); + +extern inline unsigned long long metal_cpu_get_mtime(struct metal_cpu *cpu); + +extern inline int metal_cpu_set_mtimecmp(struct metal_cpu *cpu, unsigned long long time); + +extern inline struct metal_interrupt* metal_cpu_timer_interrupt_controller(struct metal_cpu *cpu); + +extern inline int metal_cpu_timer_get_interrupt_id(struct metal_cpu *cpu); + +extern inline struct metal_interrupt* metal_cpu_software_interrupt_controller(struct metal_cpu *cpu); + +extern inline int metal_cpu_software_get_interrupt_id(struct metal_cpu *cpu); + +extern inline int metal_cpu_software_set_ipi(struct metal_cpu *cpu, int hartid); + +extern inline int metal_cpu_software_clear_ipi(struct metal_cpu *cpu, int hartid); + +extern inline int metal_cpu_get_msip(struct metal_cpu *cpu, int hartid); + +extern inline struct metal_interrupt* metal_cpu_interrupt_controller(struct metal_cpu *cpu); + +extern inline int metal_cpu_exception_register(struct metal_cpu *cpu, int ecode, metal_exception_handler_t handler); + +extern inline int metal_cpu_get_instruction_length(struct metal_cpu *cpu, uintptr_t epc); + +extern inline uintptr_t metal_cpu_get_exception_pc(struct metal_cpu *cpu); + +extern inline int metal_cpu_set_exception_pc(struct metal_cpu *cpu, uintptr_t epc); |