• Igor Sheludko's avatar
    [rwx][mac] Support fast W^X permission switching on Apple Silicon (M1) · 9d31f866
    Igor Sheludko authored
    ... for V8 code space. The feature is currently disabled.
    
    In order to use fast W^X permission switching we must allocate
    executable pages with readable writable executable permissions (RWX).
    However, MacOS on ARM64 ("Apple M1"/Apple Silicon) prohibits further
    permission changing of RWX memory pages. This means that the code page
    headers must be allocated with RWX permissions too because otherwise
    it wouldn't be possible to allocate a large code page over the freed
    regular code page and vice versa.
    
    When enabled, the new machinery works as follows:
    
    1) when memory region is reserved for allocating executable pages, the
       whole region is committed with RWX permissions and then decommitted,
    2) since reconfiguration of RWX page permissions is not allowed on
       MacOS on ARM64 ("Apple M1"/Apple Silicon), there must be no attempts
       to change them,
    3) the request to set RWX permissions in the executable page region
       just recommits the pages without changing permissions (see (1), they
       were already allocated as RWX and then discarded),
    4) in order to make executable pages inaccessible one must use
       OS::DiscardSystemPages() instead of OS::DecommitPages() or
       setting permissions to kNoAccess because the latter two are not
       allowed by the MacOS (see (2)).
    5) since code space page headers are allocated as RWX pages it's also
       necessary to switch between W^X modes when updating the data in the
       page headers (i.e. when marking, updating stats, wiring pages in
       lists, etc.). The new CodePageHeaderModificationScope class is used
       in the respective places. On unrelated configurations it's a no-op.
    
    The fast permission switching can't be used for V8 configuration with
    enabled pointer compression and disabled external code space because
    a) the pointer compression cage has to be reserved with MAP_JIT flag
       which is too expensive,
    b) in case of shared pointer compression cage if the code range will
       be deleted while the cage is still alive then attempt to configure
       permissions of pages that were previously set to RWX will fail.
    
    This also CL extends the unmapper unit tests with permissions tracking
    for discarded pages.
    
    Bug: v8:12797
    Change-Id: Idb28cbc481306477589eee9962d2e75167d87c61
    Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3579303Reviewed-by: 's avatarNico Hartmann <nicohartmann@chromium.org>
    Reviewed-by: 's avatarClemens Backes <clemensb@chromium.org>
    Reviewed-by: 's avatarMichael Lippautz <mlippautz@chromium.org>
    Commit-Queue: Igor Sheludko <ishell@chromium.org>
    Cr-Commit-Position: refs/heads/main@{#80238}
    9d31f866
Name
Last commit
Last update
.github Loading commit data...
bazel Loading commit data...
build_overrides Loading commit data...
custom_deps Loading commit data...
docs Loading commit data...
gni Loading commit data...
include Loading commit data...
infra Loading commit data...
samples Loading commit data...
src Loading commit data...
test Loading commit data...
testing Loading commit data...
third_party Loading commit data...
tools Loading commit data...
.bazelrc Loading commit data...
.clang-format Loading commit data...
.clang-tidy Loading commit data...
.editorconfig Loading commit data...
.flake8 Loading commit data...
.git-blame-ignore-revs Loading commit data...
.gitattributes Loading commit data...
.gitignore Loading commit data...
.gn Loading commit data...
.mailmap Loading commit data...
.style.yapf Loading commit data...
.vpython Loading commit data...
.vpython3 Loading commit data...
.ycm_extra_conf.py Loading commit data...
AUTHORS Loading commit data...
BUILD.bazel Loading commit data...
BUILD.gn Loading commit data...
CODE_OF_CONDUCT.md Loading commit data...
COMMON_OWNERS Loading commit data...
DEPS Loading commit data...
DIR_METADATA Loading commit data...
ENG_REVIEW_OWNERS Loading commit data...
INFRA_OWNERS Loading commit data...
INTL_OWNERS Loading commit data...
LICENSE Loading commit data...
LICENSE.fdlibm Loading commit data...
LICENSE.strongtalk Loading commit data...
LICENSE.v8 Loading commit data...
LOONG_OWNERS Loading commit data...
MIPS_OWNERS Loading commit data...
OWNERS Loading commit data...
PPC_OWNERS Loading commit data...
PRESUBMIT.py Loading commit data...
README.md Loading commit data...
RISCV_OWNERS Loading commit data...
S390_OWNERS Loading commit data...
WATCHLISTS Loading commit data...
WORKSPACE Loading commit data...
codereview.settings Loading commit data...