accel/tcg: Add cpu_ld*_code_mmu
At least RISC-V has the need to be able to perform a read using execute permissions, outside of translation. Add helpers to facilitate this. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Acked-by: Alistair Francis <alistair.francis@wdc.com> Reviewed-by: Weiwei Li <liweiwei@iscas.ac.cn> Tested-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com> Message-Id: <20230325105429.1142530-9-richard.henderson@linaro.org> Message-Id: <20230412114333.118895-9-richard.henderson@linaro.org>
This commit is contained in:
parent
dc165fcd4e
commit
2899062614
|
@ -2773,3 +2773,51 @@ uint64_t cpu_ldq_code(CPUArchState *env, abi_ptr addr)
|
||||||
MemOpIdx oi = make_memop_idx(MO_TEUQ, cpu_mmu_index(env, true));
|
MemOpIdx oi = make_memop_idx(MO_TEUQ, cpu_mmu_index(env, true));
|
||||||
return full_ldq_code(env, addr, oi, 0);
|
return full_ldq_code(env, addr, oi, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint8_t cpu_ldb_code_mmu(CPUArchState *env, abi_ptr addr,
|
||||||
|
MemOpIdx oi, uintptr_t retaddr)
|
||||||
|
{
|
||||||
|
return full_ldub_code(env, addr, oi, retaddr);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t cpu_ldw_code_mmu(CPUArchState *env, abi_ptr addr,
|
||||||
|
MemOpIdx oi, uintptr_t retaddr)
|
||||||
|
{
|
||||||
|
MemOp mop = get_memop(oi);
|
||||||
|
int idx = get_mmuidx(oi);
|
||||||
|
uint16_t ret;
|
||||||
|
|
||||||
|
ret = full_lduw_code(env, addr, make_memop_idx(MO_TEUW, idx), retaddr);
|
||||||
|
if ((mop & MO_BSWAP) != MO_TE) {
|
||||||
|
ret = bswap16(ret);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t cpu_ldl_code_mmu(CPUArchState *env, abi_ptr addr,
|
||||||
|
MemOpIdx oi, uintptr_t retaddr)
|
||||||
|
{
|
||||||
|
MemOp mop = get_memop(oi);
|
||||||
|
int idx = get_mmuidx(oi);
|
||||||
|
uint32_t ret;
|
||||||
|
|
||||||
|
ret = full_ldl_code(env, addr, make_memop_idx(MO_TEUL, idx), retaddr);
|
||||||
|
if ((mop & MO_BSWAP) != MO_TE) {
|
||||||
|
ret = bswap32(ret);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t cpu_ldq_code_mmu(CPUArchState *env, abi_ptr addr,
|
||||||
|
MemOpIdx oi, uintptr_t retaddr)
|
||||||
|
{
|
||||||
|
MemOp mop = get_memop(oi);
|
||||||
|
int idx = get_mmuidx(oi);
|
||||||
|
uint64_t ret;
|
||||||
|
|
||||||
|
ret = full_ldq_code(env, addr, make_memop_idx(MO_TEUQ, idx), retaddr);
|
||||||
|
if ((mop & MO_BSWAP) != MO_TE) {
|
||||||
|
ret = bswap64(ret);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
|
@ -1219,6 +1219,64 @@ uint64_t cpu_ldq_code(CPUArchState *env, abi_ptr ptr)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint8_t cpu_ldb_code_mmu(CPUArchState *env, abi_ptr addr,
|
||||||
|
MemOpIdx oi, uintptr_t ra)
|
||||||
|
{
|
||||||
|
void *haddr;
|
||||||
|
uint8_t ret;
|
||||||
|
|
||||||
|
haddr = cpu_mmu_lookup(env, addr, oi, ra, MMU_INST_FETCH);
|
||||||
|
ret = ldub_p(haddr);
|
||||||
|
clear_helper_retaddr();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t cpu_ldw_code_mmu(CPUArchState *env, abi_ptr addr,
|
||||||
|
MemOpIdx oi, uintptr_t ra)
|
||||||
|
{
|
||||||
|
void *haddr;
|
||||||
|
uint16_t ret;
|
||||||
|
|
||||||
|
haddr = cpu_mmu_lookup(env, addr, oi, ra, MMU_INST_FETCH);
|
||||||
|
ret = lduw_p(haddr);
|
||||||
|
clear_helper_retaddr();
|
||||||
|
if (get_memop(oi) & MO_BSWAP) {
|
||||||
|
ret = bswap16(ret);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t cpu_ldl_code_mmu(CPUArchState *env, abi_ptr addr,
|
||||||
|
MemOpIdx oi, uintptr_t ra)
|
||||||
|
{
|
||||||
|
void *haddr;
|
||||||
|
uint32_t ret;
|
||||||
|
|
||||||
|
haddr = cpu_mmu_lookup(env, addr, oi, ra, MMU_INST_FETCH);
|
||||||
|
ret = ldl_p(haddr);
|
||||||
|
clear_helper_retaddr();
|
||||||
|
if (get_memop(oi) & MO_BSWAP) {
|
||||||
|
ret = bswap32(ret);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t cpu_ldq_code_mmu(CPUArchState *env, abi_ptr addr,
|
||||||
|
MemOpIdx oi, uintptr_t ra)
|
||||||
|
{
|
||||||
|
void *haddr;
|
||||||
|
uint64_t ret;
|
||||||
|
|
||||||
|
validate_memop(oi, MO_BEUQ);
|
||||||
|
haddr = cpu_mmu_lookup(env, addr, oi, ra, MMU_DATA_LOAD);
|
||||||
|
ret = ldq_p(haddr);
|
||||||
|
clear_helper_retaddr();
|
||||||
|
if (get_memop(oi) & MO_BSWAP) {
|
||||||
|
ret = bswap64(ret);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
#include "ldst_common.c.inc"
|
#include "ldst_common.c.inc"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -445,6 +445,15 @@ static inline CPUTLBEntry *tlb_entry(CPUArchState *env, uintptr_t mmu_idx,
|
||||||
# define cpu_stq_mmu cpu_stq_le_mmu
|
# define cpu_stq_mmu cpu_stq_le_mmu
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
uint8_t cpu_ldb_code_mmu(CPUArchState *env, abi_ptr addr,
|
||||||
|
MemOpIdx oi, uintptr_t ra);
|
||||||
|
uint16_t cpu_ldw_code_mmu(CPUArchState *env, abi_ptr addr,
|
||||||
|
MemOpIdx oi, uintptr_t ra);
|
||||||
|
uint32_t cpu_ldl_code_mmu(CPUArchState *env, abi_ptr addr,
|
||||||
|
MemOpIdx oi, uintptr_t ra);
|
||||||
|
uint64_t cpu_ldq_code_mmu(CPUArchState *env, abi_ptr addr,
|
||||||
|
MemOpIdx oi, uintptr_t ra);
|
||||||
|
|
||||||
uint32_t cpu_ldub_code(CPUArchState *env, abi_ptr addr);
|
uint32_t cpu_ldub_code(CPUArchState *env, abi_ptr addr);
|
||||||
uint32_t cpu_lduw_code(CPUArchState *env, abi_ptr addr);
|
uint32_t cpu_lduw_code(CPUArchState *env, abi_ptr addr);
|
||||||
uint32_t cpu_ldl_code(CPUArchState *env, abi_ptr addr);
|
uint32_t cpu_ldl_code(CPUArchState *env, abi_ptr addr);
|
||||||
|
|
Loading…
Reference in New Issue