mirror of https://github.com/xemu-project/xemu.git
tcg/tci: Support raising sigbus for user-only
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
1cd49868d4
commit
fe1bee3a0a
20
tcg/tci.c
20
tcg/tci.c
|
@ -292,11 +292,11 @@ static bool tci_compare64(uint64_t u0, uint64_t u1, TCGCond condition)
|
|||
static uint64_t tci_qemu_ld(CPUArchState *env, target_ulong taddr,
|
||||
MemOpIdx oi, const void *tb_ptr)
|
||||
{
|
||||
MemOp mop = get_memop(oi) & (MO_BSWAP | MO_SSIZE);
|
||||
MemOp mop = get_memop(oi);
|
||||
uintptr_t ra = (uintptr_t)tb_ptr;
|
||||
|
||||
#ifdef CONFIG_SOFTMMU
|
||||
switch (mop) {
|
||||
switch (mop & (MO_BSWAP | MO_SSIZE)) {
|
||||
case MO_UB:
|
||||
return helper_ret_ldub_mmu(env, taddr, oi, ra);
|
||||
case MO_SB:
|
||||
|
@ -326,10 +326,14 @@ static uint64_t tci_qemu_ld(CPUArchState *env, target_ulong taddr,
|
|||
}
|
||||
#else
|
||||
void *haddr = g2h(env_cpu(env), taddr);
|
||||
unsigned a_mask = (1u << get_alignment_bits(mop)) - 1;
|
||||
uint64_t ret;
|
||||
|
||||
set_helper_retaddr(ra);
|
||||
switch (mop) {
|
||||
if (taddr & a_mask) {
|
||||
helper_unaligned_ld(env, taddr);
|
||||
}
|
||||
switch (mop & (MO_BSWAP | MO_SSIZE)) {
|
||||
case MO_UB:
|
||||
ret = ldub_p(haddr);
|
||||
break;
|
||||
|
@ -377,11 +381,11 @@ static uint64_t tci_qemu_ld(CPUArchState *env, target_ulong taddr,
|
|||
static void tci_qemu_st(CPUArchState *env, target_ulong taddr, uint64_t val,
|
||||
MemOpIdx oi, const void *tb_ptr)
|
||||
{
|
||||
MemOp mop = get_memop(oi) & (MO_BSWAP | MO_SSIZE);
|
||||
MemOp mop = get_memop(oi);
|
||||
uintptr_t ra = (uintptr_t)tb_ptr;
|
||||
|
||||
#ifdef CONFIG_SOFTMMU
|
||||
switch (mop) {
|
||||
switch (mop & (MO_BSWAP | MO_SIZE)) {
|
||||
case MO_UB:
|
||||
helper_ret_stb_mmu(env, taddr, val, oi, ra);
|
||||
break;
|
||||
|
@ -408,9 +412,13 @@ static void tci_qemu_st(CPUArchState *env, target_ulong taddr, uint64_t val,
|
|||
}
|
||||
#else
|
||||
void *haddr = g2h(env_cpu(env), taddr);
|
||||
unsigned a_mask = (1u << get_alignment_bits(mop)) - 1;
|
||||
|
||||
set_helper_retaddr(ra);
|
||||
switch (mop) {
|
||||
if (taddr & a_mask) {
|
||||
helper_unaligned_st(env, taddr);
|
||||
}
|
||||
switch (mop & (MO_BSWAP | MO_SIZE)) {
|
||||
case MO_UB:
|
||||
stb_p(haddr, val);
|
||||
break;
|
||||
|
|
Loading…
Reference in New Issue