<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>