On 2025-10-20 15:14, Philippe Mathieu-Daudé wrote:
When multiple QEMU targets are variants (word size, endianness)
of the same base architecture, target_base_arch() returns this
base. For example, for the Aarch64 target it will return
SYS_EMU_TARGET_ARM as common base.


I'm not sure that reusing semantic on a subset of this enum is the best idea, so many things can go wrong.

More widely, I don't know where we would need to access this, versus specific functions like target_base_arm(). If a code needs to check various base archs target_base_*, or it can use a switch with all variants.

If we really want to have this target_base concept, at least it deserves it's own enum, separate from SYS_EMU_TARGET.

Signed-off-by: Philippe Mathieu-Daudé <[email protected]>
---
  include/qemu/target-info-impl.h |  2 ++
  include/qemu/target-info-qapi.h |  7 +++++++
  target-info-stub.c              |  1 +
  target-info.c                   | 10 ++++++++++
  4 files changed, 20 insertions(+)

diff --git a/include/qemu/target-info-impl.h b/include/qemu/target-info-impl.h
index e446585bf53..2c171f8359b 100644
--- a/include/qemu/target-info-impl.h
+++ b/include/qemu/target-info-impl.h
@@ -17,6 +17,8 @@ typedef struct TargetInfo {
      const char *target_name;
      /* related to TARGET_ARCH definition */
      SysEmuTarget target_arch;
+    /* related to TARGET_BASE_ARCH definition (target/${base_arch}/ path) */
+    SysEmuTarget target_base_arch;
      /* runtime equivalent of TARGET_LONG_BITS definition */
      unsigned long_bits;
      /* runtime equivalent of CPU_RESOLVING_TYPE definition */
diff --git a/include/qemu/target-info-qapi.h b/include/qemu/target-info-qapi.h
index d5ce0523238..65ed4ca8eea 100644
--- a/include/qemu/target-info-qapi.h
+++ b/include/qemu/target-info-qapi.h
@@ -19,6 +19,13 @@
   */
  SysEmuTarget target_arch(void);
+/**
+ * target_base_arch:
+ *
+ * Returns: QAPI SysEmuTarget enum (i.e. SYS_EMU_TARGET_I386).
+ */
+SysEmuTarget target_base_arch(void);
+
  /**
   * target_endian_mode:
   *
diff --git a/target-info-stub.c b/target-info-stub.c
index d96d8249c1d..d2cfca1b4c2 100644
--- a/target-info-stub.c
+++ b/target-info-stub.c
@@ -19,6 +19,7 @@ QEMU_BUILD_BUG_ON(offsetof(ArchCPU, env) != sizeof(CPUState));
  static const TargetInfo target_info_stub = {
      .target_name = TARGET_NAME,
      .target_arch = SYS_EMU_TARGET__MAX,
+    .target_base_arch = SYS_EMU_TARGET__MAX,

And nothing can enforce base and arch match by design, which is a problem IMHO.

      .long_bits = TARGET_LONG_BITS,
      .cpu_type = CPU_RESOLVING_TYPE,
      .machine_typename = TYPE_MACHINE,
diff --git a/target-info.c b/target-info.c
index e567cb4c40a..332198e40a2 100644
--- a/target-info.c
+++ b/target-info.c
@@ -33,6 +33,16 @@ SysEmuTarget target_arch(void)
      return arch;
  }
+SysEmuTarget target_base_arch(void)
+{
+    SysEmuTarget base_arch = target_info()->target_base_arch;
+
+    if (base_arch == SYS_EMU_TARGET__MAX) {
+        base_arch = target_arch();
+    }
+    return base_arch;

More confusing, we can eventually return a non base arch if base arch was not correctly set above.

+}
+
  const char *target_cpu_type(void)
  {
      return target_info()->cpu_type;

Reply via email to