<pre style='margin:0'>
Christopher Nielsen (mascguy) pushed a commit to branch master
in repository macports-ports.
</pre>
<p><a href="https://github.com/macports/macports-ports/commit/93a72370138c73b59807849a292503977c6f9cdf">https://github.com/macports/macports-ports/commit/93a72370138c73b59807849a292503977c6f9cdf</a></p>
<pre style="white-space: pre; background: #F8F8F8">The following commit(s) were added to refs/heads/master by this push:
<span style='display:block; white-space:pre;color:#404040;'> new 93a72370138 openjdkXX: fix configure flags
</span>93a72370138 is described below
<span style='display:block; white-space:pre;color:#808000;'>commit 93a72370138c73b59807849a292503977c6f9cdf
</span>Author: usersxx <97012123+usersxx@users.noreply.github.com>
AuthorDate: Fri Apr 1 09:32:30 2022 +0530
<span style='display:block; white-space:pre;color:#404040;'> openjdkXX: fix configure flags
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> openjdk11: fix configure flags, add arm64 support, fix build on Darwin 21/macOS 12 arm64, fix dependencies and add variants
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> openjdk13: fix configure flags, fix dependencies and add variants
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> openjdk15: fix configure flags, fix dependencies and add variants
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> openjdk17: fix configure flags, fix build on Darwin 21/macOS 12 arm64, fix dependencies and add variants
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> openjdk8: fix dependencies and add variants
</span><span style='display:block; white-space:pre;color:#404040;'> Co-Authored-By: Guilherme Íscaro <cabelitostos@gmail.com>
</span>---
java/openjdk11/Portfile | 84 +-
.../openjdk11/files/patch-openjdk11-arm64-fix.diff | 249 ++
.../files/patch-openjdk11-arm64-fix2.diff | 20 +
.../files/patch-openjdk11-arm64-fix3.diff | 31 +
java/openjdk11/files/patch-openjdk11-arm64.diff | 4647 ++++++++++++++++++++
java/openjdk11/files/patch-openjdk11-build1.diff | 11 +
java/openjdk11/files/patch-openjdk11-build2.diff | 56 +
java/openjdk13/Portfile | 58 +-
java/openjdk15/Portfile | 58 +-
java/openjdk17/Portfile | 66 +-
java/openjdk17/files/patch-openjdk17-build1.diff | 11 +
java/openjdk18/Portfile | 54 +-
java/openjdk8/Portfile | 29 +-
13 files changed, 5322 insertions(+), 52 deletions(-)
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/java/openjdk11/Portfile b/java/openjdk11/Portfile
</span><span style='display:block; white-space:pre;color:#808080;'>index 79b5c1147f4..4245fbcf38f 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/java/openjdk11/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/java/openjdk11/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -5,10 +5,10 @@ PortSystem 1.0
</span> name openjdk11
# https://github.com/openjdk/jdk11u/tags
version 11.0.14.1
<span style='display:block; white-space:pre;background:#ffe0e0;'>-revision 2
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+revision 3
</span> categories java devel
platforms darwin
<span style='display:block; white-space:pre;background:#ffe0e0;'>-supported_archs x86_64
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+supported_archs x86_64 arm64
</span> license GPL-2+
maintainers {outlook.com:usersword123 @usersxx} openmaintainer
description Openjdk 11
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -19,29 +19,91 @@ fetch.type git
</span> git.url https://github.com/openjdk/jdk11u
git.branch jdk-${version}-ga
depends_build port:autoconf \
<span style='display:block; white-space:pre;background:#ffe0e0;'>- port:gmake
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-depends_lib port:openjdk11-bootstrap
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ port:gmake \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ port:bash \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ port:openjdk11-bootstrap
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+if {${configure.build_arch} eq "x86_64"} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ patchfiles patch-openjdk11-build2.diff
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+} elseif {${configure.build_arch} eq "arm64"} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ depends_build-replace port:openjdk11-bootstrap port:openjdk11-zulu
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ patchfiles patch-openjdk11-build2.diff \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ patch-openjdk11-arm64-fix.diff \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ patch-openjdk11-arm64.diff \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ patch-openjdk11-arm64-fix2.diff \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ patch-openjdk11-arm64-fix3.diff
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if {${os.major} == 21} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ patchfiles-append patch-openjdk11-build1.diff
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ use_xcode yes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+default_variants +server +release
</span>
set tpath /Library/Java
use_configure yes
<span style='display:block; white-space:pre;background:#ffe0e0;'>-configure.cmd sh configure
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+configure.cmd ${prefix}/bin/bash configure
</span> configure.pre_args --prefix=${tpath}
<span style='display:block; white-space:pre;background:#e0ffe0;'>+set extrachflags "-isysroot `xcrun --sdk macosx --show-sdk-path` -arch ${configure.build_arch}"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set extracxxflags "-isysroot `xcrun --sdk macosx --show-sdk-path` -arch ${configure.build_arch}"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set extraldflags "-Wl,-syslibroot,`xcrun --sdk macosx --show-sdk-path` -arch ${configure.build_arch}"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set jchflags "-Wno-implicit-function-declaration -Wno-unused-parameter"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set jcxxflags "-Wno-implicit-function-declaration -Wno-unused-parameter"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set jldflags "-L`xcrun --sdk macosx --show-sdk-path`/usr/lib -L`xcrun --sdk macosx --show-sdk-path`/usr/lib/system"
</span> # default configure args
configure.args --with-debug-level=release \
--with-native-debug-symbols=none \
--with-version-pre=release \
--with-jvm-variants=server \
--with-sysroot=`xcrun --sdk macosx --show-sdk-path` \
<span style='display:block; white-space:pre;background:#ffe0e0;'>- --with-extra-cflags="${configure.cflags}" \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- --with-extra-cxxflags="${configure.cxxflags}" \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- --with-extra-ldflags="${configure.ldflags}" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ --with-extra-cflags="${configure.cflags} ${extrachflags} ${jchflags}" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ --with-extra-cxxflags="${configure.cxxflags} ${extracxxflags} ${jcxxflags}" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ --with-extra-ldflags="${configure.ldflags} ${extraldflags} ${jldflags}" \
</span> --with-boot-jdk=/Library/Java/JavaVirtualMachines/openjdk11-bootstrap/Contents/Home \
--disable-warnings-as-errors \
--disable-precompiled-headers \
--with-conf-name=openjdk${version}
<span style='display:block; white-space:pre;background:#ffe0e0;'>-configure.cflags-append "-arch ${configure.build_arch} -Wno-implicit-function-declaration -Wno-unused-parameter"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-configure.cxxflags-append "-arch ${configure.build_arch} -Wno-implicit-function-declaration -Wno-unused-parameter"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-configure.ldflags-append "-arch ${configure.build_arch} -L`xcrun --sdk macosx --show-sdk-path`/usr/lib -L`xcrun --sdk macosx --show-sdk-path`/usr/lib/system"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+variant server \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ description {JVM with normal interpreter, and a tiered C1/C2 compiler} {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+variant release \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ description {OpenJDK with no debug information, all optimizations and no asserts} {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+variant optimized \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ description {OpenJDK with no debug information, all optimizations, no asserts and HotSpot is 'optimized'} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ configure.args-replace --with-debug-level=release --with-debug-level=optimized
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+variant debug \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ description {OpenJDK with debug information, all optimizations and all asserts} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ configure.args-append --enable-debug
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+variant client \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ description {JVM with normal interpreter, C1 and no C2 compiler} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ configure.args-replace --with-jvm-variants=server --with-jvm-variants=client
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+variant minimal \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ description {JVM with reduced form of normal interpreter having C1, no C2 compiler and optional features stripped out} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ configure.args-replace --with-jvm-variants=server --with-jvm-variants=minimal
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+variant core \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ conflicts server client minimal \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ description {JVM with normal interpreter only and no compiler} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ configure.args-replace --with-jvm-variants=server --with-jvm-variants=core
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+if {${configure.build_arch} eq "arm64"} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ configure.args-replace --with-boot-jdk=/Library/Java/JavaVirtualMachines/openjdk11-bootstrap/Contents/Home \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ --with-boot-jdk=/Library/Java/JavaVirtualMachines/openjdk11-zulu/Contents/Home
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ configure.post_args --with-build-jdk=/Library/Java/JavaVirtualMachines/openjdk11-zulu/Contents/Home \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ --openjdk-target=aarch64-apple-darwin
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+} elseif {${configure.build_arch} eq "x86_64"} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ configure.post_args
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span> build.type gnu
build.target images
use_parallel_build no
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/java/openjdk11/files/patch-openjdk11-arm64-fix.diff b/java/openjdk11/files/patch-openjdk11-arm64-fix.diff
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..95686bf60ee
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/java/openjdk11/files/patch-openjdk11-arm64-fix.diff
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,249 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/hotspot/os/bsd/os_bsd.cpp.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/hotspot/os/bsd/os_bsd.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -22,6 +22,16 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * On macOS MAP_JIT cannot be used in conjunction with MAP_FIXED when mapping
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * a page for codecache. Therefore our traditional technique of doing commit
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * and uncommit - replacing a mapping with another one at the same address
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * range but swapped MAP_NORESERVE - does not work.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * The "exec" flag basically means "its code cache" and it should be used
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * consistently for the same mapping (reserve-commit-uncommit etc)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * This affects pd_reserve_memory, pd_commit_memory, pd_uncommit_memory functions
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // no precompiled headers
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include "jvm.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include "classfile/classLoader.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2007,12 +2017,25 @@ static void warn_fail_commit_memory(char* addr, size_t size, bool exec,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // problem.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ bool os::pd_commit_memory(char* addr, size_t size, bool exec) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int prot = exec ? PROT_READ|PROT_WRITE|PROT_EXEC : PROT_READ|PROT_WRITE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#ifdef __OpenBSD__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(__OpenBSD__)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // XXX: Work-around mmap/MAP_FIXED bug temporarily on OpenBSD
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Events::log(NULL, "Protecting memory [" INTPTR_FORMAT "," INTPTR_FORMAT "] with protection modes %x", p2i(addr), p2i(addr+size), prot);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (::mprotect(addr, size, prot) == 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return true;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#elif defined(__APPLE__)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (exec) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // Do not replace MAP_JIT mappings, see JDK-8234930
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (::mprotect(addr, size, prot) == 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return true;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ uintptr_t res = (uintptr_t) ::mmap(addr, size, prot,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (res != (uintptr_t) MAP_FAILED) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return true;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uintptr_t res = (uintptr_t) ::mmap(addr, size, prot,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2091,11 +2114,23 @@ char *os::scan_pages(char *start, char* end, page_info* page_expected, page_info
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-bool os::pd_uncommit_memory(char* addr, size_t size) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#ifdef __OpenBSD__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++MACOS_ONLY(bool os::pd_uncommit_memory(char* addr, size_t size, bool executable))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++NOT_MACOS(bool os::pd_uncommit_memory(char* addr, size_t size)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(__OpenBSD__)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // XXX: Work-around mmap/MAP_FIXED bug temporarily on OpenBSD
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Events::log(NULL, "Protecting memory [" INTPTR_FORMAT "," INTPTR_FORMAT "] with PROT_NONE", p2i(addr), p2i(addr+size));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return ::mprotect(addr, size, PROT_NONE) == 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#elif defined(__APPLE__)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (executable) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (::madvise(addr, size, MADV_FREE) != 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return false;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return ::mprotect(addr, size, PROT_NONE) == 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ uintptr_t res = (uintptr_t) ::mmap(addr, size, PROT_NONE,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ MAP_PRIVATE|MAP_FIXED|MAP_NORESERVE|MAP_ANONYMOUS, -1, 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return res != (uintptr_t) MAP_FAILED;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uintptr_t res = (uintptr_t) ::mmap(addr, size, PROT_NONE,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ MAP_PRIVATE|MAP_FIXED|MAP_NORESERVE|MAP_ANONYMOUS, -1, 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2119,11 +2154,17 @@ bool os::remove_stack_guard_pages(char* addr, size_t size) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // 'requested_addr' is only treated as a hint, the return value may or
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // may not start from the requested address. Unlike Bsd mmap(), this
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // function returns NULL to indicate failure.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-static char* anon_mmap(char* requested_addr, size_t bytes, bool fixed) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static char* anon_mmap(char* requested_addr, size_t bytes, bool fixed, bool executable = false) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ char * addr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int flags;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ flags = MAP_PRIVATE | MAP_NORESERVE | MAP_ANONYMOUS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef __APPLE__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (executable) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ guarantee(!fixed, "MAP_JIT (for execute) is incompatible with MAP_FIXED");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ flags |= MAP_JIT;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (fixed) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ assert((uintptr_t)requested_addr % os::Bsd::page_size() == 0, "unaligned address");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ flags |= MAP_FIXED;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2142,10 +2183,18 @@ static int anon_munmap(char * addr, size_t size) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return ::munmap(addr, size) == 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(__APPLE__)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++char* os::pd_reserve_memory(size_t bytes, char* requested_addr,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ size_t alignment_hint,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ bool executable) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return anon_mmap(requested_addr, bytes, (requested_addr != NULL), executable);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ char* os::pd_reserve_memory(size_t bytes, char* requested_addr,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ size_t alignment_hint) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return anon_mmap(requested_addr, bytes, (requested_addr != NULL));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ bool os::pd_release_memory(char* addr, size_t size) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return anon_munmap(addr, size);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/hotspot/share/memory/virtualspace.cpp.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/hotspot/share/memory/virtualspace.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -196,7 +196,8 @@ void ReservedSpace::initialize(size_t size, size_t alignment, bool large,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ base = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- base = os::reserve_memory(size, NULL, alignment, _fd_for_heap);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ base = MACOS_ONLY(os::reserve_memory(size, NULL, alignment, _fd_for_heap, _executable))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ NOT_MACOS(os::reserve_memory(size, NULL, alignment, _fd_for_heap));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (base == NULL) return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -990,7 +991,8 @@ void VirtualSpace::shrink_by(size_t size) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ assert(middle_high_boundary() <= aligned_upper_new_high &&
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ aligned_upper_new_high + upper_needs <= upper_high_boundary(),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ "must not shrink beyond region");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- if (!os::uncommit_memory(aligned_upper_new_high, upper_needs)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (MACOS_ONLY(!os::uncommit_memory(aligned_upper_new_high, upper_needs, _executable))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ NOT_MACOS(!os::uncommit_memory(aligned_upper_new_high, upper_needs))) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ debug_only(warning("os::uncommit_memory failed"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1001,7 +1003,8 @@ void VirtualSpace::shrink_by(size_t size) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ assert(lower_high_boundary() <= aligned_middle_new_high &&
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ aligned_middle_new_high + middle_needs <= middle_high_boundary(),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ "must not shrink beyond region");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- if (!os::uncommit_memory(aligned_middle_new_high, middle_needs)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (MACOS_ONLY(!os::uncommit_memory(aligned_middle_new_high, middle_needs, _executable))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ NOT_MACOS(!os::uncommit_memory(aligned_middle_new_high, middle_needs))) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ debug_only(warning("os::uncommit_memory failed"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1012,7 +1015,8 @@ void VirtualSpace::shrink_by(size_t size) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ assert(low_boundary() <= aligned_lower_new_high &&
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ aligned_lower_new_high + lower_needs <= lower_high_boundary(),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ "must not shrink beyond region");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- if (!os::uncommit_memory(aligned_lower_new_high, lower_needs)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (MACOS_ONLY(!os::uncommit_memory(aligned_lower_new_high, lower_needs, _executable))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ NOT_MACOS(!os::uncommit_memory(aligned_lower_new_high, lower_needs))) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ debug_only(warning("os::uncommit_memory failed"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/hotspot/share/runtime/os.cpp.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/hotspot/share/runtime/os.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1737,7 +1737,8 @@ bool os::create_stack_guard_pages(char* addr, size_t bytes) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return os::pd_create_stack_guard_pages(addr, bytes);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-char* os::reserve_memory(size_t bytes, char* addr, size_t alignment_hint, int file_desc) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++MACOS_ONLY(char* os::reserve_memory(size_t bytes, char* addr, size_t alignment_hint, int file_desc, bool executable))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++NOT_MACOS(char* os::reserve_memory(size_t bytes, char* addr, size_t alignment_hint, int file_desc)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ char* result = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (file_desc != -1) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1748,7 +1749,8 @@ char* os::reserve_memory(size_t bytes, char* addr, size_t alignment_hint, int fi
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ MemTracker::record_virtual_memory_reserve_and_commit((address)result, bytes, CALLER_PC);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- result = pd_reserve_memory(bytes, addr, alignment_hint);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ result = MACOS_ONLY(pd_reserve_memory(bytes, addr, alignment_hint, executable))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ NOT_MACOS(pd_reserve_memory(bytes, addr, alignment_hint));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (result != NULL) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ MemTracker::record_virtual_memory_reserve((address)result, bytes, CALLER_PC);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1818,16 +1820,19 @@ void os::commit_memory_or_exit(char* addr, size_t size, size_t alignment_hint,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ MemTracker::record_virtual_memory_commit((address)addr, size, CALLER_PC);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-bool os::uncommit_memory(char* addr, size_t bytes) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++MACOS_ONLY(bool os::uncommit_memory(char* addr, size_t bytes, bool executable))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++NOT_MACOS(bool os::uncommit_memory(char* addr, size_t bytes)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ bool res;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (MemTracker::tracking_level() > NMT_minimal) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Tracker tkr(Tracker::uncommit);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- res = pd_uncommit_memory(addr, bytes);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ res = MACOS_ONLY(pd_uncommit_memory(addr, bytes, executable))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ NOT_MACOS(pd_uncommit_memory(addr, bytes));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (res) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ tkr.record((address)addr, bytes);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- res = pd_uncommit_memory(addr, bytes);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ res = MACOS_ONLY(pd_uncommit_memory(addr, bytes, executable))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ NOT_MACOS(pd_uncommit_memory(addr, bytes));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return res;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/hotspot/share/runtime/os.hpp.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/hotspot/share/runtime/os.hpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -116,8 +116,12 @@ class os: AllStatic {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ _page_sizes[1] = 0; // sentinel
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- static char* pd_reserve_memory(size_t bytes, char* addr = 0,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- size_t alignment_hint = 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ MACOS_ONLY(static char* pd_reserve_memory(size_t bytes, char* addr = 0,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ size_t alignment_hint = 0,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ bool executable = false);)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ NOT_MACOS(static char* pd_reserve_memory(size_t bytes, char* addr = 0,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ size_t alignment_hint = 0);)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static char* pd_attempt_reserve_memory_at(size_t bytes, char* addr);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static char* pd_attempt_reserve_memory_at(size_t bytes, char* addr, int file_desc);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static void pd_split_reserved_memory(char *base, size_t size,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -132,7 +136,9 @@ class os: AllStatic {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static void pd_commit_memory_or_exit(char* addr, size_t size,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ size_t alignment_hint,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ bool executable, const char* mesg);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- static bool pd_uncommit_memory(char* addr, size_t bytes);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ MACOS_ONLY(static bool pd_uncommit_memory(char* addr, size_t bytes,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ bool executable = false);)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ NOT_MACOS(static bool pd_uncommit_memory(char* addr, size_t bytes);)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static bool pd_release_memory(char* addr, size_t bytes);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static char* pd_map_memory(int fd, const char* file_name, size_t file_offset,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -330,8 +336,11 @@ class os: AllStatic {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ const size_t size);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static int vm_allocation_granularity();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- static char* reserve_memory(size_t bytes, char* addr = 0,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- size_t alignment_hint = 0, int file_desc = -1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ MACOS_ONLY(static char* reserve_memory(size_t bytes, char* addr = 0,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ size_t alignment_hint = 0, int file_desc = -1,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ bool executable = false);)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ NOT_MACOS(static char* reserve_memory(size_t bytes, char* addr = 0,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ size_t alignment_hint = 0, int file_desc = -1);)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static char* reserve_memory(size_t bytes, char* addr,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ size_t alignment_hint, MEMFLAGS flags);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static char* reserve_memory_aligned(size_t size, size_t alignment, int file_desc = -1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -348,7 +357,8 @@ class os: AllStatic {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static void commit_memory_or_exit(char* addr, size_t size,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ size_t alignment_hint,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ bool executable, const char* mesg);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- static bool uncommit_memory(char* addr, size_t bytes);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ MACOS_ONLY(static bool uncommit_memory(char* addr, size_t bytes, bool executable = false);)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ NOT_MACOS(static bool uncommit_memory(char* addr, size_t bytes);)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static bool release_memory(char* addr, size_t bytes);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // Touch memory pages that cover the memory range from start to end (exclusive)
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/java/openjdk11/files/patch-openjdk11-arm64-fix2.diff b/java/openjdk11/files/patch-openjdk11-arm64-fix2.diff
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..067c33a231b
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/java/openjdk11/files/patch-openjdk11-arm64-fix2.diff
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,20 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/hotspot/share/prims/jvmtiEnv.cpp.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/hotspot/share/prims/jvmtiEnv.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -3287,6 +3287,8 @@ JvmtiEnv::RawMonitorEnter(JvmtiRawMonitor * rmonitor) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int r = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Thread* thread = Thread::current();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // 8266889: raw_enter changes Java thread state, needs WXWrite
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ MACOS_AARCH64_ONLY(ThreadWXEnable __wx(WXWrite, thread));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (thread->is_Java_thread()) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ JavaThread* current_thread = (JavaThread*)thread;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -3384,6 +3386,8 @@ jvmtiError
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ JvmtiEnv::RawMonitorWait(JvmtiRawMonitor * rmonitor, jlong millis) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int r = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Thread* thread = Thread::current();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // 8266889: raw_wait changes Java thread state, needs WXWrite
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ MACOS_AARCH64_ONLY(ThreadWXEnable __wx(WXWrite, thread));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (thread->is_Java_thread()) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ JavaThread* current_thread = (JavaThread*)thread;
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/java/openjdk11/files/patch-openjdk11-arm64-fix3.diff b/java/openjdk11/files/patch-openjdk11-arm64-fix3.diff
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..ae9561d87cb
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/java/openjdk11/files/patch-openjdk11-arm64-fix3.diff
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,31 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/hotspot/share/prims/jni.cpp.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/hotspot/share/prims/jni.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -4151,6 +4151,10 @@ static jint JNICALL jni_DestroyJavaVM_inner(JavaVM *vm) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // Since this is not a JVM_ENTRY we have to set the thread state manually before entering.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ JavaThread* thread = JavaThread::current();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // We are going to VM, change W^X state to the expected one.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ MACOS_AARCH64_ONLY(WXMode oldmode = thread->enable_wx(WXWrite));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ThreadStateTransition::transition_from_native(thread, _thread_in_vm);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (Threads::destroy_vm()) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // Should not change thread state, VM is gone
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -4159,6 +4163,7 @@ static jint JNICALL jni_DestroyJavaVM_inner(JavaVM *vm) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return res;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ThreadStateTransition::transition_and_fence(thread, _thread_in_vm, _thread_in_native);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ MACOS_AARCH64_ONLY(thread->enable_wx(oldmode));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ res = JNI_ERR;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return res;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -4342,6 +4347,9 @@ jint JNICALL jni_DetachCurrentThread(JavaVM *vm) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return JNI_ERR;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // We are going to VM, change W^X state to the expected one.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ MACOS_AARCH64_ONLY(thread->enable_wx(WXWrite));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // Safepoint support. Have to do call-back to safepoint code, if in the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // middle of a safepoint operation
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ThreadStateTransition::transition_from_native(thread, _thread_in_vm);
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/java/openjdk11/files/patch-openjdk11-arm64.diff b/java/openjdk11/files/patch-openjdk11-arm64.diff
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..8f0b342cb69
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/java/openjdk11/files/patch-openjdk11-arm64.diff
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,4647 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+This patch adds arm64 support using OpenJDK's AArch64 port
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- make/autoconf/build-aux/config.guess.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ make/autoconf/build-aux/config.guess
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1,6 +1,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #!/bin/sh
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# Copyright (c) 2012, 2021, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# Copyright (c) 2021, Azul Systems, Inc. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # This code is free software; you can redistribute it and/or modify it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -106,6 +107,14 @@ if [ "x$OUT" = x ]; then
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fi
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fi
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# Test and fix cpu on macos-aarch64, uname -p reports arm, buildsys expects aarch64
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++echo $OUT | grep arm-apple-darwin > /dev/null 2> /dev/null
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++if test $? = 0; then
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if [ `uname -m` = arm64 ]; then
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ OUT=aarch64`echo $OUT | sed -e 's/[^-]*//'`
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fi
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++fi
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # Test and fix cpu on Macosx when C preprocessor is not on the path
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ echo $OUT | grep i386-apple-darwin > /dev/null 2> /dev/null
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if test $? = 0; then
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- make/autoconf/flags.m4.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ make/autoconf/flags.m4
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -111,19 +111,25 @@ AC_DEFUN([FLAGS_SETUP_MACOSX_VERSION],
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ [
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # Additional macosx handling
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if test "x$OPENJDK_TARGET_OS" = xmacosx; then
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ # The expected format for <version> is either nn.n.n or nn.nn.nn. See
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ # /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/AvailabilityVersions.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # MACOSX_VERSION_MIN specifies the lowest version of Macosx that the built
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # binaries should be compatible with, even if compiled on a newer version
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # of the OS. It currently has a hard coded value. Setting this also limits
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # exposure to API changes in header files. Bumping this is likely to
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # require code changes to build.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- MACOSX_VERSION_MIN=10.9.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if test "x$OPENJDK_TARGET_CPU_ARCH" = xaarch64; then
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ MACOSX_VERSION_MIN=11.00.00
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ MACOSX_VERSION_MIN=10.9.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fi
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ MACOSX_VERSION_MIN_NODOTS=${MACOSX_VERSION_MIN//\./}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ AC_SUBST(MACOSX_VERSION_MIN)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # Setting --with-macosx-version-max=<version> makes it an error to build or
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- # link to macosx APIs that are newer than the given OS version. The expected
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- # format for <version> is either nn.n.n or nn.nn.nn. See /usr/include/AvailabilityMacros.h.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ # link to macosx APIs that are newer than the given OS version.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ AC_ARG_WITH([macosx-version-max], [AS_HELP_STRING([--with-macosx-version-max],
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ [error on use of newer functionality. @<:@macosx@:>@])],
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ [
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- make/autoconf/hotspot.m4.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ make/autoconf/hotspot.m4
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1,5 +1,5 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-# Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# Copyright (c) 2011, 2021, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # This code is free software; you can redistribute it and/or modify it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -274,6 +274,14 @@ AC_DEFUN_ONCE([HOTSPOT_ENABLE_DISABLE_CDS],
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fi
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fi
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ # Disable CDS on macos-aarch64
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if test "x$OPENJDK_TARGET_OS" = "xmacosx" && test "x$OPENJDK_TARGET_CPU" = "xaarch64"; then
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ENABLE_CDS="false"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if test "x$enable_cds" = "xyes"; then
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ AC_MSG_ERROR([CDS is currently not supported on macOS/aarch64. Remove --enable-cds.])
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fi
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fi
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ AC_SUBST(ENABLE_CDS)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ])
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- make/common/NativeCompilation.gmk.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ make/common/NativeCompilation.gmk
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1213,7 +1213,7 @@ define SetupNativeCompilationBody
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # This only works if the openjdk_codesign identity is present on the system. Let
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # silently fail otherwise.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ifneq ($(CODESIGN), )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- $(CODESIGN) -s "$(MACOSX_CODESIGN_IDENTITY)" --timestamp --options runtime \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ $(CODESIGN) -f -s "$(MACOSX_CODESIGN_IDENTITY)" --timestamp --options runtime \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ --entitlements $$(call GetEntitlementsFile, $$@) $$@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- make/hotspot/gensrc/GensrcAdlc.gmk.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ make/hotspot/gensrc/GensrcAdlc.gmk
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1,5 +1,5 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-# Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# Copyright (c) 2013, 2021, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # This code is free software; you can redistribute it and/or modify it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -99,6 +99,9 @@ ifeq ($(call check-jvm-feature, compiler2), true)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ADLCFLAGS += -DAIX=1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ else ifeq ($(OPENJDK_TARGET_OS), macosx)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ADLCFLAGS += -D_ALLBSD_SOURCE=1 -D_GNU_SOURCE=1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ifeq ($(HOTSPOT_TARGET_CPU_ARCH), aarch64)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ADLCFLAGS += -DR18_RESERVED
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ else ifeq ($(OPENJDK_TARGET_OS), windows)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ifeq ($(call isTargetCpuBits, 64), true)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ADLCFLAGS += -D_WIN64=1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- make/lib/Awt2dLibraries.gmk.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ make/lib/Awt2dLibraries.gmk
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -562,7 +562,7 @@ else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ maybe-uninitialized class-memaccess
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ HARFBUZZ_DISABLED_WARNINGS_clang := unused-value incompatible-pointer-types \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ tautological-constant-out-of-range-compare int-to-pointer-cast \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- undef missing-field-initializers
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ undef missing-field-initializers deprecated-declarations c++11-narrowing
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ HARFBUZZ_DISABLED_WARNINGS_microsoft := 4267 4244 4090 4146 4334 4819 4101 4068 4805 4138
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ HARFBUZZ_DISABLED_WARNINGS_C_solstudio := \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ E_INTEGER_OVERFLOW_DETECTED \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- make/lib/Lib-jdk.hotspot.agent.gmk.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ make/lib/Lib-jdk.hotspot.agent.gmk
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -36,7 +36,7 @@ else ifeq ($(OPENJDK_TARGET_OS), solaris)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SA_LDFLAGS := -mt
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ else ifeq ($(OPENJDK_TARGET_OS), macosx)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- SA_CFLAGS := -Damd64 -D_GNU_SOURCE -mno-omit-leaf-frame-pointer \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ SA_CFLAGS := -D_GNU_SOURCE -mno-omit-leaf-frame-pointer \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ -mstack-alignment=16 -fPIC
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ LIBSA_EXTRA_SRC := $(SUPPORT_OUTPUTDIR)/gensrc/jdk.hotspot.agent
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ else ifeq ($(OPENJDK_TARGET_OS), windows)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/hotspot/cpu/aarch64/globalDefinitions_aarch64.hpp.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/hotspot/cpu/aarch64/globalDefinitions_aarch64.hpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1,5 +1,5 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 1999, 2021, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Copyright (c) 2014, 2015, Red Hat Inc. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -53,7 +53,7 @@ const bool CCallingConventionRequiresIntsAsLongs = false;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define THREAD_LOCAL_POLL
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#if defined(_WIN64)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(__APPLE__) || defined(_WIN64)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define R18_RESERVED
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define R18_RESERVED_ONLY(code) code
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define NOT_R18_RESERVED(code)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/hotspot/cpu/aarch64/interpreterRT_aarch64.cpp.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/hotspot/cpu/aarch64/interpreterRT_aarch64.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1,6 +1,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- * Copyright (c) 2003, 2020, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2003, 2021, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Copyright (c) 2014, 2020, Red Hat Inc. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2021, Azul Systems, Inc. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * This code is free software; you can redistribute it and/or modify it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -58,9 +59,14 @@ FloatRegister InterpreterRuntime::SignatureHandlerGenerator::next_fpr() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return fnoreg;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-int InterpreterRuntime::SignatureHandlerGenerator::next_stack_offset() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// On macos/aarch64 native stack is packed, int/float are using only 4 bytes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// on stack. Natural alignment for types are still in place,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// for example double/long should be 8 bytes aligned.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++int InterpreterRuntime::SignatureHandlerGenerator::next_stack_offset(unsigned elem_size) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ MACOS_ONLY(_stack_offset = align_up(_stack_offset, elem_size));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int ret = _stack_offset;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- _stack_offset += wordSize;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ _stack_offset += NOT_MACOS(wordSize) MACOS_ONLY(elem_size);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return ret;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -72,6 +78,30 @@ InterpreterRuntime::SignatureHandlerGenerator::SignatureHandlerGenerator(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ _stack_offset = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++void InterpreterRuntime::SignatureHandlerGenerator::pass_byte() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ const Address src(from(), Interpreter::local_offset_in_bytes(offset()));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ Register reg = next_gpr();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (reg != noreg) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ __ ldr(reg, src);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ __ ldrb(r0, src);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ __ strb(r0, Address(to(), next_stack_offset(sizeof(jbyte))));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++void InterpreterRuntime::SignatureHandlerGenerator::pass_short() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ const Address src(from(), Interpreter::local_offset_in_bytes(offset()));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ Register reg = next_gpr();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (reg != noreg) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ __ ldr(reg, src);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ __ ldrh(r0, src);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ __ strh(r0, Address(to(), next_stack_offset(sizeof(jshort))));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void InterpreterRuntime::SignatureHandlerGenerator::pass_int() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ const Address src(from(), Interpreter::local_offset_in_bytes(offset()));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -80,7 +110,7 @@ void InterpreterRuntime::SignatureHandlerGenerator::pass_int() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ __ ldr(reg, src);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ __ ldrw(r0, src);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- __ strw(r0, Address(to(), next_stack_offset()));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ __ strw(r0, Address(to(), next_stack_offset(sizeof(jint))));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -92,7 +122,7 @@ void InterpreterRuntime::SignatureHandlerGenerator::pass_long() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ __ ldr(reg, src);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ __ ldr(r0, src);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- __ str(r0, Address(to(), next_stack_offset()));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ __ str(r0, Address(to(), next_stack_offset(sizeof(jlong))));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -104,7 +134,7 @@ void InterpreterRuntime::SignatureHandlerGenerator::pass_float() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ __ ldrs(reg, src);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ __ ldrw(r0, src);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- __ strw(r0, Address(to(), next_stack_offset()));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ __ strw(r0, Address(to(), next_stack_offset(sizeof(jfloat))));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -116,7 +146,7 @@ void InterpreterRuntime::SignatureHandlerGenerator::pass_double() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ __ ldrd(reg, src);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ __ ldr(r0, src);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- __ str(r0, Address(to(), next_stack_offset()));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ __ str(r0, Address(to(), next_stack_offset(sizeof(jdouble))));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -140,7 +170,8 @@ void InterpreterRuntime::SignatureHandlerGenerator::pass_object() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ __ cbnz(temp(), L);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ __ mov(r0, zr);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ __ bind(L);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- __ str(r0, Address(to(), next_stack_offset()));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ STATIC_ASSERT(sizeof(jobject) == wordSize);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ __ str(r0, Address(to(), next_stack_offset(sizeof(jobject))));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -165,7 +196,7 @@ class SlowSignatureHandler
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ : public NativeSignatureIterator {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ private:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ address _from;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- intptr_t* _to;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ char* _to;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ intptr_t* _int_args;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ intptr_t* _fp_args;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ intptr_t* _fp_identifiers;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -200,21 +231,38 @@ class SlowSignatureHandler
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return -1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- void pass_stack(intptr_t value) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- *_to++ = value;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ template<typename T>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ void pass_stack(T value) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ MACOS_ONLY(_to = align_up(_to, sizeof(value)));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *(T *)_to = value;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ _to += NOT_MACOS(wordSize) MACOS_ONLY(sizeof(value));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ virtual void pass_byte() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ jbyte value = *(jbyte*)single_slot_addr();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (pass_gpr(value) < 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ pass_stack<>(value);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ virtual void pass_short() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ jshort value = *(jshort*)single_slot_addr();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (pass_gpr(value) < 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ pass_stack<>(value);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ virtual void pass_int() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ jint value = *(jint*)single_slot_addr();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (pass_gpr(value) < 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- pass_stack(value);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ pass_stack<>(value);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ virtual void pass_long() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ intptr_t value = *double_slot_addr();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (pass_gpr(value) < 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- pass_stack(value);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ pass_stack<>(value);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -222,14 +270,14 @@ class SlowSignatureHandler
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ intptr_t* addr = single_slot_addr();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ intptr_t value = *addr == 0 ? NULL : (intptr_t)addr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (pass_gpr(value) < 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- pass_stack(value);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ pass_stack<>(value);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ virtual void pass_float() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ jint value = *(jint*)single_slot_addr();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (pass_fpr(value) < 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- pass_stack(value);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ pass_stack<>(value);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -239,7 +287,7 @@ class SlowSignatureHandler
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (0 <= arg) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *_fp_identifiers |= (1ull << arg); // mark as double
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- pass_stack(value);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ pass_stack<>(value);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -248,7 +296,7 @@ class SlowSignatureHandler
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ : NativeSignatureIterator(method)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ _from = from;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- _to = to;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ _to = (char *)to;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ _int_args = to - (method->is_static() ? 16 : 17);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ _fp_args = to - 8;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/hotspot/cpu/aarch64/interpreterRT_aarch64.hpp.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/hotspot/cpu/aarch64/interpreterRT_aarch64.hpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1,6 +1,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- * Copyright (c) 1998, 2018, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 1998, 2021, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Copyright (c) 2014, Red Hat Inc. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2021, Azul Systems, Inc. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * This code is free software; you can redistribute it and/or modify it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -38,6 +39,8 @@ class SignatureHandlerGenerator: public NativeSignatureIterator {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ unsigned int _num_reg_int_args;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int _stack_offset;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ void pass_byte();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ void pass_short();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void pass_int();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void pass_long();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void pass_float();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -46,7 +49,7 @@ class SignatureHandlerGenerator: public NativeSignatureIterator {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Register next_gpr();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ FloatRegister next_fpr();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- int next_stack_offset();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ int next_stack_offset(unsigned elem_size);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ public:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // Creation
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/hotspot/cpu/aarch64/jniFastGetField_aarch64.cpp.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/hotspot/cpu/aarch64/jniFastGetField_aarch64.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -31,6 +31,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include "prims/jniFastGetField.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include "prims/jvm_misc.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include "runtime/safepoint.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "runtime/threadWXSetters.inline.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define __ masm->
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -51,6 +52,48 @@ static const Register roffset = r5;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static const Register rcounter_addr = r6;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static const Register result = r7;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// On macos/aarch64 we need to ensure WXExec mode when running generated
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// FastGetXXXField, as these functions can be called from WXWrite context
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// (8262896). So each FastGetXXXField is wrapped into a C++ statically
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// compiled template function that optionally switches to WXExec if necessary.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef __APPLE__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static address generated_fast_get_field[T_LONG + 1 - T_BOOLEAN];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++template<int BType> struct BasicTypeToJni {};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++template<> struct BasicTypeToJni<T_BOOLEAN> { static const jboolean jni_type; };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++template<> struct BasicTypeToJni<T_BYTE> { static const jbyte jni_type; };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++template<> struct BasicTypeToJni<T_CHAR> { static const jchar jni_type; };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++template<> struct BasicTypeToJni<T_SHORT> { static const jshort jni_type; };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++template<> struct BasicTypeToJni<T_INT> { static const jint jni_type; };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++template<> struct BasicTypeToJni<T_LONG> { static const jlong jni_type; };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++template<> struct BasicTypeToJni<T_FLOAT> { static const jfloat jni_type; };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++template<> struct BasicTypeToJni<T_DOUBLE> { static const jdouble jni_type; };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++template<int BType>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++decltype(BasicTypeToJni<BType>::jni_type) static_fast_get_field_wrapper(JNIEnv *env, jobject obj, jfieldID fieldID) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ JavaThread* thread = JavaThread::thread_from_jni_environment(env);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ThreadWXEnable wx(WXExec, thread);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ address get_field_addr = generated_fast_get_field[BType - T_BOOLEAN];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return ((decltype(BasicTypeToJni<BType>::jni_type)(*)(JNIEnv *env, jobject obj, jfieldID fieldID))get_field_addr)(env, obj, fieldID);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++template<int BType>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++address JNI_FastGetField::generate_fast_get_int_field1() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ generated_fast_get_field[BType - T_BOOLEAN] = generate_fast_get_int_field0((BasicType)BType);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return (address)static_fast_get_field_wrapper<BType>;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else // __APPLE__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++template<int BType>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++address JNI_FastGetField::generate_fast_get_int_field1() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return generate_fast_get_int_field0((BasicType)BType);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif // __APPLE__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ address JNI_FastGetField::generate_fast_get_int_field0(BasicType type) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ const char *name;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ switch (type) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -147,33 +190,33 @@ address JNI_FastGetField::generate_fast_get_int_field0(BasicType type) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ address JNI_FastGetField::generate_fast_get_boolean_field() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- return generate_fast_get_int_field0(T_BOOLEAN);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return generate_fast_get_int_field1<T_BOOLEAN>();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ address JNI_FastGetField::generate_fast_get_byte_field() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- return generate_fast_get_int_field0(T_BYTE);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return generate_fast_get_int_field1<T_BYTE>();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ address JNI_FastGetField::generate_fast_get_char_field() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- return generate_fast_get_int_field0(T_CHAR);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return generate_fast_get_int_field1<T_CHAR>();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ address JNI_FastGetField::generate_fast_get_short_field() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- return generate_fast_get_int_field0(T_SHORT);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return generate_fast_get_int_field1<T_SHORT>();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ address JNI_FastGetField::generate_fast_get_int_field() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- return generate_fast_get_int_field0(T_INT);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return generate_fast_get_int_field1<T_INT>();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ address JNI_FastGetField::generate_fast_get_long_field() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- return generate_fast_get_int_field0(T_LONG);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return generate_fast_get_int_field1<T_LONG>();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ address JNI_FastGetField::generate_fast_get_float_field() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- return generate_fast_get_int_field0(T_FLOAT);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return generate_fast_get_int_field1<T_FLOAT>();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ address JNI_FastGetField::generate_fast_get_double_field() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- return generate_fast_get_int_field0(T_DOUBLE);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return generate_fast_get_int_field1<T_DOUBLE>();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1492,7 +1492,7 @@ void MacroAssembler::movptr(Register r, uintptr_t imm64) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #ifndef PRODUCT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ char buffer[64];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- snprintf(buffer, sizeof(buffer), PTR64_FORMAT, imm64);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ snprintf(buffer, sizeof(buffer), "0x%"PRIX64, (uint64_t)imm64);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ block_comment(buffer);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1555,7 +1555,7 @@ void MacroAssembler::mov_immediate64(Register dst, uint64_t imm64)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #ifndef PRODUCT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ char buffer[64];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- snprintf(buffer, sizeof(buffer), PTR64_FORMAT, imm64);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ snprintf(buffer, sizeof(buffer), "0x%"PRIX64, imm64);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ block_comment(buffer);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1668,7 +1668,7 @@ void MacroAssembler::mov_immediate32(Register dst, uint32_t imm32)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #ifndef PRODUCT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ char buffer[64];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- snprintf(buffer, sizeof(buffer), PTR32_FORMAT, imm32);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ snprintf(buffer, sizeof(buffer), "0x%"PRIX32, imm32);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ block_comment(buffer);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -27,6 +27,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define CPU_AARCH64_VM_MACROASSEMBLER_AARCH64_HPP
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include "asm/assembler.inline.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "runtime/vm_version.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // MacroAssembler extends Assembler by frequently used macros.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ //
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -88,7 +89,7 @@ class MacroAssembler: public Assembler {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ = (operand_valid_for_logical_immediate(false /*is32*/,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ (uint64_t)Universe::narrow_klass_base())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ && ((uint64_t)Universe::narrow_klass_base()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- > (1UL << log2_intptr(Universe::narrow_klass_range()))));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ > (1UL << log2_intptr((uintptr_t)Universe::narrow_klass_range()))));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // These routines should emit JVMTI PopFrame and ForceEarlyReturn handling code.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/hotspot/cpu/aarch64/sharedRuntime_aarch64.cpp.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/hotspot/cpu/aarch64/sharedRuntime_aarch64.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1,6 +1,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Copyright (c) 2003, 2019, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Copyright (c) 2014, 2019, Red Hat Inc. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2021, Azul Systems, Inc. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * This code is free software; you can redistribute it and/or modify it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -715,7 +716,7 @@ AdapterHandlerEntry* SharedRuntime::generate_i2c2i_adapters(MacroAssembler *masm
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return AdapterHandlerLibrary::new_entry(fingerprint, i2c_entry, c2i_entry, c2i_unverified_entry);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-int SharedRuntime::c_calling_convention(const BasicType *sig_bt,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static int c_calling_convention_priv(const BasicType *sig_bt,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ VMRegPair *regs,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ VMRegPair *regs2,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int total_args_passed) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -746,6 +747,11 @@ int SharedRuntime::c_calling_convention(const BasicType *sig_bt,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (int_args < Argument::n_int_register_parameters_c) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ regs[i].set1(INT_ArgReg[int_args++]->as_VMReg());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef __APPLE__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // Less-than word types are stored one after another.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // The code is unable to handle this so bailout.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return -1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ regs[i].set1(VMRegImpl::stack2reg(stk_args));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ stk_args += 2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -768,6 +774,11 @@ int SharedRuntime::c_calling_convention(const BasicType *sig_bt,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (fp_args < Argument::n_float_register_parameters_c) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ regs[i].set1(FP_ArgReg[fp_args++]->as_VMReg());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef __APPLE__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // Less-than word types are stored one after another.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // The code is unable to handle this so bailout.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return -1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ regs[i].set1(VMRegImpl::stack2reg(stk_args));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ stk_args += 2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -794,6 +805,16 @@ int SharedRuntime::c_calling_convention(const BasicType *sig_bt,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return stk_args;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++int SharedRuntime::c_calling_convention(const BasicType *sig_bt,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ VMRegPair *regs,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ VMRegPair *regs2,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ int total_args_passed)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ int result = c_calling_convention_priv(sig_bt, regs, regs2, total_args_passed);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ guarantee(result >= 0, "Unsupported arguments configuration");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return result;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // On 64 bit we will store integer like items to the stack as
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // 64 bits items (sparc abi) even though java would only store
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // 32bits for a parameter. On 32bit it will simply be 32 bits
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1340,7 +1361,11 @@ nmethod* SharedRuntime::generate_native_wrapper(MacroAssembler* masm,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // Now figure out where the args must be stored and how much stack space
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // they require.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int out_arg_slots;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- out_arg_slots = c_calling_convention(out_sig_bt, out_regs, NULL, total_c_args);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ out_arg_slots = c_calling_convention_priv(out_sig_bt, out_regs, NULL, total_c_args);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (out_arg_slots < 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // Compute framesize for the wrapper. We need to handlize all oops in
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // incoming registers
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/hotspot/cpu/aarch64/templateTable_aarch64.cpp.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/hotspot/cpu/aarch64/templateTable_aarch64.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -94,10 +94,6 @@ static inline Address aaddress(Register r) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return iaddress(r);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-static inline Address at_rsp() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- return Address(esp, 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // At top of Java expression stack which may be different than esp(). It
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // isn't for category 1 objects.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static inline Address at_tos () {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/hotspot/cpu/aarch64/vm_version_aarch64.hpp.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/hotspot/cpu/aarch64/vm_version_aarch64.hpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -67,6 +67,9 @@ class VM_Version : public Abstract_VM_Version {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return false;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // Arm can assign codes that are not published in the manual.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // Apple's code is defined in
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // https://github.com/apple/darwin-xnu/blob/33eb983/osfmk/arm/cpuid.h#L62
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ enum Family {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ CPU_ARM = 'A',
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ CPU_BROADCOM = 'B',
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -79,6 +82,7 @@ class VM_Version : public Abstract_VM_Version {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ CPU_QUALCOM = 'Q',
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ CPU_MARVELL = 'V',
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ CPU_INTEL = 'i',
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ CPU_APPLE = 'a',
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ enum Feature_Flag {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -111,6 +115,11 @@ class VM_Version : public Abstract_VM_Version {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static int icache_line_size() { return _icache_line_size; }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static int dcache_line_size() { return _dcache_line_size; }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef __APPLE__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // Is the CPU running emulated (for example macOS Rosetta running x86_64 code on M1 ARM (aarch64)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ static bool is_cpu_emulated();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif // CPU_AARCH64_VM_VM_VERSION_AARCH64_HPP
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/hotspot/os/bsd/os_bsd.cpp.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/hotspot/os/bsd/os_bsd.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -239,6 +239,8 @@ static char cpu_arch[] = "i386";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static char cpu_arch[] = "amd64";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #elif defined(ARM)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static char cpu_arch[] = "arm";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#elif defined(AARCH64)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static char cpu_arch[] = "aarch64";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #elif defined(PPC32)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static char cpu_arch[] = "ppc";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #elif defined(SPARC)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -3069,20 +3071,17 @@ void os::Bsd::install_signal_handlers() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set_signal_handler(SIGXFSZ, true);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #if defined(__APPLE__)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- // In Mac OS X 10.4, CrashReporter will write a crash log for all 'fatal' signals, including
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- // signals caught and handled by the JVM. To work around this, we reset the mach task
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- // signal handler that's placed on our process by CrashReporter. This disables
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- // CrashReporter-based reporting.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- //
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- // This work-around is not necessary for 10.5+, as CrashReporter no longer intercedes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- // on caught fatal signals.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- //
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- // Additionally, gdb installs both standard BSD signal handlers, and mach exception
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- // handlers. By replacing the existing task exception handler, we disable gdb's mach
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // lldb (gdb) installs both standard BSD signal handlers, and mach exception
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // handlers. By replacing the existing task exception handler, we disable lldb's mach
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // exception handling, while leaving the standard BSD signal handlers functional.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ //
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // EXC_MASK_BAD_ACCESS needed by all architectures for NULL ptr checking
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // EXC_MASK_ARITHMETIC needed by all architectures for div by 0 checking
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // EXC_MASK_BAD_INSTRUCTION needed by aarch64 to initiate deoptimization
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ kern_return_t kr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ kr = task_set_exception_ports(mach_task_self(),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- EXC_MASK_BAD_ACCESS | EXC_MASK_ARITHMETIC,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ EXC_MASK_BAD_ACCESS | EXC_MASK_ARITHMETIC
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ AARCH64_ONLY(| EXC_MASK_BAD_INSTRUCTION),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ MACH_PORT_NULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ EXCEPTION_STATE_IDENTITY,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ MACHINE_THREAD_STATE);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/hotspot/os_cpu/bsd_aarch64/atomic_bsd_aarch64.hpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -0,0 +1,82 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 1999, 2018, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2014, 2019, Red Hat Inc. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * This code is free software; you can redistribute it and/or modify it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * under the terms of the GNU General Public License version 2 only, as
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * published by the Free Software Foundation.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * This code is distributed in the hope that it will be useful, but WITHOUT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * version 2 for more details (a copy is included in the LICENSE file that
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * accompanied this code).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * You should have received a copy of the GNU General Public License version
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * 2 along with this work; if not, write to the Free Software Foundation,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * or visit www.oracle.com if you need additional information or have any
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * questions.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifndef OS_CPU_BSD_AARCH64_VM_ATOMIC_BSD_AARCH64_HPP
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define OS_CPU_BSD_AARCH64_VM_ATOMIC_BSD_AARCH64_HPP
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// Implementation of class atomic
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// Note that memory_order_conservative requires a full barrier after atomic stores.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// See https://patchwork.kernel.org/patch/3575821/
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define FULL_MEM_BARRIER __sync_synchronize()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define READ_MEM_BARRIER __atomic_thread_fence(__ATOMIC_ACQUIRE);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define WRITE_MEM_BARRIER __atomic_thread_fence(__ATOMIC_RELEASE);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++template<size_t byte_size>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++struct Atomic::PlatformAdd
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ : Atomic::AddAndFetch<Atomic::PlatformAdd<byte_size> >
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ template<typename I, typename D>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ D add_and_fetch(I add_value, D volatile* dest, atomic_memory_order order) const {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ D res = __atomic_add_fetch(dest, add_value, __ATOMIC_RELEASE);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ FULL_MEM_BARRIER;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return res;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++template<size_t byte_size>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++template<typename T>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++inline T Atomic::PlatformXchg<byte_size>::operator()(T exchange_value,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ T volatile* dest,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ atomic_memory_order order) const {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ STATIC_ASSERT(byte_size == sizeof(T));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ T res = __atomic_exchange_n(dest, exchange_value, __ATOMIC_RELEASE);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ FULL_MEM_BARRIER;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return res;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++template<size_t byte_size>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++template<typename T>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++inline T Atomic::PlatformCmpxchg<byte_size>::operator()(T exchange_value,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ T volatile* dest,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ T compare_value,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ atomic_memory_order order) const {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ STATIC_ASSERT(byte_size == sizeof(T));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (order == memory_order_relaxed) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ T value = compare_value;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ __atomic_compare_exchange(dest, &value, &exchange_value, /*weak*/false,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ __ATOMIC_RELAXED, __ATOMIC_RELAXED);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return value;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ T value = compare_value;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ FULL_MEM_BARRIER;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ __atomic_compare_exchange(dest, &value, &exchange_value, /*weak*/false,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ __ATOMIC_RELAXED, __ATOMIC_RELAXED);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ FULL_MEM_BARRIER;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return value;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif // OS_CPU_BSD_AARCH64_VM_ATOMIC_BSD_AARCH64_HPP
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/hotspot/os_cpu/bsd_aarch64/bytes_bsd_aarch64.inline.hpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -0,0 +1,55 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 1999, 2021, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2014, Red Hat Inc. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * This code is free software; you can redistribute it and/or modify it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * under the terms of the GNU General Public License version 2 only, as
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * published by the Free Software Foundation.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * This code is distributed in the hope that it will be useful, but WITHOUT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * version 2 for more details (a copy is included in the LICENSE file that
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * accompanied this code).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * You should have received a copy of the GNU General Public License version
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * 2 along with this work; if not, write to the Free Software Foundation,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * or visit www.oracle.com if you need additional information or have any
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * questions.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifndef OS_CPU_BSD_AARCH64_VM_BYTES_BSD_AARCH64_INLINE_HPP
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define OS_CPU_BSD_AARCH64_VM_BYTES_BSD_AARCH64_INLINE_HPP
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef __APPLE__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <libkern/OSByteOrder.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(__APPLE__)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# define bswap_16(x) OSSwapInt16(x)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# define bswap_32(x) OSSwapInt32(x)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# define bswap_64(x) OSSwapInt64(x)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# error "Unimplemented"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// Efficient swapping of data bytes from Java byte
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// ordering to native byte ordering and vice versa.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++inline u2 Bytes::swap_u2(u2 x) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return bswap_16(x);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++inline u4 Bytes::swap_u4(u4 x) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return bswap_32(x);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++inline u8 Bytes::swap_u8(u8 x) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return bswap_64(x);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif // OS_CPU_BSD_AARCH64_VM_BYTES_BSD_AARCH64_INLINE_HPP
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/hotspot/os_cpu/bsd_aarch64/copy_bsd_aarch64.inline.hpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -0,0 +1,188 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2014, Red Hat Inc. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * This code is free software; you can redistribute it and/or modify it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * under the terms of the GNU General Public License version 2 only, as
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * published by the Free Software Foundation.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * This code is distributed in the hope that it will be useful, but WITHOUT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * version 2 for more details (a copy is included in the LICENSE file that
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * accompanied this code).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * You should have received a copy of the GNU General Public License version
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * 2 along with this work; if not, write to the Free Software Foundation,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * or visit www.oracle.com if you need additional information or have any
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * questions.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifndef OS_CPU_BSD_AARCH64_VM_COPY_BSD_AARCH64_INLINE_HPP
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define OS_CPU_BSD_AARCH64_VM_COPY_BSD_AARCH64_INLINE_HPP
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define COPY_SMALL(from, to, count) \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++{ \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ long tmp0, tmp1, tmp2, tmp3; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ long tmp4, tmp5, tmp6, tmp7; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ __asm volatile( \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++" adr %[t0], 0f;\n" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++" add %[t0], %[t0], %[cnt], lsl #5;\n" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++" br %[t0];\n" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++" .align 5;\n" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++"0:" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++" b 1f;\n" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++" .align 5;\n" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++" ldr %[t0], [%[s], #0];\n" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++" str %[t0], [%[d], #0];\n" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++" b 1f;\n" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++" .align 5;\n" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++" ldp %[t0], %[t1], [%[s], #0];\n" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++" stp %[t0], %[t1], [%[d], #0];\n" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++" b 1f;\n" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++" .align 5;\n" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++" ldp %[t0], %[t1], [%[s], #0];\n" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++" ldr %[t2], [%[s], #16];\n" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++" stp %[t0], %[t1], [%[d], #0];\n" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++" str %[t2], [%[d], #16];\n" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++" b 1f;\n" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++" .align 5;\n" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++" ldp %[t0], %[t1], [%[s], #0];\n" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++" ldp %[t2], %[t3], [%[s], #16];\n" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++" stp %[t0], %[t1], [%[d], #0];\n" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++" stp %[t2], %[t3], [%[d], #16];\n" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++" b 1f;\n" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++" .align 5;\n" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++" ldp %[t0], %[t1], [%[s], #0];\n" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++" ldp %[t2], %[t3], [%[s], #16];\n" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++" ldr %[t4], [%[s], #32];\n" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++" stp %[t0], %[t1], [%[d], #0];\n" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++" stp %[t2], %[t3], [%[d], #16];\n" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++" str %[t4], [%[d], #32];\n" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++" b 1f;\n" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++" .align 5;\n" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++" ldp %[t0], %[t1], [%[s], #0];\n" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++" ldp %[t2], %[t3], [%[s], #16];\n" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++" ldp %[t4], %[t5], [%[s], #32];\n" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++"2:" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++" stp %[t0], %[t1], [%[d], #0];\n" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++" stp %[t2], %[t3], [%[d], #16];\n" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++" stp %[t4], %[t5], [%[d], #32];\n" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++" b 1f;\n" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++" .align 5;\n" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++" ldr %[t6], [%[s], #0];\n" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++" ldp %[t0], %[t1], [%[s], #8];\n" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++" ldp %[t2], %[t3], [%[s], #24];\n" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++" ldp %[t4], %[t5], [%[s], #40];\n" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++" str %[t6], [%[d]], #8;\n" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++" b 2b;\n" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++" .align 5;\n" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++" ldp %[t0], %[t1], [%[s], #0];\n" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++" ldp %[t2], %[t3], [%[s], #16];\n" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++" ldp %[t4], %[t5], [%[s], #32];\n" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++" ldp %[t6], %[t7], [%[s], #48];\n" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++" stp %[t0], %[t1], [%[d], #0];\n" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++" stp %[t2], %[t3], [%[d], #16];\n" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++" stp %[t4], %[t5], [%[d], #32];\n" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++" stp %[t6], %[t7], [%[d], #48];\n" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++"1:" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ : [s]"+r"(from), [d]"+r"(to), [cnt]"+r"(count), \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ [t0]"=&r"(tmp0), [t1]"=&r"(tmp1), [t2]"=&r"(tmp2), [t3]"=&r"(tmp3), \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ [t4]"=&r"(tmp4), [t5]"=&r"(tmp5), [t6]"=&r"(tmp6), [t7]"=&r"(tmp7) \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ : \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ : "memory", "cc"); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static void pd_conjoint_words(const HeapWord* from, HeapWord* to, size_t count) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ __asm volatile( "prfm pldl1strm, [%[s], #0];" :: [s]"r"(from) : "memory");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (__builtin_expect(count <= 8, 1)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ COPY_SMALL(from, to, count);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ _Copy_conjoint_words(from, to, count);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static void pd_disjoint_words(const HeapWord* from, HeapWord* to, size_t count) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (__builtin_constant_p(count)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ memcpy(to, from, count * sizeof(HeapWord));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ __asm volatile( "prfm pldl1strm, [%[s], #0];" :: [s]"r"(from) : "memory");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (__builtin_expect(count <= 8, 1)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ COPY_SMALL(from, to, count);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ _Copy_disjoint_words(from, to, count);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static void pd_disjoint_words_atomic(const HeapWord* from, HeapWord* to, size_t count) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ __asm volatile( "prfm pldl1strm, [%[s], #0];" :: [s]"r"(from) : "memory");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (__builtin_expect(count <= 8, 1)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ COPY_SMALL(from, to, count);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ _Copy_disjoint_words(from, to, count);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static void pd_aligned_conjoint_words(const HeapWord* from, HeapWord* to, size_t count) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ pd_conjoint_words(from, to, count);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static void pd_aligned_disjoint_words(const HeapWord* from, HeapWord* to, size_t count) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ pd_disjoint_words(from, to, count);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static void pd_conjoint_bytes(const void* from, void* to, size_t count) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ (void)memmove(to, from, count);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static void pd_conjoint_bytes_atomic(const void* from, void* to, size_t count) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ pd_conjoint_bytes(from, to, count);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static void pd_conjoint_jshorts_atomic(const jshort* from, jshort* to, size_t count) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ _Copy_conjoint_jshorts_atomic(from, to, count);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static void pd_conjoint_jints_atomic(const jint* from, jint* to, size_t count) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ _Copy_conjoint_jints_atomic(from, to, count);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static void pd_conjoint_jlongs_atomic(const jlong* from, jlong* to, size_t count) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ _Copy_conjoint_jlongs_atomic(from, to, count);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static void pd_conjoint_oops_atomic(const oop* from, oop* to, size_t count) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ assert(BytesPerLong == BytesPerOop, "jlongs and oops must be the same size");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ _Copy_conjoint_jlongs_atomic((const jlong*)from, (jlong*)to, count);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static void pd_arrayof_conjoint_bytes(const HeapWord* from, HeapWord* to, size_t count) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ _Copy_arrayof_conjoint_bytes(from, to, count);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static void pd_arrayof_conjoint_jshorts(const HeapWord* from, HeapWord* to, size_t count) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ _Copy_arrayof_conjoint_jshorts(from, to, count);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static void pd_arrayof_conjoint_jints(const HeapWord* from, HeapWord* to, size_t count) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ _Copy_arrayof_conjoint_jints(from, to, count);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static void pd_arrayof_conjoint_jlongs(const HeapWord* from, HeapWord* to, size_t count) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ _Copy_arrayof_conjoint_jlongs(from, to, count);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static void pd_arrayof_conjoint_oops(const HeapWord* from, HeapWord* to, size_t count) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ assert(!UseCompressedOops, "foo!");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ assert(BytesPerLong == BytesPerOop, "jlongs and oops must be the same size");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ _Copy_arrayof_conjoint_jlongs(from, to, count);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif // OS_CPU_BSD_AARCH64_VM_COPY_BSD_AARCH64_INLINE_HPP
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/hotspot/os_cpu/bsd_aarch64/copy_bsd_aarch64.s
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -0,0 +1,239 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2016, Linaro Ltd. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * This code is free software; you can redistribute it and/or modify it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * under the terms of the GNU General Public License version 2 only, as
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * published by the Free Software Foundation.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * This code is distributed in the hope that it will be useful, but WITHOUT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * version 2 for more details (a copy is included in the LICENSE file that
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * accompanied this code).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * You should have received a copy of the GNU General Public License version
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * 2 along with this work; if not, write to the Free Software Foundation,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * or visit www.oracle.com if you need additional information or have any
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * questions.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define CFUNC(x) _##x
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ .global CFUNC(_Copy_conjoint_words)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ .global CFUNC(_Copy_disjoint_words)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++s .req x0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++d .req x1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++count .req x2
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++t0 .req x3
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++t1 .req x4
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++t2 .req x5
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++t3 .req x6
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++t4 .req x7
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++t5 .req x8
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++t6 .req x9
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++t7 .req x10
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ .align 6
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++CFUNC(_Copy_disjoint_words):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // Ensure 2 word aligned
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ tbz s, #3, fwd_copy_aligned
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ldr t0, [s], #8
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ str t0, [d], #8
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ sub count, count, #1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++fwd_copy_aligned:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // Bias s & d so we only pre index on the last copy
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ sub s, s, #16
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ sub d, d, #16
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ldp t0, t1, [s, #16]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ldp t2, t3, [s, #32]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ldp t4, t5, [s, #48]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ldp t6, t7, [s, #64]!
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ subs count, count, #16
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ blo fwd_copy_drain
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++fwd_copy_again:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ prfm pldl1keep, [s, #256]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ stp t0, t1, [d, #16]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ldp t0, t1, [s, #16]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ stp t2, t3, [d, #32]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ldp t2, t3, [s, #32]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ stp t4, t5, [d, #48]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ldp t4, t5, [s, #48]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ stp t6, t7, [d, #64]!
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ldp t6, t7, [s, #64]!
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ subs count, count, #8
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ bhs fwd_copy_again
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++fwd_copy_drain:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ stp t0, t1, [d, #16]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ stp t2, t3, [d, #32]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ stp t4, t5, [d, #48]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ stp t6, t7, [d, #64]!
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // count is now -8..-1 for 0..7 words to copy
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ adr t0, 0f
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ add t0, t0, count, lsl #5
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ br t0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ .align 5
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ret // -8 == 0 words
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ .align 5
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ldr t0, [s, #16] // -7 == 1 word
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ str t0, [d, #16]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ret
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ .align 5
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ldp t0, t1, [s, #16] // -6 = 2 words
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ stp t0, t1, [d, #16]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ret
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ .align 5
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ldp t0, t1, [s, #16] // -5 = 3 words
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ldr t2, [s, #32]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ stp t0, t1, [d, #16]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ str t2, [d, #32]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ret
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ .align 5
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ldp t0, t1, [s, #16] // -4 = 4 words
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ldp t2, t3, [s, #32]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ stp t0, t1, [d, #16]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ stp t2, t3, [d, #32]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ret
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ .align 5
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ldp t0, t1, [s, #16] // -3 = 5 words
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ldp t2, t3, [s, #32]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ldr t4, [s, #48]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ stp t0, t1, [d, #16]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ stp t2, t3, [d, #32]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ str t4, [d, #48]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ret
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ .align 5
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ldp t0, t1, [s, #16] // -2 = 6 words
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ldp t2, t3, [s, #32]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ldp t4, t5, [s, #48]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ stp t0, t1, [d, #16]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ stp t2, t3, [d, #32]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ stp t4, t5, [d, #48]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ret
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ .align 5
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ldp t0, t1, [s, #16] // -1 = 7 words
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ldp t2, t3, [s, #32]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ldp t4, t5, [s, #48]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ldr t6, [s, #64]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ stp t0, t1, [d, #16]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ stp t2, t3, [d, #32]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ stp t4, t5, [d, #48]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ str t6, [d, #64]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // Is always aligned here, code for 7 words is one instruction
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // too large so it just falls through.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ .align 5
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++0:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ret
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ .align 6
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++CFUNC(_Copy_conjoint_words):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ sub t0, d, s
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ cmp t0, count, lsl #3
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ bhs CFUNC(_Copy_disjoint_words)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ add s, s, count, lsl #3
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ add d, d, count, lsl #3
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // Ensure 2 word aligned
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ tbz s, #3, bwd_copy_aligned
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ldr t0, [s, #-8]!
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ str t0, [d, #-8]!
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ sub count, count, #1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++bwd_copy_aligned:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ldp t0, t1, [s, #-16]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ldp t2, t3, [s, #-32]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ldp t4, t5, [s, #-48]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ldp t6, t7, [s, #-64]!
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ subs count, count, #16
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ blo bwd_copy_drain
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++bwd_copy_again:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ prfum pldl1keep, [s, #-256]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ stp t0, t1, [d, #-16]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ldp t0, t1, [s, #-16]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ stp t2, t3, [d, #-32]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ldp t2, t3, [s, #-32]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ stp t4, t5, [d, #-48]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ldp t4, t5, [s, #-48]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ stp t6, t7, [d, #-64]!
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ldp t6, t7, [s, #-64]!
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ subs count, count, #8
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ bhs bwd_copy_again
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++bwd_copy_drain:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ stp t0, t1, [d, #-16]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ stp t2, t3, [d, #-32]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ stp t4, t5, [d, #-48]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ stp t6, t7, [d, #-64]!
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // count is now -8..-1 for 0..7 words to copy
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ adr t0, 0f
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ add t0, t0, count, lsl #5
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ br t0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ .align 5
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ret // -8 == 0 words
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ .align 5
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ldr t0, [s, #-8] // -7 == 1 word
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ str t0, [d, #-8]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ret
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ .align 5
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ldp t0, t1, [s, #-16] // -6 = 2 words
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ stp t0, t1, [d, #-16]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ret
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ .align 5
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ldp t0, t1, [s, #-16] // -5 = 3 words
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ldr t2, [s, #-24]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ stp t0, t1, [d, #-16]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ str t2, [d, #-24]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ret
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ .align 5
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ldp t0, t1, [s, #-16] // -4 = 4 words
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ldp t2, t3, [s, #-32]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ stp t0, t1, [d, #-16]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ stp t2, t3, [d, #-32]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ret
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ .align 5
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ldp t0, t1, [s, #-16] // -3 = 5 words
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ldp t2, t3, [s, #-32]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ldr t4, [s, #-40]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ stp t0, t1, [d, #-16]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ stp t2, t3, [d, #-32]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ str t4, [d, #-40]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ret
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ .align 5
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ldp t0, t1, [s, #-16] // -2 = 6 words
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ldp t2, t3, [s, #-32]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ldp t4, t5, [s, #-48]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ stp t0, t1, [d, #-16]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ stp t2, t3, [d, #-32]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ stp t4, t5, [d, #-48]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ret
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ .align 5
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ldp t0, t1, [s, #-16] // -1 = 7 words
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ldp t2, t3, [s, #-32]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ldp t4, t5, [s, #-48]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ldr t6, [s, #-56]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ stp t0, t1, [d, #-16]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ stp t2, t3, [d, #-32]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ stp t4, t5, [d, #-48]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ str t6, [d, #-56]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // Is always aligned here, code for 7 words is one instruction
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // too large so it just falls through.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ .align 5
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++0:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ret
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/hotspot/os_cpu/bsd_aarch64/globals_bsd_aarch64.hpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -0,0 +1,43 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2014, Red Hat Inc. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * This code is free software; you can redistribute it and/or modify it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * under the terms of the GNU General Public License version 2 only, as
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * published by the Free Software Foundation.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * This code is distributed in the hope that it will be useful, but WITHOUT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * version 2 for more details (a copy is included in the LICENSE file that
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * accompanied this code).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * You should have received a copy of the GNU General Public License version
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * 2 along with this work; if not, write to the Free Software Foundation,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * or visit www.oracle.com if you need additional information or have any
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * questions.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifndef OS_CPU_BSD_AARCH64_VM_GLOBALS_BSD_AARCH64_HPP
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define OS_CPU_BSD_AARCH64_VM_GLOBALS_BSD_AARCH64_HPP
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// Sets the default values for platform dependent flags used by the runtime system.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// (see globals.hpp)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++define_pd_global(bool, DontYieldALot, false);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++define_pd_global(intx, ThreadStackSize, 2048); // 0 => use system default
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++define_pd_global(intx, VMThreadStackSize, 2048);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++define_pd_global(intx, CompilerThreadStackSize, 2048);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++define_pd_global(uintx,JVMInvokeMethodSlack, 8192);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// Used on 64 bit platforms for UseCompressedOops base address
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++define_pd_global(uintx,HeapBaseMinAddress, 2*G);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif // OS_CPU_BSD_AARCH64_VM_GLOBALS_BSD_AARCH64_HPP
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/hotspot/os_cpu/bsd_aarch64/icache_bsd_aarch64.hpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -0,0 +1,45 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 1999, 2021, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2014, Red Hat Inc. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2021, Azul Systems, Inc. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * This code is free software; you can redistribute it and/or modify it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * under the terms of the GNU General Public License version 2 only, as
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * published by the Free Software Foundation.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * This code is distributed in the hope that it will be useful, but WITHOUT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * version 2 for more details (a copy is included in the LICENSE file that
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * accompanied this code).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * You should have received a copy of the GNU General Public License version
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * 2 along with this work; if not, write to the Free Software Foundation,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * or visit www.oracle.com if you need additional information or have any
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * questions.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifndef OS_CPU_BSD_AARCH64_ICACHE_AARCH64_HPP
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define OS_CPU_BSD_AARCH64_ICACHE_AARCH64_HPP
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// Interface for updating the instruction cache. Whenever the VM
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// modifies code, part of the processor instruction cache potentially
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// has to be flushed.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++class ICache : public AbstractICache {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ public:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ static void initialize();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ static void invalidate_word(address addr) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ __clear_cache((char *)addr, (char *)(addr + 4));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ static void invalidate_range(address start, int nbytes) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ __clear_cache((char *)start, (char *)(start + nbytes));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif // OS_CPU_BSD_AARCH64_ICACHE_AARCH64_HPP
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+\ No newline at end of file
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/hotspot/os_cpu/bsd_aarch64/orderAccess_bsd_aarch64.hpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -0,0 +1,54 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2014, 2019, Red Hat Inc. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * This code is free software; you can redistribute it and/or modify it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * under the terms of the GNU General Public License version 2 only, as
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * published by the Free Software Foundation.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * This code is distributed in the hope that it will be useful, but WITHOUT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * version 2 for more details (a copy is included in the LICENSE file that
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * accompanied this code).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * You should have received a copy of the GNU General Public License version
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * 2 along with this work; if not, write to the Free Software Foundation,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * or visit www.oracle.com if you need additional information or have any
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * questions.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifndef OS_CPU_BSD_AARCH64_VM_ORDERACCESS_BSD_AARCH64_HPP
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define OS_CPU_BSD_AARCH64_VM_ORDERACCESS_BSD_AARCH64_HPP
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// Included in orderAccess.hpp header file.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// Implementation of class OrderAccess.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++inline void OrderAccess::loadload() { acquire(); }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++inline void OrderAccess::storestore() { release(); }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++inline void OrderAccess::loadstore() { acquire(); }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++inline void OrderAccess::storeload() { fence(); }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define FULL_MEM_BARRIER __sync_synchronize()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define READ_MEM_BARRIER __atomic_thread_fence(__ATOMIC_ACQUIRE);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define WRITE_MEM_BARRIER __atomic_thread_fence(__ATOMIC_RELEASE);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++inline void OrderAccess::acquire() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ READ_MEM_BARRIER;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++inline void OrderAccess::release() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ WRITE_MEM_BARRIER;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++inline void OrderAccess::fence() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ FULL_MEM_BARRIER;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif // OS_CPU_BSD_AARCH64_VM_ORDERACCESS_BSD_AARCH64_HPP
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/hotspot/os_cpu/bsd_aarch64/os_bsd_aarch64.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -0,0 +1,753 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 1999, 2018, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2014, Red Hat Inc. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2021, Azul Systems, Inc. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * This code is free software; you can redistribute it and/or modify it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * under the terms of the GNU General Public License version 2 only, as
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * published by the Free Software Foundation.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * This code is distributed in the hope that it will be useful, but WITHOUT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * version 2 for more details (a copy is included in the LICENSE file that
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * accompanied this code).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * You should have received a copy of the GNU General Public License version
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * 2 along with this work; if not, write to the Free Software Foundation,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * or visit www.oracle.com if you need additional information or have any
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * questions.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// no precompiled headers
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "jvm.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "asm/macroAssembler.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "classfile/classLoader.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "classfile/systemDictionary.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "classfile/vmSymbols.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "code/codeCache.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "code/icBuffer.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "code/vtableStubs.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "interpreter/interpreter.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "logging/log.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "memory/allocation.inline.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "os_share_bsd.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "prims/jniFastGetField.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "prims/jvm_misc.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "runtime/arguments.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "runtime/extendedPC.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "runtime/frame.inline.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "runtime/interfaceSupport.inline.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "runtime/java.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "runtime/javaCalls.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "runtime/mutexLocker.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "runtime/osThread.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "runtime/sharedRuntime.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "runtime/stubRoutines.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "runtime/thread.inline.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "runtime/timer.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "utilities/align.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "utilities/events.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "utilities/vmError.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// put OS-includes here
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# include <sys/types.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# include <sys/mman.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# include <pthread.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# include <signal.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# include <errno.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# include <dlfcn.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# include <stdlib.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# include <stdio.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# include <unistd.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# include <sys/resource.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# include <sys/stat.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# include <sys/time.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# include <sys/utsname.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# include <sys/socket.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# include <sys/wait.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# include <pwd.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# include <poll.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifndef __OpenBSD__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ # include <ucontext.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if !defined(__APPLE__) && !defined(__NetBSD__)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# include <pthread_np.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define SPELL_REG_SP "sp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define SPELL_REG_FP "fp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef __APPLE__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// see darwin-xnu/osfmk/mach/arm/_structs.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// 10.5 UNIX03 member name prefixes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define DU3_PREFIX(s, m) __ ## s.__ ## m
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define context_x uc_mcontext->DU3_PREFIX(ss,x)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define context_fp uc_mcontext->DU3_PREFIX(ss,fp)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define context_lr uc_mcontext->DU3_PREFIX(ss,lr)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define context_sp uc_mcontext->DU3_PREFIX(ss,sp)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define context_pc uc_mcontext->DU3_PREFIX(ss,pc)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define context_cpsr uc_mcontext->DU3_PREFIX(ss,cpsr)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define context_esr uc_mcontext->DU3_PREFIX(es,esr)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++address os::current_stack_pointer() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(__clang__) || defined(__llvm__)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ void *sp;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ __asm__("mov %0, " SPELL_REG_SP : "=r"(sp));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return (address) sp;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ register void *sp __asm__ (SPELL_REG_SP);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return (address) sp;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++char* os::non_memory_address_word() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // Must never look like an address returned by reserve_memory,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // even in its subfields (as defined by the CPU immediate fields,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // if the CPU splits constants across multiple instructions).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // the return value used in computation of Universe::non_oop_word(), which
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // is loaded by cpu/aarch64 by MacroAssembler::movptr(Register, uintptr_t)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return (char*) 0xffffffffffff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++address os::Bsd::ucontext_get_pc(const ucontext_t * uc) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return (address)uc->context_pc;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++void os::Bsd::ucontext_set_pc(ucontext_t * uc, address pc) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ uc->context_pc = (intptr_t)pc;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++intptr_t* os::Bsd::ucontext_get_sp(const ucontext_t * uc) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return (intptr_t*)uc->context_sp;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++intptr_t* os::Bsd::ucontext_get_fp(const ucontext_t * uc) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return (intptr_t*)uc->context_fp;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// For Forte Analyzer AsyncGetCallTrace profiling support - thread
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// is currently interrupted by SIGPROF.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// os::Solaris::fetch_frame_from_ucontext() tries to skip nested signal
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// frames. Currently we don't do that on Linux, so it's the same as
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// os::fetch_frame_from_context().
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ExtendedPC os::Bsd::fetch_frame_from_ucontext(Thread* thread,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ const ucontext_t* uc, intptr_t** ret_sp, intptr_t** ret_fp) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ assert(thread != NULL, "just checking");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ assert(ret_sp != NULL, "just checking");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ assert(ret_fp != NULL, "just checking");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return os::fetch_frame_from_context(uc, ret_sp, ret_fp);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ExtendedPC os::fetch_frame_from_context(const void* ucVoid,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ intptr_t** ret_sp, intptr_t** ret_fp) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ExtendedPC epc;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ const ucontext_t* uc = (const ucontext_t*)ucVoid;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (uc != NULL) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ epc = ExtendedPC(os::Bsd::ucontext_get_pc(uc));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (ret_sp) *ret_sp = os::Bsd::ucontext_get_sp(uc);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (ret_fp) *ret_fp = os::Bsd::ucontext_get_fp(uc);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // construct empty ExtendedPC for return value checking
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ epc = ExtendedPC(NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (ret_sp) *ret_sp = (intptr_t *)NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (ret_fp) *ret_fp = (intptr_t *)NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return epc;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++frame os::fetch_frame_from_context(const void* ucVoid) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ intptr_t* sp;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ intptr_t* fp;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ExtendedPC epc = fetch_frame_from_context(ucVoid, &sp, &fp);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return frame(sp, fp, epc.pc());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++bool os::Bsd::get_frame_at_stack_banging_point(JavaThread* thread, ucontext_t* uc, frame* fr) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ address pc = (address) os::Bsd::ucontext_get_pc(uc);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (Interpreter::contains(pc)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // interpreter performs stack banging after the fixed frame header has
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // been generated while the compilers perform it before. To maintain
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // semantic consistency between interpreted and compiled frames, the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // method returns the Java sender of the current frame.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *fr = os::fetch_frame_from_context(uc);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (!fr->is_first_java_frame()) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ assert(fr->safe_for_sender(thread), "Safety check");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *fr = fr->java_sender();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // more complex code with compiled code
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ assert(!Interpreter::contains(pc), "Interpreted methods should have been handled above");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ CodeBlob* cb = CodeCache::find_blob(pc);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (cb == NULL || !cb->is_nmethod() || cb->is_frame_complete_at(pc)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // Not sure where the pc points to, fallback to default
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // stack overflow handling
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return false;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // In compiled code, the stack banging is performed before LR
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // has been saved in the frame. LR is live, and SP and FP
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // belong to the caller.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ intptr_t* fp = os::Bsd::ucontext_get_fp(uc);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ intptr_t* sp = os::Bsd::ucontext_get_sp(uc);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ address pc = (address)(uc->context_lr
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ - NativeInstruction::instruction_size);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *fr = frame(sp, fp, pc);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (!fr->is_java_frame()) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ assert(fr->safe_for_sender(thread), "Safety check");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ assert(!fr->is_first_frame(), "Safety check");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *fr = fr->java_sender();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ assert(fr->is_java_frame(), "Safety check");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return true;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// JVM compiled with -fno-omit-frame-pointer, so RFP is saved on the stack.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++frame os::get_sender_for_C_frame(frame* fr) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return frame(fr->link(), fr->link(), fr->sender_pc());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++NOINLINE frame os::current_frame() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ intptr_t *fp = *(intptr_t **)__builtin_frame_address(0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ frame myframe((intptr_t*)os::current_stack_pointer(),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ (intptr_t*)fp,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ CAST_FROM_FN_PTR(address, os::current_frame));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (os::is_first_C_frame(&myframe)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // stack is not walkable
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return frame();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return os::get_sender_for_C_frame(&myframe);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// Utility functions
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++extern "C" JNIEXPORT int
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++JVM_handle_bsd_signal(int sig,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ siginfo_t* info,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ void* ucVoid,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ int abort_if_unrecognized) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ucontext_t* uc = (ucontext_t*) ucVoid;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ Thread* t = Thread::current_or_null_safe();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // Must do this before SignalHandlerMark, if crash protection installed we will longjmp away
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // (no destructors can be run)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ os::ThreadCrashProtection::check_crash_protection(sig, t);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ SignalHandlerMark shm(t);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // Note: it's not uncommon that JNI code uses signal/sigset to install
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // then restore certain signal handler (e.g. to temporarily block SIGPIPE,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // or have a SIGILL handler when detecting CPU type). When that happens,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // JVM_handle_bsd_signal() might be invoked with junk info/ucVoid. To
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // avoid unnecessary crash when libjsig is not preloaded, try handle signals
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // that do not require siginfo/ucontext first.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (sig == SIGPIPE || sig == SIGXFSZ) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // allow chained handler to go first
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (os::Bsd::chained_handler(sig, info, ucVoid)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return true;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // Ignoring SIGPIPE/SIGXFSZ - see bugs 4229104 or 6499219
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return true;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef CAN_SHOW_REGISTERS_ON_ASSERT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if ((sig == SIGSEGV || sig == SIGBUS) && info != NULL && info->si_addr == g_assert_poison) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (handle_assert_poison_fault(ucVoid, info->si_addr)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ JavaThread* thread = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ VMThread* vmthread = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (os::Bsd::signal_handlers_are_installed) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (t != NULL ){
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if(t->is_Java_thread()) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ thread = (JavaThread*)t;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ else if(t->is_VM_thread()){
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ vmthread = (VMThread *)t;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // Handle SafeFetch faults:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (uc != NULL) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ address const pc = (address) os::Bsd::ucontext_get_pc(uc);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (pc && StubRoutines::is_safefetch_fault(pc)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ os::Bsd::ucontext_set_pc(uc, StubRoutines::continuation_for_safefetch_fault(pc));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // decide if this trap can be handled by a stub
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ address stub = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ address pc = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ //%note os_trap_1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (info != NULL && uc != NULL && thread != NULL) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ pc = (address) os::Bsd::ucontext_get_pc(uc);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // Handle ALL stack overflow variations here
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (sig == SIGSEGV || sig == SIGBUS) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ address addr = (address) info->si_addr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // check if fault address is within thread stack
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (thread->on_local_stack(addr)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ThreadWXEnable wx(WXWrite, thread);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // stack overflow
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (thread->in_stack_yellow_reserved_zone(addr)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (thread->thread_state() == _thread_in_Java) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (thread->in_stack_reserved_zone(addr)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ frame fr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (os::Bsd::get_frame_at_stack_banging_point(thread, uc, &fr)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ assert(fr.is_java_frame(), "Must be a Java frame");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ frame activation =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ SharedRuntime::look_for_reserved_stack_annotated_method(thread, fr);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (activation.sp() != NULL) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ thread->disable_stack_reserved_zone();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (activation.is_interpreted_frame()) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ thread->set_reserved_stack_activation((address)(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ activation.fp() + frame::interpreter_frame_initial_sp_offset));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ thread->set_reserved_stack_activation((address)activation.unextended_sp());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // Throw a stack overflow exception. Guard pages will be reenabled
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // while unwinding the stack.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ thread->disable_stack_yellow_reserved_zone();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ stub = SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::STACK_OVERFLOW);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // Thread was in the vm or native code. Return and try to finish.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ thread->disable_stack_yellow_reserved_zone();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ } else if (thread->in_stack_red_zone(addr)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // Fatal red zone violation. Disable the guard pages and fall through
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // to handle_unexpected_exception way down below.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ thread->disable_stack_red_zone();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ tty->print_raw_cr("An irrecoverable stack overflow has occurred.");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // We test if stub is already set (by the stack overflow code
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // above) so it is not overwritten by the code that follows. This
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // check is not required on other platforms, because on other
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // platforms we check for SIGSEGV only or SIGBUS only, where here
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // we have to check for both SIGSEGV and SIGBUS.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (thread->thread_state() == _thread_in_Java && stub == NULL) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // Java thread running in Java code => find exception handler if any
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // a fault inside compiled code, the interpreter, or a stub
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ThreadWXEnable wx(WXWrite, thread);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // Handle signal from NativeJump::patch_verified_entry().
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if ((sig == SIGILL)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ && nativeInstruction_at(pc)->is_sigill_zombie_not_entrant()) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (TraceTraps) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ tty->print_cr("trap: zombie_not_entrant");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ stub = SharedRuntime::get_handle_wrong_method_stub();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ } else if ((sig == SIGSEGV || sig == SIGBUS) && os::is_poll_address((address)info->si_addr)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ stub = SharedRuntime::get_poll_stub(pc);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(__APPLE__)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // 32-bit Darwin reports a SIGBUS for nearly all memory access exceptions.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // 64-bit Darwin may also use a SIGBUS (seen with compressed oops).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // Catching SIGBUS here prevents the implicit SIGBUS NULL check below from
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // being called, so only do so if the implicit NULL check is not necessary.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ } else if (sig == SIGBUS && MacroAssembler::needs_explicit_null_check((intptr_t)info->si_addr)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ } else if (sig == SIGBUS /* && info->si_code == BUS_OBJERR */) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // BugId 4454115: A read from a MappedByteBuffer can fault
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // here if the underlying file has been truncated.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // Do not crash the VM in such a case.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ CodeBlob* cb = CodeCache::find_blob_unsafe(pc);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ CompiledMethod* nm = (cb != NULL) ? cb->as_compiled_method_or_null() : NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if ((nm != NULL && nm->has_unsafe_access())) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ address next_pc = pc + NativeCall::instruction_size;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ stub = SharedRuntime::handle_unsafe_access(thread, next_pc);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (sig == SIGFPE &&
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ (info->si_code == FPE_INTDIV || info->si_code == FPE_FLTDIV)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ stub =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ SharedRuntime::
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ continuation_for_implicit_exception(thread,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ pc,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ SharedRuntime::
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ IMPLICIT_DIVIDE_BY_ZERO);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef __APPLE__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ } else if (sig == SIGFPE && info->si_code == FPE_NOOP) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ Unimplemented();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif /* __APPLE__ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ } else if ((sig == SIGSEGV || sig == SIGBUS) &&
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ !MacroAssembler::needs_explicit_null_check((intptr_t)info->si_addr)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // Determination of interpreter/vtable stub/compiled code null exception
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ stub = SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::IMPLICIT_NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ } else if ((thread->thread_state() == _thread_in_vm ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ thread->thread_state() == _thread_in_native) &&
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ sig == SIGBUS && /* info->si_code == BUS_OBJERR && */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ thread->doing_unsafe_access()) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ address next_pc = pc + NativeCall::instruction_size;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ stub = SharedRuntime::handle_unsafe_access(thread, next_pc);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // jni_fast_Get<Primitive>Field can trap at certain pc's if a GC kicks in
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // and the heap gets shrunk before the field access.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if ((sig == SIGSEGV) || (sig == SIGBUS)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ address addr = JNI_FastGetField::find_slowcase_pc(pc);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (addr != (address)-1) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ stub = addr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // Check to see if we caught the safepoint code in the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // process of write protecting the memory serialization page.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // It write enables the page immediately after protecting it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // so we can just return to retry the write.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if ((sig == SIGSEGV) &&
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ os::is_memory_serialize_page(thread, (address) info->si_addr)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // Block current thread until the memory serialize page permission restored.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ os::block_on_serialize_page_trap();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return true;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (stub != NULL) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // save all thread context in case we need to restore it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (thread != NULL) thread->set_saved_exception_pc(pc);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ os::Bsd::ucontext_set_pc(uc, stub);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return true;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // signal-chaining
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (os::Bsd::chained_handler(sig, info, ucVoid)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return true;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (!abort_if_unrecognized) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // caller wants another chance, so give it to him
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return false;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (pc == NULL && uc != NULL) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ pc = os::Bsd::ucontext_get_pc(uc);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // unmask current signal
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ sigset_t newset;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ sigemptyset(&newset);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ sigaddset(&newset, sig);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ sigprocmask(SIG_UNBLOCK, &newset, NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ VMError::report_and_die(t, sig, pc, info, ucVoid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ShouldNotReachHere();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return true; // Mute compiler
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++void os::Bsd::init_thread_fpu_state(void) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++bool os::is_allocatable(size_t bytes) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return true;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++////////////////////////////////////////////////////////////////////////////////
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// thread stack
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// Minimum usable stack sizes required to get to user code. Space for
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// HotSpot guard pages is added later.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++size_t os::Posix::_compiler_thread_min_stack_allowed = 72 * K;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++size_t os::Posix::_java_thread_min_stack_allowed = 72 * K;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++size_t os::Posix::_vm_internal_thread_min_stack_allowed = 72 * K;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// return default stack size for thr_type
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++size_t os::Posix::default_stack_size(os::ThreadType thr_type) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // default stack size (compiler thread needs larger stack)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ size_t s = (thr_type == os::compiler_thread ? 4 * M : 1 * M);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return s;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static void current_stack_region(address * bottom, size_t * size) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef __APPLE__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ pthread_t self = pthread_self();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ void *stacktop = pthread_get_stackaddr_np(self);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *size = pthread_get_stacksize_np(self);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *bottom = (address) stacktop - *size;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#elif defined(__OpenBSD__)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ stack_t ss;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ int rslt = pthread_stackseg_np(pthread_self(), &ss);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (rslt != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal("pthread_stackseg_np failed with error = %d", rslt);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *bottom = (address)((char *)ss.ss_sp - ss.ss_size);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *size = ss.ss_size;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ pthread_attr_t attr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ int rslt = pthread_attr_init(&attr);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // JVM needs to know exact stack location, abort if it fails
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (rslt != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal("pthread_attr_init failed with error = %d", rslt);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ rslt = pthread_attr_get_np(pthread_self(), &attr);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (rslt != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal("pthread_attr_get_np failed with error = %d", rslt);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (pthread_attr_getstackaddr(&attr, (void **)bottom) != 0 ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ pthread_attr_getstacksize(&attr, size) != 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal("Can not locate current stack attributes!");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ pthread_attr_destroy(&attr);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ assert(os::current_stack_pointer() >= *bottom &&
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ os::current_stack_pointer() < *bottom + *size, "just checking");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++address os::current_stack_base() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ address bottom;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ size_t size;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ current_stack_region(&bottom, &size);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return (bottom + size);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++size_t os::current_stack_size() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // stack size includes normal stack and HotSpot guard pages
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ address bottom;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ size_t size;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ current_stack_region(&bottom, &size);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return size;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/////////////////////////////////////////////////////////////////////////////
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// helper functions for fatal error handler
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++void os::print_context(outputStream *st, const void *context) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (context == NULL) return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ const ucontext_t *uc = (const ucontext_t*)context;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print_cr("Registers:");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print( " x0=" INTPTR_FORMAT, (intptr_t)uc->context_x[ 0]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print(" x1=" INTPTR_FORMAT, (intptr_t)uc->context_x[ 1]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print(" x2=" INTPTR_FORMAT, (intptr_t)uc->context_x[ 2]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print(" x3=" INTPTR_FORMAT, (intptr_t)uc->context_x[ 3]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->cr();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print( " x4=" INTPTR_FORMAT, (intptr_t)uc->context_x[ 4]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print(" x5=" INTPTR_FORMAT, (intptr_t)uc->context_x[ 5]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print(" x6=" INTPTR_FORMAT, (intptr_t)uc->context_x[ 6]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print(" x7=" INTPTR_FORMAT, (intptr_t)uc->context_x[ 7]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->cr();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print( " x8=" INTPTR_FORMAT, (intptr_t)uc->context_x[ 8]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print(" x9=" INTPTR_FORMAT, (intptr_t)uc->context_x[ 9]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print(" x10=" INTPTR_FORMAT, (intptr_t)uc->context_x[10]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print(" x11=" INTPTR_FORMAT, (intptr_t)uc->context_x[11]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->cr();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print( "x12=" INTPTR_FORMAT, (intptr_t)uc->context_x[12]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print(" x13=" INTPTR_FORMAT, (intptr_t)uc->context_x[13]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print(" x14=" INTPTR_FORMAT, (intptr_t)uc->context_x[14]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print(" x15=" INTPTR_FORMAT, (intptr_t)uc->context_x[15]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->cr();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print( "x16=" INTPTR_FORMAT, (intptr_t)uc->context_x[16]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print(" x17=" INTPTR_FORMAT, (intptr_t)uc->context_x[17]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print(" x18=" INTPTR_FORMAT, (intptr_t)uc->context_x[18]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print(" x19=" INTPTR_FORMAT, (intptr_t)uc->context_x[19]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->cr();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print( "x20=" INTPTR_FORMAT, (intptr_t)uc->context_x[20]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print(" x21=" INTPTR_FORMAT, (intptr_t)uc->context_x[21]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print(" x22=" INTPTR_FORMAT, (intptr_t)uc->context_x[22]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print(" x23=" INTPTR_FORMAT, (intptr_t)uc->context_x[23]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->cr();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print( "x24=" INTPTR_FORMAT, (intptr_t)uc->context_x[24]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print(" x25=" INTPTR_FORMAT, (intptr_t)uc->context_x[25]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print(" x26=" INTPTR_FORMAT, (intptr_t)uc->context_x[26]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print(" x27=" INTPTR_FORMAT, (intptr_t)uc->context_x[27]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->cr();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print( "x28=" INTPTR_FORMAT, (intptr_t)uc->context_x[28]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print(" fp=" INTPTR_FORMAT, (intptr_t)uc->context_fp);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print(" lr=" INTPTR_FORMAT, (intptr_t)uc->context_lr);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print(" sp=" INTPTR_FORMAT, (intptr_t)uc->context_sp);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->cr();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print( "pc=" INTPTR_FORMAT, (intptr_t)uc->context_pc);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print(" cpsr=" INTPTR_FORMAT, (intptr_t)uc->context_cpsr);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->cr();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ intptr_t *sp = (intptr_t *)os::Bsd::ucontext_get_sp(uc);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print_cr("Top of Stack: (sp=" INTPTR_FORMAT ")", (intptr_t)sp);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ print_hex_dump(st, (address)sp, (address)(sp + 8*sizeof(intptr_t)), sizeof(intptr_t));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->cr();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // Note: it may be unsafe to inspect memory near pc. For example, pc may
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // point to garbage if entry point in an nmethod is corrupted. Leave
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // this at the end, and hope for the best.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ address pc = os::Bsd::ucontext_get_pc(uc);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ print_instructions(st, pc, sizeof(char));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->cr();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++void os::print_register_info(outputStream *st, const void *context) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (context == NULL) return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ const ucontext_t *uc = (const ucontext_t*)context;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print_cr("Register to memory mapping:");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->cr();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // this is horrendously verbose but the layout of the registers in the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // context does not match how we defined our abstract Register set, so
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // we can't just iterate through the gregs area
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // this is only for the "general purpose" registers
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print(" x0="); print_location(st, uc->context_x[ 0]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print(" x1="); print_location(st, uc->context_x[ 1]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print(" x2="); print_location(st, uc->context_x[ 2]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print(" x3="); print_location(st, uc->context_x[ 3]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print(" x4="); print_location(st, uc->context_x[ 4]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print(" x5="); print_location(st, uc->context_x[ 5]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print(" x6="); print_location(st, uc->context_x[ 6]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print(" x7="); print_location(st, uc->context_x[ 7]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print(" x8="); print_location(st, uc->context_x[ 8]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print(" x9="); print_location(st, uc->context_x[ 9]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print("x10="); print_location(st, uc->context_x[10]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print("x11="); print_location(st, uc->context_x[11]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print("x12="); print_location(st, uc->context_x[12]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print("x13="); print_location(st, uc->context_x[13]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print("x14="); print_location(st, uc->context_x[14]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print("x15="); print_location(st, uc->context_x[15]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print("x16="); print_location(st, uc->context_x[16]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print("x17="); print_location(st, uc->context_x[17]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print("x18="); print_location(st, uc->context_x[18]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print("x19="); print_location(st, uc->context_x[19]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print("x20="); print_location(st, uc->context_x[20]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print("x21="); print_location(st, uc->context_x[21]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print("x22="); print_location(st, uc->context_x[22]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print("x23="); print_location(st, uc->context_x[23]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print("x24="); print_location(st, uc->context_x[24]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print("x25="); print_location(st, uc->context_x[25]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print("x26="); print_location(st, uc->context_x[26]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print("x27="); print_location(st, uc->context_x[27]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->print("x28="); print_location(st, uc->context_x[28]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ st->cr();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++void os::setup_fpu() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifndef PRODUCT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++void os::verify_stack_alignment() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ assert(((intptr_t)os::current_stack_pointer() & (StackAlignmentInBytes-1)) == 0, "incorrect stack alignment");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++int os::extra_bang_size_in_bytes() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // AArch64 does not require the additional stack bang.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++void os::current_thread_enable_wx(WXMode mode) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ pthread_jit_write_protect_np(mode == WXExec);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++extern "C" {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ int SpinPause() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ void _Copy_conjoint_jshorts_atomic(const jshort* from, jshort* to, size_t count) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (from > to) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ const jshort *end = from + count;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ while (from < end)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *(to++) = *(from++);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ else if (from < to) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ const jshort *end = from;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ from += count - 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ to += count - 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ while (from >= end)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *(to--) = *(from--);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ void _Copy_conjoint_jints_atomic(const jint* from, jint* to, size_t count) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (from > to) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ const jint *end = from + count;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ while (from < end)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *(to++) = *(from++);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ else if (from < to) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ const jint *end = from;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ from += count - 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ to += count - 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ while (from >= end)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *(to--) = *(from--);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ void _Copy_conjoint_jlongs_atomic(const jlong* from, jlong* to, size_t count) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (from > to) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ const jlong *end = from + count;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ while (from < end)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ os::atomic_copy64(from++, to++);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ else if (from < to) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ const jlong *end = from;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ from += count - 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ to += count - 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ while (from >= end)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ os::atomic_copy64(from--, to--);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ void _Copy_arrayof_conjoint_bytes(const HeapWord* from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ HeapWord* to,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ size_t count) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ memmove(to, from, count);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ void _Copy_arrayof_conjoint_jshorts(const HeapWord* from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ HeapWord* to,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ size_t count) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ memmove(to, from, count * 2);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ void _Copy_arrayof_conjoint_jints(const HeapWord* from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ HeapWord* to,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ size_t count) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ memmove(to, from, count * 4);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ void _Copy_arrayof_conjoint_jlongs(const HeapWord* from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ HeapWord* to,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ size_t count) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ memmove(to, from, count * 8);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/hotspot/os_cpu/bsd_aarch64/os_bsd_aarch64.hpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -0,0 +1,42 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 1999, 2020, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2014, Red Hat Inc. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * This code is free software; you can redistribute it and/or modify it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * under the terms of the GNU General Public License version 2 only, as
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * published by the Free Software Foundation.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * This code is distributed in the hope that it will be useful, but WITHOUT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * version 2 for more details (a copy is included in the LICENSE file that
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * accompanied this code).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * You should have received a copy of the GNU General Public License version
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * 2 along with this work; if not, write to the Free Software Foundation,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * or visit www.oracle.com if you need additional information or have any
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * questions.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifndef OS_CPU_BSD_AARCH64_VM_OS_BSD_AARCH64_HPP
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define OS_CPU_BSD_AARCH64_VM_OS_BSD_AARCH64_HPP
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ static void setup_fpu();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ static bool is_allocatable(size_t bytes);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // Used to register dynamic code cache area with the OS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // Note: Currently only used in 64 bit Windows implementations
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ static bool register_code_area(char *low, char *high) { return true; }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // Atomically copy 64 bits of data
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ static void atomic_copy64(const volatile void *src, volatile void *dst) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *(jlong *) dst = *(const jlong *) src;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif // OS_CPU_BSD_AARCH64_VM_OS_BSD_AARCH64_HPP
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/hotspot/os_cpu/bsd_aarch64/pauth_bsd_aarch64.inline.hpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -0,0 +1,53 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2021, Arm Limited. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * This code is free software; you can redistribute it and/or modify it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * under the terms of the GNU General Public License version 2 only, as
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * published by the Free Software Foundation.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * This code is distributed in the hope that it will be useful, but WITHOUT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * version 2 for more details (a copy is included in the LICENSE file that
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * accompanied this code).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * You should have received a copy of the GNU General Public License version
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * 2 along with this work; if not, write to the Free Software Foundation,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * or visit www.oracle.com if you need additional information or have any
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * questions.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifndef OS_CPU_BSD_AARCH64_VM_PAUTH_BSD_AARCH64_INLINE_HPP
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define OS_CPU_BSD_AARCH64_VM_PAUTH_BSD_AARCH64_INLINE_HPP
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef __APPLE__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <ptrauth.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// Only the PAC instructions in the NOP space can be used. This ensures the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// binaries work on systems without PAC. Write these instructions using their
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// alternate "hint" instructions to ensure older compilers can still be used.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// For Apple, use the provided interface as this may provide additional
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// optimization.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define XPACLRI "hint #0x7;"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++inline address pauth_strip_pointer(address ptr) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef __APPLE__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return ptrauth_strip(ptr, ptrauth_key_asib);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ register address result __asm__("x30") = ptr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ asm (XPACLRI : "+r"(result));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return result;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#undef XPACLRI
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif // OS_CPU_BSD_AARCH64_VM_PAUTH_BSD_AARCH64_INLINE_HPP
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/hotspot/os_cpu/bsd_aarch64/prefetch_bsd_aarch64.inline.hpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -0,0 +1,42 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2014, Red Hat Inc. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * This code is free software; you can redistribute it and/or modify it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * under the terms of the GNU General Public License version 2 only, as
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * published by the Free Software Foundation.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * This code is distributed in the hope that it will be useful, but WITHOUT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * version 2 for more details (a copy is included in the LICENSE file that
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * accompanied this code).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * You should have received a copy of the GNU General Public License version
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * 2 along with this work; if not, write to the Free Software Foundation,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * or visit www.oracle.com if you need additional information or have any
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * questions.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifndef OS_CPU_BSD_AARCH64_VM_PREFETCH_BSD_AARCH64_INLINE_HPP
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define OS_CPU_BSD_AARCH64_VM_PREFETCH_BSD_AARCH64_INLINE_HPP
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "runtime/prefetch.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++inline void Prefetch::read (void *loc, intx interval) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (interval >= 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ asm("prfm PLDL1KEEP, [%0, %1]" : : "r"(loc), "r"(interval));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++inline void Prefetch::write(void *loc, intx interval) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (interval >= 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ asm("prfm PSTL1KEEP, [%0, %1]" : : "r"(loc), "r"(interval));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif // OS_CPU_BSD_AARCH64_VM_PREFETCH_BSD_AARCH64_INLINE_HPP
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/hotspot/os_cpu/bsd_aarch64/thread_bsd_aarch64.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -0,0 +1,104 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2003, 2021, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2014, Red Hat Inc. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * This code is free software; you can redistribute it and/or modify it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * under the terms of the GNU General Public License version 2 only, as
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * published by the Free Software Foundation.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * This code is distributed in the hope that it will be useful, but WITHOUT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * version 2 for more details (a copy is included in the LICENSE file that
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * accompanied this code).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * You should have received a copy of the GNU General Public License version
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * 2 along with this work; if not, write to the Free Software Foundation,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * or visit www.oracle.com if you need additional information or have any
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * questions.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "precompiled.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "memory/metaspaceShared.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "runtime/frame.inline.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "runtime/thread.inline.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++frame JavaThread::pd_last_frame() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ assert(has_last_Java_frame(), "must have last_Java_sp() when suspended");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ vmassert(_anchor.last_Java_pc() != NULL, "not walkable");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return frame(_anchor.last_Java_sp(), _anchor.last_Java_fp(), _anchor.last_Java_pc());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// For Forte Analyzer AsyncGetCallTrace profiling support - thread is
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// currently interrupted by SIGPROF
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++bool JavaThread::pd_get_top_frame_for_signal_handler(frame* fr_addr,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ void* ucontext, bool isInJava) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ assert(Thread::current() == this, "caller must be current thread");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return pd_get_top_frame(fr_addr, ucontext, isInJava);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++bool JavaThread::pd_get_top_frame_for_profiling(frame* fr_addr, void* ucontext, bool isInJava) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return pd_get_top_frame(fr_addr, ucontext, isInJava);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++bool JavaThread::pd_get_top_frame(frame* fr_addr, void* ucontext, bool isInJava) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ assert(this->is_Java_thread(), "must be JavaThread");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ JavaThread* jt = (JavaThread *)this;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // If we have a last_Java_frame, then we should use it even if
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // isInJava == true. It should be more reliable than ucontext info.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (jt->has_last_Java_frame() && jt->frame_anchor()->walkable()) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *fr_addr = jt->pd_last_frame();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return true;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // At this point, we don't have a last_Java_frame, so
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // we try to glean some information out of the ucontext
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // if we were running Java code when SIGPROF came in.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (isInJava) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ucontext_t* uc = (ucontext_t*) ucontext;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ intptr_t* ret_fp;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ intptr_t* ret_sp;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ExtendedPC addr = os::fetch_frame_from_context(uc, &ret_sp, &ret_fp);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (addr.pc() == NULL || ret_sp == NULL ) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // ucontext wasn't useful
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return false;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (MetaspaceShared::is_in_trampoline_frame(addr.pc())) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // In the middle of a trampoline call. Bail out for safety.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // This happens rarely so shouldn't affect profiling.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return false;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ frame ret_frame(ret_sp, ret_fp, addr.pc());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (!ret_frame.safe_for_sender(jt)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef COMPILER2
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ frame ret_frame2(ret_sp, NULL, addr.pc());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (!ret_frame2.safe_for_sender(jt)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // nothing else to try if the frame isn't good
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return false;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ret_frame = ret_frame2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // nothing else to try if the frame isn't good
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return false;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif /* COMPILER2 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *fr_addr = ret_frame;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return true;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // nothing else to try
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return false;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++void JavaThread::cache_global_variables() { }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/hotspot/os_cpu/bsd_aarch64/thread_bsd_aarch64.hpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -0,0 +1,74 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2000, 2021, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2014, Red Hat Inc. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2021, Azul Systems, Inc. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * This code is free software; you can redistribute it and/or modify it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * under the terms of the GNU General Public License version 2 only, as
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * published by the Free Software Foundation.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * This code is distributed in the hope that it will be useful, but WITHOUT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * version 2 for more details (a copy is included in the LICENSE file that
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * accompanied this code).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * You should have received a copy of the GNU General Public License version
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * 2 along with this work; if not, write to the Free Software Foundation,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * or visit www.oracle.com if you need additional information or have any
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * questions.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifndef OS_CPU_BSD_AARCH64_VM_THREAD_BSD_AARCH64_HPP
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define OS_CPU_BSD_AARCH64_VM_THREAD_BSD_AARCH64_HPP
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ private:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ void pd_initialize() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ _anchor.clear();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ frame pd_last_frame();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ public:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // Mutators are highly dangerous....
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ intptr_t* last_Java_fp() { return _anchor.last_Java_fp(); }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ void set_last_Java_fp(intptr_t* fp) { _anchor.set_last_Java_fp(fp); }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ void set_base_of_stack_pointer(intptr_t* base_sp) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ static ByteSize last_Java_fp_offset() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return byte_offset_of(JavaThread, _anchor) + JavaFrameAnchor::last_Java_fp_offset();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ intptr_t* base_of_stack_pointer() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ void record_base_of_stack_pointer() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ bool pd_get_top_frame_for_signal_handler(frame* fr_addr, void* ucontext,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ bool isInJava);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ bool pd_get_top_frame_for_profiling(frame* fr_addr, void* ucontext, bool isInJava);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++private:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ bool pd_get_top_frame(frame* fr_addr, void* ucontext, bool isInJava);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++public:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ static Thread *aarch64_get_thread_helper() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return Thread::current();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // These routines are only used on cpu architectures that
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // have separate register stacks (Itanium).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ static bool register_stack_overflow() { return false; }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ static void enable_register_stack_guard() {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ static void disable_register_stack_guard() {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif // OS_CPU_BSD_AARCH64_VM_THREAD_BSD_AARCH64_HPP
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/hotspot/os_cpu/bsd_aarch64/vmStructs_bsd_aarch64.hpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -0,0 +1,54 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2000, 2021, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2014, Red Hat Inc. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * This code is free software; you can redistribute it and/or modify it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * under the terms of the GNU General Public License version 2 only, as
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * published by the Free Software Foundation.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * This code is distributed in the hope that it will be useful, but WITHOUT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * version 2 for more details (a copy is included in the LICENSE file that
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * accompanied this code).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * You should have received a copy of the GNU General Public License version
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * 2 along with this work; if not, write to the Free Software Foundation,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * or visit www.oracle.com if you need additional information or have any
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * questions.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifndef OS_CPU_BSD_AARCH64_VM_VMSTRUCTS_BSD_AARCH64_HPP
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define OS_CPU_BSD_AARCH64_VM_VMSTRUCTS_BSD_AARCH64_HPP
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// These are the OS and CPU-specific fields, types and integer
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// constants required by the Serviceability Agent. This file is
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// referenced by vmStructs.cpp.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define VM_STRUCTS_OS_CPU(nonstatic_field, static_field, unchecked_nonstatic_field, volatile_nonstatic_field, nonproduct_nonstatic_field, c2_nonstatic_field, unchecked_c1_static_field, unchecked_c2_static_field) \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ /******************************/ \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ /* Threads (NOTE: incomplete) */ \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ /******************************/ \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ nonstatic_field(OSThread, _thread_id, OSThread::thread_id_t) \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ nonstatic_field(OSThread, _unique_thread_id, uint64_t)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define VM_TYPES_OS_CPU(declare_type, declare_toplevel_type, declare_oop_type, declare_integer_type, declare_unsigned_integer_type, declare_c1_toplevel_type, declare_c2_type, declare_c2_toplevel_type) \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ /**********************/ \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ /* Thread IDs */ \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ /**********************/ \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ declare_unsigned_integer_type(OSThread::thread_id_t)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define VM_INT_CONSTANTS_OS_CPU(declare_constant, declare_preprocessor_constant, declare_c1_constant, declare_c2_constant, declare_c2_preprocessor_constant)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define VM_LONG_CONSTANTS_OS_CPU(declare_constant, declare_preprocessor_constant, declare_c1_constant, declare_c2_constant, declare_c2_preprocessor_constant)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif // OS_CPU_BSD_AARCH64_VM_VMSTRUCTS_BSD_AARCH64_HPP
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/hotspot/os_cpu/bsd_aarch64/vm_version_bsd_aarch64.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -0,0 +1,89 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2006, 2019, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2014, 2019, Red Hat Inc. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2021, Azul Systems, Inc. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * This code is free software; you can redistribute it and/or modify it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * under the terms of the GNU General Public License version 2 only, as
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * published by the Free Software Foundation.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * This code is distributed in the hope that it will be useful, but WITHOUT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * version 2 for more details (a copy is included in the LICENSE file that
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * accompanied this code).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * You should have received a copy of the GNU General Public License version
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * 2 along with this work; if not, write to the Free Software Foundation,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * or visit www.oracle.com if you need additional information or have any
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * questions.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "precompiled.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "runtime/java.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "runtime/os.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "runtime/vm_version.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <sys/sysctl.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static bool cpu_has(const char* optional) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ uint32_t val;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ size_t len = sizeof(val);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (sysctlbyname(optional, &val, &len, NULL, 0)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return false;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return val;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++void VM_Version::get_os_cpu_info() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ size_t sysctllen;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // hw.optional.floatingpoint always returns 1, see
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // https://github.com/apple/darwin-xnu/blob/master/bsd/kern/kern_mib.c#L416.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // ID_AA64PFR0_EL1 describes AdvSIMD always equals to FP field.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ assert(cpu_has("hw.optional.floatingpoint"), "should be");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ assert(cpu_has("hw.optional.neon"), "should be");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ _features = CPU_FP | CPU_ASIMD;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // Only few features are available via sysctl, see line 614
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // https://opensource.apple.com/source/xnu/xnu-6153.141.1/bsd/kern/kern_mib.c.auto.html
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (cpu_has("hw.optional.armv8_crc32")) _features |= CPU_CRC32;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (cpu_has("hw.optional.armv8_1_atomics")) _features |= CPU_LSE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ int cache_line_size;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ int hw_conf_cache_line[] = { CTL_HW, HW_CACHELINE };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ sysctllen = sizeof(cache_line_size);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (sysctl(hw_conf_cache_line, 2, &cache_line_size, &sysctllen, NULL, 0)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ cache_line_size = 16;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ _icache_line_size = 16; // minimal line lenght CCSIDR_EL1 can hold
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ _dcache_line_size = cache_line_size;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ uint64_t dczid_el0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ __asm__ (
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ "mrs %0, DCZID_EL0\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ : "=r"(dczid_el0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (!(dczid_el0 & 0x10)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ _zva_length = 4 << (dczid_el0 & 0xf);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ int family;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ sysctllen = sizeof(family);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (sysctlbyname("hw.cpufamily", &family, &sysctllen, NULL, 0)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ family = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ _model = family;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ _cpu = CPU_APPLE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef __APPLE__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++bool VM_Version::is_cpu_emulated() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return false;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+\ No newline at end of file
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/hotspot/share/c1/c1_Runtime1.cpp.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/hotspot/share/c1/c1_Runtime1.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -834,6 +834,10 @@ static Klass* resolve_field_return_klass(const methodHandle& caller, int bci, TR
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ JRT_ENTRY(void, Runtime1::patch_code(JavaThread* thread, Runtime1::StubID stub_id ))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ NOT_PRODUCT(_patch_code_slowcase_cnt++;)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // Enable WXWrite: the function is called by c1 stub as a runtime function
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // (see another implementation above).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ MACOS_AARCH64_ONLY(ThreadWXEnable wx(WXWrite, thread));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ResourceMark rm(thread);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ RegisterMap reg_map(thread, false);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ frame runtime_frame = thread->last_frame();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/hotspot/share/interpreter/interpreterRuntime.cpp.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/hotspot/share/interpreter/interpreterRuntime.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1015,6 +1015,9 @@ IRT_END
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ nmethod* InterpreterRuntime::frequency_counter_overflow(JavaThread* thread, address branch_bcp) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // Enable WXWrite: the function is called directly by interpreter.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ MACOS_AARCH64_ONLY(ThreadWXEnable wx(WXWrite, thread));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ nmethod* nm = frequency_counter_overflow_inner(thread, branch_bcp);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ assert(branch_bcp != NULL || nm == NULL, "always returns null for non OSR requests");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (branch_bcp != NULL && nm != NULL) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/hotspot/share/interpreter/oopMapCache.cpp.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/hotspot/share/interpreter/oopMapCache.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -241,6 +241,8 @@ class MaskFillerForNative: public NativeSignatureIterator {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ public:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ void pass_byte() { /* ignore */ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ void pass_short() { /* ignore */ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void pass_int() { /* ignore */ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void pass_long() { /* ignore */ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void pass_float() { /* ignore */ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/hotspot/share/jvmci/jvmciEnv.hpp.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/hotspot/share/jvmci/jvmciEnv.hpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -37,6 +37,7 @@ class CompileTask;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // Bring the JVMCI compiler thread into the VM state.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define JVMCI_VM_ENTRY_MARK \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ JavaThread* thread = JavaThread::current(); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ MACOS_AARCH64_ONLY(ThreadWXEnable __wx(WXWrite, thread)); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ThreadInVMfromNative __tiv(thread); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ResetNoHandleMark rnhm; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ HandleMarkCleaner __hm(thread); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/hotspot/share/opto/runtime.cpp.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/hotspot/share/opto/runtime.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -68,6 +68,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include "runtime/sharedRuntime.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include "runtime/signature.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include "runtime/threadCritical.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "runtime/threadWXSetters.inline.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include "runtime/vframe.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include "runtime/vframeArray.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include "runtime/vframe_hp.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1444,6 +1445,10 @@ address OptoRuntime::handle_exception_C(JavaThread* thread) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // *THIS IS NOT RECOMMENDED PROGRAMMING STYLE*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ //
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ address OptoRuntime::rethrow_C(oopDesc* exception, JavaThread* thread, address ret_pc) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // Enable WXWrite: the function called directly by compiled code.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ MACOS_AARCH64_ONLY(ThreadWXEnable wx(WXWrite, thread));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #ifndef PRODUCT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SharedRuntime::_rethrow_ctr++; // count rethrows
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/hotspot/share/prims/jni.cpp.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/hotspot/share/prims/jni.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1,6 +1,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Copyright (c) 1997, 2021, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Copyright (c) 2012 Red Hat, Inc.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2021, Azul Systems, Inc. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * This code is free software; you can redistribute it and/or modify it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -4055,6 +4056,7 @@ static jint JNI_CreateJavaVM_inner(JavaVM **vm, void **penv, void *args) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // Since this is not a JVM_ENTRY we have to set the thread state manually before leaving.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ThreadStateTransition::transition_and_fence(thread, _thread_in_vm, _thread_in_native);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ MACOS_AARCH64_ONLY(thread->enable_wx(WXExec));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // If create_vm exits because of a pending exception, exit with that
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // exception. In the future when we figure out how to reclaim memory,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -4210,6 +4212,7 @@ static jint attach_current_thread(JavaVM *vm, void **penv, void *_args, bool dae
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ thread->record_stack_base_and_size();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ thread->register_thread_stack_with_NMT();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ thread->initialize_thread_current();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ MACOS_AARCH64_ONLY(thread->init_wx());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (!os::create_attached_thread(thread)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ thread->smr_delete();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -4284,6 +4287,7 @@ static jint attach_current_thread(JavaVM *vm, void **penv, void *_args, bool dae
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // needed.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ThreadStateTransition::transition_and_fence(thread, _thread_in_vm, _thread_in_native);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ MACOS_AARCH64_ONLY(thread->enable_wx(WXExec));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // Perform any platform dependent FPU setup
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ os::setup_fpu();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -4354,6 +4358,10 @@ jint JNICALL jni_DetachCurrentThread(JavaVM *vm) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ thread->exit(false, JavaThread::jni_detach);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ thread->smr_delete();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // Go to the execute mode, the initial state of the thread on creation.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // Use os interface as the thread is not a JavaThread anymore.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ MACOS_AARCH64_ONLY(os::current_thread_enable_wx(WXExec));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ HOTSPOT_JNI_DETACHCURRENTTHREAD_RETURN(JNI_OK);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return JNI_OK;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/hotspot/share/prims/jniCheck.cpp.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/hotspot/share/prims/jniCheck.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -100,6 +100,7 @@ extern "C" { \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (env != xenv) { \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ NativeReportJNIFatalError(thr, warn_wrong_jnienv); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ MACOS_AARCH64_ONLY(ThreadWXEnable __wx(WXWrite, thr)); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ VM_ENTRY_BASE(result_type, header, thr)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/hotspot/share/prims/jniFastGetField.hpp.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/hotspot/share/prims/jniFastGetField.hpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -65,6 +65,11 @@ class JNI_FastGetField : AllStatic {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static address generate_fast_get_int_field0(BasicType type);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static address generate_fast_get_float_field0(BasicType type);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef AARCH64
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ template<int BType>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ static address generate_fast_get_int_field1();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif // AARCH64
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ public:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #if defined(_WINDOWS) && !defined(_WIN64)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static GetBooleanField_t jni_fast_GetBooleanField_fp;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/hotspot/share/prims/jvmtiEnter.xsl.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/hotspot/share/prims/jvmtiEnter.xsl
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -432,6 +432,8 @@ struct jvmtiInterface_1_ jvmti</xsl:text>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ <xsl:if test="count(@impl)=0 or not(contains(@impl,'innative'))">
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ <xsl:text>JavaThread* current_thread = (JavaThread*)this_thread;</xsl:text>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ <xsl:value-of select="$space"/>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ <xsl:text>MACOS_AARCH64_ONLY(ThreadWXEnable __wx(WXWrite, current_thread));</xsl:text>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ <xsl:value-of select="$space"/>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ <xsl:text>ThreadInVMfromNative __tiv(current_thread);</xsl:text>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ <xsl:value-of select="$space"/>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ <xsl:text>VM_ENTRY_BASE(jvmtiError, </xsl:text>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/hotspot/share/prims/jvmtiEnv.cpp.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/hotspot/share/prims/jvmtiEnv.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -172,6 +172,7 @@ JvmtiEnv::GetThreadLocalStorage(jthread thread, void** data_ptr) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // other than the current thread is required we need to transition
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // from native so as to resolve the jthread.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ MACOS_AARCH64_ONLY(ThreadWXEnable __wx(WXWrite, current_thread));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ThreadInVMfromNative __tiv(current_thread);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ VM_ENTRY_BASE(jvmtiError, JvmtiEnv::GetThreadLocalStorage , current_thread)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ debug_only(VMNativeEntryWrapper __vew;)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/hotspot/share/prims/whitebox.inline.hpp.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/hotspot/share/prims/whitebox.inline.hpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1,5 +1,5 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2018, 2021, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * This code is free software; you can redistribute it and/or modify it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -31,7 +31,8 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // Entry macro to transition from JNI to VM state.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define WB_ENTRY(result_type, header) JNI_ENTRY(result_type, header) \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- ClearPendingJniExcCheck _clearCheck(env);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ClearPendingJniExcCheck _clearCheck(env); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ MACOS_AARCH64_ONLY(ThreadWXEnable _wx(WXWrite, thread));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define WB_END JNI_END
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/hotspot/share/runtime/deoptimization.cpp.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/hotspot/share/runtime/deoptimization.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -54,6 +54,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include "runtime/stubRoutines.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include "runtime/thread.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include "runtime/threadSMR.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "runtime/threadWXSetters.inline.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include "runtime/vframe.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include "runtime/vframeArray.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include "runtime/vframe_hp.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2079,6 +2080,9 @@ Deoptimization::update_method_data_from_interpreter(MethodData* trap_mdo, int tr
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Deoptimization::UnrollBlock* Deoptimization::uncommon_trap(JavaThread* thread, jint trap_request, jint exec_mode) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // Enable WXWrite: current function is called from methods compiled by C2 directly
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ MACOS_AARCH64_ONLY(ThreadWXEnable wx(WXWrite, thread));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (TraceDeoptimization) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ tty->print("Uncommon trap ");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/hotspot/share/runtime/interfaceSupport.inline.hpp.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/hotspot/share/runtime/interfaceSupport.inline.hpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1,5 +1,6 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2021, Azul Systems, Inc. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * This code is free software; you can redistribute it and/or modify it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -32,6 +33,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include "runtime/safepointMechanism.inline.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include "runtime/safepointVerifiers.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include "runtime/thread.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "runtime/threadWXSetters.inline.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include "runtime/vmOperations.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include "utilities/globalDefinitions.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include "utilities/macros.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -403,6 +405,8 @@ class RuntimeHistogramElement : public HistogramElement {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define VM_LEAF_BASE(result_type, header) \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ TRACE_CALL(result_type, header) \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ debug_only(NoHandleMark __hm;) \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ MACOS_AARCH64_ONLY(ThreadWXEnable __wx(WXWrite, \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ Thread::current())); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ os::verify_stack_alignment(); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* begin of body */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -440,6 +444,7 @@ class RuntimeHistogramElement : public HistogramElement {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define IRT_ENTRY(result_type, header) \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ result_type header { \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ MACOS_AARCH64_ONLY(ThreadWXEnable __wx(WXWrite, thread)); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ThreadInVMfromJava __tiv(thread); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ VM_ENTRY_BASE(result_type, header, thread) \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ debug_only(VMEntryWrapper __vew;)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -453,6 +458,7 @@ class RuntimeHistogramElement : public HistogramElement {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define IRT_ENTRY_NO_ASYNC(result_type, header) \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ result_type header { \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ MACOS_AARCH64_ONLY(ThreadWXEnable __wx(WXWrite, thread)); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ThreadInVMfromJavaNoAsyncException __tiv(thread); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ VM_ENTRY_BASE(result_type, header, thread) \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ debug_only(VMEntryWrapper __vew;)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -461,6 +467,7 @@ class RuntimeHistogramElement : public HistogramElement {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define JRT_ENTRY(result_type, header) \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ result_type header { \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ MACOS_AARCH64_ONLY(ThreadWXEnable __wx(WXWrite, thread)); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ThreadInVMfromJava __tiv(thread); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ VM_ENTRY_BASE(result_type, header, thread) \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ debug_only(VMEntryWrapper __vew;)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -474,7 +481,8 @@ class RuntimeHistogramElement : public HistogramElement {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define JRT_ENTRY_NO_ASYNC(result_type, header) \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ result_type header { \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- ThreadInVMfromJavaNoAsyncException __tiv(thread); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ MACOS_AARCH64_ONLY(ThreadWXEnable __wx(WXWrite, thread)); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ThreadInVMfromJava __tiv(thread); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ VM_ENTRY_BASE(result_type, header, thread) \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ debug_only(VMEntryWrapper __vew;)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -482,6 +490,7 @@ class RuntimeHistogramElement : public HistogramElement {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // to get back into Java from the VM
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define JRT_BLOCK_ENTRY(result_type, header) \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ result_type header { \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ MACOS_AARCH64_ONLY(ThreadWXEnable __wx(WXWrite, thread)); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ TRACE_CALL(result_type, header) \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ HandleMarkCleaner __hm(thread);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -512,6 +521,7 @@ extern "C" { \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ result_type JNICALL header { \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ JavaThread* thread=JavaThread::thread_from_jni_environment(env); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ assert( !VerifyJNIEnvThread || (thread == Thread::current()), "JNIEnv is only valid in same thread"); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ MACOS_AARCH64_ONLY(ThreadWXEnable __wx(WXWrite, thread)); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ThreadInVMfromNative __tiv(thread); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ debug_only(VMNativeEntryWrapper __vew;) \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ VM_ENTRY_BASE(result_type, header, thread)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -524,6 +534,7 @@ extern "C" { \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ result_type JNICALL header { \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ JavaThread* thread=JavaThread::thread_from_jni_environment(env); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ assert( !VerifyJNIEnvThread || (thread == Thread::current()), "JNIEnv is only valid in same thread"); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ MACOS_AARCH64_ONLY(ThreadWXEnable __wx(WXWrite, thread)); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ThreadInVMfromNative __tiv(thread); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ debug_only(VMNativeEntryWrapper __vew;) \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ VM_QUICK_ENTRY_BASE(result_type, header, thread)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -548,6 +559,7 @@ extern "C" { \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ extern "C" { \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ result_type JNICALL header { \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ JavaThread* thread=JavaThread::thread_from_jni_environment(env); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ MACOS_AARCH64_ONLY(ThreadWXEnable __wx(WXWrite, thread)); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ThreadInVMfromNative __tiv(thread); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ debug_only(VMNativeEntryWrapper __vew;) \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ VM_ENTRY_BASE(result_type, header, thread)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -557,6 +569,7 @@ extern "C" { \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ extern "C" { \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ result_type JNICALL header { \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ JavaThread* thread = JavaThread::current(); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ MACOS_AARCH64_ONLY(ThreadWXEnable __wx(WXWrite, thread)); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ThreadInVMfromNative __tiv(thread); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ debug_only(VMNativeEntryWrapper __vew;) \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ VM_ENTRY_BASE(result_type, header, thread)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -566,6 +579,7 @@ extern "C" { \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ extern "C" { \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ result_type JNICALL header { \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ JavaThread* thread=JavaThread::thread_from_jni_environment(env); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ MACOS_AARCH64_ONLY(ThreadWXEnable __wx(WXWrite, thread)); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ThreadInVMfromNative __tiv(thread); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ debug_only(VMNativeEntryWrapper __vew;) \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ VM_QUICK_ENTRY_BASE(result_type, header, thread)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/hotspot/share/runtime/javaCalls.cpp.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/hotspot/share/runtime/javaCalls.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1,5 +1,6 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Copyright (c) 1997, 2019, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2021, Azul Systems, Inc. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * This code is free software; you can redistribute it and/or modify it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -79,7 +80,6 @@ JavaCallWrapper::JavaCallWrapper(const methodHandle& callee_method, Handle recei
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // Make sure to set the oop's after the thread transition - since we can block there. No one is GC'ing
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // the JavaCallWrapper before the entry frame is on the stack.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ _callee_method = callee_method();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -113,12 +113,16 @@ JavaCallWrapper::JavaCallWrapper(const methodHandle& callee_method, Handle recei
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (_anchor.last_Java_sp() == NULL) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ _thread->record_base_of_stack_pointer();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ MACOS_AARCH64_ONLY(_thread->enable_wx(WXExec));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ JavaCallWrapper::~JavaCallWrapper() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ assert(_thread == JavaThread::current(), "must still be the same thread");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ MACOS_AARCH64_ONLY(_thread->enable_wx(WXWrite));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // restore previous handle block & Java frame linkage
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ JNIHandleBlock *_old_handles = _thread->active_handles();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ _thread->set_active_handles(_handles);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/hotspot/share/runtime/os.hpp.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/hotspot/share/runtime/os.hpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -81,6 +81,11 @@ enum ThreadPriority { // JLS 20.20.1-3
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ CriticalPriority = 11 // Critical thread priority
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++enum WXMode {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ WXWrite,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ WXExec
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // Executable parameter flag for os::commit_memory() and
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // os::commit_memory_or_exit().
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ const bool ExecMem = true;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -964,6 +969,11 @@ class os: AllStatic {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ bool _done;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(__APPLE__) && defined(AARCH64)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // Enables write or execute access to writeable and executable pages.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ static void current_thread_enable_wx(WXMode mode);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif // __APPLE__ && AARCH64
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #ifndef _WINDOWS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // Suspend/resume support
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // Protocol:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/hotspot/share/runtime/safefetch.inline.hpp.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/hotspot/share/runtime/safefetch.inline.hpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -26,16 +26,27 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define SHARE_RUNTIME_SAFEFETCH_INLINE_HPP
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include "runtime/stubRoutines.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "runtime/threadWXSetters.inline.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // Safefetch allows to load a value from a location that's not known
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // to be valid. If the load causes a fault, the error value is returned.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ inline int SafeFetch32(int* adr, int errValue) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ assert(StubRoutines::SafeFetch32_stub(), "stub not yet generated");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(__APPLE__) && defined(AARCH64)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ Thread* thread = Thread::current_or_null_safe();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ assert(thread != NULL, "required for W^X management");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ThreadWXEnable wx(WXExec, thread);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif // __APPLE__ && AARCH64
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return StubRoutines::SafeFetch32_stub()(adr, errValue);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ inline intptr_t SafeFetchN(intptr_t* adr, intptr_t errValue) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ assert(StubRoutines::SafeFetchN_stub(), "stub not yet generated");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(__APPLE__) && defined(AARCH64)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ Thread* thread = Thread::current_or_null_safe();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ assert(thread != NULL, "required for W^X management");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ThreadWXEnable wx(WXExec, thread);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif // __APPLE__ && AARCH64
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return StubRoutines::SafeFetchN_stub()(adr, errValue);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/hotspot/share/runtime/safepoint.cpp.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/hotspot/share/runtime/safepoint.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -61,6 +61,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include "runtime/synchronizer.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include "runtime/thread.inline.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include "runtime/threadSMR.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "runtime/threadWXSetters.inline.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include "runtime/timerTrace.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include "services/runtimeService.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include "utilities/events.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -954,6 +955,9 @@ void SafepointSynchronize::handle_polling_page_exception(JavaThread *thread) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ assert(SafepointSynchronize::is_synchronizing(), "polling encountered outside safepoint synchronization");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // Enable WXWrite: the function is called implicitly from java code.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ MACOS_AARCH64_ONLY(ThreadWXEnable wx(WXWrite, thread));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (PrintSafepointStatistics) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ inc_page_trap_count();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/hotspot/share/runtime/signature.hpp.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/hotspot/share/runtime/signature.hpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1,5 +1,6 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 1997, 2021, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2021, Azul Systems, Inc. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * This code is free software; you can redistribute it and/or modify it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -282,16 +283,16 @@ class NativeSignatureIterator: public SignatureIterator {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int _prepended; // number of prepended JNI parameters (1 JNIEnv, plus 1 mirror if static)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int _jni_offset; // the current parameter offset, starting with 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- void do_bool () { pass_int(); _jni_offset++; _offset++; }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- void do_char () { pass_int(); _jni_offset++; _offset++; }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ void do_bool () { pass_byte(); _jni_offset++; _offset++; }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ void do_char () { pass_short(); _jni_offset++; _offset++; }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void do_float () { pass_float(); _jni_offset++; _offset++; }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #ifdef _LP64
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void do_double() { pass_double(); _jni_offset++; _offset += 2; }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void do_double() { pass_double(); _jni_offset += 2; _offset += 2; }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- void do_byte () { pass_int(); _jni_offset++; _offset++; }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- void do_short () { pass_int(); _jni_offset++; _offset++; }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ void do_byte () { pass_byte(); _jni_offset++; _offset++; }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ void do_short () { pass_short(); _jni_offset++; _offset++; }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void do_int () { pass_int(); _jni_offset++; _offset++; }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #ifdef _LP64
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void do_long () { pass_long(); _jni_offset++; _offset += 2; }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -312,6 +313,8 @@ class NativeSignatureIterator: public SignatureIterator {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ virtual void pass_long() = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ virtual void pass_object() = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ virtual void pass_float() = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ virtual void pass_byte() { pass_int(); };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ virtual void pass_short() { pass_int(); };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #ifdef _LP64
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ virtual void pass_double() = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/hotspot/share/runtime/stubRoutines.cpp.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/hotspot/share/runtime/stubRoutines.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -289,6 +289,8 @@ void StubRoutines::initialize2() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #ifdef ASSERT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ MACOS_AARCH64_ONLY(os::current_thread_enable_wx(WXExec));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define TEST_ARRAYCOPY(type) \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ test_arraycopy_func( type##_arraycopy(), sizeof(type)); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ test_arraycopy_func( type##_disjoint_arraycopy(), sizeof(type)); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -369,6 +371,8 @@ void StubRoutines::initialize2() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ test_safefetchN();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ MACOS_AARCH64_ONLY(os::current_thread_enable_wx(WXWrite));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/hotspot/share/runtime/thread.cpp.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/hotspot/share/runtime/thread.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1,5 +1,6 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Copyright (c) 1997, 2019, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2021, Azul Systems, Inc. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * This code is free software; you can redistribute it and/or modify it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -97,6 +98,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include "runtime/threadCritical.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include "runtime/threadSMR.inline.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include "runtime/threadStatisticalInfo.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "runtime/threadWXSetters.inline.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include "runtime/timer.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include "runtime/timerTrace.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include "runtime/vframe.inline.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -317,6 +319,8 @@ Thread::Thread() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (barrier_set != NULL) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ barrier_set->on_thread_create(this);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ MACOS_AARCH64_ONLY(DEBUG_ONLY(_wx_init = false));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void Thread::initialize_thread_current() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -370,6 +374,8 @@ void Thread::call_run() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ register_thread_stack_with_NMT();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ MACOS_AARCH64_ONLY(this->init_wx());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ JFR_ONLY(Jfr::on_thread_start(this);)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ log_debug(os, thread)("Thread " UINTX_FORMAT " stack dimensions: "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2538,6 +2544,9 @@ void JavaThread::check_safepoint_and_suspend_for_native_trans(JavaThread *thread
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // Note only the native==>VM/Java barriers can call this function and when
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // thread state is _thread_in_native_trans.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void JavaThread::check_special_condition_for_native_trans(JavaThread *thread) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // Enable WXWrite: called directly from interpreter native wrapper.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ MACOS_AARCH64_ONLY(ThreadWXEnable wx(WXWrite, thread));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ check_safepoint_and_suspend_for_native_trans(thread);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (thread->has_async_exception()) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -3682,6 +3691,8 @@ jint Threads::create_vm(JavaVMInitArgs* args, bool* canTryAgain) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // Initialize the os module
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ os::init();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ MACOS_AARCH64_ONLY(os::current_thread_enable_wx(WXWrite));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // Record VM creation timing statistics
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ TraceVmCreationTime create_vm_timer;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ create_vm_timer.start();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -3785,6 +3796,7 @@ jint Threads::create_vm(JavaVMInitArgs* args, bool* canTryAgain) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ main_thread->record_stack_base_and_size();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ main_thread->register_thread_stack_with_NMT();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ main_thread->set_active_handles(JNIHandleBlock::allocate_block());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ MACOS_AARCH64_ONLY(main_thread->init_wx());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (!main_thread->set_as_starting_thread()) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ vm_shutdown_during_initialization(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/hotspot/share/runtime/thread.hpp.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/hotspot/share/runtime/thread.hpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1,5 +1,6 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2021, Azul Systems, Inc. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * This code is free software; you can redistribute it and/or modify it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -752,6 +753,15 @@ class Thread: public ThreadShadow {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static void muxAcquire(volatile intptr_t * Lock, const char * Name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static void muxAcquireW(volatile intptr_t * Lock, ParkEvent * ev);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static void muxRelease(volatile intptr_t * Lock);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(__APPLE__) && defined(AARCH64)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ private:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ DEBUG_ONLY(bool _wx_init);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ WXMode _wx_state;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ public:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ void init_wx();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ WXMode enable_wx(WXMode new_state);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif // __APPLE__ && AARCH64
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // Inline implementation of Thread::current()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/hotspot/share/runtime/thread.inline.hpp.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/hotspot/share/runtime/thread.inline.hpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1,5 +1,6 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2021, Azul Systems, Inc. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * This code is free software; you can redistribute it and/or modify it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -93,6 +94,27 @@ inline void Thread::set_threads_hazard_ptr(ThreadsList* new_list) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ OrderAccess::release_store_fence(&_threads_hazard_ptr, new_list);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(__APPLE__) && defined(AARCH64)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++inline void Thread::init_wx() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ assert(this == Thread::current(), "should only be called for current thread");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ assert(!_wx_init, "second init");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ _wx_state = WXWrite;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ os::current_thread_enable_wx(_wx_state);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ DEBUG_ONLY(_wx_init = true);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++inline WXMode Thread::enable_wx(WXMode new_state) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ assert(this == Thread::current(), "should only be called for current thread");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ assert(_wx_init, "should be inited");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ WXMode old = _wx_state;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (_wx_state != new_state) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ _wx_state = new_state;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ os::current_thread_enable_wx(new_state);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return old;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif // __APPLE__ && AARCH64
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ inline void JavaThread::set_ext_suspended() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set_suspend_flag (_ext_suspended);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/hotspot/share/runtime/threadWXSetters.inline.hpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -0,0 +1,49 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 1997, 2021, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2021, Azul Systems, Inc. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * This code is free software; you can redistribute it and/or modify it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * under the terms of the GNU General Public License version 2 only, as
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * published by the Free Software Foundation.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * This code is distributed in the hope that it will be useful, but WITHOUT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * version 2 for more details (a copy is included in the LICENSE file that
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * accompanied this code).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * You should have received a copy of the GNU General Public License version
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * 2 along with this work; if not, write to the Free Software Foundation,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * or visit www.oracle.com if you need additional information or have any
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * questions.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifndef SHARE_RUNTIME_THREADWXSETTERS_INLINE_HPP
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define SHARE_RUNTIME_THREADWXSETTERS_INLINE_HPP
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "runtime/thread.inline.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(__APPLE__) && defined(AARCH64)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++class ThreadWXEnable {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ Thread* _thread;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ WXMode _old_mode;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++public:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ThreadWXEnable(WXMode new_mode, Thread* thread) :
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ _thread(thread),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ _old_mode(_thread ? _thread->enable_wx(new_mode) : WXWrite)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ { }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ~ThreadWXEnable() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (_thread) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ _thread->enable_wx(_old_mode);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif // __APPLE__ && AARCH64
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif // SHARE_RUNTIME_THREADWXSETTERS_INLINE_HPP
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/hotspot/share/utilities/macros.hpp.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/hotspot/share/utilities/macros.hpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -595,6 +595,8 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define NOT_AARCH64(code) code
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define MACOS_AARCH64_ONLY(x) MACOS_ONLY(AARCH64_ONLY(x))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #ifdef VM_LITTLE_ENDIAN
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define LITTLE_ENDIAN_ONLY(code) code
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define BIG_ENDIAN_ONLY(code)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/hotspot/share/utilities/nativeCallStack.cpp.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/hotspot/share/utilities/nativeCallStack.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -38,7 +38,7 @@ NativeCallStack::NativeCallStack(int toSkip, bool fillStack) :
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // to call os::get_native_stack. A tail call is used if _NMT_NOINLINE_ is not defined
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // (which means this is not a slowdebug build), and we are on 64-bit (except Windows).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // This is not necessarily a rule, but what has been obvserved to date.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#if (defined(_NMT_NOINLINE_) || defined(_WINDOWS) || !defined(_LP64))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if (defined(_NMT_NOINLINE_) || defined(_WINDOWS) || !defined(_LP64) || (defined(BSD) && defined (__aarch64__)))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // Not a tail call.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ toSkip++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #if (defined(_NMT_NOINLINE_) && defined(BSD) && defined(_LP64))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/java.base/macosx/native/libjli/java_md_macosx.c.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/java.base/macosx/native/libjli/java_md_macosx.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1,5 +1,5 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- * Copyright (c) 2012, 2020, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2012, 2021, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * This code is free software; you can redistribute it and/or modify it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -210,6 +210,8 @@ static InvocationFunctions *GetExportedJNIFunctions() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ preferredJVM = "client";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #elif defined(__x86_64__)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ preferredJVM = "server";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#elif defined(__aarch64__)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ preferredJVM = "server";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #error "Unknown architecture - needs definition"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/java.security.jgss/share/native/libj2gss/gssapi.h.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/java.security.jgss/share/native/libj2gss/gssapi.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1,5 +1,5 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- * Copyright (c) 2005, 2019, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2005, 2021, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * This code is free software; you can redistribute it and/or modify it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -43,7 +43,9 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ extern "C" {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif /* __cplusplus */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#if TARGET_OS_MAC
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// Condition was copied from
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/gssapi/gssapi.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if TARGET_OS_MAC && (defined(__ppc__) || defined(__ppc64__) || defined(__i386__) || defined(__x86_64__))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # pragma pack(push,2)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -695,7 +697,7 @@ GSS_DLLIMP OM_uint32 gss_canonicalize_name(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ gss_name_t * /* output_name */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#if TARGET_OS_MAC
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if TARGET_OS_MAC && (defined(__ppc__) || defined(__ppc64__) || defined(__i386__) || defined(__x86_64__))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # pragma pack(pop)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/jdk.hotspot.agent/macosx/native/libsaproc/MacosxDebuggerLocal.m.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/jdk.hotspot.agent/macosx/native/libsaproc/MacosxDebuggerLocal.m
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1,5 +1,6 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Copyright (c) 2002, 2020, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2021, Azul Systems, Inc. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * This code is free software; you can redistribute it and/or modify it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -42,14 +43,10 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #import <sys/ptrace.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include "libproc_impl.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#define UNSUPPORTED_ARCH "Unsupported architecture!"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#if defined(x86_64) && !defined(amd64)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#define amd64 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#if amd64
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(amd64)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include "sun_jvm_hotspot_debugger_amd64_AMD64ThreadContext.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#elif defined(aarch64)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "sun_jvm_hotspot_debugger_aarch64_AARCH64ThreadContext.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #error UNSUPPORTED_ARCH
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -162,20 +159,20 @@ static void throw_new_debugger_exception(JNIEnv* env, const char* errMsg) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (struct ps_prochandle*)(intptr_t)ptr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#if defined(__i386__)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- #define hsdb_thread_state_t x86_thread_state32_t
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- #define hsdb_float_state_t x86_float_state32_t
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- #define HSDB_THREAD_STATE x86_THREAD_STATE32
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- #define HSDB_FLOAT_STATE x86_FLOAT_STATE32
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- #define HSDB_THREAD_STATE_COUNT x86_THREAD_STATE32_COUNT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- #define HSDB_FLOAT_STATE_COUNT x86_FLOAT_STATE32_COUNT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#elif defined(__x86_64__)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(amd64)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define hsdb_thread_state_t x86_thread_state64_t
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define hsdb_float_state_t x86_float_state64_t
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define HSDB_THREAD_STATE x86_THREAD_STATE64
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define HSDB_FLOAT_STATE x86_FLOAT_STATE64
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define HSDB_THREAD_STATE_COUNT x86_THREAD_STATE64_COUNT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define HSDB_FLOAT_STATE_COUNT x86_FLOAT_STATE64_COUNT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#elif defined(aarch64)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ #define hsdb_thread_state_t arm_thread_state64_t
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ #define hsdb_float_state_t arm_neon_state64_t
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ #define HSDB_THREAD_STATE ARM_THREAD_STATE64
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ #define HSDB_FLOAT_STATE ARM_NEON_STATE64
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ #define HSDB_THREAD_STATE_COUNT ARM_THREAD_STATE64_COUNT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ #define HSDB_FLOAT_STATE_COUNT ARM_NEON_STATE64_COUNT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #error UNSUPPORTED_ARCH
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -493,11 +490,21 @@ bool fill_java_threads(JNIEnv* env, jobject this_obj, struct ps_prochandle* ph)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ lwpid_t uid = cinfos[j];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint64_t beg = cinfos[j + 1];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint64_t end = cinfos[j + 2];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(amd64)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if ((regs.r_rsp < end && regs.r_rsp >= beg) ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ (regs.r_rbp < end && regs.r_rbp >= beg)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set_lwp_id(ph, i, uid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#elif defined(aarch64)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if ((regs.r_sp < end && regs.r_sp >= beg) ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ (regs.r_fp < end && regs.r_fp >= beg)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ set_lwp_id(ph, i, uid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#error UNSUPPORTED_ARCH
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ (*env)->ReleaseLongArrayElements(env, thrinfos, (jlong*)cinfos, 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -529,14 +536,22 @@ jlongArray getThreadIntegerRegisterSetFromCore(JNIEnv *env, jobject this_obj, lo
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #undef NPRGREG
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #undef REG_INDEX
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#if amd64
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(amd64)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define NPRGREG sun_jvm_hotspot_debugger_amd64_AMD64ThreadContext_NPRGREG
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define REG_INDEX(reg) sun_jvm_hotspot_debugger_amd64_AMD64ThreadContext_##reg
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#elif defined(aarch64)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define NPRGREG sun_jvm_hotspot_debugger_aarch64_AARCH64ThreadContext_NPRGREG
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define REG_INDEX(reg) sun_jvm_hotspot_debugger_aarch64_AARCH64ThreadContext_##reg
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#error UNSUPPORTED_ARCH
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ array = (*env)->NewLongArray(env, NPRGREG);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ CHECK_EXCEPTION_(0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ regs = (*env)->GetLongArrayElements(env, array, &isCopy);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(amd64)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ regs[REG_INDEX(R15)] = gregs.r_r15;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ regs[REG_INDEX(R14)] = gregs.r_r14;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ regs[REG_INDEX(R13)] = gregs.r_r13;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -565,7 +580,46 @@ jlongArray getThreadIntegerRegisterSetFromCore(JNIEnv *env, jobject this_obj, lo
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ regs[REG_INDEX(TRAPNO)] = gregs.r_trapno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ regs[REG_INDEX(RFL)] = gregs.r_rflags;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#endif /* amd64 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#elif defined(aarch64)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ regs[REG_INDEX(R0)] = gregs.r_r0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ regs[REG_INDEX(R1)] = gregs.r_r1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ regs[REG_INDEX(R2)] = gregs.r_r2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ regs[REG_INDEX(R3)] = gregs.r_r3;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ regs[REG_INDEX(R4)] = gregs.r_r4;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ regs[REG_INDEX(R5)] = gregs.r_r5;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ regs[REG_INDEX(R6)] = gregs.r_r6;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ regs[REG_INDEX(R7)] = gregs.r_r7;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ regs[REG_INDEX(R8)] = gregs.r_r8;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ regs[REG_INDEX(R9)] = gregs.r_r9;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ regs[REG_INDEX(R10)] = gregs.r_r10;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ regs[REG_INDEX(R11)] = gregs.r_r11;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ regs[REG_INDEX(R12)] = gregs.r_r12;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ regs[REG_INDEX(R13)] = gregs.r_r13;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ regs[REG_INDEX(R14)] = gregs.r_r14;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ regs[REG_INDEX(R15)] = gregs.r_r15;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ regs[REG_INDEX(R16)] = gregs.r_r16;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ regs[REG_INDEX(R17)] = gregs.r_r17;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ regs[REG_INDEX(R18)] = gregs.r_r18;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ regs[REG_INDEX(R19)] = gregs.r_r19;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ regs[REG_INDEX(R20)] = gregs.r_r20;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ regs[REG_INDEX(R21)] = gregs.r_r21;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ regs[REG_INDEX(R22)] = gregs.r_r22;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ regs[REG_INDEX(R23)] = gregs.r_r23;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ regs[REG_INDEX(R24)] = gregs.r_r24;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ regs[REG_INDEX(R25)] = gregs.r_r25;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ regs[REG_INDEX(R26)] = gregs.r_r26;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ regs[REG_INDEX(R27)] = gregs.r_r27;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ regs[REG_INDEX(R28)] = gregs.r_r28;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ regs[REG_INDEX(FP)] = gregs.r_fp;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ regs[REG_INDEX(LR)] = gregs.r_lr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ regs[REG_INDEX(SP)] = gregs.r_sp;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ regs[REG_INDEX(PC)] = gregs.r_pc;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#error UNSUPPORTED_ARCH
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ (*env)->ReleaseLongArrayElements(env, array, regs, JNI_COMMIT);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return array;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -655,10 +709,14 @@ jlongArray getThreadIntegerRegisterSetFromCore(JNIEnv *env, jobject this_obj, lo
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#if amd64
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#undef NPRGREG
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(amd64)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define NPRGREG sun_jvm_hotspot_debugger_amd64_AMD64ThreadContext_NPRGREG
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#undef REG_INDEX
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#define REG_INDEX(reg) sun_jvm_hotspot_debugger_amd64_AMD64ThreadContext_##reg
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#elif defined(aarch64)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define NPRGREG sun_jvm_hotspot_debugger_aarch64_AARCH64ThreadContext_NPRGREG
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#error UNSUPPORTED_ARCH
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // 64 bit
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ print_debug("Getting threads for a 64-bit process\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -666,6 +724,8 @@ jlongArray getThreadIntegerRegisterSetFromCore(JNIEnv *env, jobject this_obj, lo
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ CHECK_EXCEPTION_(0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ primitiveArray = (*env)->GetLongArrayElements(env, registerArray, NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(amd64)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ primitiveArray[REG_INDEX(R15)] = state.__r15;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ primitiveArray[REG_INDEX(R14)] = state.__r14;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ primitiveArray[REG_INDEX(R13)] = state.__r13;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -694,14 +754,50 @@ jlongArray getThreadIntegerRegisterSetFromCore(JNIEnv *env, jobject this_obj, lo
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ primitiveArray[REG_INDEX(DS)] = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ primitiveArray[REG_INDEX(FSBASE)] = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ primitiveArray[REG_INDEX(GSBASE)] = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- print_debug("set registers\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- (*env)->ReleaseLongArrayElements(env, registerArray, primitiveArray, 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#elif defined(aarch64)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ primitiveArray[REG_INDEX(R0)] = state.__x[0];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ primitiveArray[REG_INDEX(R1)] = state.__x[1];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ primitiveArray[REG_INDEX(R2)] = state.__x[2];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ primitiveArray[REG_INDEX(R3)] = state.__x[3];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ primitiveArray[REG_INDEX(R4)] = state.__x[4];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ primitiveArray[REG_INDEX(R5)] = state.__x[5];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ primitiveArray[REG_INDEX(R6)] = state.__x[6];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ primitiveArray[REG_INDEX(R7)] = state.__x[7];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ primitiveArray[REG_INDEX(R8)] = state.__x[8];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ primitiveArray[REG_INDEX(R9)] = state.__x[9];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ primitiveArray[REG_INDEX(R10)] = state.__x[10];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ primitiveArray[REG_INDEX(R11)] = state.__x[11];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ primitiveArray[REG_INDEX(R12)] = state.__x[12];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ primitiveArray[REG_INDEX(R13)] = state.__x[13];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ primitiveArray[REG_INDEX(R14)] = state.__x[14];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ primitiveArray[REG_INDEX(R15)] = state.__x[15];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ primitiveArray[REG_INDEX(R16)] = state.__x[16];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ primitiveArray[REG_INDEX(R17)] = state.__x[17];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ primitiveArray[REG_INDEX(R18)] = state.__x[18];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ primitiveArray[REG_INDEX(R19)] = state.__x[19];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ primitiveArray[REG_INDEX(R20)] = state.__x[20];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ primitiveArray[REG_INDEX(R21)] = state.__x[21];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ primitiveArray[REG_INDEX(R22)] = state.__x[22];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ primitiveArray[REG_INDEX(R23)] = state.__x[23];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ primitiveArray[REG_INDEX(R24)] = state.__x[24];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ primitiveArray[REG_INDEX(R25)] = state.__x[25];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ primitiveArray[REG_INDEX(R26)] = state.__x[26];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ primitiveArray[REG_INDEX(R27)] = state.__x[27];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ primitiveArray[REG_INDEX(R28)] = state.__x[28];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ primitiveArray[REG_INDEX(FP)] = state.__fp;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ primitiveArray[REG_INDEX(LR)] = state.__lr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ primitiveArray[REG_INDEX(SP)] = state.__sp;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ primitiveArray[REG_INDEX(PC)] = state.__pc;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #error UNSUPPORTED_ARCH
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#endif /* amd64 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ print_debug("set registers\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ (*env)->ReleaseLongArrayElements(env, registerArray, primitiveArray, 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return registerArray;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/jdk.hotspot.agent/macosx/native/libsaproc/libproc_impl.h.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/jdk.hotspot.agent/macosx/native/libsaproc/libproc_impl.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1,5 +1,6 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2003, 2021, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2021, Azul Systems, Inc. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * This code is free software; you can redistribute it and/or modify it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -30,6 +31,16 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include "libproc.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include "symtab.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define UNSUPPORTED_ARCH "Unsupported architecture!"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(__x86_64__) && !defined(amd64)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define amd64 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(__arm64__) && !defined(aarch64)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define aarch64 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #ifdef __APPLE__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include <inttypes.h> // for PRIx64, 32, ...
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include <pthread.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -41,6 +52,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define register_t uint64_t
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(amd64)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /*** registers copied from bsd/amd64 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ typedef struct reg {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ register_t r_r15;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -71,6 +83,48 @@ typedef struct reg {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ register_t r_ss; // not used
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } reg;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#elif defined(aarch64)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/*** registers copied from bsd/arm64 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++typedef struct reg {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ register_t r_r0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ register_t r_r1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ register_t r_r2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ register_t r_r3;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ register_t r_r4;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ register_t r_r5;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ register_t r_r6;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ register_t r_r7;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ register_t r_r8;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ register_t r_r9;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ register_t r_r10;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ register_t r_r11;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ register_t r_r12;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ register_t r_r13;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ register_t r_r14;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ register_t r_r15;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ register_t r_r16;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ register_t r_r17;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ register_t r_r18;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ register_t r_r19;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ register_t r_r20;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ register_t r_r21;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ register_t r_r22;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ register_t r_r23;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ register_t r_r24;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ register_t r_r25;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ register_t r_r26;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ register_t r_r27;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ register_t r_r28;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ register_t r_fp;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ register_t r_lr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ register_t r_sp;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ register_t r_pc;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++} reg;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#error UNSUPPORTED_ARCH
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // convenient defs
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ typedef struct mach_header_64 mach_header_64;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ typedef struct load_command load_command;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/jdk.hotspot.agent/macosx/native/libsaproc/ps_core.c.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/jdk.hotspot.agent/macosx/native/libsaproc/ps_core.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1,5 +1,6 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2003, 2021, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2021, Azul Systems, Inc. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * This code is free software; you can redistribute it and/or modify it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -32,8 +33,14 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include "cds.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #ifdef __APPLE__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(amd64)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include "sun_jvm_hotspot_debugger_amd64_AMD64ThreadContext.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#elif defined(aarch64)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "sun_jvm_hotspot_debugger_aarch64_AARCH64ThreadContext.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#error UNSUPPORTED_ARCH
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif /* __APPLE__ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // This file has the libproc implementation to read core files.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // For live processes, refer to ps_proc.c. Portions of this is adapted
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -520,6 +527,8 @@ static ps_prochandle_ops core_ops = {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void print_thread(sa_thread_info *threadinfo) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ print_debug("thread added: %d\n", threadinfo->lwp_id);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ print_debug("registers:\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(amd64)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ print_debug(" r_r15: 0x%" PRIx64 "\n", threadinfo->regs.r_r15);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ print_debug(" r_r14: 0x%" PRIx64 "\n", threadinfo->regs.r_r14);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ print_debug(" r_r13: 0x%" PRIx64 "\n", threadinfo->regs.r_r13);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -541,6 +550,45 @@ void print_thread(sa_thread_info *threadinfo) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ print_debug(" r_cs: 0x%" PRIx64 "\n", threadinfo->regs.r_cs);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ print_debug(" r_rsp: 0x%" PRIx64 "\n", threadinfo->regs.r_rsp);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ print_debug(" r_rflags: 0x%" PRIx64 "\n", threadinfo->regs.r_rflags);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#elif defined(aarch64)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ print_debug(" r_r0: 0x%" PRIx64 "\n", threadinfo->regs.r_r0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ print_debug(" r_r1: 0x%" PRIx64 "\n", threadinfo->regs.r_r1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ print_debug(" r_r2: 0x%" PRIx64 "\n", threadinfo->regs.r_r2);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ print_debug(" r_r3: 0x%" PRIx64 "\n", threadinfo->regs.r_r3);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ print_debug(" r_r4: 0x%" PRIx64 "\n", threadinfo->regs.r_r4);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ print_debug(" r_r5: 0x%" PRIx64 "\n", threadinfo->regs.r_r5);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ print_debug(" r_r6: 0x%" PRIx64 "\n", threadinfo->regs.r_r6);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ print_debug(" r_r7: 0x%" PRIx64 "\n", threadinfo->regs.r_r7);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ print_debug(" r_r8: 0x%" PRIx64 "\n", threadinfo->regs.r_r8);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ print_debug(" r_r9: 0x%" PRIx64 "\n", threadinfo->regs.r_r9);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ print_debug(" r_r10: 0x%" PRIx64 "\n", threadinfo->regs.r_r10);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ print_debug(" r_r11: 0x%" PRIx64 "\n", threadinfo->regs.r_r11);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ print_debug(" r_r12: 0x%" PRIx64 "\n", threadinfo->regs.r_r12);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ print_debug(" r_r13: 0x%" PRIx64 "\n", threadinfo->regs.r_r13);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ print_debug(" r_r14: 0x%" PRIx64 "\n", threadinfo->regs.r_r14);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ print_debug(" r_r15: 0x%" PRIx64 "\n", threadinfo->regs.r_r15);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ print_debug(" r_r16: 0x%" PRIx64 "\n", threadinfo->regs.r_r16);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ print_debug(" r_r17: 0x%" PRIx64 "\n", threadinfo->regs.r_r17);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ print_debug(" r_r18: 0x%" PRIx64 "\n", threadinfo->regs.r_r18);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ print_debug(" r_r19: 0x%" PRIx64 "\n", threadinfo->regs.r_r19);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ print_debug(" r_r20: 0x%" PRIx64 "\n", threadinfo->regs.r_r20);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ print_debug(" r_r21: 0x%" PRIx64 "\n", threadinfo->regs.r_r21);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ print_debug(" r_r22: 0x%" PRIx64 "\n", threadinfo->regs.r_r22);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ print_debug(" r_r23: 0x%" PRIx64 "\n", threadinfo->regs.r_r23);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ print_debug(" r_r24: 0x%" PRIx64 "\n", threadinfo->regs.r_r24);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ print_debug(" r_r25: 0x%" PRIx64 "\n", threadinfo->regs.r_r25);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ print_debug(" r_r26: 0x%" PRIx64 "\n", threadinfo->regs.r_r26);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ print_debug(" r_r27: 0x%" PRIx64 "\n", threadinfo->regs.r_r27);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ print_debug(" r_r28: 0x%" PRIx64 "\n", threadinfo->regs.r_r28);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ print_debug(" r_fp: 0x%" PRIx64 "\n", threadinfo->regs.r_fp);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ print_debug(" r_lr: 0x%" PRIx64 "\n", threadinfo->regs.r_lr);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ print_debug(" r_sp: 0x%" PRIx64 "\n", threadinfo->regs.r_sp);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ print_debug(" r_pc: 0x%" PRIx64 "\n", threadinfo->regs.r_pc);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#error UNSUPPORTED_ARCH
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // read all segments64 commands from core file
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -592,6 +640,7 @@ static bool read_core_segments(struct ps_prochandle* ph) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ goto err;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ size += sizeof(thread_fc);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(amd64)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (fc.flavor == x86_THREAD_STATE) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ x86_thread_state_t thrstate;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (read(fd, (void *)&thrstate, sizeof(x86_thread_state_t)) != sizeof(x86_thread_state_t)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -651,6 +700,90 @@ static bool read_core_segments(struct ps_prochandle* ph) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ size += sizeof(x86_exception_state_t);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#elif defined(aarch64)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (fc.flavor == ARM_THREAD_STATE64) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ arm_thread_state64_t thrstate;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (read(fd, (void *)&thrstate, sizeof(arm_thread_state64_t)) != sizeof(arm_thread_state64_t)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ printf("Reading flavor, count failed.\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ goto err;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ size += sizeof(arm_thread_state64_t);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // create thread info list, update lwp_id later
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ sa_thread_info* newthr = add_thread_info(ph, (pthread_t) -1, (lwpid_t) num_threads++);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (newthr == NULL) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ printf("create thread_info failed\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ goto err;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // note __DARWIN_UNIX03 depengs on other definitions
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if __DARWIN_UNIX03
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define get_register_v(regst, regname) \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ regst.__##regname
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define get_register_v(regst, regname) \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ regst.##regname
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif // __DARWIN_UNIX03
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ newthr->regs.r_r0 = get_register_v(thrstate, x[0]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ newthr->regs.r_r1 = get_register_v(thrstate, x[1]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ newthr->regs.r_r2 = get_register_v(thrstate, x[2]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ newthr->regs.r_r3 = get_register_v(thrstate, x[3]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ newthr->regs.r_r4 = get_register_v(thrstate, x[4]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ newthr->regs.r_r5 = get_register_v(thrstate, x[5]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ newthr->regs.r_r6 = get_register_v(thrstate, x[6]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ newthr->regs.r_r7 = get_register_v(thrstate, x[7]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ newthr->regs.r_r8 = get_register_v(thrstate, x[8]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ newthr->regs.r_r9 = get_register_v(thrstate, x[9]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ newthr->regs.r_r10 = get_register_v(thrstate, x[10]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ newthr->regs.r_r11 = get_register_v(thrstate, x[11]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ newthr->regs.r_r12 = get_register_v(thrstate, x[12]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ newthr->regs.r_r13 = get_register_v(thrstate, x[13]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ newthr->regs.r_r14 = get_register_v(thrstate, x[14]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ newthr->regs.r_r15 = get_register_v(thrstate, x[15]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ newthr->regs.r_r16 = get_register_v(thrstate, x[16]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ newthr->regs.r_r17 = get_register_v(thrstate, x[17]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ newthr->regs.r_r18 = get_register_v(thrstate, x[18]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ newthr->regs.r_r19 = get_register_v(thrstate, x[19]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ newthr->regs.r_r20 = get_register_v(thrstate, x[20]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ newthr->regs.r_r21 = get_register_v(thrstate, x[21]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ newthr->regs.r_r22 = get_register_v(thrstate, x[22]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ newthr->regs.r_r23 = get_register_v(thrstate, x[23]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ newthr->regs.r_r24 = get_register_v(thrstate, x[24]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ newthr->regs.r_r25 = get_register_v(thrstate, x[25]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ newthr->regs.r_r26 = get_register_v(thrstate, x[26]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ newthr->regs.r_r27 = get_register_v(thrstate, x[27]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ newthr->regs.r_r28 = get_register_v(thrstate, x[28]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ newthr->regs.r_fp = get_register_v(thrstate, fp);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ newthr->regs.r_lr = get_register_v(thrstate, lr);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ newthr->regs.r_sp = get_register_v(thrstate, sp);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ newthr->regs.r_pc = get_register_v(thrstate, pc);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ print_thread(newthr);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ } else if (fc.flavor == ARM_NEON_STATE64) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ arm_neon_state64_t flstate;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (read(fd, (void *)&flstate, sizeof(arm_neon_state64_t)) != sizeof(arm_neon_state64_t)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ printf("Reading flavor, count failed.\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ goto err;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ size += sizeof(arm_neon_state64_t);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ } else if (fc.flavor == ARM_EXCEPTION_STATE64) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ arm_exception_state64_t excpstate;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (read(fd, (void *)&excpstate, sizeof(arm_exception_state64_t)) != sizeof(arm_exception_state64_t)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ printf("Reading flavor, count failed.\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ goto err;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ size += sizeof(arm_exception_state64_t);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ } else if (fc.flavor == ARM_DEBUG_STATE64) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ arm_debug_state64_t dbgstate;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (read(fd, (void *)&dbgstate, sizeof(arm_debug_state64_t)) != sizeof(arm_debug_state64_t)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ printf("Reading flavor, count failed.\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ goto err;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ size += sizeof(arm_debug_state64_t);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#error UNSUPPORTED_ARCH
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/HotSpotAgent.java
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/HotSpotAgent.java
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1,5 +1,6 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2021, Azul Systems, Inc. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * This code is free software; you can redistribute it and/or modify it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -652,8 +653,10 @@ private void setupDebuggerDarwin() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (cpu.equals("amd64") || cpu.equals("x86_64")) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ machDesc = new MachineDescriptionAMD64();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ } else if (cpu.equals("aarch64")) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ machDesc = new MachineDescriptionAArch64();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- throw new DebuggerException("Darwin only supported on x86_64. Current arch: " + cpu);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ throw new DebuggerException("Darwin only supported on x86_64/aarch64. Current arch: " + cpu);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ BsdDebuggerLocal dbg = new BsdDebuggerLocal(machDesc, !isServer);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/bsd/BsdCDebugger.java.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/bsd/BsdCDebugger.java
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1,5 +1,6 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2003, 2021, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2021, Azul Systems, Inc. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * This code is free software; you can redistribute it and/or modify it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -30,8 +31,10 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import sun.jvm.hotspot.debugger.cdbg.*;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import sun.jvm.hotspot.debugger.x86.*;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import sun.jvm.hotspot.debugger.amd64.*;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++import sun.jvm.hotspot.debugger.aarch64.*;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import sun.jvm.hotspot.debugger.bsd.x86.*;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import sun.jvm.hotspot.debugger.bsd.amd64.*;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++import sun.jvm.hotspot.debugger.bsd.aarch64.*;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import sun.jvm.hotspot.utilities.*;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ class BsdCDebugger implements CDebugger {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -97,6 +100,13 @@ public CFrame topFrameForThread(ThreadProxy thread) throws DebuggerException {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Address pc = context.getRegisterAsAddress(AMD64ThreadContext.RIP);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (pc == null) return null;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return new BsdAMD64CFrame(dbg, rbp, pc);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ } else if (cpu.equals("aarch64")) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ AARCH64ThreadContext context = (AARCH64ThreadContext) thread.getContext();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ Address fp = context.getRegisterAsAddress(AARCH64ThreadContext.FP);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (fp == null) return null;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ Address pc = context.getRegisterAsAddress(AARCH64ThreadContext.PC);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (pc == null) return null;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return new BsdAARCH64CFrame(dbg, fp, pc);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ throw new DebuggerException(cpu + " is not yet supported");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/bsd/BsdThreadContextFactory.java.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/bsd/BsdThreadContextFactory.java
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1,5 +1,5 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2002, 2021, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * This code is free software; you can redistribute it and/or modify it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -25,6 +25,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ package sun.jvm.hotspot.debugger.bsd;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import sun.jvm.hotspot.debugger.*;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++import sun.jvm.hotspot.debugger.bsd.aarch64.*;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import sun.jvm.hotspot.debugger.bsd.amd64.*;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import sun.jvm.hotspot.debugger.bsd.x86.*;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -35,6 +36,8 @@ static ThreadContext createThreadContext(BsdDebugger dbg) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return new BsdX86ThreadContext(dbg);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else if (cpu.equals("amd64") || cpu.equals("x86_64")) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return new BsdAMD64ThreadContext(dbg);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ } else if (cpu.equals("aarch64")) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return new BsdAARCH64ThreadContext(dbg);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ throw new RuntimeException("cpu " + cpu + " is not yet supported");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/bsd/aarch64/BsdAARCH64CFrame.java
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -0,0 +1,87 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2003, 2021, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2015, Red Hat Inc.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2021, Azul Systems, Inc. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * This code is free software; you can redistribute it and/or modify it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * under the terms of the GNU General Public License version 2 only, as
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * published by the Free Software Foundation.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * This code is distributed in the hope that it will be useful, but WITHOUT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * version 2 for more details (a copy is included in the LICENSE file that
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * accompanied this code).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * You should have received a copy of the GNU General Public License version
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * 2 along with this work; if not, write to the Free Software Foundation,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * or visit www.oracle.com if you need additional information or have any
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * questions.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++package sun.jvm.hotspot.debugger.bsd.aarch64;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++import sun.jvm.hotspot.debugger.*;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++import sun.jvm.hotspot.debugger.aarch64.*;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++import sun.jvm.hotspot.debugger.bsd.*;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++import sun.jvm.hotspot.debugger.cdbg.*;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++import sun.jvm.hotspot.debugger.cdbg.basic.*;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++final public class BsdAARCH64CFrame extends BasicCFrame {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ public BsdAARCH64CFrame(BsdDebugger dbg, Address fp, Address pc) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ super(dbg.getCDebugger());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ this.fp = fp;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ this.pc = pc;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ this.dbg = dbg;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // override base class impl to avoid ELF parsing
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ public ClosestSymbol closestSymbolToPC() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // try native lookup in debugger.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return dbg.lookup(dbg.getAddressValue(pc()));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ public Address pc() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return pc;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ public Address localVariableBase() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return fp;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ public CFrame sender(ThreadProxy thread) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ AARCH64ThreadContext context = (AARCH64ThreadContext) thread.getContext();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ Address rsp = context.getRegisterAsAddress(AARCH64ThreadContext.SP);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if ((fp == null) || fp.lessThan(rsp)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return null;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // Check alignment of fp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (dbg.getAddressValue(fp) % (2 * ADDRESS_SIZE) != 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return null;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ Address nextFP = fp.getAddressAt(0 * ADDRESS_SIZE);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (nextFP == null || nextFP.lessThanOrEqual(fp)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return null;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ Address nextPC = fp.getAddressAt(1 * ADDRESS_SIZE);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (nextPC == null) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return null;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return new BsdAARCH64CFrame(dbg, nextFP, nextPC);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // package/class internals only
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ private static final int ADDRESS_SIZE = 8;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ private Address pc;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ private Address sp;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ private Address fp;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ private BsdDebugger dbg;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/bsd/aarch64/BsdAARCH64ThreadContext.java
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -0,0 +1,47 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2003, 2021, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2021, Azul Systems, Inc. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * This code is free software; you can redistribute it and/or modify it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * under the terms of the GNU General Public License version 2 only, as
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * published by the Free Software Foundation.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * This code is distributed in the hope that it will be useful, but WITHOUT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * version 2 for more details (a copy is included in the LICENSE file that
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * accompanied this code).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * You should have received a copy of the GNU General Public License version
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * 2 along with this work; if not, write to the Free Software Foundation,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * or visit www.oracle.com if you need additional information or have any
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * questions.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++package sun.jvm.hotspot.debugger.bsd.aarch64;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++import sun.jvm.hotspot.debugger.*;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++import sun.jvm.hotspot.debugger.aarch64.*;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++import sun.jvm.hotspot.debugger.bsd.*;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++public class BsdAARCH64ThreadContext extends AARCH64ThreadContext {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ private BsdDebugger debugger;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ public BsdAARCH64ThreadContext(BsdDebugger debugger) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ super();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ this.debugger = debugger;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ public void setRegisterAsAddress(int index, Address value) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ setRegister(index, debugger.getAddressValue(value));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ public Address getRegisterAsAddress(int index) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return debugger.newAddress(getRegister(index));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/Threads.java.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/Threads.java
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1,5 +1,5 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- * Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2000, 2021, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * This code is free software; you can redistribute it and/or modify it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -42,6 +42,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import sun.jvm.hotspot.runtime.linux_sparc.LinuxSPARCJavaThreadPDAccess;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import sun.jvm.hotspot.runtime.bsd_x86.BsdX86JavaThreadPDAccess;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import sun.jvm.hotspot.runtime.bsd_amd64.BsdAMD64JavaThreadPDAccess;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++import sun.jvm.hotspot.runtime.bsd_aarch64.BsdAARCH64JavaThreadPDAccess;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import sun.jvm.hotspot.utilities.*;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ public class Threads {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -118,6 +119,8 @@ private static synchronized void initialize(TypeDataBase db) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else if (os.equals("darwin")) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (cpu.equals("amd64") || cpu.equals("x86_64")) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ access = new BsdAMD64JavaThreadPDAccess();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ } else if (cpu.equals("aarch64")) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ access = new BsdAARCH64JavaThreadPDAccess();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/bsd_aarch64/BsdAARCH64JavaThreadPDAccess.java
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -0,0 +1,137 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2003, 2021, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2021, Azul Systems, Inc. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * This code is free software; you can redistribute it and/or modify it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * under the terms of the GNU General Public License version 2 only, as
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * published by the Free Software Foundation.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * This code is distributed in the hope that it will be useful, but WITHOUT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * version 2 for more details (a copy is included in the LICENSE file that
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * accompanied this code).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * You should have received a copy of the GNU General Public License version
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * 2 along with this work; if not, write to the Free Software Foundation,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * or visit www.oracle.com if you need additional information or have any
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * questions.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++package sun.jvm.hotspot.runtime.bsd_aarch64;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++import java.io.*;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++import java.util.*;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++import sun.jvm.hotspot.debugger.*;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++import sun.jvm.hotspot.debugger.aarch64.*;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++import sun.jvm.hotspot.debugger.bsd.BsdDebugger;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++import sun.jvm.hotspot.debugger.bsd.BsdDebuggerLocal;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++import sun.jvm.hotspot.runtime.*;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++import sun.jvm.hotspot.runtime.aarch64.*;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++import sun.jvm.hotspot.types.*;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++import sun.jvm.hotspot.utilities.*;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++public class BsdAARCH64JavaThreadPDAccess implements JavaThreadPDAccess {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ private static AddressField lastJavaFPField;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ private static AddressField osThreadField;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // Field from OSThread
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ private static CIntegerField osThreadThreadIDField;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ private static CIntegerField osThreadUniqueThreadIDField;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // This is currently unneeded but is being kept in case we change
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // the currentFrameGuess algorithm
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ private static final long GUESS_SCAN_RANGE = 128 * 1024;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ static {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ VM.registerVMInitializedObserver(new Observer() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ public void update(Observable o, Object data) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ initialize(VM.getVM().getTypeDataBase());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ });
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ private static synchronized void initialize(TypeDataBase db) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ Type type = db.lookupType("JavaThread");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ osThreadField = type.getAddressField("_osthread");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ Type anchorType = db.lookupType("JavaFrameAnchor");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ lastJavaFPField = anchorType.getAddressField("_last_Java_fp");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ Type osThreadType = db.lookupType("OSThread");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ osThreadThreadIDField = osThreadType.getCIntegerField("_thread_id");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ osThreadUniqueThreadIDField = osThreadType.getCIntegerField("_unique_thread_id");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ public Address getLastJavaFP(Address addr) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return lastJavaFPField.getValue(addr.addOffsetTo(sun.jvm.hotspot.runtime.JavaThread.getAnchorField().getOffset()));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ public Address getLastJavaPC(Address addr) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return null;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ public Address getBaseOfStackPointer(Address addr) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return null;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ public Frame getLastFramePD(JavaThread thread, Address addr) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ Address fp = thread.getLastJavaFP();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (fp == null) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return null; // no information
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return new AARCH64Frame(thread.getLastJavaSP(), fp);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ public RegisterMap newRegisterMap(JavaThread thread, boolean updateMap) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return new AARCH64RegisterMap(thread, updateMap);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ public Frame getCurrentFrameGuess(JavaThread thread, Address addr) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ThreadProxy t = getThreadProxy(addr);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ AARCH64ThreadContext context = (AARCH64ThreadContext) t.getContext();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ AARCH64CurrentFrameGuess guesser = new AARCH64CurrentFrameGuess(context, thread);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (!guesser.run(GUESS_SCAN_RANGE)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return null;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (guesser.getPC() == null) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return new AARCH64Frame(guesser.getSP(), guesser.getFP());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return new AARCH64Frame(guesser.getSP(), guesser.getFP(), guesser.getPC());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ public void printThreadIDOn(Address addr, PrintStream tty) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ tty.print(getThreadProxy(addr));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ public void printInfoOn(Address threadAddr, PrintStream tty) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ tty.print("Thread id: ");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ printThreadIDOn(threadAddr, tty);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// tty.println("\nPostJavaState: " + getPostJavaState(threadAddr));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ public Address getLastSP(Address addr) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ThreadProxy t = getThreadProxy(addr);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ AARCH64ThreadContext context = (AARCH64ThreadContext) t.getContext();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return context.getRegisterAsAddress(AARCH64ThreadContext.SP);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ public ThreadProxy getThreadProxy(Address addr) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // Addr is the address of the JavaThread.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // Fetch the OSThread (for now and for simplicity, not making a
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // separate "OSThread" class in this package)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ Address osThreadAddr = osThreadField.getValue(addr);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // Get the address of the _thread_id from the OSThread
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ Address threadIdAddr = osThreadAddr.addOffsetTo(osThreadThreadIDField.getOffset());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ Address uniqueThreadIdAddr = osThreadAddr.addOffsetTo(osThreadUniqueThreadIDField.getOffset());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ BsdDebuggerLocal debugger = (BsdDebuggerLocal) VM.getVM().getDebugger();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return debugger.getThreadForIdentifierAddress(threadIdAddr, uniqueThreadIdAddr);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/utils/hsdis/Makefile.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/utils/hsdis/Makefile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1,5 +1,6 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-# Copyright (c) 2008, 2017, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# Copyright (c) 2008, 2021, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# Copyright (c) 2021, Azul Systems, Inc. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # This code is free software; you can redistribute it and/or modify it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -112,15 +113,21 @@ else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ifeq ($(OS),Darwin)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ CPU = $(shell uname -m)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ARCH1=$(CPU:x86_64=amd64)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-ARCH=$(ARCH1:i686=i386)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ARCH2=$(ARCH1:arm64=aarch64)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ARCH=$(ARCH2:i686=i386)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++CONFIGURE_ARGS/aarch64= --enable-targets=aarch64-darwin
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++CONFIGURE_ARGS = $(CONFIGURE_ARGS/$(ARCH))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ifdef LP64
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ CFLAGS/sparcv9 += -m64
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ CFLAGS/amd64 += -m64
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-ARCH=$(ARCH1:amd64=i386)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ARCH=$(ARCH2:amd64=i386)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ CFLAGS/i386 += -m32
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ CFLAGS/sparc += -m32
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ endif # LP64
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ifeq ($(CPU), arm64)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++CFLAGS/aarch64 += -m64
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++endif # arm64
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ CFLAGS += $(CFLAGS/$(ARCH))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ CFLAGS += -fPIC
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ OS = macosx
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- test/hotspot/gtest/gtestMain.cpp.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ test/hotspot/gtest/gtestMain.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1,5 +1,5 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2016, 2021, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * This code is free software; you can redistribute it and/or modify it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -38,6 +38,8 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include "jni.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include "unittest.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "runtime/thread.inline.hpp"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // Default value for -new-thread option: true on AIX because we run into
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // problems when attempting to initialize the JVM on the primordial thread.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #ifdef _AIX
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -91,7 +93,14 @@ static int init_jvm(int argc, char **argv, bool disable_error_handling) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ JavaVM* jvm;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ JNIEnv* env;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- return JNI_CreateJavaVM(&jvm, (void**)&env, &args);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ int ret = JNI_CreateJavaVM(&jvm, (void**)&env, &args);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (ret == JNI_OK) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // CreateJavaVM leaves WXExec context, while gtests
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // calls internal functions assuming running in WXWwrite.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // Switch to WXWrite once for all test cases.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ MACOS_AARCH64_ONLY(Thread::current()->enable_wx(WXWrite));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return ret;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ class JVMInitializerListener : public ::testing::EmptyTestEventListener {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- test/hotspot/jtreg/runtime/CompressedOops/CompressedClassPointers.java.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ test/hotspot/jtreg/runtime/CompressedOops/CompressedClassPointers.java
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1,5 +1,5 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- * Copyright (c) 2013, 2019, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2013, 2021, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * This code is free software; you can redistribute it and/or modify it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -25,7 +25,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @test
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @bug 8024927
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @summary Testing address of compressed class pointer space as best as possible.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- * @requires vm.bits == 64 & vm.opt.final.UseCompressedOops == true & os.family != "windows"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * @requires vm.bits == 64 & vm.opt.final.UseCompressedOops == true & os.family != "windows" & !(os.family == "mac" & os.arch=="aarch64")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @library /test/lib
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @modules java.base/jdk.internal.misc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * java.management
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- test/hotspot/jtreg/runtime/ErrorHandling/TestOnError.java.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ test/hotspot/jtreg/runtime/ErrorHandling/TestOnError.java
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -25,9 +25,12 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @test TestOnError
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @bug 8078470
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @summary Test using -XX:OnError=<cmd>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * COMMENTS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Macos_aarch64 (unlike macos_intel) doesn't let the java to create
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * core file with ErrorHandlerTest=12. so need to ignore this test there.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @modules java.base/jdk.internal.misc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @library /test/lib
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- * @requires vm.debug
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * @requires vm.debug & !(os.arch == "aarch64" & os.family == "mac")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @run main TestOnError
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ test/hotspot/jtreg/runtime/jni/codegenAttachThread/TestCodegenAttach.java
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -0,0 +1,42 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2018, 2021, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2021, Azul Systems, Inc. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * This code is free software; you can redistribute it and/or modify it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * under the terms of the GNU General Public License version 2 only, as
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * published by the Free Software Foundation.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * This code is distributed in the hope that it will be useful, but WITHOUT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * version 2 for more details (a copy is included in the LICENSE file that
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * accompanied this code).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * You should have received a copy of the GNU General Public License version
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * 2 along with this work; if not, write to the Free Software Foundation,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * or visit www.oracle.com if you need additional information or have any
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * questions.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * @test
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * @requires os.arch == "aarch64" & os.family == "mac"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * @run main/othervm/native TestCodegenAttach
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++public class TestCodegenAttach {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ static native void testCodegenAttach();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ static {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ System.loadLibrary("codegenAttach");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ public static void main(String[] args) throws Throwable {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ testCodegenAttach();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ test/hotspot/jtreg/runtime/jni/codegenAttachThread/libcodegenAttach.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -0,0 +1,124 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2018, 2021, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2021, Azul Systems, Inc. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * This code is free software; you can redistribute it and/or modify it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * under the terms of the GNU General Public License version 2 only, as
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * published by the Free Software Foundation.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * This code is distributed in the hope that it will be useful, but WITHOUT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * version 2 for more details (a copy is included in the LICENSE file that
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * accompanied this code).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * You should have received a copy of the GNU General Public License version
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * 2 along with this work; if not, write to the Free Software Foundation,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * or visit www.oracle.com if you need additional information or have any
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * questions.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <stdio.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <stdlib.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <stdbool.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <string.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "jni.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(__APPLE__) && defined(__aarch64__)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <pthread.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <sys/mman.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++JavaVM* jvm;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static void* codegen;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static int thread_start2(int val) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ JNIEnv *env;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ jclass class_id;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ jmethodID method_id;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ int res;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ printf("Native thread is running and attaching ...\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ res = (*jvm)->AttachCurrentThread(jvm, (void **)&env, NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (res != JNI_OK) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fprintf(stderr, "Test ERROR. Can't attach current thread: %d\n", res);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ exit(1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ res = (*jvm)->DetachCurrentThread(jvm);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (res != JNI_OK) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fprintf(stderr, "Test ERROR. Can't detach current thread: %d\n", res);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ exit(1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ printf("Native thread is about to finish\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return 1 + val;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static int trampoline(int(*fn)(int), int arg) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ int val = fn(arg);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // ensure code in MAP_JIT area after target function returns
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return 1 + val;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static void * thread_start(void* unused) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ int val = ((int(*)(int(*)(int),int))codegen)(thread_start2, 10);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ printf("return val = %d\n", val);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++JNIEXPORT void JNICALL
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++Java_TestCodegenAttach_testCodegenAttach
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++(JNIEnv *env, jclass cls) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ codegen = mmap(NULL, 0x1000,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ PROT_READ | PROT_WRITE | PROT_EXEC,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ MAP_PRIVATE | MAP_ANONYMOUS | MAP_JIT, -1, 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (codegen == MAP_FAILED) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ perror("mmap");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ exit(1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ pthread_jit_write_protect_np(false);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ memcpy(codegen, trampoline, 128);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ pthread_jit_write_protect_np(true);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ pthread_t thread;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ int res = (*env)->GetJavaVM(env, &jvm);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (res != JNI_OK) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fprintf(stderr, "Test ERROR. Can't extract JavaVM: %d\n", res);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ exit(1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if ((res = pthread_create(&thread, NULL, thread_start, NULL)) != 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fprintf(stderr, "TEST ERROR: pthread_create failed: %s (%d)\n", strerror(res), res);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ exit(1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if ((res = pthread_join(thread, NULL)) != 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fprintf(stderr, "TEST ERROR: pthread_join failed: %s (%d)\n", strerror(res), res);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ exit(1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++JNIEXPORT void JNICALL
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++Java_TestCodegenAttach_testCodegenAttach
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++(JNIEnv *env, jclass cls) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ printf("should not reach here\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ exit(1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif // __APPLE__ && __aarch64__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- test/hotspot/jtreg/vmTestbase/nsk/share/jdi/ArgumentHandler.java.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ test/hotspot/jtreg/vmTestbase/nsk/share/jdi/ArgumentHandler.java
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1,5 +1,5 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- * Copyright (c) 2001, 2019, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2001, 2021, Oracle and/or its affiliates. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * This code is free software; you can redistribute it and/or modify it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -538,6 +538,8 @@ protected void checkOptions() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {"linux-s390x", "com.sun.jdi.SharedMemoryAttach"},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {"macosx-amd64", "com.sun.jdi.SharedMemoryAttach"},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {"mac-x64", "com.sun.jdi.SharedMemoryAttach"},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ {"macosx-aarch64", "com.sun.jdi.SharedMemoryAttach"},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ {"mac-aarch64", "com.sun.jdi.SharedMemoryAttach"},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {"aix-ppc64", "com.sun.jdi.SharedMemoryAttach"},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // listening connectors
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -568,6 +570,8 @@ protected void checkOptions() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {"linux-s390x", "com.sun.jdi.SharedMemoryListen"},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {"macosx-amd64", "com.sun.jdi.SharedMemoryListen"},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {"mac-x64", "com.sun.jdi.SharedMemoryListen"},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ {"macosx-aarch64", "com.sun.jdi.SharedMemoryListen"},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ {"mac-aarch64", "com.sun.jdi.SharedMemoryListen"},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {"aix-ppc64", "com.sun.jdi.SharedMemoryListen"},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // launching connectors
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -647,8 +651,14 @@ protected void checkOptions() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {"macosx-amd64", "com.sun.jdi.CommandLineLaunch", "dt_shmem"},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {"macosx-amd64", "com.sun.jdi.RawCommandLineLaunch", "dt_shmem"},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- {"mac-x64", "com.sun.jdi.CommandLineLaunch", "dt_shmem"},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- {"mac-x64", "com.sun.jdi.RawCommandLineLaunch", "dt_shmem"},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ {"mac-x64", "com.sun.jdi.CommandLineLaunch", "dt_shmem"},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ {"mac-x64", "com.sun.jdi.RawCommandLineLaunch", "dt_shmem"},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ {"macosx-aarch64", "com.sun.jdi.CommandLineLaunch", "dt_shmem"},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ {"macosx-aarch64", "com.sun.jdi.RawCommandLineLaunch", "dt_shmem"},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ {"mac-aarch64", "com.sun.jdi.CommandLineLaunch", "dt_shmem"},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ {"mac-aarch64", "com.sun.jdi.RawCommandLineLaunch", "dt_shmem"},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {"aix-ppc64", "com.sun.jdi.CommandLineLaunch", "dt_shmem"},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {"aix-ppc64", "com.sun.jdi.RawCommandLineLaunch", "dt_shmem"},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -672,6 +682,8 @@ protected void checkOptions() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {"linux-s390x", "dt_shmem"},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {"macosx-amd64", "dt_shmem"},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {"mac-x64", "dt_shmem"},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ {"macosx-aarch64", "dt_shmem"},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ {"mac-aarch64", "dt_shmem"},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {"aix-ppc64", "dt_shmem"},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/java/openjdk11/files/patch-openjdk11-build1.diff b/java/openjdk11/files/patch-openjdk11-build1.diff
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..7d2133bbc58
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/java/openjdk11/files/patch-openjdk11-build1.diff
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,11 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- make/autoconf/toolchain.m4.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ make/autoconf/toolchain.m4
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -229,7 +229,7 @@ AC_DEFUN_ONCE([TOOLCHAIN_DETERMINE_TOOLCHAIN_TYPE],
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if test "x$OPENJDK_TARGET_OS" = xmacosx; then
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if test -n "$XCODEBUILD"; then
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # On Mac OS X, default toolchain to clang after Xcode 5
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- XCODE_VERSION_OUTPUT=`"$XCODEBUILD" -version 2>&1 | $HEAD -n 1`
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ XCODE_VERSION_OUTPUT=`"$XCODEBUILD" -version | $HEAD -n 1`
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ $ECHO "$XCODE_VERSION_OUTPUT" | $GREP "Xcode " > /dev/null
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if test $? -ne 0; then
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ AC_MSG_ERROR([Failed to determine Xcode version.])
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/java/openjdk11/files/patch-openjdk11-build2.diff b/java/openjdk11/files/patch-openjdk11-build2.diff
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..80d08aac5ce
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/java/openjdk11/files/patch-openjdk11-build2.diff
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,56 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/hotspot/share/jfr/periodic/jfrNetworkUtilization.cpp.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/hotspot/share/jfr/periodic/jfrNetworkUtilization.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -55,14 +55,14 @@ void JfrNetworkUtilization::destroy() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static InterfaceEntry& new_entry(const NetworkInterface* iface, GrowableArray<InterfaceEntry>* interfaces) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- assert(iface != NULL, "invariant");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- assert(interfaces != NULL, "invariant");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ vmassert(iface != NULL, "invariant");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ vmassert(interfaces != NULL, "invariant");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // single threaded premise
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static traceid interface_id = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ const char* name = iface->get_name();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- assert(name != NULL, "invariant");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ vmassert(name != NULL, "invariant");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ InterfaceEntry entry;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ const size_t length = strlen(name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -88,7 +88,7 @@ static InterfaceEntry& get_entry(const NetworkInterface* iface) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static int saved_index = -1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ GrowableArray<InterfaceEntry>* interfaces = get_interfaces();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- assert(interfaces != NULL, "invariant");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ vmassert(interfaces != NULL, "invariant");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for (int i = 0; i < _interfaces->length(); ++i) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ saved_index = (saved_index + 1) % _interfaces->length();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (strcmp(_interfaces->at(saved_index).name, iface->get_name()) == 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -101,7 +101,7 @@ static InterfaceEntry& get_entry(const NetworkInterface* iface) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // If current counters are less than previous we assume the interface has been reset
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // If no bytes have been either sent or received, we'll also skip the event
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static uint64_t rate_per_second(uint64_t current, uint64_t old, const JfrTickspan& interval) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- assert(interval.value() > 0, "invariant");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ vmassert(interval.value() > 0, "invariant");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (current <= old) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -120,7 +120,7 @@ static bool get_interfaces(NetworkInterface** network_interfaces) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ class JfrNetworkInterfaceName : public JfrSerializer {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ public:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void serialize(JfrCheckpointWriter& writer) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- assert(_interfaces != NULL, "invariant");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ vmassert(_interfaces != NULL, "invariant");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ const JfrCheckpointContext ctx = writer.context();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ const intptr_t count_offset = writer.reserve(sizeof(u4)); // Don't know how many yet
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int active_interfaces = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -143,7 +143,7 @@ class JfrNetworkInterfaceName : public JfrSerializer {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static bool register_network_interface_name_serializer() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- assert(_interfaces != NULL, "invariant");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ vmassert(_interfaces != NULL, "invariant");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return JfrSerializer::register_serializer(TYPE_NETWORKINTERFACENAME,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ false, // require safepoint
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ false, // disallow caching; we want a callback every rotation
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/java/openjdk13/Portfile b/java/openjdk13/Portfile
</span><span style='display:block; white-space:pre;color:#808080;'>index a586a9ab879..6208f8279a1 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/java/openjdk13/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/java/openjdk13/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -5,7 +5,7 @@ PortSystem 1.0
</span> name openjdk13
# https://github.com/openjdk/jdk13u/tags
version 13.0.10
<span style='display:block; white-space:pre;background:#ffe0e0;'>-revision 2
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+revision 3
</span> categories java devel
platforms darwin
supported_archs x86_64
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -19,29 +19,67 @@ fetch.type git
</span> git.url https://github.com/openjdk/jdk13u
git.branch jdk-${version}-ga
depends_build port:autoconf \
<span style='display:block; white-space:pre;background:#ffe0e0;'>- port:gmake
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-depends_lib port:openjdk13-bootstrap
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ port:gmake \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ port:bash \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ port:openjdk13-bootstrap
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+default_variants +server +release
</span>
set tpath /Library/Java
use_configure yes
<span style='display:block; white-space:pre;background:#ffe0e0;'>-configure.cmd sh configure
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+configure.cmd ${prefix}/bin/bash configure
</span> configure.pre_args --prefix=${tpath}
<span style='display:block; white-space:pre;background:#e0ffe0;'>+set extrachflags "-isysroot `xcrun --sdk macosx --show-sdk-path` -arch ${configure.build_arch}"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set extracxxflags "-isysroot `xcrun --sdk macosx --show-sdk-path` -arch ${configure.build_arch}"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set extraldflags "-Wl,-syslibroot,`xcrun --sdk macosx --show-sdk-path` -arch ${configure.build_arch}"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set jchflags "-Wno-implicit-function-declaration -Wno-unused-parameter"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set jcxxflags "-Wno-implicit-function-declaration -Wno-unused-parameter"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set jldflags "-L`xcrun --sdk macosx --show-sdk-path`/usr/lib -L`xcrun --sdk macosx --show-sdk-path`/usr/lib/system"
</span> # default configure args
configure.args --with-debug-level=release \
--with-native-debug-symbols=none \
--with-version-pre=release \
--with-jvm-variants=server \
--with-sysroot=`xcrun --sdk macosx --show-sdk-path` \
<span style='display:block; white-space:pre;background:#ffe0e0;'>- --with-extra-cflags="${configure.cflags}" \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- --with-extra-cxxflags="${configure.cxxflags}" \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- --with-extra-ldflags="${configure.ldflags}" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ --with-extra-cflags="${configure.cflags} ${extrachflags} ${jchflags}" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ --with-extra-cxxflags="${configure.cxxflags} ${extracxxflags} ${jcxxflags}" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ --with-extra-ldflags="${configure.ldflags} ${extraldflags} ${jldflags}" \
</span> --with-boot-jdk=/Library/Java/JavaVirtualMachines/openjdk13-bootstrap/Contents/Home \
--disable-warnings-as-errors \
--disable-precompiled-headers \
--with-conf-name=openjdk${version}
<span style='display:block; white-space:pre;background:#ffe0e0;'>-configure.cflags-append "-arch ${configure.build_arch} -Wno-implicit-function-declaration -Wno-unused-parameter"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-configure.cxxflags-append "-arch ${configure.build_arch} -Wno-implicit-function-declaration -Wno-unused-parameter"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-configure.ldflags-append "-arch ${configure.build_arch} -L`xcrun --sdk macosx --show-sdk-path`/usr/lib -L`xcrun --sdk macosx --show-sdk-path`/usr/lib/system"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+variant server \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ description {JVM with normal interpreter, and a tiered C1/C2 compiler} {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+variant release \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ description {OpenJDK with no debug information, all optimizations and no asserts} {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+variant optimized \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ description {OpenJDK with no debug information, all optimizations, no asserts and HotSpot is 'optimized'} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ configure.args-replace --with-debug-level=release --with-debug-level=optimized
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+variant debug \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ description {OpenJDK with debug information, all optimizations and all asserts} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ configure.args-append --enable-debug
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+variant client \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ description {JVM with normal interpreter, C1 and no C2 compiler} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ configure.args-replace --with-jvm-variants=server --with-jvm-variants=client
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+variant minimal \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ description {JVM with reduced form of normal interpreter having C1, no C2 compiler and optional features stripped out} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ configure.args-replace --with-jvm-variants=server --with-jvm-variants=minimal
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+variant core \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ conflicts server client minimal \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ description {JVM with normal interpreter only and no compiler} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ configure.args-replace --with-jvm-variants=server --with-jvm-variants=core
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> build.type gnu
build.target images
use_parallel_build no
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/java/openjdk15/Portfile b/java/openjdk15/Portfile
</span><span style='display:block; white-space:pre;color:#808080;'>index b08e066313a..8a50f35e42a 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/java/openjdk15/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/java/openjdk15/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -5,7 +5,7 @@ PortSystem 1.0
</span> name openjdk15
# https://github.com/openjdk/jdk15u/tags
version 15.0.6
<span style='display:block; white-space:pre;background:#ffe0e0;'>-revision 2
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+revision 3
</span> categories java devel
platforms darwin
supported_archs x86_64
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -20,29 +20,67 @@ git.url https://github.com/openjdk/jdk15u
</span> git.branch jdk-${version}-ga
patchfiles patch-openjdk15-build1.diff
depends_build port:autoconf \
<span style='display:block; white-space:pre;background:#ffe0e0;'>- port:gmake
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-depends_lib port:openjdk15-bootstrap
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ port:gmake \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ port:bash \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ port:openjdk15-bootstrap
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+default_variants +server +release
</span>
set tpath /Library/Java
use_configure yes
<span style='display:block; white-space:pre;background:#ffe0e0;'>-configure.cmd sh configure
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+configure.cmd ${prefix}/bin/bash configure
</span> configure.pre_args --prefix=${tpath}
<span style='display:block; white-space:pre;background:#e0ffe0;'>+set extrachflags "-isysroot `xcrun --sdk macosx --show-sdk-path` -arch ${configure.build_arch}"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set extracxxflags "-isysroot `xcrun --sdk macosx --show-sdk-path` -arch ${configure.build_arch}"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set extraldflags "-Wl,-syslibroot,`xcrun --sdk macosx --show-sdk-path` -arch ${configure.build_arch}"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set jchflags "-Wno-implicit-function-declaration -Wno-unused-parameter"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set jcxxflags "-Wno-implicit-function-declaration -Wno-unused-parameter"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set jldflags "-L`xcrun --sdk macosx --show-sdk-path`/usr/lib -L`xcrun --sdk macosx --show-sdk-path`/usr/lib/system"
</span> # default configure args
configure.args --with-debug-level=release \
--with-native-debug-symbols=none \
--with-version-pre=release \
--with-jvm-variants=server \
--with-sysroot=`xcrun --sdk macosx --show-sdk-path` \
<span style='display:block; white-space:pre;background:#ffe0e0;'>- --with-extra-cflags="${configure.cflags}" \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- --with-extra-cxxflags="${configure.cxxflags}" \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- --with-extra-ldflags="${configure.ldflags}" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ --with-extra-cflags="${configure.cflags} ${extrachflags} ${jchflags}" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ --with-extra-cxxflags="${configure.cxxflags} ${extracxxflags} ${jcxxflags}" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ --with-extra-ldflags="${configure.ldflags} ${extraldflags} ${jldflags}" \
</span> --with-boot-jdk=/Library/Java/JavaVirtualMachines/openjdk15-bootstrap/Contents/Home \
--disable-warnings-as-errors \
--disable-precompiled-headers \
--with-conf-name=openjdk${version}
<span style='display:block; white-space:pre;background:#ffe0e0;'>-configure.cflags-append "-arch ${configure.build_arch} -Wno-implicit-function-declaration -Wno-unused-parameter"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-configure.cxxflags-append "-arch ${configure.build_arch} -Wno-implicit-function-declaration -Wno-unused-parameter"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-configure.ldflags-append "-arch ${configure.build_arch} -L`xcrun --sdk macosx --show-sdk-path`/usr/lib -L`xcrun --sdk macosx --show-sdk-path`/usr/lib/system"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+variant server \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ description {JVM with normal interpreter, and a tiered C1/C2 compiler} {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+variant release \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ description {OpenJDK with no debug information, all optimizations and no asserts} {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+variant optimized \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ description {OpenJDK with no debug information, all optimizations, no asserts and HotSpot is 'optimized'} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ configure.args-replace --with-debug-level=release --with-debug-level=optimized
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+variant debug \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ description {OpenJDK with debug information, all optimizations and all asserts} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ configure.args-append --enable-debug
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+variant client \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ description {JVM with normal interpreter, C1 and no C2 compiler} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ configure.args-replace --with-jvm-variants=server --with-jvm-variants=client
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+variant minimal \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ description {JVM with reduced form of normal interpreter having C1, no C2 compiler and optional features stripped out} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ configure.args-replace --with-jvm-variants=server --with-jvm-variants=minimal
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+variant core \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ conflicts server client minimal \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ description {JVM with normal interpreter only and no compiler} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ configure.args-replace --with-jvm-variants=server --with-jvm-variants=core
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> build.type gnu
build.target images
use_parallel_build no
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/java/openjdk17/Portfile b/java/openjdk17/Portfile
</span><span style='display:block; white-space:pre;color:#808080;'>index 88f3e47aee4..fc2c7c3f90e 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/java/openjdk17/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/java/openjdk17/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -5,7 +5,7 @@ PortSystem 1.0
</span> name openjdk17
# https://github.com/openjdk/jdk17u/tags
version 17.0.2
<span style='display:block; white-space:pre;background:#ffe0e0;'>-revision 2
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+revision 3
</span> categories java devel
platforms darwin
supported_archs x86_64 arm64
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -19,30 +19,76 @@ fetch.type git
</span> git.url https://github.com/openjdk/jdk17u
git.branch jdk-${version}-ga
depends_build port:autoconf \
<span style='display:block; white-space:pre;background:#ffe0e0;'>- port:gmake
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-depends_lib port:openjdk17-bootstrap
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ port:gmake \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ port:bash \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ port:openjdk17-bootstrap
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+if {${configure.build_arch} eq "arm64"} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if {${os.major} == 21} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ patchfiles patch-openjdk17-build1.diff
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } elseif {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ patchfiles
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+default_variants +server +release
</span>
set tpath /Library/Java
use_xcode yes
use_configure yes
<span style='display:block; white-space:pre;background:#ffe0e0;'>-configure.cmd sh configure
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+configure.cmd ${prefix}/bin/bash configure
</span> configure.pre_args --prefix=${tpath}
<span style='display:block; white-space:pre;background:#e0ffe0;'>+set extrachflags "-isysroot `xcrun --sdk macosx --show-sdk-path` -arch ${configure.build_arch}"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set extracxxflags "-isysroot `xcrun --sdk macosx --show-sdk-path` -arch ${configure.build_arch}"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set extraldflags "-Wl,-syslibroot,`xcrun --sdk macosx --show-sdk-path` -arch ${configure.build_arch}"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set jchflags "-Wno-implicit-function-declaration -Wno-unused-parameter"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set jcxxflags "-Wno-implicit-function-declaration -Wno-unused-parameter"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set jldflags "-L`xcrun --sdk macosx --show-sdk-path`/usr/lib -L`xcrun --sdk macosx --show-sdk-path`/usr/lib/system"
</span> # default configure args
configure.args --with-debug-level=release \
--with-native-debug-symbols=none \
--with-version-pre=release \
--with-jvm-variants=server \
--with-sysroot=`xcrun --sdk macosx --show-sdk-path` \
<span style='display:block; white-space:pre;background:#ffe0e0;'>- --with-extra-cflags="${configure.cflags}" \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- --with-extra-cxxflags="${configure.cxxflags}" \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- --with-extra-ldflags="${configure.ldflags}" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ --with-extra-cflags="${configure.cflags} ${extrachflags} ${jchflags}" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ --with-extra-cxxflags="${configure.cxxflags} ${extracxxflags} ${jcxxflags}" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ --with-extra-ldflags="${configure.ldflags} ${extraldflags} ${jldflags}" \
</span> --with-boot-jdk=/Library/Java/JavaVirtualMachines/openjdk17-bootstrap/Contents/Home \
--disable-precompiled-headers \
--disable-warnings-as-errors \
--with-conf-name=openjdk${version}
<span style='display:block; white-space:pre;background:#ffe0e0;'>-configure.cflags-append "-arch ${configure.build_arch} -Wno-implicit-function-declaration -Wno-unused-parameter"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-configure.cxxflags-append "-arch ${configure.build_arch} -Wno-implicit-function-declaration -Wno-unused-parameter"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-configure.ldflags-append "-arch ${configure.build_arch} -L`xcrun --sdk macosx --show-sdk-path`/usr/lib -L`xcrun --sdk macosx --show-sdk-path`/usr/lib/system"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+variant server \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ description {JVM with normal interpreter, and a tiered C1/C2 compiler} {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+variant release \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ description {OpenJDK with no debug information, all optimizations and no asserts} {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+variant optimized \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ description {OpenJDK with no debug information, all optimizations, no asserts and HotSpot is 'optimized'} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ configure.args-replace --with-debug-level=release --with-debug-level=optimized
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+variant debug \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ description {OpenJDK with debug information, all optimizations and all asserts} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ configure.args-append --enable-debug
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+variant client \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ description {JVM with normal interpreter, C1 and no C2 compiler} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ configure.args-replace --with-jvm-variants=server --with-jvm-variants=client
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+variant minimal \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ description {JVM with reduced form of normal interpreter having C1, no C2 compiler and optional features stripped out} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ configure.args-replace --with-jvm-variants=server --with-jvm-variants=minimal
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+variant core \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ conflicts server client minimal \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ description {JVM with normal interpreter only and no compiler} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ configure.args-replace --with-jvm-variants=server --with-jvm-variants=core
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> build.type gnu
build.target images
use_parallel_build no
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/java/openjdk17/files/patch-openjdk17-build1.diff b/java/openjdk17/files/patch-openjdk17-build1.diff
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..522052cc0d4
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/java/openjdk17/files/patch-openjdk17-build1.diff
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,11 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- make/autoconf/toolchain.m4
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ make/autoconf/toolchain.m4
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -229,7 +229,7 @@ AC_DEFUN_ONCE([TOOLCHAIN_DETERMINE_TOOLCHAIN_TYPE],
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if test "x$OPENJDK_TARGET_OS" = xmacosx; then
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if test -n "$XCODEBUILD"; then
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # On Mac OS X, default toolchain to clang after Xcode 5
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- XCODE_VERSION_OUTPUT=`"$XCODEBUILD" -version 2>&1 | $HEAD -n 1`
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ XCODE_VERSION_OUTPUT=`"$XCODEBUILD" -version | $HEAD -n 1`
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ $ECHO "$XCODE_VERSION_OUTPUT" | $GREP "Xcode " > /dev/null
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if test $? -ne 0; then
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ AC_MSG_ERROR([Failed to determine Xcode version.])
</span>\ No newline at end of file
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/java/openjdk18/Portfile b/java/openjdk18/Portfile
</span><span style='display:block; white-space:pre;color:#808080;'>index 8c9bf9e9a9e..9bee50b4ad4 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/java/openjdk18/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/java/openjdk18/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -5,7 +5,7 @@ PortSystem 1.0
</span> name openjdk18
# https://github.com/openjdk/jdk18/tags
version 18
<span style='display:block; white-space:pre;background:#ffe0e0;'>-revision 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+revision 2
</span> categories java devel
platforms darwin
supported_archs x86_64 arm64
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -22,27 +22,67 @@ depends_build port:autoconf \
</span> port:gmake
depends_lib port:openjdk17-bootstrap
<span style='display:block; white-space:pre;background:#e0ffe0;'>+default_variants +server +release
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> set tpath /Library/Java
use_xcode yes
use_configure yes
configure.cmd sh configure
configure.pre_args --prefix=${tpath}
<span style='display:block; white-space:pre;background:#e0ffe0;'>+set extrachflags "-isysroot `xcrun --sdk macosx --show-sdk-path` -arch ${configure.build_arch}"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set extracxxflags "-isysroot `xcrun --sdk macosx --show-sdk-path` -arch ${configure.build_arch}"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set extraldflags "-Wl,-syslibroot,`xcrun --sdk macosx --show-sdk-path` -arch ${configure.build_arch}"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set jchflags "-Wno-implicit-function-declaration -Wno-unused-parameter"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set jcxxflags "-Wno-implicit-function-declaration -Wno-unused-parameter"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set jldflags "-L`xcrun --sdk macosx --show-sdk-path`/usr/lib -L`xcrun --sdk macosx --show-sdk-path`/usr/lib/system"
</span> # default configure args
configure.args --with-debug-level=release \
--with-native-debug-symbols=none \
--with-version-pre=release \
--with-jvm-variants=server \
--with-sysroot=`xcrun --sdk macosx --show-sdk-path` \
<span style='display:block; white-space:pre;background:#ffe0e0;'>- --with-extra-cflags="${configure.cflags}" \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- --with-extra-cxxflags="${configure.cxxflags}" \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- --with-extra-ldflags="${configure.ldflags}" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ --with-extra-cflags="${configure.cflags} ${extrachflags} ${jchflags}" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ --with-extra-cxxflags="${configure.cxxflags} ${extracxxflags} ${jcxxflags}" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ --with-extra-ldflags="${configure.ldflags} ${extraldflags} ${jldflags}" \
</span> --with-boot-jdk=/Library/Java/JavaVirtualMachines/openjdk17-bootstrap/Contents/Home \
--disable-warnings-as-errors \
--disable-precompiled-headers \
--with-conf-name=openjdk${version}
<span style='display:block; white-space:pre;background:#ffe0e0;'>-configure.cflags-append "-arch ${configure.build_arch} -Wno-implicit-function-declaration -Wno-unused-parameter"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-configure.cxxflags-append "-arch ${configure.build_arch} -Wno-implicit-function-declaration -Wno-unused-parameter"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-configure.ldflags-append "-arch ${configure.build_arch} -L`xcrun --sdk macosx --show-sdk-path`/usr/lib -L`xcrun --sdk macosx --show-sdk-path`/usr/lib/system"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+variant server \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ description {JVM with normal interpreter, and a tiered C1/C2 compiler} {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+variant release \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ description {OpenJDK with no debug information, all optimizations and no asserts} {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+variant optimized \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ description {OpenJDK with no debug information, all optimizations, no asserts and HotSpot is 'optimized'} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ configure.args-replace --with-debug-level=release --with-debug-level=optimized
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+variant debug \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ description {OpenJDK with debug information, all optimizations and all asserts} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ configure.args-append --enable-debug
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+variant client \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ description {JVM with normal interpreter, C1 and no C2 compiler} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ configure.args-replace --with-jvm-variants=server --with-jvm-variants=client
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+variant minimal \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ description {JVM with reduced form of normal interpreter having C1, no C2 compiler and optional features stripped out} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ configure.args-replace --with-jvm-variants=server --with-jvm-variants=minimal
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+variant core \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ conflicts server client minimal \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ description {JVM with normal interpreter only and no compiler} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ configure.args-replace --with-jvm-variants=server --with-jvm-variants=core
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> build.type gnu
build.target images
use_parallel_build no
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/java/openjdk8/Portfile b/java/openjdk8/Portfile
</span><span style='display:block; white-space:pre;color:#808080;'>index c329c8209dd..9d048f21108 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/java/openjdk8/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/java/openjdk8/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -23,20 +23,23 @@ git.url https://github.com/openjdk/jdk8u
</span> git.branch jdk8u${u}-ga
patchfiles patch-openjdk8-xcode1.diff \
patch-openjdk8-xcode2.diff
<span style='display:block; white-space:pre;background:#ffe0e0;'>-depends_lib port:openjdk8-bootstrap \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- port:freetype
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+depends_lib port:freetype
</span> depends_build port:autoconf \
<span style='display:block; white-space:pre;background:#ffe0e0;'>- port:gmake
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ port:gmake \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ port:bash \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ port:openjdk8-bootstrap
</span>
# remove pre-patch phase after jdk8u341-ga tag
pre-patch {
reinplace "s|JDK_UPDATE_VERSION=|JDK_UPDATE_VERSION=${u}|g" ${worksrcpath}/common/autoconf/version-numbers
}
<span style='display:block; white-space:pre;background:#e0ffe0;'>+default_variants +server +release
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> set tpath /Library/Java
use_xcode yes
use_configure yes
<span style='display:block; white-space:pre;background:#ffe0e0;'>-configure.cmd sh ./configure
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+configure.cmd ${prefix}/bin/bash ./configure
</span> configure.pre_args --prefix=${tpath}
# default configure args
configure.args --with-boot-jdk=/Library/Java/JavaVirtualMachines/openjdk8-bootstrap/Contents/Home \
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -45,6 +48,24 @@ configure.args --with-boot-jdk=/Library/Java/JavaVirtualMachines/openjdk8-b
</span> --with-freetype-lib=${prefix}/lib \
--with-jvm-variants=server \
--with-conf-name=openjdk${version}
<span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+variant server \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ description {JVM with normal interpreter and a tiered C1/C2 compiler} {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+variant release \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ description {OpenJDK with no debug information, all optimizations and no asserts} {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+variant debug \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ description {OpenJDK with debug information, all optimizations and all asserts} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ configure.args-append --enable-debug
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+variant core \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ conflicts server \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ description {JVM with interpreter only and no compiler} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ configure.args-replace --with-jvm-variants=server --with-jvm-variants=core
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> build.type gnu
build.target images
use_parallel_build no
</pre><pre style='margin:0'>
</pre>