On 8/28/2026 2:51 AM, Yonggang Luo wrote: > > > On Fri, Jul 24, 2026 at 8:11 AM Pierrick Bouvier > <[email protected] > <mailto:[email protected]>> wrote: >> >> Now that we can link a single-binary with at least two targets (arm, > aarch64), >> we want to make sure that we expose the same set of machines (later > devices and >> cpus) than target binaries. For that, we implemented a static > filtering based on >> target interfaces that each machine will implement to declare which > targets have >> this machine. >> >> However, we discovered that this static filtering is not enough. > Indeed, some >> machines and devices do not depend only on target, and their presence > can depend >> on Kconfig or host/target combination. Thus, our static approach can't > work, and >> we need something more flexible. >> >> This series adds a new TYPE_TARGET_SPECIFIC, that declare a single > function >> bool is_available(void). From there, any machine type (and later > devices and >> cpus) can implement it to override their presence for each target. >> We first replace the existing static mechanism with this, and once > done, we >> cleanup all the old interface. One nice benefit is that we can get rid of >> config/targets/*.c files, which saves duplication. > > > About target-filtering, we already have > > enum { > QEMU_ARCH_ALPHA = (1UL << SYS_EMU_TARGET_ALPHA), > QEMU_ARCH_ARM = (1UL << SYS_EMU_TARGET_ARM) | > (1UL << SYS_EMU_TARGET_AARCH64), > QEMU_ARCH_I386 = (1UL << SYS_EMU_TARGET_I386) | > (1UL << SYS_EMU_TARGET_X86_64), > QEMU_ARCH_M68K = (1UL << SYS_EMU_TARGET_M68K), > QEMU_ARCH_MICROBLAZE = (1UL << SYS_EMU_TARGET_MICROBLAZE), > QEMU_ARCH_MIPS = (1UL << SYS_EMU_TARGET_MIPS) | > (1UL << SYS_EMU_TARGET_MIPSEL) | > (1UL << SYS_EMU_TARGET_MIPS64) | > (1UL << SYS_EMU_TARGET_MIPS64EL), > QEMU_ARCH_PPC = (1UL << SYS_EMU_TARGET_PPC) | > (1UL << SYS_EMU_TARGET_PPC64), > QEMU_ARCH_S390X = (1UL << SYS_EMU_TARGET_S390X), > QEMU_ARCH_SH4 = (1UL << SYS_EMU_TARGET_SH4) | > (1UL << SYS_EMU_TARGET_SH4EB), > QEMU_ARCH_SPARC = (1UL << SYS_EMU_TARGET_SPARC) | > (1UL << SYS_EMU_TARGET_SPARC64), > QEMU_ARCH_XTENSA = (1UL << SYS_EMU_TARGET_XTENSA) | > (1UL << SYS_EMU_TARGET_XTENSAEB), > QEMU_ARCH_OR1K = (1UL << SYS_EMU_TARGET_OR1K), > QEMU_ARCH_TRICORE = (1UL << SYS_EMU_TARGET_TRICORE), > QEMU_ARCH_HPPA = (1UL << SYS_EMU_TARGET_HPPA), > QEMU_ARCH_RISCV = (1UL << SYS_EMU_TARGET_RISCV32) | > (1UL << SYS_EMU_TARGET_RISCV64), > QEMU_ARCH_RX = (1UL << SYS_EMU_TARGET_RX), > QEMU_ARCH_AVR = (1UL << SYS_EMU_TARGET_AVR), > QEMU_ARCH_HEXAGON = (1UL << SYS_EMU_TARGET_HEXAGON), > QEMU_ARCH_LOONGARCH = (1UL << SYS_EMU_TARGET_LOONGARCH64), > QEMU_ARCH_ALL = UINT32_MAX, > }; > > Can we use this to do target filtering instead? And we can extend this > to maximal uint128_t to support maximal 128 targets in future, so it's > not a burden to use it as a enum > > and for arm or mips we can use QEMU_ARCH_ARM QEMU_ARCH_MIPS to support > multiple targets in a single integer. >
It's not enough, as some types depend on target config, and not only on target itself. That's why this series exist, because I wrongly assumed target would be enough when designing the original filtering, and it proved to be insufficient. Concrete examples here are x-remote and nitro machines. > > > -- > 此致 > 礼 > 罗勇刚 > Yours > sincerely, > Yonggang Luo
