Forráskód Böngészése

Merge tag 'pull-for-8.0-220323-1' of https://gitlab.com/stsquad/qemu into staging

Misc fixes for 8.0 (testing, plugins, gitdm)

  - update Alpine image used for testing images
  - include libslirp in custom runner build env
  - update gitlab-runner recipe for CentOS
  - update docker calls for better caching behaviour
  - document some plugin callbacks
  - don't use tags to define drives for lkft baseline tests
  - fix missing clear of plugin_mem_cbs
  - fix iotests to report individual results
  - update the gitdm metadata for contributors
  - avoid printing comments before g_test_init()
  - probe for multiprocess support before running avocado test
  - refactor igb.py into netdev-ethtool.py avocado test
  - rebuild openbsd to have more space space for iotests

# -----BEGIN PGP SIGNATURE-----
#
# iQEzBAABCgAdFiEEZoWumedRZ7yvyN81+9DbCVqeKkQFAmQbGkoACgkQ+9DbCVqe
# KkT2kQgAif70dGyn2bcv7OYv2LgAcSzDGTIsOfMM6gYc9bm3nU/R/cj9cy8Qgbnu
# v6BSVeig5AVBWI1UTuMNeKW1BWoQYfxg2kdduSyAzMZS44r09ch9iabSbxbadC1e
# L1RrRWlzs/MwWX8IclAyEj1jr+DB+/DwoG61IP3215XXSy84e/XV4j+JAyBEzXQ9
# LdznGyqyItg3S6rnVpRP/wjR0P3VlrYOLOjFfCw7gB8JrlW7KIr8hWkHXYuS2mF5
# UyXTBwbXwYB5BAx0zXC3SVgl0Gs1qymaRUX77dlotlpVVo0Ql8a06dHPtYrjMNgA
# /Nyat3Dbbu7Rai+IzZIJl3tGx850wg==
# =XR0M
# -----END PGP SIGNATURE-----
# gpg: Signature made Wed 22 Mar 2023 15:10:02 GMT
# gpg:                using RSA key 6685AE99E75167BCAFC8DF35FBD0DB095A9E2A44
# gpg: Good signature from "Alex Bennée (Master Work Key) <alex.bennee@linaro.org>" [full]
# Primary key fingerprint: 6685 AE99 E751 67BC AFC8  DF35 FBD0 DB09 5A9E 2A44

* tag 'pull-for-8.0-220323-1' of https://gitlab.com/stsquad/qemu: (35 commits)
  qtests: avoid printing comments before g_test_init()
  contrib/gitdm: add group map for AMD
  contrib/gitdm: add more individual contributors
  contrib/gitdm: add revng to domain map
  contrib/gitdm: add Alibaba to the domain-map
  contrib/gitdm: add Amazon to the domain map
  contrib/gitdm: Add SYRMIA to the domain map
  contrib/gitdm: Add ASPEED Technology to the domain map
  iotests: remove the check-block.sh script
  iotests: register each I/O test separately with meson
  iotests: always use a unique sub-directory per test
  iotests: connect stdin to /dev/null when running tests
  iotests: print TAP protocol version when reporting tests
  iotests: strip subdir path when listing tests
  iotests: allow test discovery before building
  iotests: explicitly pass source/build dir to 'check' command
  tests/vm: custom openbsd partitioning to increase /home space
  tests/vm: skip X11 in openbsd installation
  include/qemu/plugin: Inline qemu_plugin_disable_mem_helpers
  include/qemu: Split out plugin-event.h
  ...

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Peter Maydell 2 éve
szülő
commit
60ca584b8a
83 módosított fájl, 470 hozzáadás és 236 törlés
  1. 6 12
      .gitlab-ci.d/custom-runners/centos-stream-8-x86_64.yml
  2. 1 1
      accel/accel-softmmu.c
  3. 3 0
      accel/tcg/cpu-exec-common.c
  4. 1 4
      accel/tcg/cpu-exec.c
  5. 1 0
      block/monitor/block-hmp-cmds.c
  6. 7 1
      contrib/gitdm/domain-map
  7. 7 0
      contrib/gitdm/group-map-alibaba
  8. 8 0
      contrib/gitdm/group-map-amd
  9. 4 0
      contrib/gitdm/group-map-individuals
  10. 1 0
      cpu.c
  11. 1 0
      dump/dump.c
  12. 1 0
      dump/win_dump.c
  13. 1 0
      gdbstub/gdbstub.c
  14. 2 0
      gitdm.config
  15. 2 0
      hw/arm/collie.c
  16. 1 0
      hw/arm/cubieboard.c
  17. 2 0
      hw/arm/musicpal.c
  18. 2 0
      hw/arm/npcm7xx_boards.c
  19. 2 0
      hw/arm/nseries.c
  20. 2 0
      hw/arm/omap_sx1.c
  21. 1 0
      hw/arm/orangepi.c
  22. 2 0
      hw/arm/palm.c
  23. 1 0
      hw/core/loader.c
  24. 2 0
      hw/core/machine-smp.c
  25. 1 0
      hw/i386/kvm/xen_evtchn.c
  26. 1 0
      hw/i386/kvm/xen_xenstore.c
  27. 1 0
      hw/i386/sgx.c
  28. 1 0
      hw/intc/apic.c
  29. 1 0
      hw/loongarch/acpi-build.c
  30. 2 0
      hw/loongarch/virt.c
  31. 1 0
      hw/m68k/next-cube.c
  32. 1 0
      hw/m68k/q800.c
  33. 1 0
      hw/m68k/virt.c
  34. 1 0
      hw/mem/memory-device.c
  35. 1 0
      hw/mem/sparse-mem.c
  36. 1 0
      hw/openrisc/boot.c
  37. 1 0
      hw/ppc/ppc4xx_sdram.c
  38. 2 0
      hw/ppc/spapr_softmmu.c
  39. 1 0
      hw/riscv/opentitan.c
  40. 1 0
      hw/riscv/shakti_c.c
  41. 1 0
      hw/riscv/virt-acpi-build.c
  42. 1 0
      hw/vfio/display.c
  43. 1 0
      hw/vfio/igd.c
  44. 1 0
      hw/vfio/migration.c
  45. 1 1
      include/hw/core/cpu.h
  46. 26 0
      include/qemu/plugin-event.h
  47. 6 21
      include/qemu/plugin.h
  48. 43 4
      include/qemu/qemu-plugin.h
  49. 1 0
      include/user/syscall-trace.h
  50. 1 0
      linux-user/elfload.c
  51. 1 0
      linux-user/exit.c
  52. 1 0
      linux-user/syscall.c
  53. 1 0
      migration/dirtyrate.c
  54. 1 0
      migration/exec.c
  55. 0 11
      plugins/core.c
  56. 1 0
      scripts/ci/org.centos/stream/8/build-environment.yml
  57. 18 2
      scripts/ci/setup/gitlab-runner.yml
  58. 1 0
      target/i386/cpu.c
  59. 1 0
      target/i386/host-cpu.c
  60. 1 0
      target/i386/kvm/xen-emu.c
  61. 1 0
      target/i386/sev.c
  62. 1 0
      target/i386/whpx/whpx-apic.c
  63. 1 0
      target/mips/cpu.c
  64. 1 0
      target/s390x/cpu-sysemu.c
  65. 1 0
      target/s390x/cpu_models.c
  66. 2 0
      target/s390x/diag.c
  67. 0 1
      tcg/tcg-op.c
  68. 10 0
      tests/avocado/avocado_qemu/__init__.py
  69. 0 38
      tests/avocado/igb.py
  70. 4 4
      tests/avocado/machine_aarch64_virt.py
  71. 1 0
      tests/avocado/multiprocess.py
  72. 116 0
      tests/avocado/netdev-ethtool.py
  73. 24 36
      tests/avocado/tuxrun_baselines.py
  74. 0 43
      tests/check-block.sh
  75. 1 1
      tests/docker/Makefile.include
  76. 26 4
      tests/qemu-iotests/check
  77. 29 6
      tests/qemu-iotests/meson.build
  78. 10 10
      tests/qemu-iotests/testenv.py
  79. 13 30
      tests/qemu-iotests/testrunner.py
  80. 7 3
      tests/qtest/migration-test.c
  81. 7 0
      tests/tcg/Makefile.target
  82. 27 3
      tests/vm/openbsd
  83. 1 0
      ui/cocoa.m

+ 6 - 12
.gitlab-ci.d/custom-runners/centos-stream-8-x86_64.yml

@@ -1,4 +1,9 @@
+# All centos-stream-8 jobs should run successfully in an environment
+# setup by the scripts/ci/setup/stream/8/build-environment.yml task
+# "Installation of extra packages to build QEMU"
+
 centos-stream-8-x86_64:
 centos-stream-8-x86_64:
+ extends: .custom_runner_template
  allow_failure: true
  allow_failure: true
  needs: []
  needs: []
  stage: build
  stage: build
@@ -8,15 +13,6 @@ centos-stream-8-x86_64:
  rules:
  rules:
  - if: '$CI_PROJECT_NAMESPACE == "qemu-project" && $CI_COMMIT_BRANCH =~ /^staging/'
  - if: '$CI_PROJECT_NAMESPACE == "qemu-project" && $CI_COMMIT_BRANCH =~ /^staging/'
  - if: "$CENTOS_STREAM_8_x86_64_RUNNER_AVAILABLE"
  - if: "$CENTOS_STREAM_8_x86_64_RUNNER_AVAILABLE"
- artifacts:
-   name: "$CI_JOB_NAME-$CI_COMMIT_REF_SLUG"
-   when: on_failure
-   expire_in: 7 days
-   paths:
-     - build/tests/results/latest/results.xml
-     - build/tests/results/latest/test-results
-   reports:
-     junit: build/tests/results/latest/results.xml
  before_script:
  before_script:
  - JOBS=$(expr $(nproc) + 1)
  - JOBS=$(expr $(nproc) + 1)
  script:
  script:
@@ -25,6 +21,4 @@ centos-stream-8-x86_64:
  - ../scripts/ci/org.centos/stream/8/x86_64/configure
  - ../scripts/ci/org.centos/stream/8/x86_64/configure
    || { cat config.log meson-logs/meson-log.txt; exit 1; }
    || { cat config.log meson-logs/meson-log.txt; exit 1; }
  - make -j"$JOBS"
  - make -j"$JOBS"
- - make NINJA=":" check
-   || { cat meson-logs/testlog.txt; exit 1; } ;
- - ../scripts/ci/org.centos/stream/8/x86_64/test-avocado
+ - make NINJA=":" check check-avocado

+ 1 - 1
accel/accel-softmmu.c

@@ -27,7 +27,7 @@
 #include "qemu/accel.h"
 #include "qemu/accel.h"
 #include "hw/boards.h"
 #include "hw/boards.h"
 #include "sysemu/cpus.h"
 #include "sysemu/cpus.h"
-
+#include "qemu/error-report.h"
 #include "accel-softmmu.h"
 #include "accel-softmmu.h"
 
 
 int accel_init_machine(AccelState *accel, MachineState *ms)
 int accel_init_machine(AccelState *accel, MachineState *ms)

+ 3 - 0
accel/tcg/cpu-exec-common.c

@@ -21,6 +21,7 @@
 #include "sysemu/cpus.h"
 #include "sysemu/cpus.h"
 #include "sysemu/tcg.h"
 #include "sysemu/tcg.h"
 #include "exec/exec-all.h"
 #include "exec/exec-all.h"
+#include "qemu/plugin.h"
 
 
 bool tcg_allowed;
 bool tcg_allowed;
 
 
@@ -65,6 +66,8 @@ void cpu_loop_exit(CPUState *cpu)
 {
 {
     /* Undo the setting in cpu_tb_exec.  */
     /* Undo the setting in cpu_tb_exec.  */
     cpu->can_do_io = 1;
     cpu->can_do_io = 1;
+    /* Undo any setting in generated code.  */
+    qemu_plugin_disable_mem_helpers(cpu);
     siglongjmp(cpu->jmp_env, 1);
     siglongjmp(cpu->jmp_env, 1);
 }
 }
 
 

+ 1 - 4
accel/tcg/cpu-exec.c

@@ -459,6 +459,7 @@ cpu_tb_exec(CPUState *cpu, TranslationBlock *itb, int *tb_exit)
     qemu_thread_jit_execute();
     qemu_thread_jit_execute();
     ret = tcg_qemu_tb_exec(env, tb_ptr);
     ret = tcg_qemu_tb_exec(env, tb_ptr);
     cpu->can_do_io = 1;
     cpu->can_do_io = 1;
