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,
|
static uint64_t tci_qemu_ld(CPUArchState *env, target_ulong taddr,
|
||||||
MemOpIdx oi, const void *tb_ptr)
|
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;
|
uintptr_t ra = (uintptr_t)tb_ptr;
|
||||||
|
|
||||||
#ifdef CONFIG_SOFTMMU
|
#ifdef CONFIG_SOFTMMU
|
||||||
switch (mop) {
|
switch (mop & (MO_BSWAP | MO_SSIZE)) {
|
||||||
case MO_UB:
|
case MO_UB:
|
||||||
return helper_ret_ldub_mmu(env, taddr, oi, ra);
|
return helper_ret_ldub_mmu(env, taddr, oi, ra);
|
||||||
case MO_SB:
|
case MO_SB:
|
||||||
|
@ -326,10 +326,14 @@ static uint64_t tci_qemu_ld(CPUArchState *env, target_ulong taddr,
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
void *haddr = g2h(env_cpu(env), taddr);
|
void *haddr = g2h(env_cpu(env), taddr);
|
||||||
|
unsigned a_mask = (1u << get_alignment_bits(mop)) - 1;
|
||||||
uint64_t ret;
|
uint64_t ret;
|
||||||
|
|
||||||
set_helper_retaddr(ra);
|
set_helper_retaddr(ra);
|
||||||
switch (mop) {
|
if (taddr & a_mask) {
|
||||||
|
helper_unaligned_ld(env, taddr);
|
||||||
|
}
|
||||||
|
switch (mop & (MO_BSWAP | MO_SSIZE)) {
|
||||||
case MO_UB:
|
case MO_UB:
|
||||||
ret = ldub_p(haddr);
|
ret = ldub_p(haddr);
|
||||||
break;
|
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,
|
static void tci_qemu_st(CPUArchState *env, target_ulong taddr, uint64_t val,
|
||||||
MemOpIdx oi, const void *tb_ptr)
|
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;
|
uintptr_t ra = (uintptr_t)tb_ptr;
|
||||||
|
|
||||||
#ifdef CONFIG_SOFTMMU
|
#ifdef CONFIG_SOFTMMU
|
||||||
switch (mop) {
|
switch (mop & (MO_BSWAP | MO_SIZE)) {
|
||||||
case MO_UB:
|
case MO_UB:
|
||||||
helper_ret_stb_mmu(env, taddr, val, oi, ra);
|
helper_ret_stb_mmu(env, taddr, val, oi, ra);
|
||||||
break;
|
break;
|
||||||
|
@ -408,9 +412,13 @@ static void tci_qemu_st(CPUArchState *env, target_ulong taddr, uint64_t val,
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
void *haddr = g2h(env_cpu(env), taddr);
|
void *haddr = g2h(env_cpu(env), taddr);
|
||||||
|
unsigned a_mask = (1u << get_alignment_bits(mop)) - 1;
|
||||||
|
|
||||||
set_helper_retaddr(ra);
|
set_helper_retaddr(ra);
|
||||||
switch (mop) {
|
if (taddr & a_mask) {
|
||||||
|
helper_unaligned_st(env, taddr);
|
||||||
|
}
|
||||||
|
switch (mop & (MO_BSWAP | MO_SIZE)) {
|
||||||
case MO_UB:
|
case MO_UB:
|
||||||
stb_p(haddr, val);
|
stb_p(haddr, val);
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in New Issue