#include "exec/tlb-flags.h"
#include "trace.h"
+#ifndef CONFIG_USER_ONLY
+static inline MemOp mo_endian_env(CPURISCVState *env)
+{
+ /*
+ * A couple of bits in MSTATUS set the endianness:
+ * - MSTATUS_UBE (User-mode),
+ * - MSTATUS_SBE (Supervisor-mode),
+ * - MSTATUS_MBE (Machine-mode)
+ * but we don't implement that yet.
+ */
+ return MO_TE;
+}
+#endif
+
/* Exceptions processing helpers */
G_NORETURN void riscv_raise_exception(CPURISCVState *env,
RISCVException exception,
{
uintptr_t ra = GETPC();
int mmu_idx = check_access_hlsv(env, false, ra);
- MemOpIdx oi = make_memop_idx(MO_TE | MO_UW, mmu_idx);
+ MemOpIdx oi = make_memop_idx(mo_endian_env(env) | MO_UW, mmu_idx);
return cpu_ldw_mmu(env, adjust_addr_virt(env, addr), oi, ra);
}
{
uintptr_t ra = GETPC();
int mmu_idx = check_access_hlsv(env, false, ra);
- MemOpIdx oi = make_memop_idx(MO_TE | MO_UL, mmu_idx);
+ MemOpIdx oi = make_memop_idx(mo_endian_env(env) | MO_UL, mmu_idx);
return cpu_ldl_mmu(env, adjust_addr_virt(env, addr), oi, ra);
}
{
uintptr_t ra = GETPC();
int mmu_idx = check_access_hlsv(env, false, ra);
- MemOpIdx oi = make_memop_idx(MO_TE | MO_UQ, mmu_idx);
+ MemOpIdx oi = make_memop_idx(mo_endian_env(env) | MO_UQ, mmu_idx);
return cpu_ldq_mmu(env, adjust_addr_virt(env, addr), oi, ra);
}
{
uintptr_t ra = GETPC();
int mmu_idx = check_access_hlsv(env, false, ra);
- MemOpIdx oi = make_memop_idx(MO_TE | MO_UW, mmu_idx);
+ MemOpIdx oi = make_memop_idx(mo_endian_env(env) | MO_UW, mmu_idx);
cpu_stw_mmu(env, adjust_addr_virt(env, addr), val, oi, ra);
}
{
uintptr_t ra = GETPC();
int mmu_idx = check_access_hlsv(env, false, ra);
- MemOpIdx oi = make_memop_idx(MO_TE | MO_UL, mmu_idx);
+ MemOpIdx oi = make_memop_idx(mo_endian_env(env) | MO_UL, mmu_idx);
cpu_stl_mmu(env, adjust_addr_virt(env, addr), val, oi, ra);
}
{
uintptr_t ra = GETPC();
int mmu_idx = check_access_hlsv(env, false, ra);
- MemOpIdx oi = make_memop_idx(MO_TE | MO_UQ, mmu_idx);
+ MemOpIdx oi = make_memop_idx(mo_endian_env(env) | MO_UQ, mmu_idx);
cpu_stq_mmu(env, adjust_addr_virt(env, addr), val, oi, ra);
}
{
uintptr_t ra = GETPC();
int mmu_idx = check_access_hlsv(env, true, ra);
- MemOpIdx oi = make_memop_idx(MO_TE | MO_UW, mmu_idx);
+ MemOpIdx oi = make_memop_idx(mo_endian_env(env) | MO_UW, mmu_idx);
return cpu_ldw_code_mmu(env, addr, oi, GETPC());
}
{
uintptr_t ra = GETPC();
int mmu_idx = check_access_hlsv(env, true, ra);
- MemOpIdx oi = make_memop_idx(MO_TE | MO_UL, mmu_idx);
+ MemOpIdx oi = make_memop_idx(mo_endian_env(env) | MO_UL, mmu_idx);
return cpu_ldl_code_mmu(env, addr, oi, ra);
}