10 #define EXTRACT_FIELD(val, which) (((val) & (which)) / ((which) & ~((which)-1)))
11 #define INSERT_FIELD(val, which, fieldval) (((val) & ~(which)) | ((fieldval) * ((which) & ~((which)-1))))
15 #define DEFINE_MPRV_READ_FLAGS(name, type, insn, flags) \
16 static inline type name(type *p); \
17 static inline type name(type *p) \
19 size_t mprv = flags; \
22 "csrs mstatus, %1\n" \
23 STRINGIFY(insn) " %0, 0(%2)\n" \
24 "csrc mstatus, %1\n" \
25 : "=&r"(value) : "r"(mprv), "r"(p) : "memory" \
30 #define DEFINE_MPRV_READ(name, type, insn) \
31 DEFINE_MPRV_READ_FLAGS(name, type, insn, MSTATUS_MPRV)
33 #define DEFINE_MPRV_READ_MXR(name, type, insn) \
34 DEFINE_MPRV_READ_FLAGS(name, type, insn, MSTATUS_MPRV | MSTATUS_MXR)
36 #define DEFINE_MPRV_WRITE(name, type, insn) \
37 static inline void name(type *p, type value); \
38 static inline void name(type *p, type value) \
40 size_t mprv = MSTATUS_MPRV; \
42 "csrs mstatus, %0\n" \
43 STRINGIFY(insn) " %1, 0(%2)\n" \
44 "csrc mstatus, %0\n" \
45 :: "r"(mprv), "r"(value), "r"(p) : "memory" \
79 #if __riscv_xlen == 32
82 #elif __riscv_xlen == 64
87 #undef DEFINE_MPRV_READ_FLAGS
88 #undef DEFINE_MPRV_READ
89 #undef DEFINE_MPRV_READ_MXR
90 #undef DEFINE_MPRV_WRITE
unsigned long long uint64_t
#define DEFINE_MPRV_READ_MXR(name, type, insn)
#define DEFINE_MPRV_READ(name, type, insn)
#define DEFINE_MPRV_WRITE(name, type, insn)