diff --git a/include/sbi/riscv_asm.h b/include/sbi/riscv_asm.h index 4605db20..ef48dc89 100644 --- a/include/sbi/riscv_asm.h +++ b/include/sbi/riscv_asm.h @@ -156,6 +156,26 @@ : "memory"); \ }) +#if __riscv_xlen == 64 +#define __csrrw64(op, csr, csrh, val) (true ? op(csr, val) : (uint64_t)csrh) +#define __csrr64( op, csr, csrh) (true ? op(csr) : (uint64_t)csrh) +#define __csrw64( op, csr, csrh, val) (true ? op(csr, val) : (uint64_t)csrh) +#elif __riscv_xlen == 32 +#define __csrrw64(op, csr, csrh, val) ( op(csr, val) | (uint64_t)op(csrh, val >> 32) << 32) +#define __csrr64( op, csr, csrh) ( op(csr) | (uint64_t)op(csrh) << 32) +#define __csrw64( op, csr, csrh, val) ({ op(csr, val); op(csrh, val >> 32); }) +#endif + +#define csr_swap64( csr, val) __csrrw64(csr_swap, csr, csr ## H, val) +#define csr_read64( csr) __csrr64 (csr_read, csr, csr ## H) +#define csr_read_relaxed64(csr) __csrr64 (csr_read_relaxed, csr, csr ## H) +#define csr_write64( csr, val) __csrw64 (csr_write, csr, csr ## H, val) +#define csr_read_set64( csr, val) __csrrw64(csr_read_set, csr, csr ## H, val) +#define csr_set64( csr, val) __csrw64 (csr_set, csr, csr ## H, val) +#define csr_clear64( csr, val) __csrw64 (csr_clear, csr, csr ## H, val) +#define csr_read_clear64( csr, val) __csrrw64(csr_read_clear, csr, csr ## H, val) +#define csr_clear64( csr, val) __csrw64 (csr_clear, csr, csr ## H, val) + unsigned long csr_read_num(int csr_num); void csr_write_num(int csr_num, unsigned long val);