summaryrefslogtreecommitdiff
path: root/FreeRTOS/Demo/RISC-V_RV32_SiFive_HiFive1-RevB_FreedomStudio/freedom-metal/metal/lock.h
diff options
context:
space:
mode:
Diffstat (limited to 'FreeRTOS/Demo/RISC-V_RV32_SiFive_HiFive1-RevB_FreedomStudio/freedom-metal/metal/lock.h')
-rw-r--r--FreeRTOS/Demo/RISC-V_RV32_SiFive_HiFive1-RevB_FreedomStudio/freedom-metal/metal/lock.h37
1 files changed, 18 insertions, 19 deletions
diff --git a/FreeRTOS/Demo/RISC-V_RV32_SiFive_HiFive1-RevB_FreedomStudio/freedom-metal/metal/lock.h b/FreeRTOS/Demo/RISC-V_RV32_SiFive_HiFive1-RevB_FreedomStudio/freedom-metal/metal/lock.h
index 0702cbf16..e591eaefa 100644
--- a/FreeRTOS/Demo/RISC-V_RV32_SiFive_HiFive1-RevB_FreedomStudio/freedom-metal/metal/lock.h
+++ b/FreeRTOS/Demo/RISC-V_RV32_SiFive_HiFive1-RevB_FreedomStudio/freedom-metal/metal/lock.h
@@ -4,9 +4,9 @@
#ifndef METAL__LOCK_H
#define METAL__LOCK_H
+#include <metal/compiler.h>
#include <metal/machine.h>
#include <metal/memory.h>
-#include <metal/compiler.h>
/*!
* @file lock.h
@@ -26,21 +26,21 @@
* Locks must be declared with METAL_LOCK_DECLARE to ensure that the lock
* is linked into a memory region which supports atomic memory operations.
*/
-#define METAL_LOCK_DECLARE(name) \
- __attribute__((section(".data.locks"))) \
- struct metal_lock name
+#define METAL_LOCK_DECLARE(name) \
+ __attribute__((section(".data.locks"))) struct metal_lock name
/*!
* @brief A handle for a lock
*/
struct metal_lock {
- int _state;
+ int _state;
};
/*!
* @brief Initialize a lock
* @param lock The handle for a lock
- * @return 0 if the lock is successfully initialized. A non-zero code indicates failure.
+ * @return 0 if the lock is successfully initialized. A non-zero code indicates
+ * failure.
*
* If the lock cannot be initialized, attempts to take or give the lock
* will result in a Store/AMO access fault.
@@ -48,13 +48,14 @@ struct metal_lock {
__inline__ int metal_lock_init(struct metal_lock *lock) {
#ifdef __riscv_atomic
/* Get a handle for the memory which holds the lock state */
- struct metal_memory *lock_mem = metal_get_memory_from_address((uintptr_t) &(lock->_state));
- if(!lock_mem) {
+ struct metal_memory *lock_mem =
+ metal_get_memory_from_address((uintptr_t) & (lock->_state));
+ if (!lock_mem) {
return 1;
}
/* If the memory doesn't support atomics, report an error */
- if(!metal_memory_supports_atomics(lock_mem)) {
+ if (!metal_memory_supports_atomics(lock_mem)) {
return 2;
}
@@ -82,10 +83,10 @@ __inline__ int metal_lock_take(struct metal_lock *lock) {
int backoff = 1;
const int max_backoff = METAL_LOCK_BACKOFF_CYCLES * METAL_MAX_CORES;
- while(1) {
+ while (1) {
__asm__ volatile("amoswap.w.aq %[old], %[new], (%[state])"
- : [old] "=r" (old)
- : [new] "r" (new), [state] "r" (&(lock->_state))
+ : [old] "=r"(old)
+ : [new] "r"(new), [state] "r"(&(lock->_state))
: "memory");
if (old == 0) {
@@ -104,8 +105,7 @@ __inline__ int metal_lock_take(struct metal_lock *lock) {
return 0;
#else
/* Store the memory address in mtval like a normal store/amo access fault */
- __asm__ ("csrw mtval, %[state]"
- :: [state] "r" (&(lock->_state)));
+ __asm__("csrw mtval, %[state]" ::[state] "r"(&(lock->_state)));
/* Trigger a Store/AMO access fault */
_metal_trap(_METAL_STORE_AMO_ACCESS_FAULT);
@@ -125,15 +125,14 @@ __inline__ int metal_lock_take(struct metal_lock *lock) {
*/
__inline__ int metal_lock_give(struct metal_lock *lock) {
#ifdef __riscv_atomic
- __asm__ volatile("amoswap.w.rl x0, x0, (%[state])"
- :: [state] "r" (&(lock->_state))
- : "memory");
+ __asm__ volatile(
+ "amoswap.w.rl x0, x0, (%[state])" ::[state] "r"(&(lock->_state))
+ : "memory");
return 0;
#else
/* Store the memory address in mtval like a normal store/amo access fault */
- __asm__ ("csrw mtval, %[state]"
- :: [state] "r" (&(lock->_state)));
+ __asm__("csrw mtval, %[state]" ::[state] "r"(&(lock->_state)));
/* Trigger a Store/AMO access fault */
_metal_trap(_METAL_STORE_AMO_ACCESS_FAULT);