target: Set TCGCPUOps::cpu_exec_halt to target's has_work implementation
Currently the TCGCPUOps::cpu_exec_halt method is optional, and if it is not set then the default is to call the CPUClass::has_work method (which has an identical function signature). We would like to make the cpu_exec_halt method mandatory so we can remove the runtime check and fallback handling. In preparation for that, make all the targets which don't need special handling in their cpu_exec_halt set it to their cpu_has_work implementation instead of leaving it unset. (This is every target except for arm and i386.) In the riscv case this requires us to make the function not be local to the source file it's defined in. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
This commit is contained in:
parent
fcee3707eb
commit
4f7b1ecba8
@ -219,6 +219,7 @@ static const TCGCPUOps alpha_tcg_ops = {
|
|||||||
#else
|
#else
|
||||||
.tlb_fill = alpha_cpu_tlb_fill,
|
.tlb_fill = alpha_cpu_tlb_fill,
|
||||||
.cpu_exec_interrupt = alpha_cpu_exec_interrupt,
|
.cpu_exec_interrupt = alpha_cpu_exec_interrupt,
|
||||||
|
.cpu_exec_halt = alpha_cpu_has_work,
|
||||||
.do_interrupt = alpha_cpu_do_interrupt,
|
.do_interrupt = alpha_cpu_do_interrupt,
|
||||||
.do_transaction_failed = alpha_cpu_do_transaction_failed,
|
.do_transaction_failed = alpha_cpu_do_transaction_failed,
|
||||||
.do_unaligned_access = alpha_cpu_do_unaligned_access,
|
.do_unaligned_access = alpha_cpu_do_unaligned_access,
|
||||||
|
@ -210,6 +210,7 @@ static const TCGCPUOps avr_tcg_ops = {
|
|||||||
.synchronize_from_tb = avr_cpu_synchronize_from_tb,
|
.synchronize_from_tb = avr_cpu_synchronize_from_tb,
|
||||||
.restore_state_to_opc = avr_restore_state_to_opc,
|
.restore_state_to_opc = avr_restore_state_to_opc,
|
||||||
.cpu_exec_interrupt = avr_cpu_exec_interrupt,
|
.cpu_exec_interrupt = avr_cpu_exec_interrupt,
|
||||||
|
.cpu_exec_halt = avr_cpu_has_work,
|
||||||
.tlb_fill = avr_cpu_tlb_fill,
|
.tlb_fill = avr_cpu_tlb_fill,
|
||||||
.do_interrupt = avr_cpu_do_interrupt,
|
.do_interrupt = avr_cpu_do_interrupt,
|
||||||
};
|
};
|
||||||
|
@ -186,6 +186,7 @@ static const TCGCPUOps crisv10_tcg_ops = {
|
|||||||
#ifndef CONFIG_USER_ONLY
|
#ifndef CONFIG_USER_ONLY
|
||||||
.tlb_fill = cris_cpu_tlb_fill,
|
.tlb_fill = cris_cpu_tlb_fill,
|
||||||
.cpu_exec_interrupt = cris_cpu_exec_interrupt,
|
.cpu_exec_interrupt = cris_cpu_exec_interrupt,
|
||||||
|
.cpu_exec_halt = cris_cpu_has_work,
|
||||||
.do_interrupt = crisv10_cpu_do_interrupt,
|
.do_interrupt = crisv10_cpu_do_interrupt,
|
||||||
#endif /* !CONFIG_USER_ONLY */
|
#endif /* !CONFIG_USER_ONLY */
|
||||||
};
|
};
|
||||||
@ -197,6 +198,7 @@ static const TCGCPUOps crisv32_tcg_ops = {
|
|||||||
#ifndef CONFIG_USER_ONLY
|
#ifndef CONFIG_USER_ONLY
|
||||||
.tlb_fill = cris_cpu_tlb_fill,
|
.tlb_fill = cris_cpu_tlb_fill,
|
||||||
.cpu_exec_interrupt = cris_cpu_exec_interrupt,
|
.cpu_exec_interrupt = cris_cpu_exec_interrupt,
|
||||||
|
.cpu_exec_halt = cris_cpu_has_work,
|
||||||
.do_interrupt = cris_cpu_do_interrupt,
|
.do_interrupt = cris_cpu_do_interrupt,
|
||||||
#endif /* !CONFIG_USER_ONLY */
|
#endif /* !CONFIG_USER_ONLY */
|
||||||
};
|
};
|
||||||
|
@ -228,6 +228,7 @@ static const TCGCPUOps hppa_tcg_ops = {
|
|||||||
#ifndef CONFIG_USER_ONLY
|
#ifndef CONFIG_USER_ONLY
|
||||||
.tlb_fill = hppa_cpu_tlb_fill,
|
.tlb_fill = hppa_cpu_tlb_fill,
|
||||||
.cpu_exec_interrupt = hppa_cpu_exec_interrupt,
|
.cpu_exec_interrupt = hppa_cpu_exec_interrupt,
|
||||||
|
.cpu_exec_halt = hppa_cpu_has_work,
|
||||||
.do_interrupt = hppa_cpu_do_interrupt,
|
.do_interrupt = hppa_cpu_do_interrupt,
|
||||||
.do_unaligned_access = hppa_cpu_do_unaligned_access,
|
.do_unaligned_access = hppa_cpu_do_unaligned_access,
|
||||||
.do_transaction_failed = hppa_cpu_do_transaction_failed,
|
.do_transaction_failed = hppa_cpu_do_transaction_failed,
|
||||||
|
@ -736,6 +736,7 @@ static const TCGCPUOps loongarch_tcg_ops = {
|
|||||||
#ifndef CONFIG_USER_ONLY
|
#ifndef CONFIG_USER_ONLY
|
||||||
.tlb_fill = loongarch_cpu_tlb_fill,
|
.tlb_fill = loongarch_cpu_tlb_fill,
|
||||||
.cpu_exec_interrupt = loongarch_cpu_exec_interrupt,
|
.cpu_exec_interrupt = loongarch_cpu_exec_interrupt,
|
||||||
|
.cpu_exec_halt = loongarch_cpu_has_work,
|
||||||
.do_interrupt = loongarch_cpu_do_interrupt,
|
.do_interrupt = loongarch_cpu_do_interrupt,
|
||||||
.do_transaction_failed = loongarch_cpu_do_transaction_failed,
|
.do_transaction_failed = loongarch_cpu_do_transaction_failed,
|
||||||
#endif
|
#endif
|
||||||
|
@ -536,6 +536,7 @@ static const TCGCPUOps m68k_tcg_ops = {
|
|||||||
#ifndef CONFIG_USER_ONLY
|
#ifndef CONFIG_USER_ONLY
|
||||||
.tlb_fill = m68k_cpu_tlb_fill,
|
.tlb_fill = m68k_cpu_tlb_fill,
|
||||||
.cpu_exec_interrupt = m68k_cpu_exec_interrupt,
|
.cpu_exec_interrupt = m68k_cpu_exec_interrupt,
|
||||||
|
.cpu_exec_halt = m68k_cpu_has_work,
|
||||||
.do_interrupt = m68k_cpu_do_interrupt,
|
.do_interrupt = m68k_cpu_do_interrupt,
|
||||||
.do_transaction_failed = m68k_cpu_transaction_failed,
|
.do_transaction_failed = m68k_cpu_transaction_failed,
|
||||||
#endif /* !CONFIG_USER_ONLY */
|
#endif /* !CONFIG_USER_ONLY */
|
||||||
|
@ -413,6 +413,7 @@ static const TCGCPUOps mb_tcg_ops = {
|
|||||||
#ifndef CONFIG_USER_ONLY
|
#ifndef CONFIG_USER_ONLY
|
||||||
.tlb_fill = mb_cpu_tlb_fill,
|
.tlb_fill = mb_cpu_tlb_fill,
|
||||||
.cpu_exec_interrupt = mb_cpu_exec_interrupt,
|
.cpu_exec_interrupt = mb_cpu_exec_interrupt,
|
||||||
|
.cpu_exec_halt = mb_cpu_has_work,
|
||||||
.do_interrupt = mb_cpu_do_interrupt,
|
.do_interrupt = mb_cpu_do_interrupt,
|
||||||
.do_transaction_failed = mb_cpu_transaction_failed,
|
.do_transaction_failed = mb_cpu_transaction_failed,
|
||||||
.do_unaligned_access = mb_cpu_do_unaligned_access,
|
.do_unaligned_access = mb_cpu_do_unaligned_access,
|
||||||
|
@ -555,6 +555,7 @@ static const TCGCPUOps mips_tcg_ops = {
|
|||||||
#if !defined(CONFIG_USER_ONLY)
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
.tlb_fill = mips_cpu_tlb_fill,
|
.tlb_fill = mips_cpu_tlb_fill,
|
||||||
.cpu_exec_interrupt = mips_cpu_exec_interrupt,
|
.cpu_exec_interrupt = mips_cpu_exec_interrupt,
|
||||||
|
.cpu_exec_halt = mips_cpu_has_work,
|
||||||
.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,
|
||||||
|
@ -233,6 +233,7 @@ static const TCGCPUOps openrisc_tcg_ops = {
|
|||||||
#ifndef CONFIG_USER_ONLY
|
#ifndef CONFIG_USER_ONLY
|
||||||
.tlb_fill = openrisc_cpu_tlb_fill,
|
.tlb_fill = openrisc_cpu_tlb_fill,
|
||||||
.cpu_exec_interrupt = openrisc_cpu_exec_interrupt,
|
.cpu_exec_interrupt = openrisc_cpu_exec_interrupt,
|
||||||
|
.cpu_exec_halt = openrisc_cpu_has_work,
|
||||||
.do_interrupt = openrisc_cpu_do_interrupt,
|
.do_interrupt = openrisc_cpu_do_interrupt,
|
||||||
#endif /* !CONFIG_USER_ONLY */
|
#endif /* !CONFIG_USER_ONLY */
|
||||||
};
|
};
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* PowerPC CPU initialization for qemu.
|
* PowerPC CPU initialization for qemu.
|
||||||
*
|
*
|
||||||
@ -7481,6 +7482,7 @@ static const TCGCPUOps ppc_tcg_ops = {
|
|||||||
#else
|
#else
|
||||||
.tlb_fill = ppc_cpu_tlb_fill,
|
.tlb_fill = ppc_cpu_tlb_fill,
|
||||||
.cpu_exec_interrupt = ppc_cpu_exec_interrupt,
|
.cpu_exec_interrupt = ppc_cpu_exec_interrupt,
|
||||||
|
.cpu_exec_halt = ppc_cpu_has_work,
|
||||||
.do_interrupt = ppc_cpu_do_interrupt,
|
.do_interrupt = ppc_cpu_do_interrupt,
|
||||||
.cpu_exec_enter = ppc_cpu_exec_enter,
|
.cpu_exec_enter = ppc_cpu_exec_enter,
|
||||||
.cpu_exec_exit = ppc_cpu_exec_exit,
|
.cpu_exec_exit = ppc_cpu_exec_exit,
|
||||||
|
@ -903,7 +903,7 @@ static vaddr riscv_cpu_get_pc(CPUState *cs)
|
|||||||
return env->pc;
|
return env->pc;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool riscv_cpu_has_work(CPUState *cs)
|
bool riscv_cpu_has_work(CPUState *cs)
|
||||||
{
|
{
|
||||||
#ifndef CONFIG_USER_ONLY
|
#ifndef CONFIG_USER_ONLY
|
||||||
RISCVCPU *cpu = RISCV_CPU(cs);
|
RISCVCPU *cpu = RISCV_CPU(cs);
|
||||||
|
@ -136,4 +136,7 @@ static inline float16 check_nanbox_h(CPURISCVState *env, uint64_t f)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Our implementation of CPUClass::has_work */
|
||||||
|
bool riscv_cpu_has_work(CPUState *cs);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#include "exec/exec-all.h"
|
#include "exec/exec-all.h"
|
||||||
#include "tcg-cpu.h"
|
#include "tcg-cpu.h"
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
|
#include "internals.h"
|
||||||
#include "pmu.h"
|
#include "pmu.h"
|
||||||
#include "time_helper.h"
|
#include "time_helper.h"
|
||||||
#include "qapi/error.h"
|
#include "qapi/error.h"
|
||||||
@ -138,6 +139,7 @@ static const TCGCPUOps riscv_tcg_ops = {
|
|||||||
#ifndef CONFIG_USER_ONLY
|
#ifndef CONFIG_USER_ONLY
|
||||||
.tlb_fill = riscv_cpu_tlb_fill,
|
.tlb_fill = riscv_cpu_tlb_fill,
|
||||||
.cpu_exec_interrupt = riscv_cpu_exec_interrupt,
|
.cpu_exec_interrupt = riscv_cpu_exec_interrupt,
|
||||||
|
.cpu_exec_halt = riscv_cpu_has_work,
|
||||||
.do_interrupt = riscv_cpu_do_interrupt,
|
.do_interrupt = riscv_cpu_do_interrupt,
|
||||||
.do_transaction_failed = riscv_cpu_do_transaction_failed,
|
.do_transaction_failed = riscv_cpu_do_transaction_failed,
|
||||||
.do_unaligned_access = riscv_cpu_do_unaligned_access,
|
.do_unaligned_access = riscv_cpu_do_unaligned_access,
|
||||||
|
@ -192,6 +192,7 @@ static const TCGCPUOps rx_tcg_ops = {
|
|||||||
|
|
||||||
#ifndef CONFIG_USER_ONLY
|
#ifndef CONFIG_USER_ONLY
|
||||||
.cpu_exec_interrupt = rx_cpu_exec_interrupt,
|
.cpu_exec_interrupt = rx_cpu_exec_interrupt,
|
||||||
|
.cpu_exec_halt = rx_cpu_has_work,
|
||||||
.do_interrupt = rx_cpu_do_interrupt,
|
.do_interrupt = rx_cpu_do_interrupt,
|
||||||
#endif /* !CONFIG_USER_ONLY */
|
#endif /* !CONFIG_USER_ONLY */
|
||||||
};
|
};
|
||||||
|
@ -370,6 +370,7 @@ static const TCGCPUOps s390_tcg_ops = {
|
|||||||
#else
|
#else
|
||||||
.tlb_fill = s390_cpu_tlb_fill,
|
.tlb_fill = s390_cpu_tlb_fill,
|
||||||
.cpu_exec_interrupt = s390_cpu_exec_interrupt,
|
.cpu_exec_interrupt = s390_cpu_exec_interrupt,
|
||||||
|
.cpu_exec_halt = s390_cpu_has_work,
|
||||||
.do_interrupt = s390_cpu_do_interrupt,
|
.do_interrupt = s390_cpu_do_interrupt,
|
||||||
.debug_excp_handler = s390x_cpu_debug_excp_handler,
|
.debug_excp_handler = s390x_cpu_debug_excp_handler,
|
||||||
.do_unaligned_access = s390x_cpu_do_unaligned_access,
|
.do_unaligned_access = s390x_cpu_do_unaligned_access,
|
||||||
|
@ -254,6 +254,7 @@ static const TCGCPUOps superh_tcg_ops = {
|
|||||||
#ifndef CONFIG_USER_ONLY
|
#ifndef CONFIG_USER_ONLY
|
||||||
.tlb_fill = superh_cpu_tlb_fill,
|
.tlb_fill = superh_cpu_tlb_fill,
|
||||||
.cpu_exec_interrupt = superh_cpu_exec_interrupt,
|
.cpu_exec_interrupt = superh_cpu_exec_interrupt,
|
||||||
|
.cpu_exec_halt = superh_cpu_has_work,
|
||||||
.do_interrupt = superh_cpu_do_interrupt,
|
.do_interrupt = superh_cpu_do_interrupt,
|
||||||
.do_unaligned_access = superh_cpu_do_unaligned_access,
|
.do_unaligned_access = superh_cpu_do_unaligned_access,
|
||||||
.io_recompile_replay_branch = superh_io_recompile_replay_branch,
|
.io_recompile_replay_branch = superh_io_recompile_replay_branch,
|
||||||
|
@ -926,6 +926,7 @@ static const TCGCPUOps sparc_tcg_ops = {
|
|||||||
#ifndef CONFIG_USER_ONLY
|
#ifndef CONFIG_USER_ONLY
|
||||||
.tlb_fill = sparc_cpu_tlb_fill,
|
.tlb_fill = sparc_cpu_tlb_fill,
|
||||||
.cpu_exec_interrupt = sparc_cpu_exec_interrupt,
|
.cpu_exec_interrupt = sparc_cpu_exec_interrupt,
|
||||||
|
.cpu_exec_halt = sparc_cpu_has_work,
|
||||||
.do_interrupt = sparc_cpu_do_interrupt,
|
.do_interrupt = sparc_cpu_do_interrupt,
|
||||||
.do_transaction_failed = sparc_cpu_do_transaction_failed,
|
.do_transaction_failed = sparc_cpu_do_transaction_failed,
|
||||||
.do_unaligned_access = sparc_cpu_do_unaligned_access,
|
.do_unaligned_access = sparc_cpu_do_unaligned_access,
|
||||||
|
@ -169,6 +169,7 @@ static const TCGCPUOps tricore_tcg_ops = {
|
|||||||
.synchronize_from_tb = tricore_cpu_synchronize_from_tb,
|
.synchronize_from_tb = tricore_cpu_synchronize_from_tb,
|
||||||
.restore_state_to_opc = tricore_restore_state_to_opc,
|
.restore_state_to_opc = tricore_restore_state_to_opc,
|
||||||
.tlb_fill = tricore_cpu_tlb_fill,
|
.tlb_fill = tricore_cpu_tlb_fill,
|
||||||
|
.cpu_exec_halt = tricore_cpu_has_work,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void tricore_cpu_class_init(ObjectClass *c, void *data)
|
static void tricore_cpu_class_init(ObjectClass *c, void *data)
|
||||||
|
@ -234,6 +234,7 @@ static const TCGCPUOps xtensa_tcg_ops = {
|
|||||||
#ifndef CONFIG_USER_ONLY
|
#ifndef CONFIG_USER_ONLY
|
||||||
.tlb_fill = xtensa_cpu_tlb_fill,
|
.tlb_fill = xtensa_cpu_tlb_fill,
|
||||||
.cpu_exec_interrupt = xtensa_cpu_exec_interrupt,
|
.cpu_exec_interrupt = xtensa_cpu_exec_interrupt,
|
||||||
|
.cpu_exec_halt = xtensa_cpu_has_work,
|
||||||
.do_interrupt = xtensa_cpu_do_interrupt,
|
.do_interrupt = xtensa_cpu_do_interrupt,
|
||||||
.do_transaction_failed = xtensa_cpu_do_transaction_failed,
|
.do_transaction_failed = xtensa_cpu_do_transaction_failed,
|
||||||
.do_unaligned_access = xtensa_cpu_do_unaligned_access,
|
.do_unaligned_access = xtensa_cpu_do_unaligned_access,
|
||||||
|
Loading…
Reference in New Issue
Block a user