7#ifndef _HARDWARE_SYNC_H
8#define _HARDWARE_SYNC_H
63#ifndef PARAM_ASSERTIONS_ENABLED_HARDWARE_SYNC
64#ifdef PARAM_ASSERTIONS_ENABLED_SYNC
65#define PARAM_ASSERTIONS_ENABLED_HARDWARE_SYNC PARAM_ASSERTIONS_ENABLED_SYNC
67#define PARAM_ASSERTIONS_ENABLED_HARDWARE_SYNC 0
80 __asm
volatile (
"nop");
82 __asm
volatile (
"nop.w");
85 __asm
volatile (
"nop");
95#if !__has_builtin(__sev)
100 pico_default_asm_volatile (
"sev");
114#if !__has_builtin(__wfe)
119 pico_default_asm_volatile (
"wfe");
132#if !__has_builtin(__wfi)
134 pico_default_asm_volatile(
"wfi");
149 __asm
volatile (
"fence rw, rw" : : :
"memory");
151 pico_default_asm_volatile (
"dmb" : : :
"memory");
164 __asm
volatile (
"fence rw, rw" : : :
"memory");
166 pico_default_asm_volatile (
"dsb" : : :
"memory");
179 __asm
volatile (
"fence.i" : : :
"memory");
181 pico_default_asm_volatile(
"isb" :::
"memory");
222 riscv_clear_csr(mstatus, 8);
225 pico_default_asm_volatile (
"cpsid i" : : :
"memory");
235 riscv_set_csr(mstatus, 8);
238 pico_default_asm_volatile (
"cpsie i" : : :
"memory");
255 pico_default_asm_volatile (
256 "csrrci %0, mstatus, 0x8\n"
257 :
"=r" (status) ::
"memory"
260 pico_default_asm_volatile (
263 :
"=r" (status) ::
"memory");
277 riscv_set_csr(mstatus, 8);
279 riscv_clear_csr(mstatus, 8);
283 pico_default_asm_volatile (
"msr PRIMASK,%0"::
"r" (status) :
"memory" );
300 riscv_set_csr(mstatus, status & 8);
304 pico_default_asm_volatile (
"msr PRIMASK,%0"::
"r" (status) :
"memory" );
308#include "hardware/sync/spin_lock.h"
377#if PICO_C_COMPILER_IS_GNU
378#define remove_volatile_cast(t, x) (t)(x)
379#define remove_volatile_cast_no_barrier(t, x) (t)(x)
381#define remove_volatile_cast(t, x) (__compiler_memory_barrier(), Clang_Pragma("clang diagnostic push") Clang_Pragma("clang diagnostic ignored \"-Wcast-qual\"") (t)(x) Clang_Pragma("clang diagnostic pop"))
382#define remove_volatile_cast_no_barrier(t, x) Clang_Pragma("clang diagnostic push") Clang_Pragma("clang diagnostic ignored \"-Wcast-qual\"") (t)(x) Clang_Pragma("clang diagnostic pop")
static __force_inline void disable_interrupts(void)
Explicitly disable interrupts on the calling core.
Definition sync.h:219
int spin_lock_claim_unused(bool required)
Claim a free spin lock.
Definition sync.c:43
static __force_inline uint32_t save_and_disable_interrupts(void)
Disable interrupts on the calling core, returning the previous interrupt state.
Definition sync.h:252
void spin_lock_unclaim(uint lock_num)
Mark a spin lock as no longer used.
Definition sync.c:37
static __force_inline void __mem_fence_release(void)
Release a memory fence.
Definition sync.h:204
void spin_lock_claim_mask(uint32_t lock_num_mask)
Mark multiple spin locks as used.
Definition sync.c:31
static __force_inline void __sev(void)
Insert a SEV instruction in to the code path.
Definition sync.h:96
static __force_inline void restore_interrupts_from_disabled(uint32_t status)
Restore interrupts to a specified state on the calling core with restricted transitions.
Definition sync.h:295
void spin_lock_claim(uint lock_num)
Mark a spin lock as used.
Definition sync.c:26
static __force_inline void __dmb(void)
Insert a DMB instruction in to the code path.
Definition sync.h:147
static __force_inline void enable_interrupts(void)
Explicitly enable interrupts on the calling core.
Definition sync.h:232
static __force_inline void __wfe(void)
Insert a WFE instruction in to the code path.
Definition sync.h:115
static __force_inline void restore_interrupts(uint32_t status)
Restore interrupts to a specified state on the calling core.
Definition sync.h:273
uint next_striped_spin_lock_num(void)
Return a spin lock number from the striped range.
Definition sync.c:18
static __force_inline void __nop(void)
Insert a NOP instruction in to the code path.
Definition sync.h:77
bool spin_lock_is_claimed(uint lock_num)
Determine if a spin lock is claimed.
Definition sync.c:47
static __force_inline void __mem_fence_acquire(void)
Acquire a memory fence.
Definition sync.h:188
static __force_inline void __wfi(void)
Insert a WFI instruction in to the code path.
Definition sync.h:133
static __force_inline void __isb(void)
Insert a ISB instruction in to the code path.
Definition sync.h:177
static __force_inline void __dsb(void)
Insert a DSB instruction in to the code path.
Definition sync.h:162