Expose a const TargetInfo structure instead of a function returning a const pointer.
Signed-off-by: Richard Henderson <[email protected]> --- include/qemu/target-info-impl.h | 11 ++++---- include/qemu/target-info-init.h | 45 ++++++++++++++++++++++--------- configs/targets/aarch64-softmmu.c | 18 +++---------- configs/targets/arm-softmmu.c | 18 +++---------- page-vary-common.c | 8 ++---- page-vary-system.c | 6 ++--- target-info-qom.c | 11 +++----- target-info-stub.c | 28 ++++--------------- target-info.c | 12 ++++----- 9 files changed, 65 insertions(+), 92 deletions(-) diff --git a/include/qemu/target-info-impl.h b/include/qemu/target-info-impl.h index c917d546ea..df94af4ef3 100644 --- a/include/qemu/target-info-impl.h +++ b/include/qemu/target-info-impl.h @@ -34,11 +34,10 @@ typedef struct TargetInfo { bool page_bits_vary; } TargetInfo; -/** - * target_info: - * - * Returns: The TargetInfo structure definition for this target binary. - */ -const TargetInfo *target_info(void); +extern +#ifndef NONCONST_TARGET_INFO +const +#endif +TargetInfo target_info; #endif diff --git a/include/qemu/target-info-init.h b/include/qemu/target-info-init.h index a539d14d78..a70edeac21 100644 --- a/include/qemu/target-info-init.h +++ b/include/qemu/target-info-init.h @@ -20,30 +20,51 @@ static void register_##info(void) \ module_init(register_##info, MODULE_INIT_TARGET_INFO) #ifdef COMPILING_PER_TARGET + +#ifndef TARGET_PAGE_BITS_VARY +# define DEF_TARGET_INFO_PB \ + .page_bits_init = TARGET_PAGE_BITS +#elif defined(TARGET_PAGE_BITS_LEGACY) +# define DEF_TARGET_INFO_PB \ + .page_bits_vary = true, .page_bits_init = TARGET_PAGE_BITS_LEGACY +#else +# define DEF_TARGET_INFO_PB \ + .page_bits_vary = true +#endif + +#define DEF_TARGET_INFO_VAR(DECL, TYPE, MACHINE) \ +const TargetInfo DECL = { \ + .target_name = TARGET_NAME, \ + .target_arch = glue(SYS_EMU_TARGET_, TARGET_ARCH), \ + .long_bits = TARGET_LONG_BITS, \ + .cpu_type = TYPE, \ + .machine_typename = MACHINE, \ + .endianness = TARGET_BIG_ENDIAN ? ENDIAN_MODE_BIG : ENDIAN_MODE_LITTLE, \ + DEF_TARGET_INFO_PB, \ +}; + #ifdef CONFIG_USER_ONLY /* * User mode does not support multiple targets in the same binary, so just * define target_info(). */ -#define target_info_init(ti_var) \ -const TargetInfo *target_info(void) \ -{ \ - return &ti_var; \ -} +#define DEF_TARGET_INFO(DECL, TYPE, MACHINE) \ + DEF_TARGET_INFO_VAR(target_info, TYPE, MACHINE) #else /* CONFIG_USER_ONLY */ #include "qemu/target-info-qom.h" #include "qom/object.h" -#define target_info_init(ti_var) \ -static const TypeInfo ti_var##_type_info = { \ - .name = TYPE_TARGET_INFO"-"TARGET_NAME, \ - .parent = TYPE_TARGET_INFO, \ - .class_data = &ti_var, \ -}; \ -DEFINE_TARGET_INFO_TYPE(ti_var##_type_info) +#define DEF_TARGET_INFO(DECL, TYPE, MACHINE) \ + static DEF_TARGET_INFO_VAR(DECL, TYPE, MACHINE) \ + static const TypeInfo DECL##_type_info = { \ + .name = TYPE_TARGET_INFO"-"TARGET_NAME, \ + .parent = TYPE_TARGET_INFO, \ + .class_data = &DECL, \ + }; \ + DEFINE_TARGET_INFO_TYPE(DECL##_type_info) #endif /* CONFIG_USER_ONLY */ #endif /* COMPILING_PER_TARGET */ diff --git a/configs/targets/aarch64-softmmu.c b/configs/targets/aarch64-softmmu.c index 75d95b0e74..4f43f3e89a 100644 --- a/configs/targets/aarch64-softmmu.c +++ b/configs/targets/aarch64-softmmu.c @@ -7,21 +7,11 @@ */ #include "qemu/osdep.h" -#include "qemu/target-info-impl.h" -#include "qemu/target-info-init.h" #include "hw/arm/machines-qom.h" #include "target/arm/cpu-qom.h" #include "target/arm/cpu-param.h" +#include "qemu/target-info-impl.h" +#include "qemu/target-info-init.h" -static const TargetInfo target_info_aarch64_system = { - .target_name = "aarch64", - .target_arch = SYS_EMU_TARGET_AARCH64, - .long_bits = 64, - .cpu_type = TYPE_ARM_CPU, - .machine_typename = TYPE_TARGET_AARCH64_MACHINE, - .endianness = ENDIAN_MODE_LITTLE, - .page_bits_vary = true, - .page_bits_init = TARGET_PAGE_BITS_LEGACY, -}; - -target_info_init(target_info_aarch64_system) +DEF_TARGET_INFO(target_info_aarch64_system, + TYPE_ARM_CPU, TYPE_TARGET_AARCH64_MACHINE) diff --git a/configs/targets/arm-softmmu.c b/configs/targets/arm-softmmu.c index 73546fa573..8272ce58fd 100644 --- a/configs/targets/arm-softmmu.c +++ b/configs/targets/arm-softmmu.c @@ -7,21 +7,11 @@ */ #include "qemu/osdep.h" -#include "qemu/target-info-impl.h" -#include "qemu/target-info-init.h" #include "hw/arm/machines-qom.h" #include "target/arm/cpu-qom.h" #include "target/arm/cpu-param.h" +#include "qemu/target-info-impl.h" +#include "qemu/target-info-init.h" -static const TargetInfo target_info_arm_system = { - .target_name = "arm", - .target_arch = SYS_EMU_TARGET_ARM, - .long_bits = 32, - .cpu_type = TYPE_ARM_CPU, - .machine_typename = TYPE_TARGET_ARM_MACHINE, - .endianness = ENDIAN_MODE_LITTLE, - .page_bits_vary = true, - .page_bits_init = TARGET_PAGE_BITS_LEGACY, -}; - -target_info_init(target_info_arm_system) +DEF_TARGET_INFO(target_info_arm_system, + TYPE_ARM_CPU, TYPE_TARGET_ARM_MACHINE) diff --git a/page-vary-common.c b/page-vary-common.c index ddd0863378..b4e8cdf405 100644 --- a/page-vary-common.c +++ b/page-vary-common.c @@ -29,10 +29,8 @@ TargetPageBits target_page; bool set_preferred_target_page_bits(int bits) { - const TargetInfo *ti = target_info(); - assert(bits >= TARGET_PAGE_BITS_MIN); - if (ti->page_bits_vary) { + if (target_info.page_bits_vary) { /* * The target page size is the lowest common denominator for all @@ -55,9 +53,7 @@ void finalize_target_page_bits(void) int bits = target_page.bits; if (bits == 0) { - const TargetInfo *ti = target_info(); - - bits = ti->page_bits_init; + bits = target_info.page_bits_init; assert(bits != 0); target_page.bits = bits; } diff --git a/page-vary-system.c b/page-vary-system.c index 6c49c10e23..b2a1c45deb 100644 --- a/page-vary-system.c +++ b/page-vary-system.c @@ -26,8 +26,6 @@ QEMU_BUILD_BUG_ON(TLB_FLAGS_MASK & ((1u < TARGET_PAGE_BITS_MIN) - 1)); int migration_legacy_page_bits(void) { - const TargetInfo *ti = target_info(); - - assert(ti->page_bits_init >= TARGET_PAGE_BITS_MIN); - return ti->page_bits_init; + assert(target_info.page_bits_init >= TARGET_PAGE_BITS_MIN); + return target_info.page_bits_init; } diff --git a/target-info-qom.c b/target-info-qom.c index 52dfc8aee4..abaf7507a0 100644 --- a/target-info-qom.c +++ b/target-info-qom.c @@ -6,6 +6,8 @@ * SPDX-License-Identifier: GPL-2.0-or-later */ +#define NONCONST_TARGET_INFO + #include "qemu/osdep.h" #include "qapi/error.h" #include "qom/object.h" @@ -44,12 +46,7 @@ static const TypeInfo target_info_parent_type = { DEFINE_TARGET_INFO_TYPE(target_info_parent_type) -static const TargetInfo *target_info_ptr; - -const TargetInfo *target_info(void) -{ - return target_info_ptr; -} +TargetInfo target_info; void target_info_qom_set_target(void) { @@ -62,5 +59,5 @@ void target_info_qom_set_target(void) "more than one target-info is available"); } - target_info_ptr = TARGET_INFO_CLASS(targets->data)->target_info; + target_info = *TARGET_INFO_CLASS(targets->data)->target_info; } diff --git a/target-info-stub.c b/target-info-stub.c index 22b7911201..813d562058 100644 --- a/target-info-stub.c +++ b/target-info-stub.c @@ -7,13 +7,13 @@ */ #include "qemu/osdep.h" +#include "cpu.h" +#include "hw/core/boards.h" +#include "exec/cpu-defs.h" +#include "exec/page-vary.h" #include "qemu/target-info.h" #include "qemu/target-info-impl.h" #include "qemu/target-info-init.h" -#include "hw/core/boards.h" -#include "cpu.h" -#include "exec/cpu-defs.h" -#include "exec/page-vary.h" /* Validate correct placement of CPUArchState. */ QEMU_BUILD_BUG_ON(offsetof(ArchCPU, parent_obj) != 0); @@ -24,22 +24,4 @@ QEMU_BUILD_BUG_ON(offsetof(ArchCPU, env) != sizeof(CPUState)); QEMU_BUILD_BUG_ON(TARGET_PAGE_BITS < TARGET_PAGE_BITS_MIN); #endif -static const TargetInfo target_info_stub = { - .target_name = TARGET_NAME, - .target_arch = glue(SYS_EMU_TARGET_, TARGET_ARCH), - .long_bits = TARGET_LONG_BITS, - .cpu_type = CPU_RESOLVING_TYPE, - .machine_typename = TYPE_MACHINE, - .endianness = TARGET_BIG_ENDIAN ? ENDIAN_MODE_BIG : ENDIAN_MODE_LITTLE, -#ifdef TARGET_PAGE_BITS_VARY - .page_bits_vary = true, -# ifdef TARGET_PAGE_BITS_LEGACY - .page_bits_init = TARGET_PAGE_BITS_LEGACY, -# endif -#else - .page_bits_vary = false, - .page_bits_init = TARGET_PAGE_BITS, -#endif -}; - -target_info_init(target_info_stub) +DEF_TARGET_INFO(target_info_stub, CPU_RESOLVING_TYPE, TYPE_MACHINE) diff --git a/target-info.c b/target-info.c index 28c458fc7a..6bd3f9485f 100644 --- a/target-info.c +++ b/target-info.c @@ -14,32 +14,32 @@ const char *target_name(void) { - return target_info()->target_name; + return target_info.target_name; } unsigned target_long_bits(void) { - return target_info()->long_bits; + return target_info.long_bits; } SysEmuTarget target_arch(void) { - return target_info()->target_arch; + return target_info.target_arch; } const char *target_cpu_type(void) { - return target_info()->cpu_type; + return target_info.cpu_type; } const char *target_machine_typename(void) { - return target_info()->machine_typename; + return target_info.machine_typename; } EndianMode target_endian_mode(void) { - return target_info()->endianness; + return target_info.endianness; } bool target_big_endian(void) -- 2.43.0
