mirror of
https://github.com/freebsd/freebsd-src
synced 2024-10-15 12:54:27 +00:00
riscv: Implement atomic operations
Implement atomic_load_acq_16, atomic_store_rel_16. These are needed by bhyve(8) PCIe bus emulation code. Group 16-bit atomic functions similarly to 32 and 64-bit. Reviewed by: mhorne Differential Revision: https://reviews.freebsd.org/D45228
This commit is contained in:
parent
ddd0d4f4cd
commit
2183004e14
|
@ -1,5 +1,5 @@
|
||||||
/*-
|
/*-
|
||||||
* Copyright (c) 2015 Ruslan Bukin <br@bsdpad.com>
|
* Copyright (c) 2015-2024 Ruslan Bukin <br@bsdpad.com>
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Portions of this software were developed by SRI International and the
|
* Portions of this software were developed by SRI International and the
|
||||||
|
@ -105,8 +105,6 @@ atomic_fcmpset_rel_##WIDTH(__volatile uint##WIDTH##_t *p, \
|
||||||
|
|
||||||
ATOMIC_CMPSET_ACQ_REL(8);
|
ATOMIC_CMPSET_ACQ_REL(8);
|
||||||
ATOMIC_FCMPSET_ACQ_REL(8);
|
ATOMIC_FCMPSET_ACQ_REL(8);
|
||||||
ATOMIC_CMPSET_ACQ_REL(16);
|
|
||||||
ATOMIC_FCMPSET_ACQ_REL(16);
|
|
||||||
|
|
||||||
#define atomic_cmpset_char atomic_cmpset_8
|
#define atomic_cmpset_char atomic_cmpset_8
|
||||||
#define atomic_cmpset_acq_char atomic_cmpset_acq_8
|
#define atomic_cmpset_acq_char atomic_cmpset_acq_8
|
||||||
|
@ -116,11 +114,40 @@ ATOMIC_FCMPSET_ACQ_REL(16);
|
||||||
#define atomic_fcmpset_rel_char atomic_fcmpset_rel_8
|
#define atomic_fcmpset_rel_char atomic_fcmpset_rel_8
|
||||||
|
|
||||||
#define atomic_cmpset_short atomic_cmpset_16
|
#define atomic_cmpset_short atomic_cmpset_16
|
||||||
#define atomic_cmpset_acq_short atomic_cmpset_acq_16
|
|
||||||
#define atomic_cmpset_rel_short atomic_cmpset_rel_16
|
|
||||||
#define atomic_fcmpset_short atomic_fcmpset_16
|
#define atomic_fcmpset_short atomic_fcmpset_16
|
||||||
|
|
||||||
|
ATOMIC_CMPSET_ACQ_REL(16);
|
||||||
|
ATOMIC_FCMPSET_ACQ_REL(16);
|
||||||
|
|
||||||
|
#define atomic_load_acq_16 atomic_load_acq_16
|
||||||
|
static __inline uint16_t
|
||||||
|
atomic_load_acq_16(volatile uint16_t *p)
|
||||||
|
{
|
||||||
|
uint16_t ret;
|
||||||
|
|
||||||
|
ret = *p;
|
||||||
|
|
||||||
|
fence();
|
||||||
|
|
||||||
|
return (ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline void
|
||||||
|
atomic_store_rel_16(volatile uint16_t *p, uint16_t val)
|
||||||
|
{
|
||||||
|
|
||||||
|
fence();
|
||||||
|
|
||||||
|
*p = val;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define atomic_cmpset_acq_short atomic_cmpset_acq_16
|
||||||
#define atomic_fcmpset_acq_short atomic_fcmpset_acq_16
|
#define atomic_fcmpset_acq_short atomic_fcmpset_acq_16
|
||||||
|
#define atomic_load_acq_short atomic_load_acq_16
|
||||||
|
|
||||||
|
#define atomic_cmpset_rel_short atomic_cmpset_rel_16
|
||||||
#define atomic_fcmpset_rel_short atomic_fcmpset_rel_16
|
#define atomic_fcmpset_rel_short atomic_fcmpset_rel_16
|
||||||
|
#define atomic_store_rel_short atomic_store_rel_16
|
||||||
|
|
||||||
static __inline void
|
static __inline void
|
||||||
atomic_add_32(volatile uint32_t *p, uint32_t val)
|
atomic_add_32(volatile uint32_t *p, uint32_t val)
|
||||||
|
|
Loading…
Reference in a new issue