mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 19:22:45 +00:00 
			
		
		
		
	Ports: Add OpenJDK port
Port of OpenJDK 17.0.2, zero VM only. More work needed to get the full hotspot VM up and running :^) Co-Authored-By: Andrew Kaster <akaster@serenityos.org>
This commit is contained in:
		
							parent
							
								
									6eb9ebec5f
								
							
						
					
					
						commit
						1f886f94bd
					
				
					 11 changed files with 4308 additions and 0 deletions
				
			
		|  | @ -162,6 +162,7 @@ This list is also available at [ports.serenityos.net](https://ports.serenityos.n | |||
| | [`ntbtls`](ntbtls/)                                 | The Not Too Bad TLS Library                                     | 0.2.0                    | https://gnupg.org/software/ntbtls/index.html                                   | | ||||
| | [`nyancat`](nyancat/)                               | Nyancat                                                         |                          | https://github.com/klange/nyancat                                              | | ||||
| | [`oksh`](oksh/)                                     | oksh                                                            | 7.1                      | https://github.com/ibara/oksh                                                  | | ||||
| | [`OpenJDK`](OpenJDK/)                               | OpenJDK                                                         | 17.0.2                   | https://openjdk.java.net/                                                      | | ||||
| | [`openssh`](openssh/)                               | OpenSSH                                                         | 9.0-94eb685              | https://github.com/openssh/openssh-portable                                    | | ||||
| | [`openssl`](openssl/)                               | OpenSSL                                                         | 1.1.1o                   | https://www.openssl.org/                                                       | | ||||
| | [`openttd`](openttd/)                               | OpenTTD                                                         | 12.2                     | https://www.openttd.org/                                                       | | ||||
|  |  | |||
							
								
								
									
										57
									
								
								Ports/OpenJDK/package.sh
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										57
									
								
								Ports/OpenJDK/package.sh
									
										
									
									
									
										Executable file
									
								
							|  | @ -0,0 +1,57 @@ | |||
| #!/usr/bin/env -S USE_CCACHE=false bash ../.port_include.sh | ||||
| 
 | ||||
| port='OpenJDK' | ||||
| version='17.0.2' | ||||
| workdir="jdk17u-dev-jdk-${version}-ga" | ||||
| useconfigure='true' | ||||
| use_fresh_config_guess='true' | ||||
| config_guess_paths=("make/autoconf/build-aux/autoconf-config.guess") | ||||
| use_fresh_config_sub='true' | ||||
| config_sub_paths=("make/autoconf/build-aux/autoconf-config.sub") | ||||
| auth_type='sha256' | ||||
| files="https://github.com/openjdk/jdk17u-dev/archive/refs/tags/jdk-${version}-ga.tar.gz jdk-${version}-ga.tar.gz cb5b2a5d0916723d340f2c5bacd4607f8b8dc3a18dc8019fcfabf5306e2a4112" | ||||
| depends=("fontconfig" "libffi") | ||||
| 
 | ||||
| configure() { | ||||
|     TOOLCHAIN_ARGS=() | ||||
|     WARNING_IGNORE_FLAGS='-Wno-error=switch -Wno-maybe-uninitialized' | ||||
|     if [ $SERENITY_TOOLCHAIN = 'Clang' ]; then | ||||
|         # We need the build CC and CXX to actually be clang when using clang to cross-compile | ||||
|         #    ... for some reason. | ||||
|         TOOLCHAIN_ARGS=("--with-toolchain-type=clang" | ||||
|                         "BUILD_CC=clang" | ||||
|                         "BUILD_CXX=clang++") | ||||
|         WARNING_IGNORE_FLAGS="${WARNING_IGNORE_FLAGS} -Wno-error=bitwise-instead-of-logical" | ||||
|     fi | ||||
| 
 | ||||
|     # Note: To use ccache with OpenJDK, pass --enable-ccache | ||||
|     #     It rejects the ccache symlinks. | ||||
| 
 | ||||
|     run bash configure \ | ||||
|         AR=${AR} \ | ||||
|         READELF=${READELF} \ | ||||
|         STRIP=${STRIP} \ | ||||
|         CXXFILT=${CXXFILT} \ | ||||
|         BUILD_AR=${HOST_AR} \ | ||||
|         BUILD_OBJCOPY=${HOST_OBJCOPY} \ | ||||
|         BUILD_STRIP=${HOST_STRIP} \ | ||||
|         --openjdk-target=${SERENITY_ARCH}-pc-serenity \ | ||||
|         --with-sysroot=${SERENITY_INSTALL_ROOT} \ | ||||
|         --with-jvm-variants=zero \ | ||||
|         --enable-headless-only \ | ||||
|         --with-debug-level=fastdebug \ | ||||
|         --with-native-debug-symbols=internal \ | ||||
|         --with-tools-dir=${SERENITY_TOOLCHAIN_BINDIR} \ | ||||
|         --with-extra-cflags="${WARNING_IGNORE_FLAGS}" \ | ||||
|         --with-extra-cxxflags="${WARNING_IGNORE_FLAGS}" \ | ||||
|         "${TOOLCHAIN_ARGS[@]}" | ||||
| } | ||||
| 
 | ||||
| build() { | ||||
|     run make java.base jdk.compiler java.logging | ||||
| } | ||||
| 
 | ||||
| install() { | ||||
|     run mkdir -p ${SERENITY_INSTALL_ROOT}/usr/local/lib/jvm/ | ||||
|     run sh -c "cp ./build/serenity-* ${SERENITY_INSTALL_ROOT}/usr/local/lib/jvm/ -rf" | ||||
| } | ||||
|  | @ -0,0 +1,152 @@ | |||
| From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 | ||||
| From: Timur Sultanov <SultanovTS@yandex.ru> | ||||
| Date: Wed, 16 Feb 2022 21:04:18 +0300 | ||||
| Subject: [PATCH] make: Add Serenity support, masquerading as BSD when | ||||
|  necessary | ||||
| 
 | ||||
| Co-Authored-By: Andrew Kaster <akaster@serenityos.org> | ||||
| ---
 | ||||
|  make/autoconf/flags-cflags.m4                |  3 +++ | ||||
|  make/autoconf/flags-ldflags.m4               | 11 +++++++++++ | ||||
|  make/autoconf/platform.m4                    |  8 ++++++++ | ||||
|  make/autoconf/toolchain.m4                   |  1 + | ||||
|  make/common/modules/LauncherCommon.gmk       |  3 +++ | ||||
|  make/hotspot/lib/JvmMapfile.gmk              | 12 ++++++++++++ | ||||
|  make/modules/java.base/lib/CoreLibraries.gmk |  1 + | ||||
|  7 files changed, 39 insertions(+) | ||||
| 
 | ||||
| diff --git a/make/autoconf/flags-cflags.m4 b/make/autoconf/flags-cflags.m4
 | ||||
| index 5eed1138f..62e53a1c4 100644
 | ||||
| --- a/make/autoconf/flags-cflags.m4
 | ||||
| +++ b/make/autoconf/flags-cflags.m4
 | ||||
| @@ -382,6 +382,9 @@ AC_DEFUN([FLAGS_SETUP_CFLAGS_HELPER],
 | ||||
|      CFLAGS_OS_DEF_JVM="-DAIX" | ||||
|    elif test "x$OPENJDK_TARGET_OS" = xbsd; then | ||||
|      CFLAGS_OS_DEF_JDK="-D_ALLBSD_SOURCE" | ||||
| +  elif test "x$OPENJDK_TARGET_OS" = xserenity; then
 | ||||
| +    CFLAGS_OS_DEF_JDK="-DSERENITY"
 | ||||
| +    CFLAGS_OS_DEF_JVM="-DSERENITY"
 | ||||
|    elif test "x$OPENJDK_TARGET_OS" = xwindows; then | ||||
|      CFLAGS_OS_DEF_JVM="-D_WINDOWS -DWIN32 -D_JNI_IMPLEMENTATION_" | ||||
|    fi | ||||
| diff --git a/make/autoconf/flags-ldflags.m4 b/make/autoconf/flags-ldflags.m4
 | ||||
| index 23bb33e87..e3deb0c3f 100644
 | ||||
| --- a/make/autoconf/flags-ldflags.m4
 | ||||
| +++ b/make/autoconf/flags-ldflags.m4
 | ||||
| @@ -110,6 +110,17 @@ AC_DEFUN([FLAGS_SETUP_LDFLAGS_HELPER],
 | ||||
|      fi | ||||
|    fi | ||||
|   | ||||
| +  if test "x$OPENJDK_TARGET_OS" = xserenity; then
 | ||||
| +    if test "x$TOOLCHAIN_TYPE" = xgcc; then
 | ||||
| +      # FIXME: -lgcc_s should not be required, toolchain spec file issue
 | ||||
| +      OS_LDFLAGS_JVM_ONLY="$OS_LDFLAGS_JVM_ONLY -ldl -lpthread -lgcc_s"
 | ||||
| +      OS_LDFLAGS="$OS_LDFLAGS -ldl -lpthread -lgcc_s"
 | ||||
| +    elif test "x$TOOLCHAIN_TYPE" = xclang; then
 | ||||
| +      OS_LDFLAGS_JVM_ONLY="$OS_LDFLAGS_JVM_ONLY -ldl -lpthread"
 | ||||
| +      OS_LDFLAGS="$OS_LDFLAGS -ldl -lpthread"
 | ||||
| +    fi
 | ||||
| +  fi
 | ||||
| +
 | ||||
|    # Setup debug level-dependent LDFLAGS | ||||
|    if test "x$TOOLCHAIN_TYPE" = xgcc; then | ||||
|      if test "x$OPENJDK_TARGET_OS" = xlinux; then | ||||
| diff --git a/make/autoconf/platform.m4 b/make/autoconf/platform.m4
 | ||||
| index 205d64f56..6e668edc4 100644
 | ||||
| --- a/make/autoconf/platform.m4
 | ||||
| +++ b/make/autoconf/platform.m4
 | ||||
| @@ -220,6 +220,10 @@ AC_DEFUN([PLATFORM_EXTRACT_VARS_FROM_OS],
 | ||||
|        VAR_OS=aix | ||||
|        VAR_OS_TYPE=unix | ||||
|        ;; | ||||
| +    *serenity*)
 | ||||
| +      VAR_OS=serenity
 | ||||
| +      VAR_OS_TYPE=unix
 | ||||
| +      ;;
 | ||||
|      *) | ||||
|        AC_MSG_ERROR([unsupported operating system $1]) | ||||
|        ;; | ||||
| @@ -521,6 +525,8 @@ AC_DEFUN([PLATFORM_SETUP_LEGACY_VARS_HELPER],
 | ||||
|    HOTSPOT_$1_OS=${OPENJDK_$1_OS} | ||||
|    if test "x$OPENJDK_$1_OS" = xmacosx; then | ||||
|      HOTSPOT_$1_OS=bsd | ||||
| +  elif test "x$OPENJDK_$1_OS" = xserenity; then
 | ||||
| +    HOTSPOT_$1_OS=bsd
 | ||||
|    fi | ||||
|    AC_SUBST(HOTSPOT_$1_OS) | ||||
|   | ||||
| @@ -587,6 +593,8 @@ AC_DEFUN([PLATFORM_SETUP_LEGACY_VARS_HELPER],
 | ||||
|      OPENJDK_$1_OS_INCLUDE_SUBDIR="win32" | ||||
|    elif test "x$OPENJDK_TARGET_OS" = "xmacosx"; then | ||||
|      OPENJDK_$1_OS_INCLUDE_SUBDIR="darwin" | ||||
| +  elif test "x$OPENJDK_TARGET_OS" = "xserenity"; then
 | ||||
| +    OPENJDK_$1_OS_INCLUDE_SUBDIR="bsd"
 | ||||
|    fi | ||||
|    AC_SUBST(OPENJDK_$1_OS_INCLUDE_SUBDIR) | ||||
|  ]) | ||||
| diff --git a/make/autoconf/toolchain.m4 b/make/autoconf/toolchain.m4
 | ||||
| index 69540e160..badd84a50 100644
 | ||||
| --- a/make/autoconf/toolchain.m4
 | ||||
| +++ b/make/autoconf/toolchain.m4
 | ||||
| @@ -42,6 +42,7 @@ VALID_TOOLCHAINS_linux="gcc clang"
 | ||||
|  VALID_TOOLCHAINS_macosx="gcc clang" | ||||
|  VALID_TOOLCHAINS_aix="xlc" | ||||
|  VALID_TOOLCHAINS_windows="microsoft" | ||||
| +VALID_TOOLCHAINS_serenity="gcc clang"
 | ||||
|   | ||||
|  # Toolchain descriptions | ||||
|  TOOLCHAIN_DESCRIPTION_clang="clang/LLVM" | ||||
| diff --git a/make/common/modules/LauncherCommon.gmk b/make/common/modules/LauncherCommon.gmk
 | ||||
| index 7ad0375e2..8100f655e 100644
 | ||||
| --- a/make/common/modules/LauncherCommon.gmk
 | ||||
| +++ b/make/common/modules/LauncherCommon.gmk
 | ||||
| @@ -157,11 +157,14 @@ define SetupBuildLauncherBody
 | ||||
|            $$($1_LDFLAGS), \ | ||||
|        LDFLAGS_linux := $$(call SET_EXECUTABLE_ORIGIN,/../lib) \ | ||||
|            -L$(call FindLibDirForModule, java.base), \ | ||||
| +      LDFLAGS_serenity := $$(call SET_EXECUTABLE_ORIGIN,/../lib) \
 | ||||
| +          -L$(call FindLibDirForModule, java.base), \
 | ||||
|        LDFLAGS_macosx := $$(call SET_EXECUTABLE_ORIGIN,/../lib) \ | ||||
|            -L$(call FindLibDirForModule, java.base), \ | ||||
|        LDFLAGS_aix := -L$(SUPPORT_OUTPUTDIR)/native/java.base, \ | ||||
|        LIBS := $(JDKEXE_LIBS) $$($1_LIBS), \ | ||||
|        LIBS_linux := -ljli -lpthread $(LIBDL), \ | ||||
| +      LIBS_serenity := -ljli -lpthread $(LIBDL), \
 | ||||
|        LIBS_macosx := -ljli -framework Cocoa -framework Security \ | ||||
|            -framework ApplicationServices, \ | ||||
|        LIBS_aix := -ljli_static, \ | ||||
| diff --git a/make/hotspot/lib/JvmMapfile.gmk b/make/hotspot/lib/JvmMapfile.gmk
 | ||||
| index 5cba93178..752727d0d 100644
 | ||||
| --- a/make/hotspot/lib/JvmMapfile.gmk
 | ||||
| +++ b/make/hotspot/lib/JvmMapfile.gmk
 | ||||
| @@ -64,6 +64,18 @@ ifeq ($(call isTargetOs, linux), true)
 | ||||
|          if ($$3 ~ /$(FILTER_SYMBOLS_PATTERN)/) print $$3; \ | ||||
|        }' | ||||
|   | ||||
| +else ifeq ($(call isTargetOs, serenity), true)
 | ||||
| +  DUMP_SYMBOLS_CMD := $(NM) --defined-only *.o
 | ||||
| +  ifneq ($(FILTER_SYMBOLS_PATTERN), )
 | ||||
| +    FILTER_SYMBOLS_PATTERN := $(FILTER_SYMBOLS_PATTERN)|
 | ||||
| +  endif
 | ||||
| +  FILTER_SYMBOLS_PATTERN := $(FILTER_SYMBOLS_PATTERN)^_ZTV|^gHotSpotVM|^UseSharedSpaces$$
 | ||||
| +  FILTER_SYMBOLS_PATTERN := $(FILTER_SYMBOLS_PATTERN)|^_ZN9Arguments17SharedArchivePathE$$
 | ||||
| +  FILTER_SYMBOLS_AWK_SCRIPT := \
 | ||||
| +      '{ \
 | ||||
| +        if ($$3 ~ /$(FILTER_SYMBOLS_PATTERN)/) print $$3; \
 | ||||
| +      }'
 | ||||
