On Thu, Jul 24, 2025 at 03:50:36PM -0700, Eric Biggers wrote:
> Another QEMU bug found by the Linux kernel's crypto tests
> (https://lore.kernel.org/linux-crypto/20250724173657.GB26800@sol/):
> 
> When KVM is disabled, QEMU's implementation of the AVX2 instruction
> 'vinserti128' with a memory source operand incorrectly reads 32 bytes
> from memory.  This differs from the real CPUs which read only 16 bytes,
> as per the spec
> (https://www.felixcloutier.com/x86/vinserti128:vinserti32x4:vinserti64x2:vinserti32x8:vinserti64x4)
> which defines the operand as xmm3/m128.
> 
> This can be reproduced by the recently-added poly1305_kunit test in
> linux-next, or alternatively by the following userspace program:
> 
>     #include <stddef.h>
>     #include <sys/mman.h>
>     int main()
>     {
>             unsigned char *buf = mmap(NULL, 8192, PROT_READ|PROT_WRITE,
>                                       MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
> 
>             munmap(buf + 4096, 4096);
>             asm volatile("vinserti128 $1, %0, %%ymm0, %%ymm0\n"
>                          :: "m" (buf[4080]));
>     }
> 
> That executes vinserti128 with a memory operand with 16 valid bytes
> followed by an unmapped page.  This works fine on the real CPUs, but it
> segfaults when run with qemu-x86_64.  To avoid the segfault in QEMU, we
> have to go down to buf[4064], which implies it reads 32 bytes.
> 
> This bug exists on the master branch of QEMU as well as v8.2.10 and
> v7.2.19.  So probably it's not new.
> 
> - Eric

It looks like support for this instruction was added by the following
commit:

    commit 7906847768613ea6b6e737f3295c77cdb4ff67f4
    Author: Paolo Bonzini <pbonz...@redhat.com>
    Date:   Tue Sep 6 10:34:11 2022 +0200

        target/i387: reimplement 0x0f 0x3a, add AVX

Reply via email to