mirror of
https://gitlab.com/qemu-project/qemu
synced 2025-04-29 09:22:36 +08:00
tcg: Convert TARGET_SUPPORTS_MTTCG to TCGCPUOps::mttcg_supported field
Instead of having a compile-time TARGET_SUPPORTS_MTTCG definition, have each target set the 'mttcg_supported' field in the TCGCPUOps structure. Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> Reviewed-by: Anton Johansson <anjo@rev.ng> Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-ID: <20250405161320.76854-17-philmd@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
a522b04bb9
commit
a3d40b5eff
@ -41,8 +41,9 @@
|
||||
#include "hw/boards.h"
|
||||
#include "system/tcg.h"
|
||||
#endif
|
||||
#include "accel/tcg/cpu-ops.h"
|
||||
#include "internal-common.h"
|
||||
#include "cpu-param.h"
|
||||
#include "cpu.h"
|
||||
|
||||
|
||||
struct TCGState {
|
||||
@ -88,11 +89,9 @@ static int tcg_init_machine(MachineState *ms)
|
||||
unsigned max_threads = 1;
|
||||
|
||||
#ifndef CONFIG_USER_ONLY
|
||||
# ifdef TARGET_SUPPORTS_MTTCG
|
||||
bool mttcg_supported = true;
|
||||
# else
|
||||
bool mttcg_supported = false;
|
||||
# endif
|
||||
CPUClass *cc = CPU_CLASS(object_class_by_name(CPU_RESOLVING_TYPE));
|
||||
bool mttcg_supported = cc->tcg_ops->mttcg_supported;
|
||||
|
||||
switch (s->mttcg_enabled) {
|
||||
case ON_OFF_AUTO_AUTO:
|
||||
/*
|
||||
|
@ -1,6 +1,5 @@
|
||||
TARGET_ARCH=aarch64
|
||||
TARGET_BASE_ARCH=arm
|
||||
TARGET_SUPPORTS_MTTCG=y
|
||||
TARGET_KVM_HAVE_GUEST_DEBUG=y
|
||||
TARGET_XML_FILES= gdb-xml/aarch64-core.xml gdb-xml/aarch64-fpu.xml gdb-xml/arm-core.xml gdb-xml/arm-vfp.xml gdb-xml/arm-vfp3.xml gdb-xml/arm-vfp-sysregs.xml gdb-xml/arm-neon.xml gdb-xml/arm-m-profile.xml gdb-xml/arm-m-profile-mve.xml gdb-xml/aarch64-pauth.xml
|
||||
# needed by boot.c
|
||||
|
@ -1,3 +1,2 @@
|
||||
TARGET_ARCH=alpha
|
||||
TARGET_SUPPORTS_MTTCG=y
|
||||
TARGET_LONG_BITS=64
|
||||
|
@ -1,5 +1,4 @@
|
||||
TARGET_ARCH=arm
|
||||
TARGET_SUPPORTS_MTTCG=y
|
||||
TARGET_XML_FILES= gdb-xml/arm-core.xml gdb-xml/arm-vfp.xml gdb-xml/arm-vfp3.xml gdb-xml/arm-vfp-sysregs.xml gdb-xml/arm-neon.xml gdb-xml/arm-m-profile.xml gdb-xml/arm-m-profile-mve.xml
|
||||
# needed by boot.c
|
||||
TARGET_NEED_FDT=y
|
||||
|
@ -1,4 +1,3 @@
|
||||
TARGET_ARCH=hppa
|
||||
TARGET_BIG_ENDIAN=y
|
||||
TARGET_SUPPORTS_MTTCG=y
|
||||
TARGET_LONG_BITS=64
|
||||
|
@ -1,5 +1,4 @@
|
||||
TARGET_ARCH=i386
|
||||
TARGET_SUPPORTS_MTTCG=y
|
||||
TARGET_KVM_HAVE_GUEST_DEBUG=y
|
||||
TARGET_KVM_HAVE_RESET_PARKED_VCPU=y
|
||||
TARGET_XML_FILES= gdb-xml/i386-32bit.xml
|
||||
|
@ -1,7 +1,6 @@
|
||||
TARGET_ARCH=loongarch64
|
||||
TARGET_BASE_ARCH=loongarch
|
||||
TARGET_KVM_HAVE_GUEST_DEBUG=y
|
||||
TARGET_SUPPORTS_MTTCG=y
|
||||
TARGET_XML_FILES= gdb-xml/loongarch-base32.xml gdb-xml/loongarch-base64.xml gdb-xml/loongarch-fpu.xml gdb-xml/loongarch-lsx.xml gdb-xml/loongarch-lasx.xml
|
||||
# all boards require libfdt
|
||||
TARGET_NEED_FDT=y
|
||||
|
@ -1,6 +1,5 @@
|
||||
TARGET_ARCH=microblaze
|
||||
TARGET_BIG_ENDIAN=y
|
||||
TARGET_SUPPORTS_MTTCG=y
|
||||
# needed by boot.c
|
||||
TARGET_NEED_FDT=y
|
||||
TARGET_XML_FILES=gdb-xml/microblaze-core.xml gdb-xml/microblaze-stack-protect.xml
|
||||
|
@ -1,5 +1,4 @@
|
||||
TARGET_ARCH=microblaze
|
||||
TARGET_SUPPORTS_MTTCG=y
|
||||
# needed by boot.c
|
||||
TARGET_NEED_FDT=y
|
||||
TARGET_XML_FILES=gdb-xml/microblaze-core.xml gdb-xml/microblaze-stack-protect.xml
|
||||
|
@ -1,4 +1,3 @@
|
||||
TARGET_ARCH=mips
|
||||
TARGET_BIG_ENDIAN=y
|
||||
TARGET_SUPPORTS_MTTCG=y
|
||||
TARGET_LONG_BITS=32
|
||||
|
@ -1,3 +1,2 @@
|
||||
TARGET_ARCH=mips
|
||||
TARGET_SUPPORTS_MTTCG=y
|
||||
TARGET_LONG_BITS=32
|
||||
|
@ -1,5 +1,4 @@
|
||||
TARGET_ARCH=openrisc
|
||||
TARGET_SUPPORTS_MTTCG=y
|
||||
TARGET_BIG_ENDIAN=y
|
||||
# needed by boot.c and all boards
|
||||
TARGET_NEED_FDT=y
|
||||
|
@ -1,7 +1,6 @@
|
||||
TARGET_ARCH=ppc64
|
||||
TARGET_BASE_ARCH=ppc
|
||||
TARGET_BIG_ENDIAN=y
|
||||
TARGET_SUPPORTS_MTTCG=y
|
||||
TARGET_KVM_HAVE_GUEST_DEBUG=y
|
||||
TARGET_XML_FILES= gdb-xml/power64-core.xml gdb-xml/power-fpu.xml gdb-xml/power-altivec.xml gdb-xml/power-spe.xml gdb-xml/power-vsx.xml
|
||||
# all boards require libfdt
|
||||
|
@ -1,6 +1,5 @@
|
||||
TARGET_ARCH=riscv32
|
||||
TARGET_BASE_ARCH=riscv
|
||||
TARGET_SUPPORTS_MTTCG=y
|
||||
TARGET_XML_FILES= gdb-xml/riscv-32bit-cpu.xml gdb-xml/riscv-32bit-fpu.xml gdb-xml/riscv-64bit-fpu.xml gdb-xml/riscv-32bit-virtual.xml
|
||||
# needed by boot.c
|
||||
TARGET_NEED_FDT=y
|
||||
|
@ -1,6 +1,5 @@
|
||||
TARGET_ARCH=riscv64
|
||||
TARGET_BASE_ARCH=riscv
|
||||
TARGET_SUPPORTS_MTTCG=y
|
||||
TARGET_KVM_HAVE_GUEST_DEBUG=y
|
||||
TARGET_XML_FILES= gdb-xml/riscv-64bit-cpu.xml gdb-xml/riscv-32bit-fpu.xml gdb-xml/riscv-64bit-fpu.xml gdb-xml/riscv-64bit-virtual.xml gdb-xml/riscv-32bit-cpu.xml gdb-xml/riscv-32bit-virtual.xml
|
||||
# needed by boot.c
|
||||
|
@ -1,6 +1,5 @@
|
||||
TARGET_ARCH=s390x
|
||||
TARGET_BIG_ENDIAN=y
|
||||
TARGET_SUPPORTS_MTTCG=y
|
||||
TARGET_KVM_HAVE_GUEST_DEBUG=y
|
||||
TARGET_XML_FILES= gdb-xml/s390x-core64.xml gdb-xml/s390-acr.xml gdb-xml/s390-fpr.xml gdb-xml/s390-vx.xml gdb-xml/s390-cr.xml gdb-xml/s390-virt.xml gdb-xml/s390-virt-kvm.xml gdb-xml/s390-gs.xml
|
||||
TARGET_LONG_BITS=64
|
||||
|
@ -1,4 +1,3 @@
|
||||
TARGET_ARCH=sparc
|
||||
TARGET_BIG_ENDIAN=y
|
||||
TARGET_SUPPORTS_MTTCG=y
|
||||
TARGET_LONG_BITS=32
|
||||
|
@ -1,5 +1,4 @@
|
||||
TARGET_ARCH=sparc64
|
||||
TARGET_BASE_ARCH=sparc
|
||||
TARGET_BIG_ENDIAN=y
|
||||
TARGET_SUPPORTS_MTTCG=y
|
||||
TARGET_LONG_BITS=64
|
||||
|
@ -1,6 +1,5 @@
|
||||
TARGET_ARCH=x86_64
|
||||
TARGET_BASE_ARCH=i386
|
||||
TARGET_SUPPORTS_MTTCG=y
|
||||
TARGET_KVM_HAVE_GUEST_DEBUG=y
|
||||
TARGET_KVM_HAVE_RESET_PARKED_VCPU=y
|
||||
TARGET_XML_FILES= gdb-xml/i386-64bit.xml
|
||||
|
@ -1,3 +1,2 @@
|
||||
TARGET_ARCH=xtensa
|
||||
TARGET_SUPPORTS_MTTCG=y
|
||||
TARGET_LONG_BITS=32
|
||||
|
@ -1,4 +1,3 @@
|
||||
TARGET_ARCH=xtensa
|
||||
TARGET_BIG_ENDIAN=y
|
||||
TARGET_SUPPORTS_MTTCG=y
|
||||
TARGET_LONG_BITS=32
|
||||
|
@ -30,7 +30,7 @@ user-space thread. This is enabled by default for all FE/BE
|
||||
combinations where the host memory model is able to accommodate the
|
||||
guest (TCGCPUOps::guest_default_memory_order & ~TCG_TARGET_DEFAULT_MO is zero)
|
||||
and the guest has had the required work done to support this safely
|
||||
(TARGET_SUPPORTS_MTTCG).
|
||||
(TCGCPUOps::mttcg_supported).
|
||||
|
||||
System emulation will fall back to the original round robin approach
|
||||
if:
|
||||
|
@ -19,6 +19,14 @@
|
||||
#include "tcg/tcg-mo.h"
|
||||
|
||||
struct TCGCPUOps {
|
||||
/**
|
||||
* mttcg_supported: multi-threaded TCG is supported
|
||||
*
|
||||
* Target (TCG frontend) supports:
|
||||
* - atomic instructions
|
||||
* - memory ordering primitives (barriers)
|
||||
*/
|
||||
bool mttcg_supported;
|
||||
|
||||
/**
|
||||
* @guest_default_memory_order: default barrier that is required
|
||||
|
@ -35,7 +35,6 @@
|
||||
|
||||
#pragma GCC poison TARGET_HAS_BFLT
|
||||
#pragma GCC poison TARGET_NAME
|
||||
#pragma GCC poison TARGET_SUPPORTS_MTTCG
|
||||
#pragma GCC poison TARGET_BIG_ENDIAN
|
||||
#pragma GCC poison TCG_GUEST_DEFAULT_MO
|
||||
#pragma GCC poison TARGET_HAS_PRECISE_SMC
|
||||
|
@ -237,6 +237,7 @@ static const struct SysemuCPUOps alpha_sysemu_ops = {
|
||||
static const TCGCPUOps alpha_tcg_ops = {
|
||||
/* Alpha processors have a weak memory model */
|
||||
.guest_default_memory_order = 0,
|
||||
.mttcg_supported = true,
|
||||
|
||||
.initialize = alpha_translate_init,
|
||||
.translate_code = alpha_translate_code,
|
||||
|
@ -2671,6 +2671,7 @@ static const struct SysemuCPUOps arm_sysemu_ops = {
|
||||
|
||||
#ifdef CONFIG_TCG
|
||||
static const TCGCPUOps arm_tcg_ops = {
|
||||
.mttcg_supported = true,
|
||||
/* ARM processors have a weak memory model */
|
||||
.guest_default_memory_order = 0,
|
||||
|
||||
|
@ -234,6 +234,7 @@ static void cortex_m55_initfn(Object *obj)
|
||||
static const TCGCPUOps arm_v7m_tcg_ops = {
|
||||
/* ARM processors have a weak memory model */
|
||||
.guest_default_memory_order = 0,
|
||||
.mttcg_supported = true,
|
||||
|
||||
.initialize = arm_translate_init,
|
||||
.translate_code = arm_translate_code,
|
||||
|
@ -225,6 +225,7 @@ static const struct SysemuCPUOps avr_sysemu_ops = {
|
||||
|
||||
static const TCGCPUOps avr_tcg_ops = {
|
||||
.guest_default_memory_order = 0,
|
||||
.mttcg_supported = false,
|
||||
.initialize = avr_cpu_tcg_init,
|
||||
.translate_code = avr_cpu_translate_code,
|
||||
.synchronize_from_tb = avr_cpu_synchronize_from_tb,
|
||||
|
@ -327,6 +327,7 @@ static void hexagon_cpu_init(Object *obj)
|
||||
static const TCGCPUOps hexagon_tcg_ops = {
|
||||
/* MTTCG not yet supported: require strict ordering */
|
||||
.guest_default_memory_order = TCG_MO_ALL,
|
||||
.mttcg_supported = false,
|
||||
.initialize = hexagon_translate_init,
|
||||
.translate_code = hexagon_translate_code,
|
||||
.synchronize_from_tb = hexagon_cpu_synchronize_from_tb,
|
||||
|
@ -260,6 +260,7 @@ static const TCGCPUOps hppa_tcg_ops = {
|
||||
* basis. It's probably easier to fall back to a strong memory model.
|
||||
*/
|
||||
.guest_default_memory_order = TCG_MO_ALL,
|
||||
.mttcg_supported = true,
|
||||
|
||||
.initialize = hppa_translate_init,
|
||||
.translate_code = hppa_translate_code,
|
||||
|
@ -125,6 +125,7 @@ static bool x86_debug_check_breakpoint(CPUState *cs)
|
||||
#include "accel/tcg/cpu-ops.h"
|
||||
|
||||
const TCGCPUOps x86_tcg_ops = {
|
||||
.mttcg_supported = true,
|
||||
/*
|
||||
* The x86 has a strong memory model with some store-after-load re-ordering
|
||||
*/
|
||||
|
@ -865,6 +865,7 @@ static void loongarch_cpu_dump_state(CPUState *cs, FILE *f, int flags)
|
||||
|
||||
static const TCGCPUOps loongarch_tcg_ops = {
|
||||
.guest_default_memory_order = 0,
|
||||
.mttcg_supported = true,
|
||||
|
||||
.initialize = loongarch_translate_init,
|
||||
.translate_code = loongarch_translate_code,
|
||||
|
@ -591,6 +591,7 @@ static const struct SysemuCPUOps m68k_sysemu_ops = {
|
||||
static const TCGCPUOps m68k_tcg_ops = {
|
||||
/* MTTCG not yet supported: require strict ordering */
|
||||
.guest_default_memory_order = TCG_MO_ALL,
|
||||
.mttcg_supported = false,
|
||||
|
||||
.initialize = m68k_tcg_init,
|
||||
.translate_code = m68k_translate_code,
|
||||
|
@ -429,6 +429,7 @@ static const struct SysemuCPUOps mb_sysemu_ops = {
|
||||
static const TCGCPUOps mb_tcg_ops = {
|
||||
/* MicroBlaze is always in-order. */
|
||||
.guest_default_memory_order = TCG_MO_ALL,
|
||||
.mttcg_supported = true,
|
||||
|
||||
.initialize = mb_tcg_init,
|
||||
.translate_code = mb_translate_code,
|
||||
|
@ -551,6 +551,7 @@ static int mips_cpu_mmu_index(CPUState *cs, bool ifunc)
|
||||
}
|
||||
|
||||
static const TCGCPUOps mips_tcg_ops = {
|
||||
.mttcg_supported = TARGET_LONG_BITS == 32,
|
||||
.guest_default_memory_order = 0,
|
||||
|
||||
.initialize = mips_tcg_init,
|
||||
|
@ -244,6 +244,7 @@ static const struct SysemuCPUOps openrisc_sysemu_ops = {
|
||||
|
||||
static const TCGCPUOps openrisc_tcg_ops = {
|
||||
.guest_default_memory_order = 0,
|
||||
.mttcg_supported = true,
|
||||
|
||||
.initialize = openrisc_translate_init,
|
||||
.translate_code = openrisc_translate_code,
|
||||
|
@ -7479,6 +7479,7 @@ static const struct SysemuCPUOps ppc_sysemu_ops = {
|
||||
#include "accel/tcg/cpu-ops.h"
|
||||
|
||||
static const TCGCPUOps ppc_tcg_ops = {
|
||||
.mttcg_supported = TARGET_LONG_BITS == 64,
|
||||
.guest_default_memory_order = 0,
|
||||
.initialize = ppc_translate_init,
|
||||
.translate_code = ppc_translate_code,
|
||||
|
@ -141,6 +141,7 @@ static void riscv_restore_state_to_opc(CPUState *cs,
|
||||
}
|
||||
|
||||
const TCGCPUOps riscv_tcg_ops = {
|
||||
.mttcg_supported = true,
|
||||
.guest_default_memory_order = 0,
|
||||
|
||||
.initialize = riscv_translate_init,
|
||||
|
@ -206,6 +206,7 @@ static const struct SysemuCPUOps rx_sysemu_ops = {
|
||||
static const TCGCPUOps rx_tcg_ops = {
|
||||
/* MTTCG not yet supported: require strict ordering */
|
||||
.guest_default_memory_order = TCG_MO_ALL,
|
||||
.mttcg_supported = false,
|
||||
|
||||
.initialize = rx_translate_init,
|
||||
.translate_code = rx_translate_code,
|
||||
|
@ -345,6 +345,7 @@ void cpu_get_tb_cpu_state(CPUS390XState *env, vaddr *pc,
|
||||
}
|
||||
|
||||
static const TCGCPUOps s390_tcg_ops = {
|
||||
.mttcg_supported = true,
|
||||
/*
|
||||
* The z/Architecture has a strong memory model with some
|
||||
* store-after-load re-ordering.
|
||||
|
@ -264,6 +264,7 @@ static const struct SysemuCPUOps sh4_sysemu_ops = {
|
||||
static const TCGCPUOps superh_tcg_ops = {
|
||||
/* MTTCG not yet supported: require strict ordering */
|
||||
.guest_default_memory_order = TCG_MO_ALL,
|
||||
.mttcg_supported = false,
|
||||
|
||||
.initialize = sh4_translate_init,
|
||||
.translate_code = sh4_translate_code,
|
||||
|
@ -1023,6 +1023,7 @@ static const TCGCPUOps sparc_tcg_ops = {
|
||||
* by an implied MEMBAR #StoreStore.
|
||||
*/
|
||||
.guest_default_memory_order = TCG_MO_LD_LD | TCG_MO_LD_ST | TCG_MO_ST_ST,
|
||||
.mttcg_supported = true,
|
||||
|
||||
.initialize = sparc_tcg_init,
|
||||
.translate_code = sparc_translate_code,
|
||||
|
@ -174,6 +174,7 @@ static const struct SysemuCPUOps tricore_sysemu_ops = {
|
||||
static const TCGCPUOps tricore_tcg_ops = {
|
||||
/* MTTCG not yet supported: require strict ordering */
|
||||
.guest_default_memory_order = TCG_MO_ALL,
|
||||
.mttcg_supported = false,
|
||||
.initialize = tricore_tcg_init,
|
||||
.translate_code = tricore_translate_code,
|
||||
.synchronize_from_tb = tricore_cpu_synchronize_from_tb,
|
||||
|
@ -234,6 +234,7 @@ static const struct SysemuCPUOps xtensa_sysemu_ops = {
|
||||
static const TCGCPUOps xtensa_tcg_ops = {
|
||||
/* Xtensa processors have a weak memory model */
|
||||
.guest_default_memory_order = 0,
|
||||
.mttcg_supported = true,
|
||||
|
||||
.initialize = xtensa_translate_init,
|
||||
.translate_code = xtensa_translate_code,
|
||||
|
Loading…
x
Reference in New Issue
Block a user