| +
 | ||||
|  else ifeq ($(call isTargetOs, macosx), true) | ||||
|    # nm on macosx prints out "warning: nm: no name list" to stderr for | ||||
|    # files without symbols. Hide this, even at the expense of hiding real errors. | ||||
| diff --git a/make/modules/java.base/lib/CoreLibraries.gmk b/make/modules/java.base/lib/CoreLibraries.gmk
 | ||||
| index 1d5fede2a..0a61d009f 100644
 | ||||
| --- a/make/modules/java.base/lib/CoreLibraries.gmk
 | ||||
| +++ b/make/modules/java.base/lib/CoreLibraries.gmk
 | ||||
| @@ -209,6 +209,7 @@ $(eval $(call SetupJdkLibrary, BUILD_LIBJLI, \
 | ||||
|      LIBS_unix := $(LIBZ_LIBS), \ | ||||
|      LIBS_linux := $(LIBDL) -lpthread, \ | ||||
|      LIBS_aix := $(LIBDL),\ | ||||
| +    LIBS_serenity := $(LIBDL) -lpthread, \
 | ||||
|      LIBS_macosx := -framework Cocoa -framework Security -framework ApplicationServices, \ | ||||
|      LIBS_windows := advapi32.lib comctl32.lib user32.lib, \ | ||||
|  )) | ||||
|  | @ -0,0 +1,98 @@ | |||
| From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 | ||||
| From: Andrew Kaster <andrewdkaster@gmail.com> | ||||
| Date: Sun, 12 Jun 2022 23:13:56 -0600 | ||||
| Subject: [PATCH] make: Build with c++20 when targeting serenity | ||||
| 
 | ||||
| ---
 | ||||
|  make/autoconf/flags-cflags.m4                 | 8 ++++++-- | ||||
|  src/hotspot/share/utilities/chunkedList.hpp   | 2 +- | ||||
|  src/hotspot/share/utilities/events.hpp        | 2 +- | ||||
|  src/hotspot/share/utilities/growableArray.hpp | 2 +- | ||||
|  src/hotspot/share/utilities/linkedlist.hpp    | 2 +- | ||||
|  5 files changed, 10 insertions(+), 6 deletions(-) | ||||
| 
 | ||||
| diff --git a/make/autoconf/flags-cflags.m4 b/make/autoconf/flags-cflags.m4
 | ||||
| index 62e53a1c4..9239dfb43 100644
 | ||||
| --- a/make/autoconf/flags-cflags.m4
 | ||||
| +++ b/make/autoconf/flags-cflags.m4
 | ||||
