Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: qemu/qemu
base: e25c2a96bb5d
Choose a base ref
...
head repository: qemu/qemu
compare: ce721d21f1cb
Choose a head ref
  • 17 commits
  • 24 files changed
  • 6 contributors

Commits on Jul 21, 2023

  1. linux-user: Fix qemu brk() to not zero bytes on current page

    The qemu brk() implementation is too aggressive and cleans remaining bytes
    on the current page above the last brk address.
    
    But some existing applications are buggy and read/write bytes above their
    current heap address. On a phyiscal machine this does not trigger a
    runtime error as long as the access happens on the same page. Additionally
    the Linux kernel allocates only full pages and does no zeroing on already
    allocated pages, even if the brk address is lowered.
    
    Fix qemu to behave the same way as the kernel does. Do not touch already
    allocated pages, and - when running with different page sizes of guest and
    host - zero out only those memory areas where the host page size is bigger
    than the guest page size.
    
    Signed-off-by: Helge Deller <deller@gmx.de>
    Tested-by: "Markus F.X.J. Oberhumer" <markus@oberhumer.com>
    Fixes: 86f0473 ("linux-user: Fix brk() to release pages")
    Cc: qemu-stable@nongnu.org
    Buglink: upx/upx#683
    (cherry picked from commit 15ad985)
    Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
    hdeller authored and Michael Tokarev committed Jul 21, 2023
    Copy the full SHA
    1f96532 View commit details
    Browse the repository at this point in the history
  2. linux-user: Prohibit brk() to to shrink below initial heap address

    Since commit 86f0473 ("linux-user: Fix brk() to release pages") it's
    possible for userspace applications to reduce their memory footprint by
    calling brk() with a lower address and free up memory. Before that commit
    guest heap memory was never unmapped.
    
    But the Linux kernel prohibits to reduce brk() below the initial memory
    address which is set at startup by the set_brk() function in binfmt_elf.c.
    Such a range check was missed in commit 86f0473.
    
    This patch adds the missing check by storing the initial brk value in
    initial_target_brk and verify any new brk addresses against that value.
    
    Tested with the i386 upx binary from
    https://github.com/upx/upx/releases/download/v4.0.2/upx-4.0.2-i386_linux.tar.xz
    
    Signed-off-by: Helge Deller <deller@gmx.de>
    Tested-by: "Markus F.X.J. Oberhumer" <markus@oberhumer.com>
    Fixes: 86f0473 ("linux-user: Fix brk() to release pages")
    Cc: qemu-stable@nongnu.org
    Buglink: upx/upx#683
    (cherry picked from commit dfe4986)
    Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
    hdeller authored and Michael Tokarev committed Jul 21, 2023
    Copy the full SHA
    6e4bf15 View commit details
    Browse the repository at this point in the history
  3. linux-user: Fix signed math overflow in brk() syscall

    Fix the math overflow when calculating the new_malloc_size.
    
    new_host_brk_page and brk_page are unsigned integers. If userspace
    reduces the heap, new_host_brk_page is lower than brk_page which results
    in a huge positive number (but should actually be negative).
    
    Fix it by adding a proper check and as such make the code more readable.
    
    Signed-off-by: Helge Deller <deller@gmx.de>
    Tested-by: "Markus F.X.J. Oberhumer" <markus@oberhumer.com>
    Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
    Fixes: 86f0473 ("linux-user: Fix brk() to release pages")
    Cc: qemu-stable@nongnu.org
    Buglink: upx/upx#683
    (cherry picked from commit eac78a4)
    Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
    hdeller authored and Michael Tokarev committed Jul 21, 2023
    Copy the full SHA
    4ef12d2 View commit details
    Browse the repository at this point in the history

