1
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
63
64
65
71
82
83
84
89
90
98
99
105
106
107
108
109
110
111
112
113
114
115
120
121
125
126
132
139
140
147
154
155
162
169
170
173
174
175
176
177
178
179
180
181
182
183
184
185
189
190
191
192
193
194
195
196
197
198
199
200
201
206
207
208
209
213
214
218
219
220
221
222
227
240
241
242
243
244
245
246
247
248
249
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
310
311
312
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
335
338
339
340
341
342
343
/* ... */
#ifndef _HARDWARE_SYNC_H
#define _HARDWARE_SYNC_H
#include "pico.h"
#include "hardware/address_mapped.h"
#ifdef __riscv
#include "hardware/hazard3.h"
#endif
#ifdef __cplusplus
extern "C" {
#endif
/* ... */
#ifndef PARAM_ASSERTIONS_ENABLED_HARDWARE_SYNC
#ifdef PARAM_ASSERTIONS_ENABLED_SYNC
#define PARAM_ASSERTIONS_ENABLED_HARDWARE_SYNC PARAM_ASSERTIONS_ENABLED_SYNC
#else
#define PARAM_ASSERTIONS_ENABLED_HARDWARE_SYNC 0
#endif/* ... */
#endif
/* ... */
__force_inline static void __nop(void) {
#if !__ARM_ARCH_6M__
#ifdef __riscv
__asm volatile ("nop");
#else
__asm volatile ("nop.w");
#endif/* ... */
#else
__asm volatile ("nop");
#endif
}{ ... }
/* ... */
#if !__has_builtin(__sev)
__force_inline static void __sev(void) {
#ifdef __riscv
__hazard3_unblock();
#else
pico_default_asm_volatile ("sev");
#endif
}{ ... }
/* ... */#endif
/* ... */
#if !__has_builtin(__wfe)
__force_inline static void __wfe(void) {
#ifdef __riscv
__hazard3_block();
#else
pico_default_asm_volatile ("wfe");
#endif
}{ ... }
/* ... */#endif
/* ... */
#if !__has_builtin(__wfi)
__force_inline static void __wfi(void) {
pico_default_asm_volatile("wfi");
}{ ... }
/* ... */#endif
/* ... */
__force_inline static void __dmb(void) {
#ifdef __riscv
__asm volatile ("fence rw, rw" : : : "memory");
#else
pico_default_asm_volatile ("dmb" : : : "memory");
#endif
}{ ... }
/* ... */
__force_inline static void __dsb(void) {
#ifdef __riscv
__asm volatile ("fence rw, rw" : : : "memory");
#else
pico_default_asm_volatile ("dsb" : : : "memory");
#endif
}{ ... }
/* ... */
__force_inline static void __isb(void) {
#ifdef __riscv
__asm volatile ("fence.i" : : : "memory");
#else
pico_default_asm_volatile("isb" ::: "memory");
#endif
}{ ... }
/* ... */
__force_inline static void __mem_fence_acquire(void) {
__dmb();
}{ ... }
/* ... */
__force_inline static void __mem_fence_release(void) {
__dmb();
}{ ... }
/* ... */
__force_inline static uint32_t save_and_disable_interrupts(void) {
uint32_t status;
#ifdef __riscv
pico_default_asm_volatile (
"csrrci %0, mstatus, 0x8\n"
: "=r" (status) :: "memory"
);/* ... */
#else
pico_default_asm_volatile (
"mrs %0, PRIMASK\n"
"cpsid i"
: "=r" (status) :: "memory");/* ... */
#endif
return status;
}{ ... }
/* ... */
__force_inline static void restore_interrupts(uint32_t status) {
#ifdef __riscv
__compiler_memory_barrier();
if (status & 0x8) {
riscv_set_csr(mstatus, 8);
}if (status & 0x8) { ... } else {
riscv_clear_csr(mstatus, 8);
}else { ... }
__compiler_memory_barrier();/* ... */
#else
pico_default_asm_volatile ("msr PRIMASK,%0"::"r" (status) : "memory" );
#endif
}{ ... }
/* ... */
__force_inline static void restore_interrupts_from_disabled(uint32_t status) {
#ifdef __riscv
__compiler_memory_barrier();
riscv_set_csr(mstatus, status & 8);
__compiler_memory_barrier();/* ... */
#else
pico_default_asm_volatile ("msr PRIMASK,%0"::"r" (status) : "memory" );/* ... */
#endif
}{ ... }
#include "hardware/sync/spin_lock.h"
/* ... */
uint next_striped_spin_lock_num(void);
/* ... */
void spin_lock_claim(uint lock_num);
/* ... */
void spin_lock_claim_mask(uint32_t lock_num_mask);
/* ... */
void spin_lock_unclaim(uint lock_num);
/* ... */
int spin_lock_claim_unused(bool required);
/* ... */
bool spin_lock_is_claimed(uint lock_num);
#if PICO_C_COMPILER_IS_GNU
#define remove_volatile_cast(t, x) (t)(x)
#define remove_volatile_cast_no_barrier(t, x) (t)(x)
/* ... */#else
#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"); })
#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"); })
/* ... */#endif
#ifdef __cplusplus
}extern "C" { ... }
#endif
/* ... */
#endif