diff options
Diffstat (limited to 'debian/patches/v7.2.12.diff')
-rw-r--r-- | debian/patches/v7.2.12.diff | 1516 |
1 files changed, 1516 insertions, 0 deletions
diff --git a/debian/patches/v7.2.12.diff b/debian/patches/v7.2.12.diff new file mode 100644 index 00000000..3327a3e5 --- /dev/null +++ b/debian/patches/v7.2.12.diff @@ -0,0 +1,1516 @@ +Subject: v7.2.12 +Date: Sun Jun 9 00:23:52 2024 +0300 +From: Michael Tokarev <mjt@tls.msk.ru> +Forwarded: not-needed + +This is a difference between upstream qemu v7.2.11 +and upstream qemu v7.2.12. + + +.gitlab-ci.d/cirrus.yml | 2 + + .gitlab-ci.d/edk2.yml | 85 ------------------- + .gitlab-ci.d/edk2/Dockerfile | 27 ------ + .gitlab-ci.d/opensbi.yml | 4 +- + .gitlab-ci.d/opensbi/Dockerfile | 1 + + .gitlab-ci.d/qemu-project.yml | 1 - + .gitlab-ci.d/windows.yml | 4 +- + MAINTAINERS | 2 - + VERSION | 2 +- + backends/cryptodev-builtin.c | 9 +- + disas/riscv.c | 65 ++++++++++++++- + hw/arm/npcm7xx.c | 3 +- + hw/dma/xlnx_dpdma.c | 20 ++--- + hw/intc/arm_gic.c | 4 +- + hw/intc/riscv_aplic.c | 6 +- + hw/remote/vfio-user-obj.c | 4 +- + linux-user/syscall.c | 9 +- + nbd/client.c | 28 ++++++- + nbd/common.c | 11 --- + nbd/nbd-internal.h | 10 --- + nbd/server.c | 130 ++++++++++++++++++----------- + target/arm/cpu64.c | 6 +- + target/arm/hvf/hvf.c | 160 ++++++++++++++++++------------------ + target/i386/kvm/hyperv.c | 2 +- + target/i386/tcg/decode-new.c.inc | 4 +- + target/i386/tcg/fpu_helper.c | 5 ++ + target/i386/tcg/translate.c | 31 +++---- + target/loongarch/cpu.c | 2 +- + tests/avocado/boot_linux_console.py | 40 ++++----- + tests/avocado/replay_kernel.py | 8 +- + ui/gtk-egl.c | 2 +- + ui/gtk-gl-area.c | 2 +- + ui/gtk.c | 28 +++++-- + ui/sdl2.c | 1 + + 34 files changed, 360 insertions(+), 358 deletions(-) + +diff --git a/.gitlab-ci.d/cirrus.yml b/.gitlab-ci.d/cirrus.yml +index c86487da5b..f6e97c47f1 100644 +--- a/.gitlab-ci.d/cirrus.yml ++++ b/.gitlab-ci.d/cirrus.yml +@@ -68,6 +68,7 @@ x64-freebsd-13-build: + CIRRUS_VM_RAM: 8G + UPDATE_COMMAND: pkg update + INSTALL_COMMAND: pkg install -y ++ CONFIGURE_ARGS: --target-list-exclude=arm-softmmu,i386-softmmu,microblaze-softmmu,mips64el-softmmu,mipsel-softmmu,mips-softmmu,ppc-softmmu,sh4eb-softmmu,xtensa-softmmu + TEST_TARGETS: check + + aarch64-macos-12-base-build: +@@ -83,6 +84,7 @@ aarch64-macos-12-base-build: + INSTALL_COMMAND: brew install + PATH_EXTRA: /opt/homebrew/ccache/libexec:/opt/homebrew/gettext/bin + PKG_CONFIG_PATH: /opt/homebrew/curl/lib/pkgconfig:/opt/homebrew/ncurses/lib/pkgconfig:/opt/homebrew/readline/lib/pkgconfig ++ CONFIGURE_ARGS: --target-list-exclude=arm-softmmu,i386-softmmu,microblazeel-softmmu,mips64-softmmu,mipsel-softmmu,mips-softmmu,ppc-softmmu,sh4-softmmu,xtensaeb-softmmu + TEST_TARGETS: check-unit check-block check-qapi-schema check-softfloat check-qtest-x86_64 + + +diff --git a/.gitlab-ci.d/edk2.yml b/.gitlab-ci.d/edk2.yml +deleted file mode 100644 +index 314e101745..0000000000 +--- a/.gitlab-ci.d/edk2.yml ++++ /dev/null +@@ -1,85 +0,0 @@ +-# All jobs needing docker-edk2 must use the same rules it uses. +-.edk2_job_rules: +- rules: +- # Forks don't get pipelines unless QEMU_CI=1 or QEMU_CI=2 is set +- - if: '$QEMU_CI != "1" && $QEMU_CI != "2" && $CI_PROJECT_NAMESPACE != "qemu-project"' +- when: never +- +- # In forks, if QEMU_CI=1 is set, then create manual job +- # if any of the files affecting the build are touched +- - if: '$QEMU_CI == "1" && $CI_PROJECT_NAMESPACE != "qemu-project"' +- changes: +- - .gitlab-ci.d/edk2.yml +- - .gitlab-ci.d/edk2/Dockerfile +- - roms/edk2/* +- when: manual +- +- # In forks, if QEMU_CI=1 is set, then create manual job +- # if the branch/tag starts with 'edk2' +- - if: '$QEMU_CI == "1" && $CI_PROJECT_NAMESPACE != "qemu-project" && $CI_COMMIT_REF_NAME =~ /^edk2/' +- when: manual +- +- # In forks, if QEMU_CI=1 is set, then create manual job +- # if last commit msg contains 'EDK2' (case insensitive) +- - if: '$QEMU_CI == "1" && $CI_PROJECT_NAMESPACE != "qemu-project" && $CI_COMMIT_MESSAGE =~ /edk2/i' +- when: manual +- +- # Run if any files affecting the build output are touched +- - changes: +- - .gitlab-ci.d/edk2.yml +- - .gitlab-ci.d/edk2/Dockerfile +- - roms/edk2/* +- when: on_success +- +- # Run if the branch/tag starts with 'edk2' +- - if: '$CI_COMMIT_REF_NAME =~ /^edk2/' +- when: on_success +- +- # Run if last commit msg contains 'EDK2' (case insensitive) +- - if: '$CI_COMMIT_MESSAGE =~ /edk2/i' +- when: on_success +- +-docker-edk2: +- extends: .edk2_job_rules +- stage: containers +- image: docker:19.03.1 +- services: +- - docker:19.03.1-dind +- variables: +- GIT_DEPTH: 3 +- IMAGE_TAG: $CI_REGISTRY_IMAGE:edk2-cross-build +- # We don't use TLS +- DOCKER_HOST: tcp://docker:2375 +- DOCKER_TLS_CERTDIR: "" +- before_script: +- - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY +- script: +- - docker pull $IMAGE_TAG || true +- - docker build --cache-from $IMAGE_TAG --tag $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA +- --tag $IMAGE_TAG .gitlab-ci.d/edk2 +- - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA +- - docker push $IMAGE_TAG +- +-build-edk2: +- extends: .edk2_job_rules +- stage: build +- needs: ['docker-edk2'] +- artifacts: +- paths: # 'artifacts.zip' will contains the following files: +- - pc-bios/edk2*bz2 +- - pc-bios/edk2-licenses.txt +- - edk2-stdout.log +- - edk2-stderr.log +- image: $CI_REGISTRY_IMAGE:edk2-cross-build +- variables: +- GIT_DEPTH: 3 +- script: # Clone the required submodules and build EDK2 +- - git submodule update --init roms/edk2 +- - git -C roms/edk2 submodule update --init -- +- ArmPkg/Library/ArmSoftFloatLib/berkeley-softfloat-3 +- BaseTools/Source/C/BrotliCompress/brotli +- CryptoPkg/Library/OpensslLib/openssl +- MdeModulePkg/Library/BrotliCustomDecompressLib/brotli +- - export JOBS=$(($(getconf _NPROCESSORS_ONLN) + 1)) +- - echo "=== Using ${JOBS} simultaneous jobs ===" +- - make -j${JOBS} -C roms efi 2>&1 1>edk2-stdout.log | tee -a edk2-stderr.log >&2 +diff --git a/.gitlab-ci.d/edk2/Dockerfile b/.gitlab-ci.d/edk2/Dockerfile +deleted file mode 100644 +index bbe50ff832..0000000000 +--- a/.gitlab-ci.d/edk2/Dockerfile ++++ /dev/null +@@ -1,27 +0,0 @@ +-# +-# Docker image to cross-compile EDK2 firmware binaries +-# +-FROM ubuntu:18.04 +- +-MAINTAINER Philippe Mathieu-Daudé <f4bug@amsat.org> +- +-# Install packages required to build EDK2 +-RUN apt update \ +- && \ +- \ +- DEBIAN_FRONTEND=noninteractive \ +- apt install --assume-yes --no-install-recommends \ +- build-essential \ +- ca-certificates \ +- dos2unix \ +- gcc-aarch64-linux-gnu \ +- gcc-arm-linux-gnueabi \ +- git \ +- iasl \ +- make \ +- nasm \ +- python3 \ +- uuid-dev \ +- && \ +- \ +- rm -rf /var/lib/apt/lists/* +diff --git a/.gitlab-ci.d/opensbi.yml b/.gitlab-ci.d/opensbi.yml +index 04ed5a3ea1..9a651465d8 100644 +--- a/.gitlab-ci.d/opensbi.yml ++++ b/.gitlab-ci.d/opensbi.yml +@@ -42,9 +42,9 @@ + docker-opensbi: + extends: .opensbi_job_rules + stage: containers +- image: docker:19.03.1 ++ image: docker:stable + services: +- - docker:19.03.1-dind ++ - docker:stable-dind + variables: + GIT_DEPTH: 3 + IMAGE_TAG: $CI_REGISTRY_IMAGE:opensbi-cross-build +diff --git a/.gitlab-ci.d/opensbi/Dockerfile b/.gitlab-ci.d/opensbi/Dockerfile +index 4ba8a4de86..5ccf4151f4 100644 +--- a/.gitlab-ci.d/opensbi/Dockerfile ++++ b/.gitlab-ci.d/opensbi/Dockerfile +@@ -15,6 +15,7 @@ RUN apt update \ + ca-certificates \ + git \ + make \ ++ python3 \ + wget \ + && \ + \ +diff --git a/.gitlab-ci.d/qemu-project.yml b/.gitlab-ci.d/qemu-project.yml +index 691d9bf5dc..a7ed447fe4 100644 +--- a/.gitlab-ci.d/qemu-project.yml ++++ b/.gitlab-ci.d/qemu-project.yml +@@ -4,7 +4,6 @@ + include: + - local: '/.gitlab-ci.d/base.yml' + - local: '/.gitlab-ci.d/stages.yml' +- - local: '/.gitlab-ci.d/edk2.yml' + - local: '/.gitlab-ci.d/opensbi.yml' + - local: '/.gitlab-ci.d/containers.yml' + - local: '/.gitlab-ci.d/crossbuilds.yml' +diff --git a/.gitlab-ci.d/windows.yml b/.gitlab-ci.d/windows.yml +index 0180261b7f..dfa4eb84a7 100644 +--- a/.gitlab-ci.d/windows.yml ++++ b/.gitlab-ci.d/windows.yml +@@ -1,9 +1,7 @@ + .shared_msys2_builder: + extends: .base_job_template + tags: +- - shared-windows +- - windows +- - windows-1809 ++ - saas-windows-medium-amd64 + cache: + key: "${CI_JOB_NAME}-cache" + paths: +diff --git a/MAINTAINERS b/MAINTAINERS +index 6966490c94..e688db1f55 100644 +--- a/MAINTAINERS ++++ b/MAINTAINERS +@@ -3257,8 +3257,6 @@ F: roms/edk2 + F: roms/edk2-* + F: tests/data/uefi-boot-images/ + F: tests/uefi-test-tools/ +-F: .gitlab-ci.d/edk2.yml +-F: .gitlab-ci.d/edk2/ + + VT-d Emulation + M: Michael S. Tsirkin <mst@redhat.com> +diff --git a/VERSION b/VERSION +index 971381d35b..4625f55e26 100644 +--- a/VERSION ++++ b/VERSION +@@ -1 +1 @@ +-7.2.11 ++7.2.12 +diff --git a/backends/cryptodev-builtin.c b/backends/cryptodev-builtin.c +index 2e792be756..763e67dfd6 100644 +--- a/backends/cryptodev-builtin.c ++++ b/backends/cryptodev-builtin.c +@@ -23,6 +23,7 @@ + + #include "qemu/osdep.h" + #include "sysemu/cryptodev.h" ++#include "qemu/error-report.h" + #include "qapi/error.h" + #include "standard-headers/linux/virtio_crypto.h" + #include "crypto/cipher.h" +@@ -385,8 +386,8 @@ static int cryptodev_builtin_create_session( + case VIRTIO_CRYPTO_HASH_CREATE_SESSION: + case VIRTIO_CRYPTO_MAC_CREATE_SESSION: + default: +- error_setg(&local_error, "Unsupported opcode :%" PRIu32 "", +- sess_info->op_code); ++ error_report("Unsupported opcode :%" PRIu32 "", ++ sess_info->op_code); + return -VIRTIO_CRYPTO_NOTSUPP; + } + +@@ -546,8 +547,8 @@ static int cryptodev_builtin_operation( + + if (op_info->session_id >= MAX_NUM_SESSIONS || + builtin->sessions[op_info->session_id] == NULL) { +- error_setg(&local_error, "Cannot find a valid session id: %" PRIu64 "", +- op_info->session_id); ++ error_report("Cannot find a valid session id: %" PRIu64 "", ++ op_info->session_id); + return -VIRTIO_CRYPTO_INVSESS; + } + +diff --git a/disas/riscv.c b/disas/riscv.c +index dee4e580a0..42399867a1 100644 +--- a/disas/riscv.c ++++ b/disas/riscv.c +@@ -2159,7 +2159,22 @@ static const char *csr_name(int csrno) + case 0x0383: return "mibound"; + case 0x0384: return "mdbase"; + case 0x0385: return "mdbound"; +- case 0x03a0: return "pmpcfg3"; ++ case 0x03a0: return "pmpcfg0"; ++ case 0x03a1: return "pmpcfg1"; ++ case 0x03a2: return "pmpcfg2"; ++ case 0x03a3: return "pmpcfg3"; ++ case 0x03a4: return "pmpcfg4"; ++ case 0x03a5: return "pmpcfg5"; ++ case 0x03a6: return "pmpcfg6"; ++ case 0x03a7: return "pmpcfg7"; ++ case 0x03a8: return "pmpcfg8"; ++ case 0x03a9: return "pmpcfg9"; ++ case 0x03aa: return "pmpcfg10"; ++ case 0x03ab: return "pmpcfg11"; ++ case 0x03ac: return "pmpcfg12"; ++ case 0x03ad: return "pmpcfg13"; ++ case 0x03ae: return "pmpcfg14"; ++ case 0x03af: return "pmpcfg15"; + case 0x03b0: return "pmpaddr0"; + case 0x03b1: return "pmpaddr1"; + case 0x03b2: return "pmpaddr2"; +@@ -2176,6 +2191,54 @@ static const char *csr_name(int csrno) + case 0x03bd: return "pmpaddr13"; + case 0x03be: return "pmpaddr14"; + case 0x03bf: return "pmpaddr15"; ++ case 0x03c0: return "pmpaddr16"; ++ case 0x03c1: return "pmpaddr17"; ++ case 0x03c2: return "pmpaddr18"; ++ case 0x03c3: return "pmpaddr19"; ++ case 0x03c4: return "pmpaddr20"; ++ case 0x03c5: return "pmpaddr21"; ++ case 0x03c6: return "pmpaddr22"; ++ case 0x03c7: return "pmpaddr23"; ++ case 0x03c8: return "pmpaddr24"; ++ case 0x03c9: return "pmpaddr25"; ++ case 0x03ca: return "pmpaddr26"; ++ case 0x03cb: return "pmpaddr27"; ++ case 0x03cc: return "pmpaddr28"; ++ case 0x03cd: return "pmpaddr29"; ++ case 0x03ce: return "pmpaddr30"; ++ case 0x03cf: return "pmpaddr31"; ++ case 0x03d0: return "pmpaddr32"; ++ case 0x03d1: return "pmpaddr33"; ++ case 0x03d2: return "pmpaddr34"; ++ case 0x03d3: return "pmpaddr35"; ++ case 0x03d4: return "pmpaddr36"; ++ case 0x03d5: return "pmpaddr37"; ++ case 0x03d6: return "pmpaddr38"; ++ case 0x03d7: return "pmpaddr39"; ++ case 0x03d8: return "pmpaddr40"; ++ case 0x03d9: return "pmpaddr41"; ++ case 0x03da: return "pmpaddr42"; ++ case 0x03db: return "pmpaddr43"; ++ case 0x03dc: return "pmpaddr44"; ++ case 0x03dd: return "pmpaddr45"; ++ case 0x03de: return "pmpaddr46"; ++ case 0x03df: return "pmpaddr47"; ++ case 0x03e0: return "pmpaddr48"; ++ case 0x03e1: return "pmpaddr49"; ++ case 0x03e2: return "pmpaddr50"; ++ case 0x03e3: return "pmpaddr51"; ++ case 0x03e4: return "pmpaddr52"; ++ case 0x03e5: return "pmpaddr53"; ++ case 0x03e6: return "pmpaddr54"; ++ case 0x03e7: return "pmpaddr55"; ++ case 0x03e8: return "pmpaddr56"; ++ case 0x03e9: return "pmpaddr57"; ++ case 0x03ea: return "pmpaddr58"; ++ case 0x03eb: return "pmpaddr59"; ++ case 0x03ec: return "pmpaddr60"; ++ case 0x03ed: return "pmpaddr61"; ++ case 0x03ee: return "pmpaddr62"; ++ case 0x03ef: return "pmpaddr63"; + case 0x0780: return "mtohost"; + case 0x0781: return "mfromhost"; + case 0x0782: return "mreset"; +diff --git a/hw/arm/npcm7xx.c b/hw/arm/npcm7xx.c +index d85cc02765..13d0b8bbb2 100644 +--- a/hw/arm/npcm7xx.c ++++ b/hw/arm/npcm7xx.c +@@ -24,6 +24,7 @@ + #include "hw/qdev-clock.h" + #include "hw/qdev-properties.h" + #include "qapi/error.h" ++#include "qemu/bswap.h" + #include "qemu/units.h" + #include "sysemu/sysemu.h" + +@@ -369,7 +370,7 @@ static void npcm7xx_init_fuses(NPCM7xxState *s) + * The initial mask of disabled modules indicates the chip derivative (e.g. + * NPCM750 or NPCM730). + */ +- value = tswap32(nc->disabled_modules); ++ value = cpu_to_le32(nc->disabled_modules); + npcm7xx_otp_array_write(&s->fuse_array, &value, NPCM7XX_FUSE_DERIVATIVE, + sizeof(value)); + } +diff --git a/hw/dma/xlnx_dpdma.c b/hw/dma/xlnx_dpdma.c +index dd66be5265..06e187e99c 100644 +--- a/hw/dma/xlnx_dpdma.c ++++ b/hw/dma/xlnx_dpdma.c +@@ -175,24 +175,24 @@ static uint64_t xlnx_dpdma_desc_get_source_address(DPDMADescriptor *desc, + + switch (frag) { + case 0: +- addr = desc->source_address +- + (extract32(desc->address_extension, 16, 12) << 20); ++ addr = (uint64_t)desc->source_address ++ + (extract64(desc->address_extension, 16, 16) << 32); + break; + case 1: +- addr = desc->source_address2 +- + (extract32(desc->address_extension_23, 0, 12) << 8); ++ addr = (uint64_t)desc->source_address2 ++ + (extract64(desc->address_extension_23, 0, 16) << 32); + break; + case 2: +- addr = desc->source_address3 +- + (extract32(desc->address_extension_23, 16, 12) << 20); ++ addr = (uint64_t)desc->source_address3 ++ + (extract64(desc->address_extension_23, 16, 16) << 32); + break; + case 3: +- addr = desc->source_address4 +- + (extract32(desc->address_extension_45, 0, 12) << 8); ++ addr = (uint64_t)desc->source_address4 ++ + (extract64(desc->address_extension_45, 0, 16) << 32); + break; + case 4: +- addr = desc->source_address5 +- + (extract32(desc->address_extension_45, 16, 12) << 20); ++ addr = (uint64_t)desc->source_address5 ++ + (extract64(desc->address_extension_45, 16, 16) << 32); + break; + default: + addr = 0; +diff --git a/hw/intc/arm_gic.c b/hw/intc/arm_gic.c +index 7a34bc0998..47f01e45e3 100644 +--- a/hw/intc/arm_gic.c ++++ b/hw/intc/arm_gic.c +@@ -1658,7 +1658,7 @@ static MemTxResult gic_cpu_read(GICState *s, int cpu, int offset, + *data = s->h_apr[gic_get_vcpu_real_id(cpu)]; + } else if (gic_cpu_ns_access(s, cpu, attrs)) { + /* NS view of GICC_APR<n> is the top half of GIC_NSAPR<n> */ +- *data = gic_apr_ns_view(s, regno, cpu); ++ *data = gic_apr_ns_view(s, cpu, regno); + } else { + *data = s->apr[regno][cpu]; + } +@@ -1746,7 +1746,7 @@ static MemTxResult gic_cpu_write(GICState *s, int cpu, int offset, + s->h_apr[gic_get_vcpu_real_id(cpu)] = value; + } else if (gic_cpu_ns_access(s, cpu, attrs)) { + /* NS view of GICC_APR<n> is the top half of GIC_NSAPR<n> */ +- gic_apr_write_ns_view(s, regno, cpu, value); ++ gic_apr_write_ns_view(s, cpu, regno, value); + } else { + s->apr[regno][cpu] = value; + } +diff --git a/hw/intc/riscv_aplic.c b/hw/intc/riscv_aplic.c +index cfd007e629..961caff7b6 100644 +--- a/hw/intc/riscv_aplic.c ++++ b/hw/intc/riscv_aplic.c +@@ -957,13 +957,13 @@ DeviceState *riscv_aplic_create(hwaddr addr, hwaddr size, + qdev_prop_set_bit(dev, "msimode", msimode); + qdev_prop_set_bit(dev, "mmode", mmode); + +- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal); +- sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, addr); +- + if (parent) { + riscv_aplic_add_child(parent, dev); + } + ++ sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal); ++ sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, addr); ++ + if (!msimode) { + for (i = 0; i < num_harts; i++) { + CPUState *cpu = qemu_get_cpu(hartid_base + i); +diff --git a/hw/remote/vfio-user-obj.c b/hw/remote/vfio-user-obj.c +index 4e36bb8bcf..973cebe785 100644 +--- a/hw/remote/vfio-user-obj.c ++++ b/hw/remote/vfio-user-obj.c +@@ -273,7 +273,7 @@ static ssize_t vfu_object_cfg_access(vfu_ctx_t *vfu_ctx, char * const buf, + while (bytes > 0) { + len = (bytes > pci_access_width) ? pci_access_width : bytes; + if (is_write) { +- memcpy(&val, ptr, len); ++ val = ldn_le_p(ptr, len); + pci_host_config_write_common(o->pci_dev, offset, + pci_config_size(o->pci_dev), + val, len); +@@ -281,7 +281,7 @@ static ssize_t vfu_object_cfg_access(vfu_ctx_t *vfu_ctx, char * const buf, + } else { + val = pci_host_config_read_common(o->pci_dev, offset, + pci_config_size(o->pci_dev), len); +- memcpy(ptr, &val, len); ++ stn_le_p(ptr, len, val); + trace_vfu_cfg_read(offset, val); + } + offset += len; +diff --git a/linux-user/syscall.c b/linux-user/syscall.c +index 41017b0df2..74240f99ad 100644 +--- a/linux-user/syscall.c ++++ b/linux-user/syscall.c +@@ -2297,18 +2297,13 @@ static abi_long do_setsockopt(int sockfd, int level, int optname, + switch (optname) { + case ALG_SET_KEY: + { +- char *alg_key = g_malloc(optlen); +- ++ char *alg_key = lock_user(VERIFY_READ, optval_addr, optlen, 1); + if (!alg_key) { +- return -TARGET_ENOMEM; +- } +- if (copy_from_user(alg_key, optval_addr, optlen)) { +- g_free(alg_key); + return -TARGET_EFAULT; + } + ret = get_errno(setsockopt(sockfd, level, optname, + alg_key, optlen)); +- g_free(alg_key); ++ unlock_user(alg_key, optval_addr, optlen); + break; + } + case ALG_SET_AEAD_AUTHSIZE: +diff --git a/nbd/client.c b/nbd/client.c +index 30d5383cb1..15503d0928 100644 +--- a/nbd/client.c ++++ b/nbd/client.c +@@ -596,13 +596,31 @@ static int nbd_request_simple_option(QIOChannel *ioc, int opt, bool strict, + return 1; + } + ++/* Callback to learn when QIO TLS upgrade is complete */ ++struct NBDTLSClientHandshakeData { ++ bool complete; ++ Error *error; ++ GMainLoop *loop; ++}; ++ ++static void nbd_client_tls_handshake(QIOTask *task, void *opaque) ++{ ++ struct NBDTLSClientHandshakeData *data = opaque; ++ ++ qio_task_propagate_error(task, &data->error); ++ data->complete = true; ++ if (data->loop) { ++ g_main_loop_quit(data->loop); ++ } ++} ++ + static QIOChannel *nbd_receive_starttls(QIOChannel *ioc, + QCryptoTLSCreds *tlscreds, + const char *hostname, Error **errp) + { + int ret; + QIOChannelTLS *tioc; +- struct NBDTLSHandshakeData data = { 0 }; ++ struct NBDTLSClientHandshakeData data = { 0 }; + + ret = nbd_request_simple_option(ioc, NBD_OPT_STARTTLS, true, errp); + if (ret <= 0) { +@@ -619,18 +637,20 @@ static QIOChannel *nbd_receive_starttls(QIOChannel *ioc, + return NULL; + } + qio_channel_set_name(QIO_CHANNEL(tioc), "nbd-client-tls"); +- data.loop = g_main_loop_new(g_main_context_default(), FALSE); + trace_nbd_receive_starttls_tls_handshake(); + qio_channel_tls_handshake(tioc, +- nbd_tls_handshake, ++ nbd_client_tls_handshake, + &data, + NULL, + NULL); + + if (!data.complete) { ++ data.loop = g_main_loop_new(g_main_context_default(), FALSE); + g_main_loop_run(data.loop); ++ assert(data.complete); ++ g_main_loop_unref(data.loop); + } +- g_main_loop_unref(data.loop); ++ + if (data.error) { + error_propagate(errp, data.error); + object_unref(OBJECT(tioc)); +diff --git a/nbd/common.c b/nbd/common.c +index ddfe7d1183..c201b58a83 100644 +--- a/nbd/common.c ++++ b/nbd/common.c +@@ -47,17 +47,6 @@ int nbd_drop(QIOChannel *ioc, size_t size, Error **errp) + } + + +-void nbd_tls_handshake(QIOTask *task, +- void *opaque) +-{ +- struct NBDTLSHandshakeData *data = opaque; +- +- qio_task_propagate_error(task, &data->error); +- data->complete = true; +- g_main_loop_quit(data->loop); +-} +- +- + const char *nbd_opt_lookup(uint32_t opt) + { + switch (opt) { +diff --git a/nbd/nbd-internal.h b/nbd/nbd-internal.h +index 1b2141ab4b..c18554cb87 100644 +--- a/nbd/nbd-internal.h ++++ b/nbd/nbd-internal.h +@@ -71,16 +71,6 @@ static inline int nbd_write(QIOChannel *ioc, const void *buffer, size_t size, + return qio_channel_write_all(ioc, buffer, size, errp) < 0 ? -EIO : 0; + } + +-struct NBDTLSHandshakeData { +- GMainLoop *loop; +- bool complete; +- Error *error; +-}; +- +- +-void nbd_tls_handshake(QIOTask *task, +- void *opaque); +- + int nbd_drop(QIOChannel *ioc, size_t size, Error **errp); + + #endif +diff --git a/nbd/server.c b/nbd/server.c +index ada16089f3..74edb2815b 100644 +--- a/nbd/server.c ++++ b/nbd/server.c +@@ -189,8 +189,9 @@ static inline void set_be_option_rep(NBDOptionReply *rep, uint32_t option, + + /* Send a reply header, including length, but no payload. + * Return -errno on error, 0 on success. */ +-static int nbd_negotiate_send_rep_len(NBDClient *client, uint32_t type, +- uint32_t len, Error **errp) ++static coroutine_fn int ++nbd_negotiate_send_rep_len(NBDClient *client, uint32_t type, ++ uint32_t len, Error **errp) + { + NBDOptionReply rep; + +@@ -205,15 +206,15 @@ static int nbd_negotiate_send_rep_len(NBDClient *client, uint32_t type, + + /* Send a reply header with default 0 length. + * Return -errno on error, 0 on success. */ +-static int nbd_negotiate_send_rep(NBDClient *client, uint32_t type, +- Error **errp) ++static coroutine_fn int ++nbd_negotiate_send_rep(NBDClient *client, uint32_t type, Error **errp) + { + return nbd_negotiate_send_rep_len(client, type, 0, errp); + } + + /* Send an error reply. + * Return -errno on error, 0 on success. */ +-static int G_GNUC_PRINTF(4, 0) ++static coroutine_fn int G_GNUC_PRINTF(4, 0) + nbd_negotiate_send_rep_verr(NBDClient *client, uint32_t type, + Error **errp, const char *fmt, va_list va) + { +@@ -253,7 +254,7 @@ nbd_sanitize_name(const char *name) + + /* Send an error reply. + * Return -errno on error, 0 on success. */ +-static int G_GNUC_PRINTF(4, 5) ++static coroutine_fn int G_GNUC_PRINTF(4, 5) + nbd_negotiate_send_rep_err(NBDClient *client, uint32_t type, + Error **errp, const char *fmt, ...) + { +@@ -269,7 +270,7 @@ nbd_negotiate_send_rep_err(NBDClient *client, uint32_t type, + /* Drop remainder of the current option, and send a reply with the + * given error type and message. Return -errno on read or write + * failure; or 0 if connection is still live. */ +-static int G_GNUC_PRINTF(4, 0) ++static coroutine_fn int G_GNUC_PRINTF(4, 0) + nbd_opt_vdrop(NBDClient *client, uint32_t type, Error **errp, + const char *fmt, va_list va) + { +@@ -282,7 +283,7 @@ nbd_opt_vdrop(NBDClient *client, uint32_t type, Error **errp, + return ret; + } + +-static int G_GNUC_PRINTF(4, 5) ++static coroutine_fn int G_GNUC_PRINTF(4, 5) + nbd_opt_drop(NBDClient *client, uint32_t type, Error **errp, + const char *fmt, ...) + { +@@ -296,7 +297,7 @@ nbd_opt_drop(NBDClient *client, uint32_t type, Error **errp, + return ret; + } + +-static int G_GNUC_PRINTF(3, 4) ++static coroutine_fn int G_GNUC_PRINTF(3, 4) + nbd_opt_invalid(NBDClient *client, Error **errp, const char *fmt, ...) + { + int ret; +@@ -313,8 +314,9 @@ nbd_opt_invalid(NBDClient *client, Error **errp, const char *fmt, ...) + * If @check_nul, require that no NUL bytes appear in buffer. + * Return -errno on I/O error, 0 if option was completely handled by + * sending a reply about inconsistent lengths, or 1 on success. */ +-static int nbd_opt_read(NBDClient *client, void *buffer, size_t size, +- bool check_nul, Error **errp) ++static coroutine_fn int ++nbd_opt_read(NBDClient *client, void *buffer, size_t size, ++ bool check_nul, Error **errp) + { + if (size > client->optlen) { + return nbd_opt_invalid(client, errp, +@@ -337,7 +339,8 @@ static int nbd_opt_read(NBDClient *client, void *buffer, size_t size, + /* Drop size bytes from the unparsed payload of the current option. + * Return -errno on I/O error, 0 if option was completely handled by + * sending a reply about inconsistent lengths, or 1 on success. */ +-static int nbd_opt_skip(NBDClient *client, size_t size, Error **errp) ++static coroutine_fn int ++nbd_opt_skip(NBDClient *client, size_t size, Error **errp) + { + if (size > client->optlen) { + return nbd_opt_invalid(client, errp, +@@ -360,8 +363,9 @@ static int nbd_opt_skip(NBDClient *client, size_t size, Error **errp) + * Return -errno on I/O error, 0 if option was completely handled by + * sending a reply about inconsistent lengths, or 1 on success. + */ +-static int nbd_opt_read_name(NBDClient *client, char **name, uint32_t *length, +- Error **errp) ++static coroutine_fn int ++nbd_opt_read_name(NBDClient *client, char **name, uint32_t *length, ++ Error **errp) + { + int ret; + uint32_t len; +@@ -396,8 +400,8 @@ static int nbd_opt_read_name(NBDClient *client, char **name, uint32_t *length, + + /* Send a single NBD_REP_SERVER reply to NBD_OPT_LIST, including payload. + * Return -errno on error, 0 on success. */ +-static int nbd_negotiate_send_rep_list(NBDClient *client, NBDExport *exp, +- Error **errp) ++static coroutine_fn int ++nbd_negotiate_send_rep_list(NBDClient *client, NBDExport *exp, Error **errp) + { + ERRP_GUARD(); + size_t name_len, desc_len; +@@ -438,7 +442,8 @@ static int nbd_negotiate_send_rep_list(NBDClient *client, NBDExport *exp, + + /* Process the NBD_OPT_LIST command, with a potential series of replies. + * Return -errno on error, 0 on success. */ +-static int nbd_negotiate_handle_list(NBDClient *client, Error **errp) ++static coroutine_fn int ++nbd_negotiate_handle_list(NBDClient *client, Error **errp) + { + NBDExport *exp; + assert(client->opt == NBD_OPT_LIST); +@@ -453,7 +458,8 @@ static int nbd_negotiate_handle_list(NBDClient *client, Error **errp) + return nbd_negotiate_send_rep(client, NBD_REP_ACK, errp); + } + +-static void nbd_check_meta_export(NBDClient *client) ++static coroutine_fn void ++nbd_check_meta_export(NBDClient *client) + { + if (client->exp != client->export_meta.exp) { + client->export_meta.count = 0; +@@ -462,8 +468,9 @@ static void nbd_check_meta_export(NBDClient *client) + + /* Send a reply to NBD_OPT_EXPORT_NAME. + * Return -errno on error, 0 on success. */ +-static int nbd_negotiate_handle_export_name(NBDClient *client, bool no_zeroes, +- Error **errp) ++static coroutine_fn int ++nbd_negotiate_handle_export_name(NBDClient *client, bool no_zeroes, ++ Error **errp) + { + ERRP_GUARD(); + g_autofree char *name = NULL; +@@ -523,9 +530,9 @@ static int nbd_negotiate_handle_export_name(NBDClient *client, bool no_zeroes, + /* Send a single NBD_REP_INFO, with a buffer @buf of @length bytes. + * The buffer does NOT include the info type prefix. + * Return -errno on error, 0 if ready to send more. */ +-static int nbd_negotiate_send_info(NBDClient *client, +- uint16_t info, uint32_t length, void *buf, +- Error **errp) ++static coroutine_fn int ++nbd_negotiate_send_info(NBDClient *client, uint16_t info, uint32_t length, ++ void *buf, Error **errp) + { + int rc; + +@@ -552,7 +559,8 @@ static int nbd_negotiate_send_info(NBDClient *client, + * -errno transmission error occurred or @fatal was requested, errp is set + * 0 error message successfully sent to client, errp is not set + */ +-static int nbd_reject_length(NBDClient *client, bool fatal, Error **errp) ++static coroutine_fn int ++nbd_reject_length(NBDClient *client, bool fatal, Error **errp) + { + int ret; + +@@ -570,7 +578,8 @@ static int nbd_reject_length(NBDClient *client, bool fatal, Error **errp) + /* Handle NBD_OPT_INFO and NBD_OPT_GO. + * Return -errno on error, 0 if ready for next option, and 1 to move + * into transmission phase. */ +-static int nbd_negotiate_handle_info(NBDClient *client, Error **errp) ++static coroutine_fn int ++nbd_negotiate_handle_info(NBDClient *client, Error **errp) + { + int rc; + g_autofree char *name = NULL; +@@ -729,15 +738,33 @@ static int nbd_negotiate_handle_info(NBDClient *client, Error **errp) + return rc; + } + ++/* Callback to learn when QIO TLS upgrade is complete */ ++struct NBDTLSServerHandshakeData { ++ bool complete; ++ Error *error; ++ Coroutine *co; ++}; ++ ++static void ++nbd_server_tls_handshake(QIOTask *task, void *opaque) ++{ ++ struct NBDTLSServerHandshakeData *data = opaque; ++ ++ qio_task_propagate_error(task, &data->error); ++ data->complete = true; ++ if (!qemu_coroutine_entered(data->co)) { ++ aio_co_wake(data->co); ++ } ++} + + /* Handle NBD_OPT_STARTTLS. Return NULL to drop connection, or else the + * new channel for all further (now-encrypted) communication. */ +-static QIOChannel *nbd_negotiate_handle_starttls(NBDClient *client, +- Error **errp) ++static coroutine_fn QIOChannel * ++nbd_negotiate_handle_starttls(NBDClient *client, Error **errp) + { + QIOChannel *ioc; + QIOChannelTLS *tioc; +- struct NBDTLSHandshakeData data = { 0 }; ++ struct NBDTLSServerHandshakeData data = { 0 }; + + assert(client->opt == NBD_OPT_STARTTLS); + +@@ -758,17 +785,18 @@ static QIOChannel *nbd_negotiate_handle_starttls(NBDClient *client, + + qio_channel_set_name(QIO_CHANNEL(tioc), "nbd-server-tls"); + trace_nbd_negotiate_handle_starttls_handshake(); +- data.loop = g_main_loop_new(g_main_context_default(), FALSE); ++ data.co = qemu_coroutine_self(); + qio_channel_tls_handshake(tioc, +- nbd_tls_handshake, ++ nbd_server_tls_handshake, + &data, + NULL, + NULL); + + if (!data.complete) { +- g_main_loop_run(data.loop); ++ qemu_coroutine_yield(); ++ assert(data.complete); + } +- g_main_loop_unref(data.loop); ++ + if (data.error) { + object_unref(OBJECT(tioc)); + error_propagate(errp, data.error); +@@ -784,10 +812,9 @@ static QIOChannel *nbd_negotiate_handle_starttls(NBDClient *client, + * + * For NBD_OPT_LIST_META_CONTEXT @context_id is ignored, 0 is used instead. + */ +-static int nbd_negotiate_send_meta_context(NBDClient *client, +- const char *context, +- uint32_t context_id, +- Error **errp) ++static coroutine_fn int ++nbd_negotiate_send_meta_context(NBDClient *client, const char *context, ++ uint32_t context_id, Error **errp) + { + NBDOptionReplyMetaContext opt; + struct iovec iov[] = { +@@ -812,8 +839,9 @@ static int nbd_negotiate_send_meta_context(NBDClient *client, + * Return true if @query matches @pattern, or if @query is empty when + * the @client is performing _LIST_. + */ +-static bool nbd_meta_empty_or_pattern(NBDClient *client, const char *pattern, +- const char *query) ++static coroutine_fn bool ++nbd_meta_empty_or_pattern(NBDClient *client, const char *pattern, ++ const char *query) + { + if (!*query) { + trace_nbd_negotiate_meta_query_parse("empty"); +@@ -830,7 +858,8 @@ static bool nbd_meta_empty_or_pattern(NBDClient *client, const char *pattern, + /* + * Return true and adjust @str in place if it begins with @prefix. + */ +-static bool nbd_strshift(const char **str, const char *prefix) ++static coroutine_fn bool ++nbd_strshift(const char **str, const char *prefix) + { + size_t len = strlen(prefix); + +@@ -846,8 +875,9 @@ static bool nbd_strshift(const char **str, const char *prefix) + * Handle queries to 'base' namespace. For now, only the base:allocation + * context is available. Return true if @query has been handled. + */ +-static bool nbd_meta_base_query(NBDClient *client, NBDExportMetaContexts *meta, +- const char *query) ++static coroutine_fn bool ++nbd_meta_base_query(NBDClient *client, NBDExportMetaContexts *meta, ++ const char *query) + { + if (!nbd_strshift(&query, "base:")) { + return false; +@@ -866,8 +896,9 @@ static bool nbd_meta_base_query(NBDClient *client, NBDExportMetaContexts *meta, + * and qemu:allocation-depth contexts are available. Return true if @query + * has been handled. + */ +-static bool nbd_meta_qemu_query(NBDClient *client, NBDExportMetaContexts *meta, +- const char *query) ++static coroutine_fn bool ++nbd_meta_qemu_query(NBDClient *client, NBDExportMetaContexts *meta, ++ const char *query) + { + size_t i; + +@@ -931,8 +962,9 @@ static bool nbd_meta_qemu_query(NBDClient *client, NBDExportMetaContexts *meta, + * + * Return -errno on I/O error, 0 if option was completely handled by + * sending a reply about inconsistent lengths, or 1 on success. */ +-static int nbd_negotiate_meta_query(NBDClient *client, +- NBDExportMetaContexts *meta, Error **errp) ++static coroutine_fn int ++nbd_negotiate_meta_query(NBDClient *client, ++ NBDExportMetaContexts *meta, Error **errp) + { + int ret; + g_autofree char *query = NULL; +@@ -971,8 +1003,9 @@ static int nbd_negotiate_meta_query(NBDClient *client, + * Handle NBD_OPT_LIST_META_CONTEXT and NBD_OPT_SET_META_CONTEXT + * + * Return -errno on I/O error, or 0 if option was completely handled. */ +-static int nbd_negotiate_meta_queries(NBDClient *client, +- NBDExportMetaContexts *meta, Error **errp) ++static coroutine_fn int ++nbd_negotiate_meta_queries(NBDClient *client, ++ NBDExportMetaContexts *meta, Error **errp) + { + int ret; + g_autofree char *export_name = NULL; +@@ -1096,7 +1129,8 @@ static int nbd_negotiate_meta_queries(NBDClient *client, + * 1 if client sent NBD_OPT_ABORT, i.e. on valid disconnect, + * errp is not set + */ +-static int nbd_negotiate_options(NBDClient *client, Error **errp) ++static coroutine_fn int ++nbd_negotiate_options(NBDClient *client, Error **errp) + { + uint32_t flags; + bool fixedNewstyle = false; +diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c +index 3d74f134f5..037e9d9feb 100644 +--- a/target/arm/cpu64.c ++++ b/target/arm/cpu64.c +@@ -190,7 +190,11 @@ void arm_cpu_sve_finalize(ARMCPU *cpu, Error **errp) + * No explicit bits enabled, and no implicit bits from sve-max-vq. + */ + if (!cpu_isar_feature(aa64_sve, cpu)) { +- /* SVE is disabled and so are all vector lengths. Good. */ ++ /* ++ * SVE is disabled and so are all vector lengths. Good. ++ * Disable all SVE extensions as well. ++ */ ++ cpu->isar.id_aa64zfr0 = 0; + return; + } + +diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c +index 060aa0ccf4..047cb8fc50 100644 +--- a/target/arm/hvf/hvf.c ++++ b/target/arm/hvf/hvf.c +@@ -187,85 +187,85 @@ struct hvf_sreg_match { + }; + + static struct hvf_sreg_match hvf_sreg_match[] = { +- { HV_SYS_REG_DBGBVR0_EL1, HVF_SYSREG(0, 0, 14, 0, 4) }, +- { HV_SYS_REG_DBGBCR0_EL1, HVF_SYSREG(0, 0, 14, 0, 5) }, +- { HV_SYS_REG_DBGWVR0_EL1, HVF_SYSREG(0, 0, 14, 0, 6) }, +- { HV_SYS_REG_DBGWCR0_EL1, HVF_SYSREG(0, 0, 14, 0, 7) }, +- +- { HV_SYS_REG_DBGBVR1_EL1, HVF_SYSREG(0, 1, 14, 0, 4) }, +- { HV_SYS_REG_DBGBCR1_EL1, HVF_SYSREG(0, 1, 14, 0, 5) }, +- { HV_SYS_REG_DBGWVR1_EL1, HVF_SYSREG(0, 1, 14, 0, 6) }, +- { HV_SYS_REG_DBGWCR1_EL1, HVF_SYSREG(0, 1, 14, 0, 7) }, +- +- { HV_SYS_REG_DBGBVR2_EL1, HVF_SYSREG(0, 2, 14, 0, 4) }, +- { HV_SYS_REG_DBGBCR2_EL1, HVF_SYSREG(0, 2, 14, 0, 5) }, +- { HV_SYS_REG_DBGWVR2_EL1, HVF_SYSREG(0, 2, 14, 0, 6) }, +- { HV_SYS_REG_DBGWCR2_EL1, HVF_SYSREG(0, 2, 14, 0, 7) }, +- +- { HV_SYS_REG_DBGBVR3_EL1, HVF_SYSREG(0, 3, 14, 0, 4) }, +- { HV_SYS_REG_DBGBCR3_EL1, HVF_SYSREG(0, 3, 14, 0, 5) }, +- { HV_SYS_REG_DBGWVR3_EL1, HVF_SYSREG(0, 3, 14, 0, 6) }, +- { HV_SYS_REG_DBGWCR3_EL1, HVF_SYSREG(0, 3, 14, 0, 7) }, +- +- { HV_SYS_REG_DBGBVR4_EL1, HVF_SYSREG(0, 4, 14, 0, 4) }, +- { HV_SYS_REG_DBGBCR4_EL1, HVF_SYSREG(0, 4, 14, 0, 5) }, +- { HV_SYS_REG_DBGWVR4_EL1, HVF_SYSREG(0, 4, 14, 0, 6) }, +- { HV_SYS_REG_DBGWCR4_EL1, HVF_SYSREG(0, 4, 14, 0, 7) }, +- +- { HV_SYS_REG_DBGBVR5_EL1, HVF_SYSREG(0, 5, 14, 0, 4) }, +- { HV_SYS_REG_DBGBCR5_EL1, HVF_SYSREG(0, 5, 14, 0, 5) }, +- { HV_SYS_REG_DBGWVR5_EL1, HVF_SYSREG(0, 5, 14, 0, 6) }, +- { HV_SYS_REG_DBGWCR5_EL1, HVF_SYSREG(0, 5, 14, 0, 7) }, +- +- { HV_SYS_REG_DBGBVR6_EL1, HVF_SYSREG(0, 6, 14, 0, 4) }, +- { HV_SYS_REG_DBGBCR6_EL1, HVF_SYSREG(0, 6, 14, 0, 5) }, +- { HV_SYS_REG_DBGWVR6_EL1, HVF_SYSREG(0, 6, 14, 0, 6) }, +- { HV_SYS_REG_DBGWCR6_EL1, HVF_SYSREG(0, 6, 14, 0, 7) }, +- +- { HV_SYS_REG_DBGBVR7_EL1, HVF_SYSREG(0, 7, 14, 0, 4) }, +- { HV_SYS_REG_DBGBCR7_EL1, HVF_SYSREG(0, 7, 14, 0, 5) }, +- { HV_SYS_REG_DBGWVR7_EL1, HVF_SYSREG(0, 7, 14, 0, 6) }, +- { HV_SYS_REG_DBGWCR7_EL1, HVF_SYSREG(0, 7, 14, 0, 7) }, +- +- { HV_SYS_REG_DBGBVR8_EL1, HVF_SYSREG(0, 8, 14, 0, 4) }, +- { HV_SYS_REG_DBGBCR8_EL1, HVF_SYSREG(0, 8, 14, 0, 5) }, +- { HV_SYS_REG_DBGWVR8_EL1, HVF_SYSREG(0, 8, 14, 0, 6) }, +- { HV_SYS_REG_DBGWCR8_EL1, HVF_SYSREG(0, 8, 14, 0, 7) }, +- +- { HV_SYS_REG_DBGBVR9_EL1, HVF_SYSREG(0, 9, 14, 0, 4) }, +- { HV_SYS_REG_DBGBCR9_EL1, HVF_SYSREG(0, 9, 14, 0, 5) }, +- { HV_SYS_REG_DBGWVR9_EL1, HVF_SYSREG(0, 9, 14, 0, 6) }, +- { HV_SYS_REG_DBGWCR9_EL1, HVF_SYSREG(0, 9, 14, 0, 7) }, +- +- { HV_SYS_REG_DBGBVR10_EL1, HVF_SYSREG(0, 10, 14, 0, 4) }, +- { HV_SYS_REG_DBGBCR10_EL1, HVF_SYSREG(0, 10, 14, 0, 5) }, +- { HV_SYS_REG_DBGWVR10_EL1, HVF_SYSREG(0, 10, 14, 0, 6) }, +- { HV_SYS_REG_DBGWCR10_EL1, HVF_SYSREG(0, 10, 14, 0, 7) }, +- +- { HV_SYS_REG_DBGBVR11_EL1, HVF_SYSREG(0, 11, 14, 0, 4) }, +- { HV_SYS_REG_DBGBCR11_EL1, HVF_SYSREG(0, 11, 14, 0, 5) }, +- { HV_SYS_REG_DBGWVR11_EL1, HVF_SYSREG(0, 11, 14, 0, 6) }, +- { HV_SYS_REG_DBGWCR11_EL1, HVF_SYSREG(0, 11, 14, 0, 7) }, +- +- { HV_SYS_REG_DBGBVR12_EL1, HVF_SYSREG(0, 12, 14, 0, 4) }, +- { HV_SYS_REG_DBGBCR12_EL1, HVF_SYSREG(0, 12, 14, 0, 5) }, +- { HV_SYS_REG_DBGWVR12_EL1, HVF_SYSREG(0, 12, 14, 0, 6) }, +- { HV_SYS_REG_DBGWCR12_EL1, HVF_SYSREG(0, 12, 14, 0, 7) }, +- +- { HV_SYS_REG_DBGBVR13_EL1, HVF_SYSREG(0, 13, 14, 0, 4) }, +- { HV_SYS_REG_DBGBCR13_EL1, HVF_SYSREG(0, 13, 14, 0, 5) }, +- { HV_SYS_REG_DBGWVR13_EL1, HVF_SYSREG(0, 13, 14, 0, 6) }, +- { HV_SYS_REG_DBGWCR13_EL1, HVF_SYSREG(0, 13, 14, 0, 7) }, +- +- { HV_SYS_REG_DBGBVR14_EL1, HVF_SYSREG(0, 14, 14, 0, 4) }, +- { HV_SYS_REG_DBGBCR14_EL1, HVF_SYSREG(0, 14, 14, 0, 5) }, +- { HV_SYS_REG_DBGWVR14_EL1, HVF_SYSREG(0, 14, 14, 0, 6) }, +- { HV_SYS_REG_DBGWCR14_EL1, HVF_SYSREG(0, 14, 14, 0, 7) }, +- +- { HV_SYS_REG_DBGBVR15_EL1, HVF_SYSREG(0, 15, 14, 0, 4) }, +- { HV_SYS_REG_DBGBCR15_EL1, HVF_SYSREG(0, 15, 14, 0, 5) }, +- { HV_SYS_REG_DBGWVR15_EL1, HVF_SYSREG(0, 15, 14, 0, 6) }, +- { HV_SYS_REG_DBGWCR15_EL1, HVF_SYSREG(0, 15, 14, 0, 7) }, ++ { HV_SYS_REG_DBGBVR0_EL1, HVF_SYSREG(0, 0, 2, 0, 4) }, ++ { HV_SYS_REG_DBGBCR0_EL1, HVF_SYSREG(0, 0, 2, 0, 5) }, ++ { HV_SYS_REG_DBGWVR0_EL1, HVF_SYSREG(0, 0, 2, 0, 6) }, ++ { HV_SYS_REG_DBGWCR0_EL1, HVF_SYSREG(0, 0, 2, 0, 7) }, ++ ++ { HV_SYS_REG_DBGBVR1_EL1, HVF_SYSREG(0, 1, 2, 0, 4) }, ++ { HV_SYS_REG_DBGBCR1_EL1, HVF_SYSREG(0, 1, 2, 0, 5) }, ++ { HV_SYS_REG_DBGWVR1_EL1, HVF_SYSREG(0, 1, 2, 0, 6) }, ++ { HV_SYS_REG_DBGWCR1_EL1, HVF_SYSREG(0, 1, 2, 0, 7) }, ++ ++ { HV_SYS_REG_DBGBVR2_EL1, HVF_SYSREG(0, 2, 2, 0, 4) }, ++ { HV_SYS_REG_DBGBCR2_EL1, HVF_SYSREG(0, 2, 2, 0, 5) }, ++ { HV_SYS_REG_DBGWVR2_EL1, HVF_SYSREG(0, 2, 2, 0, 6) }, ++ { HV_SYS_REG_DBGWCR2_EL1, HVF_SYSREG(0, 2, 2, 0, 7) }, ++ ++ { HV_SYS_REG_DBGBVR3_EL1, HVF_SYSREG(0, 3, 2, 0, 4) }, ++ { HV_SYS_REG_DBGBCR3_EL1, HVF_SYSREG(0, 3, 2, 0, 5) }, ++ { HV_SYS_REG_DBGWVR3_EL1, HVF_SYSREG(0, 3, 2, 0, 6) }, ++ { HV_SYS_REG_DBGWCR3_EL1, HVF_SYSREG(0, 3, 2, 0, 7) }, ++ ++ { HV_SYS_REG_DBGBVR4_EL1, HVF_SYSREG(0, 4, 2, 0, 4) }, ++ { HV_SYS_REG_DBGBCR4_EL1, HVF_SYSREG(0, 4, 2, 0, 5) }, ++ { HV_SYS_REG_DBGWVR4_EL1, HVF_SYSREG(0, 4, 2, 0, 6) }, ++ { HV_SYS_REG_DBGWCR4_EL1, HVF_SYSREG(0, 4, 2, 0, 7) }, ++ ++ { HV_SYS_REG_DBGBVR5_EL1, HVF_SYSREG(0, 5, 2, 0, 4) }, ++ { HV_SYS_REG_DBGBCR5_EL1, HVF_SYSREG(0, 5, 2, 0, 5) }, ++ { HV_SYS_REG_DBGWVR5_EL1, HVF_SYSREG(0, 5, 2, 0, 6) }, ++ { HV_SYS_REG_DBGWCR5_EL1, HVF_SYSREG(0, 5, 2, 0, 7) }, ++ ++ { HV_SYS_REG_DBGBVR6_EL1, HVF_SYSREG(0, 6, 2, 0, 4) }, ++ { HV_SYS_REG_DBGBCR6_EL1, HVF_SYSREG(0, 6, 2, 0, 5) }, ++ { HV_SYS_REG_DBGWVR6_EL1, HVF_SYSREG(0, 6, 2, 0, 6) }, ++ { HV_SYS_REG_DBGWCR6_EL1, HVF_SYSREG(0, 6, 2, 0, 7) }, ++ ++ { HV_SYS_REG_DBGBVR7_EL1, HVF_SYSREG(0, 7, 2, 0, 4) }, ++ { HV_SYS_REG_DBGBCR7_EL1, HVF_SYSREG(0, 7, 2, 0, 5) }, ++ { HV_SYS_REG_DBGWVR7_EL1, HVF_SYSREG(0, 7, 2, 0, 6) }, ++ { HV_SYS_REG_DBGWCR7_EL1, HVF_SYSREG(0, 7, 2, 0, 7) }, ++ ++ { HV_SYS_REG_DBGBVR8_EL1, HVF_SYSREG(0, 8, 2, 0, 4) }, ++ { HV_SYS_REG_DBGBCR8_EL1, HVF_SYSREG(0, 8, 2, 0, 5) }, ++ { HV_SYS_REG_DBGWVR8_EL1, HVF_SYSREG(0, 8, 2, 0, 6) }, ++ { HV_SYS_REG_DBGWCR8_EL1, HVF_SYSREG(0, 8, 2, 0, 7) }, ++ ++ { HV_SYS_REG_DBGBVR9_EL1, HVF_SYSREG(0, 9, 2, 0, 4) }, ++ { HV_SYS_REG_DBGBCR9_EL1, HVF_SYSREG(0, 9, 2, 0, 5) }, ++ { HV_SYS_REG_DBGWVR9_EL1, HVF_SYSREG(0, 9, 2, 0, 6) }, ++ { HV_SYS_REG_DBGWCR9_EL1, HVF_SYSREG(0, 9, 2, 0, 7) }, ++ ++ { HV_SYS_REG_DBGBVR10_EL1, HVF_SYSREG(0, 10, 2, 0, 4) }, ++ { HV_SYS_REG_DBGBCR10_EL1, HVF_SYSREG(0, 10, 2, 0, 5) }, ++ { HV_SYS_REG_DBGWVR10_EL1, HVF_SYSREG(0, 10, 2, 0, 6) }, ++ { HV_SYS_REG_DBGWCR10_EL1, HVF_SYSREG(0, 10, 2, 0, 7) }, ++ ++ { HV_SYS_REG_DBGBVR11_EL1, HVF_SYSREG(0, 11, 2, 0, 4) }, ++ { HV_SYS_REG_DBGBCR11_EL1, HVF_SYSREG(0, 11, 2, 0, 5) }, ++ { HV_SYS_REG_DBGWVR11_EL1, HVF_SYSREG(0, 11, 2, 0, 6) }, ++ { HV_SYS_REG_DBGWCR11_EL1, HVF_SYSREG(0, 11, 2, 0, 7) }, ++ ++ { HV_SYS_REG_DBGBVR12_EL1, HVF_SYSREG(0, 12, 2, 0, 4) }, ++ { HV_SYS_REG_DBGBCR12_EL1, HVF_SYSREG(0, 12, 2, 0, 5) }, ++ { HV_SYS_REG_DBGWVR12_EL1, HVF_SYSREG(0, 12, 2, 0, 6) }, ++ { HV_SYS_REG_DBGWCR12_EL1, HVF_SYSREG(0, 12, 2, 0, 7) }, ++ ++ { HV_SYS_REG_DBGBVR13_EL1, HVF_SYSREG(0, 13, 2, 0, 4) }, ++ { HV_SYS_REG_DBGBCR13_EL1, HVF_SYSREG(0, 13, 2, 0, 5) }, ++ { HV_SYS_REG_DBGWVR13_EL1, HVF_SYSREG(0, 13, 2, 0, 6) }, ++ { HV_SYS_REG_DBGWCR13_EL1, HVF_SYSREG(0, 13, 2, 0, 7) }, ++ ++ { HV_SYS_REG_DBGBVR14_EL1, HVF_SYSREG(0, 14, 2, 0, 4) }, ++ { HV_SYS_REG_DBGBCR14_EL1, HVF_SYSREG(0, 14, 2, 0, 5) }, ++ { HV_SYS_REG_DBGWVR14_EL1, HVF_SYSREG(0, 14, 2, 0, 6) }, ++ { HV_SYS_REG_DBGWCR14_EL1, HVF_SYSREG(0, 14, 2, 0, 7) }, ++ ++ { HV_SYS_REG_DBGBVR15_EL1, HVF_SYSREG(0, 15, 2, 0, 4) }, ++ { HV_SYS_REG_DBGBCR15_EL1, HVF_SYSREG(0, 15, 2, 0, 5) }, ++ { HV_SYS_REG_DBGWVR15_EL1, HVF_SYSREG(0, 15, 2, 0, 6) }, ++ { HV_SYS_REG_DBGWCR15_EL1, HVF_SYSREG(0, 15, 2, 0, 7) }, + + #ifdef SYNC_NO_RAW_REGS + /* +@@ -277,7 +277,7 @@ static struct hvf_sreg_match hvf_sreg_match[] = { + { HV_SYS_REG_MPIDR_EL1, HVF_SYSREG(0, 0, 3, 0, 5) }, + { HV_SYS_REG_ID_AA64PFR0_EL1, HVF_SYSREG(0, 4, 3, 0, 0) }, + #endif +- { HV_SYS_REG_ID_AA64PFR1_EL1, HVF_SYSREG(0, 4, 3, 0, 2) }, ++ { HV_SYS_REG_ID_AA64PFR1_EL1, HVF_SYSREG(0, 4, 3, 0, 1) }, + { HV_SYS_REG_ID_AA64DFR0_EL1, HVF_SYSREG(0, 5, 3, 0, 0) }, + { HV_SYS_REG_ID_AA64DFR1_EL1, HVF_SYSREG(0, 5, 3, 0, 1) }, + { HV_SYS_REG_ID_AA64ISAR0_EL1, HVF_SYSREG(0, 6, 3, 0, 0) }, +diff --git a/target/i386/kvm/hyperv.c b/target/i386/kvm/hyperv.c +index e3ac978648..0a2e2a07e9 100644 +--- a/target/i386/kvm/hyperv.c ++++ b/target/i386/kvm/hyperv.c +@@ -81,7 +81,7 @@ int kvm_hv_handle_exit(X86CPU *cpu, struct kvm_hyperv_exit *exit) + */ + async_safe_run_on_cpu(CPU(cpu), async_synic_update, RUN_ON_CPU_NULL); + +- return 0; ++ return EXCP_INTERRUPT; + case KVM_EXIT_HYPERV_HCALL: { + uint16_t code = exit->u.hcall.input & 0xffff; + bool fast = exit->u.hcall.input & HV_HYPERCALL_FAST; +diff --git a/target/i386/tcg/decode-new.c.inc b/target/i386/tcg/decode-new.c.inc +index 528e2fdfbb..1dfc368456 100644 +--- a/target/i386/tcg/decode-new.c.inc ++++ b/target/i386/tcg/decode-new.c.inc +@@ -1418,9 +1418,9 @@ static bool has_cpuid_feature(DisasContext *s, X86CPUIDFeature cpuid) + case X86_FEAT_PCLMULQDQ: + return (s->cpuid_ext_features & CPUID_EXT_PCLMULQDQ); + case X86_FEAT_SSE: +- return (s->cpuid_ext_features & CPUID_SSE); ++ return (s->cpuid_features & CPUID_SSE); + case X86_FEAT_SSE2: +- return (s->cpuid_ext_features & CPUID_SSE2); ++ return (s->cpuid_features & CPUID_SSE2); + case X86_FEAT_SSE3: + return (s->cpuid_ext_features & CPUID_EXT_SSE3); + case X86_FEAT_SSSE3: +diff --git a/target/i386/tcg/fpu_helper.c b/target/i386/tcg/fpu_helper.c +index 6f3741b635..68c7058628 100644 +--- a/target/i386/tcg/fpu_helper.c ++++ b/target/i386/tcg/fpu_helper.c +@@ -3011,6 +3011,11 @@ void helper_xsetbv(CPUX86State *env, uint32_t ecx, uint64_t mask) + goto do_gpf; + } + ++ /* SSE can be disabled, but only if AVX is disabled too. */ ++ if ((mask & (XSTATE_SSE_MASK | XSTATE_YMM_MASK)) == XSTATE_YMM_MASK) { ++ goto do_gpf; ++ } ++ + /* Disallow enabling unimplemented features. */ + cpu_x86_cpuid(env, 0x0d, 0, &ena_lo, &dummy, &dummy, &ena_hi); + ena = ((uint64_t)ena_hi << 32) | ena_lo; +diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c +index abacb91ddf..417bc26e8f 100644 +--- a/target/i386/tcg/translate.c ++++ b/target/i386/tcg/translate.c +@@ -2814,13 +2814,17 @@ static void gen_bnd_jmp(DisasContext *s) + static void + do_gen_eob_worker(DisasContext *s, bool inhibit, bool recheck_tf, bool jr) + { ++ bool inhibit_reset; ++ + gen_update_cc_op(s); + + /* If several instructions disable interrupts, only the first does it. */ +- if (inhibit && !(s->flags & HF_INHIBIT_IRQ_MASK)) { +- gen_set_hflag(s, HF_INHIBIT_IRQ_MASK); +- } else { ++ inhibit_reset = false; ++ if (s->flags & HF_INHIBIT_IRQ_MASK) { + gen_reset_hflag(s, HF_INHIBIT_IRQ_MASK); ++ inhibit_reset = true; ++ } else if (inhibit) { ++ gen_set_hflag(s, HF_INHIBIT_IRQ_MASK); + } + + if (s->base.tb->flags & HF_RF_MASK) { +@@ -2829,9 +2833,11 @@ do_gen_eob_worker(DisasContext *s, bool inhibit, bool recheck_tf, bool jr) + if (recheck_tf) { + gen_helper_rechecking_single_step(cpu_env); + tcg_gen_exit_tb(NULL, 0); +- } else if (s->flags & HF_TF_MASK) { ++ } else if ((s->flags & HF_TF_MASK) && !inhibit) { + gen_helper_single_step(cpu_env); +- } else if (jr) { ++ } else if (jr && ++ /* give irqs a chance to happen */ ++ !inhibit_reset) { + tcg_gen_lookup_and_goto_ptr(); + } else { + tcg_gen_exit_tb(NULL, 0); +@@ -6053,7 +6059,8 @@ static bool disas_insn(DisasContext *s, CPUState *cpu) + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 1); + break; + case 0xee: /* rdpkru */ +- if (prefixes & PREFIX_LOCK) { ++ if (s->prefix & (PREFIX_LOCK | PREFIX_DATA ++ | PREFIX_REPZ | PREFIX_REPNZ)) { + goto illegal_op; + } + tcg_gen_trunc_tl_i32(s->tmp2_i32, cpu_regs[R_ECX]); +@@ -6061,7 +6068,8 @@ static bool disas_insn(DisasContext *s, CPUState *cpu) + tcg_gen_extr_i64_tl(cpu_regs[R_EAX], cpu_regs[R_EDX], s->tmp1_i64); + break; + case 0xef: /* wrpkru */ +- if (prefixes & PREFIX_LOCK) { ++ if (s->prefix & (PREFIX_LOCK | PREFIX_DATA ++ | PREFIX_REPZ | PREFIX_REPNZ)) { + goto illegal_op; + } + tcg_gen_concat_tl_i64(s->tmp1_i64, cpu_regs[R_EAX], +@@ -6782,12 +6790,7 @@ static bool disas_insn(DisasContext *s, CPUState *cpu) + modrm = x86_ldub_code(env, s); + reg = ((modrm >> 3) & 7) | REX_R(s); + +- if (s->prefix & PREFIX_DATA) { +- ot = MO_16; +- } else { +- ot = mo_64_32(dflag); +- } +- ++ ot = dflag; + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); + gen_extu(ot, s->T0); + tcg_gen_mov_tl(cpu_cc_src, s->T0); +@@ -6953,7 +6956,7 @@ static void i386_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cpu) + dc->cpuid_7_0_ecx_features = env->features[FEAT_7_0_ECX]; + dc->cpuid_xsave_features = env->features[FEAT_XSAVE]; + dc->jmp_opt = !((cflags & CF_NO_GOTO_TB) || +- (flags & (HF_TF_MASK | HF_INHIBIT_IRQ_MASK))); ++ (flags & (HF_RF_MASK | HF_TF_MASK | HF_INHIBIT_IRQ_MASK))); + /* + * If jmp_opt, we want to handle each string instruction individually. + * For icount also disable repz optimization so that each iteration +diff --git a/target/loongarch/cpu.c b/target/loongarch/cpu.c +index 92dd50e15e..56e36d81b3 100644 +--- a/target/loongarch/cpu.c ++++ b/target/loongarch/cpu.c +@@ -653,7 +653,7 @@ void loongarch_cpu_dump_state(CPUState *cs, FILE *f, int flags) + qemu_fprintf(f, "EENTRY=%016" PRIx64 "\n", env->CSR_EENTRY); + qemu_fprintf(f, "PRCFG1=%016" PRIx64 ", PRCFG2=%016" PRIx64 "," + " PRCFG3=%016" PRIx64 "\n", +- env->CSR_PRCFG1, env->CSR_PRCFG3, env->CSR_PRCFG3); ++ env->CSR_PRCFG1, env->CSR_PRCFG2, env->CSR_PRCFG3); + qemu_fprintf(f, "TLBRENTRY=%016" PRIx64 "\n", env->CSR_TLBRENTRY); + qemu_fprintf(f, "TLBRBADV=%016" PRIx64 "\n", env->CSR_TLBRBADV); + qemu_fprintf(f, "TLBRERA=%016" PRIx64 "\n", env->CSR_TLBRERA); +diff --git a/tests/avocado/boot_linux_console.py b/tests/avocado/boot_linux_console.py +index ec07c64291..b54693869b 100644 +--- a/tests/avocado/boot_linux_console.py ++++ b/tests/avocado/boot_linux_console.py +@@ -542,12 +542,12 @@ def test_arm_cubieboard_initrd(self): + :avocado: tags=accel:tcg + """ + deb_url = ('https://apt.armbian.com/pool/main/l/' +- 'linux-5.10.16-sunxi/linux-image-current-sunxi_21.02.2_armhf.deb') +- deb_hash = '9fa84beda245cabf0b4fa84cf6eaa7738ead1da0' ++ 'linux-6.6.16/linux-image-current-sunxi_24.2.1_armhf__6.6.16-Seb3e-D6b4a-P2359-Ce96bHfe66-HK01ba-V014b-B067e-R448a.deb') ++ deb_hash = 'f7c3c8c5432f765445dc6e7eab02f3bbe668256b' + deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash) + kernel_path = self.extract_from_deb(deb_path, +- '/boot/vmlinuz-5.10.16-sunxi') +- dtb_path = '/usr/lib/linux-image-current-sunxi/sun4i-a10-cubieboard.dtb' ++ '/boot/vmlinuz-6.6.16-current-sunxi') ++ dtb_path = '/usr/lib/linux-image-6.6.16-current-sunxi/sun4i-a10-cubieboard.dtb' + dtb_path = self.extract_from_deb(deb_path, dtb_path) + initrd_url = ('https://github.com/groeck/linux-build-test/raw/' + '2eb0a73b5d5a28df3170c546ddaaa9757e1e0848/rootfs/' +@@ -583,12 +583,12 @@ def test_arm_cubieboard_sata(self): + :avocado: tags=accel:tcg + """ + deb_url = ('https://apt.armbian.com/pool/main/l/' +- 'linux-5.10.16-sunxi/linux-image-current-sunxi_21.02.2_armhf.deb') +- deb_hash = '9fa84beda245cabf0b4fa84cf6eaa7738ead1da0' ++ 'linux-6.6.16/linux-image-current-sunxi_24.2.1_armhf__6.6.16-Seb3e-D6b4a-P2359-Ce96bHfe66-HK01ba-V014b-B067e-R448a.deb') ++ deb_hash = 'f7c3c8c5432f765445dc6e7eab02f3bbe668256b' + deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash) + kernel_path = self.extract_from_deb(deb_path, +- '/boot/vmlinuz-5.10.16-sunxi') +- dtb_path = '/usr/lib/linux-image-current-sunxi/sun4i-a10-cubieboard.dtb' ++ '/boot/vmlinuz-6.6.16-current-sunxi') ++ dtb_path = '/usr/lib/linux-image-6.6.16-current-sunxi/sun4i-a10-cubieboard.dtb' + dtb_path = self.extract_from_deb(deb_path, dtb_path) + rootfs_url = ('https://github.com/groeck/linux-build-test/raw/' + '2eb0a73b5d5a28df3170c546ddaaa9757e1e0848/rootfs/' +@@ -713,12 +713,12 @@ def test_arm_orangepi(self): + :avocado: tags=accel:tcg + """ + deb_url = ('https://apt.armbian.com/pool/main/l/' +- 'linux-5.10.16-sunxi/linux-image-current-sunxi_21.02.2_armhf.deb') +- deb_hash = '9fa84beda245cabf0b4fa84cf6eaa7738ead1da0' ++ 'linux-6.6.16/linux-image-current-sunxi_24.2.1_armhf__6.6.16-Seb3e-D6b4a-P2359-Ce96bHfe66-HK01ba-V014b-B067e-R448a.deb') ++ deb_hash = 'f7c3c8c5432f765445dc6e7eab02f3bbe668256b' + deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash) + kernel_path = self.extract_from_deb(deb_path, +- '/boot/vmlinuz-5.10.16-sunxi') +- dtb_path = '/usr/lib/linux-image-current-sunxi/sun8i-h3-orangepi-pc.dtb' ++ '/boot/vmlinuz-6.6.16-current-sunxi') ++ dtb_path = '/usr/lib/linux-image-6.6.16-current-sunxi/sun8i-h3-orangepi-pc.dtb' + dtb_path = self.extract_from_deb(deb_path, dtb_path) + + self.vm.set_console() +@@ -739,12 +739,12 @@ def test_arm_orangepi_initrd(self): + :avocado: tags=machine:orangepi-pc + """ + deb_url = ('https://apt.armbian.com/pool/main/l/' +- 'linux-5.10.16-sunxi/linux-image-current-sunxi_21.02.2_armhf.deb') +- deb_hash = '9fa84beda245cabf0b4fa84cf6eaa7738ead1da0' ++ 'linux-6.6.16/linux-image-current-sunxi_24.2.1_armhf__6.6.16-Seb3e-D6b4a-P2359-Ce96bHfe66-HK01ba-V014b-B067e-R448a.deb') ++ deb_hash = 'f7c3c8c5432f765445dc6e7eab02f3bbe668256b' + deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash) + kernel_path = self.extract_from_deb(deb_path, +- '/boot/vmlinuz-5.10.16-sunxi') +- dtb_path = '/usr/lib/linux-image-current-sunxi/sun8i-h3-orangepi-pc.dtb' ++ '/boot/vmlinuz-6.6.16-current-sunxi') ++ dtb_path = '/usr/lib/linux-image-6.6.16-current-sunxi/sun8i-h3-orangepi-pc.dtb' + dtb_path = self.extract_from_deb(deb_path, dtb_path) + initrd_url = ('https://github.com/groeck/linux-build-test/raw/' + '2eb0a73b5d5a28df3170c546ddaaa9757e1e0848/rootfs/' +@@ -785,12 +785,12 @@ def test_arm_orangepi_sd(self): + self.require_netdev('user') + + deb_url = ('https://apt.armbian.com/pool/main/l/' +- 'linux-5.10.16-sunxi/linux-image-current-sunxi_21.02.2_armhf.deb') +- deb_hash = '9fa84beda245cabf0b4fa84cf6eaa7738ead1da0' ++ 'linux-6.6.16/linux-image-current-sunxi_24.2.1_armhf__6.6.16-Seb3e-D6b4a-P2359-Ce96bHfe66-HK01ba-V014b-B067e-R448a.deb') ++ deb_hash = 'f7c3c8c5432f765445dc6e7eab02f3bbe668256b' + deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash) + kernel_path = self.extract_from_deb(deb_path, +- '/boot/vmlinuz-5.10.16-sunxi') +- dtb_path = '/usr/lib/linux-image-current-sunxi/sun8i-h3-orangepi-pc.dtb' ++ '/boot/vmlinuz-6.6.16-current-sunxi') ++ dtb_path = '/usr/lib/linux-image-6.6.16-current-sunxi/sun8i-h3-orangepi-pc.dtb' + dtb_path = self.extract_from_deb(deb_path, dtb_path) + rootfs_url = ('http://storage.kernelci.org/images/rootfs/buildroot/' + 'buildroot-baseline/20221116.0/armel/rootfs.ext2.xz') +diff --git a/tests/avocado/replay_kernel.py b/tests/avocado/replay_kernel.py +index 00a26e4a0c..154de3ab5e 100644 +--- a/tests/avocado/replay_kernel.py ++++ b/tests/avocado/replay_kernel.py +@@ -185,12 +185,12 @@ def test_arm_cubieboard_initrd(self): + :avocado: tags=machine:cubieboard + """ + deb_url = ('https://apt.armbian.com/pool/main/l/' +- 'linux-5.10.16-sunxi/linux-image-current-sunxi_21.02.2_armhf.deb') +- deb_hash = '9fa84beda245cabf0b4fa84cf6eaa7738ead1da0' ++ 'linux-6.6.16/linux-image-current-sunxi_24.2.1_armhf__6.6.16-Seb3e-D6b4a-P2359-Ce96bHfe66-HK01ba-V014b-B067e-R448a.deb') ++ deb_hash = 'f7c3c8c5432f765445dc6e7eab02f3bbe668256b' + deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash) + kernel_path = self.extract_from_deb(deb_path, +- '/boot/vmlinuz-5.10.16-sunxi') +- dtb_path = '/usr/lib/linux-image-current-sunxi/sun4i-a10-cubieboard.dtb' ++ '/boot/vmlinuz-6.6.16-current-sunxi') ++ dtb_path = '/usr/lib/linux-image-6.6.16-current-sunxi/sun4i-a10-cubieboard.dtb' + dtb_path = self.extract_from_deb(deb_path, dtb_path) + initrd_url = ('https://github.com/groeck/linux-build-test/raw/' + '2eb0a73b5d5a28df3170c546ddaaa9757e1e0848/rootfs/' +diff --git a/ui/gtk-egl.c b/ui/gtk-egl.c +index 7ff9f1648c..b3d0354845 100644 +--- a/ui/gtk-egl.c ++++ b/ui/gtk-egl.c +@@ -96,7 +96,7 @@ void gd_egl_draw(VirtualConsole *vc) + #ifdef CONFIG_GBM + if (dmabuf) { + egl_dmabuf_create_fence(dmabuf); +- if (dmabuf->fence_fd > 0) { ++ if (dmabuf->fence_fd >= 0) { + qemu_set_fd_handler(dmabuf->fence_fd, gd_hw_gl_flushed, NULL, vc); + return; + } +diff --git a/ui/gtk-gl-area.c b/ui/gtk-gl-area.c +index 1605818bd1..c65e2a0d0c 100644 +--- a/ui/gtk-gl-area.c ++++ b/ui/gtk-gl-area.c +@@ -85,7 +85,7 @@ void gd_gl_area_draw(VirtualConsole *vc) + #ifdef CONFIG_GBM + if (dmabuf) { + egl_dmabuf_create_fence(dmabuf); +- if (dmabuf->fence_fd > 0) { ++ if (dmabuf->fence_fd >= 0) { + qemu_set_fd_handler(dmabuf->fence_fd, gd_hw_gl_flushed, NULL, vc); + return; + } +diff --git a/ui/gtk.c b/ui/gtk.c +index 283c41a1a1..17a34d37d9 100644 +--- a/ui/gtk.c ++++ b/ui/gtk.c +@@ -589,10 +589,12 @@ void gd_hw_gl_flushed(void *vcon) + VirtualConsole *vc = vcon; + QemuDmaBuf *dmabuf = vc->gfx.guest_fb.dmabuf; + +- qemu_set_fd_handler(dmabuf->fence_fd, NULL, NULL, NULL); +- close(dmabuf->fence_fd); +- dmabuf->fence_fd = -1; +- graphic_hw_gl_block(vc->gfx.dcl.con, false); ++ if (dmabuf->fence_fd >= 0) { ++ qemu_set_fd_handler(dmabuf->fence_fd, NULL, NULL, NULL); ++ close(dmabuf->fence_fd); ++ dmabuf->fence_fd = -1; ++ graphic_hw_gl_block(vc->gfx.dcl.con, false); ++ } + } + + /** DisplayState Callbacks (opengl version) **/ +@@ -871,7 +873,7 @@ static gboolean gd_motion_event(GtkWidget *widget, GdkEventMotion *motion, + int x, y; + int mx, my; + int fbh, fbw; +- int ww, wh, ws; ++ int ww, wh; + + if (!vc->gfx.ds) { + return TRUE; +@@ -879,11 +881,15 @@ static gboolean gd_motion_event(GtkWidget *widget, GdkEventMotion *motion, + + fbw = surface_width(vc->gfx.ds) * vc->gfx.scale_x; + fbh = surface_height(vc->gfx.ds) * vc->gfx.scale_y; +- + ww = gtk_widget_get_allocated_width(widget); + wh = gtk_widget_get_allocated_height(widget); +- ws = gtk_widget_get_scale_factor(widget); + ++ /* ++ * `widget` may not have the same size with the frame buffer. ++ * In such cases, some paddings are needed around the `vc`. ++ * To achieve that, `vc` will be displayed at (mx, my) ++ * so that it is displayed at the center of the widget. ++ */ + mx = my = 0; + if (ww > fbw) { + mx = (ww - fbw) / 2; +@@ -892,8 +898,12 @@ static gboolean gd_motion_event(GtkWidget *widget, GdkEventMotion *motion, + my = (wh - fbh) / 2; + } + +- x = (motion->x - mx) / vc->gfx.scale_x * ws; +- y = (motion->y - my) / vc->gfx.scale_y * ws; ++ /* ++ * `motion` is reported in `widget` coordinates ++ * so translating it to the coordinates in `vc`. ++ */ ++ x = (motion->x - mx) / vc->gfx.scale_x; ++ y = (motion->y - my) / vc->gfx.scale_y; + + if (qemu_input_is_absolute()) { + if (x < 0 || y < 0 || +diff --git a/ui/sdl2.c b/ui/sdl2.c +index d630459b78..fc7e8639c2 100644 +--- a/ui/sdl2.c ++++ b/ui/sdl2.c +@@ -857,6 +857,7 @@ static void sdl2_display_init(DisplayState *ds, DisplayOptions *o) + SDL_SetHint(SDL_HINT_ALLOW_ALT_TAB_WHILE_GRABBED, "0"); + #endif + SDL_SetHint(SDL_HINT_WINDOWS_NO_CLOSE_ON_ALT_F4, "1"); ++ SDL_EnableScreenSaver(); + memset(&info, 0, sizeof(info)); + SDL_VERSION(&info.version); + |