diff options
Diffstat (limited to 'machine/unprivileged_memory.h')
-rw-r--r-- | machine/unprivileged_memory.h | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/machine/unprivileged_memory.h b/machine/unprivileged_memory.h index 03f1e27..39a7722 100644 --- a/machine/unprivileged_memory.h +++ b/machine/unprivileged_memory.h @@ -45,13 +45,25 @@ DECLARE_UNPRIVILEGED_LOAD_FUNCTION(uint64_t, ld) DECLARE_UNPRIVILEGED_STORE_FUNCTION(uint64_t, sd) #else DECLARE_UNPRIVILEGED_LOAD_FUNCTION(uint32_t, lw) + +static inline uint64_t load_uint64_t(const uint64_t* addr, uintptr_t mepc) +{ + return load_uint32_t((uint32_t*)addr, mepc) + + ((uint64_t)load_uint32_t((uint32_t*)addr + 1, mepc) << 32); +} + +static inline void store_uint64_t(uint64_t* addr, uint64_t val, uintptr_t mepc) +{ + store_uint32_t((uint32_t*)addr, val, mepc); + store_uint32_t((uint32_t*)addr + 1, val >> 32, mepc); +} #endif -static uint32_t __attribute__((always_inline)) get_insn(uintptr_t mepc, uintptr_t* mstatus) +static uintptr_t __attribute__((always_inline)) get_insn(uintptr_t mepc, uintptr_t* mstatus) { register uintptr_t __mepc asm ("a2") = mepc; register uintptr_t __mstatus asm ("a3"); - uint32_t val; + uintptr_t val; #ifndef __riscv_compressed asm ("csrrs %[mstatus], mstatus, %[mprv]\n" "lw %[insn], (%[addr])\n" |