qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH 1/2] target/s390x: Fix MVC not always invalidating translatio


From: Ilya Leoshkevich
Subject: Re: [PATCH 1/2] target/s390x: Fix MVC not always invalidating translation blocks
Date: Tue, 28 Jan 2025 11:52:42 +0100
User-agent: Evolution 3.52.4 (3.52.4-2.fc40)

On Tue, 2025-01-28 at 10:56 +0100, David Hildenbrand wrote:
> On 28.01.25 01:12, Ilya Leoshkevich wrote:
> > Node.js crashes in qemu-system-s390x with random SIGSEGVs /
> > SIGILLs.
> > 
> > The v8 JIT used by Node.js can garbage collect and overwrite unused
> > code. Overwriting is performed by
> > WritableJitAllocation::CopyCode(),
> > which ultimately calls memcpy(). For certain sizes, memcpy() uses
> > the
> > MVC instruction.
> > 
> > QEMU implements MVC and other similar instructions using helpers.
> > While
> > TCG store ops invalidate affected translation blocks automatically,
> > helpers must do this manually by calling probe_access_flags(). The
> > MVC
> > helper does this using the access_prepare() -> access_prepare_nf()
> > ->
> > s390_probe_access() -> probe_access_flags() call chain.
> > 
> > At the last step of this chain, the store size is replaced with 0.
> > This
> > causes the probe_access_flags() -> notdirty_write() ->
> > tb_invalidate_phys_range_fast() chain to miss some translation
> > blocks.
> 
> We added the size parameter in:
> 
> commit 1770b2f2d3d6fe8f1e2d61692692264cac44340d
> Author: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
> Date:   Thu Feb 23 20:44:24 2023 -0300
> 
>      accel/tcg: Add 'size' param to probe_access_flags()
>      
>      probe_access_flags() as it is today uses probe_access_full(),
> which in
>      turn uses probe_access_internal() with size = 0.
> probe_access_internal()
>      then uses the size to call the tlb_fill() callback for the given
> CPU.
>      This size param ('fault_size' as probe_access_internal() calls
> it) is
>      ignored by most existing .tlb_fill callback implementations,
> e.g.
>      arm_cpu_tlb_fill(), ppc_cpu_tlb_fill(), x86_cpu_tlb_fill() and
>      mips_cpu_tlb_fill() to name a few.
> 
> 
> And added support for more than one byte for the notdirty case in
> 
> commit e2faabee78ff127848f59892747d4c07c56de033
> Author: Jessica Clarke <jrtc27@jrtc27.com>
> Date:   Fri Nov 10 21:43:03 2023 -0800
> 
>      accel/tcg: Forward probe size on to notdirty_write
>      
>      Without this, we just dirty a single byte, and so if the caller
> writes
>      more than one byte to the host memory then we won't have
> invalidated any
>      translation blocks that start after the first byte and overlap
> those
>      writes.
> 
> So I guess it's rather hard to find a "Fixes:" tag, because likely
> it's been
> broken forever?

Yes, I thought about this too and gave up.
However, I now wonder if we still need one for non-philosophical, but
rather practical backporting reasons? Then

Fixes: e2faabee78ff ("accel/tcg: Forward probe size on to
notdirty_write")

(v8.2.0+) should be the right one I think?

> > When this happens, QEMU executes a mix of old and new code. This
> > quickly leads to either a SIGSEGV or a SIGILL in case the old code
> > ends in the middle of a new instruction.
> > 
> > Fix by passing the true size.
> 
> 
> Reviewed-by: David Hildenbrand <david@redhat.com>




reply via email to

[Prev in Thread] Current Thread [Next in Thread]