diff --git a/os/common/ports/RISCV-ECLIC/chcore.h b/os/common/ports/RISCV-ECLIC/chcore.h index 03285efb..83d982ab 100644 --- a/os/common/ports/RISCV-ECLIC/chcore.h +++ b/os/common/ports/RISCV-ECLIC/chcore.h @@ -377,9 +377,7 @@ static inline void port_init(void) {} * @return The interrupts status. */ static inline syssts_t port_get_irq_status(void) { - syssts_t mstatus = __RV_CSR_READ(CSR_MSTATUS); - __RWMB(); - return mstatus; + return (syssts_t)__RV_CSR_READ(CSR_MSTATUS); } /** @@ -401,9 +399,7 @@ static inline bool port_irq_enabled(syssts_t sts) { return sts & MSTATUS_MIE; } * @retval true running in ISR mode. */ static inline bool port_is_isr_context(void) { - bool is_irq_context = (__RV_CSR_READ(CSR_MSUBM) & MSUBM_TYP) != 0; - __RWMB(); - return is_irq_context; + return __RV_CSR_READ(CSR_MSUBM) & MSUBM_TYP; } /** @@ -411,22 +407,14 @@ static inline bool port_is_isr_context(void) { * @details Usually this function just disables interrupts but may perform more * actions. */ -static inline void port_lock(void) { - __disable_irq(); - __RWMB(); - __FENCE_I(); -} +static inline void port_lock(void) { __disable_irq(); } /** * @brief Kernel-unlock action. * @details Usually this function just enables interrupts but may perform more * actions. */ -static inline void port_unlock(void) { - __enable_irq(); - __RWMB(); - __FENCE_I(); -} +static inline void port_unlock(void) { __enable_irq(); } /** * @brief Kernel-lock action from an interrupt handler. @@ -448,18 +436,18 @@ static inline void port_unlock_from_isr(void) { port_unlock(); } * @brief Disables all the interrupt sources. * @note Of course non-maskable interrupt sources are not included. */ -static inline void port_disable(void) { port_lock(); } +static inline void port_disable(void) { __disable_irq(); } /** * @brief Disables the interrupt sources below kernel-level priority. * @note Interrupt sources above kernel level remains enabled. */ -static inline void port_suspend(void) { port_lock(); } +static inline void port_suspend(void) { __disable_irq(); } /** * @brief Enables all the interrupt sources. */ -static inline void port_enable(void) { port_unlock(); } +static inline void port_enable(void) { __enable_irq(); } /** * @details The function is meant to return when an interrupt becomes pending. diff --git a/os/common/ports/RISCV-ECLIC/compilers/GCC/chcoreasm.S b/os/common/ports/RISCV-ECLIC/compilers/GCC/chcoreasm.S index 27943282..2625fa91 100644 --- a/os/common/ports/RISCV-ECLIC/compilers/GCC/chcoreasm.S +++ b/os/common/ports/RISCV-ECLIC/compilers/GCC/chcoreasm.S @@ -56,34 +56,26 @@ # Disable Interrupts globally. .macro DISABLE_MIE - csrc CSR_MSTATUS, MSTATUS_MIE - fence iorw, iorw - fence.i + csrc CSR_MSTATUS, MSTATUS_MIE .endm # Enable Interrupts globally. .macro ENABLE_MIE - csrs CSR_MSTATUS, MSTATUS_MIE - fence iorw, iorw - fence.i + csrs CSR_MSTATUS, MSTATUS_MIE .endm # Clear previous machine interrupt enable bit in mstatus (mstatus.mpie). # On machine return (mret) mstatus.mie is assigned this value. # Clearing this bit disables interrupts when leaving interrupt processing mode. .macro DISABLE_MPIE - li a0, MSTATUS_MPIE - csrc CSR_MSTATUS, a0 - fence iorw, iorw - fence.i + li a0, MSTATUS_MPIE + csrc CSR_MSTATUS, a0 .endm # Set previous machine interrupt enable bit in mstatus (mstatus.mpie). .macro ENABLE_MPIE - li a0, MSTATUS_MPIE - csrs CSR_MSTATUS, a0 - fence iorw, iorw - fence.i + li a0, MSTATUS_MPIE + csrs CSR_MSTATUS, a0 .endm # --------------------------------------------------------------------------