• Daniel Lehmann's avatar
    [wasm] Align different write protection scopes · d0cfa6aa
    Daniel Lehmann authored
    Currently, we have two different classes for switching the WebAssembly
    generated code space to writable (e.g., before patching jump tables, or
    when adding or removing code): `CodeSpaceWriteScope` (with the macro
    `CODE_SPACE_WRITE_SCOPE`) and `NativeModuleModificationScope`.
    The former was introduced for Apple Silicon ARM64 hardware ("Apple M1"),
    which uses `MAP_JIT` + `pthread_jit_write_protect_np()` to change memory
    permissions. The latter uses either Intel PKU (aka. memory protection
    keys) to switch permissions (fast and thread-local, like on M1), and
    alternatively `mprotect()`, on systems that do not have PKU support.
    
    Since both classes serve the same purpose just with different
    implementations on different platforms, we want to merge them in
    follow-up CLs. As a first step, here we align all uses of
    `CODE_SPACE_WRITE_SCOPE` with existing `NativeModuleModificationScope`s.
    The two had diverged due to optimization work, where we moved
    `NativeModuleModificationScope`s around (pulling them out of loops and
    across function boundaries) to lower the amount of mprotect switches.
    
    This should have none, or at best a very small positive performance
    impact on Apple M1, since we now also switch less often (even though
    switching should be very cheap). In terms of security, this in theory
    makes the code space writable for longer time spans, but this is
    probably not a large effect because
    (1) we often moved the scope outside of loops, where it was open for
    every iteration anyway, or
    (2) in some cases a CODE_SPACE_WRITE_SCOPE was open somewhere on the
    call stack already.
    
    R=jkummerow@chromium.org
    CC=clemensb@chromium.org
    
    Bug: v8:11714
    Change-Id: Id8744429e1183e118ab5e078750d294a99c9dce0
    Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2968946Reviewed-by: 's avatarJakob Kummerow <jkummerow@chromium.org>
    Commit-Queue: Daniel Lehmann <dlehmann@google.com>
    Cr-Commit-Position: refs/heads/master@{#75230}
    d0cfa6aa
wasm-code-manager.cc 96.4 KB