Skip to content

Commit 5b11dc3

Browse files
feat(riscv/csr): add logical CSR swap to CSR accessors
This commit adds a "logical" swap operation to the CSR registers accessors. It is implemented with the `csrrw` instruction under the hood. Signed-off-by: Filippo Fontana <[email protected]>
1 parent a1daae7 commit 5b11dc3

File tree

1 file changed

+25
-18
lines changed

1 file changed

+25
-18
lines changed

src/arch/riscv/inc/arch/csrs.h

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -228,24 +228,31 @@
228228

229229
#ifndef __ASSEMBLER__
230230

231-
#define CSRS_GEN_ACCESSORS_NAMED(csr_name, csr_id) \
232-
static inline unsigned long csrs_##csr_name##_read(void) \
233-
{ \
234-
unsigned long csr_value; \
235-
__asm__ volatile("csrr %0," XSTR(csr_id) : "=r"(csr_value)::"memory"); \
236-
return csr_value; \
237-
} \
238-
static inline void csrs_##csr_name##_write(unsigned long csr_value) \
239-
{ \
240-
__asm__ volatile("csrw " XSTR(csr_id) ",%0" ::"r"(csr_value) : "memory"); \
241-
} \
242-
static inline void csrs_##csr_name##_set(unsigned long csr_value) \
243-
{ \
244-
__asm__ volatile("csrs " XSTR(csr_id) ",%0" ::"r"(csr_value) : "memory"); \
245-
} \
246-
static inline void csrs_##csr_name##_clear(unsigned long csr_value) \
247-
{ \
248-
__asm__ volatile("csrc " XSTR(csr_id) ",%0" ::"r"(csr_value) : "memory"); \
231+
#define CSRS_GEN_ACCESSORS_NAMED(csr_name, csr_id) \
232+
static inline unsigned long csrs_##csr_name##_read(void) \
233+
{ \
234+
unsigned long csr_value; \
235+
__asm__ volatile("csrr %0," XSTR(csr_id) : "=r"(csr_value)::"memory"); \
236+
return csr_value; \
237+
} \
238+
static inline void csrs_##csr_name##_write(unsigned long csr_value) \
239+
{ \
240+
__asm__ volatile("csrw " XSTR(csr_id) ",%0" ::"r"(csr_value) : "memory"); \
241+
} \
242+
static inline void csrs_##csr_name##_set(unsigned long csr_value) \
243+
{ \
244+
__asm__ volatile("csrs " XSTR(csr_id) ",%0" ::"r"(csr_value) : "memory"); \
245+
} \
246+
static inline void csrs_##csr_name##_clear(unsigned long csr_value) \
247+
{ \
248+
__asm__ volatile("csrc " XSTR(csr_id) ",%0" ::"r"(csr_value) : "memory"); \
249+
} \
250+
static inline unsigned long csrs_##csr_name##_swap(unsigned long csr_value) \
251+
{ \
252+
unsigned long reg_val; \
253+
__asm__ volatile("csrrw %0," XSTR(csr_id) ",%1" : "=r"(reg_val) : "rK"(csr_value) \
254+
: "memory"); \
255+
return reg_val; \
249256
}
250257

251258
#define CSRS_GEN_ACCESSORS(csr) CSRS_GEN_ACCESSORS_NAMED(csr, csr)

0 commit comments

Comments
 (0)