mirror of https://github.com/xemu-project/xemu.git
target/mips: Restrict cpu_exec_interrupt() handler to sysemu
Restrict cpu_exec_interrupt() and its callees to sysemu. Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Reviewed-by: Warner Losh <imp@bsdimp.com> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-Id: <20210911165434.531552-15-f4bug@amsat.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
eb3ef3136e
commit
6eb66e086a
|
@ -539,10 +539,10 @@ static const struct SysemuCPUOps mips_sysemu_ops = {
|
||||||
static const struct TCGCPUOps mips_tcg_ops = {
|
static const struct TCGCPUOps mips_tcg_ops = {
|
||||||
.initialize = mips_tcg_init,
|
.initialize = mips_tcg_init,
|
||||||
.synchronize_from_tb = mips_cpu_synchronize_from_tb,
|
.synchronize_from_tb = mips_cpu_synchronize_from_tb,
|
||||||
.cpu_exec_interrupt = mips_cpu_exec_interrupt,
|
|
||||||
.tlb_fill = mips_cpu_tlb_fill,
|
.tlb_fill = mips_cpu_tlb_fill,
|
||||||
|
|
||||||
#if !defined(CONFIG_USER_ONLY)
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
|
.cpu_exec_interrupt = mips_cpu_exec_interrupt,
|
||||||
.do_interrupt = mips_cpu_do_interrupt,
|
.do_interrupt = mips_cpu_do_interrupt,
|
||||||
.do_transaction_failed = mips_cpu_do_transaction_failed,
|
.do_transaction_failed = mips_cpu_do_transaction_failed,
|
||||||
.do_unaligned_access = mips_cpu_do_unaligned_access,
|
.do_unaligned_access = mips_cpu_do_unaligned_access,
|
||||||
|
|
|
@ -86,24 +86,6 @@ void mips_cpu_synchronize_from_tb(CPUState *cs, const TranslationBlock *tb)
|
||||||
env->hflags |= tb->flags & MIPS_HFLAG_BMASK;
|
env->hflags |= tb->flags & MIPS_HFLAG_BMASK;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool mips_cpu_exec_interrupt(CPUState *cs, int interrupt_request)
|
|
||||||
{
|
|
||||||
if (interrupt_request & CPU_INTERRUPT_HARD) {
|
|
||||||
MIPSCPU *cpu = MIPS_CPU(cs);
|
|
||||||
CPUMIPSState *env = &cpu->env;
|
|
||||||
|
|
||||||
if (cpu_mips_hw_interrupts_enabled(env) &&
|
|
||||||
cpu_mips_hw_interrupts_pending(env)) {
|
|
||||||
/* Raise it */
|
|
||||||
cs->exception_index = EXCP_EXT_INTERRUPT;
|
|
||||||
env->error_code = 0;
|
|
||||||
mips_cpu_do_interrupt(cs);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char * const excp_names[EXCP_LAST + 1] = {
|
static const char * const excp_names[EXCP_LAST + 1] = {
|
||||||
[EXCP_RESET] = "reset",
|
[EXCP_RESET] = "reset",
|
||||||
[EXCP_SRESET] = "soft reset",
|
[EXCP_SRESET] = "soft reset",
|
||||||
|
|
|
@ -1339,6 +1339,24 @@ void mips_cpu_do_interrupt(CPUState *cs)
|
||||||
cs->exception_index = EXCP_NONE;
|
cs->exception_index = EXCP_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool mips_cpu_exec_interrupt(CPUState *cs, int interrupt_request)
|
||||||
|
{
|
||||||
|
if (interrupt_request & CPU_INTERRUPT_HARD) {
|
||||||
|
MIPSCPU *cpu = MIPS_CPU(cs);
|
||||||
|
CPUMIPSState *env = &cpu->env;
|
||||||
|
|
||||||
|
if (cpu_mips_hw_interrupts_enabled(env) &&
|
||||||
|
cpu_mips_hw_interrupts_pending(env)) {
|
||||||
|
/* Raise it */
|
||||||
|
cs->exception_index = EXCP_EXT_INTERRUPT;
|
||||||
|
env->error_code = 0;
|
||||||
|
mips_cpu_do_interrupt(cs);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void r4k_invalidate_tlb(CPUMIPSState *env, int idx, int use_extra)
|
void r4k_invalidate_tlb(CPUMIPSState *env, int idx, int use_extra)
|
||||||
{
|
{
|
||||||
CPUState *cs = env_cpu(env);
|
CPUState *cs = env_cpu(env);
|
||||||
|
|
|
@ -18,8 +18,6 @@
|
||||||
void mips_tcg_init(void);
|
void mips_tcg_init(void);
|
||||||
|
|
||||||
void mips_cpu_synchronize_from_tb(CPUState *cs, const TranslationBlock *tb);
|
void mips_cpu_synchronize_from_tb(CPUState *cs, const TranslationBlock *tb);
|
||||||
void mips_cpu_do_interrupt(CPUState *cpu);
|
|
||||||
bool mips_cpu_exec_interrupt(CPUState *cpu, int int_req);
|
|
||||||
bool mips_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
|
bool mips_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
|
||||||
MMUAccessType access_type, int mmu_idx,
|
MMUAccessType access_type, int mmu_idx,
|
||||||
bool probe, uintptr_t retaddr);
|
bool probe, uintptr_t retaddr);
|
||||||
|
@ -41,6 +39,9 @@ static inline void QEMU_NORETURN do_raise_exception(CPUMIPSState *env,
|
||||||
|
|
||||||
#if !defined(CONFIG_USER_ONLY)
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
|
|
||||||
|
void mips_cpu_do_interrupt(CPUState *cpu);
|
||||||
|
bool mips_cpu_exec_interrupt(CPUState *cpu, int int_req);
|
||||||
|
|
||||||
void mmu_init(CPUMIPSState *env, const mips_def_t *def);
|
void mmu_init(CPUMIPSState *env, const mips_def_t *def);
|
||||||
|
|
||||||
void update_pagemask(CPUMIPSState *env, target_ulong arg1, int32_t *pagemask);
|
void update_pagemask(CPUMIPSState *env, target_ulong arg1, int32_t *pagemask);
|
||||||
|
|
|
@ -57,8 +57,3 @@ bool mips_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
|
||||||
raise_mmu_exception(env, address, access_type);
|
raise_mmu_exception(env, address, access_type);
|
||||||
do_raise_exception_err(env, cs->exception_index, env->error_code, retaddr);
|
do_raise_exception_err(env, cs->exception_index, env->error_code, retaddr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void mips_cpu_do_interrupt(CPUState *cs)
|
|
||||||
{
|
|
||||||
cs->exception_index = EXCP_NONE;
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in New Issue