Message ID | 20240215084654.56297-2-philmd@linaro.org |
---|---|
State | New |
Headers | show |
Series | target: New binary to prototype heterogeneous machines | expand |
On Thu, 15 Feb 2024 10:46, Philippe Mathieu-Daudé <philmd@linaro.org> wrote: >From: Philippe Mathieu-Daudé <f4bug@amsat.org> > >Add the 'any'-architecture target. > >- Only consider 64-bit targets >- Do not use any hardware accelerator (except qtest) >- For architecture constants, use: > . max of supported targets phys/virt address space > . max of supported targets MMU modes > . min of supported targets variable page bits > >Build as: > > $ ../configure --target-list=any-softmmu \ > --disable-hvf \ > --disable-kvm \ > --disable-nvmm \ > --disable-tcg \ > --disable-whpx \ > --disable-xen > >Test as: > > $ qemu-system-any -M none,accel=qtest -monitor stdio > QEMU 6.2.50 monitor - type 'help' for more information 6.2.50? :) > (qemu) info mtree > address-space: I/O > 0000000000000000-000000000000ffff (prio 0, i/o): io > > address-space: memory > 0000000000000000-ffffffffffffffff (prio 0, i/o): system > > (qemu) info qom-tree > /machine (none-machine) > /peripheral (container) > /peripheral-anon (container) > /unattached (container) > /io[0] (memory-region) > /sysbus (System) > /system[0] (memory-region) > (qemu) info qtree > bus: main-system-bus > type System > (qemu) info cpus > (qemu) > >Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org> >--- > configs/devices/any-softmmu/default.mak | 9 +++++++++ > configs/targets/any-softmmu.mak | 3 +++ > meson.build | 6 ++++-- > qapi/machine.json | 2 +- > include/sysemu/arch_init.h | 1 + > target/any/cpu-param.h | 13 +++++++++++++ > target/any/cpu-qom.h | 12 ++++++++++++ > target/any/cpu.h | 24 ++++++++++++++++++++++++ > .gitlab-ci.d/buildtest.yml | 20 ++++++++++++++++++++ > hw/any/meson.build | 5 +++++ > hw/meson.build | 1 + > target/Kconfig | 1 + > target/any/Kconfig | 4 ++++ > target/any/meson.build | 7 +++++++ > target/meson.build | 1 + > 15 files changed, 106 insertions(+), 3 deletions(-) > create mode 100644 configs/devices/any-softmmu/default.mak > create mode 100644 configs/targets/any-softmmu.mak > create mode 100644 target/any/cpu-param.h > create mode 100644 target/any/cpu-qom.h > create mode 100644 target/any/cpu.h > create mode 100644 hw/any/meson.build > create mode 100644 target/any/Kconfig > create mode 100644 target/any/meson.build > >diff --git a/configs/devices/any-softmmu/default.mak b/configs/devices/any-softmmu/default.mak >new file mode 100644 >index 0000000000..dab0ce770e >--- /dev/null >+++ b/configs/devices/any-softmmu/default.mak >@@ -0,0 +1,9 @@ >+# SPDX-License-Identifier: GPL-2.0-or-later >+ >+CONFIG_ISA_BUS=y >+CONFIG_PCI=y >+CONFIG_PCI_DEVICES=y >+CONFIG_I2C=y >+CONFIG_TPM=y >+CONFIG_NUBUS=y >+CONFIG_VIRTIO=y >diff --git a/configs/targets/any-softmmu.mak b/configs/targets/any-softmmu.mak >new file mode 100644 >index 0000000000..2c6cf1edd4 >--- /dev/null >+++ b/configs/targets/any-softmmu.mak >@@ -0,0 +1,3 @@ >+# SPDX-License-Identifier: GPL-2.0-or-later >+ >+TARGET_ARCH=any >diff --git a/meson.build b/meson.build >index c1dc83e4c0..f6aee8218b 100644 >--- a/meson.build >+++ b/meson.build >@@ -46,7 +46,7 @@ qapi_trace_events = [] > bsd_oses = ['gnu/kfreebsd', 'freebsd', 'netbsd', 'openbsd', 'dragonfly', 'darwin'] > supported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux'] > supported_cpus = ['ppc', 'ppc64', 's390x', 'riscv32', 'riscv64', 'x86', 'x86_64', >- 'arm', 'aarch64', 'loongarch64', 'mips', 'mips64', 'sparc64'] >+ 'arm', 'aarch64', 'loongarch64', 'mips', 'mips64', 'sparc64', 'any'] > > cpu = host_machine.cpu_family() > >@@ -3043,7 +3043,9 @@ foreach target : target_dirs > if default_targets > continue > endif >- error('No accelerator available for target @0@'.format(target)) >+ if 'any-softmmu' not in target_dirs >+ error('No accelerator available for target @0@'.format(target)) >+ endif > endif > > actual_target_dirs += target >diff --git a/qapi/machine.json b/qapi/machine.json >index d816c5c02e..8d3dcd5fb4 100644 >--- a/qapi/machine.json >+++ b/qapi/machine.json >@@ -36,7 +36,7 @@ > 'mips64el', 'mipsel', 'nios2', 'or1k', 'ppc', > 'ppc64', 'riscv32', 'riscv64', 'rx', 's390x', 'sh4', > 'sh4eb', 'sparc', 'sparc64', 'tricore', >- 'x86_64', 'xtensa', 'xtensaeb' ] } >+ 'x86_64', 'xtensa', 'xtensaeb', 'any' ] } This array looks alphabetically sorted (before the `any`), might that be on purpose? > > ## > # @CpuS390State: >diff --git a/include/sysemu/arch_init.h b/include/sysemu/arch_init.h >index 8850cb1a14..49bee75610 100644 >--- a/include/sysemu/arch_init.h >+++ b/include/sysemu/arch_init.h >@@ -4,6 +4,7 @@ > > enum { > QEMU_ARCH_ALL = -1, >+ QEMU_ARCH_ANY = -1, > QEMU_ARCH_ALPHA = (1 << 0), > QEMU_ARCH_ARM = (1 << 1), > QEMU_ARCH_CRIS = (1 << 2), >diff --git a/target/any/cpu-param.h b/target/any/cpu-param.h >new file mode 100644 >index 0000000000..42e38ae991 >--- /dev/null >+++ b/target/any/cpu-param.h >@@ -0,0 +1,13 @@ >+/* SPDX-License-Identifier: GPL-2.0-or-later */ >+#ifndef ANY_CPU_PARAM_H >+#define ANY_CPU_PARAM_H >+ >+#define TARGET_LONG_BITS 64 >+ >+#define TARGET_PHYS_ADDR_SPACE_BITS 64 /* MAX(targets) */ >+#define TARGET_VIRT_ADDR_SPACE_BITS 64 /* MAX(targets) */ >+ >+#define TARGET_PAGE_BITS_VARY >+#define TARGET_PAGE_BITS_MIN 10 /* MIN(targets)=ARMv5/ARMv6, ignoring AVR */ >+ >+#endif Nit: -#endif +#endif /* ANY_CPU_PARAM_H */ (And for the other #endifs following) >diff --git a/target/any/cpu-qom.h b/target/any/cpu-qom.h >new file mode 100644 >index 0000000000..18d6a85de9 >--- /dev/null >+++ b/target/any/cpu-qom.h >@@ -0,0 +1,12 @@ >+/* SPDX-License-Identifier: GPL-2.0-or-later */ >+#ifndef QEMU_DUMMY_CPU_QOM_H >+#define QEMU_DUMMY_CPU_QOM_H >+ >+#include "hw/core/cpu.h" >+#include "qom/object.h" >+ >+#define TYPE_DUMMY_CPU "dummy-cpu" >+ >+OBJECT_DECLARE_CPU_TYPE(DUMMYCPU, CPUClass, DUMMY_CPU) >+ >+#endif >diff --git a/target/any/cpu.h b/target/any/cpu.h >new file mode 100644 >index 0000000000..e8abb8891f >--- /dev/null >+++ b/target/any/cpu.h >@@ -0,0 +1,24 @@ >+/* SPDX-License-Identifier: GPL-2.0-or-later */ >+#ifndef TARGET_ANY_CPU_H >+#define TARGET_ANY_CPU_H >+ >+#include "cpu-qom.h" >+#include "exec/cpu-defs.h" >+ >+#define DUMMY_CPU_TYPE_SUFFIX "-" TYPE_DUMMY_CPU >+#define DUMMY_CPU_TYPE_NAME(name) (name DUMMY_CPU_TYPE_SUFFIX) >+#define CPU_RESOLVING_TYPE TYPE_DUMMY_CPU >+ >+struct CPUArchState { >+ /* nothing here */ >+}; >+ >+struct ArchCPU { >+ CPUState parent_obj; >+ + /* Properties */ ? >+ CPUArchState env; >+}; >+ >+#include "exec/cpu-all.h" /* FIXME remove once exec/ headers cleaned */ >+ >+#endif >diff --git a/.gitlab-ci.d/buildtest.yml b/.gitlab-ci.d/buildtest.yml >index f56df59c94..208625d4d5 100644 >--- a/.gitlab-ci.d/buildtest.yml >+++ b/.gitlab-ci.d/buildtest.yml >@@ -729,3 +729,23 @@ pages: > - public > variables: > QEMU_JOB_PUBLISH: 1 >+ >+build-system-any: >+ extends: >+ - .native_build_job_template >+ needs: >+ - job: amd64-alpine-container >+ variables: >+ IMAGE: alpine >+ TARGETS: any-softmmu >+ MAKE_CHECK_ARGS: check-qtest >+ CONFIGURE_ARGS: >+ --disable-tools >+ --disable-hvf >+ --disable-kvm >+ --disable-nvmm >+ --disable-tcg >+ --disable-whpx >+ --disable-xen >+ --with-default-devices >+ --enable-qom-cast-debug >diff --git a/hw/any/meson.build b/hw/any/meson.build >new file mode 100644 >index 0000000000..60e1567e53 >--- /dev/null >+++ b/hw/any/meson.build >@@ -0,0 +1,5 @@ >+# SPDX-License-Identifier: GPL-2.0-or-later >+ >+any_ss = ss.source_set() >+ >+hw_arch += {'any': any_ss} >diff --git a/hw/meson.build b/hw/meson.build >index 463d702683..644eeee938 100644 >--- a/hw/meson.build >+++ b/hw/meson.build >@@ -47,6 +47,7 @@ subdir('xenpv') > subdir('fsi') > > subdir('alpha') >+subdir('any') > subdir('arm') > subdir('avr') > subdir('cris') >diff --git a/target/Kconfig b/target/Kconfig >index 83da0bd293..09109c4884 100644 >--- a/target/Kconfig >+++ b/target/Kconfig >@@ -1,4 +1,5 @@ > source alpha/Kconfig >+source any/Kconfig > source arm/Kconfig > source avr/Kconfig > source cris/Kconfig >diff --git a/target/any/Kconfig b/target/any/Kconfig >new file mode 100644 >index 0000000000..8840d70e55 >--- /dev/null >+++ b/target/any/Kconfig >@@ -0,0 +1,4 @@ >+# SPDX-License-Identifier: GPL-2.0-or-later >+ >+config ANY >+ bool >diff --git a/target/any/meson.build b/target/any/meson.build >new file mode 100644 >index 0000000000..4f5422d3a3 >--- /dev/null >+++ b/target/any/meson.build >@@ -0,0 +1,7 @@ >+# SPDX-License-Identifier: GPL-2.0-or-later >+ >+any_ss = ss.source_set() >+any_system_ss = ss.source_set() >+ >+target_arch += {'any': any_ss} >+target_system_arch += {'any': any_system_ss} >diff --git a/target/meson.build b/target/meson.build >index dee2ac47e0..c75b91e1b9 100644 >--- a/target/meson.build >+++ b/target/meson.build >@@ -1,4 +1,5 @@ > subdir('alpha') >+subdir('any') > subdir('arm') > subdir('avr') > subdir('cris') >-- >2.41.0 > > LGTM in general overall. In case this wasn't discussed already, would it be a good idea to name the target x-any if it ends up in a stable release? Regardless of my inlined style comments: Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
On 15/2/24 14:02, Manos Pitsidianakis wrote: > On Thu, 15 Feb 2024 10:46, Philippe Mathieu-Daudé <philmd@linaro.org> > wrote: >> From: Philippe Mathieu-Daudé <f4bug@amsat.org> >> >> Add the 'any'-architecture target. >> >> - Only consider 64-bit targets >> - Do not use any hardware accelerator (except qtest) >> - For architecture constants, use: >> . max of supported targets phys/virt address space >> . max of supported targets MMU modes >> . min of supported targets variable page bits >> >> Build as: >> >> $ ../configure --target-list=any-softmmu \ >> --disable-hvf \ >> --disable-kvm \ >> --disable-nvmm \ >> --disable-tcg \ >> --disable-whpx \ >> --disable-xen >> >> Test as: >> >> $ qemu-system-any -M none,accel=qtest -monitor stdio >> QEMU 6.2.50 monitor - type 'help' for more information > > 6.2.50? :) Time passed... > LGTM in general overall. In case this wasn't discussed already, would it > be a good idea to name the target x-any if it ends up in a stable release? This will end in stable releases. Do you mean distribution releases? They don't include qemu-system-all and we don't use x-all. Why would a distrib want to include a pointless binary? :) > Regardless of my inlined style comments: > > Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org> Thanks!
diff --git a/configs/devices/any-softmmu/default.mak b/configs/devices/any-softmmu/default.mak new file mode 100644 index 0000000000..dab0ce770e --- /dev/null +++ b/configs/devices/any-softmmu/default.mak @@ -0,0 +1,9 @@ +# SPDX-License-Identifier: GPL-2.0-or-later + +CONFIG_ISA_BUS=y +CONFIG_PCI=y +CONFIG_PCI_DEVICES=y +CONFIG_I2C=y +CONFIG_TPM=y +CONFIG_NUBUS=y +CONFIG_VIRTIO=y diff --git a/configs/targets/any-softmmu.mak b/configs/targets/any-softmmu.mak new file mode 100644 index 0000000000..2c6cf1edd4 --- /dev/null +++ b/configs/targets/any-softmmu.mak @@ -0,0 +1,3 @@ +# SPDX-License-Identifier: GPL-2.0-or-later + +TARGET_ARCH=any diff --git a/meson.build b/meson.build index c1dc83e4c0..f6aee8218b 100644 --- a/meson.build +++ b/meson.build @@ -46,7 +46,7 @@ qapi_trace_events = [] bsd_oses = ['gnu/kfreebsd', 'freebsd', 'netbsd', 'openbsd', 'dragonfly', 'darwin'] supported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux'] supported_cpus = ['ppc', 'ppc64', 's390x', 'riscv32', 'riscv64', 'x86', 'x86_64', - 'arm', 'aarch64', 'loongarch64', 'mips', 'mips64', 'sparc64'] + 'arm', 'aarch64', 'loongarch64', 'mips', 'mips64', 'sparc64', 'any'] cpu = host_machine.cpu_family() @@ -3043,7 +3043,9 @@ foreach target : target_dirs if default_targets continue endif - error('No accelerator available for target @0@'.format(target)) + if 'any-softmmu' not in target_dirs + error('No accelerator available for target @0@'.format(target)) + endif endif actual_target_dirs += target diff --git a/qapi/machine.json b/qapi/machine.json index d816c5c02e..8d3dcd5fb4 100644 --- a/qapi/machine.json +++ b/qapi/machine.json @@ -36,7 +36,7 @@ 'mips64el', 'mipsel', 'nios2', 'or1k', 'ppc', 'ppc64', 'riscv32', 'riscv64', 'rx', 's390x', 'sh4', 'sh4eb', 'sparc', 'sparc64', 'tricore', - 'x86_64', 'xtensa', 'xtensaeb' ] } + 'x86_64', 'xtensa', 'xtensaeb', 'any' ] } ## # @CpuS390State: diff --git a/include/sysemu/arch_init.h b/include/sysemu/arch_init.h index 8850cb1a14..49bee75610 100644 --- a/include/sysemu/arch_init.h +++ b/include/sysemu/arch_init.h @@ -4,6 +4,7 @@ enum { QEMU_ARCH_ALL = -1, + QEMU_ARCH_ANY = -1, QEMU_ARCH_ALPHA = (1 << 0), QEMU_ARCH_ARM = (1 << 1), QEMU_ARCH_CRIS = (1 << 2), diff --git a/target/any/cpu-param.h b/target/any/cpu-param.h new file mode 100644 index 0000000000..42e38ae991 --- /dev/null +++ b/target/any/cpu-param.h @@ -0,0 +1,13 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +#ifndef ANY_CPU_PARAM_H +#define ANY_CPU_PARAM_H + +#define TARGET_LONG_BITS 64 + +#define TARGET_PHYS_ADDR_SPACE_BITS 64 /* MAX(targets) */ +#define TARGET_VIRT_ADDR_SPACE_BITS 64 /* MAX(targets) */ + +#define TARGET_PAGE_BITS_VARY +#define TARGET_PAGE_BITS_MIN 10 /* MIN(targets)=ARMv5/ARMv6, ignoring AVR */ + +#endif diff --git a/target/any/cpu-qom.h b/target/any/cpu-qom.h new file mode 100644 index 0000000000..18d6a85de9 --- /dev/null +++ b/target/any/cpu-qom.h @@ -0,0 +1,12 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +#ifndef QEMU_DUMMY_CPU_QOM_H +#define QEMU_DUMMY_CPU_QOM_H + +#include "hw/core/cpu.h" +#include "qom/object.h" + +#define TYPE_DUMMY_CPU "dummy-cpu" + +OBJECT_DECLARE_CPU_TYPE(DUMMYCPU, CPUClass, DUMMY_CPU) + +#endif diff --git a/target/any/cpu.h b/target/any/cpu.h new file mode 100644 index 0000000000..e8abb8891f --- /dev/null +++ b/target/any/cpu.h @@ -0,0 +1,24 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +#ifndef TARGET_ANY_CPU_H +#define TARGET_ANY_CPU_H + +#include "cpu-qom.h" +#include "exec/cpu-defs.h" + +#define DUMMY_CPU_TYPE_SUFFIX "-" TYPE_DUMMY_CPU +#define DUMMY_CPU_TYPE_NAME(name) (name DUMMY_CPU_TYPE_SUFFIX) +#define CPU_RESOLVING_TYPE TYPE_DUMMY_CPU + +struct CPUArchState { + /* nothing here */ +}; + +struct ArchCPU { + CPUState parent_obj; + + CPUArchState env; +}; + +#include "exec/cpu-all.h" /* FIXME remove once exec/ headers cleaned */ + +#endif diff --git a/.gitlab-ci.d/buildtest.yml b/.gitlab-ci.d/buildtest.yml index f56df59c94..208625d4d5 100644 --- a/.gitlab-ci.d/buildtest.yml +++ b/.gitlab-ci.d/buildtest.yml @@ -729,3 +729,23 @@ pages: - public variables: QEMU_JOB_PUBLISH: 1 + +build-system-any: + extends: + - .native_build_job_template + needs: + - job: amd64-alpine-container + variables: + IMAGE: alpine + TARGETS: any-softmmu + MAKE_CHECK_ARGS: check-qtest + CONFIGURE_ARGS: + --disable-tools + --disable-hvf + --disable-kvm + --disable-nvmm + --disable-tcg + --disable-whpx + --disable-xen + --with-default-devices + --enable-qom-cast-debug diff --git a/hw/any/meson.build b/hw/any/meson.build new file mode 100644 index 0000000000..60e1567e53 --- /dev/null +++ b/hw/any/meson.build @@ -0,0 +1,5 @@ +# SPDX-License-Identifier: GPL-2.0-or-later + +any_ss = ss.source_set() + +hw_arch += {'any': any_ss} diff --git a/hw/meson.build b/hw/meson.build index 463d702683..644eeee938 100644 --- a/hw/meson.build +++ b/hw/meson.build @@ -47,6 +47,7 @@ subdir('xenpv') subdir('fsi') subdir('alpha') +subdir('any') subdir('arm') subdir('avr') subdir('cris') diff --git a/target/Kconfig b/target/Kconfig index 83da0bd293..09109c4884 100644 --- a/target/Kconfig +++ b/target/Kconfig @@ -1,4 +1,5 @@ source alpha/Kconfig +source any/Kconfig source arm/Kconfig source avr/Kconfig source cris/Kconfig diff --git a/target/any/Kconfig b/target/any/Kconfig new file mode 100644 index 0000000000..8840d70e55 --- /dev/null +++ b/target/any/Kconfig @@ -0,0 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0-or-later + +config ANY + bool diff --git a/target/any/meson.build b/target/any/meson.build new file mode 100644 index 0000000000..4f5422d3a3 --- /dev/null +++ b/target/any/meson.build @@ -0,0 +1,7 @@ +# SPDX-License-Identifier: GPL-2.0-or-later + +any_ss = ss.source_set() +any_system_ss = ss.source_set() + +target_arch += {'any': any_ss} +target_system_arch += {'any': any_system_ss} diff --git a/target/meson.build b/target/meson.build index dee2ac47e0..c75b91e1b9 100644 --- a/target/meson.build +++ b/target/meson.build @@ -1,4 +1,5 @@ subdir('alpha') +subdir('any') subdir('arm') subdir('avr') subdir('cris')