mirror of
https://github.com/Motorhead1991/qemu.git
synced 2026-03-01 23:54:54 -07:00
target/microblaze: Split out mb_unaligned_access_internal
Use an explicit 64-bit type for the address to store in EAR. Reviewed-by: Edgar E. Iglesias <edgar.iglesias@amd.com> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
19f036726a
commit
67f2d507ca
1 changed files with 36 additions and 28 deletions
|
|
@ -27,6 +27,42 @@
|
|||
#include "qemu/host-utils.h"
|
||||
#include "exec/log.h"
|
||||
|
||||
|
||||
G_NORETURN
|
||||
static void mb_unaligned_access_internal(CPUState *cs, uint64_t addr,
|
||||
uintptr_t retaddr)
|
||||
{
|
||||
CPUMBState *env = cpu_env(cs);
|
||||
uint32_t esr, iflags;
|
||||
|
||||
/* Recover the pc and iflags from the corresponding insn_start. */
|
||||
cpu_restore_state(cs, retaddr);
|
||||
iflags = env->iflags;
|
||||
|
||||
qemu_log_mask(CPU_LOG_INT,
|
||||
"Unaligned access addr=0x%" PRIx64 " pc=%x iflags=%x\n",
|
||||
addr, env->pc, iflags);
|
||||
|
||||
esr = ESR_EC_UNALIGNED_DATA;
|
||||
if (likely(iflags & ESR_ESS_FLAG)) {
|
||||
esr |= iflags & ESR_ESS_MASK;
|
||||
} else {
|
||||
qemu_log_mask(LOG_UNIMP, "Unaligned access without ESR_ESS_FLAG\n");
|
||||
}
|
||||
|
||||
env->ear = addr;
|
||||
env->esr = esr;
|
||||
cs->exception_index = EXCP_HW_EXCP;
|
||||
cpu_loop_exit(cs);
|
||||
}
|
||||
|
||||
void mb_cpu_do_unaligned_access(CPUState *cs, vaddr addr,
|
||||
MMUAccessType access_type,
|
||||
int mmu_idx, uintptr_t retaddr)
|
||||
{
|
||||
mb_unaligned_access_internal(cs, addr, retaddr);
|
||||
}
|
||||
|
||||
#ifndef CONFIG_USER_ONLY
|
||||
static bool mb_cpu_access_is_secure(MicroBlazeCPU *cpu,
|
||||
MMUAccessType access_type)
|
||||
|
|
@ -269,31 +305,3 @@ bool mb_cpu_exec_interrupt(CPUState *cs, int interrupt_request)
|
|||
}
|
||||
|
||||
#endif /* !CONFIG_USER_ONLY */
|
||||
|
||||
void mb_cpu_do_unaligned_access(CPUState *cs, vaddr addr,
|
||||
MMUAccessType access_type,
|
||||
int mmu_idx, uintptr_t retaddr)
|
||||
{
|
||||
MicroBlazeCPU *cpu = MICROBLAZE_CPU(cs);
|
||||
uint32_t esr, iflags;
|
||||
|
||||
/* Recover the pc and iflags from the corresponding insn_start. */
|
||||
cpu_restore_state(cs, retaddr);
|
||||
iflags = cpu->env.iflags;
|
||||
|
||||
qemu_log_mask(CPU_LOG_INT,
|
||||
"Unaligned access addr=" TARGET_FMT_lx " pc=%x iflags=%x\n",
|
||||
(target_ulong)addr, cpu->env.pc, iflags);
|
||||
|
||||
esr = ESR_EC_UNALIGNED_DATA;
|
||||
if (likely(iflags & ESR_ESS_FLAG)) {
|
||||
esr |= iflags & ESR_ESS_MASK;
|
||||
} else {
|
||||
qemu_log_mask(LOG_UNIMP, "Unaligned access without ESR_ESS_FLAG\n");
|
||||
}
|
||||
|
||||
cpu->env.ear = addr;
|
||||
cpu->env.esr = esr;
|
||||
cs->exception_index = EXCP_HW_EXCP;
|
||||
cpu_loop_exit(cs);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue