> This patch enables PAC and AUT instructions for pointer signing and > authentication in JIT code on Windows/ARM64 when "UseBranchProtection" > flag is set and when the processor supports the feature. > > Specifically, JVM detects hardware support by reading ID_AA64ISAR1_EL1 > and ID_AA64ISAR2_EL1 registers via CP4031 and CP4032 keys in the Windows > registry. Then, if the "UseBranchProtection" flag is set, then HotSpot > emits the signing and authenticating instructions. Windows uses > AArch64's "B" key, so this patch selects between "paciaz" and "pacibz" > instructions (and similarly, between "autiaz" and "autibz" instructions) > depending on whether HotSpot is being compiled for Linux versus Windows. > Both the MacroAssembler and the Windows' PAC helpers need to stay in > sync, so this patch needs changes to both macroAssembler_aarch64.cpp as > well as pauth_windows_aarch64.inline.hpp. > > Since Linux supports both "A" as well as "B" keys, it's possible to use > "B" keys for both Linux and Windows, although I fear doing so may > introduce more churn in the code. > > This patch also introduces a cross-platform (Linux and Windows) test > that compiles and runs a method under both C1 and C2 before checking > whether the generated instructions include the "paci[ab]z" and the > "auti[ab]z" instructions. > > Since CI doesn't test with branch protection enabled, I manually changed > the default value of "UseBranchProtection" in globals_aarch64.cpp to be > "pac-ret" before running tier 1 through tier 3 tests in the HotSpot, > JDK, and LangTools test groups to ensure that this patch does not > introduce any new failures. I also validated this patch by running the > same tests with the default value for "UseBranchProtection". > > --------- > - [x] I confirm that I make this contribution in accordance with the [OpenJDK > Interim AI Policy](https://openjdk.org/legal/ai).
Ashay Rane has updated the pull request with a new target base due to a merge or a rebase. The incremental webrev excludes the unrelated changes brought in by the merge/rebase. The pull request contains four additional commits since the last revision: - Enable branch protection checks in CI build The intent behind this change is to make CI catch subtle bugs that corrupt return addresses. Whether the protection is actually enforced depends on whether the GitHub runner uses an AArch64 processor that supports pointer authentication. - Merge branch 'master' into JDK-8395991-windows-arm64-jit-pac-ret - Documentation updates - Include section numbers from ARM ISA document - Mark branch protection on Windows/ARM64 as supported - Enable pointer authentication for JIT code on Windows/ARM64 This patch enables PAC and AUT instructions for pointer signing and authentication in JIT code on Windows/ARM64 when "UseBranchProtection" flag is set and when the processor supports the feature. Specifically, JVM detects hardware support by reading ID_AA64ISAR1_EL1 and ID_AA64ISAR2_EL1 registers via CP4031 and CP4032 keys in the Windows registry. Then, if the "UseBranchProtection" flag is set, then HotSpot emits the signing and authenticating instructions. Windows uses AArch64's "B" key, so this patch selects between "paciaz" and "pacibz" instructions (and similarly, between "autiaz" and "autibz" instructions) depending on whether HotSpot is being compiled for Linux versus Windows. Both the MacroAssembler and the Windows' PAC helpers need to stay in sync, so this patch needs changes to both macroAssembler_aarch64.cpp as well as pauth_windows_aarch64.inline.hpp. Since Linux supports both "A" as well as "B" keys, it's possible to use "B" keys for both Linux and Windows, although I fear doing so may introduce more churn in the code. This patch also introduces a cross-platform (Linux and Windows) test that compiles and runs a method under both C1 and C2 before checking whether the generated instructions include the "paci[ab]z" and the "auti[ab]z" instructions. Since CI doesn't test with branch protection enabled, I manually changed the default value of "UseBranchProtection" in globals_aarch64.cpp to be "pac-ret" before running tier 1 through tier 3 tests in the HotSpot, JDK, and LangTools test groups to ensure that this patch does not introduce any new failures. I also validated this patch by running the same tests with the default value for "UseBranchProtection". ------------- Changes: - all: https://git.openjdk.org/jdk/pull/33595/files - new: https://git.openjdk.org/jdk/pull/33595/files/cb6d190b..ab761f83 Webrevs: - full: https://webrevs.openjdk.org/?repo=jdk&pr=33595&range=02 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=33595&range=01-02 Stats: 194318 lines in 1677 files changed: 68933 ins; 95065 del; 30320 mod Patch: https://git.openjdk.org/jdk/pull/33595.diff Fetch: git fetch https://git.openjdk.org/jdk.git pull/33595/head:pull/33595 PR: https://git.openjdk.org/jdk/pull/33595
