On 8/5/25 15:58, Daniel P. Berrangé wrote:
Pierrick has proposed a series that introduces a concept of runtime
conditionals to the QAPI schema, in order to adapt the TARGET_*
conditionals currently used at build time:

   https://lists.nongnu.org/archive/html/qemu-devel/2025-05/msg01699.html

For the sake of comparison & evaluation, this series illustrates the
alternative approach that we've discussed of entirely removing any
concept of TARGET_* conditionals.

With this the QAPI schema varies solely based on CONFIG_* conditionals,
and is thus invariant across different target emulators.

In this PoC I've taken the minimal effort approach to the problem.

The QAPI schema has removed the TARGET_* conditionals and in order to
make all the emulators then compile, the stubs/ directory is populated
with a bunch of files to provide dummy impls of the target specific QMP
commands.

This is sufficient to make the current QEMU binaries build successfully.

To make the "single binary" concept work, however, would require
additional followup work to eliminate the stubs.

Instead of having stubs we would need to de-couple the QMP command
impl from the machine internals. This would likely require greater
use of interfaces and/or virtual method dispatchers on the machine
class. This would enable the 'qmp_XXXXX' command impls to exist
once. Then they call out to virtual methods on the machine to provide
the real impl, and/or generate an error if the virtual method is not
implemented for the machine.

Note,  I don't see commands "per machine", but per device (including
CPU). When not specified, we iterate over device implementations / CPUs.


Daniel P. Berrangé (9):
   qapi: expose rtc-reset-reinjection command unconditionally
   qapi: expand docs for SEV commands
   qapi: make SEV commands unconditionally available
   qapi: expose query-gic-capability command unconditionally
   qapi: make SGX commands unconditionally available
   qapi: make Xen event commands unconditionally available
   qapi: remove the misc-target.json file
   qapi: make most CPU  commands unconditionally available
   qapi: make s390x specific CPU commands unconditionally available

Philippe Mathieu-Daudé (1):
   qapi: Make CpuModelExpansionInfo::deprecated-props optional and
     generic

  hw/i386/kvm/xen-stubs.c               |  13 -
  hw/i386/kvm/xen_evtchn.c              |   2 +-
  hw/i386/monitor.c                     |   2 +-
  hw/i386/sgx-stub.c                    |  13 -
  hw/i386/sgx.c                         |   2 +-
  hw/s390x/cpu-topology.c               |   4 +-
  hw/s390x/s390-skeys.c                 |   1 -
  include/hw/s390x/cpu-topology.h       |   2 +-
  qapi/machine-s390x.json               | 120 ++++++
  qapi/machine-target.json              | 523 --------------------------
  qapi/machine.json                     | 363 ++++++++++++++++++
  qapi/meson.build                      |   5 +-
  qapi/misc-arm.json                    |  49 +++
  qapi/misc-i386.json                   | 479 +++++++++++++++++++++++
  qapi/misc-target.json                 | 504 -------------------------
  qapi/qapi-schema.json                 |   5 +-
  stubs/meson.build                     |   8 +
  stubs/monitor-arm-gic.c               |  12 +
  stubs/monitor-cpu-s390x-kvm.c         |  22 ++
  stubs/monitor-cpu-s390x.c             |  23 ++
  stubs/monitor-cpu.c                   |  21 ++
  stubs/monitor-i386-rtc.c              |  10 +
  stubs/monitor-i386-sev.c              |  36 ++
  stubs/monitor-i386-sgx.c              |  17 +
  stubs/monitor-i386-xen.c              |  16 +
  target/arm/arm-qmp-cmds.c             |   4 +-
  target/i386/cpu-system.c              |   2 +-
  target/i386/cpu.c                     |   2 +-
  target/i386/monitor.c                 |   1 -
  target/i386/sev-system-stub.c         |  32 --
  target/i386/sev.c                     |   2 +-
  target/loongarch/loongarch-qmp-cmds.c |   2 +-
  target/mips/system/mips-qmp-cmds.c    |  12 +-
  target/ppc/ppc-qmp-cmds.c             |  12 +-
  target/riscv/riscv-qmp-cmds.c         |   2 +-
  target/s390x/cpu_models_system.c      |   2 +-
  tests/qtest/qmp-cmd-test.c            |   1 +

Eh I did a very similar series last month which didn't pass local
review, I need to remember what was the issue...

$ git diff --stat eb3020b6ed2baca63..32235d621871df0ccc
 MAINTAINERS                                        |   3 ++
 qapi/machine-arm-target.json                       |  47 +++++++++++++++++
qapi/machine-s390x-target.json | 301 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ qapi/machine-target.json | 295 -------------------------------------------------------------------------------------------------------- qapi/{misc-target.json => machine-x86-target.json} | 94 ++++++++++++++++++----------------
 qapi/machine.json                                  |  44 ----------------
 qapi/qapi-schema.json                              |   4 +-
 include/hw/s390x/cpu-topology.h                    |   2 +-
 hw/i386/kvm/xen-stubs.c                            |   2 +-
 hw/i386/kvm/xen_evtchn.c                           |   2 +-
 hw/i386/monitor.c                                  |   2 +-
 hw/i386/sgx-stub.c                                 |   2 +-
 hw/i386/sgx.c                                      |   2 +-
 hw/s390x/s390-skeys.c                              |   1 -
 target/arm/arm-qmp-cmds.c                          |   3 +-
 target/i386/cpu-system.c                           |   1 +
 target/i386/cpu.c                                  |   3 ++
 target/i386/monitor.c                              |   2 +-
 target/i386/sev-system-stub.c                      |   2 +-
 target/i386/sev.c                                  |   2 +-
 target/s390x/cpu_models_system.c                   |   3 +-
 qapi/meson.build                                   |   4 +-
 22 files changed, 423 insertions(+), 398 deletions(-)

$ git log --oneline eb3020b6ed2baca63..32235d621871df0ccc | tac -r
c92b1454ef1 qapi: Restrict ARM specific schemas to ARM
9c708185fe4 qapi: Restrict CpuModelCompareResult to s390x target
c50cc3c438c qapi: Restrict s390x-specific schemas to s390x target
221ec7acf18 qapi: Restrict SGXEPCSection to x86 targets
a3606c5b23c qapi: Restrict x86-specific schemas to x86 targets
32235d62187 qapi: Guard x86 specific schemas with conditional


Reply via email to