target-sparc: ignore MMU-faults if MMU is disabled in hypervisor mode
while IMMU/DMMU is disabled - ignore MMU-faults in hypervisorv mode or if CPU doesn't have hypervisor - signal TT_INSN_REAL_TRANSLATION_MISS/TT_DATA_REAL_TRANSLATION_MISS otherwise Signed-off-by: Artyom Tarasenko <atar4qemu@gmail.com>
This commit is contained in:
parent
23eb9e6b6d
commit
1ceca92853
@ -68,6 +68,8 @@
|
||||
#define TT_DATA_ACCESS 0x32
|
||||
#define TT_UNALIGNED 0x34
|
||||
#define TT_PRIV_ACT 0x37
|
||||
#define TT_INSN_REAL_TRANSLATION_MISS 0x3e
|
||||
#define TT_DATA_REAL_TRANSLATION_MISS 0x3f
|
||||
#define TT_EXTINT 0x40
|
||||
#define TT_IVEC 0x60
|
||||
#define TT_TMISS 0x64
|
||||
|
@ -1664,14 +1664,25 @@ void sparc_cpu_unassigned_access(CPUState *cs, hwaddr addr,
|
||||
{
|
||||
SPARCCPU *cpu = SPARC_CPU(cs);
|
||||
CPUSPARCState *env = &cpu->env;
|
||||
int tt = is_exec ? TT_CODE_ACCESS : TT_DATA_ACCESS;
|
||||
|
||||
#ifdef DEBUG_UNASSIGNED
|
||||
printf("Unassigned mem access to " TARGET_FMT_plx " from " TARGET_FMT_lx
|
||||
"\n", addr, env->pc);
|
||||
#endif
|
||||
|
||||
cpu_raise_exception_ra(env, tt, GETPC());
|
||||
if (is_exec) { /* XXX has_hypervisor */
|
||||
if (env->lsu & (IMMU_E)) {
|
||||
cpu_raise_exception_ra(env, TT_CODE_ACCESS, GETPC());
|
||||
} else if (cpu_has_hypervisor(env) && !(env->hpstate & HS_PRIV)) {
|
||||
cpu_raise_exception_ra(env, TT_INSN_REAL_TRANSLATION_MISS, GETPC());
|
||||
}
|
||||
} else {
|
||||
if (env->lsu & (DMMU_E)) {
|
||||
cpu_raise_exception_ra(env, TT_DATA_ACCESS, GETPC());
|
||||
} else if (cpu_has_hypervisor(env) && !(env->hpstate & HS_PRIV)) {
|
||||
cpu_raise_exception_ra(env, TT_DATA_REAL_TRANSLATION_MISS, GETPC());
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user