target-mips: add exception base to MIPS CPU
Replace hardcoded 0xbfc00000 with exception_base which is initialized with this default address so there is no functional change here. However, it is now exposed and consequently it will be possible to modify it from outside of the CPU. Signed-off-by: Leon Alrae <leon.alrae@imgtec.com>
This commit is contained in:
parent
19494f811a
commit
89777fd10f
@ -616,6 +616,7 @@ struct CPUMIPSState {
|
||||
void *irq[8];
|
||||
QEMUTimer *timer; /* Internal timer */
|
||||
MemoryRegion *itc_tag; /* ITC Configuration Tags */
|
||||
target_ulong exception_base; /* ExceptionBase input to the core */
|
||||
};
|
||||
|
||||
/**
|
||||
@ -807,6 +808,7 @@ int cpu_mips_signal_handler(int host_signum, void *pinfo, void *puc);
|
||||
|
||||
#define cpu_init(cpu_model) CPU(cpu_mips_init(cpu_model))
|
||||
bool cpu_supports_cps_smp(const char *cpu_model);
|
||||
void cpu_set_exception_base(int vp_index, target_ulong address);
|
||||
|
||||
/* TODO QOM'ify CPU reset and remove */
|
||||
void cpu_state_reset(CPUMIPSState *s);
|
||||
|
@ -640,7 +640,7 @@ void mips_cpu_do_interrupt(CPUState *cs)
|
||||
/* EJTAG probe trap enable is not implemented... */
|
||||
if (!(env->CP0_Status & (1 << CP0St_EXL)))
|
||||
env->CP0_Cause &= ~(1U << CP0Ca_BD);
|
||||
env->active_tc.PC = (int32_t)0xBFC00480;
|
||||
env->active_tc.PC = env->exception_base + 0x480;
|
||||
set_hflags_for_handler(env);
|
||||
break;
|
||||
case EXCP_RESET:
|
||||
@ -667,7 +667,7 @@ void mips_cpu_do_interrupt(CPUState *cs)
|
||||
env->hflags &= ~(MIPS_HFLAG_KSU);
|
||||
if (!(env->CP0_Status & (1 << CP0St_EXL)))
|
||||
env->CP0_Cause &= ~(1U << CP0Ca_BD);
|
||||
env->active_tc.PC = (int32_t)0xBFC00000;
|
||||
env->active_tc.PC = env->exception_base;
|
||||
set_hflags_for_handler(env);
|
||||
break;
|
||||
case EXCP_EXT_INTERRUPT:
|
||||
@ -849,7 +849,7 @@ void mips_cpu_do_interrupt(CPUState *cs)
|
||||
}
|
||||
env->hflags &= ~MIPS_HFLAG_BMASK;
|
||||
if (env->CP0_Status & (1 << CP0St_BEV)) {
|
||||
env->active_tc.PC = (int32_t)0xBFC00200;
|
||||
env->active_tc.PC = env->exception_base + 0x200;
|
||||
} else {
|
||||
env->active_tc.PC = (int32_t)(env->CP0_EBase & ~0x3ff);
|
||||
}
|
||||
|
@ -20169,6 +20169,7 @@ MIPSCPU *cpu_mips_init(const char *cpu_model)
|
||||
cpu = MIPS_CPU(object_new(TYPE_MIPS_CPU));
|
||||
env = &cpu->env;
|
||||
env->cpu_model = def;
|
||||
env->exception_base = (int32_t)0xBFC00000;
|
||||
|
||||
#ifndef CONFIG_USER_ONLY
|
||||
mmu_init(env, def);
|
||||
@ -20191,6 +20192,12 @@ bool cpu_supports_cps_smp(const char *cpu_model)
|
||||
return (def->CP0_Config3 & (1 << CP0C3_CMGCR)) != 0;
|
||||
}
|
||||
|
||||
void cpu_set_exception_base(int vp_index, target_ulong address)
|
||||
{
|
||||
MIPSCPU *vp = MIPS_CPU(qemu_get_cpu(vp_index));
|
||||
vp->env.exception_base = address;
|
||||
}
|
||||
|
||||
void cpu_state_reset(CPUMIPSState *env)
|
||||
{
|
||||
MIPSCPU *cpu = mips_env_get_cpu(env);
|
||||
@ -20281,7 +20288,7 @@ void cpu_state_reset(CPUMIPSState *env)
|
||||
} else {
|
||||
env->CP0_ErrorEPC = env->active_tc.PC;
|
||||
}
|
||||
env->active_tc.PC = (int32_t)0xBFC00000;
|
||||
env->active_tc.PC = env->exception_base;
|
||||
env->CP0_Random = env->tlb->nb_tlb - 1;
|
||||
env->tlb->tlb_in_use = env->tlb->nb_tlb;
|
||||
env->CP0_Wired = 0;
|
||||
|
Loading…
Reference in New Issue
Block a user