7#ifndef _HARDWARE_SYNC_H
8#define _HARDWARE_SYNC_H
14#include "hardware/hazard3.h"
57#ifndef PARAM_ASSERTIONS_ENABLED_HARDWARE_SYNC
58#ifdef PARAM_ASSERTIONS_ENABLED_SYNC
59#define PARAM_ASSERTIONS_ENABLED_HARDWARE_SYNC PARAM_ASSERTIONS_ENABLED_SYNC
61#define PARAM_ASSERTIONS_ENABLED_HARDWARE_SYNC 0
74 __asm
volatile (
"nop");
76 __asm
volatile (
"nop.w");
79 __asm
volatile (
"nop");
89#if !__has_builtin(__sev)
94 pico_default_asm_volatile (
"sev");
105#if !__has_builtin(__wfe)
110 pico_default_asm_volatile (
"wfe");
120#if !__has_builtin(__wfi)
122 pico_default_asm_volatile(
"wfi");
134 __asm
volatile (
"fence rw, rw" : : :
"memory");
136 pico_default_asm_volatile (
"dmb" : : :
"memory");
149 __asm
volatile (
"fence rw, rw" : : :
"memory");
151 pico_default_asm_volatile (
"dsb" : : :
"memory");
164 __asm
volatile (
"fence.i" : : :
"memory");
166 pico_default_asm_volatile(
"isb" :::
"memory");
209 pico_default_asm_volatile (
210 "csrrci %0, mstatus, 0x8\n"
211 :
"=r" (status) ::
"memory"
214 pico_default_asm_volatile (
217 :
"=r" (status) ::
"memory");
231 riscv_set_csr(mstatus, 8);
233 riscv_clear_csr(mstatus, 8);
237 pico_default_asm_volatile (
"msr PRIMASK,%0"::
"r" (status) :
"memory" );
254 riscv_set_csr(mstatus, status & 8);
258 pico_default_asm_volatile (
"msr PRIMASK,%0"::
"r" (status) :
"memory" );
262#include "hardware/sync/spin_lock.h"
331#if PICO_C_COMPILER_IS_GNU
332#define remove_volatile_cast(t, x) (t)(x)
333#define remove_volatile_cast_no_barrier(t, x) (t)(x)
335#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"); })
336#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"); })
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)
Save and disable interrupts.
Definition sync.h:206
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:189
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:90
static __force_inline void restore_interrupts_from_disabled(uint32_t status)
Restore interrupts to a specified state with restricted transitions.
Definition sync.h:249
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:132
static __force_inline void __wfe(void)
Insert a WFE instruction in to the code path.
Definition sync.h:106
static __force_inline void restore_interrupts(uint32_t status)
Restore interrupts to a specified state.
Definition sync.h:227
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:71
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:173
static __force_inline void __wfi(void)
Insert a WFI instruction in to the code path.
Definition sync.h:121
static __force_inline void __isb(void)
Insert a ISB instruction in to the code path.
Definition sync.h:162
static __force_inline void __dsb(void)
Insert a DSB instruction in to the code path.
Definition sync.h:147