Commits on Jul 25, 2023

  1. qemu-nbd: pass structure into nbd_client_thread instead of plain char*

    We are going to pass additional flag inside next patch.
    
    Signed-off-by: Denis V. Lunev <den@openvz.org>
    CC: Eric Blake <eblake@redhat.com>
    CC: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>
    CC: <qemu-stable@nongnu.org>
    Message-ID: <20230717145544.194786-2-den@openvz.org>
    Reviewed-by: Eric Blake <eblake@redhat.com>
    Signed-off-by: Eric Blake <eblake@redhat.com>
    (cherry picked from commit 03b6762)
    Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
    Denis V. Lunev authored and Michael Tokarev committed Jul 25, 2023
    Copy the full SHA
    15fae37 View commit details
    Browse the repository at this point in the history
  2. qemu-nbd: fix regression with qemu-nbd --fork run over ssh

    Commit e6df58a
        Author: Hanna Reitz <hreitz@redhat.com>
        Date:   Wed May 8 23:18:18 2019 +0200
        qemu-nbd: Do not close stderr
    
    has introduced an interesting regression. Original behavior of
        ssh somehost qemu-nbd /home/den/tmp/file -f raw --fork
    was the following:
     * qemu-nbd was started as a daemon
     * the command execution is done and ssh exited with success
    
    The patch has changed this behavior and 'ssh' command now hangs forever.
    
    According to the normal specification of the daemon() call, we should
    endup with STDERR pointing to /dev/null. That should be done at the
    very end of the successful startup sequence when the pipe to the
    bootstrap process (used for diagnostics) is no longer needed.
    
    This could be achived in the same way as done for 'qemu-nbd -c' case.
    That was commit 0eaf453, also fixing up e6df58a. STDOUT copying to
    STDERR does the trick.
    
    This also leads to proper 'ssh' connection closing which fixes my
    original problem.
    
    Signed-off-by: Denis V. Lunev <den@openvz.org>
    CC: Eric Blake <eblake@redhat.com>
    CC: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>
    CC: Hanna Reitz <hreitz@redhat.com>
    CC: <qemu-stable@nongnu.org>
    Message-ID: <20230717145544.194786-3-den@openvz.org>
    Reviewed-by: Eric Blake <eblake@redhat.com>
    Signed-off-by: Eric Blake <eblake@redhat.com>
    (cherry picked from commit 5c56dd2)
    Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
    Denis V. Lunev authored and Michael Tokarev committed Jul 25, 2023
    Copy the full SHA
    a436ddc View commit details
    Browse the repository at this point in the history
  3. tcg/ppc: Fix race in goto_tb implementation

    Commit 20b6643 ("tcg/ppc: Reorg goto_tb implementation") modified
    goto_tb to ensure only a single instruction was patched to prevent
    incorrect behavior if a thread was in the middle of multiple
    instructions when they were replaced. However this introduced a race
    between loading the jmp target into TCG_REG_TB and patching and
    executing the direct branch.
    
    The relevant part of the goto_tb implementation:
    
        ld TCG_REG_TB, TARGET_ADDR_LOCATION(TCG_REG_TB)
      patch_location:
        mtctr TCG_REG_TB
        bctr
    
    tb_target_set_jmp_target() will replace 'patch_location' with a direct
    branch if the target is in range. The direct branch now relies on
    TCG_REG_TB being set up correctly by the ld. Prior to this commit
    multiple instructions were patched in for the direct branch case; these
    instructions would initialize TCG_REG_TB to the same value as the branch
    target.
    
    Imagine the following sequence:
    
    1) Thread A is executing the goto_tb sequence and loads the jmp
       target into TCG_REG_TB.
    
    2) Thread B updates the jmp target address and calls
       tb_target_set_jmp_target(). This patches a new direct branch into the
       goto_tb sequence.
    
    3) Thread A executes the newly patched direct branch. The value in
       TCG_REG_TB still contains the old jmp target.
    
    TCG_REG_TB MUST contain the translation block's tc.ptr. Execution will
    eventually crash after performing memory accesses generated from a
    faulty value in TCG_REG_TB.
    
    This presents as segfaults or illegal instruction exceptions.
    
    Do not revert commit 20b6643 as it did fix a different race
    condition. Instead remove the direct branch optimization and always use
    indirect branches.
    
    The direct branch optimization can be re-added later with a race free
    sequence.
    
    Fixes: 20b6643 ("tcg/ppc: Reorg goto_tb implementation")
    Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1726
    Reported-by: Anushree Mathur <anushree.mathur@linux.vnet.ibm.com>
    Tested-by: Anushree Mathur <anushree.mathur@linux.vnet.ibm.com>
    Tested-by: Michael Tokarev <mjt@tls.msk.ru>
    Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
    Co-developed-by: Benjamin Gray <bgray@linux.ibm.com>
    Signed-off-by: Jordan Niethe <jniethe5@gmail.com>
    Signed-off-by: Benjamin Gray <bgray@linux.ibm.com>
    Message-Id: <20230717093001.13167-1-jniethe5@gmail.com>
    (cherry picked from commit 736a158)
    Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
    iamjpn authored and Michael Tokarev committed Jul 25, 2023
    Copy the full SHA
    9b65ba5 View commit details
    Browse the repository at this point in the history
  4. tcg/{i386, s390x}: Add earlyclobber to the op_add2's first output

    i386 and s390x implementations of op_add2 require an earlyclobber,
    which is currently missing. This breaks VCKSM in s390x guests. E.g., on
    x86_64 the following op:
    
        add2_i32 tmp2,tmp3,tmp2,tmp3,tmp3,tmp2   dead: 0 2 3 4 5  pref=none,0xffff
    
    is translated to:
    
        addl     %ebx, %r12d
        adcl     %r12d, %ebx
    
    Introduce a new C_N1_O1_I4 constraint, and make sure that earlyclobber
    of aliased outputs is honored.
    
    Cc: qemu-stable@nongnu.org
    Fixes: 82790a8 ("tcg: Add markup for output requires new register")
    Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
    Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
    Message-Id: <20230719221310.1968845-7-iii@linux.ibm.com>
    Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
    (cherry picked from commit 22d2e53)
    Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
    iii-i authored and Michael Tokarev committed Jul 25, 2023
    Copy the full SHA
    560ff3c View commit details
    Browse the repository at this point in the history
  5. target/s390x: Make CKSM raise an exception if R2 is odd

    R2 designates an even-odd register pair; the instruction should raise
    a specification exception when R2 is not even.
    
    Cc: qemu-stable@nongnu.org
    Fixes: e023e83 ("s390x: translate engine for s390x CPU")
    Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
    Message-Id: <20230724082032.66864-2-iii@linux.ibm.com>
    Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
    Reviewed-by: David Hildenbrand <david@redhat.com>
    Signed-off-by: Thomas Huth <thuth@redhat.com>
    (cherry picked from commit 761b0aa)
    Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
    iii-i authored and Michael Tokarev committed Jul 25, 2023
    Copy the full SHA
    e70294c View commit details
    Browse the repository at this point in the history
  6. target/s390x: Fix CLM with M3=0

    When the mask is zero, access exceptions should still be recognized for
    1 byte at the second-operand address. CC should be set to 0.
    
    Cc: qemu-stable@nongnu.org
    Fixes: defb0e3 ("s390x: Implement opcode helpers")
    Reviewed-by: David Hildenbrand <david@redhat.com>
    Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
    Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
    Message-Id: <20230724082032.66864-3-iii@linux.ibm.com>
    Signed-off-by: Thomas Huth <thuth@redhat.com>
    (cherry picked from commit 4b6e4c0)
    Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
    iii-i authored and Michael Tokarev committed Jul 25, 2023
    Copy the full SHA
    616a71e View commit details
    Browse the repository at this point in the history
  7. target/s390x: Fix CONVERT TO LOGICAL/FIXED with out-of-range inputs

    CONVERT TO LOGICAL/FIXED deviate from IEEE 754 in that they raise an
    inexact exception on out-of-range inputs. float_flag_invalid_cvti
    aligns nicely with that behavior, so convert it to
    S390_IEEE_MASK_INEXACT.
    
    Cc: qemu-stable@nongnu.org
    Fixes: defb0e3 ("s390x: Implement opcode helpers")
    Reviewed-by: David Hildenbrand <david@redhat.com>
    Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
    Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
    Message-Id: <20230724082032.66864-4-iii@linux.ibm.com>
    Signed-off-by: Thomas Huth <thuth@redhat.com>
    (cherry picked from commit 53684e3)
    Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
    iii-i authored and Michael Tokarev committed Jul 25, 2023
    Copy the full SHA
    7414ac9 View commit details
    Browse the repository at this point in the history
  8. target/s390x: Fix ICM with M3=0

    When the mask is zero, access exceptions should still be recognized for
    1 byte at the second-operand address. CC should be set to 0.
    
    Cc: qemu-stable@nongnu.org
    Fixes: e023e83 ("s390x: translate engine for s390x CPU")
    Reviewed-by: David Hildenbrand <david@redhat.com>
    Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
    Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
    Message-Id: <20230724082032.66864-5-iii@linux.ibm.com>
    Signed-off-by: Thomas Huth <thuth@redhat.com>
    (cherry picked from commit a202555)
    Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
    iii-i authored and Michael Tokarev committed Jul 25, 2023
    Copy the full SHA
    4b4f25e View commit details
    Browse the repository at this point in the history
  9. target/s390x: Make MC raise specification exception when class >= 16

    MC requires bit positions 8-11 (upper 4 bits of class) to be zeros,
    otherwise it must raise a specification exception.
    
    Cc: qemu-stable@nongnu.org
    Fixes: 20d143e ("s390x/tcg: Implement MONITOR CALL")
    Reviewed-by: David Hildenbrand <david@redhat.com>
    Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
    Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
    Message-Id: <20230724082032.66864-6-iii@linux.ibm.com>
    Signed-off-by: Thomas Huth <thuth@redhat.com>
    (cherry picked from commit 9c028c0)
    Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
    iii-i authored and Michael Tokarev committed Jul 25, 2023
    Copy the full SHA
    50bda71 View commit details
    Browse the repository at this point in the history
  10. target/s390x: Fix assertion failure in VFMIN/VFMAX with type 13

    Type 13 is reserved, so using it should result in specification
    exception. Due to an off-by-1 error the code triggers an assertion at a
    later point in time instead.
    
    Cc: qemu-stable@nongnu.org
    Fixes: da48075 ("s390x/tcg: Implement VECTOR FP (MAXIMUM|MINIMUM)")
    Reviewed-by: David Hildenbrand <david@redhat.com>
    Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
    Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
    Message-Id: <20230724082032.66864-8-iii@linux.ibm.com>
    Signed-off-by: Thomas Huth <thuth@redhat.com>
    (cherry picked from commit ff537b0)
    Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
    iii-i authored and Michael Tokarev committed Jul 25, 2023
    Copy the full SHA
    e7d47bf View commit details
    Browse the repository at this point in the history
  11. target/loongarch: Fix the CSRRD CPUID instruction on big endian hosts

    The test in tests/avocado/machine_loongarch.py is currently failing
    on big endian hosts like s390x. By comparing the traces between running
    the QEMU_EFI.fd bios on a s390x and on a x86 host, it's quickly obvious
    that the CSRRD instruction for the CPUID is behaving differently. And
    indeed: The code currently does a long read (i.e. 64 bit) from the
    address that points to the CPUState->cpu_index field (with tcg_gen_ld_tl()
    in the trans_csrrd() function). But this cpu_index field is only an "int"
    (i.e. 32 bit). While this dirty pointer magic works on little endian hosts,
    it of course fails on big endian hosts. Fix it by using a proper helper
    function instead.
    
    Message-Id: <20230720175307.854460-1-thuth@redhat.com>
    Reviewed-by: Song Gao <gaosong@loongson.cn>
    Signed-off-by: Thomas Huth <thuth@redhat.com>
    (cherry picked from commit c34ad45)
    Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
    huth authored and Michael Tokarev committed Jul 25, 2023
    Copy the full SHA
    be16418 View commit details
    Browse the repository at this point in the history
  12. virtio-pci: add handling of PCI ATS and Device-TLB enable/disable

    According to PCIe Address Translation Services specification 5.1.3.,
    ATS Control Register has Enable bit to enable/disable ATS. Guest may
    enable/disable PCI ATS and, accordingly, Device-TLB for the VirtIO PCI
    device. So, raise/lower a flag and call a trigger function to pass this
    event to a device implementation.
    
    Signed-off-by: Viktor Prutyanov <viktor@daynix.com>
    Message-Id: <20230512135122.70403-2-viktor@daynix.com>
    Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
    Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
    (cherry picked from commit 206e91d)
    Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
    viktor-prutyanov authored and Michael Tokarev committed Jul 25, 2023
    Copy the full SHA
    93c257a View commit details
    Browse the repository at this point in the history
  13. vhost: register and change IOMMU flag depending on Device-TLB state

    The guest can disable or never enable Device-TLB. In these cases,
    it can't be used even if enabled in QEMU. So, check Device-TLB state
    before registering IOMMU notifier and select unmap flag depending on
    that. Also, implement a way to change IOMMU notifier flag if Device-TLB
    state is changed.
    
    Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=2001312
    Signed-off-by: Viktor Prutyanov <viktor@daynix.com>
    Acked-by: Jason Wang <jasowang@redhat.com>
    Message-Id: <20230626091258.24453-2-viktor@daynix.com>
    Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
    Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
    (cherry picked from commit ee071f6)
    Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
    viktor-prutyanov authored and Michael Tokarev committed Jul 25, 2023
    Copy the full SHA
    9a1e32d View commit details
    Browse the repository at this point in the history
  14. virtio-net: pass Device-TLB enable/disable events to vhost

    If vhost is enabled for virtio-net, Device-TLB enable/disable events
    must be passed to vhost for proper IOMMU unmap flag selection.
    
    Signed-off-by: Viktor Prutyanov <viktor@daynix.com>
    Acked-by: Jason Wang <jasowang@redhat.com>
    Message-Id: <20230626091258.24453-3-viktor@daynix.com>
    Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
    Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
    (cherry picked from commit cd9b834)
    Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
    viktor-prutyanov authored and Michael Tokarev committed Jul 25, 2023
    Copy the full SHA
    ce721d2 View commit details
    Browse the repository at this point in the history