diff --git a/cpu/fe310/include/cpu_conf.h b/cpu/fe310/include/cpu_conf.h index 698ea7873a..d4ad49ad78 100644 --- a/cpu/fe310/include/cpu_conf.h +++ b/cpu/fe310/include/cpu_conf.h @@ -39,6 +39,11 @@ */ #define HAVE_HEAP_STATS +/** + * @brief This arch uses the inlined irq API. + */ +#define IRQ_API_INLINED (1) + #ifdef __cplusplus extern "C" { #endif diff --git a/cpu/fe310/include/irq_arch.h b/cpu/fe310/include/irq_arch.h new file mode 100644 index 0000000000..43ca634366 --- /dev/null +++ b/cpu/fe310/include/irq_arch.h @@ -0,0 +1,99 @@ +/* + * Copyright (C) 2017 Ken Rabold + * 2020 Inria + * 2020 Otto-von-Guericke-Universität Magdeburg + * + * This file is subject to the terms and conditions of the GNU Lesser General + * Public License v2.1. See the file LICENSE in the top level directory for more + * details. + */ + +/** + * @ingroup cpu_fe310 + * @{ + * + * @file + * @brief Implementation of the kernels irq interface + * + * @author Ken Rabold + * @author Alexandre Abadie + * @author Marian Buschsieweke + */ + +#ifndef IRQ_ARCH_H +#define IRQ_ARCH_H + +#include +#include "irq.h" +#include "cpu_conf.h" +#include "cpu.h" + +#include "vendor/encoding.h" + +#ifdef __cplusplus +extern "C" { +#endif + +extern volatile int fe310_in_isr; + +/** + * @brief Enable all maskable interrupts + */ +static inline __attribute__((always_inline)) unsigned int irq_enable(void) +{ + /* Enable all interrupts */ + unsigned state; + __asm__ volatile ( + "csrrs %[dest], mstatus, %[mask]" + : [dest] "=r"(state) + : [mask] "i"(MSTATUS_MIE) + : "memory" + ); + return state; +} + +/** + * @brief Disable all maskable interrupts + */ +static inline __attribute__((always_inline)) unsigned int irq_disable(void) +{ + + unsigned int state; + __asm__ volatile ( + "csrrc %[dest], mstatus, %[mask]" + : [dest] "=r"(state) + : [mask] "i"(MSTATUS_MIE) + : "memory" + ); + + return state; +} + +/** + * @brief Restore the state of the IRQ flags + */ +static inline __attribute__((always_inline)) void irq_restore(unsigned int state) +{ + /* Restore all interrupts to given state */ + __asm__ volatile ( + "csrw mstatus, %[state]" + : /* no outputs */ + : [state] "r"(state) + : "memory" + ); +} + +/** + * @brief See if the current context is inside an ISR + */ +static inline __attribute__((always_inline)) int irq_is_in(void) +{ + return fe310_in_isr; +} + +#ifdef __cplusplus +} +#endif + +#endif /* IRQ_ARCH_H */ +/** @} */ diff --git a/cpu/fe310/irq_arch.c b/cpu/fe310/irq_arch.c index b4eceb741d..9cb4c4063a 100644 --- a/cpu/fe310/irq_arch.c +++ b/cpu/fe310/irq_arch.c @@ -23,6 +23,7 @@ #include "cpu.h" #include "irq.h" +#include "irq_arch.h" #include "panic.h" #include "sched.h" @@ -74,45 +75,6 @@ void irq_init(void) set_csr(mstatus, MSTATUS_DEFAULT); } -/** - * @brief Enable all maskable interrupts - */ -unsigned int irq_enable(void) -{ - /* Enable all interrupts */ - set_csr(mstatus, MSTATUS_MIE); - return read_csr(mstatus); -} - -/** - * @brief Disable all maskable interrupts - */ -unsigned int irq_disable(void) -{ - unsigned int state = read_csr(mstatus); - - /* Disable all interrupts */ - clear_csr(mstatus, MSTATUS_MIE); - return state; -} - -/** - * @brief Restore the state of the IRQ flags - */ -void irq_restore(unsigned int state) -{ - /* Restore all interrupts to given state */ - write_csr(mstatus, state); -} - -/** - * @brief See if the current context is inside an ISR - */ -int irq_is_in(void) -{ - return fe310_in_isr; -} - /** * @brief Set External ISR callback */