+    qemu_plugin_disable_mem_helpers(cpu);
     /*
     /*
      * TODO: Delay swapping back to the read-write region of the TB
      * TODO: Delay swapping back to the read-write region of the TB
      * until we actually need to modify the TB.  The read-only copy,
      * until we actually need to modify the TB.  The read-only copy,
@@ -526,7 +527,6 @@ static void cpu_exec_exit(CPUState *cpu)
     if (cc->tcg_ops->cpu_exec_exit) {
     if (cc->tcg_ops->cpu_exec_exit) {
         cc->tcg_ops->cpu_exec_exit(cpu);
         cc->tcg_ops->cpu_exec_exit(cpu);
     }
     }
-    QEMU_PLUGIN_ASSERT(cpu->plugin_mem_cbs == NULL);
 }
 }
 
 
 void cpu_exec_step_atomic(CPUState *cpu)
 void cpu_exec_step_atomic(CPUState *cpu)
@@ -580,7 +580,6 @@ void cpu_exec_step_atomic(CPUState *cpu)
             qemu_mutex_unlock_iothread();
             qemu_mutex_unlock_iothread();
         }
         }
         assert_no_pages_locked();
         assert_no_pages_locked();
-        qemu_plugin_disable_mem_helpers(cpu);
     }
     }
 
 
     /*
     /*
@@ -1004,7 +1003,6 @@ cpu_exec_loop(CPUState *cpu, SyncClocks *sc)
 
 
             cpu_loop_exec_tb(cpu, tb, pc, &last_tb, &tb_exit);
             cpu_loop_exec_tb(cpu, tb, pc, &last_tb, &tb_exit);
 
 
-            QEMU_PLUGIN_ASSERT(cpu->plugin_mem_cbs == NULL);
             /* Try to align the host and virtual clocks
             /* Try to align the host and virtual clocks
                if the guest is in advance */
                if the guest is in advance */
             align_clocks(sc, cpu);
             align_clocks(sc, cpu);
@@ -1029,7 +1027,6 @@ static int cpu_exec_setjmp(CPUState *cpu, SyncClocks *sc)
         if (qemu_mutex_iothread_locked()) {
         if (qemu_mutex_iothread_locked()) {
             qemu_mutex_unlock_iothread();
             qemu_mutex_unlock_iothread();
         }
         }
-        qemu_plugin_disable_mem_helpers(cpu);
 
 
         assert_no_pages_locked();
         assert_no_pages_locked();
     }
     }

+ 1 - 0
block/monitor/block-hmp-cmds.c

@@ -48,6 +48,7 @@
 #include "qemu/option.h"
 #include "qemu/option.h"
 #include "qemu/sockets.h"
 #include "qemu/sockets.h"
 #include "qemu/cutils.h"
 #include "qemu/cutils.h"
+#include "qemu/error-report.h"
 #include "sysemu/sysemu.h"
 #include "sysemu/sysemu.h"
 #include "monitor/monitor.h"
 #include "monitor/monitor.h"
 #include "monitor/hmp.h"
 #include "monitor/hmp.h"

+ 7 - 1
contrib/gitdm/domain-map

@@ -4,7 +4,12 @@
 # This maps email domains to nice easy to read company names
 # This maps email domains to nice easy to read company names
 #
 #
 
 
+linux.alibaba.com Alibaba
+amazon.com      Amazon
+amazon.co.uk    Amazon
+amazon.de       Amazon
 amd.com         AMD
 amd.com         AMD
+aspeedtech.com  ASPEED Technology Inc.
 baidu.com       Baidu
 baidu.com       Baidu
 bytedance.com   ByteDance
 bytedance.com   ByteDance
 cmss.chinamobile.com China Mobile
 cmss.chinamobile.com China Mobile
@@ -32,17 +37,18 @@ oracle.com      Oracle
 proxmox.com     Proxmox
 proxmox.com     Proxmox
 quicinc.com     Qualcomm Innovation Center
 quicinc.com     Qualcomm Innovation Center
 redhat.com      Red Hat
 redhat.com      Red Hat
+rev.ng          rev.ng Labs
 rt-rk.com       RT-RK
 rt-rk.com       RT-RK
 samsung.com     Samsung
 samsung.com     Samsung
 siemens.com     Siemens
 siemens.com     Siemens
 sifive.com      SiFive
 sifive.com      SiFive
 suse.com        SUSE
 suse.com        SUSE
 suse.de         SUSE
 suse.de         SUSE
+syrmia.com      SYRMIA
 ventanamicro.com Ventana Micro Systems
 ventanamicro.com Ventana Micro Systems
 virtuozzo.com   Virtuozzo
 virtuozzo.com   Virtuozzo
 vrull.eu        VRULL
 vrull.eu        VRULL
 wdc.com         Western Digital
 wdc.com         Western Digital
 windriver.com   Wind River
 windriver.com   Wind River
-xilinx.com      Xilinx
 yadro.com       YADRO
 yadro.com       YADRO
 yandex-team.ru  Yandex
 yandex-team.ru  Yandex

+ 7 - 0
contrib/gitdm/group-map-alibaba

@@ -0,0 +1,7 @@
+#
+# Alibaba contributors including its subsidiaries
+#
+
+# c-sky.com, now part of T-Head, wholly-owned entity of Alibaba Group
+ren_guo@c-sky.com
+zhiwei_liu@c-sky.com

+ 8 - 0
contrib/gitdm/group-map-amd

@@ -0,0 +1,8 @@
+# AMD acquired Xilinx and contributors have been slowly updating emails
+
+edgar.iglesias@xilinx.com
+fnu.vikram@xilinx.com
+francisco.iglesias@xilinx.com
+sai.pavan.boddu@xilinx.com
+stefano.stabellini@xilinx.com
+tong.ho@xilinx.com

+ 4 - 0
contrib/gitdm/group-map-individuals

@@ -38,3 +38,7 @@ paul@nowt.org
 git@xen0n.name
 git@xen0n.name
 simon@simonsafar.com
 simon@simonsafar.com
 research_trasio@irq.a4lg.com
 research_trasio@irq.a4lg.com
+shentey@gmail.com
+bmeng@tinylab.org
+strahinja.p.jankovic@gmail.com
+Jason@zx2c4.com

+ 1 - 0
cpu.c

@@ -42,6 +42,7 @@
 #include "hw/core/accel-cpu.h"
 #include "hw/core/accel-cpu.h"
 #include "trace/trace-root.h"
 #include "trace/trace-root.h"
 #include "qemu/accel.h"
 #include "qemu/accel.h"
+#include "qemu/plugin.h"
 
 
 uintptr_t qemu_host_page_size;
 uintptr_t qemu_host_page_size;
 intptr_t qemu_host_page_mask;
 intptr_t qemu_host_page_mask;

+ 1 - 0
dump/dump.c

@@ -24,6 +24,7 @@
 #include "qapi/qapi-commands-dump.h"
 #include "qapi/qapi-commands-dump.h"
 #include "qapi/qapi-events-dump.h"
 #include "qapi/qapi-events-dump.h"
 #include "qapi/qmp/qerror.h"
 #include "qapi/qmp/qerror.h"
+#include "qemu/error-report.h"
 #include "qemu/main-loop.h"
 #include "qemu/main-loop.h"
 #include "hw/misc/vmcoreinfo.h"
 #include "hw/misc/vmcoreinfo.h"
 #include "migration/blocker.h"
 #include "migration/blocker.h"

+ 1 - 0
dump/win_dump.c

@@ -11,6 +11,7 @@
 #include "qemu/osdep.h"
 #include "qemu/osdep.h"
 #include "sysemu/dump.h"
 #include "sysemu/dump.h"
 #include "qapi/error.h"
 #include "qapi/error.h"
+#include "qemu/error-report.h"
 #include "qapi/qmp/qerror.h"
 #include "qapi/qmp/qerror.h"
 #include "exec/cpu-defs.h"
 #include "exec/cpu-defs.h"
 #include "hw/core/cpu.h"
 #include "hw/core/cpu.h"

+ 1 - 0
gdbstub/gdbstub.c

@@ -27,6 +27,7 @@
 #include "qemu/ctype.h"
 #include "qemu/ctype.h"
 #include "qemu/cutils.h"
 #include "qemu/cutils.h"
 #include "qemu/module.h"
 #include "qemu/module.h"
+#include "qemu/error-report.h"
 #include "trace.h"
 #include "trace.h"
 #include "exec/gdbstub.h"
 #include "exec/gdbstub.h"
 #include "gdbstub/syscalls.h"
 #include "gdbstub/syscalls.h"

+ 2 - 0
gitdm.config

@@ -31,6 +31,8 @@ EmailMap contrib/gitdm/domain-map
 # identifiable corporate emails. Please keep this list sorted.
 # identifiable corporate emails. Please keep this list sorted.
 #
 #
 
 
+GroupMap contrib/gitdm/group-map-alibaba Alibaba
+GroupMap contrib/gitdm/group-map-amd AMD
 GroupMap contrib/gitdm/group-map-cadence Cadence Design Systems
 GroupMap contrib/gitdm/group-map-cadence Cadence Design Systems
 GroupMap contrib/gitdm/group-map-codeweavers CodeWeavers
 GroupMap contrib/gitdm/group-map-codeweavers CodeWeavers
 GroupMap contrib/gitdm/group-map-facebook Facebook
 GroupMap contrib/gitdm/group-map-facebook Facebook

+ 2 - 0
hw/arm/collie.c

@@ -19,6 +19,8 @@
 #include "exec/address-spaces.h"
 #include "exec/address-spaces.h"
 #include "cpu.h"
 #include "cpu.h"
 #include "qom/object.h"
 #include "qom/object.h"
+#include "qemu/error-report.h"
+
 
 
 #define RAM_SIZE            (512 * MiB)
 #define RAM_SIZE            (512 * MiB)
 #define FLASH_SIZE          (32 * MiB)
 #define FLASH_SIZE          (32 * MiB)

+ 1 - 0
hw/arm/cubieboard.c

@@ -17,6 +17,7 @@
 
 
 #include "qemu/osdep.h"
 #include "qemu/osdep.h"
 #include "qapi/error.h"
 #include "qapi/error.h"
+#include "qemu/error-report.h"
 #include "hw/boards.h"
 #include "hw/boards.h"
 #include "hw/qdev-properties.h"
 #include "hw/qdev-properties.h"
 #include "hw/arm/allwinner-a10.h"
 #include "hw/arm/allwinner-a10.h"

+ 2 - 0
hw/arm/musicpal.c

@@ -37,6 +37,8 @@
 #include "qemu/cutils.h"
 #include "qemu/cutils.h"
 #include "qom/object.h"
 #include "qom/object.h"
 #include "hw/net/mv88w8618_eth.h"
 #include "hw/net/mv88w8618_eth.h"
+#include "qemu/error-report.h"
+
 
 
 #define MP_MISC_BASE            0x80002000
 #define MP_MISC_BASE            0x80002000
 #define MP_MISC_SIZE            0x00001000
 #define MP_MISC_SIZE            0x00001000

+ 2 - 0
hw/arm/npcm7xx_boards.c

@@ -30,6 +30,8 @@
 #include "sysemu/blockdev.h"
 #include "sysemu/blockdev.h"
 #include "sysemu/sysemu.h"
 #include "sysemu/sysemu.h"
 #include "sysemu/block-backend.h"
 #include "sysemu/block-backend.h"
+#include "qemu/error-report.h"
+
 
 
 #define NPCM7XX_POWER_ON_STRAPS_DEFAULT (           \
 #define NPCM7XX_POWER_ON_STRAPS_DEFAULT (           \
         NPCM7XX_PWRON_STRAP_SPI0F18 |               \
         NPCM7XX_PWRON_STRAP_SPI0F18 |               \

+ 2 - 0
hw/arm/nseries.c

@@ -45,6 +45,8 @@
 #include "hw/loader.h"
 #include "hw/loader.h"
 #include "hw/sysbus.h"
 #include "hw/sysbus.h"
 #include "qemu/log.h"
 #include "qemu/log.h"
