aboutsummaryrefslogtreecommitdiff
path: root/machine/unprivileged_memory.h
diff options
context:
space:
mode:
Diffstat (limited to 'machine/unprivileged_memory.h')
-rw-r--r--machine/unprivileged_memory.h16
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"