diff options
Diffstat (limited to 'debian/patches/v7.2.16.diff')
-rw-r--r-- | debian/patches/v7.2.16.diff | 1368 |
1 files changed, 1368 insertions, 0 deletions
diff --git a/debian/patches/v7.2.16.diff b/debian/patches/v7.2.16.diff new file mode 100644 index 00000000..e1aaf390 --- /dev/null +++ b/debian/patches/v7.2.16.diff @@ -0,0 +1,1368 @@ +Subject: v7.2.16 +Date: Sat Feb 8 14:26:26 2025 +0300 +From: Michael Tokarev <mjt@tls.msk.ru> +Forwarded: not-needed + +This is a difference between upstream qemu v7.2.15 +and upstream qemu v7.2.16. + + .cirrus.yml | 109 ---------------- + MAINTAINERS | 3 +- + VERSION | 2 +- + backends/cryptodev-vhost-user.c | 3 +- + block/ssh.c | 3 - + docs/about/removed-features.rst | 4 +- + hw/9pfs/9p.c | 12 +- + hw/core/qdev-properties-system.c | 54 +++++--- + hw/i386/acpi-build.c | 33 +++-- + hw/i386/x86.c | 2 +- + hw/intc/arm_gicv3_its.c | 44 +++---- + hw/intc/loongarch_extioi.c | 9 +- + hw/intc/openpic.c | 15 +-- + hw/net/virtio-net.c | 5 +- + hw/openrisc/openrisc_sim.c | 26 +++- + hw/pci/msix.c | 2 +- + hw/pci/pcie.c | 12 +- + hw/s390x/s390-virtio-ccw.c | 11 ++ + hw/scsi/megasas.c | 14 +-- + hw/usb/canokey.c | 6 +- + hw/usb/canokey.h | 4 - + hw/usb/hcd-xhci-pci.c | 1 + + include/qemu/bitmap.h | 8 ++ + include/qemu/bitops.h | 172 +++++++++++++++++++++++++- + meson.build | 2 +- + target/arm/sme_helper.c | 2 +- + target/i386/cpu.c | 3 +- + target/ppc/excp_helper.c | 7 ++ + tcg/riscv/tcg-target.c.inc | 2 +- + tests/data/acpi/pc/DSDT | Bin 6458 -> 6476 bytes + tests/data/acpi/pc/DSDT.acpierst | Bin 6418 -> 6436 bytes + tests/data/acpi/pc/DSDT.acpihmat | Bin 7783 -> 7801 bytes + tests/data/acpi/pc/DSDT.bridge | Bin 9532 -> 9550 bytes + tests/data/acpi/pc/DSDT.cphp | Bin 6922 -> 6940 bytes + tests/data/acpi/pc/DSDT.dimmpxm | Bin 8112 -> 8130 bytes + tests/data/acpi/pc/DSDT.hpbridge | Bin 6418 -> 6436 bytes + tests/data/acpi/pc/DSDT.ipmikcs | Bin 6530 -> 6548 bytes + tests/data/acpi/pc/DSDT.memhp | Bin 7817 -> 7835 bytes + tests/data/acpi/pc/DSDT.nohpet | Bin 6316 -> 6334 bytes + tests/data/acpi/pc/DSDT.numamem | Bin 6464 -> 6482 bytes + tests/data/acpi/pc/DSDT.roothp | Bin 6656 -> 6674 bytes + tests/data/acpi/q35/DSDT | Bin 8310 -> 8328 bytes + tests/data/acpi/q35/DSDT.acpierst | Bin 8327 -> 8345 bytes + tests/data/acpi/q35/DSDT.acpihmat | Bin 9635 -> 9653 bytes + tests/data/acpi/q35/DSDT.acpihmat-noinitiator | Bin 8589 -> 8607 bytes + tests/data/acpi/q35/DSDT.applesmc | Bin 8356 -> 8374 bytes + tests/data/acpi/q35/DSDT.bridge | Bin 11439 -> 11457 bytes + tests/data/acpi/q35/DSDT.core-count2 | Bin 32450 -> 32468 bytes + tests/data/acpi/q35/DSDT.cphp | Bin 8774 -> 8792 bytes + tests/data/acpi/q35/DSDT.cxl | Bin 9637 -> 9655 bytes + tests/data/acpi/q35/DSDT.dimmpxm | Bin 9964 -> 9982 bytes + tests/data/acpi/q35/DSDT.ipmibt | Bin 8385 -> 8403 bytes + tests/data/acpi/q35/DSDT.ipmismbus | Bin 8398 -> 8416 bytes + tests/data/acpi/q35/DSDT.ivrs | Bin 8327 -> 8345 bytes + tests/data/acpi/q35/DSDT.memhp | Bin 9669 -> 9687 bytes + tests/data/acpi/q35/DSDT.mmio64 | Bin 9440 -> 9458 bytes + tests/data/acpi/q35/DSDT.multi-bridge | Bin 8630 -> 8648 bytes + tests/data/acpi/q35/DSDT.nohpet | Bin 8168 -> 8186 bytes + tests/data/acpi/q35/DSDT.numamem | Bin 8316 -> 8334 bytes + tests/data/acpi/q35/DSDT.pvpanic-isa | Bin 8411 -> 8429 bytes + tests/data/acpi/q35/DSDT.tis.tpm12 | Bin 8916 -> 8934 bytes + tests/data/acpi/q35/DSDT.tis.tpm2 | Bin 8942 -> 8960 bytes + tests/data/acpi/q35/DSDT.viot | Bin 9419 -> 9437 bytes + tests/data/acpi/q35/DSDT.xapic | Bin 35673 -> 35691 bytes + tests/qtest/fuzz/generic_fuzz_configs.h | 3 +- + tests/qtest/libqos/virtio-9p-client.c | 3 +- + tests/qtest/virtio-9p-test.c | 46 +++++++ + 67 files changed, 393 insertions(+), 229 deletions(-) + +diff --git a/.cirrus.yml b/.cirrus.yml +deleted file mode 100644 +index 4895987da4..0000000000 +--- a/.cirrus.yml ++++ /dev/null +@@ -1,109 +0,0 @@ +-env: +- CIRRUS_CLONE_DEPTH: 1 +- +-windows_msys2_task: +- timeout_in: 90m +- windows_container: +- image: cirrusci/windowsservercore:2019 +- os_version: 2019 +- cpu: 8 +- memory: 8G +- env: +- CIRRUS_SHELL: powershell +- MSYS: winsymlinks:native +- MSYSTEM: MINGW64 +- MSYS2_URL: https://github.com/msys2/msys2-installer/releases/download/2022-06-03/msys2-base-x86_64-20220603.sfx.exe +- MSYS2_FINGERPRINT: 0 +- MSYS2_PACKAGES: " +- diffutils git grep make pkg-config sed +- mingw-w64-x86_64-python +- mingw-w64-x86_64-python-sphinx +- mingw-w64-x86_64-toolchain +- mingw-w64-x86_64-SDL2 +- mingw-w64-x86_64-SDL2_image +- mingw-w64-x86_64-gtk3 +- mingw-w64-x86_64-glib2 +- mingw-w64-x86_64-ninja +- mingw-w64-x86_64-jemalloc +- mingw-w64-x86_64-lzo2 +- mingw-w64-x86_64-zstd +- mingw-w64-x86_64-libjpeg-turbo +- mingw-w64-x86_64-pixman +- mingw-w64-x86_64-libgcrypt +- mingw-w64-x86_64-libpng +- mingw-w64-x86_64-libssh +- mingw-w64-x86_64-snappy +- mingw-w64-x86_64-libusb +- mingw-w64-x86_64-usbredir +- mingw-w64-x86_64-libtasn1 +- mingw-w64-x86_64-nettle +- mingw-w64-x86_64-cyrus-sasl +- mingw-w64-x86_64-curl +- mingw-w64-x86_64-gnutls +- mingw-w64-x86_64-libnfs +- " +- CHERE_INVOKING: 1 +- msys2_cache: +- folder: C:\tools\archive +- reupload_on_changes: false +- # These env variables are used to generate fingerprint to trigger the cache procedure +- # If wanna to force re-populate msys2, increase MSYS2_FINGERPRINT +- fingerprint_script: +- - | +- echo $env:CIRRUS_TASK_NAME +- echo $env:MSYS2_URL +- echo $env:MSYS2_FINGERPRINT +- echo $env:MSYS2_PACKAGES +- populate_script: +- - | +- md -Force C:\tools\archive\pkg +- $start_time = Get-Date +- bitsadmin /transfer msys_download /dynamic /download /priority FOREGROUND $env:MSYS2_URL C:\tools\archive\base.exe +- Write-Output "Download time taken: $((Get-Date).Subtract($start_time))" +- cd C:\tools +- C:\tools\archive\base.exe -y +- del -Force C:\tools\archive\base.exe +- Write-Output "Base install time taken: $((Get-Date).Subtract($start_time))" +- $start_time = Get-Date +- +- ((Get-Content -path C:\tools\msys64\etc\\post-install\\07-pacman-key.post -Raw) -replace '--refresh-keys', '--version') | Set-Content -Path C:\tools\msys64\etc\\post-install\\07-pacman-key.post +- C:\tools\msys64\usr\bin\bash.exe -lc "sed -i 's/^CheckSpace/#CheckSpace/g' /etc/pacman.conf" +- C:\tools\msys64\usr\bin\bash.exe -lc "export" +- C:\tools\msys64\usr\bin\pacman.exe --noconfirm -Sy +- echo Y | C:\tools\msys64\usr\bin\pacman.exe --noconfirm -Suu --overwrite=* +- taskkill /F /FI "MODULES eq msys-2.0.dll" +- tasklist +- C:\tools\msys64\usr\bin\bash.exe -lc "mv -f /etc/pacman.conf.pacnew /etc/pacman.conf || true" +- C:\tools\msys64\usr\bin\bash.exe -lc "pacman --noconfirm -Syuu --overwrite=*" +- Write-Output "Core install time taken: $((Get-Date).Subtract($start_time))" +- $start_time = Get-Date +- +- C:\tools\msys64\usr\bin\bash.exe -lc "pacman --noconfirm -S --needed $env:MSYS2_PACKAGES" +- Write-Output "Package install time taken: $((Get-Date).Subtract($start_time))" +- $start_time = Get-Date +- +- del -Force -ErrorAction SilentlyContinue C:\tools\msys64\etc\mtab +- del -Force -ErrorAction SilentlyContinue C:\tools\msys64\dev\fd +- del -Force -ErrorAction SilentlyContinue C:\tools\msys64\dev\stderr +- del -Force -ErrorAction SilentlyContinue C:\tools\msys64\dev\stdin +- del -Force -ErrorAction SilentlyContinue C:\tools\msys64\dev\stdout +- del -Force -Recurse -ErrorAction SilentlyContinue C:\tools\msys64\var\cache\pacman\pkg +- tar cf C:\tools\archive\msys64.tar -C C:\tools\ msys64 +- +- Write-Output "Package archive time taken: $((Get-Date).Subtract($start_time))" +- del -Force -Recurse -ErrorAction SilentlyContinue c:\tools\msys64 +- install_script: +- - | +- $start_time = Get-Date +- cd C:\tools +- ls C:\tools\archive\msys64.tar +- tar xf C:\tools\archive\msys64.tar +- Write-Output "Extract msys2 time taken: $((Get-Date).Subtract($start_time))" +- script: +- - C:\tools\msys64\usr\bin\bash.exe -lc "mkdir build" +- - C:\tools\msys64\usr\bin\bash.exe -lc "cd build && ../configure --python=python3" +- - C:\tools\msys64\usr\bin\bash.exe -lc "cd build && make -j8" +- - exit $LastExitCode +- test_script: +- - C:\tools\msys64\usr\bin\bash.exe -lc "cd build && make V=1 check" +- - exit $LastExitCode +diff --git a/MAINTAINERS b/MAINTAINERS +index e688db1f55..83c4eacc66 100644 +--- a/MAINTAINERS ++++ b/MAINTAINERS +@@ -3731,8 +3731,7 @@ W: https://cirrus-ci.com/github/qemu/qemu + Windows Hosted Continuous Integration + M: Yonggang Luo <luoyonggang@gmail.com> + S: Maintained +-F: .cirrus.yml +-W: https://cirrus-ci.com/github/qemu/qemu ++F: .gitlab-ci.d/windows.yml + + Guest Test Compilation Support + M: Alex Bennée <alex.bennee@linaro.org> +diff --git a/VERSION b/VERSION +index cc53d22108..a1f5232276 100644 +--- a/VERSION ++++ b/VERSION +@@ -1 +1 @@ +-7.2.15 ++7.2.16 +diff --git a/backends/cryptodev-vhost-user.c b/backends/cryptodev-vhost-user.c +index ab3028e045..518f18b838 100644 +--- a/backends/cryptodev-vhost-user.c ++++ b/backends/cryptodev-vhost-user.c +@@ -283,8 +283,7 @@ static int cryptodev_vhost_user_create_session( + break; + + 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; + } + +diff --git a/block/ssh.c b/block/ssh.c +index 04726d4ecb..c90d705453 100644 +--- a/block/ssh.c ++++ b/block/ssh.c +@@ -859,9 +859,6 @@ static int ssh_file_open(BlockDriverState *bs, QDict *options, int bdrv_flags, + goto err; + } + +- /* Go non-blocking. */ +- ssh_set_blocking(s->session, 0); +- + if (s->attrs->type == SSH_FILEXFER_TYPE_REGULAR) { + bs->supported_truncate_flags = BDRV_REQ_ZERO_WRITE; + } +diff --git a/docs/about/removed-features.rst b/docs/about/removed-features.rst +index 63df9848fd..93cc6e47b6 100644 +--- a/docs/about/removed-features.rst ++++ b/docs/about/removed-features.rst +@@ -702,8 +702,8 @@ reason the maintainers strongly suspected no one actually used it. + TCG introspection features + -------------------------- + +-TCG trace-events (since 6.2) +-'''''''''''''''''''''''''''' ++TCG trace-events (removed in 7.0) ++''''''''''''''''''''''''''''''''' + + The ability to add new TCG trace points had bit rotted and as the + feature can be replicated with TCG plugins it was removed. If +diff --git a/hw/9pfs/9p.c b/hw/9pfs/9p.c +index 51ad5bfb11..d950ad6de6 100644 +--- a/hw/9pfs/9p.c ++++ b/hw/9pfs/9p.c +@@ -1605,11 +1605,13 @@ static void coroutine_fn v9fs_getattr(void *opaque) + retval = -ENOENT; + goto out_nofid; + } +- /* +- * Currently we only support BASIC fields in stat, so there is no +- * need to look at request_mask. +- */ +- retval = v9fs_co_lstat(pdu, &fidp->path, &stbuf); ++ if ((fidp->fid_type == P9_FID_FILE && fidp->fs.fd != -1) || ++ (fidp->fid_type == P9_FID_DIR && fidp->fs.dir.stream)) ++ { ++ retval = v9fs_co_fstat(pdu, fidp, &stbuf); ++ } else { ++ retval = v9fs_co_lstat(pdu, &fidp->path, &stbuf); ++ } + if (retval < 0) { + goto out; + } +diff --git a/hw/core/qdev-properties-system.c b/hw/core/qdev-properties-system.c +index a91f60567a..d350789e76 100644 +--- a/hw/core/qdev-properties-system.c ++++ b/hw/core/qdev-properties-system.c +@@ -740,39 +740,57 @@ static void set_pci_devfn(Object *obj, Visitor *v, const char *name, + void *opaque, Error **errp) + { + Property *prop = opaque; ++ g_autofree GenericAlternate *alt; + int32_t value, *ptr = object_field_prop_ptr(obj, prop); + unsigned int slot, fn, n; +- char *str; ++ g_autofree char *str = NULL; ++ ++ if (!visit_start_alternate(v, name, &alt, sizeof(*alt), errp)) { ++ return; ++ } ++ ++ switch (alt->type) { ++ case QTYPE_QSTRING: ++ if (!visit_type_str(v, name, &str, errp)) { ++ goto out; ++ } ++ ++ if (sscanf(str, "%x.%x%n", &slot, &fn, &n) != 2) { ++ fn = 0; ++ if (sscanf(str, "%x%n", &slot, &n) != 1) { ++ goto invalid; ++ } ++ } ++ if (str[n] != '\0' || fn > 7 || slot > 31) { ++ goto invalid; ++ } ++ *ptr = slot << 3 | fn; ++ break; + +- if (!visit_type_str(v, name, &str, NULL)) { ++ case QTYPE_QNUM: + if (!visit_type_int32(v, name, &value, errp)) { +- return; ++ goto out; + } + if (value < -1 || value > 255) { + error_setg(errp, QERR_INVALID_PARAMETER_VALUE, + name ? name : "null", "a value between -1 and 255"); +- return; ++ goto out; + } + *ptr = value; +- return; +- } ++ break; + +- if (sscanf(str, "%x.%x%n", &slot, &fn, &n) != 2) { +- fn = 0; +- if (sscanf(str, "%x%n", &slot, &n) != 1) { +- goto invalid; +- } +- } +- if (str[n] != '\0' || fn > 7 || slot > 31) { +- goto invalid; ++ default: ++ error_setg(errp, "Invalid parameter type for '%s', expected int or str", ++ name ? name : "null"); ++ goto out; + } +- *ptr = slot << 3 | fn; +- g_free(str); +- return; ++ ++ goto out; + + invalid: + error_set_from_qdev_prop_error(errp, EINVAL, obj, name, str); +- g_free(str); ++out: ++ visit_end_alternate(v, (void **) &alt); + } + + static int print_pci_devfn(Object *obj, Property *prop, char *dest, +diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c +index f9cdacadb1..79b68f2218 100644 +--- a/hw/i386/acpi-build.c ++++ b/hw/i386/acpi-build.c +@@ -541,6 +541,7 @@ static Aml *aml_pci_pdsm(void) + Aml *acpi_index = aml_local(2); + Aml *zero = aml_int(0); + Aml *one = aml_int(1); ++ Aml *not_supp = aml_int(0xFFFFFFFF); + Aml *func = aml_arg(2); + Aml *rev = aml_arg(1); + Aml *params = aml_arg(4); +@@ -586,7 +587,7 @@ static Aml *aml_pci_pdsm(void) + */ + ifctx1 = aml_if(aml_lnot( + aml_or(aml_equal(acpi_index, zero), +- aml_equal(acpi_index, aml_int(0xFFFFFFFF)), NULL) ++ aml_equal(acpi_index, not_supp), NULL) + )); + { + /* have supported functions */ +@@ -612,18 +613,30 @@ static Aml *aml_pci_pdsm(void) + { + Aml *pkg = aml_package(2); + +- aml_append(pkg, zero); +- /* +- * optional, if not impl. should return null string +- */ +- aml_append(pkg, aml_string("%s", "")); +- aml_append(ifctx, aml_store(pkg, ret)); +- + aml_append(ifctx, aml_store(aml_call2("AIDX", bnum, sunum), acpi_index)); ++ aml_append(ifctx, aml_store(pkg, ret)); + /* +- * update acpi-index to actual value ++ * Windows calls func=7 without checking if it's available, ++ * as workaround Microsoft has suggested to return invalid for func7 ++ * Package, so return 2 elements package but only initialize elements ++ * when acpi_index is supported and leave them uninitialized, which ++ * leads elements to being Uninitialized ObjectType and should trip ++ * Windows into discarding result as an unexpected and prevent setting ++ * bogus 'PCI Label' on the device. + */ +- aml_append(ifctx, aml_store(acpi_index, aml_index(ret, zero))); ++ ifctx1 = aml_if(aml_lnot(aml_lor( ++ aml_equal(acpi_index, zero), aml_equal(acpi_index, not_supp) ++ ))); ++ { ++ aml_append(ifctx1, aml_store(acpi_index, aml_index(ret, zero))); ++ /* ++ * optional, if not impl. should return null string ++ */ ++ aml_append(ifctx1, aml_store(aml_string("%s", ""), ++ aml_index(ret, one))); ++ } ++ aml_append(ifctx, ifctx1); ++ + aml_append(ifctx, aml_return(ret)); + } + +diff --git a/hw/i386/x86.c b/hw/i386/x86.c +index 80be3032cc..a2925821c5 100644 +--- a/hw/i386/x86.c ++++ b/hw/i386/x86.c +@@ -1084,7 +1084,7 @@ void x86_load_linux(X86MachineState *x86ms, + * kernel on the other side of the fw_cfg interface matches the hash of the + * file the user passed in. + */ +- if (!sev_enabled()) { ++ if (!sev_enabled() && protocol > 0) { + memcpy(setup, header, MIN(sizeof(header), setup_size)); + } + +diff --git a/hw/intc/arm_gicv3_its.c b/hw/intc/arm_gicv3_its.c +index 2ff21ed6bb..05b63a0848 100644 +--- a/hw/intc/arm_gicv3_its.c ++++ b/hw/intc/arm_gicv3_its.c +@@ -468,7 +468,7 @@ static ItsCmdResult lookup_vte(GICv3ITSState *s, const char *who, + static ItsCmdResult process_its_cmd_phys(GICv3ITSState *s, const ITEntry *ite, + int irqlevel) + { +- CTEntry cte; ++ CTEntry cte = {}; + ItsCmdResult cmdres; + + cmdres = lookup_cte(s, __func__, ite->icid, &cte); +@@ -482,7 +482,7 @@ static ItsCmdResult process_its_cmd_phys(GICv3ITSState *s, const ITEntry *ite, + static ItsCmdResult process_its_cmd_virt(GICv3ITSState *s, const ITEntry *ite, + int irqlevel) + { +- VTEntry vte; ++ VTEntry vte = {}; + ItsCmdResult cmdres; + + cmdres = lookup_vte(s, __func__, ite->vpeid, &vte); +@@ -517,8 +517,8 @@ static ItsCmdResult process_its_cmd_virt(GICv3ITSState *s, const ITEntry *ite, + static ItsCmdResult do_process_its_cmd(GICv3ITSState *s, uint32_t devid, + uint32_t eventid, ItsCmdType cmd) + { +- DTEntry dte; +- ITEntry ite; ++ DTEntry dte = {}; ++ ITEntry ite = {}; + ItsCmdResult cmdres; + int irqlevel; + +@@ -586,8 +586,8 @@ static ItsCmdResult process_mapti(GICv3ITSState *s, const uint64_t *cmdpkt, + uint32_t pIntid = 0; + uint64_t num_eventids; + uint16_t icid = 0; +- DTEntry dte; +- ITEntry ite; ++ DTEntry dte = {}; ++ ITEntry ite = {}; + + devid = (cmdpkt[0] & DEVID_MASK) >> DEVID_SHIFT; + eventid = cmdpkt[1] & EVENTID_MASK; +@@ -654,8 +654,8 @@ static ItsCmdResult process_vmapti(GICv3ITSState *s, const uint64_t *cmdpkt, + { + uint32_t devid, eventid, vintid, doorbell, vpeid; + uint32_t num_eventids; +- DTEntry dte; +- ITEntry ite; ++ DTEntry dte = {}; ++ ITEntry ite = {}; + + if (!its_feature_virtual(s)) { + return CMD_CONTINUE; +@@ -764,7 +764,7 @@ static bool update_cte(GICv3ITSState *s, uint16_t icid, const CTEntry *cte) + static ItsCmdResult process_mapc(GICv3ITSState *s, const uint64_t *cmdpkt) + { + uint16_t icid; +- CTEntry cte; ++ CTEntry cte = {}; + + icid = cmdpkt[2] & ICID_MASK; + cte.valid = cmdpkt[2] & CMD_FIELD_VALID_MASK; +@@ -825,7 +825,7 @@ static bool update_dte(GICv3ITSState *s, uint32_t devid, const DTEntry *dte) + static ItsCmdResult process_mapd(GICv3ITSState *s, const uint64_t *cmdpkt) + { + uint32_t devid; +- DTEntry dte; ++ DTEntry dte = {}; + + devid = (cmdpkt[0] & DEVID_MASK) >> DEVID_SHIFT; + dte.size = cmdpkt[1] & SIZE_MASK; +@@ -889,9 +889,9 @@ static ItsCmdResult process_movi(GICv3ITSState *s, const uint64_t *cmdpkt) + { + uint32_t devid, eventid; + uint16_t new_icid; +- DTEntry dte; +- CTEntry old_cte, new_cte; +- ITEntry old_ite; ++ DTEntry dte = {}; ++ CTEntry old_cte = {}, new_cte = {}; ++ ITEntry old_ite = {}; + ItsCmdResult cmdres; + + devid = FIELD_EX64(cmdpkt[0], MOVI_0, DEVICEID); +@@ -968,7 +968,7 @@ static bool update_vte(GICv3ITSState *s, uint32_t vpeid, const VTEntry *vte) + + static ItsCmdResult process_vmapp(GICv3ITSState *s, const uint64_t *cmdpkt) + { +- VTEntry vte; ++ VTEntry vte = {}; + uint32_t vpeid; + + if (!its_feature_virtual(s)) { +@@ -1033,7 +1033,7 @@ static void vmovp_callback(gpointer data, gpointer opaque) + */ + GICv3ITSState *s = data; + VmovpCallbackData *cbdata = opaque; +- VTEntry vte; ++ VTEntry vte = {}; + ItsCmdResult cmdres; + + cmdres = lookup_vte(s, __func__, cbdata->vpeid, &vte); +@@ -1088,9 +1088,9 @@ static ItsCmdResult process_vmovi(GICv3ITSState *s, const uint64_t *cmdpkt) + { + uint32_t devid, eventid, vpeid, doorbell; + bool doorbell_valid; +- DTEntry dte; +- ITEntry ite; +- VTEntry old_vte, new_vte; ++ DTEntry dte = {}; ++ ITEntry ite = {}; ++ VTEntry old_vte = {}, new_vte = {}; + ItsCmdResult cmdres; + + if (!its_feature_virtual(s)) { +@@ -1189,10 +1189,10 @@ static ItsCmdResult process_vinvall(GICv3ITSState *s, const uint64_t *cmdpkt) + static ItsCmdResult process_inv(GICv3ITSState *s, const uint64_t *cmdpkt) + { + uint32_t devid, eventid; +- ITEntry ite; +- DTEntry dte; +- CTEntry cte; +- VTEntry vte; ++ ITEntry ite = {}; ++ DTEntry dte = {}; ++ CTEntry cte = {}; ++ VTEntry vte = {}; + ItsCmdResult cmdres; + + devid = FIELD_EX64(cmdpkt[0], INV_0, DEVICEID); +diff --git a/hw/intc/loongarch_extioi.c b/hw/intc/loongarch_extioi.c +index 4b8ec3f28a..fe17c7e0b1 100644 +--- a/hw/intc/loongarch_extioi.c ++++ b/hw/intc/loongarch_extioi.c +@@ -56,14 +56,9 @@ static void extioi_setirq(void *opaque, int irq, int level) + LoongArchExtIOI *s = LOONGARCH_EXTIOI(opaque); + trace_loongarch_extioi_setirq(irq, level); + if (level) { +- /* +- * s->isr should be used in vmstate structure, +- * but it not support 'unsigned long', +- * so we have to switch it. +- */ +- set_bit(irq, (unsigned long *)s->isr); ++ set_bit32(irq, s->isr); + } else { +- clear_bit(irq, (unsigned long *)s->isr); ++ clear_bit32(irq, s->isr); + } + extioi_update_irq(s, irq, level); + } +diff --git a/hw/intc/openpic.c b/hw/intc/openpic.c +index c757adbe53..adc79abbe5 100644 +--- a/hw/intc/openpic.c ++++ b/hw/intc/openpic.c +@@ -1035,13 +1035,14 @@ static void openpic_cpu_write_internal(void *opaque, hwaddr addr, + s_IRQ = IRQ_get_next(opp, &dst->servicing); + /* Check queued interrupts. */ + n_IRQ = IRQ_get_next(opp, &dst->raised); +- src = &opp->src[n_IRQ]; +- if (n_IRQ != -1 && +- (s_IRQ == -1 || +- IVPR_PRIORITY(src->ivpr) > dst->servicing.priority)) { +- DPRINTF("Raise OpenPIC INT output cpu %d irq %d", +- idx, n_IRQ); +- qemu_irq_raise(opp->dst[idx].irqs[OPENPIC_OUTPUT_INT]); ++ if (n_IRQ != -1) { ++ src = &opp->src[n_IRQ]; ++ if (s_IRQ == -1 || ++ IVPR_PRIORITY(src->ivpr) > dst->servicing.priority) { ++ DPRINTF("Raise OpenPIC INT output cpu %d irq %d", ++ idx, n_IRQ); ++ qemu_irq_raise(opp->dst[idx].irqs[OPENPIC_OUTPUT_INT]); ++ } + } + break; + default: +diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c +index 925a5c319e..204a80ec71 100644 +--- a/hw/net/virtio-net.c ++++ b/hw/net/virtio-net.c +@@ -1647,8 +1647,11 @@ static void virtio_net_hdr_swap(VirtIODevice *vdev, struct virtio_net_hdr *hdr) + static void work_around_broken_dhclient(struct virtio_net_hdr *hdr, + uint8_t *buf, size_t size) + { ++ size_t csum_size = ETH_HLEN + sizeof(struct ip_header) + ++ sizeof(struct udp_header); ++ + if ((hdr->flags & VIRTIO_NET_HDR_F_NEEDS_CSUM) && /* missing csum */ +- (size > 27 && size < 1500) && /* normal sized MTU */ ++ (size >= csum_size && size < 1500) && /* normal sized MTU */ + (buf[12] == 0x08 && buf[13] == 0x00) && /* ethertype == IPv4 */ + (buf[23] == 17) && /* ip.protocol == UDP */ + (buf[34] == 0 && buf[35] == 67)) { /* udp.srcport == bootps */ +diff --git a/hw/openrisc/openrisc_sim.c b/hw/openrisc/openrisc_sim.c +index 35da123aef..dc1fea8cd8 100644 +--- a/hw/openrisc/openrisc_sim.c ++++ b/hw/openrisc/openrisc_sim.c +@@ -248,7 +248,7 @@ static void openrisc_sim_serial_init(Or1ksimState *state, hwaddr base, + void *fdt = state->fdt; + char *nodename; + qemu_irq serial_irq; +- char alias[sizeof("uart0")]; ++ char alias[sizeof("serial0")]; + int i; + + if (num_cpus > 1) { +@@ -263,7 +263,7 @@ static void openrisc_sim_serial_init(Or1ksimState *state, hwaddr base, + serial_irq = get_cpu_irq(cpus, 0, irq_pin); + } + serial_mm_init(get_system_memory(), base, 0, serial_irq, 115200, +- serial_hd(OR1KSIM_UART_COUNT - uart_idx - 1), ++ serial_hd(uart_idx), + DEVICE_NATIVE_ENDIAN); + + /* Add device tree node for serial. */ +@@ -275,10 +275,13 @@ static void openrisc_sim_serial_init(Or1ksimState *state, hwaddr base, + qemu_fdt_setprop_cell(fdt, nodename, "clock-frequency", OR1KSIM_CLK_MHZ); + qemu_fdt_setprop(fdt, nodename, "big-endian", NULL, 0); + +- /* The /chosen node is created during fdt creation. */ +- qemu_fdt_setprop_string(fdt, "/chosen", "stdout-path", nodename); +- snprintf(alias, sizeof(alias), "uart%d", uart_idx); ++ if (uart_idx == 0) { ++ /* The /chosen node is created during fdt creation. */ ++ qemu_fdt_setprop_string(fdt, "/chosen", "stdout-path", nodename); ++ } ++ snprintf(alias, sizeof(alias), "serial%d", uart_idx); + qemu_fdt_setprop_string(fdt, "/aliases", alias, nodename); ++ + g_free(nodename); + } + +@@ -326,11 +329,22 @@ static void openrisc_sim_init(MachineState *machine) + smp_cpus, cpus, OR1KSIM_OMPIC_IRQ); + } + +- for (n = 0; n < OR1KSIM_UART_COUNT; ++n) ++ /* ++ * We create the UART nodes starting with the highest address and ++ * working downwards, because in QEMU the DTB nodes end up in the ++ * DTB in reverse order of creation. Correctly-written guest software ++ * will not care about the node order (it will look at stdout-path ++ * or the alias nodes), but for the benefit of guest software which ++ * just looks for the first UART node in the DTB, make sure the ++ * lowest-address UART (which is QEMU's first serial port) appears ++ * first in the DTB. ++ */ ++ for (n = OR1KSIM_UART_COUNT - 1; n >= 0; n--) { + openrisc_sim_serial_init(state, or1ksim_memmap[OR1KSIM_UART].base + + or1ksim_memmap[OR1KSIM_UART].size * n, + or1ksim_memmap[OR1KSIM_UART].size, + smp_cpus, cpus, OR1KSIM_UART_IRQ, n); ++ } + + load_addr = openrisc_load_kernel(ram_size, kernel_filename, + &boot_info.bootstrap_pc); +diff --git a/hw/pci/msix.c b/hw/pci/msix.c +index 4b258566d4..20e39e51b4 100644 +--- a/hw/pci/msix.c ++++ b/hw/pci/msix.c +@@ -241,7 +241,7 @@ static uint64_t msix_pba_mmio_read(void *opaque, hwaddr addr, + PCIDevice *dev = opaque; + if (dev->msix_vector_poll_notifier) { + unsigned vector_start = addr * 8; +- unsigned vector_end = MIN(addr + size * 8, dev->msix_entries_nr); ++ unsigned vector_end = MIN((addr + size) * 8, dev->msix_entries_nr); + dev->msix_vector_poll_notifier(dev, vector_start, vector_end); + } + +diff --git a/hw/pci/pcie.c b/hw/pci/pcie.c +index 68a62da0b5..9ffc625cc2 100644 +--- a/hw/pci/pcie.c ++++ b/hw/pci/pcie.c +@@ -999,18 +999,22 @@ void pcie_sync_bridge_lnk(PCIDevice *bridge_dev) + if ((lnksta & PCI_EXP_LNKSTA_NLW) > (lnkcap & PCI_EXP_LNKCAP_MLW)) { + lnksta &= ~PCI_EXP_LNKSTA_NLW; + lnksta |= lnkcap & PCI_EXP_LNKCAP_MLW; +- } else if (!(lnksta & PCI_EXP_LNKSTA_NLW)) { +- lnksta |= QEMU_PCI_EXP_LNKSTA_NLW(QEMU_PCI_EXP_LNK_X1); + } + + if ((lnksta & PCI_EXP_LNKSTA_CLS) > (lnkcap & PCI_EXP_LNKCAP_SLS)) { + lnksta &= ~PCI_EXP_LNKSTA_CLS; + lnksta |= lnkcap & PCI_EXP_LNKCAP_SLS; +- } else if (!(lnksta & PCI_EXP_LNKSTA_CLS)) { +- lnksta |= QEMU_PCI_EXP_LNKSTA_CLS(QEMU_PCI_EXP_LNK_2_5GT); + } + } + ++ if (!(lnksta & PCI_EXP_LNKSTA_NLW)) { ++ lnksta |= QEMU_PCI_EXP_LNKSTA_NLW(QEMU_PCI_EXP_LNK_X1); ++ } ++ ++ if (!(lnksta & PCI_EXP_LNKSTA_CLS)) { ++ lnksta |= QEMU_PCI_EXP_LNKSTA_CLS(QEMU_PCI_EXP_LNK_2_5GT); ++ } ++ + pci_word_test_and_clear_mask(exp_cap + PCI_EXP_LNKSTA, + PCI_EXP_LNKSTA_CLS | PCI_EXP_LNKSTA_NLW); + pci_word_test_and_set_mask(exp_cap + PCI_EXP_LNKSTA, lnksta & +diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c +index 16899a1814..e163ff7d05 100644 +--- a/hw/s390x/s390-virtio-ccw.c ++++ b/hw/s390x/s390-virtio-ccw.c +@@ -171,6 +171,17 @@ static void s390_memory_init(MemoryRegion *ram) + { + MemoryRegion *sysmem = get_system_memory(); + ++ if (!QEMU_IS_ALIGNED(memory_region_size(ram), 1 * MiB)) { ++ /* ++ * SCLP cannot possibly expose smaller granularity right now and KVM ++ * cannot handle smaller granularity. As we don't support NUMA, the ++ * region size directly corresponds to machine->ram_size, and the region ++ * is a single RAM memory region. ++ */ ++ error_report("ram size must be multiples of 1 MiB"); ++ exit(EXIT_FAILURE); ++ } ++ + /* allocate RAM for core */ + memory_region_add_subregion(sysmem, 0, ram); + +diff --git a/hw/scsi/megasas.c b/hw/scsi/megasas.c +index 9cbbb16121..d624866bb6 100644 +--- a/hw/scsi/megasas.c ++++ b/hw/scsi/megasas.c +@@ -1780,7 +1780,7 @@ static int megasas_handle_io(MegasasState *s, MegasasCmd *cmd, int frame_cmd) + uint8_t cdb[16]; + int len; + struct SCSIDevice *sdev = NULL; +- int target_id, lun_id, cdb_len; ++ int target_id, lun_id; + + lba_count = le32_to_cpu(cmd->frame->io.header.data_len); + lba_start_lo = le32_to_cpu(cmd->frame->io.lba_lo); +@@ -1789,7 +1789,6 @@ static int megasas_handle_io(MegasasState *s, MegasasCmd *cmd, int frame_cmd) + + target_id = cmd->frame->header.target_id; + lun_id = cmd->frame->header.lun_id; +- cdb_len = cmd->frame->header.cdb_len; + + if (target_id < MFI_MAX_LD && lun_id == 0) { + sdev = scsi_device_find(&s->bus, 0, target_id, lun_id); +@@ -1804,15 +1803,6 @@ static int megasas_handle_io(MegasasState *s, MegasasCmd *cmd, int frame_cmd) + return MFI_STAT_DEVICE_NOT_FOUND; + } + +- if (cdb_len > 16) { +- trace_megasas_scsi_invalid_cdb_len( +- mfi_frame_desc(frame_cmd), 1, target_id, lun_id, cdb_len); +- megasas_write_sense(cmd, SENSE_CODE(INVALID_OPCODE)); +- cmd->frame->header.scsi_status = CHECK_CONDITION; +- s->event_count++; +- return MFI_STAT_SCSI_DONE_WITH_ERROR; +- } +- + cmd->iov_size = lba_count * sdev->blocksize; + if (megasas_map_sgl(s, cmd, &cmd->frame->io.sgl)) { + megasas_write_sense(cmd, SENSE_CODE(TARGET_FAILURE)); +@@ -1823,7 +1813,7 @@ static int megasas_handle_io(MegasasState *s, MegasasCmd *cmd, int frame_cmd) + + megasas_encode_lba(cdb, lba_start, lba_count, is_write); + cmd->req = scsi_req_new(sdev, cmd->index, +- lun_id, cdb, cdb_len, cmd); ++ lun_id, cdb, sizeof(cdb), cmd); + if (!cmd->req) { + trace_megasas_scsi_req_alloc_failed( + mfi_frame_desc(frame_cmd), target_id, lun_id); +diff --git a/hw/usb/canokey.c b/hw/usb/canokey.c +index bbc5da07b5..5abb8db771 100644 +--- a/hw/usb/canokey.c ++++ b/hw/usb/canokey.c +@@ -197,8 +197,8 @@ static void canokey_handle_data(USBDevice *dev, USBPacket *p) + switch (p->pid) { + case USB_TOKEN_OUT: + trace_canokey_handle_data_out(ep_out, p->iov.size); +- usb_packet_copy(p, key->ep_out_buffer[ep_out], p->iov.size); + out_pos = 0; ++ /* segment packet into (possibly multiple) ep_out */ + while (out_pos != p->iov.size) { + /* + * key->ep_out[ep_out] set by prepare_receive +@@ -207,8 +207,8 @@ static void canokey_handle_data(USBDevice *dev, USBPacket *p) + * to be the buffer length + */ + out_len = MIN(p->iov.size - out_pos, key->ep_out_size[ep_out]); +- memcpy(key->ep_out[ep_out], +- key->ep_out_buffer[ep_out] + out_pos, out_len); ++ /* usb_packet_copy would update the pos offset internally */ ++ usb_packet_copy(p, key->ep_out[ep_out], out_len); + out_pos += out_len; + /* update ep_out_size to actual len */ + key->ep_out_size[ep_out] = out_len; +diff --git a/hw/usb/canokey.h b/hw/usb/canokey.h +index 24cf304203..fdcad10f80 100644 +--- a/hw/usb/canokey.h ++++ b/hw/usb/canokey.h +@@ -24,8 +24,6 @@ + #define CANOKEY_EP_NUM 3 + /* BULK/INTR IN can be up to 1352 bytes, e.g. get key info */ + #define CANOKEY_EP_IN_BUFFER_SIZE 2048 +-/* BULK OUT can be up to 270 bytes, e.g. PIV import cert */ +-#define CANOKEY_EP_OUT_BUFFER_SIZE 512 + + typedef enum { + CANOKEY_EP_IN_WAIT, +@@ -59,8 +57,6 @@ typedef struct CanoKeyState { + /* OUT pointer to canokey recv buffer */ + uint8_t *ep_out[CANOKEY_EP_NUM]; + uint32_t ep_out_size[CANOKEY_EP_NUM]; +- /* For large BULK OUT, multiple write to ep_out is needed */ +- uint8_t ep_out_buffer[CANOKEY_EP_NUM][CANOKEY_EP_OUT_BUFFER_SIZE]; + + /* Properties */ + char *file; /* canokey-file */ +diff --git a/hw/usb/hcd-xhci-pci.c b/hw/usb/hcd-xhci-pci.c +index 643d4643e4..560ce582b2 100644 +--- a/hw/usb/hcd-xhci-pci.c ++++ b/hw/usb/hcd-xhci-pci.c +@@ -74,6 +74,7 @@ static bool xhci_pci_intr_raise(XHCIState *xhci, int n, bool level) + } + + if (msi_enabled(pci_dev) && level) { ++ n %= msi_nr_vectors_allocated(pci_dev); + msi_notify(pci_dev, n); + return true; + } +diff --git a/include/qemu/bitmap.h b/include/qemu/bitmap.h +index 3ccb00865f..1f35e0193f 100644 +--- a/include/qemu/bitmap.h ++++ b/include/qemu/bitmap.h +@@ -69,6 +69,14 @@ + #define DECLARE_BITMAP(name,bits) \ + unsigned long name[BITS_TO_LONGS(bits)] + ++/* ++ * This is for use with the bit32 versions of set_bit() etc; ++ * we don't currently support the full range of bitmap operations ++ * on bitmaps backed by an array of uint32_t. ++ */ ++#define DECLARE_BITMAP32(name, bits) \ ++ uint32_t name[BITS_TO_U32S(bits)] ++ + #define small_nbits(nbits) \ + ((nbits) <= BITS_PER_LONG) + +diff --git a/include/qemu/bitops.h b/include/qemu/bitops.h +index 03213ce952..888ac7f0e6 100644 +--- a/include/qemu/bitops.h ++++ b/include/qemu/bitops.h +@@ -18,16 +18,47 @@ + + #define BITS_PER_BYTE CHAR_BIT + #define BITS_PER_LONG (sizeof (unsigned long) * BITS_PER_BYTE) ++#define BITS_TO_LONGS(nr) DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long)) ++#define BITS_TO_U32S(nr) DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(uint32_t)) + + #define BIT(nr) (1UL << (nr)) + #define BIT_ULL(nr) (1ULL << (nr)) +-#define BIT_MASK(nr) (1UL << ((nr) % BITS_PER_LONG)) +-#define BIT_WORD(nr) ((nr) / BITS_PER_LONG) +-#define BITS_TO_LONGS(nr) DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long)) + + #define MAKE_64BIT_MASK(shift, length) \ + (((~0ULL) >> (64 - (length))) << (shift)) + ++/** ++ * DOC: Functions operating on arrays of bits ++ * ++ * We provide a set of functions which work on arbitrary-length arrays of ++ * bits. These come in several flavours which vary in what the type of the ++ * underlying storage for the bits is: ++ * ++ * - Bits stored in an array of 'unsigned long': set_bit(), clear_bit(), etc ++ * - Bits stored in an array of 'uint32_t': set_bit32(), clear_bit32(), etc ++ * ++ * Because the 'unsigned long' type has a size which varies between ++ * host systems, the versions using 'uint32_t' are often preferable. ++ * This is particularly the case in a device model where there may ++ * be some guest-visible register view of the bit array. ++ * ++ * We do not currently implement uint32_t versions of find_last_bit(), ++ * find_next_bit(), find_next_zero_bit(), find_first_bit() or ++ * find_first_zero_bit(), because we haven't yet needed them. If you ++ * need them you should implement them similarly to the 'unsigned long' ++ * versions. ++ * ++ * You can declare a bitmap to be used with these functions via the ++ * DECLARE_BITMAP and DECLARE_BITMAP32 macros in bitmap.h. ++ */ ++ ++/** ++ * DOC: 'unsigned long' bit array APIs ++ */ ++ ++#define BIT_MASK(nr) (1UL << ((nr) % BITS_PER_LONG)) ++#define BIT_WORD(nr) ((nr) / BITS_PER_LONG) ++ + /** + * set_bit - Set a bit in memory + * @nr: the bit to set +@@ -211,6 +242,141 @@ static inline unsigned long find_first_zero_bit(const unsigned long *addr, + return find_next_zero_bit(addr, size, 0); + } + ++/** ++ * DOC: 'uint32_t' bit array APIs ++ */ ++ ++#define BIT32_MASK(nr) (1UL << ((nr) % 32)) ++#define BIT32_WORD(nr) ((nr) / 32) ++ ++/** ++ * set_bit32 - Set a bit in memory ++ * @nr: the bit to set ++ * @addr: the address to start counting from ++ */ ++static inline void set_bit32(long nr, uint32_t *addr) ++{ ++ uint32_t mask = BIT32_MASK(nr); ++ uint32_t *p = addr + BIT32_WORD(nr); ++ ++ *p |= mask; ++} ++ ++/** ++ * set_bit32_atomic - Set a bit in memory atomically ++ * @nr: the bit to set ++ * @addr: the address to start counting from ++ */ ++static inline void set_bit32_atomic(long nr, uint32_t *addr) ++{ ++ uint32_t mask = BIT32_MASK(nr); ++ uint32_t *p = addr + BIT32_WORD(nr); ++ ++ qatomic_or(p, mask); ++} ++ ++/** ++ * clear_bit32 - Clears a bit in memory ++ * @nr: Bit to clear ++ * @addr: Address to start counting from ++ */ ++static inline void clear_bit32(long nr, uint32_t *addr) ++{ ++ uint32_t mask = BIT32_MASK(nr); ++ uint32_t *p = addr + BIT32_WORD(nr); ++ ++ *p &= ~mask; ++} ++ ++/** ++ * clear_bit32_atomic - Clears a bit in memory atomically ++ * @nr: Bit to clear ++ * @addr: Address to start counting from ++ */ ++static inline void clear_bit32_atomic(long nr, uint32_t *addr) ++{ ++ uint32_t mask = BIT32_MASK(nr); ++ uint32_t *p = addr + BIT32_WORD(nr); ++ ++ return qatomic_and(p, ~mask); ++} ++ ++/** ++ * change_bit32 - Toggle a bit in memory ++ * @nr: Bit to change ++ * @addr: Address to start counting from ++ */ ++static inline void change_bit32(long nr, uint32_t *addr) ++{ ++ uint32_t mask = BIT32_MASK(nr); ++ uint32_t *p = addr + BIT32_WORD(nr); ++ ++ *p ^= mask; ++} ++ ++/** ++ * test_and_set_bit32 - Set a bit and return its old value ++ * @nr: Bit to set ++ * @addr: Address to count from ++ */ ++static inline int test_and_set_bit32(long nr, uint32_t *addr) ++{ ++ uint32_t mask = BIT32_MASK(nr); ++ uint32_t *p = addr + BIT32_WORD(nr); ++ uint32_t old = *p; ++ ++ *p = old | mask; ++ return (old & mask) != 0; ++} ++ ++/** ++ * test_and_clear_bit32 - Clear a bit and return its old value ++ * @nr: Bit to clear ++ * @addr: Address to count from ++ */ ++static inline int test_and_clear_bit32(long nr, uint32_t *addr) ++{ ++ uint32_t mask = BIT32_MASK(nr); ++ uint32_t *p = addr + BIT32_WORD(nr); ++ uint32_t old = *p; ++ ++ *p = old & ~mask; ++ return (old & mask) != 0; ++} ++ ++/** ++ * test_and_change_bit32 - Change a bit and return its old value ++ * @nr: Bit to change ++ * @addr: Address to count from ++ */ ++static inline int test_and_change_bit32(long nr, uint32_t *addr) ++{ ++ uint32_t mask = BIT32_MASK(nr); ++ uint32_t *p = addr + BIT32_WORD(nr); ++ uint32_t old = *p; ++ ++ *p = old ^ mask; ++ return (old & mask) != 0; ++} ++ ++/** ++ * test_bit32 - Determine whether a bit is set ++ * @nr: bit number to test ++ * @addr: Address to start counting from ++ */ ++static inline int test_bit32(long nr, const uint32_t *addr) ++{ ++ return 1U & (addr[BIT32_WORD(nr)] >> (nr & 31)); ++} ++ ++/** ++ * DOC: Miscellaneous bit operations on single values ++ * ++ * These functions are a collection of useful operations ++ * (rotations, bit extract, bit deposit, etc) on single ++ * integer values. ++ */ ++ + /** + * rol8 - rotate an 8-bit value left + * @word: value to rotate +diff --git a/meson.build b/meson.build +index 16dc9627e0..c0608332cd 100644 +--- a/meson.build ++++ b/meson.build +@@ -580,7 +580,7 @@ endif + + libnfs = not_found + if not get_option('libnfs').auto() or have_block +- libnfs = dependency('libnfs', version: '>=1.9.3', ++ libnfs = dependency('libnfs', version: ['>=1.9.3', '<6.0.0'], + required: get_option('libnfs'), + method: 'pkg-config', kwargs: static_kwargs) + endif +diff --git a/target/arm/sme_helper.c b/target/arm/sme_helper.c +index 98a4840970..fd5625c87e 100644 +--- a/target/arm/sme_helper.c ++++ b/target/arm/sme_helper.c +@@ -35,7 +35,7 @@ void arm_reset_sve_state(CPUARMState *env) + memset(env->vfp.zregs, 0, sizeof(env->vfp.zregs)); + /* Recall that FFR is stored as pregs[16]. */ + memset(env->vfp.pregs, 0, sizeof(env->vfp.pregs)); +- vfp_set_fpcr(env, 0x0800009f); ++ vfp_set_fpsr(env, 0x0800009f); + } + + void helper_set_pstate_sm(CPUARMState *env, uint32_t i) +diff --git a/target/i386/cpu.c b/target/i386/cpu.c +index 9c3e64c54b..489ab9cd41 100644 +--- a/target/i386/cpu.c ++++ b/target/i386/cpu.c +@@ -3044,6 +3044,7 @@ static const X86CPUDefinition builtin_x86_defs[] = { + }, + { + .version = 4, ++ .note = "IBRS, EPT switching, no TSX", + .props = (PropValue[]) { + { "vmx-eptp-switching", "on" }, + { /* end of list */ } +@@ -3178,7 +3179,7 @@ static const X86CPUDefinition builtin_x86_defs[] = { + }, + }, + { .version = 4, +- .note = "ARCH_CAPABILITIES, no TSX", ++ .note = "ARCH_CAPABILITIES, EPT switching, no TSX", + .props = (PropValue[]) { + { "vmx-eptp-switching", "on" }, + { /* end of list */ } +diff --git a/target/ppc/excp_helper.c b/target/ppc/excp_helper.c +index 839d95c1eb..037efc04af 100644 +--- a/target/ppc/excp_helper.c ++++ b/target/ppc/excp_helper.c +@@ -2511,10 +2511,16 @@ static void ppc_deliver_interrupt(CPUPPCState *env, int interrupt) + } + } + ++/* ++ * system reset is not delivered via normal irq method, so have to set ++ * halted = 0 to resume CPU running if it was halted. Possibly we should ++ * move it over to using PPC_INTERRUPT_RESET rather than async_run_on_cpu. ++ */ + void ppc_cpu_do_system_reset(CPUState *cs) + { + PowerPCCPU *cpu = POWERPC_CPU(cs); + ++ cs->halted = 0; + powerpc_excp(cpu, POWERPC_EXCP_RESET); + } + +@@ -2536,6 +2542,7 @@ void ppc_cpu_do_fwnmi_machine_check(CPUState *cs, target_ulong vector) + + /* Anything for nested required here? MSR[HV] bit? */ + ++ cs->halted = 0; + powerpc_set_excp_state(cpu, vector, msr); + } + +diff --git a/tcg/riscv/tcg-target.c.inc b/tcg/riscv/tcg-target.c.inc +index 81a83e45b1..e91a7aaf0e 100644 +--- a/tcg/riscv/tcg-target.c.inc ++++ b/tcg/riscv/tcg-target.c.inc +@@ -838,7 +838,7 @@ static void tcg_out_mb(TCGContext *s, TCGArg a0) + insn |= 0x02100000; + } + if (a0 & TCG_MO_ST_ST) { +- insn |= 0x02200000; ++ insn |= 0x01100000; + } + tcg_out32(s, insn); + } +diff --git a/tests/data/acpi/pc/DSDT b/tests/data/acpi/pc/DSDT +index b688686dc3..246bcadaa7 100644 +Binary files a/tests/data/acpi/pc/DSDT and b/tests/data/acpi/pc/DSDT differ +diff --git a/tests/data/acpi/pc/DSDT.acpierst b/tests/data/acpi/pc/DSDT.acpierst +index 86259be9d1..3074cecb6c 100644 +Binary files a/tests/data/acpi/pc/DSDT.acpierst and b/tests/data/acpi/pc/DSDT.acpierst differ +diff --git a/tests/data/acpi/pc/DSDT.acpihmat b/tests/data/acpi/pc/DSDT.acpihmat +index e2cc2a6fc9..0a32881d58 100644 +Binary files a/tests/data/acpi/pc/DSDT.acpihmat and b/tests/data/acpi/pc/DSDT.acpihmat differ +diff --git a/tests/data/acpi/pc/DSDT.bridge b/tests/data/acpi/pc/DSDT.bridge +index 75016fd4b7..95c12aa316 100644 +Binary files a/tests/data/acpi/pc/DSDT.bridge and b/tests/data/acpi/pc/DSDT.bridge differ +diff --git a/tests/data/acpi/pc/DSDT.cphp b/tests/data/acpi/pc/DSDT.cphp +index 53eb0dd7d4..ac40cbc595 100644 +Binary files a/tests/data/acpi/pc/DSDT.cphp and b/tests/data/acpi/pc/DSDT.cphp differ +diff --git a/tests/data/acpi/pc/DSDT.dimmpxm b/tests/data/acpi/pc/DSDT.dimmpxm +index 9089d994e0..b8b62cf9e9 100644 +Binary files a/tests/data/acpi/pc/DSDT.dimmpxm and b/tests/data/acpi/pc/DSDT.dimmpxm differ +diff --git a/tests/data/acpi/pc/DSDT.hpbridge b/tests/data/acpi/pc/DSDT.hpbridge +index 86259be9d1..3074cecb6c 100644 +Binary files a/tests/data/acpi/pc/DSDT.hpbridge and b/tests/data/acpi/pc/DSDT.hpbridge differ +diff --git a/tests/data/acpi/pc/DSDT.ipmikcs b/tests/data/acpi/pc/DSDT.ipmikcs +index 39427103aa..40edcc0f94 100644 +Binary files a/tests/data/acpi/pc/DSDT.ipmikcs and b/tests/data/acpi/pc/DSDT.ipmikcs differ +diff --git a/tests/data/acpi/pc/DSDT.memhp b/tests/data/acpi/pc/DSDT.memhp +index 987a263339..b2a7fd0dbd 100644 +Binary files a/tests/data/acpi/pc/DSDT.memhp and b/tests/data/acpi/pc/DSDT.memhp differ +diff --git a/tests/data/acpi/pc/DSDT.nohpet b/tests/data/acpi/pc/DSDT.nohpet +index fc7598b762..713aae4d8a 100644 +Binary files a/tests/data/acpi/pc/DSDT.nohpet and b/tests/data/acpi/pc/DSDT.nohpet differ +diff --git a/tests/data/acpi/pc/DSDT.numamem b/tests/data/acpi/pc/DSDT.numamem +index 85af400cdb..70b44ec476 100644 +Binary files a/tests/data/acpi/pc/DSDT.numamem and b/tests/data/acpi/pc/DSDT.numamem differ +diff --git a/tests/data/acpi/pc/DSDT.roothp b/tests/data/acpi/pc/DSDT.roothp +index 545512adfa..1030c94cc5 100644 +Binary files a/tests/data/acpi/pc/DSDT.roothp and b/tests/data/acpi/pc/DSDT.roothp differ +diff --git a/tests/data/acpi/q35/DSDT b/tests/data/acpi/q35/DSDT +index 2771bcea89..5c2b505163 100644 +Binary files a/tests/data/acpi/q35/DSDT and b/tests/data/acpi/q35/DSDT differ +diff --git a/tests/data/acpi/q35/DSDT.acpierst b/tests/data/acpi/q35/DSDT.acpierst +index b45abca7c2..1fd50e1c8b 100644 +Binary files a/tests/data/acpi/q35/DSDT.acpierst and b/tests/data/acpi/q35/DSDT.acpierst differ +diff --git a/tests/data/acpi/q35/DSDT.acpihmat b/tests/data/acpi/q35/DSDT.acpihmat +index d90fd4723a..c224736325 100644 +Binary files a/tests/data/acpi/q35/DSDT.acpihmat and b/tests/data/acpi/q35/DSDT.acpihmat differ +diff --git a/tests/data/acpi/q35/DSDT.acpihmat-noinitiator b/tests/data/acpi/q35/DSDT.acpihmat-noinitiator +index 279fafa821..ecdb94cc67 100644 +Binary files a/tests/data/acpi/q35/DSDT.acpihmat-noinitiator and b/tests/data/acpi/q35/DSDT.acpihmat-noinitiator differ +diff --git a/tests/data/acpi/q35/DSDT.applesmc b/tests/data/acpi/q35/DSDT.applesmc +index fdf6d14428..241a02dcf4 100644 +Binary files a/tests/data/acpi/q35/DSDT.applesmc and b/tests/data/acpi/q35/DSDT.applesmc differ +diff --git a/tests/data/acpi/q35/DSDT.bridge b/tests/data/acpi/q35/DSDT.bridge +index b41a4dddc0..bb41a3c218 100644 +Binary files a/tests/data/acpi/q35/DSDT.bridge and b/tests/data/acpi/q35/DSDT.bridge differ +diff --git a/tests/data/acpi/q35/DSDT.core-count2 b/tests/data/acpi/q35/DSDT.core-count2 +index 375aceed6b..5e0da94644 100644 +Binary files a/tests/data/acpi/q35/DSDT.core-count2 and b/tests/data/acpi/q35/DSDT.core-count2 differ +diff --git a/tests/data/acpi/q35/DSDT.cphp b/tests/data/acpi/q35/DSDT.cphp +index a0ecafc36c..6d64cd51f6 100644 +Binary files a/tests/data/acpi/q35/DSDT.cphp and b/tests/data/acpi/q35/DSDT.cphp differ +diff --git a/tests/data/acpi/q35/DSDT.cxl b/tests/data/acpi/q35/DSDT.cxl +index 267709e4e4..737e5a2447 100644 +Binary files a/tests/data/acpi/q35/DSDT.cxl and b/tests/data/acpi/q35/DSDT.cxl differ +diff --git a/tests/data/acpi/q35/DSDT.dimmpxm b/tests/data/acpi/q35/DSDT.dimmpxm +index f0659716e3..665a0c88ff 100644 +Binary files a/tests/data/acpi/q35/DSDT.dimmpxm and b/tests/data/acpi/q35/DSDT.dimmpxm differ +diff --git a/tests/data/acpi/q35/DSDT.ipmibt b/tests/data/acpi/q35/DSDT.ipmibt +index 9c52529919..25ddd90f8e 100644 +Binary files a/tests/data/acpi/q35/DSDT.ipmibt and b/tests/data/acpi/q35/DSDT.ipmibt differ +diff --git a/tests/data/acpi/q35/DSDT.ipmismbus b/tests/data/acpi/q35/DSDT.ipmismbus +index 3f32dffdbf..3367016d9a 100644 +Binary files a/tests/data/acpi/q35/DSDT.ipmismbus and b/tests/data/acpi/q35/DSDT.ipmismbus differ +diff --git a/tests/data/acpi/q35/DSDT.ivrs b/tests/data/acpi/q35/DSDT.ivrs +index b45abca7c2..1fd50e1c8b 100644 +Binary files a/tests/data/acpi/q35/DSDT.ivrs and b/tests/data/acpi/q35/DSDT.ivrs differ +diff --git a/tests/data/acpi/q35/DSDT.memhp b/tests/data/acpi/q35/DSDT.memhp +index 28a192c69a..bfd2278260 100644 +Binary files a/tests/data/acpi/q35/DSDT.memhp and b/tests/data/acpi/q35/DSDT.memhp differ +diff --git a/tests/data/acpi/q35/DSDT.mmio64 b/tests/data/acpi/q35/DSDT.mmio64 +index 8fda921296..5b50f66a1e 100644 +Binary files a/tests/data/acpi/q35/DSDT.mmio64 and b/tests/data/acpi/q35/DSDT.mmio64 differ +diff --git a/tests/data/acpi/q35/DSDT.multi-bridge b/tests/data/acpi/q35/DSDT.multi-bridge +index 3dba4d8436..2f37a6f8b6 100644 +Binary files a/tests/data/acpi/q35/DSDT.multi-bridge and b/tests/data/acpi/q35/DSDT.multi-bridge differ +diff --git a/tests/data/acpi/q35/DSDT.nohpet b/tests/data/acpi/q35/DSDT.nohpet +index b116947dac..5c17ed809d 100644 +Binary files a/tests/data/acpi/q35/DSDT.nohpet and b/tests/data/acpi/q35/DSDT.nohpet differ +diff --git a/tests/data/acpi/q35/DSDT.numamem b/tests/data/acpi/q35/DSDT.numamem +index 5eb6159d5f..e92f2a0c7a 100644 +Binary files a/tests/data/acpi/q35/DSDT.numamem and b/tests/data/acpi/q35/DSDT.numamem differ +diff --git a/tests/data/acpi/q35/DSDT.pvpanic-isa b/tests/data/acpi/q35/DSDT.pvpanic-isa +index 908e7b6606..308ed32bf0 100644 +Binary files a/tests/data/acpi/q35/DSDT.pvpanic-isa and b/tests/data/acpi/q35/DSDT.pvpanic-isa differ +diff --git a/tests/data/acpi/q35/DSDT.tis.tpm12 b/tests/data/acpi/q35/DSDT.tis.tpm12 +index ce2c2c29c2..a7ec593951 100644 +Binary files a/tests/data/acpi/q35/DSDT.tis.tpm12 and b/tests/data/acpi/q35/DSDT.tis.tpm12 differ +diff --git a/tests/data/acpi/q35/DSDT.tis.tpm2 b/tests/data/acpi/q35/DSDT.tis.tpm2 +index e9e4b7f6ed..ee242eceba 100644 +Binary files a/tests/data/acpi/q35/DSDT.tis.tpm2 and b/tests/data/acpi/q35/DSDT.tis.tpm2 differ +diff --git a/tests/data/acpi/q35/DSDT.viot b/tests/data/acpi/q35/DSDT.viot +index 6b436f9cd9..60451836ff 100644 +Binary files a/tests/data/acpi/q35/DSDT.viot and b/tests/data/acpi/q35/DSDT.viot differ +diff --git a/tests/data/acpi/q35/DSDT.xapic b/tests/data/acpi/q35/DSDT.xapic +index f47f091222..9f96175d93 100644 +Binary files a/tests/data/acpi/q35/DSDT.xapic and b/tests/data/acpi/q35/DSDT.xapic differ +diff --git a/tests/qtest/fuzz/generic_fuzz_configs.h b/tests/qtest/fuzz/generic_fuzz_configs.h +index a825b78c14..4c3235311b 100644 +--- a/tests/qtest/fuzz/generic_fuzz_configs.h ++++ b/tests/qtest/fuzz/generic_fuzz_configs.h +@@ -143,7 +143,8 @@ const generic_fuzz_config predefined_configs[] = { + "-chardev null,id=cd0 -chardev null,id=cd1 " + "-device usb-braille,chardev=cd0 -device usb-ccid -device usb-ccid " + "-device usb-kbd -device usb-mouse -device usb-serial,chardev=cd1 " +- "-device usb-tablet -device usb-wacom-tablet -device usb-audio", ++ "-device usb-tablet -device usb-wacom-tablet " ++ "-device usb-audio,audiodev=snd0 -audiodev none,id=snd0", + .objects = "*usb* *uhci* *xhci*", + },{ + .name = "pc-i440fx", +diff --git a/tests/qtest/libqos/virtio-9p-client.c b/tests/qtest/libqos/virtio-9p-client.c +index e4a368e036..340e704d24 100644 +--- a/tests/qtest/libqos/virtio-9p-client.c ++++ b/tests/qtest/libqos/virtio-9p-client.c +@@ -235,10 +235,11 @@ static const char *rmessage_name(uint8_t id) + id == P9_RMKDIR ? "RMKDIR" : + id == P9_RLCREATE ? "RLCREATE" : + id == P9_RSYMLINK ? "RSYMLINK" : ++ id == P9_RGETATTR ? "RGETATTR" : + id == P9_RLINK ? "RLINK" : + id == P9_RUNLINKAT ? "RUNLINKAT" : + id == P9_RFLUSH ? "RFLUSH" : +- id == P9_RREADDIR ? "READDIR" : ++ id == P9_RREADDIR ? "RREADDIR" : + "<unknown>"; + } + +diff --git a/tests/qtest/virtio-9p-test.c b/tests/qtest/virtio-9p-test.c +index 65e69491e5..86ff86409c 100644 +--- a/tests/qtest/virtio-9p-test.c ++++ b/tests/qtest/virtio-9p-test.c +@@ -693,6 +693,50 @@ static void fs_unlinkat_hardlink(void *obj, void *data, + g_assert(stat(real_file, &st_real) == 0); + } + ++static void fs_use_after_unlink(void *obj, void *data, ++ QGuestAllocator *t_alloc) ++{ ++ QVirtio9P *v9p = obj; ++ v9fs_set_allocator(t_alloc); ++ static const uint32_t write_count = P9_MAX_SIZE / 2; ++ g_autofree char *real_file = virtio_9p_test_path("09/doa_file"); ++ g_autofree char *buf = g_malloc0(write_count); ++ struct stat st_file; ++ struct v9fs_attr attr; ++ uint32_t fid_file; ++ uint32_t count; ++ ++ tattach({ .client = v9p }); ++ ++ /* create a file "09/doa_file" and make sure it exists and is regular */ ++ tmkdir({ .client = v9p, .atPath = "/", .name = "09" }); ++ tlcreate({ .client = v9p, .atPath = "09", .name = "doa_file" }); ++ g_assert(stat(real_file, &st_file) == 0); ++ g_assert((st_file.st_mode & S_IFMT) == S_IFREG); ++ ++ /* request a FID for that regular file that we can work with next */ ++ fid_file = twalk({ ++ .client = v9p, .fid = 0, .path = "09/doa_file" ++ }).newfid; ++ g_assert(fid_file != 0); ++ ++ /* now first open the file in write mode before ... */ ++ tlopen({ .client = v9p, .fid = fid_file, .flags = O_WRONLY }); ++ /* ... removing the file from file system */ ++ tunlinkat({ .client = v9p, .atPath = "09", .name = "doa_file" }); ++ ++ /* file is removed, but we still have it open, so this should succeed */ ++ tgetattr({ ++ .client = v9p, .fid = fid_file, .request_mask = P9_GETATTR_BASIC, ++ .rgetattr.attr = &attr ++ }); ++ count = twrite({ ++ .client = v9p, .fid = fid_file, .offset = 0, .count = write_count, ++ .data = buf ++ }).count; ++ g_assert_cmpint(count, ==, write_count); ++} ++ + static void *assign_9p_local_driver(GString *cmd_line, void *arg) + { + virtio_9p_assign_local_driver(cmd_line, "security_model=mapped-xattr"); +@@ -756,6 +800,8 @@ static void register_virtio_9p_test(void) + qos_add_test("local/hardlink_file", "virtio-9p", fs_hardlink_file, &opts); + qos_add_test("local/unlinkat_hardlink", "virtio-9p", fs_unlinkat_hardlink, + &opts); ++ qos_add_test("local/use_after_unlink", "virtio-9p", fs_use_after_unlink, ++ &opts); + } + + libqos_init(register_virtio_9p_test); |