+#include "qemu/error-report.h"
+
 
 
 /* Nokia N8x0 support */
 /* Nokia N8x0 support */
 struct n800_s {
 struct n800_s {

+ 2 - 0
hw/arm/omap_sx1.c

@@ -37,6 +37,8 @@
 #include "exec/address-spaces.h"
 #include "exec/address-spaces.h"
 #include "cpu.h"
 #include "cpu.h"
 #include "qemu/cutils.h"
 #include "qemu/cutils.h"
+#include "qemu/error-report.h"
+
 
 
 /*****************************************************************************/
 /*****************************************************************************/
 /* Siemens SX1 Cellphone V1 */
 /* Siemens SX1 Cellphone V1 */

+ 1 - 0
hw/arm/orangepi.c

@@ -21,6 +21,7 @@
 #include "qemu/units.h"
 #include "qemu/units.h"
 #include "exec/address-spaces.h"
 #include "exec/address-spaces.h"
 #include "qapi/error.h"
 #include "qapi/error.h"
+#include "qemu/error-report.h"
 #include "hw/boards.h"
 #include "hw/boards.h"
 #include "hw/qdev-properties.h"
 #include "hw/qdev-properties.h"
 #include "hw/arm/allwinner-h3.h"
 #include "hw/arm/allwinner-h3.h"

+ 2 - 0
hw/arm/palm.c

@@ -32,6 +32,8 @@
 #include "cpu.h"
 #include "cpu.h"
 #include "qemu/cutils.h"
 #include "qemu/cutils.h"
 #include "qom/object.h"
 #include "qom/object.h"
+#include "qemu/error-report.h"
+
 
 
 static uint64_t static_read(void *opaque, hwaddr offset, unsigned size)
 static uint64_t static_read(void *opaque, hwaddr offset, unsigned size)
 {
 {

+ 1 - 0
hw/core/loader.c

@@ -44,6 +44,7 @@
 
 
 #include "qemu/osdep.h"
 #include "qemu/osdep.h"
 #include "qemu/datadir.h"
 #include "qemu/datadir.h"
+#include "qemu/error-report.h"
 #include "qapi/error.h"
 #include "qapi/error.h"
 #include "qapi/qapi-commands-machine.h"
 #include "qapi/qapi-commands-machine.h"
 #include "qapi/type-helpers.h"
 #include "qapi/type-helpers.h"

+ 2 - 0
hw/core/machine-smp.c

@@ -20,6 +20,8 @@
 #include "qemu/osdep.h"
 #include "qemu/osdep.h"
 #include "hw/boards.h"
 #include "hw/boards.h"
 #include "qapi/error.h"
 #include "qapi/error.h"
+#include "qemu/error-report.h"
+
 
 
 /*
 /*
  * Report information of a machine's supported CPU topology hierarchy.
  * Report information of a machine's supported CPU topology hierarchy.

+ 1 - 0
hw/i386/kvm/xen_evtchn.c

@@ -15,6 +15,7 @@
 #include "qemu/lockable.h"
 #include "qemu/lockable.h"
 #include "qemu/main-loop.h"
 #include "qemu/main-loop.h"
 #include "qemu/log.h"
 #include "qemu/log.h"
+#include "qemu/error-report.h"
 #include "monitor/monitor.h"
 #include "monitor/monitor.h"
 #include "monitor/hmp.h"
 #include "monitor/hmp.h"
 #include "qapi/error.h"
 #include "qapi/error.h"

+ 1 - 0
hw/i386/kvm/xen_xenstore.c

@@ -15,6 +15,7 @@
 #include "qemu/module.h"
 #include "qemu/module.h"
 #include "qemu/main-loop.h"
 #include "qemu/main-loop.h"
 #include "qemu/cutils.h"
 #include "qemu/cutils.h"
+#include "qemu/error-report.h"
 #include "qapi/error.h"
 #include "qapi/error.h"
 #include "qom/object.h"
 #include "qom/object.h"
 #include "migration/vmstate.h"
 #include "migration/vmstate.h"

+ 1 - 0
hw/i386/sgx.c

@@ -18,6 +18,7 @@
 #include "monitor/monitor.h"
 #include "monitor/monitor.h"
 #include "monitor/hmp-target.h"
 #include "monitor/hmp-target.h"
 #include "qapi/error.h"
 #include "qapi/error.h"
+#include "qemu/error-report.h"
 #include "qapi/qapi-commands-misc-target.h"
 #include "qapi/qapi-commands-misc-target.h"
 #include "exec/address-spaces.h"
 #include "exec/address-spaces.h"
 #include "sysemu/hw_accel.h"
 #include "sysemu/hw_accel.h"

+ 1 - 0
hw/intc/apic.c

@@ -18,6 +18,7 @@
  */
  */
 #include "qemu/osdep.h"
 #include "qemu/osdep.h"
 #include "qemu/thread.h"
 #include "qemu/thread.h"
+#include "qemu/error-report.h"
 #include "hw/i386/apic_internal.h"
 #include "hw/i386/apic_internal.h"
 #include "hw/i386/apic.h"
 #include "hw/i386/apic.h"
 #include "hw/intc/ioapic.h"
 #include "hw/intc/ioapic.h"

+ 1 - 0
hw/loongarch/acpi-build.c

@@ -7,6 +7,7 @@
 
 
 #include "qemu/osdep.h"
 #include "qemu/osdep.h"
 #include "qapi/error.h"
 #include "qapi/error.h"
+#include "qemu/error-report.h"
 #include "qemu/bitmap.h"
 #include "qemu/bitmap.h"
 #include "hw/pci/pci.h"
 #include "hw/pci/pci.h"
 #include "hw/core/cpu.h"
 #include "hw/core/cpu.h"

+ 2 - 0
hw/loongarch/virt.c

@@ -44,6 +44,8 @@
 #include "sysemu/tpm.h"
 #include "sysemu/tpm.h"
 #include "sysemu/block-backend.h"
 #include "sysemu/block-backend.h"
 #include "hw/block/flash.h"
 #include "hw/block/flash.h"
+#include "qemu/error-report.h"
+
 
 
 static void virt_flash_create(LoongArchMachineState *lams)
 static void virt_flash_create(LoongArchMachineState *lams)
 {
 {

+ 1 - 0
hw/m68k/next-cube.c

@@ -24,6 +24,7 @@
 #include "hw/block/fdc.h"
 #include "hw/block/fdc.h"
 #include "hw/qdev-properties.h"
 #include "hw/qdev-properties.h"
 #include "qapi/error.h"
 #include "qapi/error.h"
+#include "qemu/error-report.h"
 #include "ui/console.h"
 #include "ui/console.h"
 #include "target/m68k/cpu.h"
 #include "target/m68k/cpu.h"
 #include "migration/vmstate.h"
 #include "migration/vmstate.h"

+ 1 - 0
hw/m68k/q800.c

@@ -45,6 +45,7 @@
 #include "hw/block/swim.h"
 #include "hw/block/swim.h"
 #include "net/net.h"
 #include "net/net.h"
 #include "qapi/error.h"
 #include "qapi/error.h"
+#include "qemu/error-report.h"
 #include "sysemu/qtest.h"
 #include "sysemu/qtest.h"
 #include "sysemu/runstate.h"
 #include "sysemu/runstate.h"
 #include "sysemu/reset.h"
 #include "sysemu/reset.h"

+ 1 - 0
hw/m68k/virt.c

@@ -23,6 +23,7 @@
 #include "bootinfo.h"
 #include "bootinfo.h"
 #include "net/net.h"
 #include "net/net.h"
 #include "qapi/error.h"
 #include "qapi/error.h"
+#include "qemu/error-report.h"
 #include "sysemu/qtest.h"
 #include "sysemu/qtest.h"
 #include "sysemu/runstate.h"
 #include "sysemu/runstate.h"
 #include "sysemu/reset.h"
 #include "sysemu/reset.h"

+ 1 - 0
hw/mem/memory-device.c

@@ -10,6 +10,7 @@
  */
  */
 
 
 #include "qemu/osdep.h"
 #include "qemu/osdep.h"
+#include "qemu/error-report.h"
 #include "hw/mem/memory-device.h"
 #include "hw/mem/memory-device.h"
 #include "qapi/error.h"
 #include "qapi/error.h"
 #include "hw/boards.h"
 #include "hw/boards.h"

+ 1 - 0
hw/mem/sparse-mem.c

@@ -11,6 +11,7 @@
  */
  */
 
 
 #include "qemu/osdep.h"
 #include "qemu/osdep.h"
+#include "qemu/error-report.h"
 
 
 #include "hw/qdev-properties.h"
 #include "hw/qdev-properties.h"
 #include "hw/sysbus.h"
 #include "hw/sysbus.h"

+ 1 - 0
hw/openrisc/boot.c

@@ -15,6 +15,7 @@
 #include "sysemu/device_tree.h"
 #include "sysemu/device_tree.h"
 #include "sysemu/qtest.h"
 #include "sysemu/qtest.h"
 #include "sysemu/reset.h"
 #include "sysemu/reset.h"
+#include "qemu/error-report.h"
 
 
 #include <libfdt.h>
 #include <libfdt.h>
 
 

+ 1 - 0
hw/ppc/ppc4xx_sdram.c

@@ -33,6 +33,7 @@
 #include "qemu/units.h"
 #include "qemu/units.h"
 #include "qapi/error.h"
 #include "qapi/error.h"
 #include "qemu/log.h"
 #include "qemu/log.h"
+#include "qemu/error-report.h"
 #include "exec/address-spaces.h" /* get_system_memory() */
 #include "exec/address-spaces.h" /* get_system_memory() */
 #include "hw/irq.h"
 #include "hw/irq.h"
 #include "hw/qdev-properties.h"
 #include "hw/qdev-properties.h"

+ 2 - 0
hw/ppc/spapr_softmmu.c

@@ -1,12 +1,14 @@
 #include "qemu/osdep.h"
 #include "qemu/osdep.h"
 #include "qemu/cutils.h"
 #include "qemu/cutils.h"
 #include "qemu/memalign.h"
 #include "qemu/memalign.h"
+#include "qemu/error-report.h"
 #include "cpu.h"
 #include "cpu.h"
 #include "helper_regs.h"
 #include "helper_regs.h"
 #include "hw/ppc/spapr.h"
 #include "hw/ppc/spapr.h"
 #include "mmu-hash64.h"
 #include "mmu-hash64.h"
 #include "mmu-book3s-v3.h"
 #include "mmu-book3s-v3.h"
 
 
+
 static inline bool valid_ptex(PowerPCCPU *cpu, target_ulong ptex)
 static inline bool valid_ptex(PowerPCCPU *cpu, target_ulong ptex)
 {
 {
     /*
     /*

+ 1 - 0
hw/riscv/opentitan.c

@@ -22,6 +22,7 @@
 #include "qemu/cutils.h"
 #include "qemu/cutils.h"
 #include "hw/riscv/opentitan.h"
 #include "hw/riscv/opentitan.h"
 #include "qapi/error.h"
 #include "qapi/error.h"
+#include "qemu/error-report.h"
 #include "hw/boards.h"
 #include "hw/boards.h"
 #include "hw/misc/unimp.h"
 #include "hw/misc/unimp.h"
 #include "hw/riscv/boot.h"
 #include "hw/riscv/boot.h"

+ 1 - 0
hw/riscv/shakti_c.c

@@ -20,6 +20,7 @@
 #include "hw/boards.h"
 #include "hw/boards.h"
 #include "hw/riscv/shakti_c.h"
 #include "hw/riscv/shakti_c.h"
 #include "qapi/error.h"
 #include "qapi/error.h"
+#include "qemu/error-report.h"
 #include "hw/intc/sifive_plic.h"
 #include "hw/intc/sifive_plic.h"
 #include "hw/intc/riscv_aclint.h"
 #include "hw/intc/riscv_aclint.h"
 #include "sysemu/sysemu.h"
 #include "sysemu/sysemu.h"

+ 1 - 0
hw/riscv/virt-acpi-build.c

@@ -29,6 +29,7 @@
 #include "hw/acpi/aml-build.h"
 #include "hw/acpi/aml-build.h"
 #include "hw/acpi/utils.h"
 #include "hw/acpi/utils.h"
 #include "qapi/error.h"
 #include "qapi/error.h"
+#include "qemu/error-report.h"
 #include "sysemu/reset.h"
 #include "sysemu/reset.h"
 #include "migration/vmstate.h"
 #include "migration/vmstate.h"
 #include "hw/riscv/virt.h"
 #include "hw/riscv/virt.h"

+ 1 - 0
hw/vfio/display.c

@@ -14,6 +14,7 @@
 #include <linux/vfio.h>
 #include <linux/vfio.h>
 #include <sys/ioctl.h>
 #include <sys/ioctl.h>
 
 
+#include "qemu/error-report.h"
 #include "hw/display/edid.h"
 #include "hw/display/edid.h"
 #include "ui/console.h"
 #include "ui/console.h"
 #include "qapi/error.h"
 #include "qapi/error.h"

+ 1 - 0
hw/vfio/igd.c

@@ -12,6 +12,7 @@
 
 
 #include "qemu/osdep.h"
 #include "qemu/osdep.h"
 #include "qemu/units.h"
 #include "qemu/units.h"
+#include "qemu/error-report.h"
 #include "qapi/error.h"
 #include "qapi/error.h"
 #include "hw/hw.h"
 #include "hw/hw.h"
 #include "hw/nvram/fw_cfg.h"
 #include "hw/nvram/fw_cfg.h"

+ 1 - 0
hw/vfio/migration.c

@@ -11,6 +11,7 @@
 #include "qemu/main-loop.h"
 #include "qemu/main-loop.h"
 #include "qemu/cutils.h"
 #include "qemu/cutils.h"
 #include "qemu/units.h"
 #include "qemu/units.h"
+#include "qemu/error-report.h"
 #include <linux/vfio.h>
 #include <linux/vfio.h>
 #include <sys/ioctl.h>
 #include <sys/ioctl.h>
 
 

+ 1 - 1
include/hw/core/cpu.h

@@ -30,7 +30,7 @@
 #include "qemu/rcu_queue.h"
 #include "qemu/rcu_queue.h"
 #include "qemu/queue.h"
 #include "qemu/queue.h"
 #include "qemu/thread.h"
 #include "qemu/thread.h"
-#include "qemu/plugin.h"
+#include "qemu/plugin-event.h"
 #include "qom/object.h"
 #include "qom/object.h"
 
 
 typedef int (*WriteCoreDumpFunction)(const void *buf, size_t size,
 typedef int (*WriteCoreDumpFunction)(const void *buf, size_t size,

+ 26 - 0
include/qemu/plugin-event.h

@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2017, Emilio G. Cota <cota@braap.org>
+ *
+ * License: GNU GPL, version 2 or later.
+ *   See the COPYING file in the top-level directory.
+ */
+#ifndef QEMU_PLUGIN_EVENT_H
+#define QEMU_PLUGIN_EVENT_H
+
+/*
+ * Events that plugins can subscribe to.
+ */
+enum qemu_plugin_event {
+    QEMU_PLUGIN_EV_VCPU_INIT,
+    QEMU_PLUGIN_EV_VCPU_EXIT,
+    QEMU_PLUGIN_EV_VCPU_TB_TRANS,
+    QEMU_PLUGIN_EV_VCPU_IDLE,
+    QEMU_PLUGIN_EV_VCPU_RESUME,
+    QEMU_PLUGIN_EV_VCPU_SYSCALL,
+    QEMU_PLUGIN_EV_VCPU_SYSCALL_RET,
+    QEMU_PLUGIN_EV_FLUSH,
+    QEMU_PLUGIN_EV_ATEXIT,
+    QEMU_PLUGIN_EV_MAX, /* total number of plugin events we support */
+};
+
+#endif /* QEMU_PLUGIN_EVENT_H */

+ 6 - 21
include/qemu/plugin.h

@@ -12,23 +12,9 @@
 #include "qemu/error-report.h"
 #include "qemu/error-report.h"
 #include "qemu/queue.h"
 #include "qemu/queue.h"
 #include "qemu/option.h"
 #include "qemu/option.h"
+#include "qemu/plugin-event.h"
 #include "exec/memopidx.h"
 #include "exec/memopidx.h"
-
-/*
- * Events that plugins can subscribe to.
- */
-enum qemu_plugin_event {
-    QEMU_PLUGIN_EV_VCPU_INIT,
-    QEMU_PLUGIN_EV_VCPU_EXIT,
-    QEMU_PLUGIN_EV_VCPU_TB_TRANS,
-    QEMU_PLUGIN_EV_VCPU_IDLE,
-    QEMU_PLUGIN_EV_VCPU_RESUME,
-    QEMU_PLUGIN_EV_VCPU_SYSCALL,
-    QEMU_PLUGIN_EV_VCPU_SYSCALL_RET,
-    QEMU_PLUGIN_EV_FLUSH,
-    QEMU_PLUGIN_EV_ATEXIT,
-    QEMU_PLUGIN_EV_MAX, /* total number of plugin events we support */
-};
+#include "hw/core/cpu.h"
 
 
 /*
 /*
  * Option parsing/processing.
  * Option parsing/processing.
@@ -59,8 +45,6 @@ get_plugin_meminfo_rw(qemu_plugin_meminfo_t i)
 #ifdef CONFIG_PLUGIN
 #ifdef CONFIG_PLUGIN
 extern QemuOptsList qemu_plugin_opts;
 extern QemuOptsList qemu_plugin_opts;
 
 
-#define QEMU_PLUGIN_ASSERT(cond) g_assert(cond)
-
 static inline void qemu_plugin_add_opts(void)
 static inline void qemu_plugin_add_opts(void)
 {
 {
     qemu_add_opts(&qemu_plugin_opts);
     qemu_add_opts(&qemu_plugin_opts);
@@ -221,7 +205,10 @@ void qemu_plugin_atexit_cb(void);
 
 
 void qemu_plugin_add_dyn_cb_arr(GArray *arr);
 void qemu_plugin_add_dyn_cb_arr(GArray *arr);
 
 
-void qemu_plugin_disable_mem_helpers(CPUState *cpu);
+static inline void qemu_plugin_disable_mem_helpers(CPUState *cpu)
+{
+    cpu->plugin_mem_cbs = NULL;
+}
 
 
 /**
 /**
  * qemu_plugin_user_exit(): clean-up callbacks before calling exit callbacks
  * qemu_plugin_user_exit(): clean-up callbacks before calling exit callbacks
@@ -252,8 +239,6 @@ void qemu_plugin_user_postfork(bool is_child);
 
 
 #else /* !CONFIG_PLUGIN */
 #else /* !CONFIG_PLUGIN */
 
 
-#define QEMU_PLUGIN_ASSERT(cond)
-
 static inline void qemu_plugin_add_opts(void)
 static inline void qemu_plugin_add_opts(void)
 { }
 { }
 
 

+ 43 - 4
include/qemu/qemu-plugin.h

@@ -481,17 +481,56 @@ uint64_t qemu_plugin_hwaddr_phys_addr(const struct qemu_plugin_hwaddr *haddr);
  */
  */
 const char *qemu_plugin_hwaddr_device_name(const struct qemu_plugin_hwaddr *h);
 const char *qemu_plugin_hwaddr_device_name(const struct qemu_plugin_hwaddr *h);
 
 
-typedef void
-(*qemu_plugin_vcpu_mem_cb_t)(unsigned int vcpu_index,
-                             qemu_plugin_meminfo_t info, uint64_t vaddr,
-                             void *userdata);
+/**
+ * typedef qemu_plugin_vcpu_mem_cb_t - memory callback function type
+ * @vcpu_index: the executing vCPU
+ * @info: an opaque handle for further queries about the memory
+ * @vaddr: the virtual address of the transaction
+ * @userdata: any user data attached to the callback
+ */
+typedef void (*qemu_plugin_vcpu_mem_cb_t) (unsigned int vcpu_index,
+                                           qemu_plugin_meminfo_t info,
+                                           uint64_t vaddr,
+                                           void *userdata);
 
 
+/**
+ * qemu_plugin_register_vcpu_mem_cb() - register memory access callback
+ * @insn: handle for instruction to instrument
+ * @cb: callback of type qemu_plugin_vcpu_mem_cb_t
+ * @flags: (currently unused) callback flags
+ * @rw: monitor reads, writes or both
+ * @userdata: opaque pointer for userdata
+ *
+ * This registers a full callback for every memory access generated by
+ * an instruction. If the instruction doesn't access memory no
+ * callback will be made.
+ *
+ * The callback reports the vCPU the access took place on, the virtual
+ * address of the access and a handle for further queries. The user
+ * can attach some userdata to the callback for additional purposes.
+ *
+ * Other execution threads will continue to execute during the
+ * callback so the plugin is responsible for ensuring it doesn't get
+ * confused by making appropriate use of locking if required.
+ */
 void qemu_plugin_register_vcpu_mem_cb(struct qemu_plugin_insn *insn,
 void qemu_plugin_register_vcpu_mem_cb(struct qemu_plugin_insn *insn,
                                       qemu_plugin_vcpu_mem_cb_t cb,
                                       qemu_plugin_vcpu_mem_cb_t cb,
                                       enum qemu_plugin_cb_flags flags,
                                       enum qemu_plugin_cb_flags flags,
                                       enum qemu_plugin_mem_rw rw,
                                       enum qemu_plugin_mem_rw rw,
                                       void *userdata);
                                       void *userdata);
 
 
+/**
+ * qemu_plugin_register_vcpu_mem_inline() - register an inline op to any memory access
+ * @insn: handle for instruction to instrument
+ * @rw: apply to reads, writes or both
+ * @op: the op, of type qemu_plugin_op
+ * @ptr: pointer memory for the op
+ * @imm: immediate data for @op
+ *
+ * This registers a inline op every memory access generated by the
+ * instruction. This provides for a lightweight but not thread-safe
+ * way of counting the number of operations done.
+ */
 void qemu_plugin_register_vcpu_mem_inline(struct qemu_plugin_insn *insn,
 void qemu_plugin_register_vcpu_mem_inline(struct qemu_plugin_insn *insn,
                                           enum qemu_plugin_mem_rw rw,
                                           enum qemu_plugin_mem_rw rw,
                                           enum qemu_plugin_op op, void *ptr,
                                           enum qemu_plugin_op op, void *ptr,

+ 1 - 0
include/user/syscall-trace.h

@@ -11,6 +11,7 @@
 #define SYSCALL_TRACE_H
 #define SYSCALL_TRACE_H
 
 
 #include "exec/user/abitypes.h"
 #include "exec/user/abitypes.h"
+#include "qemu/plugin.h"
 #include "trace/trace-root.h"
 #include "trace/trace-root.h"
 
 
 /*
 /*

+ 1 - 0
linux-user/elfload.c

@@ -18,6 +18,7 @@
 #include "qemu/units.h"
 #include "qemu/units.h"
 #include "qemu/selfmap.h"
 #include "qemu/selfmap.h"
 #include "qapi/error.h"
 #include "qapi/error.h"
+#include "qemu/error-report.h"
 #include "target_signal.h"
 #include "target_signal.h"
 #include "accel/tcg/debuginfo.h"
 #include "accel/tcg/debuginfo.h"
 
 

+ 1 - 0
linux-user/exit.c

@@ -21,6 +21,7 @@
 #include "gdbstub/syscalls.h"
 #include "gdbstub/syscalls.h"
 #include "qemu.h"
 #include "qemu.h"
 #include "user-internals.h"
 #include "user-internals.h"
+#include "qemu/plugin.h"
 #ifdef CONFIG_GPROF
 #ifdef CONFIG_GPROF
 #include <sys/gmon.h>
 #include <sys/gmon.h>
 #endif
 #endif

+ 1 - 0
linux-user/syscall.c

@@ -22,6 +22,7 @@
 #include "qemu/path.h"
 #include "qemu/path.h"
 #include "qemu/memfd.h"
 #include "qemu/memfd.h"
 #include "qemu/queue.h"
 #include "qemu/queue.h"
+#include "qemu/plugin.h"
 #include "target_mman.h"
 #include "target_mman.h"
 #include <elf.h>
 #include <elf.h>
 #include <endian.h>
 #include <endian.h>

+ 1 - 0
migration/dirtyrate.c

@@ -11,6 +11,7 @@
  */
  */
 
 
 #include "qemu/osdep.h"
 #include "qemu/osdep.h"
+#include "qemu/error-report.h"
 #include <zlib.h>
 #include <zlib.h>
 #include "qapi/error.h"
 #include "qapi/error.h"
 #include "cpu.h"
 #include "cpu.h"

+ 1 - 0
migration/exec.c

@@ -18,6 +18,7 @@
  */
  */
 
 
 #include "qemu/osdep.h"
 #include "qemu/osdep.h"
+#include "qemu/error-report.h"
 #include "channel.h"
 #include "channel.h"
 #include "exec.h"
 #include "exec.h"
 #include "migration.h"
 #include "migration.h"

+ 0 - 11
plugins/core.c

@@ -553,17 +553,6 @@ void qemu_plugin_user_postfork(bool is_child)
     }
     }
 }
 }
 
 
-
-/*
- * Call this function after longjmp'ing to the main loop. It's possible that the
- * last instruction of a TB might have used helpers, and therefore the
- * "disable" instruction will never execute because it ended up as dead code.
- */
-void qemu_plugin_disable_mem_helpers(CPUState *cpu)
-{
-    cpu->plugin_mem_cbs = NULL;
-}
-
 static bool plugin_dyn_cb_arr_cmp(const void *ap, const void *bp)
 static bool plugin_dyn_cb_arr_cmp(const void *ap, const void *bp)
 {
 {
     return ap == bp;
     return ap == bp;

+ 1 - 0
scripts/ci/org.centos/stream/8/build-environment.yml

@@ -55,6 +55,7 @@
           - librados-devel
           - librados-devel
           - librbd-devel
           - librbd-devel
           - libseccomp-devel
           - libseccomp-devel
+          - libslirp-devel
           - libssh-devel
           - libssh-devel
           - libxkbcommon-devel
           - libxkbcommon-devel
           - lzo-devel
           - lzo-devel

+ 18 - 2
scripts/ci/setup/gitlab-runner.yml

@@ -48,13 +48,29 @@
     - debug:
     - debug:
         msg: gitlab-runner arch is {{ gitlab_runner_arch }}
         msg: gitlab-runner arch is {{ gitlab_runner_arch }}
 
 
-    - name: Download the matching gitlab-runner
+    - name: Download the matching gitlab-runner (DEB)
       get_url:
       get_url:
         dest: "/root/"
         dest: "/root/"
         url: "https://gitlab-runner-downloads.s3.amazonaws.com/latest/deb/gitlab-runner_{{ gitlab_runner_arch }}.deb"
         url: "https://gitlab-runner-downloads.s3.amazonaws.com/latest/deb/gitlab-runner_{{ gitlab_runner_arch }}.deb"
+      when:
+        - ansible_facts['distribution'] == 'Ubuntu'
+
+    - name: Download the matching gitlab-runner (RPM)
+      get_url:
+        dest: "/root/"
+        url: "https://gitlab-runner-downloads.s3.amazonaws.com/latest/rpm/gitlab-runner_{{ gitlab_runner_arch }}.rpm"
+      when:
+        - ansible_facts['distribution'] == 'CentOS'
 
 
-    - name: Install gitlab-runner via package manager
+    - name: Install gitlab-runner via package manager (DEB)
       apt: deb="/root/gitlab-runner_{{ gitlab_runner_arch }}.deb"
       apt: deb="/root/gitlab-runner_{{ gitlab_runner_arch }}.deb"
+      when:
+        - ansible_facts['distribution'] == 'Ubuntu'
+
+    - name: Install gitlab-runner via package manager (RPM)
+      yum: name="/root/gitlab-runner_{{ gitlab_runner_arch }}.rpm"
+      when:
+        - ansible_facts['distribution'] == 'CentOS'
 
 
     - name: Register the gitlab-runner
     - name: Register the gitlab-runner
       command: "/usr/bin/gitlab-runner register --non-interactive --url {{ gitlab_runner_server_url }} --registration-token {{ gitlab_runner_registration_token }} --executor shell --tag-list {{ ansible_facts[\"architecture\"] }},{{ ansible_facts[\"distribution\"]|lower }}_{{ ansible_facts[\"distribution_version\"] }} --description '{{ ansible_facts[\"distribution\"] }} {{ ansible_facts[\"distribution_version\"] }} {{ ansible_facts[\"architecture\"] }} ({{ ansible_facts[\"os_family\"] }})'"
       command: "/usr/bin/gitlab-runner register --non-interactive --url {{ gitlab_runner_server_url }} --registration-token {{ gitlab_runner_registration_token }} --executor shell --tag-list {{ ansible_facts[\"architecture\"] }},{{ ansible_facts[\"distribution\"]|lower }}_{{ ansible_facts[\"distribution_version\"] }} --description '{{ ansible_facts[\"distribution\"] }} {{ ansible_facts[\"distribution_version\"] }} {{ ansible_facts[\"architecture\"] }} ({{ ansible_facts[\"os_family\"] }})'"

+ 1 - 0
target/i386/cpu.c

@@ -29,6 +29,7 @@
 #include "kvm/kvm_i386.h"
 #include "kvm/kvm_i386.h"
 #include "sev.h"
 #include "sev.h"
 #include "qapi/error.h"
 #include "qapi/error.h"
+#include "qemu/error-report.h"
 #include "qapi/qapi-visit-machine.h"
 #include "qapi/qapi-visit-machine.h"
 #include "qapi/qmp/qerror.h"
 #include "qapi/qmp/qerror.h"
 #include "standard-headers/asm-x86/kvm_para.h"
 #include "standard-headers/asm-x86/kvm_para.h"

+ 1 - 0
target/i386/host-cpu.c

@@ -11,6 +11,7 @@
 #include "cpu.h"
 #include "cpu.h"
 #include "host-cpu.h"
 #include "host-cpu.h"
 #include "qapi/error.h"
 #include "qapi/error.h"
+#include "qemu/error-report.h"
 #include "sysemu/sysemu.h"
 #include "sysemu/sysemu.h"
 
 
 /* Note: Only safe for use on x86(-64) hosts */
 /* Note: Only safe for use on x86(-64) hosts */

+ 1 - 0
target/i386/kvm/xen-emu.c

@@ -12,6 +12,7 @@
 #include "qemu/osdep.h"
 #include "qemu/osdep.h"
 #include "qemu/log.h"
 #include "qemu/log.h"
 #include "qemu/main-loop.h"
 #include "qemu/main-loop.h"
+#include "qemu/error-report.h"
 #include "hw/xen/xen.h"
 #include "hw/xen/xen.h"
 #include "sysemu/kvm_int.h"
 #include "sysemu/kvm_int.h"
 #include "sysemu/kvm_xen.h"
 #include "sysemu/kvm_xen.h"

+ 1 - 0
target/i386/sev.c

@@ -23,6 +23,7 @@
 #include "qemu/base64.h"
 #include "qemu/base64.h"
 #include "qemu/module.h"
 #include "qemu/module.h"
 #include "qemu/uuid.h"
 #include "qemu/uuid.h"
+#include "qemu/error-report.h"
 #include "crypto/hash.h"
 #include "crypto/hash.h"
 #include "sysemu/kvm.h"
 #include "sysemu/kvm.h"
 #include "sev.h"
 #include "sev.h"

+ 1 - 0
target/i386/whpx/whpx-apic.c

@@ -11,6 +11,7 @@
  * See the COPYING file in the top-level directory.
  * See the COPYING file in the top-level directory.
  */
  */
 #include "qemu/osdep.h"
 #include "qemu/osdep.h"
+#include "qemu/error-report.h"
 #include "cpu.h"
 #include "cpu.h"
 #include "hw/i386/apic_internal.h"
 #include "hw/i386/apic_internal.h"
 #include "hw/i386/apic-msidef.h"
 #include "hw/i386/apic-msidef.h"

+ 1 - 0
target/mips/cpu.c

@@ -21,6 +21,7 @@
 #include "qemu/osdep.h"
 #include "qemu/osdep.h"
 #include "qemu/cutils.h"
 #include "qemu/cutils.h"
 #include "qemu/qemu-print.h"
 #include "qemu/qemu-print.h"
+#include "qemu/error-report.h"
 #include "qapi/error.h"
 #include "qapi/error.h"
 #include "cpu.h"
 #include "cpu.h"
 #include "internal.h"
 #include "internal.h"

+ 1 - 0
target/s390x/cpu-sysemu.c

@@ -21,6 +21,7 @@
  */
  */
 
 
 #include "qemu/osdep.h"
 #include "qemu/osdep.h"
+#include "qemu/error-report.h"
 #include "qapi/error.h"
 #include "qapi/error.h"
 #include "cpu.h"
 #include "cpu.h"
 #include "s390x-internal.h"
 #include "s390x-internal.h"

+ 1 - 0
target/s390x/cpu_models.c

@@ -17,6 +17,7 @@
 #include "sysemu/kvm.h"
 #include "sysemu/kvm.h"
 #include "sysemu/tcg.h"
 #include "sysemu/tcg.h"
 #include "qapi/error.h"
 #include "qapi/error.h"
+#include "qemu/error-report.h"
 #include "qapi/visitor.h"
 #include "qapi/visitor.h"
 #include "qemu/module.h"
 #include "qemu/module.h"
 #include "qemu/hw-version.h"
 #include "qemu/hw-version.h"

+ 2 - 0
target/s390x/diag.c

@@ -22,6 +22,8 @@
 #include "hw/s390x/pv.h"
 #include "hw/s390x/pv.h"
 #include "sysemu/kvm.h"
 #include "sysemu/kvm.h"
 #include "kvm/kvm_s390x.h"
 #include "kvm/kvm_s390x.h"
+#include "qemu/error-report.h"
+
 
 
 int handle_diag_288(CPUS390XState *env, uint64_t r1, uint64_t r3)
 int handle_diag_288(CPUS390XState *env, uint64_t r1, uint64_t r3)
 {
 {

+ 0 - 1
tcg/tcg-op.c

@@ -2808,7 +2808,6 @@ void tcg_gen_exit_tb(const TranslationBlock *tb, unsigned idx)
         tcg_debug_assert(idx == TB_EXIT_REQUESTED);
         tcg_debug_assert(idx == TB_EXIT_REQUESTED);
     }
     }
 
 
-    plugin_gen_disable_mem_helpers();
     tcg_gen_op1i(INDEX_op_exit_tb, val);
     tcg_gen_op1i(INDEX_op_exit_tb, val);
 }
 }
 
 

+ 10 - 0
tests/avocado/avocado_qemu/__init__.py

@@ -309,6 +309,16 @@ def require_netdev(self, netdevname):
         if netdevhelp.find('\n' + netdevname + '\n') < 0:
         if netdevhelp.find('\n' + netdevname + '\n') < 0:
             self.cancel('no support for user networking')
             self.cancel('no support for user networking')
 
 
+    def require_multiprocess(self):
+        """
+        Test for the presence of the x-pci-proxy-dev which is required
+        to support multiprocess.
+        """
+        devhelp = run_cmd([self.qemu_bin,
+                           '-M', 'none', '-device', 'help'])[0];
+        if devhelp.find('x-pci-proxy-dev') < 0:
+            self.cancel('no support for multiprocess device emulation')
+
     def _new_vm(self, name, *args):
     def _new_vm(self, name, *args):
         self._sd = tempfile.TemporaryDirectory(prefix="qemu_")
         self._sd = tempfile.TemporaryDirectory(prefix="qemu_")
         vm = QEMUMachine(self.qemu_bin, base_temp_dir=self.workdir,
         vm = QEMUMachine(self.qemu_bin, base_temp_dir=self.workdir,

+ 0 - 38
tests/avocado/igb.py

@@ -1,38 +0,0 @@
-# SPDX-License-Identifier: GPL-2.0-or-later
-# ethtool tests for igb registers, interrupts, etc
-
-from avocado_qemu import LinuxTest
-
-class IGB(LinuxTest):
-    """
-    :avocado: tags=accel:kvm
-    :avocado: tags=arch:x86_64
-    :avocado: tags=distro:fedora
-    :avocado: tags=distro_version:31
-    :avocado: tags=machine:q35
-    """
-
-    timeout = 180
-
-    def test(self):
-        self.require_accelerator('kvm')
-        kernel_url = self.distro.pxeboot_url + 'vmlinuz'
-        kernel_hash = '5b6f6876e1b5bda314f93893271da0d5777b1f3c'
-        kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash)
-        initrd_url = self.distro.pxeboot_url + 'initrd.img'
-        initrd_hash = 'dd0340a1b39bd28f88532babd4581c67649ec5b1'
-        initrd_path = self.fetch_asset(initrd_url, asset_hash=initrd_hash)
-
-        # Ideally we want to test MSI as well, but it is blocked by a bug
-        # fixed with:
-        # https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=28e96556baca7056d11d9fb3cdd0aba4483e00d8
-        kernel_params = self.distro.default_kernel_params + ' pci=nomsi'
-
-        self.vm.add_args('-kernel', kernel_path,
-                         '-initrd', initrd_path,
-                         '-append', kernel_params,
-                         '-accel', 'kvm',
-                         '-device', 'igb')
-        self.launch_and_wait()
-        self.ssh_command('dnf -y install ethtool')
-        self.ssh_command('ethtool -t eth1 offline')

+ 4 - 4
tests/avocado/machine_aarch64_virt.py

@@ -38,11 +38,11 @@ def test_alpine_virt_tcg_gic_max(self):
         :avocado: tags=accel:tcg
         :avocado: tags=accel:tcg
         """
         """
         iso_url = ('https://dl-cdn.alpinelinux.org/'
         iso_url = ('https://dl-cdn.alpinelinux.org/'
-                   'alpine/v3.16/releases/aarch64/'
-                   'alpine-virt-3.16.3-aarch64.iso')
+                   'alpine/v3.17/releases/aarch64/'
+                   'alpine-standard-3.17.2-aarch64.iso')
 
 
         # Alpine use sha256 so I recalculated this myself
         # Alpine use sha256 so I recalculated this myself
-        iso_sha1 = '0683bc089486d55c91bf6607d5ecb93925769bc0'
+        iso_sha1 = '76284fcd7b41fe899b0c2375ceb8470803eea839'
         iso_path = self.fetch_asset(iso_url, asset_hash=iso_sha1)
         iso_path = self.fetch_asset(iso_url, asset_hash=iso_sha1)
 
 
         self.vm.set_console()
         self.vm.set_console()
@@ -65,7 +65,7 @@ def test_alpine_virt_tcg_gic_max(self):
         self.vm.add_args('-object', 'rng-random,id=rng0,filename=/dev/urandom')
         self.vm.add_args('-object', 'rng-random,id=rng0,filename=/dev/urandom')
 
 
         self.vm.launch()
         self.vm.launch()
-        self.wait_for_console_pattern('Welcome to Alpine Linux 3.16')
+        self.wait_for_console_pattern('Welcome to Alpine Linux 3.17')
 
 
 
 
     def common_aarch64_virt(self, machine):
     def common_aarch64_virt(self, machine):

+ 1 - 0
tests/avocado/multiprocess.py

@@ -22,6 +22,7 @@ def do_test(self, kernel_url, initrd_url, kernel_command_line,
                 machine_type):
                 machine_type):
         """Main test method"""
         """Main test method"""
         self.require_accelerator('kvm')
         self.require_accelerator('kvm')
+        self.require_multiprocess()
 
 
         # Create socketpair to connect proxy and remote processes
         # Create socketpair to connect proxy and remote processes
         proxy_sock, remote_sock = socket.socketpair(socket.AF_UNIX,
         proxy_sock, remote_sock = socket.socketpair(socket.AF_UNIX,

+ 116 - 0
tests/avocado/netdev-ethtool.py

@@ -0,0 +1,116 @@
+# ethtool tests for emulated network devices
+#
+# This test leverages ethtool's --test sequence to validate network
+# device behaviour.
+#
+# SPDX-License-Identifier: GPL-2.0-or-late
+
+from avocado import skip
+from avocado_qemu import QemuSystemTest
+from avocado_qemu import exec_command, exec_command_and_wait_for_pattern
+from avocado_qemu import wait_for_console_pattern
+
+class NetDevEthtool(QemuSystemTest):
+    """
+    :avocado: tags=arch:x86_64
+    :avocado: tags=machine:q35
+    """
+
+    # Runs in about 17s under KVM, 19s under TCG, 25s under GCOV
+    timeout = 45
+
+    # Fetch assets from the netdev-ethtool subdir of my shared test
+    # images directory on fileserver.linaro.org.
+    def get_asset(self, name, sha1):
+        base_url = ('https://fileserver.linaro.org/s/'
+                    'kE4nCFLdQcoBF9t/download?'
+                    'path=%2Fnetdev-ethtool&files=' )
+        url = base_url + name
+        # use explicit name rather than failing to neatly parse the
+        # URL into a unique one
+        return self.fetch_asset(name=name, locations=(url), asset_hash=sha1)
+
+    def common_test_code(self, netdev, extra_args=None, kvm=False):
+
+        # This custom kernel has drivers for all the supported network
+        # devices we can emulate in QEMU
+        kernel = self.get_asset("bzImage",
+                                "33469d7802732d5815226166581442395cb289e2")
+
+        rootfs = self.get_asset("rootfs.squashfs",
+                                "9793cea7021414ae844bda51f558bd6565b50cdc")
+
+        append = 'printk.time=0 console=ttyS0 '
+        append += 'root=/dev/sr0 rootfstype=squashfs '
+
+        # any additional kernel tweaks for the test
+        if extra_args:
+            append += extra_args
+
+        # finally invoke ethtool directly
+        append += ' init=/usr/sbin/ethtool -- -t eth1 offline'
+
+        # add the rootfs via a readonly cdrom image
+        drive = f"file={rootfs},if=ide,index=0,media=cdrom"
+
+        self.vm.add_args('-kernel', kernel,
+                         '-append', append,
+                         '-drive', drive,
+                         '-device', netdev)
+
+        if kvm:
+            self.vm.add_args('-accel', 'kvm')
+
+        self.vm.set_console(console_index=0)
+        self.vm.launch()
+
+        wait_for_console_pattern(self,
+                                 "The test result is PASS",
+                                 "The test result is FAIL",
+                                 vm=None)
+        # no need to gracefully shutdown, just finish
+        self.vm.kill()
+
+    # Skip testing for MSI for now. Allegedly it was fixed by:
+    #   28e96556ba (igb: Allocate MSI-X vector when testing)
+    # but I'm seeing oops in the kernel
+    @skip("Kernel bug with MSI enabled")
+    def test_igb(self):
+        """
+        :avocado: tags=device:igb
+        """
+        self.common_test_code("igb")
+
+    def test_igb_nomsi(self):
+        """
+        :avocado: tags=device:igb
+        """
+        self.common_test_code("igb", "pci=nomsi")
+
+    def test_igb_nomsi_kvm(self):
+        """
+        :avocado: tags=device:igb
+        """
+        self.require_accelerator('kvm')
+        self.common_test_code("igb", "pci=nomsi", True)
+
+    # It seems the other popular cards we model in QEMU currently fail
+    # the pattern test with:
+    #
+    #   pattern test failed (reg 0x00178): got 0x00000000 expected 0x00005A5A
+    #
+    # So for now we skip them.
+
+    @skip("Incomplete reg 0x00178 support")
+    def test_e1000(self):
+        """
+        :avocado: tags=device:e1000
+        """
+        self.common_test_code("e1000")
+
+    @skip("Incomplete reg 0x00178 support")
+    def test_i82550(self):
+        """
+        :avocado: tags=device:i82550
+        """
+        self.common_test_code("i82550")

+ 24 - 36
tests/avocado/tuxrun_baselines.py

@@ -67,9 +67,6 @@ def setUp(self):
         # The name of the kernel Image file
         # The name of the kernel Image file
         self.image = self.get_tag('image', "Image")
         self.image = self.get_tag('image', "Image")
 
 
-        # The block device drive type
-        self.drive = self.get_tag('drive', "virtio-blk-device")
-
         self.root = self.get_tag('root', "vda")
         self.root = self.get_tag('root', "vda")
 
 
         # Occasionally we need extra devices to hook things up
         # Occasionally we need extra devices to hook things up
@@ -99,7 +96,7 @@ def fetch_tuxrun_assets(self, dt=None):
 
 
         return (kernel_image, self.workdir + "/rootfs.ext4", dtb)
         return (kernel_image, self.workdir + "/rootfs.ext4", dtb)
 
 
-    def prepare_run(self, kernel, disk, dtb=None, console_index=0):
+    def prepare_run(self, kernel, disk, drive, dtb=None, console_index=0):
         """
         """
         Setup to run and add the common parameters to the system
         Setup to run and add the common parameters to the system
         """
         """
@@ -121,10 +118,8 @@ def prepare_run(self, kernel, disk, dtb=None, console_index=0):
         if self.extradev:
         if self.extradev:
             self.vm.add_args('-device', self.extradev)
             self.vm.add_args('-device', self.extradev)
 
 
-        # Some machines already define a drive device
-        if self.drive != "none":
-            self.vm.add_args('-device',
-                             f"{self.drive},drive=hd0")
+        self.vm.add_args('-device',
+                         f"{drive},drive=hd0")
 
 
         # Some machines need an explicit DTB
         # Some machines need an explicit DTB
         if dtb:
         if dtb:
@@ -154,7 +149,9 @@ def run_tuxtest_tests(self, haltmsg):
         else:
         else:
             self.vm.wait()
             self.vm.wait()
 
 
-    def common_tuxrun(self, dt=None, haltmsg="reboot: System halted",
+    def common_tuxrun(self, dt=None,
+                      drive="virtio-blk-device",
+                      haltmsg="reboot: System halted",
                       console_index=0):
                       console_index=0):
         """
         """
         Common path for LKFT tests. Unless we need to do something
         Common path for LKFT tests. Unless we need to do something
@@ -163,7 +160,7 @@ def common_tuxrun(self, dt=None, haltmsg="reboot: System halted",
         """
         """
         (kernel, disk, dtb) = self.fetch_tuxrun_assets(dt)
         (kernel, disk, dtb) = self.fetch_tuxrun_assets(dt)
 
 
-        self.prepare_run(kernel, disk, dtb, console_index)
+        self.prepare_run(kernel, disk, drive, dtb, console_index)
         self.vm.launch()
         self.vm.launch()
         self.run_tuxtest_tests(haltmsg)
         self.run_tuxtest_tests(haltmsg)
 
 
@@ -206,11 +203,11 @@ def test_armv5(self):
         :avocado: tags=machine:versatilepb
         :avocado: tags=machine:versatilepb
         :avocado: tags=tuxboot:armv5
         :avocado: tags=tuxboot:armv5
         :avocado: tags=image:zImage
         :avocado: tags=image:zImage
-        :avocado: tags=drive:virtio-blk-pci
         :avocado: tags=console:ttyAMA0
         :avocado: tags=console:ttyAMA0
         :avocado: tags=shutdown:nowait
         :avocado: tags=shutdown:nowait
         """
         """
-        self.common_tuxrun(dt="versatile-pb.dtb")
+        self.common_tuxrun(drive="virtio-blk-pci",
+                           dt="versatile-pb.dtb")
 
 
     def test_armv7(self):
     def test_armv7(self):
         """
         """
@@ -244,10 +241,9 @@ def test_i386(self):
         :avocado: tags=machine:q35
         :avocado: tags=machine:q35
         :avocado: tags=tuxboot:i386
         :avocado: tags=tuxboot:i386
         :avocado: tags=image:bzImage
         :avocado: tags=image:bzImage
-        :avocado: tags=drive:virtio-blk-pci
         :avocado: tags=shutdown:nowait
         :avocado: tags=shutdown:nowait
         """
         """
-        self.common_tuxrun()
+        self.common_tuxrun(drive="virtio-blk-pci")
 
 
     def test_mips32(self):
     def test_mips32(self):
         """
         """
@@ -257,11 +253,10 @@ def test_mips32(self):
         :avocado: tags=endian:big
         :avocado: tags=endian:big
         :avocado: tags=tuxboot:mips32
         :avocado: tags=tuxboot:mips32
         :avocado: tags=image:vmlinux
         :avocado: tags=image:vmlinux
-        :avocado: tags=drive:driver=ide-hd,bus=ide.0,unit=0
         :avocado: tags=root:sda
         :avocado: tags=root:sda
         :avocado: tags=shutdown:nowait
         :avocado: tags=shutdown:nowait
         """
         """
-        self.common_tuxrun()
+        self.common_tuxrun(drive="driver=ide-hd,bus=ide.0,unit=0")
 
 
     def test_mips32el(self):
     def test_mips32el(self):
         """
         """
@@ -270,11 +265,10 @@ def test_mips32el(self):
         :avocado: tags=cpu:mips32r6-generic
         :avocado: tags=cpu:mips32r6-generic
         :avocado: tags=tuxboot:mips32el
         :avocado: tags=tuxboot:mips32el
         :avocado: tags=image:vmlinux
         :avocado: tags=image:vmlinux
-        :avocado: tags=drive:driver=ide-hd,bus=ide.0,unit=0
         :avocado: tags=root:sda
         :avocado: tags=root:sda
         :avocado: tags=shutdown:nowait
         :avocado: tags=shutdown:nowait
         """
         """
-        self.common_tuxrun()
+        self.common_tuxrun(drive="driver=ide-hd,bus=ide.0,unit=0")
 
 
     @skip("QEMU currently broken") # regression against stable QEMU
     @skip("QEMU currently broken") # regression against stable QEMU
     def test_mips64(self):
     def test_mips64(self):
@@ -284,11 +278,10 @@ def test_mips64(self):
         :avocado: tags=tuxboot:mips64
         :avocado: tags=tuxboot:mips64
         :avocado: tags=endian:big
         :avocado: tags=endian:big
         :avocado: tags=image:vmlinux
         :avocado: tags=image:vmlinux
-        :avocado: tags=drive:driver=ide-hd,bus=ide.0,unit=0
         :avocado: tags=root:sda
         :avocado: tags=root:sda
         :avocado: tags=shutdown:nowait
         :avocado: tags=shutdown:nowait
         """
         """
-        self.common_tuxrun()
+        self.common_tuxrun(drive="driver=ide-hd,bus=ide.0,unit=0")
 
 
     def test_mips64el(self):
     def test_mips64el(self):
         """
         """
@@ -296,11 +289,10 @@ def test_mips64el(self):
         :avocado: tags=machine:malta
         :avocado: tags=machine:malta
         :avocado: tags=tuxboot:mips64el
         :avocado: tags=tuxboot:mips64el
         :avocado: tags=image:vmlinux
         :avocado: tags=image:vmlinux
-        :avocado: tags=drive:driver=ide-hd,bus=ide.0,unit=0
         :avocado: tags=root:sda
         :avocado: tags=root:sda
         :avocado: tags=shutdown:nowait
         :avocado: tags=shutdown:nowait
         """
         """
-        self.common_tuxrun()
+        self.common_tuxrun(drive="driver=ide-hd,bus=ide.0,unit=0")
 
 
     def test_ppc32(self):
     def test_ppc32(self):
         """
         """
@@ -309,10 +301,9 @@ def test_ppc32(self):
         :avocado: tags=cpu:e500mc
         :avocado: tags=cpu:e500mc
         :avocado: tags=tuxboot:ppc32
         :avocado: tags=tuxboot:ppc32
         :avocado: tags=image:uImage
         :avocado: tags=image:uImage
-        :avocado: tags=drive:virtio-blk-pci
         :avocado: tags=shutdown:nowait
         :avocado: tags=shutdown:nowait
         """
         """
-        self.common_tuxrun()
+        self.common_tuxrun(drive="virtio-blk-pci")
 
 
     def test_ppc64(self):
     def test_ppc64(self):
         """
         """
@@ -324,10 +315,9 @@ def test_ppc64(self):
         :avocado: tags=tuxboot:ppc64
         :avocado: tags=tuxboot:ppc64
         :avocado: tags=image:vmlinux
         :avocado: tags=image:vmlinux
         :avocado: tags=extradev:driver=spapr-vscsi
         :avocado: tags=extradev:driver=spapr-vscsi
-        :avocado: tags=drive:scsi-hd
         :avocado: tags=root:sda
         :avocado: tags=root:sda
         """
         """
-        self.common_tuxrun()
+        self.common_tuxrun(drive="scsi-hd")
 
 
     def test_ppc64le(self):
     def test_ppc64le(self):
         """
         """
@@ -338,10 +328,9 @@ def test_ppc64le(self):
         :avocado: tags=tuxboot:ppc64le
         :avocado: tags=tuxboot:ppc64le
         :avocado: tags=image:vmlinux
         :avocado: tags=image:vmlinux
         :avocado: tags=extradev:driver=spapr-vscsi
         :avocado: tags=extradev:driver=spapr-vscsi
-        :avocado: tags=drive:scsi-hd
         :avocado: tags=root:sda
         :avocado: tags=root:sda
         """
         """
-        self.common_tuxrun()
+        self.common_tuxrun(drive="scsi-hd")
 
 
     def test_riscv32(self):
     def test_riscv32(self):
         """
         """
@@ -365,10 +354,10 @@ def test_s390(self):
         :avocado: tags=endian:big
         :avocado: tags=endian:big
         :avocado: tags=tuxboot:s390
         :avocado: tags=tuxboot:s390
         :avocado: tags=image:bzImage
         :avocado: tags=image:bzImage
-        :avocado: tags=drive:virtio-blk-ccw
         :avocado: tags=shutdown:nowait
         :avocado: tags=shutdown:nowait
         """
         """
-        self.common_tuxrun(haltmsg="Requesting system halt")
+        self.common_tuxrun(drive="virtio-blk-ccw",
+                           haltmsg="Requesting system halt")
 
 
     # Note: some segfaults caused by unaligned userspace access
     # Note: some segfaults caused by unaligned userspace access
     @skipIf(os.getenv('GITLAB_CI'), 'Skipping unstable test on GitLab')
     @skipIf(os.getenv('GITLAB_CI'), 'Skipping unstable test on GitLab')
@@ -380,7 +369,6 @@ def test_sh4(self):
         :avocado: tags=tuxboot:sh4
         :avocado: tags=tuxboot:sh4
         :avocado: tags=image:zImage
         :avocado: tags=image:zImage
         :avocado: tags=root:sda
         :avocado: tags=root:sda
-        :avocado: tags=drive:driver=ide-hd,bus=ide.0,unit=0
         :avocado: tags=console:ttySC1
         :avocado: tags=console:ttySC1
         """
         """
         # The test is currently too unstable to do much in userspace
         # The test is currently too unstable to do much in userspace
@@ -388,7 +376,9 @@ def test_sh4(self):
         (kernel, disk, dtb) = self.fetch_tuxrun_assets()
         (kernel, disk, dtb) = self.fetch_tuxrun_assets()
 
 
         # the console comes on the second serial port
         # the console comes on the second serial port
-        self.prepare_run(kernel, disk, console_index=1)
+        self.prepare_run(kernel, disk,
+                         "driver=ide-hd,bus=ide.0,unit=0",
+                         console_index=1)
         self.vm.launch()
         self.vm.launch()
 
 
         self.wait_for_console_pattern("Welcome to TuxTest")
         self.wait_for_console_pattern("Welcome to TuxTest")
@@ -404,10 +394,9 @@ def test_sparc64(self):
         :avocado: tags=tuxboot:sparc64
         :avocado: tags=tuxboot:sparc64
         :avocado: tags=image:vmlinux
         :avocado: tags=image:vmlinux
         :avocado: tags=root:sda
         :avocado: tags=root:sda
-        :avocado: tags=drive:driver=ide-hd,bus=ide.0,unit=0
         :avocado: tags=shutdown:nowait
         :avocado: tags=shutdown:nowait
         """
         """
-        self.common_tuxrun()
+        self.common_tuxrun(drive="driver=ide-hd,bus=ide.0,unit=0")
 
 
     def test_x86_64(self):
     def test_x86_64(self):
         """
         """
@@ -417,7 +406,6 @@ def test_x86_64(self):
         :avocado: tags=tuxboot:x86_64
         :avocado: tags=tuxboot:x86_64
         :avocado: tags=image:bzImage
         :avocado: tags=image:bzImage
         :avocado: tags=root:sda
         :avocado: tags=root:sda
-        :avocado: tags=drive:driver=ide-hd,bus=ide.0,unit=0
         :avocado: tags=shutdown:nowait
         :avocado: tags=shutdown:nowait
         """
         """
-        self.common_tuxrun()
+        self.common_tuxrun(drive="driver=ide-hd,bus=ide.0,unit=0")

+ 0 - 43
tests/check-block.sh

@@ -1,43 +0,0 @@
-#!/bin/sh
-
-if [ "$#" -eq 0 ]; then
-    echo "Usage: $0 fmt..." >&2
-    exit 99
-fi
-
-# Honor the SPEED environment variable, just like we do it for "meson test"
-format_list="$@"
-if [ "$SPEED" = "slow" ] || [ "$SPEED" = "thorough" ]; then
-    group=
-else
-    group="-g auto"
-fi
-
-skip() {
-    echo "1..0 #SKIP $*"
-    exit 0
-}
-
-if [ -z "$(find . -name 'qemu-system-*' -print)" ]; then
-    skip "No qemu-system binary available ==> Not running the qemu-iotests."
-fi
-
-cd tests/qemu-iotests
-
-# QEMU_CHECK_BLOCK_AUTO is used to disable some unstable sub-tests
-export QEMU_CHECK_BLOCK_AUTO=1
-export PYTHONUTF8=1
-# If make was called with -jN we want to call ./check with -j N. Extract the
-# flag from MAKEFLAGS, so that if it absent (or MAKEFLAGS is not defined), JOBS
-# would be an empty line otherwise JOBS is prepared string of flag with value:
-# "-j N"
-# Note, that the following works even if make was called with "-j N" or even
-# "--jobs N", as all these variants becomes simply "-jN" in MAKEFLAGS variable.
-JOBS=$(echo "$MAKEFLAGS" | sed -n 's/\(^\|.* \)-j\([0-9]\+\)\( .*\|$\)/-j \2/p')
-
-ret=0
-for fmt in $format_list ; do
-    ${PYTHON} ./check $JOBS -tap -$fmt $group || ret=1
-done
-
-exit $ret

+ 1 - 1
tests/docker/Makefile.include

@@ -39,7 +39,7 @@ docker-qemu-src: $(DOCKER_SRC_COPY)
 # General rule for building docker images.
 # General rule for building docker images.
 docker-image-%: $(DOCKER_FILES_DIR)/%.docker
 docker-image-%: $(DOCKER_FILES_DIR)/%.docker
 	  $(call quiet-command,			\
 	  $(call quiet-command,			\
-		$(RUNC) build				\
+		DOCKER_BUILDKIT=1 $(RUNC) build		\
 		$(if $V,,--quiet)			\
 		$(if $V,,--quiet)			\
 		$(if $(NOCACHE),--no-cache,		\
 		$(if $(NOCACHE),--no-cache,		\
 			$(if $(DOCKER_REGISTRY),--cache-from $(DOCKER_REGISTRY)/qemu/$*)) \
 			$(if $(DOCKER_REGISTRY),--cache-from $(DOCKER_REGISTRY)/qemu/$*)) \

+ 26 - 4
tests/qemu-iotests/check

@@ -26,9 +26,23 @@ from findtests import TestFinder
 from testenv import TestEnv
 from testenv import TestEnv
 from testrunner import TestRunner
 from testrunner import TestRunner
 
 
+def get_default_path(follow_link=False):
+    """
+    Try to automagically figure out the path we are running from.
+    """
+    # called from the build tree?
+    if os.path.islink(sys.argv[0]):
+        if follow_link:
+            return os.path.dirname(os.readlink(sys.argv[0]))
+        else:
+            return os.path.dirname(os.path.abspath(sys.argv[0]))
+    else:  # or source tree?
+        return os.getcwd()
 
 
 def make_argparser() -> argparse.ArgumentParser:
 def make_argparser() -> argparse.ArgumentParser:
-    p = argparse.ArgumentParser(description="Test run options")
+    p = argparse.ArgumentParser(
+        description="Test run options",
+        formatter_class=argparse.ArgumentDefaultsHelpFormatter)
 
 
     p.add_argument('-n', '--dry-run', action='store_true',
     p.add_argument('-n', '--dry-run', action='store_true',
                    help='show me, do not run tests')
                    help='show me, do not run tests')
@@ -113,6 +127,11 @@ def make_argparser() -> argparse.ArgumentParser:
                        'middle of the process.')
                        'middle of the process.')
     g_sel.add_argument('tests', metavar='TEST_FILES', nargs='*',
     g_sel.add_argument('tests', metavar='TEST_FILES', nargs='*',
                        help='tests to run, or "--" followed by a command')
                        help='tests to run, or "--" followed by a command')
+    g_sel.add_argument('--build-dir', default=get_default_path(),
+                       help='Path to iotests build directory')
+    g_sel.add_argument('--source-dir',
+                       default=get_default_path(follow_link=True),
+                       help='Path to iotests build directory')
 
 
     return p
     return p
 
 
@@ -120,11 +139,14 @@ def make_argparser() -> argparse.ArgumentParser:
 if __name__ == '__main__':
 if __name__ == '__main__':
     args = make_argparser().parse_args()
     args = make_argparser().parse_args()
 
 
-    env = TestEnv(imgfmt=args.imgfmt, imgproto=args.imgproto,
+    env = TestEnv(source_dir=args.source_dir,
+                  build_dir=args.build_dir,
+                  imgfmt=args.imgfmt, imgproto=args.imgproto,
                   aiomode=args.aiomode, cachemode=args.cachemode,
                   aiomode=args.aiomode, cachemode=args.cachemode,
                   imgopts=args.imgopts, misalign=args.misalign,
                   imgopts=args.imgopts, misalign=args.misalign,
                   debug=args.debug, valgrind=args.valgrind,
                   debug=args.debug, valgrind=args.valgrind,
-                  gdb=args.gdb, qprint=args.print)
+                  gdb=args.gdb, qprint=args.print,
+                  dry_run=args.dry_run)
 
 
     if len(sys.argv) > 1 and sys.argv[-len(args.tests)-1] == '--':
     if len(sys.argv) > 1 and sys.argv[-len(args.tests)-1] == '--':
         if not args.tests:
         if not args.tests:
@@ -162,7 +184,7 @@ if __name__ == '__main__':
         sys.exit(str(e))
         sys.exit(str(e))
 
 
     if args.dry_run:
     if args.dry_run:
-        print('\n'.join(tests))
+        print('\n'.join([os.path.basename(t) for t in tests]))
     else:
     else:
         with TestRunner(env, tap=args.tap,
         with TestRunner(env, tap=args.tap,
                         color=args.color) as tr:
                         color=args.color) as tr:

+ 29 - 6
tests/qemu-iotests/meson.build

@@ -32,16 +32,39 @@ foreach k, v : emulators
   endif
   endif
 endforeach
 endforeach
 
 
+qemu_iotests_check_cmd = files('check')
+
 foreach format, speed: qemu_iotests_formats
 foreach format, speed: qemu_iotests_formats
   if speed == 'quick'
   if speed == 'quick'
     suites = 'block'
     suites = 'block'
   else
   else
     suites = ['block-' + speed, speed]
     suites = ['block-' + speed, speed]
   endif
   endif
-  test('qemu-iotests ' + format, sh, args: [files('../check-block.sh'), format],
-       depends: qemu_iotests_binaries, env: qemu_iotests_env,
-       protocol: 'tap',
-       suite: suites,
-       timeout: 0,
-       is_parallel: false)
+
+  args = ['-tap', '-' + format]
+  if speed == 'quick'
+      args += ['-g', 'auto']
+  endif
+
+  rc = run_command(
+      [qemu_iotests_check_cmd] + args + ['-n'],
+      check: true,
+  )
+
+  foreach item: rc.stdout().strip().split()
+      args = ['-tap', '-' + format, item,
+              '--source-dir', meson.current_source_dir(),
+              '--build-dir', meson.current_build_dir()]
+      # Some individual tests take as long as 45 seconds
+      # Bump the timeout to 3 minutes for some headroom
+      # on slow machines to minimize spurious failures
+      test('io-' + format + '-' + item,
+           qemu_iotests_check_cmd,
+           args: args,
+           depends: qemu_iotests_binaries,
+           env: qemu_iotests_env,
+           protocol: 'tap',
+           timeout: 180,
+           suite: suites)
+  endforeach
 endforeach
 endforeach

+ 10 - 10
tests/qemu-iotests/testenv.py

@@ -170,14 +170,16 @@ def root(*names: str) -> str:
             if not isxfile(b):
             if not isxfile(b):
                 sys.exit('Not executable: ' + b)
                 sys.exit('Not executable: ' + b)
 
 
-    def __init__(self, imgfmt: str, imgproto: str, aiomode: str,
+    def __init__(self, source_dir: str, build_dir: str,
+                 imgfmt: str, imgproto: str, aiomode: str,
                  cachemode: Optional[str] = None,
                  cachemode: Optional[str] = None,
                  imgopts: Optional[str] = None,
                  imgopts: Optional[str] = None,
                  misalign: bool = False,
                  misalign: bool = False,
                  debug: bool = False,
                  debug: bool = False,
                  valgrind: bool = False,
                  valgrind: bool = False,
                  gdb: bool = False,
                  gdb: bool = False,
-                 qprint: bool = False) -> None:
+                 qprint: bool = False,
+                 dry_run: bool = False) -> None:
         self.imgfmt = imgfmt
         self.imgfmt = imgfmt
         self.imgproto = imgproto
         self.imgproto = imgproto
         self.aiomode = aiomode
         self.aiomode = aiomode
@@ -211,18 +213,16 @@ def __init__(self, imgfmt: str, imgproto: str, aiomode: str,
         # which are needed to initialize some environment variables. They are
         # which are needed to initialize some environment variables. They are
         # used by init_*() functions as well.
         # used by init_*() functions as well.
 
 
-        if os.path.islink(sys.argv[0]):
-            # called from the build tree
-            self.source_iotests = os.path.dirname(os.readlink(sys.argv[0]))
-            self.build_iotests = os.path.dirname(os.path.abspath(sys.argv[0]))
-        else:
-            # called from the source tree
-            self.source_iotests = os.getcwd()
-            self.build_iotests = self.source_iotests
+        self.source_iotests = source_dir
+        self.build_iotests = build_dir
 
 
         self.build_root = os.path.join(self.build_iotests, '..', '..')
         self.build_root = os.path.join(self.build_iotests, '..', '..')
 
 
         self.init_directories()
         self.init_directories()
+
+        if dry_run:
+            return
+
         self.init_binaries()
         self.init_binaries()
 
 
         self.malloc_perturb_ = os.getenv('MALLOC_PERTURB_',
         self.malloc_perturb_ = os.getenv('MALLOC_PERTURB_',

+ 13 - 30
tests/qemu-iotests/testrunner.py

@@ -24,12 +24,10 @@
 import subprocess
 import subprocess
 import contextlib
 import contextlib
 import json
 import json
-import termios
 import shutil
 import shutil
 import sys
 import sys
 from multiprocessing import Pool
 from multiprocessing import Pool
-from contextlib import contextmanager
-from typing import List, Optional, Iterator, Any, Sequence, Dict, \
+from typing import List, Optional, Any, Sequence, Dict, \
         ContextManager
         ContextManager
 
 
 from testenv import TestEnv
 from testenv import TestEnv
@@ -56,22 +54,6 @@ def file_diff(file1: str, file2: str) -> List[str]:
         return res
         return res
 
 
 
 
-# We want to save current tty settings during test run,
-# since an aborting qemu call may leave things screwed up.
-@contextmanager
-def savetty() -> Iterator[None]:
-    isterm = sys.stdin.isatty()
-    if isterm:
-        fd = sys.stdin.fileno()
-        attr = termios.tcgetattr(fd)
-
-    try:
-        yield
-    finally:
-        if isterm:
-            termios.tcsetattr(fd, termios.TCSADRAIN, attr)
-
-
 class LastElapsedTime(ContextManager['LastElapsedTime']):
 class LastElapsedTime(ContextManager['LastElapsedTime']):
     """ Cache for elapsed time for tests, to show it during new test run
     """ Cache for elapsed time for tests, to show it during new test run
 
 
@@ -169,7 +151,6 @@ def __enter__(self) -> 'TestRunner':
         self._stack = contextlib.ExitStack()
         self._stack = contextlib.ExitStack()
         self._stack.enter_context(self.env)
         self._stack.enter_context(self.env)
         self._stack.enter_context(self.last_elapsed)
         self._stack.enter_context(self.last_elapsed)
-        self._stack.enter_context(savetty())
         return self
         return self
 
 
     def __exit__(self, exc_type: Any, exc_value: Any, traceback: Any) -> None:
     def __exit__(self, exc_type: Any, exc_value: Any, traceback: Any) -> None:
@@ -247,13 +228,11 @@ def find_reference(self, test: str) -> str:
 
 
         return f'{test}.out'
         return f'{test}.out'
 
 
-    def do_run_test(self, test: str, mp: bool) -> TestResult:
+    def do_run_test(self, test: str) -> TestResult:
         """
         """
         Run one test
         Run one test
 
 
         :param test: test file path
         :param test: test file path
-        :param mp: if true, we are in a multiprocessing environment, use
-                   personal subdirectories for test run
 
 
         Note: this method may be called from subprocess, so it does not
         Note: this method may be called from subprocess, so it does not
         change ``self`` object in any way!
         change ``self`` object in any way!
@@ -276,12 +255,14 @@ def do_run_test(self, test: str, mp: bool) -> TestResult:
 
 
         args = [str(f_test.resolve())]
         args = [str(f_test.resolve())]
         env = self.env.prepare_subprocess(args)
         env = self.env.prepare_subprocess(args)
-        if mp:
-            # Split test directories, so that tests running in parallel don't
-            # break each other.
-            for d in ['TEST_DIR', 'SOCK_DIR']:
-                env[d] = os.path.join(env[d], f_test.name)
-                Path(env[d]).mkdir(parents=True, exist_ok=True)
+
+        # Split test directories, so that tests running in parallel don't
+        # break each other.
+        for d in ['TEST_DIR', 'SOCK_DIR']:
+            env[d] = os.path.join(
+                env[d],
+                f"{self.env.imgfmt}-{self.env.imgproto}-{f_test.name}")
+            Path(env[d]).mkdir(parents=True, exist_ok=True)
 
 
         test_dir = env['TEST_DIR']
         test_dir = env['TEST_DIR']
         f_bad = Path(test_dir, f_test.name + '.out.bad')
         f_bad = Path(test_dir, f_test.name + '.out.bad')
@@ -294,6 +275,7 @@ def do_run_test(self, test: str, mp: bool) -> TestResult:
         t0 = time.time()
         t0 = time.time()
         with f_bad.open('w', encoding="utf-8") as f:
         with f_bad.open('w', encoding="utf-8") as f:
             with subprocess.Popen(args, cwd=str(f_test.parent), env=env,
             with subprocess.Popen(args, cwd=str(f_test.parent), env=env,
+                                  stdin=subprocess.DEVNULL,
                                   stdout=f, stderr=subprocess.STDOUT) as proc:
                                   stdout=f, stderr=subprocess.STDOUT) as proc:
                 try:
                 try:
                     proc.wait()
                     proc.wait()
@@ -365,7 +347,7 @@ def run_test(self, test: str,
             testname = os.path.basename(test)
             testname = os.path.basename(test)
             print(f'# running {self.env.imgfmt} {testname}')
             print(f'# running {self.env.imgfmt} {testname}')
 
 
-        res = self.do_run_test(test, mp)
+        res = self.do_run_test(test)
 
 
         end = datetime.datetime.now().strftime('%H:%M:%S')
         end = datetime.datetime.now().strftime('%H:%M:%S')
         self.test_print_one_line(test=test,
         self.test_print_one_line(test=test,
@@ -391,6 +373,7 @@ def run_tests(self, tests: List[str], jobs: int = 1) -> bool:
         casenotrun = []
         casenotrun = []
 
 
         if self.tap:
         if self.tap:
+            print('TAP version 13')
             self.env.print_env('# ')
             self.env.print_env('# ')
             print('1..%d' % len(tests))
             print('1..%d' % len(tests))
         else:
         else:

+ 7 - 3
tests/qtest/migration-test.c

@@ -2462,14 +2462,18 @@ static bool kvm_dirty_ring_supported(void)
 
 
 int main(int argc, char **argv)
 int main(int argc, char **argv)
 {
 {
-    const bool has_kvm = qtest_has_accel("kvm");
-    const bool has_uffd = ufd_version_check();
-    const char *arch = qtest_get_arch();
+    bool has_kvm;
+    bool has_uffd;
+    const char *arch;
     g_autoptr(GError) err = NULL;
     g_autoptr(GError) err = NULL;
     int ret;
     int ret;
 
 
     g_test_init(&argc, &argv, NULL);
     g_test_init(&argc, &argv, NULL);
 
 
+    has_kvm = qtest_has_accel("kvm");
+    has_uffd = ufd_version_check();
+    arch = qtest_get_arch();
+
     /*
     /*
      * On ppc64, the test only works with kvm-hv, but not with kvm-pr and TCG
      * On ppc64, the test only works with kvm-hv, but not with kvm-pr and TCG
      * is touchy due to race conditions on dirty bits (especially on PPC for
      * is touchy due to race conditions on dirty bits (especially on PPC for

+ 7 - 0
tests/tcg/Makefile.target

@@ -201,3 +201,10 @@ clean:
 
 
 distclean:
 distclean:
 	rm -f config-cc.mak config-target.mak ../config-$(TARGET).mak
 	rm -f config-cc.mak config-target.mak ../config-$(TARGET).mak
+
+.PHONY: help
+help:
+	@echo "TCG tests help $(TARGET_NAME)"
+	@echo "Built with $(CC)"
+	@echo "Available tests:"
+	@$(foreach t,$(RUN_TESTS),echo "  $t";)

+ 27 - 3
tests/vm/openbsd

@@ -106,8 +106,7 @@ class OpenBSDVM(basevm.BaseVM):
         self.console_wait("Password for root account")
         self.console_wait("Password for root account")
         self.console_send("%s\n" % self._config["root_pass"])
         self.console_send("%s\n" % self._config["root_pass"])
         self.console_wait_send("Start sshd(8)",           "yes\n")
         self.console_wait_send("Start sshd(8)",           "yes\n")
-        self.console_wait_send("X Window System",         "\n")
-        self.console_wait_send("xenodm",                  "\n")
+        self.console_wait_send("X Window System",         "no\n")
         self.console_wait_send("console to com0",         "\n")
         self.console_wait_send("console to com0",         "\n")
         self.console_wait_send("Which speed",             "\n")
         self.console_wait_send("Which speed",             "\n")
 
 
@@ -124,7 +123,32 @@ class OpenBSDVM(basevm.BaseVM):
         self.console_wait_send("timezone",                "UTC\n")
         self.console_wait_send("timezone",                "UTC\n")
         self.console_wait_send("root disk",               "\n")
         self.console_wait_send("root disk",               "\n")
         self.console_wait_send("(W)hole disk",            "\n")
         self.console_wait_send("(W)hole disk",            "\n")
-        self.console_wait_send("(A)uto layout",           "\n")
+        self.console_wait_send("(A)uto layout",           "c\n")
+
+        # 4000 MB / as /dev/sd0a, at start of disk
+        self.console_wait_send("sd0>", "a a\n")
+        self.console_wait_send("offset:", "\n")
+        self.console_wait_send("size:", "4000M\n")
+        self.console_wait_send("FS type", "4.2BSD\n")
+        self.console_wait_send("mount point:", "/\n")
+
+        # 256 MB swap as /dev/sd0b
+        self.console_wait_send("sd0*>", "a b\n")
+        self.console_wait_send("offset:", "\n")
+        self.console_wait_send("size:", "256M\n")
+        self.console_wait_send("FS type", "swap\n")
+
+        # All remaining space for /home as /dev/sd0d
+        # NB, 'c' isn't allowed to be used.
+        self.console_wait_send("sd0*>", "a d\n")
+        self.console_wait_send("offset:", "\n")
+        self.console_wait_send("size:", "\n")
+        self.console_wait_send("FS type", "4.2BSD\n")
+        self.console_wait_send("mount point:", "/home\n")
+
+        self.console_wait_send("sd0*>", "q\n")
+        self.console_wait_send("Write new label?:", "y\n")
+
         self.console_wait_send("Location of sets",        "cd0\n")
         self.console_wait_send("Location of sets",        "cd0\n")
         self.console_wait_send("Pathname to the sets",    "\n")
         self.console_wait_send("Pathname to the sets",    "\n")
         self.console_wait_send("Set name(s)",             "\n")
         self.console_wait_send("Set name(s)",             "\n")

+ 1 - 0
ui/cocoa.m

@@ -46,6 +46,7 @@
 #include "qemu/cutils.h"
 #include "qemu/cutils.h"
 #include "qemu/main-loop.h"
 #include "qemu/main-loop.h"
 #include "qemu/module.h"
 #include "qemu/module.h"
+#include "qemu/error-report.h"
 #include <Carbon/Carbon.h>
 #include <Carbon/Carbon.h>
 #include "hw/core/cpu.h"
 #include "hw/core/cpu.h"