| @@ -154,7 +154,8 @@ AC_DEFUN([FLAGS_SETUP_WARNINGS],
 | ||||
|        WARNINGS_ENABLE_ALL_CFLAGS="-Wall -Wextra -Wformat=2 $WARNINGS_ENABLE_ADDITIONAL" | ||||
|        WARNINGS_ENABLE_ALL_CXXFLAGS="$WARNINGS_ENABLE_ALL_CFLAGS $WARNINGS_ENABLE_ADDITIONAL_CXX" | ||||
|   | ||||
| -      DISABLED_WARNINGS="unused-parameter unused"
 | ||||
| +      DISABLED_WARNINGS="unused-parameter unused address stringop-overflow stringop-truncation format-truncation use-after-free"
 | ||||
| +      DISABLED_WARNINGS_CXX="volatile deprecated-enum-enum-conversion deprecated-enum-float-conversion"
 | ||||
|        ;; | ||||
|   | ||||
|      clang) | ||||
| @@ -166,7 +167,7 @@ AC_DEFUN([FLAGS_SETUP_WARNINGS],
 | ||||
|            -Wunused-function -Wundef -Wunused-value -Woverloaded-virtual" | ||||
|        WARNINGS_ENABLE_ALL="-Wall -Wextra -Wformat=2 $WARNINGS_ENABLE_ADDITIONAL" | ||||
|   | ||||
| -      DISABLED_WARNINGS="unknown-warning-option unused-parameter unused"
 | ||||
| +      DISABLED_WARNINGS="unknown-warning-option unused-parameter unused deprecated-volatile deprecated-anon-enum-enum-conversion deprecated-enum-float-conversion ambiguous-reversed-operator"
 | ||||
|   | ||||
|        ;; | ||||
|   | ||||
| @@ -529,6 +530,9 @@ AC_DEFUN([FLAGS_SETUP_CFLAGS_HELPER],
 | ||||
|    else | ||||
|      AC_MSG_ERROR([Don't know how to enable C++14 for this toolchain]) | ||||
|    fi | ||||
| +  if test "x$OPENJDK_TARGET_OS" = xserenity; then
 | ||||
| +    LANGSTD_CXXFLAGS="-std=c++20"
 | ||||
| +  fi
 | ||||
|    TOOLCHAIN_CFLAGS_JDK_CXXONLY="$TOOLCHAIN_CFLAGS_JDK_CXXONLY $LANGSTD_CXXFLAGS" | ||||
|    TOOLCHAIN_CFLAGS_JVM="$TOOLCHAIN_CFLAGS_JVM $LANGSTD_CXXFLAGS" | ||||
|    ADLC_LANGSTD_CXXFLAGS="$LANGSTD_CXXFLAGS" | ||||
| diff --git a/src/hotspot/share/utilities/chunkedList.hpp b/src/hotspot/share/utilities/chunkedList.hpp
 | ||||
| index 1a899ee2b..13f05cd3a 100644
 | ||||
| --- a/src/hotspot/share/utilities/chunkedList.hpp
 | ||||
| +++ b/src/hotspot/share/utilities/chunkedList.hpp
 | ||||
| @@ -44,7 +44,7 @@ template <class T, MEMFLAGS F> class ChunkedList : public CHeapObj<F> {
 | ||||
|    } | ||||
|   | ||||
|   public: | ||||
| -  ChunkedList<T, F>() : _top(_values), _next_used(NULL), _next_free(NULL) {}
 | ||||
| +  ChunkedList() : _top(_values), _next_used(NULL), _next_free(NULL) {}
 | ||||
|   | ||||
|    bool is_full() const { | ||||
|      return _top == end(); | ||||
| diff --git a/src/hotspot/share/utilities/events.hpp b/src/hotspot/share/utilities/events.hpp
 | ||||
| index b5d67bd6a..3cf3b399f 100644
 | ||||
| --- a/src/hotspot/share/utilities/events.hpp
 | ||||
| +++ b/src/hotspot/share/utilities/events.hpp
 | ||||
| @@ -99,7 +99,7 @@ template <class T> class EventLogBase : public EventLog {
 | ||||
|    EventRecord<T>* _records; | ||||
|   | ||||
|   public: | ||||
| -  EventLogBase<T>(const char* name, const char* handle, int length = LogEventsBufferEntries):
 | ||||
| +  EventLogBase(const char* name, const char* handle, int length = LogEventsBufferEntries):
 | ||||
|      _mutex(Mutex::event, name, true, Mutex::_safepoint_check_never), | ||||
|      _name(name), | ||||
|      _handle(handle), | ||||
| diff --git a/src/hotspot/share/utilities/growableArray.hpp b/src/hotspot/share/utilities/growableArray.hpp
 | ||||
| index b75283843..67074b86f 100644
 | ||||
| --- a/src/hotspot/share/utilities/growableArray.hpp
 | ||||
| +++ b/src/hotspot/share/utilities/growableArray.hpp
 | ||||
| @@ -118,7 +118,7 @@ class GrowableArrayView : public GrowableArrayBase {
 | ||||
|  protected: | ||||
|    E* _data; // data array | ||||
|   | ||||
| -  GrowableArrayView<E>(E* data, int initial_max, int initial_len) :
 | ||||
| +  GrowableArrayView(E* data, int initial_max, int initial_len) :
 | ||||
|        GrowableArrayBase(initial_max, initial_len), _data(data) {} | ||||
|   | ||||
|    ~GrowableArrayView() {} | ||||
| diff --git a/src/hotspot/share/utilities/linkedlist.hpp b/src/hotspot/share/utilities/linkedlist.hpp
 | ||||
| index 16ee6a844..2c5ffe6cb 100644
 | ||||
| --- a/src/hotspot/share/utilities/linkedlist.hpp
 | ||||
| +++ b/src/hotspot/share/utilities/linkedlist.hpp
 | ||||
| @@ -82,7 +82,7 @@ template <class E> class LinkedListNode : public ResourceObj {
 | ||||
|  template <class E> class LinkedList : public ResourceObj { | ||||
|   protected: | ||||
|    LinkedListNode<E>*    _head; | ||||
| -  NONCOPYABLE(LinkedList<E>);
 | ||||
| +  NONCOPYABLE(LinkedList);
 | ||||
|   | ||||
|   public: | ||||
|    LinkedList() : _head(NULL) { } | ||||
							
								
								
									
										22
									
								
								Ports/OpenJDK/patches/0003-make-Remove-CUPS-dependency.patch
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								Ports/OpenJDK/patches/0003-make-Remove-CUPS-dependency.patch
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,22 @@ | |||
| From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 | ||||
| From: Timur Sultanov <SultanovTS@yandex.ru> | ||||
| Date: Thu, 17 Feb 2022 09:37:02 +0300 | ||||
| Subject: [PATCH] make: Remove CUPS dependency | ||||
| 
 | ||||
| ---
 | ||||
|  make/autoconf/libraries.m4 | 2 +- | ||||
|  1 file changed, 1 insertion(+), 1 deletion(-) | ||||
| 
 | ||||
| diff --git a/make/autoconf/libraries.m4 b/make/autoconf/libraries.m4
 | ||||
| index a65d91ee9..7c779d012 100644
 | ||||
| --- a/make/autoconf/libraries.m4
 | ||||
| +++ b/make/autoconf/libraries.m4
 | ||||
| @@ -26,7 +26,7 @@
 | ||||
|  # Major library component reside in separate files. | ||||
|  m4_include([lib-alsa.m4]) | ||||
|  m4_include([lib-bundled.m4]) | ||||
| -m4_include([lib-cups.m4])
 | ||||
| +# m4_include([lib-cups.m4])
 | ||||
|  m4_include([lib-ffi.m4]) | ||||
|  m4_include([lib-freetype.m4]) | ||||
|  m4_include([lib-std.m4]) | ||||
|  | @ -0,0 +1,400 @@ | |||
| From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 | ||||
| From: Andrew Kaster <akaster@serenityos.org> | ||||
| Date: Sun, 12 Jun 2022 15:51:39 -0600 | ||||
| Subject: [PATCH] hotspot: Add workarounds for BSD differences from serenity | ||||
| 
 | ||||
| For the most part, we can pretend to be *BSD. | ||||
| 
 | ||||
| However, for some methods, we need to convince hotspot that we're macOS, | ||||
| and others need serenity-specific ifdefs due to the lack of sysctl in | ||||
| serenity. | ||||
| 
 | ||||
| Co-Authored-By: Timur Sultanov <sultanovts@yandex.ru> | ||||
| ---
 | ||||
|  src/hotspot/os/bsd/attachListener_bsd.cpp     | 12 +++ | ||||
|  src/hotspot/os/bsd/osThread_bsd.cpp           |  6 +- | ||||
|  src/hotspot/os/bsd/os_bsd.cpp                 | 76 ++++++++++++++++++- | ||||
|  src/hotspot/os/bsd/os_perf_bsd.cpp            |  4 + | ||||
|  .../os_cpu/bsd_zero/bytes_bsd_zero.hpp        |  2 + | ||||
|  src/hotspot/os_cpu/bsd_zero/os_bsd_zero.cpp   | 18 ++++- | ||||
|  src/hotspot/share/classfile/classLoader.cpp   |  2 +- | ||||
|  7 files changed, 113 insertions(+), 7 deletions(-) | ||||
| 
 | ||||
| diff --git a/src/hotspot/os/bsd/attachListener_bsd.cpp b/src/hotspot/os/bsd/attachListener_bsd.cpp
 | ||||
| index 9daad43dc..092b4d94a 100644
 | ||||
| --- a/src/hotspot/os/bsd/attachListener_bsd.cpp
 | ||||
| +++ b/src/hotspot/os/bsd/attachListener_bsd.cpp
 | ||||
| @@ -358,11 +358,23 @@ BsdAttachOperation* BsdAttachListener::dequeue() {
 | ||||
|      // get the credentials of the peer and check the effective uid/guid | ||||
|      uid_t puid; | ||||
|      gid_t pgid; | ||||
| +#if defined(SERENITY)
 | ||||
| +    struct ucred creds = {};
 | ||||
| +    socklen_t creds_size = sizeof(creds);
 | ||||
| +    if (::getsockopt(s, SOL_SOCKET, SO_PEERCRED, &creds, &creds_size) != 0) {
 | ||||
| +      log_debug(attach)("Failed to get peer id");
 | ||||
| +      ::close(s);
 | ||||
| +      continue;
 | ||||
| +    }
 | ||||
| +    puid = creds.uid;
 | ||||
| +    pgid = creds.gid;
 | ||||
| +#else
 | ||||
|      if (::getpeereid(s, &puid, &pgid) != 0) { | ||||
|        log_debug(attach)("Failed to get peer id"); | ||||
|        ::close(s); | ||||
|        continue; | ||||
|      } | ||||
| +#endif
 | ||||
|   | ||||
|      if (!os::Posix::matches_effective_uid_and_gid_or_root(puid, pgid)) { | ||||
|        log_debug(attach)("euid/egid check failed (%d/%d vs %d/%d)", puid, pgid, | ||||
| diff --git a/src/hotspot/os/bsd/osThread_bsd.cpp b/src/hotspot/os/bsd/osThread_bsd.cpp
 | ||||
| index 9eba7288f..d7164e5d5 100644
 | ||||
| --- a/src/hotspot/os/bsd/osThread_bsd.cpp
 | ||||
| +++ b/src/hotspot/os/bsd/osThread_bsd.cpp
 | ||||
| @@ -31,13 +31,17 @@
 | ||||
|   | ||||
|  void OSThread::pd_initialize() { | ||||
|    assert(this != NULL, "check"); | ||||
| -#ifdef __APPLE__
 | ||||
| +#if defined(__APPLE__) || defined(SERENITY)
 | ||||
|    _thread_id        = 0; | ||||
|  #else | ||||
|    _thread_id        = NULL; | ||||
|  #endif | ||||
|    _unique_thread_id = 0; | ||||
| +#if defined(SERENITY)
 | ||||
| +  _pthread_id       = 0;
 | ||||
| +#else
 | ||||
|    _pthread_id       = NULL; | ||||
| +#endif
 | ||||
|    _siginfo          = NULL; | ||||
|    _ucontext         = NULL; | ||||
|    _expanding_stack  = 0; | ||||
| diff --git a/src/hotspot/os/bsd/os_bsd.cpp b/src/hotspot/os/bsd/os_bsd.cpp
 | ||||
| index 1896c036c..4452b5e9b 100644
 | ||||
| --- a/src/hotspot/os/bsd/os_bsd.cpp
 | ||||
| +++ b/src/hotspot/os/bsd/os_bsd.cpp
 | ||||
| @@ -87,8 +87,10 @@
 | ||||
|  # include <sys/resource.h> | ||||
|  # include <sys/socket.h> | ||||
|  # include <sys/stat.h> | ||||
| +#ifndef SERENITY
 | ||||
|  # include <sys/syscall.h> | ||||
|  # include <sys/sysctl.h> | ||||
| +#endif
 | ||||
|  # include <sys/time.h> | ||||
|  # include <sys/times.h> | ||||
|  # include <sys/types.h> | ||||
| @@ -99,6 +101,12 @@
 | ||||
|    #include <elf.h> | ||||
|  #endif | ||||
|   | ||||
| +#if defined(SERENITY)
 | ||||
| +#include "utilities/decoder_elf.hpp"
 | ||||
| +#include "utilities/elfFile.hpp"
 | ||||
| +#include <cxxabi.h>
 | ||||
| +#endif
 | ||||
| +
 | ||||
|  #ifdef __APPLE__ | ||||
|    #include <mach-o/dyld.h> | ||||
|  #endif | ||||
| @@ -162,6 +170,9 @@ julong os::Bsd::available_memory() {
 | ||||
|  // for more info see : | ||||
|  // https://man.openbsd.org/sysctl.2 | ||||
|  void os::Bsd::print_uptime_info(outputStream* st) { | ||||
| +#ifdef SERENITY
 | ||||
| +  st->print("OS uptime: unknown"); // FIXME: Grab uptime
 | ||||
| +#else
 | ||||
|    struct timeval boottime; | ||||
|    size_t len = sizeof(boottime); | ||||
|    int mib[2]; | ||||
| @@ -173,6 +184,7 @@ void os::Bsd::print_uptime_info(outputStream* st) {
 | ||||
|      time_t currsec = time(NULL); | ||||
|      os::print_dhm(st, "OS uptime:", (long) difftime(currsec, bootsec)); | ||||
|    } | ||||
| +#endif
 | ||||
|  } | ||||
|   | ||||
|  julong os::physical_memory() { | ||||
| @@ -221,6 +233,10 @@ static char cpu_arch[] = "ppc";
 | ||||
|   | ||||
|   | ||||
|  void os::Bsd::initialize_system_info() { | ||||
| +#if defined (SERENITY)
 | ||||
| +  set_processor_count(1); // FIXME
 | ||||
| +  _physical_memory = 256 * 1024 * 1024; // FIXME
 | ||||
| +#else
 | ||||
|    int mib[2]; | ||||
|    size_t len; | ||||
|    int cpu_val; | ||||
| @@ -275,6 +291,7 @@ void os::Bsd::initialize_system_info() {
 | ||||
|      _physical_memory = MIN2(_physical_memory, (julong)limits.rlim_cur); | ||||
|    } | ||||
|  #endif | ||||
| +#endif // SERENITY
 | ||||
|  } | ||||
|   | ||||
|  #ifdef __APPLE__ | ||||
| @@ -363,12 +380,18 @@ void os::init_system_properties_values() {
 | ||||
|      if (pslash != NULL) { | ||||
|        pslash = strrchr(buf, '/'); | ||||
|        if (pslash != NULL) { | ||||
| +#ifdef SERENITY
 | ||||
| +      // no <arch> dir on serenity
 | ||||
| +      *pslash = '\0';        // Get rid of /lib.
 | ||||
| +      }
 | ||||
| +#else
 | ||||
|          *pslash = '\0';          // Get rid of /<arch>. | ||||
|          pslash = strrchr(buf, '/'); | ||||
|          if (pslash != NULL) { | ||||
|            *pslash = '\0';        // Get rid of /lib. | ||||
|          } | ||||
|        } | ||||
| +#endif
 | ||||
|      } | ||||
|      Arguments::set_java_home(buf); | ||||
|      if (!set_boot_path('/', ':')) { | ||||
| @@ -877,6 +900,10 @@ pid_t os::Bsd::gettid() {
 | ||||
|      #else | ||||
|        #ifdef __NetBSD__ | ||||
|    retval = (pid_t) syscall(SYS__lwp_self); | ||||
| +      #else
 | ||||
| +        #ifdef SERENITY
 | ||||
| +         retval = ::gettid();
 | ||||
| +        #endif
 | ||||
|        #endif | ||||
|      #endif | ||||
|    #endif | ||||
| @@ -885,6 +912,7 @@ pid_t os::Bsd::gettid() {
 | ||||
|    if (retval == -1) { | ||||
|      return getpid(); | ||||
|    } | ||||
| +  return retval;
 | ||||
|  } | ||||
|   | ||||
|  intx os::current_thread_id() { | ||||
| @@ -942,6 +970,25 @@ bool os::address_is_in_vm(address addr) {
 | ||||
|    return false; | ||||
|  } | ||||
|   | ||||
| +#ifdef SERENITY
 | ||||
| +// We put this here so that we don't need to add an entire file just to dup this method from the linux decoder
 | ||||
| +bool ElfDecoder::demangle(const char* symbol, char *buf, int buflen) {
 | ||||
| +  int   status;
 | ||||
| +  char* result;
 | ||||
| +  size_t size = (size_t)buflen;
 | ||||
| +
 | ||||
| +  // Don't pass buf to __cxa_demangle. In case of the 'buf' is too small,
 | ||||
| +  // __cxa_demangle will call system "realloc" for additional memory, which
 | ||||
| +  // may use different malloc/realloc mechanism that allocates 'buf'.
 | ||||
| +  if ((result = abi::__cxa_demangle(symbol, NULL, NULL, &status)) != NULL) {
 | ||||
| +    jio_snprintf(buf, buflen, "%s", result);
 | ||||
| +      // call c library's free
 | ||||
| +      ::free(result);
 | ||||
| +      return true;
 | ||||
| +  }
 | ||||
| +  return false;
 | ||||
| +}
 | ||||
| +#endif // SERENITY
 | ||||
|   | ||||
|  #define MACH_MAXSYMLEN 256 | ||||
|   | ||||
| @@ -1013,7 +1060,7 @@ bool os::dll_address_to_library_name(address addr, char* buf,
 | ||||
|  // in case of error it checks if .dll/.so was built for the | ||||
|  // same architecture as Hotspot is running on | ||||
|   | ||||
| -#ifdef __APPLE__
 | ||||
| +#if defined(__APPLE__) || defined(SERENITY)
 | ||||
|  void * os::dll_load(const char *filename, char *ebuf, int ebuflen) { | ||||
|  #ifdef STATIC_BUILD | ||||
|    return os::get_default_process_handle(); | ||||
| @@ -1226,7 +1273,7 @@ void * os::dll_load(const char *filename, char *ebuf, int ebuflen) {
 | ||||
|    return NULL; | ||||
|  #endif // STATIC_BUILD | ||||
|  } | ||||
| -#endif // !__APPLE__
 | ||||
| +#endif // !__APPLE__ || !SERENITY
 | ||||
|   | ||||
|  void* os::get_default_process_handle() { | ||||
|  #ifdef __APPLE__ | ||||
| @@ -1305,6 +1352,7 @@ int os::get_loaded_modules_info(os::LoadedModulesCallbackFunc callback, void *pa
 | ||||
|  } | ||||
|   | ||||
|  void os::get_summary_os_info(char* buf, size_t buflen) { | ||||
| +#ifndef SERENITY
 | ||||
|    // These buffers are small because we want this to be brief | ||||
|    // and not use a lot of stack while generating the hs_err file. | ||||
|    char os[100]; | ||||
| @@ -1342,6 +1390,10 @@ void os::get_summary_os_info(char* buf, size_t buflen) {
 | ||||
|        snprintf(buf, buflen, "%s %s, macOS %s (%s)", os, release, osproductversion, build); | ||||
|      } | ||||
|    } else | ||||
| +#endif
 | ||||
| +#else
 | ||||
| +  const char os[] = "SerenityOS";
 | ||||
| +  const char release[] = "1.0-dev";
 | ||||
|  #endif | ||||
|    snprintf(buf, buflen, "%s %s", os, release); | ||||
|  } | ||||
| @@ -1369,6 +1421,7 @@ void os::pd_print_cpu_info(outputStream* st, char* buf, size_t buflen) {
 | ||||
|  } | ||||
|   | ||||
|  void os::get_summary_cpu_info(char* buf, size_t buflen) { | ||||
| +#ifndef SERENITY
 | ||||
|    unsigned int mhz; | ||||
|    size_t size = sizeof(mhz); | ||||
|    int mib[] = { CTL_HW, HW_CPU_FREQ }; | ||||
| @@ -1399,9 +1452,13 @@ void os::get_summary_cpu_info(char* buf, size_t buflen) {
 | ||||
|    } | ||||
|  #endif | ||||
|    snprintf(buf, buflen, "\"%s\" %s%s %d MHz", model, machine, emulated, mhz); | ||||
| +#else
 | ||||
| +  snprintf(buf, buflen, "%s", "FIXME: Implement CPU Info");
 | ||||
| +#endif
 | ||||
|  } | ||||
|   | ||||
|  void os::print_memory_info(outputStream* st) { | ||||
| +#ifndef SERENITY
 | ||||
|    xsw_usage swap_usage; | ||||
|    size_t size = sizeof(swap_usage); | ||||
|   | ||||
| @@ -1423,6 +1480,9 @@ void os::print_memory_info(outputStream* st) {
 | ||||
|    } | ||||
|   | ||||
|    st->cr(); | ||||
| +#else
 | ||||
| +  st->print("Memory: FIXME unknown");
 | ||||
| +#endif
 | ||||
|  } | ||||
|   | ||||
|  static char saved_jvm_path[MAXPATHLEN] = {0}; | ||||
| @@ -1584,6 +1644,10 @@ bool os::pd_commit_memory(char* addr, size_t size, bool exec) {
 | ||||
|      } | ||||
|    } | ||||
|  #else | ||||
| +  #if defined(SERENITY)
 | ||||
| +  // FIXME: Mount location of java install with MS_WXALLOWED and MS_AXALLOWED
 | ||||
| +  prot &= ~PROT_EXEC;
 | ||||
| +  #endif
 | ||||
|    uintptr_t res = (uintptr_t) ::mmap(addr, size, prot, | ||||
|                                       MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0); | ||||
|    if (res != (uintptr_t) MAP_FAILED) { | ||||
| @@ -1994,6 +2058,10 @@ OSReturn os::get_native_priority(const Thread* const thread, int *priority_ptr)
 | ||||
|  extern void report_error(char* file_name, int line_no, char* title, | ||||
|                           char* format, ...); | ||||
|   | ||||
| +#if defined(SERENITY) && !defined(CLK_TCK)
 | ||||
| +#define CLK_TCK 100
 | ||||
| +#endif
 | ||||
| +
 | ||||
|  // this is called _before_ the most of global arguments have been parsed | ||||
|  void os::init(void) { | ||||
|    char dummy;   // used to get a guess on initial stack address | ||||
| @@ -2535,7 +2603,11 @@ bool os::is_thread_cpu_time_supported() {
 | ||||
|  // Bsd doesn't yet have a (official) notion of processor sets, | ||||
|  // so just return the system wide load average. | ||||
|  int os::loadavg(double loadavg[], int nelem) { | ||||
| +#ifdef SERENITY
 | ||||
| +  return -1;
 | ||||
| +#else
 | ||||
|    return ::getloadavg(loadavg, nelem); | ||||
| +#endif
 | ||||
|  } | ||||
|   | ||||
|  void os::pause() { | ||||
| diff --git a/src/hotspot/os/bsd/os_perf_bsd.cpp b/src/hotspot/os/bsd/os_perf_bsd.cpp
 | ||||
| index e69bfc795..4e67e2e4b 100644
 | ||||
| --- a/src/hotspot/os/bsd/os_perf_bsd.cpp
 | ||||
| +++ b/src/hotspot/os/bsd/os_perf_bsd.cpp
 | ||||
| @@ -425,6 +425,9 @@ NetworkPerformanceInterface::NetworkPerformance::~NetworkPerformance() {
 | ||||
|  } | ||||
|   | ||||
|  int NetworkPerformanceInterface::NetworkPerformance::network_utilization(NetworkInterface** network_interfaces) const { | ||||
| +#ifdef SERENITY
 | ||||
| +  return OS_ERR; // FIXME: Get stats from Network interface daemon
 | ||||
| +#else
 | ||||
|    size_t len; | ||||
|    int mib[] = {CTL_NET, PF_ROUTE, /* protocol number */ 0, /* address family */ 0, NET_RT_IFLIST2, /* NET_RT_FLAGS mask*/ 0}; | ||||
|    if (sysctl(mib, sizeof(mib) / sizeof(mib[0]), NULL, &len, NULL, 0) != 0) { | ||||
| @@ -464,6 +467,7 @@ int NetworkPerformanceInterface::NetworkPerformance::network_utilization(Network
 | ||||
|    *network_interfaces = ret; | ||||
|   | ||||
|    return OS_OK; | ||||
| +#endif
 | ||||
|  } | ||||
|   | ||||
|  NetworkPerformanceInterface::NetworkPerformanceInterface() { | ||||
| diff --git a/src/hotspot/os_cpu/bsd_zero/bytes_bsd_zero.hpp b/src/hotspot/os_cpu/bsd_zero/bytes_bsd_zero.hpp
 | ||||
| index 0da7ecc78..bd1ee9a67 100644
 | ||||
| --- a/src/hotspot/os_cpu/bsd_zero/bytes_bsd_zero.hpp
 | ||||
| +++ b/src/hotspot/os_cpu/bsd_zero/bytes_bsd_zero.hpp
 | ||||
| @@ -30,6 +30,8 @@
 | ||||
|   | ||||
|  #ifdef __APPLE__ | ||||
|  #  include <libkern/OSByteOrder.h> | ||||
| +#elif defined(SERENITY)
 | ||||
| +#  include <endian.h>
 | ||||
|  #else | ||||
|  #  include <sys/endian.h> | ||||
|  #endif | ||||
| diff --git a/src/hotspot/os_cpu/bsd_zero/os_bsd_zero.cpp b/src/hotspot/os_cpu/bsd_zero/os_bsd_zero.cpp
 | ||||
| index a9fda1d4b..494f073ac 100644
 | ||||
| --- a/src/hotspot/os_cpu/bsd_zero/os_bsd_zero.cpp
 | ||||
| +++ b/src/hotspot/os_cpu/bsd_zero/os_bsd_zero.cpp
 | ||||
| @@ -23,11 +23,15 @@
 | ||||
|   * | ||||
|   */ | ||||
|   | ||||
| -#if !defined(__APPLE__) && !defined(__NetBSD__)
 | ||||
| +#if !defined(__APPLE__) && !defined(__NetBSD__) && !defined(SERENITY)
 | ||||
|  #include <pthread.h> | ||||
|  # include <pthread_np.h> /* For pthread_attr_get_np */ | ||||
|  #endif | ||||
|   | ||||
| +#if defined(SERENITY)
 | ||||
| +#  include <serenity.h>
 | ||||
| +#endif
 | ||||
| +
 | ||||
|  // no precompiled headers | ||||
|  #include "jvm.h" | ||||
|  #include "asm/assembler.inline.hpp" | ||||
| @@ -56,8 +60,7 @@
 | ||||
|  #include "utilities/vmError.hpp" | ||||
|   | ||||
|  address os::current_stack_pointer() { | ||||
| -  address dummy = (address) &dummy;
 | ||||
| -  return dummy;
 | ||||
| +  return (address) __builtin_frame_address(0);
 | ||||
|  } | ||||
|   | ||||
|  frame os::get_sender_for_C_frame(frame* fr) { | ||||
| @@ -194,6 +197,15 @@ static void current_stack_region(address *bottom, size_t *size) {
 | ||||
|    stack_top = (address) ss.ss_sp; | ||||
|    stack_bytes  = ss.ss_size; | ||||
|    stack_bottom = stack_top - stack_bytes; | ||||
| +#elif defined(SERENITY)
 | ||||
| +  uintptr_t real_stack_bottom = 0;
 | ||||
| +  int rslt = get_stack_bounds(&real_stack_bottom, &stack_bytes);
 | ||||
| +
 | ||||
| +  if (rslt < 0)
 | ||||
| +    fatal("get_stack_bounds failed with error = " INT32_FORMAT, rslt);
 | ||||
| +
 | ||||
| +  stack_bottom = (address)real_stack_bottom;
 | ||||
| +  stack_top = stack_bottom + stack_bytes;
 | ||||
|  #else | ||||
|    pthread_attr_t attr; | ||||
|   | ||||
| diff --git a/src/hotspot/share/classfile/classLoader.cpp b/src/hotspot/share/classfile/classLoader.cpp
 | ||||
| index 0287b73e5..101299b2f 100644
 | ||||
| --- a/src/hotspot/share/classfile/classLoader.cpp
 | ||||
| +++ b/src/hotspot/share/classfile/classLoader.cpp
 | ||||
| @@ -249,7 +249,7 @@ ClassFileStream* ClassPathDirEntry::open_stream(JavaThread* current, const char*
 | ||||
|    struct stat st; | ||||
|    if (os::stat(path, &st) == 0) { | ||||
|      // found file, open it | ||||
| -    int file_handle = os::open(path, 0, 0);
 | ||||
| +    int file_handle = os::open(path, O_RDONLY, 0);
 | ||||
|      if (file_handle != -1) { | ||||
|        // read contents into resource array | ||||
|        u1* buffer = NEW_RESOURCE_ARRAY(u1, st.st_size); | ||||
|  | @ -0,0 +1,268 @@ | |||
| From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 | ||||
| From: Timur Sultanov <sultanovts@yandex.ru> | ||||
| Date: Sun, 12 Jun 2022 13:55:07 -0600 | ||||
| Subject: [PATCH] hotspot: Update non-BSD native modules for Serenity | ||||
| 
 | ||||
| Co-Authored-By: Andrew Kaster <akaster@serenityos.org> | ||||
| ---
 | ||||
|  src/hotspot/os/posix/os_posix.cpp             | 23 ++++++++++++++++++- | ||||
|  src/hotspot/os/posix/signals_posix.cpp        | 12 ++++++++++ | ||||
|  src/hotspot/share/runtime/os.cpp              |  6 ++++- | ||||
|  src/hotspot/share/runtime/os.hpp              |  2 +- | ||||
|  src/hotspot/share/runtime/semaphore.hpp       |  2 +- | ||||
|  .../share/utilities/globalDefinitions.hpp     |  4 ++++ | ||||
|  .../share/utilities/globalDefinitions_gcc.hpp |  6 ++--- | ||||
|  src/hotspot/share/utilities/ostream.cpp       |  2 +- | ||||
|  8 files changed, 49 insertions(+), 8 deletions(-) | ||||
| 
 | ||||
| diff --git a/src/hotspot/os/posix/os_posix.cpp b/src/hotspot/os/posix/os_posix.cpp
 | ||||
| index 9eb1fcbcc..0676cb83d 100644
 | ||||
| --- a/src/hotspot/os/posix/os_posix.cpp
 | ||||
| +++ b/src/hotspot/os/posix/os_posix.cpp
 | ||||
| @@ -65,7 +65,9 @@
 | ||||
|  #include <sys/wait.h> | ||||
|  #include <time.h> | ||||
|  #include <unistd.h> | ||||
| +#ifndef SERENITY
 | ||||
|  #include <utmpx.h> | ||||
| +#endif
 | ||||
|   | ||||
|  #ifdef __APPLE__ | ||||
|    #include <crt_externs.h> | ||||
| @@ -272,7 +274,12 @@ static int util_posix_fallocate(int fd, off_t offset, off_t len) {
 | ||||
|    } | ||||
|    return -1; | ||||
|  #else | ||||
| +#ifndef SERENITY
 | ||||
|    return posix_fallocate(fd, offset, len); | ||||
| +#else
 | ||||
| +  // YOLO
 | ||||
| +  return 0;
 | ||||
| +#endif
 | ||||
|  #endif | ||||
|  } | ||||
|   | ||||
| @@ -418,6 +425,7 @@ void os::Posix::print_load_average(outputStream* st) {
 | ||||
|  // unfortunately it does not work on macOS and Linux because the utx chain has no entry | ||||
|  // for reboot at least on my test machines | ||||
|  void os::Posix::print_uptime_info(outputStream* st) { | ||||
| +#ifndef SERENITY
 | ||||
|    int bootsec = -1; | ||||
|    int currsec = time(NULL); | ||||
|    struct utmpx* ent; | ||||
| @@ -432,6 +440,9 @@ void os::Posix::print_uptime_info(outputStream* st) {
 | ||||
|    if (bootsec != -1) { | ||||
|      os::print_dhm(st, "OS uptime:", (long) (currsec-bootsec)); | ||||
|    } | ||||
| +#else
 | ||||
| +    st->print("OS uptime: not implemented");
 | ||||
| +#endif
 | ||||
|  } | ||||
|   | ||||
|  static void print_rlimit(outputStream* st, const char* msg, | ||||
| @@ -470,7 +481,9 @@ void os::Posix::print_rlimit_info(outputStream* st) {
 | ||||
|   | ||||
|    print_rlimit(st, ", THREADS", RLIMIT_THREADS); | ||||
|  #else | ||||
| +#ifndef SERENITY
 | ||||
|    print_rlimit(st, ", NPROC", RLIMIT_NPROC); | ||||
| +#endif
 | ||||
|  #endif | ||||
|   | ||||
|    print_rlimit(st, ", NOFILE", RLIMIT_NOFILE); | ||||
| @@ -638,7 +651,11 @@ void os::dll_unload(void *lib) {
 | ||||
|  } | ||||
|   | ||||
|  jlong os::lseek(int fd, jlong offset, int whence) { | ||||
| +#ifdef SERENITY
 | ||||
| +  return (jlong) ::lseek(fd, offset, whence);
 | ||||
| +#else
 | ||||
|    return (jlong) BSD_ONLY(::lseek) NOT_BSD(::lseek64)(fd, offset, whence); | ||||
| +#endif
 | ||||
|  } | ||||
|   | ||||
|  int os::fsync(int fd) { | ||||
| @@ -646,7 +663,11 @@ int os::fsync(int fd) {
 | ||||
|  } | ||||
|   | ||||
|  int os::ftruncate(int fd, jlong length) { | ||||
| -   return BSD_ONLY(::ftruncate) NOT_BSD(::ftruncate64)(fd, length);
 | ||||
| +#ifdef SERENITY
 | ||||
| +  return ::ftruncate(fd, length);
 | ||||
| +#else
 | ||||
| +  return BSD_ONLY(::ftruncate) NOT_BSD(::ftruncate64)(fd, length);
 | ||||
| +#endif
 | ||||
|  } | ||||
|   | ||||
|  const char* os::get_current_directory(char *buf, size_t buflen) { | ||||
| diff --git a/src/hotspot/os/posix/signals_posix.cpp b/src/hotspot/os/posix/signals_posix.cpp
 | ||||
| index 2c020a794..9f3316f5b 100644
 | ||||
| --- a/src/hotspot/os/posix/signals_posix.cpp
 | ||||
| +++ b/src/hotspot/os/posix/signals_posix.cpp
 | ||||
| @@ -552,6 +552,8 @@ public:
 | ||||
|  #define JVM_HANDLE_XXX_SIGNAL JVM_handle_aix_signal | ||||
|  #elif defined(LINUX) | ||||
|  #define JVM_HANDLE_XXX_SIGNAL JVM_handle_linux_signal | ||||
| +#elif defined(SERENITY)
 | ||||
| +#define JVM_HANDLE_XXX_SIGNAL JVM_handle_serenity_signal
 | ||||
|  #else | ||||
|  #error who are you? | ||||
|  #endif | ||||
| @@ -933,8 +935,10 @@ static bool get_signal_code_description(const siginfo_t* si, enum_sigcode_desc_t
 | ||||
|      { SIGFPE,  FPE_FLTRES,   "FPE_FLTRES",   "Floating-point inexact result." }, | ||||
|      { SIGFPE,  FPE_FLTINV,   "FPE_FLTINV",   "Invalid floating-point operation." }, | ||||
|      { SIGFPE,  FPE_FLTSUB,   "FPE_FLTSUB",   "Subscript out of range." }, | ||||
| +#ifndef SERENITY
 | ||||
|      { SIGSEGV, SEGV_MAPERR,  "SEGV_MAPERR",  "Address not mapped to object." }, | ||||
|      { SIGSEGV, SEGV_ACCERR,  "SEGV_ACCERR",  "Invalid permissions for mapped object." }, | ||||
| +#endif
 | ||||
|  #if defined(AIX) | ||||
|      // no explanation found what keyerr would be | ||||
|      { SIGSEGV, SEGV_KEYERR,  "SEGV_KEYERR",  "key error" }, | ||||
| @@ -942,11 +946,13 @@ static bool get_signal_code_description(const siginfo_t* si, enum_sigcode_desc_t
 | ||||
|  #if defined(IA64) && !defined(AIX) | ||||
|      { SIGSEGV, SEGV_PSTKOVF, "SEGV_PSTKOVF", "Paragraph stack overflow" }, | ||||
|  #endif | ||||
| +#ifndef SERENITY
 | ||||
|      { SIGBUS,  BUS_ADRALN,   "BUS_ADRALN",   "Invalid address alignment." }, | ||||
|      { SIGBUS,  BUS_ADRERR,   "BUS_ADRERR",   "Nonexistent physical address." }, | ||||
|      { SIGBUS,  BUS_OBJERR,   "BUS_OBJERR",   "Object-specific hardware error." }, | ||||
|      { SIGTRAP, TRAP_BRKPT,   "TRAP_BRKPT",   "Process breakpoint." }, | ||||
|      { SIGTRAP, TRAP_TRACE,   "TRAP_TRACE",   "Process trace trap." }, | ||||
| +#endif
 | ||||
|      { SIGCHLD, CLD_EXITED,   "CLD_EXITED",   "Child has exited." }, | ||||
|      { SIGCHLD, CLD_KILLED,   "CLD_KILLED",   "Child has terminated abnormally and did not create a core file." }, | ||||
|      { SIGCHLD, CLD_DUMPED,   "CLD_DUMPED",   "Child has terminated abnormally and created a core file." }, | ||||
| @@ -967,11 +973,17 @@ static bool get_signal_code_description(const siginfo_t* si, enum_sigcode_desc_t
 | ||||
|    const struct { | ||||
|      int code; const char* s_code; const char* s_desc; | ||||
|    } t2 [] = { | ||||
| +    { SIGTRAP,      "SIGTRAP",   "SIGTRAP FIXME" },
 | ||||
| +    { SIGBUS,       "SIGBUS",   "SIGBUS FIXME" },
 | ||||
| +    { SIGILL,       "SIGILL",   "Illegal opcode FIXME." },
 | ||||
| +    { SIGSEGV,      "SIGSEGV",  "SIGSEGV FIXME" },
 | ||||
| +#ifndef SERENITY
 | ||||
|      { SI_USER,      "SI_USER",     "Signal sent by kill()." }, | ||||
|      { SI_QUEUE,     "SI_QUEUE",    "Signal sent by the sigqueue()." }, | ||||
|      { SI_TIMER,     "SI_TIMER",    "Signal generated by expiration of a timer set by timer_settime()." }, | ||||
|      { SI_ASYNCIO,   "SI_ASYNCIO",  "Signal generated by completion of an asynchronous I/O request." }, | ||||
|      { SI_MESGQ,     "SI_MESGQ",    "Signal generated by arrival of a message on an empty message queue." }, | ||||
| +#endif
 | ||||
|      // Linux specific | ||||
|  #ifdef SI_TKILL | ||||
|      { SI_TKILL,     "SI_TKILL",    "Signal sent by tkill (pthread_kill)" }, | ||||
| diff --git a/src/hotspot/share/runtime/os.cpp b/src/hotspot/share/runtime/os.cpp
 | ||||
| index 9b8e667f9..4e9a5f0e6 100644
 | ||||
| --- a/src/hotspot/share/runtime/os.cpp
 | ||||
| +++ b/src/hotspot/share/runtime/os.cpp
 | ||||
| @@ -155,7 +155,7 @@ char* os::iso8601_time(jlong milliseconds_since_19700101, char* buffer, size_t b
 | ||||
|    // No offset when dealing with UTC | ||||
|    time_t UTC_to_local = 0; | ||||
|    if (!utc) { | ||||
| -#if defined(_ALLBSD_SOURCE) || defined(_GNU_SOURCE)
 | ||||
| +#if (defined(_ALLBSD_SOURCE) || defined(_GNU_SOURCE)) && !defined(SERENITY)
 | ||||
|      UTC_to_local = -(time_struct.tm_gmtoff); | ||||
|  #elif defined(_WINDOWS) | ||||
|      long zone; | ||||
| @@ -1502,6 +1502,7 @@ size_t os::page_size_for_region_unaligned(size_t region_size, size_t min_pages)
 | ||||
|  } | ||||
|   | ||||
|  static const char* errno_to_string (int e, bool short_text) { | ||||
| +#ifndef SERENITY
 | ||||
|    #define ALL_SHARED_ENUMS(X) \ | ||||
|      X(E2BIG, "Argument list too long") \ | ||||
|      X(EACCES, "Permission denied") \ | ||||
| @@ -1579,6 +1580,9 @@ static const char* errno_to_string (int e, bool short_text) {
 | ||||
|      X(ETXTBSY, "Text file busy") \ | ||||
|      X(EWOULDBLOCK, "Operation would block") \ | ||||
|      X(EXDEV, "Cross-device link") | ||||
| +#else
 | ||||
| +  #define ALL_SHARED_ENUMS(X) ENUMERATE_ERRNO_CODES(X)
 | ||||
| +#endif
 | ||||
|   | ||||
|    #define DEFINE_ENTRY(e, text) { e, #e, text }, | ||||
|   | ||||
| diff --git a/src/hotspot/share/runtime/os.hpp b/src/hotspot/share/runtime/os.hpp
 | ||||
| index 7eaaa9db9..50591f707 100644
 | ||||
| --- a/src/hotspot/share/runtime/os.hpp
 | ||||
| +++ b/src/hotspot/share/runtime/os.hpp
 | ||||
| @@ -468,7 +468,7 @@ class os: AllStatic {
 | ||||
|    // need special-case handling of the primordial thread if it attaches | ||||
|    // to the VM. | ||||
|    static bool is_primordial_thread(void) | ||||
| -#if defined(_WINDOWS) || defined(BSD)
 | ||||
| +#if defined(_WINDOWS) || defined(BSD) || defined(SERENITY)
 | ||||
|      // No way to identify the primordial thread. | ||||
|      { return false; } | ||||
|  #else | ||||
| diff --git a/src/hotspot/share/runtime/semaphore.hpp b/src/hotspot/share/runtime/semaphore.hpp
 | ||||
| index 0e19c101d..afc007e7a 100644
 | ||||
| --- a/src/hotspot/share/runtime/semaphore.hpp
 | ||||
| +++ b/src/hotspot/share/runtime/semaphore.hpp
 | ||||
| @@ -28,7 +28,7 @@
 | ||||
|  #include "memory/allocation.hpp" | ||||
|  #include "utilities/globalDefinitions.hpp" | ||||
|   | ||||
| -#if defined(LINUX) || defined(AIX)
 | ||||
| +#if defined(LINUX) || defined(AIX) || defined(SERENITY)
 | ||||
|  # include "semaphore_posix.hpp" | ||||
|  #elif defined(BSD) | ||||
|  # include "semaphore_bsd.hpp" | ||||
| diff --git a/src/hotspot/share/utilities/globalDefinitions.hpp b/src/hotspot/share/utilities/globalDefinitions.hpp
 | ||||
| index 082a3272c..65157b52e 100644
 | ||||
| --- a/src/hotspot/share/utilities/globalDefinitions.hpp
 | ||||
| +++ b/src/hotspot/share/utilities/globalDefinitions.hpp
 | ||||
| @@ -1209,5 +1209,9 @@ template<typename K> bool primitive_equals(const K& k0, const K& k1) {
 | ||||
|    return k0 == k1; | ||||
|  } | ||||
|   | ||||
| +#ifdef SERENITY
 | ||||
| +#define MAX2(a,b)          ((a)>(b)?(a):(b))
 | ||||
| +#define alloca(p)              __builtin_alloca(p)
 | ||||
| +#endif
 | ||||
|   | ||||
|  #endif // SHARE_UTILITIES_GLOBALDEFINITIONS_HPP | ||||
| diff --git a/src/hotspot/share/utilities/globalDefinitions_gcc.hpp b/src/hotspot/share/utilities/globalDefinitions_gcc.hpp
 | ||||
| index 30cca9ee7..7cac45142 100644
 | ||||
| --- a/src/hotspot/share/utilities/globalDefinitions_gcc.hpp
 | ||||
| +++ b/src/hotspot/share/utilities/globalDefinitions_gcc.hpp
 | ||||
| @@ -48,7 +48,7 @@
 | ||||
|  #include <limits.h> | ||||
|  #include <errno.h> | ||||
|   | ||||
| -#if defined(LINUX) || defined(_ALLBSD_SOURCE)
 | ||||
| +#if defined(LINUX) || defined(_ALLBSD_SOURCE) || defined(SERENITY)
 | ||||
|  #include <inttypes.h> | ||||
|  #include <signal.h> | ||||
|  #ifndef __OpenBSD__ | ||||
| @@ -79,7 +79,7 @@
 | ||||
|    #define NULL_WORD  NULL | ||||
|  #endif | ||||
|   | ||||
| -#if !defined(LINUX) && !defined(_ALLBSD_SOURCE)
 | ||||
| +#if !defined(LINUX) && !defined(_ALLBSD_SOURCE) && !defined(SERENITY)
 | ||||
|  // Compiler-specific primitive types | ||||
|  typedef unsigned short     uint16_t; | ||||
|  #ifndef _UINT32_T | ||||
| @@ -111,7 +111,7 @@ typedef uint64_t julong;
 | ||||
|  // checking for nanness | ||||
|  #if defined(__APPLE__) | ||||
|  inline int g_isnan(double f) { return isnan(f); } | ||||
| -#elif defined(LINUX) || defined(_ALLBSD_SOURCE)
 | ||||
| +#elif defined(LINUX) || defined(_ALLBSD_SOURCE) || defined(SERENITY)
 | ||||
|  inline int g_isnan(float  f) { return isnan(f); } | ||||
|  inline int g_isnan(double f) { return isnan(f); } | ||||
|  #else | ||||
| diff --git a/src/hotspot/share/utilities/ostream.cpp b/src/hotspot/share/utilities/ostream.cpp
 | ||||
| index 04995064f..e25c3a429 100644
 | ||||
| --- a/src/hotspot/share/utilities/ostream.cpp
 | ||||
| +++ b/src/hotspot/share/utilities/ostream.cpp
 | ||||
| @@ -1065,7 +1065,7 @@ bufferedStream::~bufferedStream() {
 | ||||
|   | ||||
|  #ifndef PRODUCT | ||||
|   | ||||
| -#if defined(LINUX) || defined(AIX) || defined(_ALLBSD_SOURCE)
 | ||||
| +#if defined(LINUX) || defined(AIX) || defined(_ALLBSD_SOURCE) || defined(SERENITY)
 | ||||
|  #include <sys/types.h> | ||||
|  #include <sys/socket.h> | ||||
|  #include <netinet/in.h> | ||||
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							|  | @ -0,0 +1,606 @@ | |||
| From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 | ||||
| From: Timur Sultanov <SultanovTS@yandex.ru> | ||||
| Date: Wed, 16 Feb 2022 21:06:23 +0300 | ||||
| Subject: [PATCH] java.base: Update native modules to support Serenity | ||||
| 
 | ||||
| ---
 | ||||
|  .../nio/ch/SocketOptionRegistry.java.template | 21 +++++ | ||||
|  src/java.base/share/native/libjava/io_util.h  |  5 +- | ||||
|  src/java.base/share/native/libjli/jli_util.h  |  3 + | ||||
|  src/java.base/share/native/libzip/zip_util.c  |  2 +- | ||||
|  .../sun/nio/fs/UnixConstants.java.template    | 92 ++++++++++++++++++- | ||||
|  .../native/libjava/ProcessHandleImpl_unix.c   |  2 +- | ||||
|  .../unix/native/libjava/TimeZone_md.c         |  4 +- | ||||
|  .../unix/native/libjava/io_util_md.c          |  2 +- | ||||
|  .../unix/native/libjava/io_util_md.h          |  6 +- | ||||
|  src/java.base/unix/native/libjsig/jsig.c      |  4 + | ||||
|  .../unix/native/libnet/Inet4AddressImpl.c     |  3 + | ||||
|  .../unix/native/libnet/Inet6AddressImpl.c     |  4 + | ||||
|  .../unix/native/libnet/NetworkInterface.c     | 11 ++- | ||||
|  .../unix/native/libnet/net_util_md.h          |  4 + | ||||
|  .../unix/native/libnio/MappedMemoryUtils.c    |  4 + | ||||
|  .../native/libnio/ch/DatagramDispatcher.c     |  1 + | ||||
|  .../unix/native/libnio/ch/FileChannelImpl.c   |  3 + | ||||
|  .../native/libnio/ch/FileDispatcherImpl.c     |  7 +- | ||||
|  src/java.base/unix/native/libnio/ch/FileKey.c |  2 +- | ||||
|  .../unix/native/libnio/ch/NativeThread.c      |  2 +- | ||||
|  src/java.base/unix/native/libnio/ch/Net.c     |  2 +- | ||||
|  .../native/libnio/fs/UnixNativeDispatcher.c   | 39 +++++++- | ||||
|  22 files changed, 207 insertions(+), 16 deletions(-) | ||||
| 
 | ||||
| diff --git a/src/java.base/share/classes/sun/nio/ch/SocketOptionRegistry.java.template b/src/java.base/share/classes/sun/nio/ch/SocketOptionRegistry.java.template
 | ||||
| index 0672ced15..55bde3569 100644
 | ||||
| --- a/src/java.base/share/classes/sun/nio/ch/SocketOptionRegistry.java.template
 | ||||
| +++ b/src/java.base/share/classes/sun/nio/ch/SocketOptionRegistry.java.template
 | ||||
| @@ -50,6 +50,24 @@
 | ||||
|  #endif | ||||
|  #endif | ||||
|   | ||||
| +#define SO_RCVTIMEO 0
 | ||||
| +#define SO_SNDTIMEO 1
 | ||||
| +#define SO_TYPE 2
 | ||||
| +#define SO_ERROR 3
 | ||||
| +#define SO_PEERCRED 4
 | ||||
| +#define SO_SNDBUF 5
 | ||||
| +#define SO_RCVBUF 6
 | ||||
| +#define SO_DEBUG 7
 | ||||
| +#define SO_REUSEADDR 8
 | ||||
| +#define SO_BINDTODEVICE 9
 | ||||
| +#define SO_KEEPALIVE 10
 | ||||
| +#define SO_TIMESTAMP 11
 | ||||
| +#define SO_BROADCAST 12
 | ||||
| +#define SO_LINGER 13
 | ||||
| +#define SO_ACCEPTCONN 14
 | ||||
| +#define SO_DONTROUTE 15
 | ||||
| +#define SO_OOBINLINE 16
 | ||||
| +
 | ||||
|  /* To be able to name the Java constants the same as the C constants without | ||||
|     having the preprocessor rewrite those identifiers, add PREFIX_ to all | ||||
|     identifiers matching a C constant. The PREFIX_ is filtered out in the | ||||
| @@ -125,6 +143,9 @@ class SocketOptionRegistry {
 | ||||
|   | ||||
|  #ifdef AF_INET6 | ||||
|              // IPPROTO_IPV6 is 41 | ||||
| +#ifdef SERENITY
 | ||||
| +#define IPV6_TCLASS 1
 | ||||
| +#endif
 | ||||
|              map.put(new RegistryKey(StandardSocketOptions.PREFIX_IP_TOS, | ||||
|                  StandardProtocolFamily.INET6), new OptionKey(41, IPV6_TCLASS)); | ||||
|              map.put(new RegistryKey(StandardSocketOptions.PREFIX_IP_MULTICAST_IF, | ||||
| diff --git a/src/java.base/share/native/libjava/io_util.h b/src/java.base/share/native/libjava/io_util.h
 | ||||
| index 6e960c034..cbd1d087e 100644
 | ||||
| --- a/src/java.base/share/native/libjava/io_util.h
 | ||||
| +++ b/src/java.base/share/native/libjava/io_util.h
 | ||||
| @@ -30,11 +30,14 @@ extern jfieldID IO_fd_fdID;
 | ||||
|  extern jfieldID IO_handle_fdID; | ||||
|  extern jfieldID IO_append_fdID; | ||||
|   | ||||
| -#ifdef _ALLBSD_SOURCE
 | ||||
| +#if defined(_ALLBSD_SOURCE) || defined(SERENITY)
 | ||||
|  #include <fcntl.h> | ||||
|  #ifndef O_SYNC | ||||
|  #define O_SYNC  O_FSYNC | ||||
|  #endif | ||||
| +#if defined(SERENITY)
 | ||||
| +#define O_DSYNC O_SYNC
 | ||||
| +#endif
 | ||||
|  #ifndef O_DSYNC | ||||
|  #define O_DSYNC O_FSYNC | ||||
|  #endif | ||||
| diff --git a/src/java.base/share/native/libjli/jli_util.h b/src/java.base/share/native/libjli/jli_util.h
 | ||||
| index 3512b1e96..e60f7581f 100644
 | ||||
| --- a/src/java.base/share/native/libjli/jli_util.h
 | ||||
| +++ b/src/java.base/share/native/libjli/jli_util.h
 | ||||
| @@ -108,6 +108,9 @@ JLI_CmdToArgs(char *cmdline);
 | ||||
|  #define _LARGFILE64_SOURCE | ||||
|  #define JLI_Lseek                       lseek64 | ||||
|  #endif | ||||
| +#ifdef SERENITY
 | ||||
| +#define JLI_Lseek                       lseek
 | ||||
| +#endif
 | ||||
|  #ifdef MACOSX | ||||
|  #define JLI_Lseek                       lseek | ||||
|  #endif | ||||
| diff --git a/src/java.base/share/native/libzip/zip_util.c b/src/java.base/share/native/libzip/zip_util.c
 | ||||
| index fbbd9d850..eef30b9e4 100644
 | ||||
| --- a/src/java.base/share/native/libzip/zip_util.c
 | ||||
| +++ b/src/java.base/share/native/libzip/zip_util.c
 | ||||
| @@ -46,7 +46,7 @@
 | ||||
|  #include "zip_util.h" | ||||
|  #include <zlib.h> | ||||
|   | ||||
| -#ifdef _ALLBSD_SOURCE
 | ||||
| +#if defined(_ALLBSD_SOURCE) || defined(SERENITY)
 | ||||
|  #define off64_t off_t | ||||
|  #define mmap64 mmap | ||||
|  #endif | ||||
| diff --git a/src/java.base/unix/classes/sun/nio/fs/UnixConstants.java.template b/src/java.base/unix/classes/sun/nio/fs/UnixConstants.java.template
 | ||||
| index d60283d24..5d428521b 100644
 | ||||
| --- a/src/java.base/unix/classes/sun/nio/fs/UnixConstants.java.template
 | ||||
| +++ b/src/java.base/unix/classes/sun/nio/fs/UnixConstants.java.template
 | ||||
| @@ -31,6 +31,95 @@
 | ||||
|  #include <fcntl.h> | ||||
|  #include <sys/stat.h> | ||||
|   | ||||
| +#ifdef SERENITY
 | ||||
| +
 | ||||
| +#define ESUCCESS 0
 | ||||
| +#define EPERM 1
 | ||||
| +#define ENOENT 2
 | ||||
| +#define ESRCH 3
 | ||||
| +#define EINTR 4
 | ||||
| +#define EIO 5
 | ||||
| +#define ENXIO 6
 | ||||
| +#define E2BIG 7
 | ||||
| +#define ENOEXEC 8
 | ||||
| +#define EBADF 9
 | ||||
| +#define ECHILD 10
 | ||||
| +#define EAGAIN 12
 | ||||
| +#define ENOMEM 12
 | ||||
| +#define EACCES 13
 | ||||
| +#define EFAULT 14
 | ||||
| +#define ENOTBLK 15
 | ||||
| +#define EBUSY 16
 | ||||
| +#define EEXIST 17
 | ||||
| +#define EXDEV 18
 | ||||
| +#define ENODEV 19
 | ||||
| +#define ENOTDIR 20
 | ||||
| +#define EISDIR 21
 | ||||
| +#define EINVAL 22
 | ||||
| +#define ENFILE 23
 | ||||
| +#define EMFILE 24
 | ||||
| +#define ENOTTY 25
 | ||||
| +#define ETXTBSY 26
 | ||||
| +#define EFBIG 27
 | ||||
| +#define ENOSPC 28
 | ||||
| +#define ESPIPE 29
 | ||||
| +#define EROFS 30
 | ||||
| +#define EMLINK 31
 | ||||
| +#define EPIPE 32
 | ||||
| +#define ERANGE 33
 | ||||
| +#define ENAMETOOLONG 34
 | ||||
| +#define ELOOP 35
 | ||||
| +#define EOVERFLOW 36
 | ||||
| +#define EOPNOTSUPP 37
 | ||||
| +#define ENOSYS 38
 | ||||
| +#define ENOTIMPL 39
 | ||||
| +#define EAFNOSUPPORT 40
 | ||||
| +#define ENOTSOCK 41
 | ||||
| +#define EADDRINUSE 42
 | ||||
| +#define ENOTEMPTY 43
 | ||||
| +#define EDOM 44
 | ||||
| +#define ECONNREFUSED 45
 | ||||
| +#define EHOSTDOWN 46
 | ||||
| +#define EADDRNOTAVAIL 47
 | ||||
| +#define EISCONN 48
 | ||||
| +#define ECONNABORTED 49
 | ||||
| +#define EALREADY 50
 | ||||
| +#define ECONNRESET 51
 | ||||
| +#define EDESTADDRREQ 52
 | ||||
| +#define EHOSTUNREACH 53
 | ||||
| +#define EILSEQ 54
 | ||||
| +#define EMSGSIZE 55
 | ||||
| +#define ENETDOWN 56
 | ||||
| +#define ENETUNREACH 57
 | ||||
| +#define ENETRESET 58
 | ||||
| +#define ENOBUFS 59
 | ||||
| +#define ENOLCK 60
 | ||||
| +#define ENOMSG 61
 | ||||
| +#define ENOPROTOOPT 62
 | ||||
| +#define ENOTCONN 63
 | ||||
| +#define ESHUTDOWN 64
 | ||||
| +#define ETOOMANYREFS 65
 | ||||
| +#define EPROTONOSUPPORT 66
 | ||||
| +#define ESOCKTNOSUPPORT 67
 | ||||
| +#define EDEADLK 68
 | ||||
| +#define ETIMEDOUT 69
 | ||||
| +#define EPROTOTYPE 70
 | ||||
| +#define EINPROGRESS 71
 | ||||
| +#define ENOTHREAD 72
 | ||||
| +#define EPROTO 73
 | ||||
| +#define ENOTSUP 74
 | ||||
| +#define EPFNOSUPPORT 75
 | ||||
| +#define EDQUOT 76
 | ||||
| +#define EDIRINTOSELF 77
 | ||||
| +#define ENOTRECOVERABLE 78
 | ||||
| +#define ECANCELED 79
 | ||||
| +#define EMAXERRNO 80
 | ||||
| +
 | ||||
| +
 | ||||
| +#define EWOULDBLOCK EAGAIN //Serenity doesn't define it
 | ||||
| +#define ENODATA EMAXERRNO
 | ||||
| +#endif
 | ||||
| +
 | ||||
|  /* To be able to name the Java constants the same as the C constants without | ||||
|     having the preprocessor rewrite those identifiers, add PREFIX_ to all | ||||
|     identifiers matching a C constant. The PREFIX_ is filtered out in the | ||||
| @@ -120,7 +210,7 @@ class UnixConstants {
 | ||||
|  // fgetxattr error codes for absent attributes depend on the OS: | ||||
|  #ifdef _ALLBSD_SOURCE | ||||
|      static final int PREFIX_XATTR_NOT_FOUND = ENOATTR; | ||||
| -#elif __linux__
 | ||||
| +#elif defined(__linux__)
 | ||||
|      static final int PREFIX_XATTR_NOT_FOUND = ENODATA; | ||||
|  #else | ||||
|      // not supported (dummy values will not be used at runtime). | ||||
| diff --git a/src/java.base/unix/native/libjava/ProcessHandleImpl_unix.c b/src/java.base/unix/native/libjava/ProcessHandleImpl_unix.c
 | ||||
| index d53e88764..eddb5f169 100644
 | ||||
| --- a/src/java.base/unix/native/libjava/ProcessHandleImpl_unix.c
 | ||||
| +++ b/src/java.base/unix/native/libjava/ProcessHandleImpl_unix.c
 | ||||
| @@ -488,7 +488,7 @@ void unix_getUserInfo(JNIEnv* env, jobject jinfo, uid_t uid) {
 | ||||
|   * The following functions are common on Solaris, Linux and AIX. | ||||
|   */ | ||||
|   | ||||
| -#if defined (__linux__) || defined(_AIX)
 | ||||
| +#if defined (__linux__) || defined(_AIX) || defined(SERENITY)
 | ||||
|   | ||||
|  /* | ||||
|   * Returns the children of the requested pid and optionally each parent and | ||||
| diff --git a/src/java.base/unix/native/libjava/TimeZone_md.c b/src/java.base/unix/native/libjava/TimeZone_md.c
 | ||||
| index 94dfc207f..2a6c3851a 100644
 | ||||
| --- a/src/java.base/unix/native/libjava/TimeZone_md.c
 | ||||
| +++ b/src/java.base/unix/native/libjava/TimeZone_md.c
 | ||||
| @@ -53,7 +53,7 @@ static char *isFileIdentical(char* buf, size_t size, char *pathname);
 | ||||
|  #define filegets        fgets | ||||
|  #define fileclose       fclose | ||||
|   | ||||
| -#if defined(_ALLBSD_SOURCE)
 | ||||
| +#if defined(_ALLBSD_SOURCE) || defined(SERENITY)
 | ||||
|  #define stat64 stat | ||||
|  #define lstat64 lstat | ||||
|  #define fstat64 fstat | ||||
| @@ -75,7 +75,7 @@ static const char popularZones[][4] = {"UTC", "GMT"};
 | ||||
|  static const char *ETC_ENVIRONMENT_FILE = "/etc/environment"; | ||||
|  #endif | ||||
|   | ||||
| -#if defined(__linux__) || defined(MACOSX)
 | ||||
| +#if defined(__linux__) || defined(MACOSX) || defined(SERENITY)
 | ||||
|   | ||||
|  /* | ||||
|   * Returns a pointer to the zone ID portion of the given zoneinfo file | ||||
| diff --git a/src/java.base/unix/native/libjava/io_util_md.c b/src/java.base/unix/native/libjava/io_util_md.c
 | ||||
| index e207c57d4..8afabc544 100644
 | ||||
| --- a/src/java.base/unix/native/libjava/io_util_md.c
 | ||||
| +++ b/src/java.base/unix/native/libjava/io_util_md.c
 | ||||
| @@ -30,7 +30,7 @@
 | ||||
|  #include <string.h> | ||||
|  #include <unistd.h> | ||||
|   | ||||
| -#if defined(__linux__) || defined(_ALLBSD_SOURCE) || defined(_AIX)
 | ||||
| +#if defined(__linux__) || defined(_ALLBSD_SOURCE) || defined(_AIX) || defined(SERENITY)
 | ||||
|  #include <sys/ioctl.h> | ||||
|  #endif | ||||
|   | ||||
| diff --git a/src/java.base/unix/native/libjava/io_util_md.h b/src/java.base/unix/native/libjava/io_util_md.h
 | ||||
| index 3dccf64f4..3e9e7d3b0 100644
 | ||||
| --- a/src/java.base/unix/native/libjava/io_util_md.h
 | ||||
| +++ b/src/java.base/unix/native/libjava/io_util_md.h
 | ||||
| @@ -66,7 +66,7 @@ FD getFD(JNIEnv *env, jobject cur, jfieldID fid);
 | ||||
|  #define IO_SetLength handleSetLength | ||||
|  #define IO_GetLength handleGetLength | ||||
|   | ||||
| -#ifdef _ALLBSD_SOURCE
 | ||||
| +#if defined(_ALLBSD_SOURCE) || defined(SERENITY)
 | ||||
|  #define open64 open | ||||
|  #define fstat64 fstat | ||||
|  #define stat64 stat | ||||
| @@ -77,6 +77,10 @@ FD getFD(JNIEnv *env, jobject cur, jfieldID fid);
 | ||||
|  #define IO_Lseek lseek64 | ||||
|  #endif | ||||
|   | ||||
| +#ifdef SERENITY
 | ||||
| +#define statvfs64 statvfs
 | ||||
| +#endif
 | ||||
| +
 | ||||
|  /* | ||||
|   * On Solaris, the handle field is unused | ||||
|   */ | ||||
| diff --git a/src/java.base/unix/native/libjsig/jsig.c b/src/java.base/unix/native/libjsig/jsig.c
 | ||||
| index 1108b2f9c..d891aab93 100644
 | ||||
| --- a/src/java.base/unix/native/libjsig/jsig.c
 | ||||
| +++ b/src/java.base/unix/native/libjsig/jsig.c
 | ||||
| @@ -100,6 +100,10 @@ static sa_handler_t call_os_signal(int sig, sa_handler_t disp,
 | ||||
|                                     bool is_sigset) { | ||||
|    sa_handler_t res; | ||||
|   | ||||
| +#ifdef SERENITY
 | ||||
| +#define RTLD_NEXT 0 //stub out RTLD_NEXT
 | ||||
| +#endif
 | ||||
| +
 | ||||
|    if (os_signal == NULL) { | ||||
|      // Deprecation warning first time through | ||||
|      printf(HOTSPOT_VM_DISTRO " VM warning: the use of signal() and sigset() " | ||||
| diff --git a/src/java.base/unix/native/libnet/Inet4AddressImpl.c b/src/java.base/unix/native/libnet/Inet4AddressImpl.c
 | ||||
| index b165be7ce..a4cd70003 100644
 | ||||
| --- a/src/java.base/unix/native/libnet/Inet4AddressImpl.c
 | ||||
| +++ b/src/java.base/unix/native/libnet/Inet4AddressImpl.c
 | ||||
| @@ -335,6 +335,7 @@ static jboolean
 | ||||
|  ping4(JNIEnv *env, jint fd, SOCKETADDRESS *sa, SOCKETADDRESS *netif, | ||||
|        jint timeout, jint ttl) | ||||
|  { | ||||
| +#ifndef SERENITY
 | ||||
|      jint n, size = 60 * 1024, hlen, tmout2, seq = 1; | ||||
|      socklen_t len; | ||||
|      unsigned char sendbuf[1500], recvbuf[1500]; | ||||
| @@ -438,6 +439,8 @@ ping4(JNIEnv *env, jint fd, SOCKETADDRESS *sa, SOCKETADDRESS *netif,
 | ||||
|          timeout -= 1000; | ||||
|      } while (timeout > 0); | ||||
|      close(fd); | ||||
| +#endif
 | ||||
| +    //FIXME implement setsockopt(IPPROTO_IP)
 | ||||
|      return JNI_FALSE; | ||||
|  } | ||||
|   | ||||
| diff --git a/src/java.base/unix/native/libnet/Inet6AddressImpl.c b/src/java.base/unix/native/libnet/Inet6AddressImpl.c
 | ||||
| index 058f3d3a7..61460fda8 100644
 | ||||
| --- a/src/java.base/unix/native/libnet/Inet6AddressImpl.c
 | ||||
| +++ b/src/java.base/unix/native/libnet/Inet6AddressImpl.c
 | ||||
| @@ -29,7 +29,9 @@
 | ||||
|  #include <sys/time.h> | ||||
|  #include <sys/types.h> | ||||
|  #include <netinet/in.h> | ||||
| +#ifndef SERENITY
 | ||||
|  #include <netinet/icmp6.h> | ||||
| +#endif
 | ||||
|   | ||||
|  #if defined(_ALLBSD_SOURCE) | ||||
|  #include <ifaddrs.h> | ||||
| @@ -539,6 +541,7 @@ static jboolean
 | ||||
|  ping6(JNIEnv *env, jint fd, SOCKETADDRESS *sa, SOCKETADDRESS *netif, | ||||
|        jint timeout, jint ttl) | ||||
|  { | ||||
| +#ifndef SERENITY
 | ||||
|      jint n, size = 60 * 1024, tmout2, seq = 1; | ||||
|      socklen_t len; | ||||
|      unsigned char sendbuf[1500], recvbuf[1500]; | ||||
| @@ -643,6 +646,7 @@ ping6(JNIEnv *env, jint fd, SOCKETADDRESS *sa, SOCKETADDRESS *netif,
 | ||||
|          timeout -= 1000; | ||||
|      } while (timeout > 0); | ||||
|      close(fd); | ||||
| +#endif
 | ||||
|      return JNI_FALSE; | ||||
|  } | ||||
|   | ||||
| diff --git a/src/java.base/unix/native/libnet/NetworkInterface.c b/src/java.base/unix/native/libnet/NetworkInterface.c
 | ||||
| index 990bc1bcc..fdeff2bf6 100644
 | ||||
| --- a/src/java.base/unix/native/libnet/NetworkInterface.c
 | ||||
| +++ b/src/java.base/unix/native/libnet/NetworkInterface.c
 | ||||
| @@ -43,6 +43,10 @@
 | ||||
|  #include <ifaddrs.h> | ||||
|  #endif | ||||
|   | ||||
| +#if defined(SERENITY)
 | ||||
| +#include <ifaddrs.h>
 | ||||
| +#endif
 | ||||
| +
 | ||||
|  #include "net_util.h" | ||||
|   | ||||
|  #include "java_net_InetAddress.h" | ||||
| @@ -1351,7 +1355,7 @@ static int getMacAddress
 | ||||
|  static int getMTU(JNIEnv *env, int sock, const char *ifname) { | ||||
|      struct ifreq if2; | ||||
|      memset((char *)&if2, 0, sizeof(if2)); | ||||
| -    strncpy(if2.ifr_name, ifname, sizeof(if2.ifr_name) - 1);
 | ||||
| +    memcpy(if2.ifr_name, ifname, sizeof(if2.ifr_name) - 1);
 | ||||
|   | ||||
|      if (ioctl(sock, SIOCGIFMTU, (char *)&if2) < 0) { | ||||
|          JNU_ThrowByNameWithMessageAndLastError | ||||
| @@ -1664,7 +1668,7 @@ static int getFlags(int sock, const char *ifname, int *flags) {
 | ||||
|  #endif /* _AIX */ | ||||
|   | ||||
|  /** BSD **/ | ||||
| -#if defined(_ALLBSD_SOURCE)
 | ||||
| +#if defined(_ALLBSD_SOURCE) || defined(SERENITY)
 | ||||
|   | ||||
|  /* | ||||
|   * Opens a socket for further ioctl calls. Tries AF_INET socket first and | ||||
| @@ -1803,6 +1807,7 @@ static int getMacAddress
 | ||||
|    (JNIEnv *env, const char *ifname, const struct in_addr *addr, | ||||
|     unsigned char *buf) | ||||
|  { | ||||
| +#ifndef SERENITY // FIXME: define sockaddr_dl in net/if_dl.h
 | ||||
|      struct ifaddrs *ifa0, *ifa; | ||||
|      struct sockaddr *saddr; | ||||
|      int i; | ||||
| @@ -1827,7 +1832,7 @@ static int getMacAddress
 | ||||
|          } | ||||
|          freeifaddrs(ifa0); | ||||
|      } | ||||
| -
 | ||||
| +#endif
 | ||||
|      return -1; | ||||
|  } | ||||
|   | ||||
| diff --git a/src/java.base/unix/native/libnet/net_util_md.h b/src/java.base/unix/native/libnet/net_util_md.h
 | ||||
| index 68835987b..f99b11207 100644
 | ||||
| --- a/src/java.base/unix/native/libnet/net_util_md.h
 | ||||
| +++ b/src/java.base/unix/native/libnet/net_util_md.h
 | ||||
| @@ -30,6 +30,10 @@
 | ||||
|  #include <poll.h> | ||||
|  #include <sys/socket.h> | ||||
|   | ||||
| +#ifdef SERENITY
 | ||||
| +#include <netinet/in.h>
 | ||||
| +#endif
 | ||||
| +
 | ||||
|  /************************************************************************ | ||||
|   * Macros and constants | ||||
|   */ | ||||
| diff --git a/src/java.base/unix/native/libnio/MappedMemoryUtils.c b/src/java.base/unix/native/libnio/MappedMemoryUtils.c
 | ||||
| index e90acd286..34787fff4 100644
 | ||||
| --- a/src/java.base/unix/native/libnio/MappedMemoryUtils.c
 | ||||
| +++ b/src/java.base/unix/native/libnio/MappedMemoryUtils.c
 | ||||
| @@ -58,6 +58,7 @@ JNIEXPORT jboolean JNICALL
 | ||||
|  Java_java_nio_MappedMemoryUtils_isLoaded0(JNIEnv *env, jobject obj, jlong address, | ||||
|                                           jlong len, jlong numPages) | ||||
|  { | ||||
| +#ifndef SERENITY
 | ||||
|      jboolean loaded = JNI_TRUE; | ||||
|      int result = 0; | ||||
|      long i = 0; | ||||
| @@ -100,6 +101,9 @@ Java_java_nio_MappedMemoryUtils_isLoaded0(JNIEnv *env, jobject obj, jlong addres
 | ||||
|      } | ||||
|      free(vec); | ||||
|      return loaded; | ||||
| +#else
 | ||||
| +    return JNI_FALSE; //FIXME implement mincore() or equivalent
 | ||||
| +#endif
 | ||||
|  } | ||||
|   | ||||
|   | ||||
| diff --git a/src/java.base/unix/native/libnio/ch/FileChannelImpl.c b/src/java.base/unix/native/libnio/ch/FileChannelImpl.c
 | ||||
| index 8cc753e6a..28fa55269 100644
 | ||||
| --- a/src/java.base/unix/native/libnio/ch/FileChannelImpl.c
 | ||||
| +++ b/src/java.base/unix/native/libnio/ch/FileChannelImpl.c
 | ||||
| @@ -39,6 +39,9 @@
 | ||||
|  #include <sys/uio.h> | ||||
|  #define lseek64 lseek | ||||
|  #define mmap64 mmap | ||||
| +#elif defined(SERENITY)
 | ||||
| +#define lseek64 lseek
 | ||||
| +#define mmap64 mmap
 | ||||
|  #endif | ||||
|   | ||||
|  #include "jni.h" | ||||
| diff --git a/src/java.base/unix/native/libnio/ch/FileDispatcherImpl.c b/src/java.base/unix/native/libnio/ch/FileDispatcherImpl.c
 | ||||
| index c0c31d6ab..3a4d8a632 100644
 | ||||
| --- a/src/java.base/unix/native/libnio/ch/FileDispatcherImpl.c
 | ||||
| +++ b/src/java.base/unix/native/libnio/ch/FileDispatcherImpl.c
 | ||||
| @@ -40,7 +40,7 @@
 | ||||
|  #include <sys/ioctl.h> | ||||
|  #endif | ||||
|   | ||||
| -#if defined(_ALLBSD_SOURCE)
 | ||||
| +#if defined(_ALLBSD_SOURCE) || defined(SERENITY)
 | ||||
|  #define lseek64 lseek | ||||
|  #define stat64 stat | ||||
|  #define flock64 flock | ||||
| @@ -54,6 +54,11 @@
 | ||||
|  #define fdatasync fsync | ||||
|  #endif | ||||
|   | ||||
| +#ifdef SERENITY
 | ||||
| +#define statvfs64 statvfs
 | ||||
| +#define fstatvfs64 fstatvfs
 | ||||
| +#endif
 | ||||
| +
 | ||||
|  #include "jni.h" | ||||
|  #include "jni_util.h" | ||||
|  #include "jvm.h" | ||||
| diff --git a/src/java.base/unix/native/libnio/ch/FileKey.c b/src/java.base/unix/native/libnio/ch/FileKey.c
 | ||||
| index bdb42a632..a433cdf01 100644
 | ||||
| --- a/src/java.base/unix/native/libnio/ch/FileKey.c
 | ||||
| +++ b/src/java.base/unix/native/libnio/ch/FileKey.c
 | ||||
| @@ -30,7 +30,7 @@
 | ||||
|  #include "nio_util.h" | ||||
|  #include "sun_nio_ch_FileKey.h" | ||||
|   | ||||
| -#ifdef _ALLBSD_SOURCE
 | ||||
| +#if defined(_ALLBSD_SOURCE) || defined(SERENITY)
 | ||||
|  #define stat64 stat | ||||
|   | ||||
|  #define fstat64 fstat | ||||
| diff --git a/src/java.base/unix/native/libnio/ch/NativeThread.c b/src/java.base/unix/native/libnio/ch/NativeThread.c
 | ||||
| index 92dcb9e56..4bf09d03b 100644
 | ||||
| --- a/src/java.base/unix/native/libnio/ch/NativeThread.c
 | ||||
| +++ b/src/java.base/unix/native/libnio/ch/NativeThread.c
 | ||||
| @@ -40,7 +40,7 @@
 | ||||
|  #elif defined(_AIX) | ||||
|    /* Also defined in net/aix_close.c */ | ||||
|    #define INTERRUPT_SIGNAL (SIGRTMAX - 1) | ||||
| -#elif defined(_ALLBSD_SOURCE)
 | ||||
| +#elif defined(_ALLBSD_SOURCE) || defined(SERENITY)
 | ||||
|    /* Also defined in net/bsd_close.c */ | ||||
|    #define INTERRUPT_SIGNAL SIGIO | ||||
|  #else | ||||
| diff --git a/src/java.base/unix/native/libnio/ch/Net.c b/src/java.base/unix/native/libnio/ch/Net.c
 | ||||
| index 42a07359d..ca1401861 100644
 | ||||
| --- a/src/java.base/unix/native/libnio/ch/Net.c
 | ||||
| +++ b/src/java.base/unix/native/libnio/ch/Net.c
 | ||||
| @@ -701,7 +701,7 @@ JNIEXPORT jint JNICALL
 | ||||
|  Java_sun_nio_ch_Net_blockOrUnblock6(JNIEnv *env, jobject this, jboolean block, jobject fdo, | ||||
|                                      jbyteArray group, jint index, jbyteArray source) | ||||
|  { | ||||
| -#ifdef __APPLE__
 | ||||
| +#if defined(__APPLE__) || defined(SERENITY)
 | ||||
|      /* no IPv6 exclude-mode filtering for now */ | ||||
|      return IOS_UNAVAILABLE; | ||||
|  #else | ||||
| diff --git a/src/java.base/unix/native/libnio/fs/UnixNativeDispatcher.c b/src/java.base/unix/native/libnio/fs/UnixNativeDispatcher.c
 | ||||
| index 9df8be1e6..993e240db 100644
 | ||||
| --- a/src/java.base/unix/native/libnio/fs/UnixNativeDispatcher.c
 | ||||
| +++ b/src/java.base/unix/native/libnio/fs/UnixNativeDispatcher.c
 | ||||
| @@ -57,7 +57,7 @@
 | ||||
|  #include <string.h> | ||||
|  #endif | ||||
|   | ||||
| -#ifdef _ALLBSD_SOURCE
 | ||||
| +#if defined(_ALLBSD_SOURCE) || defined(SERENITY)
 | ||||
|  #include <string.h> | ||||
|   | ||||
|  #define stat64 stat | ||||
| @@ -1114,6 +1114,7 @@ Java_sun_nio_fs_UnixNativeDispatcher_getgrgid(JNIEnv* env, jclass this, jint gid
 | ||||
|      int retry; | ||||
|   | ||||
|      /* initial size of buffer for group record */ | ||||
| +#ifndef SERENITY
 | ||||
|      buflen = (int)sysconf(_SC_GETGR_R_SIZE_MAX); | ||||
|      if (buflen == -1) | ||||
|          buflen = ENT_BUF_SIZE; | ||||
| @@ -1156,6 +1157,24 @@ Java_sun_nio_fs_UnixNativeDispatcher_getgrgid(JNIEnv* env, jclass this, jint gid
 | ||||
|   | ||||
|      } while (retry); | ||||
|   | ||||
| +#else
 | ||||
| +    // FIXME: Not thread safe, implement getgrgid_r
 | ||||
| +    errno = 0;
 | ||||
| +    struct group * g = getgrgid(gid);
 | ||||
| +    if (g == NULL || g->gr_name == NULL || *(g->gr_name) == '\0') {
 | ||||
| +        if (errno == 0)
 | ||||
| +            errno = ENOENT;
 | ||||
| +        throwUnixException(env, errno);
 | ||||
| +    }
 | ||||
| +    else {
 | ||||
| +        jsize len = strlen(g->gr_name);
 | ||||
| +        result = (*env)->NewByteArray(env, len);
 | ||||
| +        if (result != NULL) {
 | ||||
| +            (*env)->SetByteArrayRegion(env, result, 0, len, (jbyte*)(g->gr_name));
 | ||||
| +        }
 | ||||
| +    }
 | ||||
| +#endif
 | ||||
| +
 | ||||
|      return result; | ||||
|  } | ||||
|   | ||||
| @@ -1204,6 +1223,7 @@ Java_sun_nio_fs_UnixNativeDispatcher_getgrnam0(JNIEnv* env, jclass this,
 | ||||
|      jlong nameAddress) | ||||
|  { | ||||
|      jint gid = -1; | ||||
| +#ifndef SERENITY
 | ||||
|      int buflen, retry; | ||||
|   | ||||
|      /* initial size of buffer for group record */ | ||||
| @@ -1248,6 +1268,23 @@ Java_sun_nio_fs_UnixNativeDispatcher_getgrnam0(JNIEnv* env, jclass this,
 | ||||
|          free(grbuf); | ||||
|   | ||||
|      } while (retry); | ||||
| +#else
 | ||||
| +    // FIXME: Not thread safe, implement getgrnam_r
 | ||||
| +    const char* name = (const char*)jlong_to_ptr(nameAddress);
 | ||||
| +    errno = 0;
 | ||||
| +    struct group * g = getgrnam(name);
 | ||||
| +    if (g == NULL || g->gr_name == NULL || *(g->gr_name) == '\0') {
 | ||||
| +        /* not found or error */
 | ||||
| +        if (errno != 0 && errno != ENOENT && errno != ESRCH &&
 | ||||
| +            errno != EBADF && errno != EPERM)
 | ||||
| +        {
 | ||||
| +            throwUnixException(env, errno);
 | ||||
| +        }
 | ||||
| +    }
 | ||||
| +    else {
 | ||||
| +        gid = g->gr_gid;
 | ||||
| +    }
 | ||||
| +#endif
 | ||||
|   | ||||
|      return gid; | ||||
|  } | ||||
|  | @ -0,0 +1,259 @@ | |||
| From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 | ||||
| From: Andrew Kaster <andrewdkaster@gmail.com> | ||||
| Date: Sun, 12 Jun 2022 23:15:17 -0600 | ||||
| Subject: [PATCH] java.base: Enable java.lang.Process on serenity | ||||
| 
 | ||||
| ---
 | ||||
|  make/modules/java.base/Launcher.gmk           |   2 +- | ||||
|  make/modules/java.base/lib/CoreLibraries.gmk  |   3 + | ||||
|  .../libjava/ProcessHandleImpl_serenity.cpp    | 167 ++++++++++++++++++ | ||||
|  .../unix/classes/java/lang/ProcessImpl.java   |   7 +- | ||||
|  4 files changed, 177 insertions(+), 2 deletions(-) | ||||
|  create mode 100644 src/java.base/serenity/native/libjava/ProcessHandleImpl_serenity.cpp | ||||
| 
 | ||||
| diff --git a/make/modules/java.base/Launcher.gmk b/make/modules/java.base/Launcher.gmk
 | ||||
| index 700ddefda..78c884dae 100644
 | ||||
| --- a/make/modules/java.base/Launcher.gmk
 | ||||
| +++ b/make/modules/java.base/Launcher.gmk
 | ||||
| @@ -73,7 +73,7 @@ endif
 | ||||
|   | ||||
|  ################################################################################ | ||||
|   | ||||
| -ifeq ($(call isTargetOs, macosx aix linux), true)
 | ||||
| +ifeq ($(call isTargetOs, macosx aix linux serenity), true)
 | ||||
|    $(eval $(call SetupJdkExecutable, BUILD_JSPAWNHELPER, \ | ||||
|        NAME := jspawnhelper, \ | ||||
|        SRC := $(TOPDIR)/src/$(MODULE)/unix/native/jspawnhelper, \ | ||||
| diff --git a/make/modules/java.base/lib/CoreLibraries.gmk b/make/modules/java.base/lib/CoreLibraries.gmk
 | ||||
| index 0a61d009f..7867a3095 100644
 | ||||
| --- a/make/modules/java.base/lib/CoreLibraries.gmk
 | ||||
| +++ b/make/modules/java.base/lib/CoreLibraries.gmk
 | ||||
| @@ -90,6 +90,8 @@ $(eval $(call SetupJdkLibrary, BUILD_LIBJAVA, \
 | ||||
|      OPTIMIZATION := HIGH, \ | ||||
|      CFLAGS := $(CFLAGS_JDKLIB) \ | ||||
|          $(LIBJAVA_CFLAGS), \ | ||||
| +    CXXFLAGS := $(CXXFLAGS_JDKLIB) \
 | ||||
| +        $(LIBJAVA_CXXFLAGS), \
 | ||||
|      jdk_util.c_CFLAGS := $(VERSION_CFLAGS), \ | ||||
|      EXTRA_HEADER_DIRS := libfdlibm, \ | ||||
|      WARNINGS_AS_ERRORS_xlc := false, \ | ||||
| @@ -102,6 +104,7 @@ $(eval $(call SetupJdkLibrary, BUILD_LIBJAVA, \
 | ||||
|      LIBS_unix := -ljvm, \ | ||||
|      LIBS_linux := $(LIBDL), \ | ||||
|      LIBS_aix := $(LIBDL) $(LIBM),\ | ||||
| +    LIBS_serenity := $(LIBDL) -lcore, \
 | ||||
|      LIBS_macosx := -framework CoreFoundation \ | ||||
|          -framework Foundation \ | ||||
|          -framework SystemConfiguration, \ | ||||
| diff --git a/src/java.base/serenity/native/libjava/ProcessHandleImpl_serenity.cpp b/src/java.base/serenity/native/libjava/ProcessHandleImpl_serenity.cpp
 | ||||
| new file mode 100644 | ||||
| index 000000000..e9bb2ec4a
 | ||||
| --- /dev/null
 | ||||
| +++ b/src/java.base/serenity/native/libjava/ProcessHandleImpl_serenity.cpp
 | ||||
| @@ -0,0 +1,167 @@
 | ||||
| +/*
 | ||||
| + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
 | ||||
| + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 | ||||
| + *
 | ||||
| + * This code is free software; you can redistribute it and/or modify it
 | ||||
| + * under the terms of the GNU General Public License version 2 only, as
 | ||||
| + * published by the Free Software Foundation.  Oracle designates this
 | ||||
| + * particular file as subject to the "Classpath" exception as provided
 | ||||
| + * by Oracle in the LICENSE file that accompanied this code.
 | ||||
| + *
 | ||||
| + * This code is distributed in the hope that it will be useful, but WITHOUT
 | ||||
| + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 | ||||
| + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 | ||||
| + * version 2 for more details (a copy is included in the LICENSE file that
 | ||||
| + * accompanied this code).
 | ||||
| + *
 | ||||
| + * You should have received a copy of the GNU General Public License version
 | ||||
| + * 2 along with this work; if not, write to the Free Software Foundation,
 | ||||
| + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 | ||||
| + *
 | ||||
| + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 | ||||
| + * or visit www.oracle.com if you need additional information or have any
 | ||||
| + * questions.
 | ||||
| + */
 | ||||
| +
 | ||||
| +#define AK_DONT_REPLACE_STD
 | ||||
| +
 | ||||
| +#include "jvm.h"
 | ||||
| +#include "jni.h"
 | ||||
| +#include "jni_util.h"
 | ||||
| +#include "java_lang_String.h"
 | ||||
| +
 | ||||
| +extern "C" {
 | ||||
| +#include "ProcessHandleImpl_unix.h"
 | ||||
| +}
 | ||||
| +
 | ||||
| +#include <AK/JsonArray.h>
 | ||||
| +#include <LibCore/ProcessStatisticsReader.h>
 | ||||
| +#include <LibCore/Stream.h>
 | ||||
| +#include <stdio.h>
 | ||||
| +#include <string.h>
 | ||||
| +
 | ||||
| +/*
 | ||||
| + * Implementation of native ProcessHandleImpl functions for SERENITY.
 | ||||
| + * See ProcessHandleImpl_unix.c for more details.
 | ||||
| + */
 | ||||
| +
 | ||||
| +#define JAVA_TRY(expression, message) \
 | ||||
| +    ({                                                                                   \
 | ||||
| +        auto _temporary_result = (expression);                                           \
 | ||||
| +        if (_temporary_result.is_error()) [[unlikely]]                                   \
 | ||||
| +            return throwSerenityError(env, _temporary_result.release_error(), (message));  \
 | ||||
| +        _temporary_result.release_value();                                               \
 | ||||
| +    })
 | ||||
| +
 | ||||
| +
 | ||||
| +static RefPtr<Core::File> proc_all;
 | ||||
| +
 | ||||
| +extern "C" {
 | ||||
| +void os_initNative(JNIEnv *env, jclass clazz) {
 | ||||
| +    proc_all = MUST(Core::File::open("/proc/all", Core::OpenMode::ReadOnly));
 | ||||
| +}
 | ||||
| +
 | ||||
| +jint os_getChildren(JNIEnv *env, jlong jpid, jlongArray jarray,
 | ||||
| +                    jlongArray jparentArray, jlongArray jstimesArray) {
 | ||||
| +    return unix_getChildren(env, jpid, jarray, jparentArray, jstimesArray);
 | ||||
| +}
 | ||||
| +
 | ||||
| +pid_t os_getParentPidAndTimings(JNIEnv *env, pid_t pid, jlong *total, jlong *start) {
 | ||||
| +    auto maybe_stats = Core::ProcessStatisticsReader::get_all(proc_all);
 | ||||
| +    if (!maybe_stats.has_value()) {
 | ||||
| +        JNU_ThrowByNameWithLastError(env,
 | ||||
| +            "java/lang/RuntimeException", "ProcessStatisticsReader::get_all failed");
 | ||||
| +            return -1;
 | ||||
| +    }
 | ||||
| +    auto stats = maybe_stats.release_value();
 | ||||
| +    auto proc_it = find_if(stats.processes.begin(), stats.processes.end(), [pid](auto& proc_stats) {
 | ||||
| +        return proc_stats.pid == pid;
 | ||||
| +    });
 | ||||
| +    if (proc_it == stats.processes.end()) {
 | ||||
| +        JNU_ThrowByNameWithLastError(env,
 | ||||
| +            "java/lang/RuntimeException", "Selected pid does not exist");
 | ||||
| +        return -1;
 | ||||
| +    }
 | ||||
| +    auto& proc = *proc_it;
 | ||||
| +
 | ||||
| +    for (auto& thread : proc.threads) {
 | ||||
| +        *total += thread.time_user + thread.time_kernel;
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    *start = 0; // FIXME: When did thread start? not reported in /proc/all
 | ||||
| +
 | ||||
| +    return proc.ppid;
 | ||||
| +}
 | ||||
| +
 | ||||
| +
 | ||||
| +static void throwSerenityError(JNIEnv* env, Error const& e, StringView msg) {
 | ||||
| +    char err_buf[256];
 | ||||
| +    if (e.is_errno())
 | ||||
| +        getErrorString(e.code(), err_buf, sizeof(err_buf));
 | ||||
| +    else
 | ||||
| +        strncpy(err_buf, e.string_literal().characters_without_null_termination(), sizeof(err_buf) - 1);
 | ||||
| +    jstring s = JNU_NewStringPlatform(env, err_buf);
 | ||||
| +    if (s != NULL) {
 | ||||
| +        jobject x = JNU_NewObjectByName(env, "java/lang/RuntimeException",
 | ||||
| +                                        "(Ljava/lang/String;)V", s);
 | ||||
| +        if (x != NULL) {
 | ||||
| +            env->Throw((jthrowable)x);
 | ||||
| +        }
 | ||||
| +    }
 | ||||
| +    if (!env->ExceptionOccurred()) {
 | ||||
| +        JNU_ThrowByName(env, "java/lang/RuntimeException", msg.characters_without_null_termination());
 | ||||
| +    }
 | ||||
| +}
 | ||||
| +
 | ||||
| +void os_getCmdlineAndUserInfo(JNIEnv *env, jobject jinfo, pid_t pid) {
 | ||||
| +    auto maybe_stats = Core::ProcessStatisticsReader::get_all(proc_all);
 | ||||
| +    if (!maybe_stats.has_value()) {
 | ||||
| +        JNU_ThrowByNameWithLastError(env,
 | ||||
| +            "java/lang/RuntimeException", "ProcessStatisticsReader::get_all failed");
 | ||||
| +        return;
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    auto stats = maybe_stats.release_value();
 | ||||
| +    auto proc_it = find_if(stats.processes.begin(), stats.processes.end(), [pid](auto& proc_stats) {
 | ||||
| +        return proc_stats.pid == pid;
 | ||||
| +    });
 | ||||
| +    if (proc_it == stats.processes.end()) {
 | ||||
| +        JNU_ThrowByNameWithLastError(env,
 | ||||
| +            "java/lang/RuntimeException", "Selected pid does not exist");
 | ||||
| +        return;
 | ||||
| +    }
 | ||||
| +    auto& proc = *proc_it;
 | ||||
| +
 | ||||
| +    unix_getUserInfo(env, jinfo, proc.pid);
 | ||||
| +    JNU_CHECK_EXCEPTION(env);
 | ||||
| +
 | ||||
| +    char cmdline_name[256];
 | ||||
| +    snprintf(cmdline_name , sizeof(cmdline_name) - 1, "/proc/%d/cmdline", pid);
 | ||||
| +
 | ||||
| +    auto cmdline_file = JAVA_TRY(Core::Stream::File::open(cmdline_name, Core::Stream::OpenMode::Read), "Unable to open /proc/pid/cmdline"sv);
 | ||||
| +    auto contents = JAVA_TRY(cmdline_file->read_all(), "Unable to read /proc/pid/cmdline"sv);
 | ||||
| +    auto cmdline = JAVA_TRY(JsonValue::from_string(contents), "Invalid JSON in /proc/pid/cmdline"sv);
 | ||||
| +
 | ||||
| +    if (!cmdline.is_array())
 | ||||
| +        return throwSerenityError(env, Error::from_string_literal("Not an array"), "Unexpected JSON in /proc/pid/cmdline");
 | ||||
| +
 | ||||
| +    jstring cmdexe = JNU_NewStringPlatform(env, cmdline.as_array()[0].as_string().characters());
 | ||||
| +    env->ExceptionClear();        // unconditionally clear any exception
 | ||||
| +    env->SetObjectField(jinfo, ProcessHandleImpl_Info_commandID, cmdexe);
 | ||||
| +
 | ||||
| +    int arr_size = cmdline.as_array().size();
 | ||||
| +    jclass string_clazz = JNU_ClassString(env);
 | ||||
| +    CHECK_NULL(string_clazz);
 | ||||
| +    jobjectArray java_cmdline = env->NewObjectArray(arr_size, string_clazz, NULL);
 | ||||
| +    CHECK_NULL(java_cmdline);
 | ||||
| +    jstring elem = NULL;
 | ||||
| +    for (int i = 0; i < arr_size; ++i) {
 | ||||
| +        elem = JNU_NewStringPlatform(env, cmdline.as_array()[i].as_string().characters());
 | ||||
| +        CHECK_NULL(elem);
 | ||||
| +        env->SetObjectArrayElement(java_cmdline, i, elem);
 | ||||
| +        JNU_CHECK_EXCEPTION(env);
 | ||||
| +    }
 | ||||
| +    env->SetObjectField(jinfo, ProcessHandleImpl_Info_argumentsID, java_cmdline);
 | ||||
| +    JNU_CHECK_EXCEPTION(env);
 | ||||
| +}
 | ||||
| +}
 | ||||
| diff --git a/src/java.base/unix/classes/java/lang/ProcessImpl.java b/src/java.base/unix/classes/java/lang/ProcessImpl.java
 | ||||
| index 2bf36f8f1..317bbf158 100644
 | ||||
| --- a/src/java.base/unix/classes/java/lang/ProcessImpl.java
 | ||||
| +++ b/src/java.base/unix/classes/java/lang/ProcessImpl.java
 | ||||
| @@ -89,7 +89,9 @@ final class ProcessImpl extends Process {
 | ||||
|   | ||||
|          BSD(LaunchMechanism.POSIX_SPAWN, LaunchMechanism.FORK), | ||||
|   | ||||
| -        AIX(LaunchMechanism.POSIX_SPAWN, LaunchMechanism.FORK);
 | ||||
| +        AIX(LaunchMechanism.POSIX_SPAWN, LaunchMechanism.FORK),
 | ||||
| +
 | ||||
| +        SERENITY(LaunchMechanism.POSIX_SPAWN, LaunchMechanism.FORK);
 | ||||
|   | ||||
|          final LaunchMechanism defaultLaunchMechanism; | ||||
|          final Set<LaunchMechanism> validLaunchMechanisms; | ||||
| @@ -135,6 +137,7 @@ final class ProcessImpl extends Process {
 | ||||
|              if (osName.equals("Linux")) { return LINUX; } | ||||
|              if (osName.contains("OS X")) { return BSD; } | ||||
|              if (osName.equals("AIX")) { return AIX; } | ||||
| +            if (osName.equals("SerenityOS")) { return SERENITY; }
 | ||||
|   | ||||
|              throw new Error(osName + " is not a supported OS platform."); | ||||
|          } | ||||
| @@ -348,6 +351,7 @@ final class ProcessImpl extends Process {
 | ||||
|          switch (platform) { | ||||
|              case LINUX: | ||||
|              case BSD: | ||||
| +            case SERENITY:
 | ||||
|                  stdin = (fds[0] == -1) ? | ||||
|                          ProcessBuilder.NullOutputStream.INSTANCE : | ||||
|                          new ProcessPipeOutputStream(fds[0]); | ||||
| @@ -467,6 +471,7 @@ final class ProcessImpl extends Process {
 | ||||
|              case LINUX: | ||||
|              case BSD: | ||||
|              case AIX: | ||||
| +            case SERENITY:
 | ||||
|                  // There is a risk that pid will be recycled, causing us to | ||||
|                  // kill the wrong process!  So we only terminate processes | ||||
|                  // that appear to still be running.  Even with this check, | ||||
							
								
								
									
										51
									
								
								Ports/OpenJDK/patches/ReadMe.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								Ports/OpenJDK/patches/ReadMe.md
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,51 @@ | |||
| # Patches for OpenJDK on SerenityOS | ||||
| 
 | ||||
| ## `0001-make-Add-Serenity-support-masquerading-as-BSD-when-n.patch` | ||||
| 
 | ||||
| make: Add Serenity support, masquerading as BSD when necessary | ||||
| 
 | ||||
| 
 | ||||
| ## `0002-make-Build-with-c-20-when-targeting-serenity.patch` | ||||
| 
 | ||||
| make: Build with c++20 when targeting serenity | ||||
| 
 | ||||
| 
 | ||||
| ## `0003-make-Remove-CUPS-dependency.patch` | ||||
| 
 | ||||
| make: Remove CUPS dependency | ||||
| 
 | ||||
| 
 | ||||
| ## `0004-hotspot-Add-workarounds-for-BSD-differences-from-ser.patch` | ||||
| 
 | ||||
| hotspot: Add workarounds for BSD differences from serenity | ||||
| 
 | ||||
| For the most part, we can pretend to be *BSD. | ||||
| 
 | ||||
| However, for some methods, we need to convince hotspot that we're macOS, | ||||
| and others need serenity-specific ifdefs due to the lack of sysctl in | ||||
| serenity. | ||||
| 
 | ||||
| 
 | ||||
| ## `0005-hotspot-Update-non-BSD-native-modules-for-Serenity.patch` | ||||
| 
 | ||||
| hotspot: Update non-BSD native modules for Serenity | ||||
| 
 | ||||
| 
 | ||||
| ## `0006-Add-serenity-specific-modules-to-java.base-and-jdk.a.patch` | ||||
| 
 | ||||
| Add serenity-specific modules to java.base and jdk.attach | ||||
| 
 | ||||
| It would be nice to re-direct the build to the same files *BSD use, but | ||||
| for now we've got our own copy | ||||
| 
 | ||||
| 
 | ||||
| ## `0007-java.base-Update-native-modules-to-support-Serenity.patch` | ||||
| 
 | ||||
| java.base: Update native modules to support Serenity | ||||
| 
 | ||||
| 
 | ||||
| ## `0008-java.base-Enable-java.lang.Process-on-serenity.patch` | ||||
| 
 | ||||
| java.base: Enable java.lang.Process on serenity | ||||
| 
 | ||||
| 
 | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Timur Sultanov
						Timur Sultanov