diff --git a/repos/ports/lib/import/import-jli.mk b/repos/ports/lib/import/import-jli.mk
new file mode 100644
index 0000000000..4b75e1614c
--- /dev/null
+++ b/repos/ports/lib/import/import-jli.mk
@@ -0,0 +1,7 @@
+JDK_BASE = $(call select_from_ports,jdk)/src/app/jdk/jdk/src/java.base
+INC_DIR += $(JDK_BASE)/share/native/libjli \
+ $(JDK_BASE)/share/native/include \
+ $(JDK_BASE)/unix/native/include \
+ $(JDK_BASE)/unix/native/libjli
+
+
diff --git a/repos/ports/lib/mk/java.inc b/repos/ports/lib/mk/java.inc
new file mode 100644
index 0000000000..cfd5f97743
--- /dev/null
+++ b/repos/ports/lib/mk/java.inc
@@ -0,0 +1,47 @@
+LIBS = libc
+SHARED_LIB = yes
+JDK_BASE = $(call select_from_ports,jdk)/src/app/jdk/jdk/src/java.base
+JDK_GENERATED = $(call select_from_ports,jdk_generated)/src/app/jdk
+JAVA_BASE = $(JDK_BASE)/share/native/libjava
+VERIFY_BASE = $(JDK_BASE)/share/native/libverify
+
+CC_OLEVEL = -O0
+
+SRC_C = $(notdir $(wildcard $(JAVA_BASE)/*.c))
+SRC_C += unix/native/libjava/canonicalize_md.c \
+ unix/native/libjava/FileDescriptor_md.c \
+ unix/native/libjava/FileInputStream_md.c \
+ unix/native/libjava/FileOutputStream_md.c \
+ unix/native/libjava/io_util_md.c \
+ unix/native/libjava/java_props_md.c \
+ unix/native/libjava/jdk_util_md.c \
+ unix/native/libjava/jni_util_md.c \
+ unix/native/libjava/ProcessEnvironment_md.c \
+ unix/native/libjava/RandomAccessFile_md.c \
+ unix/native/libjava/TimeZone_md.c \
+ unix/native/libjava/UnixFileSystem_md.c
+
+SRC_C += check_format.c check_code.c
+SRC_C += math_genode.c
+
+
+include $(REP_DIR)/lib/mk/jdk_version.inc
+
+CC_C_OPT = $(JDK_VERSION)
+CC_C_OPT += -D_ALLBSD_SOURCE -D__GENODE__
+CC_OPT_unix/native/libjava/TimeZone_md = -D__linux__
+
+INC_DIR += $(REP_DIR)/src/app/jdk/lib/include \
+ $(JDK_GENERATED)/include/java.base \
+ $(JDK_BASE)/share/native/include \
+ $(JDK_BASE)/share/native/libfdlibm \
+ $(JDK_BASE)/share/native/libjava \
+ $(JDK_BASE)/unix/native/include \
+ $(JDK_BASE)/unix/native/libjava
+
+vpath %.c $(JAVA_BASE)
+vpath %.c $(VERIFY_BASE)
+vpath %.c $(JDK_BASE)
+vpath %.c $(REP_DIR)/src/app/jdk/lib/java
+
+# vi: set ft=make :
diff --git a/repos/ports/lib/mk/jdk_version.inc b/repos/ports/lib/mk/jdk_version.inc
new file mode 100644
index 0000000000..c06493819c
--- /dev/null
+++ b/repos/ports/lib/mk/jdk_version.inc
@@ -0,0 +1,4 @@
+JDK_VERSION = -DVERSION_SPECIFICATION='"9"' -DVERSION_SHORT='"9-internal"' \
+ -DVERSION_MAJOR=9 -DVERSION_MINOR=0 -DVERSION_SECURITY=0 \
+ -DVERSION_BUILD=0 -DVERSION_PATCH=0 \
+ -DVERSION_STRING='"9-genode.openjdk"'
diff --git a/repos/ports/lib/mk/jimage.mk b/repos/ports/lib/mk/jimage.mk
new file mode 100644
index 0000000000..9cb88b7bb0
--- /dev/null
+++ b/repos/ports/lib/mk/jimage.mk
@@ -0,0 +1,23 @@
+LIBS = libc
+SHARED_LIB = yes
+JDK_BASE = $(call select_from_ports,jdk)/src/app/jdk/jdk/src/java.base
+JDK_GENERATED = $(call select_from_ports,jdk_generated)/src/app/jdk
+
+CC_CXX_WARN_STRICT =
+
+SRC_CC = endian.cpp \
+ imageDecompressor.cpp \
+ imageFile.cpp \
+ jimage.cpp \
+ NativeImageBuffer.cpp \
+ osSupport_unix.cpp
+
+INC_DIR += $(JDK_BASE)/share/native/include \
+ $(JDK_BASE)/share/native/libjava \
+ $(JDK_BASE)/share/native/libjimage \
+ $(JDK_BASE)/unix/native/include \
+ $(JDK_BASE)/unix/native/libjava \
+ $(JDK_GENERATED)/include/java.base
+
+vpath %.cpp $(JDK_BASE)/share/native/libjimage
+vpath %.cpp $(JDK_BASE)/unix/native/libjimage
diff --git a/repos/ports/lib/mk/jli.mk b/repos/ports/lib/mk/jli.mk
new file mode 100644
index 0000000000..5035ac4f7e
--- /dev/null
+++ b/repos/ports/lib/mk/jli.mk
@@ -0,0 +1,26 @@
+LIBS = libc zlib
+SHARED_LIB = yes
+JDK_BASE = $(call select_from_ports,jdk)/src/app/jdk/jdk/src/java.base
+
+CC_OLEVEL = -O0
+
+SRC_C = args.c \
+ java.c \
+ java_md_common.c \
+ java_md_solinux.c \
+ jli_util.c \
+ parse_manifest.c \
+ splashscreen_stubs.c \
+ wildcard.c
+
+
+INC_DIR += $(JDK_BASE)/share/native/include \
+ $(JDK_BASE)/share/native/libjli \
+ $(JDK_BASE)/unix/native/include \
+ $(JDK_BASE)/unix/native/libjli
+
+CC_C_OPT = -D__linux__ -D__GENODE__ -Dlseek64=lseek
+
+vpath %.c $(JDK_BASE)/share/native/libjli
+vpath %.c $(JDK_BASE)/unix/native/libjli
+
diff --git a/repos/ports/lib/mk/jnet.mk b/repos/ports/lib/mk/jnet.mk
new file mode 100644
index 0000000000..2e5039ea94
--- /dev/null
+++ b/repos/ports/lib/mk/jnet.mk
@@ -0,0 +1,32 @@
+LIBS = libc
+SHARED_LIB = yes
+JDK_BASE = $(call select_from_ports,jdk)/src/app/jdk/jdk/src/java.base
+JDK_GENERATED = $(call select_from_ports,jdk_generated)/src/app/jdk
+
+SRC_C = bsd_close.c \
+ net_util.c \
+ net_util_md.c \
+ InetAddress.c \
+ Inet4Address.c \
+ Inet4AddressImpl.c \
+ Inet6Address.c \
+ InetAddressImplFactory.c \
+ PlainSocketImpl.c
+
+INC_DIR += $(JDK_GENERATED)/include/java.base \
+ $(JDK_BASE)/share/native/include \
+ $(JDK_BASE)/share/native/libjava \
+ $(JDK_BASE)/share/native/libnet \
+ $(JDK_BASE)/share/native/libnio \
+ $(JDK_BASE)/share/native/libnio/ch \
+ $(JDK_BASE)/unix/native/include \
+ $(JDK_BASE)/unix/native/libjava \
+ $(JDK_BASE)/unix/native/libnet \
+ $(JDK_BASE)/unix/native/libnio
+
+CC_C_OPT = -D_ALLBSD_SOURCE -include netinet/in.h
+CC_OPT_net_util_md += -include sys/socket.h
+
+vpath %.c $(JDK_BASE)/unix/native/libnet
+vpath %.c $(JDK_BASE)/share/native/libnet
+vpath %.c $(JDK_BASE)/macosx/native/libnet
diff --git a/repos/ports/lib/mk/jvm.inc b/repos/ports/lib/mk/jvm.inc
new file mode 100644
index 0000000000..72b09fc7c7
--- /dev/null
+++ b/repos/ports/lib/mk/jvm.inc
@@ -0,0 +1,610 @@
+#/build/jdk/openjdk-jdk9-jdk9/build/linux-x86_64-normal-zero-release/hotspot/variant-zero/gensrc/jvmtifiles/bytecodeInterpreterWithChecks.cpp
+# /build/jdk/openjdk-jdk9-jdk9/build/linux-x86_64-normal-zero-release/hotspot/variant-zero/gensrc/jvmtifiles/jvmtiEnter.cpp
+# /build/jdk/openjdk-jdk9-jdk9/build/linux-x86_64-normal-zero-release/hotspot/variant-zero/gensrc/jvmtifiles/jvmtiEnterTrace.cpp
+
+LIBS = stdcxx pthread jzip jimage nio jnet ffi
+SHARED_LIB = yes
+HOTSPOT_BASE = $(call select_from_ports,jdk)/src/app/jdk/hotspot/src
+JDK_GENERATED = $(call select_from_ports,jdk_generated)/src/app/jdk
+
+CC_CXX_WARN_STRICT =
+
+include $(REP_DIR)/lib/mk/jdk_version.inc
+
+CC_OPT += -fpermissive -Wno-comment -Wno-reorder -Wno-switch -Wno-unused-variable \
+ -Wno-delete-non-virtual-dtor -Wno-unused-function -Wno-format \
+ -Wno-unused-local-typedefs -Wno-unused-but-set-variable \
+ -Wno-parentheses
+
+CC_OPT += -D__GENODE__
+
+CC_OPT += -DINCLUDE_SUFFIX_OS=_bsd -DTARGET_COMPILER_gcc -D_ALLBSD_SOURCE -DUSE_LIBRARY_BASED_TLS_ONLY \
+ -DVM_LITTLE_ENDIAN -DINCLUDE_SUFFIX_CPU=_zero -DZERO -DCC_INTERP -DTARGET_ARCH_zero \
+ -DINCLUDE_JVMCI=0 -DRELEASE -DPRODUCT
+
+
+INC_DIR += $(JDK_GENERATED)/include \
+ $(REP_DIR)/src/app/jdk/lib/include \
+ $(HOTSPOT_BASE)/os \
+ $(HOTSPOT_BASE)/os/bsd/vm \
+ $(HOTSPOT_BASE)/os/posix/vm \
+ $(HOTSPOT_BASE)/os_cpu/bsd_zero/vm \
+ $(HOTSPOT_BASE)/cpu/zero/vm \
+ $(HOTSPOT_BASE)/share/vm \
+ $(HOTSPOT_BASE)/share/vm/precompiled \
+ $(HOTSPOT_BASE)/share/vm/prims
+
+#
+# Genode specific
+#
+SRC_CC += dummies.cpp
+
+
+#
+# Generated
+#
+SRC_CC += jvmtiEnter.cpp jvmtiEnterTrace.cpp
+
+
+#
+# Hotspot
+#
+SRC_CC += cpu/zero/vm/abstractInterpreter_zero.cpp \
+ cpu/zero/vm/assembler_zero.cpp \
+ cpu/zero/vm/bytecodeInterpreter_zero.cpp \
+ cpu/zero/vm/compiledIC_zero.cpp \
+ cpu/zero/vm/cppInterpreterGenerator_zero.cpp \
+ cpu/zero/vm/cppInterpreter_zero.cpp \
+ cpu/zero/vm/debug_zero.cpp \
+ cpu/zero/vm/depChecker_zero.cpp \
+ cpu/zero/vm/disassembler_zero.cpp \
+ cpu/zero/vm/frame_zero.cpp \
+ cpu/zero/vm/icache_zero.cpp \
+ cpu/zero/vm/icBuffer_zero.cpp \
+ cpu/zero/vm/interpreterRT_zero.cpp \
+ cpu/zero/vm/jniFastGetField_zero.cpp \
+ cpu/zero/vm/metaspaceShared_zero.cpp \
+ cpu/zero/vm/methodHandles_zero.cpp \
+ cpu/zero/vm/nativeInst_zero.cpp \
+ cpu/zero/vm/register_zero.cpp \
+ cpu/zero/vm/relocInfo_zero.cpp \
+ cpu/zero/vm/sharedRuntime_zero.cpp \
+ cpu/zero/vm/stack_zero.cpp \
+ cpu/zero/vm/stubGenerator_zero.cpp \
+ cpu/zero/vm/stubRoutines_zero.cpp \
+ cpu/zero/vm/vmreg_zero.cpp \
+ cpu/zero/vm/vm_version_zero.cpp \
+ cpu/zero/vm/vtableStubs_zero.cpp \
+ os_cpu/bsd_zero/vm/assembler_bsd_zero.cpp \
+ os_cpu/bsd_zero/vm/os_bsd_zero.cpp \
+ os_cpu/bsd_zero/vm/thread_bsd_zero.cpp \
+ os_cpu/bsd_zero/vm/vm_version_bsd_zero.cpp \
+ os/bsd/vm/attachListener_bsd.cpp \
+ os/bsd/vm/decoder_machO.cpp \
+ os/bsd/vm/jvm_bsd.cpp \
+ os/bsd/vm/os_bsd.cpp \
+ os/bsd/vm/osThread_bsd.cpp \
+ os/bsd/vm/perfMemory_bsd.cpp \
+ os/bsd/vm/stubRoutines_bsd.cpp \
+ os/bsd/vm/threadCritical_bsd.cpp \
+ os/linux/vm/decoder_linux.cpp \
+ os/posix/vm/os_posix.cpp \
+ os/posix/vm/threadLocalStorage_posix.cpp \
+ os/posix/vm/vmError_posix.cpp \
+ share/vm/asm/assembler.cpp \
+ share/vm/asm/codeBuffer.cpp \
+ share/vm/asm/register.cpp \
+ share/vm/ci/ciArray.cpp \
+ share/vm/ci/ciArrayKlass.cpp \
+ share/vm/ci/ciBaseObject.cpp \
+ share/vm/ci/ciCallSite.cpp \
+ share/vm/ci/ciConstant.cpp \
+ share/vm/ci/ciConstantPoolCache.cpp \
+ share/vm/ci/ciEnv.cpp \
+ share/vm/ci/ciExceptionHandler.cpp \
+ share/vm/ci/ciField.cpp \
+ share/vm/ci/ciFlags.cpp \
+ share/vm/ci/ciInstance.cpp \
+ share/vm/ci/ciInstanceKlass.cpp \
+ share/vm/ci/ciKlass.cpp \
+ share/vm/ci/ciMemberName.cpp \
+ share/vm/ci/ciMetadata.cpp \
+ share/vm/ci/ciMethodBlocks.cpp \
+ share/vm/ci/ciMethod.cpp \
+ share/vm/ci/ciMethodData.cpp \
+ share/vm/ci/ciMethodHandle.cpp \
+ share/vm/ci/ciNullObject.cpp \
+ share/vm/ci/ciObjArray.cpp \
+ share/vm/ci/ciObjArrayKlass.cpp \
+ share/vm/ci/ciObject.cpp \
+ share/vm/ci/ciObjectFactory.cpp \
+ share/vm/ci/ciReplay.cpp \
+ share/vm/ci/ciSignature.cpp \
+ share/vm/ci/ciStreams.cpp \
+ share/vm/ci/ciSymbol.cpp \
+ share/vm/ci/ciTypeArray.cpp \
+ share/vm/ci/ciTypeArrayKlass.cpp \
+ share/vm/ci/ciType.cpp \
+ share/vm/ci/ciUtilities.cpp \
+ share/vm/classfile/altHashing.cpp \
+ share/vm/classfile/bytecodeAssembler.cpp \
+ share/vm/classfile/classFileError.cpp \
+ share/vm/classfile/classFileParser.cpp \
+ share/vm/classfile/classFileStream.cpp \
+ share/vm/classfile/classListParser.cpp \
+ share/vm/classfile/classLoader.cpp \
+ share/vm/classfile/classLoaderData.cpp \
+ share/vm/classfile/classLoaderExt.cpp \
+ share/vm/classfile/classLoaderStats.cpp \
+ share/vm/classfile/compactHashtable.cpp \
+ share/vm/classfile/defaultMethods.cpp \
+ share/vm/classfile/dictionary.cpp \
+ share/vm/classfile/javaAssertions.cpp \
+ share/vm/classfile/javaClasses.cpp \
+ share/vm/classfile/klassFactory.cpp \
+ share/vm/classfile/loaderConstraints.cpp \
+ share/vm/classfile/metadataOnStackMark.cpp \
+ share/vm/classfile/moduleEntry.cpp \
+ share/vm/classfile/modules.cpp \
+ share/vm/classfile/packageEntry.cpp \
+ share/vm/classfile/placeholders.cpp \
+ share/vm/classfile/resolutionErrors.cpp \
+ share/vm/classfile/sharedPathsMiscInfo.cpp \
+ share/vm/classfile/stackMapFrame.cpp \
+ share/vm/classfile/stackMapTable.cpp \
+ share/vm/classfile/stringTable.cpp \
+ share/vm/classfile/symbolTable.cpp \
+ share/vm/classfile/systemDictionary.cpp \
+ share/vm/classfile/verificationType.cpp \
+ share/vm/classfile/verifier.cpp \
+ share/vm/classfile/vmSymbols.cpp \
+ share/vm/code/codeBlob.cpp \
+ share/vm/code/codeCache.cpp \
+ share/vm/code/compiledIC.cpp \
+ share/vm/code/compiledMethod.cpp \
+ share/vm/code/compressedStream.cpp \
+ share/vm/code/debugInfo.cpp \
+ share/vm/code/debugInfoRec.cpp \
+ share/vm/code/dependencies.cpp \
+ share/vm/code/dependencyContext.cpp \
+ share/vm/code/exceptionHandlerTable.cpp \
+ share/vm/code/icBuffer.cpp \
+ share/vm/code/location.cpp \
+ share/vm/code/nmethod.cpp \
+ share/vm/code/oopRecorder.cpp \
+ share/vm/code/pcDesc.cpp \
+ share/vm/code/relocInfo.cpp \
+ share/vm/code/relocInfo_ext.cpp \
+ share/vm/code/scopeDesc.cpp \
+ share/vm/code/stubs.cpp \
+ share/vm/code/vmreg.cpp \
+ share/vm/code/vtableStubs.cpp \
+ share/vm/compiler/abstractCompiler.cpp \
+ share/vm/compiler/compileBroker.cpp \
+ share/vm/compiler/compileLog.cpp \
+ share/vm/compiler/compilerDefinitions.cpp \
+ share/vm/compiler/compilerDirectives.cpp \
+ share/vm/compiler/compilerOracle.cpp \
+ share/vm/compiler/compileTask.cpp \
+ share/vm/compiler/directivesParser.cpp \
+ share/vm/compiler/disassembler.cpp \
+ share/vm/compiler/methodLiveness.cpp \
+ share/vm/compiler/methodMatcher.cpp \
+ share/vm/compiler/oopMap.cpp \
+ share/vm/gc/cms/adaptiveFreeList.cpp \
+ share/vm/gc/cms/allocationStats.cpp \
+ share/vm/gc/cms/cmsCollectorPolicy.cpp \
+ share/vm/gc/cms/cmsLockVerifier.cpp \
+ share/vm/gc/cms/cmsOopClosures.cpp \
+ share/vm/gc/cms/compactibleFreeListSpace.cpp \
+ share/vm/gc/cms/concurrentMarkSweepGeneration.cpp \
+ share/vm/gc/cms/concurrentMarkSweepThread.cpp \
+ share/vm/gc/cms/freeChunk.cpp \
+ share/vm/gc/cms/gSpaceCounters.cpp \
+ share/vm/gc/cms/parCardTableModRefBS.cpp \
+ share/vm/gc/cms/parNewGeneration.cpp \
+ share/vm/gc/cms/parOopClosures.cpp \
+ share/vm/gc/cms/promotionInfo.cpp \
+ share/vm/gc/cms/vmCMSOperations.cpp \
+ share/vm/gc/cms/yieldingWorkgroup.cpp \
+ share/vm/gc/g1/collectionSetChooser.cpp \
+ share/vm/gc/g1/concurrentG1Refine.cpp \
+ share/vm/gc/g1/concurrentG1RefineThread.cpp \
+ share/vm/gc/g1/concurrentMarkThread.cpp \
+ share/vm/gc/g1/dirtyCardQueue.cpp \
+ share/vm/gc/g1/g1Allocator.cpp \
+ share/vm/gc/g1/g1Allocator_ext.cpp \
+ share/vm/gc/g1/g1AllocRegion.cpp \
+ share/vm/gc/g1/g1Analytics.cpp \
+ share/vm/gc/g1/g1BiasedArray.cpp \
+ share/vm/gc/g1/g1BlockOffsetTable.cpp \
+ share/vm/gc/g1/g1CardCounts.cpp \
+ share/vm/gc/g1/g1CardLiveData.cpp \
+ share/vm/gc/g1/g1CodeBlobClosure.cpp \
+ share/vm/gc/g1/g1CodeCacheRemSet.cpp \
+ share/vm/gc/g1/g1CollectedHeap.cpp \
+ share/vm/gc/g1/g1CollectedHeap_ext.cpp \
+ share/vm/gc/g1/g1CollectionSet.cpp \
+ share/vm/gc/g1/g1CollectorPolicy.cpp \
+ share/vm/gc/g1/g1ConcurrentMark.cpp \
+ share/vm/gc/g1/g1ConcurrentMarkObjArrayProcessor.cpp \
+ share/vm/gc/g1/g1DefaultPolicy.cpp \
+ share/vm/gc/g1/g1EvacFailure.cpp \
+ share/vm/gc/g1/g1EvacStats.cpp \
+ share/vm/gc/g1/g1FromCardCache.cpp \
+ share/vm/gc/g1/g1GCPhaseTimes.cpp \
+ share/vm/gc/g1/g1_globals.cpp \
+ share/vm/gc/g1/g1HeapSizingPolicy.cpp \
+ share/vm/gc/g1/g1HeapSizingPolicy_ext.cpp \
+ share/vm/gc/g1/g1HeapTransition.cpp \
+ share/vm/gc/g1/g1HeapVerifier.cpp \
+ share/vm/gc/g1/g1HotCardCache.cpp \
+ share/vm/gc/g1/g1IHOPControl.cpp \
+ share/vm/gc/g1/g1MarkSweep.cpp \
+ share/vm/gc/g1/g1MarkSweep_ext.cpp \
+ share/vm/gc/g1/g1MMUTracker.cpp \
+ share/vm/gc/g1/g1MonitoringSupport.cpp \
+ share/vm/gc/g1/g1OopClosures.cpp \
+ share/vm/gc/g1/g1PageBasedVirtualSpace.cpp \
+ share/vm/gc/g1/g1ParScanThreadState.cpp \
+ share/vm/gc/g1/g1ParScanThreadState_ext.cpp \
+ share/vm/gc/g1/g1RegionToSpaceMapper.cpp \
+ share/vm/gc/g1/g1RemSet.cpp \
+ share/vm/gc/g1/g1RemSetSummary.cpp \
+ share/vm/gc/g1/g1RootClosures.cpp \
+ share/vm/gc/g1/g1RootClosures_ext.cpp \
+ share/vm/gc/g1/g1RootProcessor.cpp \
+ share/vm/gc/g1/g1SATBCardTableModRefBS.cpp \
+ share/vm/gc/g1/g1StringDedup.cpp \
+ share/vm/gc/g1/g1StringDedupQueue.cpp \
+ share/vm/gc/g1/g1StringDedupStat.cpp \
+ share/vm/gc/g1/g1StringDedupTable.cpp \
+ share/vm/gc/g1/g1StringDedupThread.cpp \
+ share/vm/gc/g1/g1SurvivorRegions.cpp \
+ share/vm/gc/g1/g1YoungGenSizer.cpp \
+ share/vm/gc/g1/g1YoungRemSetSamplingThread.cpp \
+ share/vm/gc/g1/heapRegion.cpp \
+ share/vm/gc/g1/heapRegionManager.cpp \
+ share/vm/gc/g1/heapRegionRemSet.cpp \
+ share/vm/gc/g1/heapRegionSet.cpp \
+ share/vm/gc/g1/heapRegionTracer.cpp \
+ share/vm/gc/g1/heapRegionType.cpp \
+ share/vm/gc/g1/hSpaceCounters.cpp \
+ share/vm/gc/g1/ptrQueue.cpp \
+ share/vm/gc/g1/satbMarkQueue.cpp \
+ share/vm/gc/g1/sparsePRT.cpp \
+ share/vm/gc/g1/survRateGroup.cpp \
+ share/vm/gc/g1/suspendibleThreadSet.cpp \
+ share/vm/gc/g1/vm_operations_g1.cpp \
+ share/vm/gc/g1/workerDataArray.cpp \
+ share/vm/gc/parallel/adjoiningGenerations.cpp \
+ share/vm/gc/parallel/adjoiningVirtualSpaces.cpp \
+ share/vm/gc/parallel/asPSOldGen.cpp \
+ share/vm/gc/parallel/asPSYoungGen.cpp \
+ share/vm/gc/parallel/cardTableExtension.cpp \
+ share/vm/gc/parallel/gcAdaptivePolicyCounters.cpp \
+ share/vm/gc/parallel/gcTaskManager.cpp \
+ share/vm/gc/parallel/gcTaskThread.cpp \
+ share/vm/gc/parallel/generationSizer.cpp \
+ share/vm/gc/parallel/immutableSpace.cpp \
+ share/vm/gc/parallel/mutableNUMASpace.cpp \
+ share/vm/gc/parallel/mutableSpace.cpp \
+ share/vm/gc/parallel/objectStartArray.cpp \
+ share/vm/gc/parallel/parallelScavengeHeap.cpp \
+ share/vm/gc/parallel/parMarkBitMap.cpp \
+ share/vm/gc/parallel/pcTasks.cpp \
+ share/vm/gc/parallel/psAdaptiveSizePolicy.cpp \
+ share/vm/gc/parallel/psCompactionManager.cpp \
+ share/vm/gc/parallel/psGCAdaptivePolicyCounters.cpp \
+ share/vm/gc/parallel/psGenerationCounters.cpp \
+ share/vm/gc/parallel/psMarkSweep.cpp \
+ share/vm/gc/parallel/psMarkSweepDecorator.cpp \
+ share/vm/gc/parallel/psOldGen.cpp \
+ share/vm/gc/parallel/psParallelCompact.cpp \
+ share/vm/gc/parallel/psPromotionLAB.cpp \
+ share/vm/gc/parallel/psPromotionManager.cpp \
+ share/vm/gc/parallel/psScavenge.cpp \
+ share/vm/gc/parallel/psTasks.cpp \
+ share/vm/gc/parallel/psVirtualspace.cpp \
+ share/vm/gc/parallel/psYoungGen.cpp \
+ share/vm/gc/parallel/spaceCounters.cpp \
+ share/vm/gc/parallel/vmPSOperations.cpp \
+ share/vm/gc/serial/cSpaceCounters.cpp \
+ share/vm/gc/serial/defNewGeneration.cpp \
+ share/vm/gc/serial/genMarkSweep.cpp \
+ share/vm/gc/serial/markSweep.cpp \
+ share/vm/gc/serial/tenuredGeneration.cpp \
+ share/vm/gc/shared/adaptiveSizePolicy.cpp \
+ share/vm/gc/shared/ageTable.cpp \
+ share/vm/gc/shared/ageTableTracer.cpp \
+ share/vm/gc/shared/allocTracer.cpp \
+ share/vm/gc/shared/barrierSet.cpp \
+ share/vm/gc/shared/blockOffsetTable.cpp \
+ share/vm/gc/shared/cardGeneration.cpp \
+ share/vm/gc/shared/cardTableModRefBS.cpp \
+ share/vm/gc/shared/cardTableModRefBSForCTRS.cpp \
+ share/vm/gc/shared/cardTableRS.cpp \
+ share/vm/gc/shared/collectedHeap.cpp \
+ share/vm/gc/shared/collectorCounters.cpp \
+ share/vm/gc/shared/collectorPolicy.cpp \
+ share/vm/gc/shared/concurrentGCThread.cpp \
+ share/vm/gc/shared/gcCause.cpp \
+ share/vm/gc/shared/gcId.cpp \
+ share/vm/gc/shared/gcLocker.cpp \
+ share/vm/gc/shared/gcPolicyCounters.cpp \
+ share/vm/gc/shared/gcStats.cpp \
+ share/vm/gc/shared/gcTimer.cpp \
+ share/vm/gc/shared/gcTrace.cpp \
+ share/vm/gc/shared/gcTraceSend.cpp \
+ share/vm/gc/shared/gcTraceTime.cpp \
+ share/vm/gc/shared/gcUtil.cpp \
+ share/vm/gc/shared/genCollectedHeap.cpp \
+ share/vm/gc/shared/generationCounters.cpp \
+ share/vm/gc/shared/generation.cpp \
+ share/vm/gc/shared/generationSpec.cpp \
+ share/vm/gc/shared/genOopClosures.cpp \
+ share/vm/gc/shared/objectCountEventSender.cpp \
+ share/vm/gc/shared/plab.cpp \
+ share/vm/gc/shared/preservedMarks.cpp \
+ share/vm/gc/shared/referencePolicy.cpp \
+ share/vm/gc/shared/referenceProcessor.cpp \
+ share/vm/gc/shared/space.cpp \
+ share/vm/gc/shared/spaceDecorator.cpp \
+ share/vm/gc/shared/strongRootsScope.cpp \
+ share/vm/gc/shared/taskqueue.cpp \
+ share/vm/gc/shared/threadLocalAllocBuffer.cpp \
+ share/vm/gc/shared/vmGCOperations.cpp \
+ share/vm/gc/shared/workgroup.cpp \
+ share/vm/interpreter/abstractInterpreter.cpp \
+ share/vm/interpreter/bytecode.cpp \
+ share/vm/interpreter/bytecodeHistogram.cpp \
+ share/vm/interpreter/bytecodeInterpreter.cpp \
+ share/vm/interpreter/bytecodeInterpreterWithChecks.cpp \
+ share/vm/interpreter/bytecodes.cpp \
+ share/vm/interpreter/bytecodeStream.cpp \
+ share/vm/interpreter/bytecodeTracer.cpp \
+ share/vm/interpreter/cppInterpreter.cpp \
+ share/vm/interpreter/cppInterpreterGenerator.cpp \
+ share/vm/interpreter/interpreter.cpp \
+ share/vm/interpreter/interpreterRuntime.cpp \
+ share/vm/interpreter/invocationCounter.cpp \
+ share/vm/interpreter/linkResolver.cpp \
+ share/vm/interpreter/oopMapCache.cpp \
+ share/vm/interpreter/rewriter.cpp \
+ share/vm/interpreter/templateInterpreter.cpp \
+ share/vm/interpreter/templateInterpreterGenerator.cpp \
+ share/vm/interpreter/templateTable.cpp \
+ share/vm/logging/logConfiguration.cpp \
+ share/vm/logging/logDecorations.cpp \
+ share/vm/logging/logDecorators.cpp \
+ share/vm/logging/logDiagnosticCommand.cpp \
+ share/vm/logging/logFileOutput.cpp \
+ share/vm/logging/logFileStreamOutput.cpp \
+ share/vm/logging/logLevel.cpp \
+ share/vm/logging/logMessageBuffer.cpp \
+ share/vm/logging/logOutput.cpp \
+ share/vm/logging/logOutputList.cpp \
+ share/vm/logging/logStream.cpp \
+ share/vm/logging/logTag.cpp \
+ share/vm/logging/logTagLevelExpression.cpp \
+ share/vm/logging/logTagSet.cpp \
+ share/vm/logging/logTagSetDescriptions.cpp \
+ share/vm/memory/allocation.cpp \
+ share/vm/memory/binaryTreeDictionary.cpp \
+ share/vm/memory/filemap.cpp \
+ share/vm/memory/freeBlockDictionary.cpp \
+ share/vm/memory/freeList.cpp \
+ share/vm/memory/guardedMemory.cpp \
+ share/vm/memory/heap.cpp \
+ share/vm/memory/heapInspection.cpp \
+ share/vm/memory/iterator.cpp \
+ share/vm/memory/memRegion.cpp \
+ share/vm/memory/metachunk.cpp \
+ share/vm/memory/metaspaceCounters.cpp \
+ share/vm/memory/metaspace.cpp \
+ share/vm/memory/metaspaceShared.cpp \
+ share/vm/memory/metaspaceTracer.cpp \
+ share/vm/memory/oopFactory.cpp \
+ share/vm/memory/resourceArea.cpp \
+ share/vm/memory/universe.cpp \
+ share/vm/memory/universe_ext.cpp \
+ share/vm/memory/virtualspace.cpp \
+ share/vm/oops/annotations.cpp \
+ share/vm/oops/arrayKlass.cpp \
+ share/vm/oops/compiledICHolder.cpp \
+ share/vm/oops/constantPool.cpp \
+ share/vm/oops/constMethod.cpp \
+ share/vm/oops/cpCache.cpp \
+ share/vm/oops/generateOopMap.cpp \
+ share/vm/oops/instanceKlass.cpp \
+ share/vm/oops/instanceMirrorKlass.cpp \
+ share/vm/oops/instanceOop.cpp \
+ share/vm/oops/instanceRefKlass.cpp \
+ share/vm/oops/klass.cpp \
+ share/vm/oops/klassVtable.cpp \
+ share/vm/oops/markOop.cpp \
+ share/vm/oops/metadata.cpp \
+ share/vm/oops/methodCounters.cpp \
+ share/vm/oops/method.cpp \
+ share/vm/oops/methodData.cpp \
+ share/vm/oops/objArrayKlass.cpp \
+ share/vm/oops/objArrayOop.cpp \
+ share/vm/oops/oop.cpp \
+ share/vm/oops/oopsHierarchy.cpp \
+ share/vm/oops/symbol.cpp \
+ share/vm/oops/typeArrayKlass.cpp \
+ share/vm/prims/evmCompat.cpp \
+ share/vm/prims/forte.cpp \
+ share/vm/prims/jniCheck.cpp \
+ share/vm/prims/jni.cpp \
+ share/vm/prims/jniFastGetField.cpp \
+ share/vm/prims/jvm.cpp \
+ share/vm/prims/jvmtiClassFileReconstituter.cpp \
+ share/vm/prims/jvmtiCodeBlobEvents.cpp \
+ share/vm/prims/jvmtiEnvBase.cpp \
+ share/vm/prims/jvmtiEnv.cpp \
+ share/vm/prims/jvmtiEnvThreadState.cpp \
+ share/vm/prims/jvmtiEventController.cpp \
+ share/vm/prims/jvmtiExport.cpp \
+ share/vm/prims/jvmtiExtensions.cpp \
+ share/vm/prims/jvmtiGetLoadedClasses.cpp \
+ share/vm/prims/jvmtiImpl.cpp \
+ share/vm/prims/jvmtiManageCapabilities.cpp \
+ share/vm/prims/jvmtiRawMonitor.cpp \
+ share/vm/prims/jvmtiRedefineClasses.cpp \
+ share/vm/prims/jvmtiTagMap.cpp \
+ share/vm/prims/jvmtiThreadState.cpp \
+ share/vm/prims/jvmtiTrace.cpp \
+ share/vm/prims/jvmtiUtil.cpp \
+ share/vm/prims/methodComparator.cpp \
+ share/vm/prims/methodHandles.cpp \
+ share/vm/prims/nativeLookup.cpp \
+ share/vm/prims/perf.cpp \
+ share/vm/prims/privilegedStack.cpp \
+ share/vm/prims/stackwalk.cpp \
+ share/vm/prims/unsafe.cpp \
+ share/vm/prims/wbtestmethods/parserTests.cpp \
+ share/vm/prims/whitebox.cpp \
+ share/vm/prims/whitebox_ext.cpp \
+ share/vm/runtime/advancedThresholdPolicy.cpp \
+ share/vm/runtime/arguments.cpp \
+ share/vm/runtime/arguments_ext.cpp \
+ share/vm/runtime/basicLock.cpp \
+ share/vm/runtime/biasedLocking.cpp \
+ share/vm/runtime/commandLineFlagConstraintList.cpp \
+ share/vm/runtime/commandLineFlagConstraintsCompiler.cpp \
+ share/vm/runtime/commandLineFlagConstraintsGC.cpp \
+ share/vm/runtime/commandLineFlagConstraintsRuntime.cpp \
+ share/vm/runtime/commandLineFlagRangeList.cpp \
+ share/vm/runtime/commandLineFlagWriteableList.cpp \
+ share/vm/runtime/compilationPolicy.cpp \
+ share/vm/runtime/deoptimization.cpp \
+ share/vm/runtime/fieldDescriptor.cpp \
+ share/vm/runtime/fieldType.cpp \
+ share/vm/runtime/fprofiler.cpp \
+ share/vm/runtime/frame.cpp \
+ share/vm/runtime/globals.cpp \
+ share/vm/runtime/handles.cpp \
+ share/vm/runtime/icache.cpp \
+ share/vm/runtime/init.cpp \
+ share/vm/runtime/interfaceSupport.cpp \
+ share/vm/runtime/javaCalls.cpp \
+ share/vm/runtime/java.cpp \
+ share/vm/runtime/jniHandles.cpp \
+ share/vm/runtime/jniPeriodicChecker.cpp \
+ share/vm/runtime/memprofiler.cpp \
+ share/vm/runtime/monitorChunk.cpp \
+ share/vm/runtime/mutex.cpp \
+ share/vm/runtime/mutexLocker.cpp \
+ share/vm/runtime/objectMonitor.cpp \
+ share/vm/runtime/orderAccess.cpp \
+ share/vm/runtime/os.cpp \
+ share/vm/runtime/osThread.cpp \
+ share/vm/runtime/park.cpp \
+ share/vm/runtime/perfData.cpp \
+ share/vm/runtime/perfMemory.cpp \
+ share/vm/runtime/reflection.cpp \
+ share/vm/runtime/reflectionUtils.cpp \
+ share/vm/runtime/relocator.cpp \
+ share/vm/runtime/rframe.cpp \
+ share/vm/runtime/rtmLocking.cpp \
+ share/vm/runtime/safepoint.cpp \
+ share/vm/runtime/serviceThread.cpp \
+ share/vm/runtime/sharedRuntime.cpp \
+ share/vm/runtime/sharedRuntimeTrans.cpp \
+ share/vm/runtime/sharedRuntimeTrig.cpp \
+ share/vm/runtime/signature.cpp \
+ share/vm/runtime/simpleThresholdPolicy.cpp \
+ share/vm/runtime/stackValueCollection.cpp \
+ share/vm/runtime/stackValue.cpp \
+ share/vm/runtime/statSampler.cpp \
+ share/vm/runtime/stubCodeGenerator.cpp \
+ share/vm/runtime/stubRoutines.cpp \
+ share/vm/runtime/sweeper.cpp \
+ share/vm/runtime/synchronizer.cpp \
+ share/vm/runtime/task.cpp \
+ share/vm/runtime/thread.cpp \
+ share/vm/runtime/thread_ext.cpp \
+ share/vm/runtime/timer.cpp \
+ share/vm/runtime/timerTrace.cpp \
+ share/vm/runtime/unhandledOops.cpp \
+ share/vm/runtime/vframeArray.cpp \
+ share/vm/runtime/vframe.cpp \
+ share/vm/runtime/vframe_hp.cpp \
+ share/vm/runtime/vm_operations.cpp \
+ share/vm/runtime/vmStructs.cpp \
+ share/vm/runtime/vmThread.cpp \
+ share/vm/runtime/vm_version.cpp \
+ share/vm/services/attachListener.cpp \
+ share/vm/services/classLoadingService.cpp \
+ share/vm/services/diagnosticArgument.cpp \
+ share/vm/services/diagnosticCommand.cpp \
+ share/vm/services/diagnosticFramework.cpp \
+ share/vm/services/dtraceAttacher.cpp \
+ share/vm/services/g1MemoryPool.cpp \
+ share/vm/services/gcNotifier.cpp \
+ share/vm/services/heapDumper.cpp \
+ share/vm/services/lowMemoryDetector.cpp \
+ share/vm/services/mallocSiteTable.cpp \
+ share/vm/services/mallocTracker.cpp \
+ share/vm/services/management.cpp \
+ share/vm/services/memBaseline.cpp \
+ share/vm/services/memoryManager.cpp \
+ share/vm/services/memoryPool.cpp \
+ share/vm/services/memoryService.cpp \
+ share/vm/services/memReporter.cpp \
+ share/vm/services/memTracker.cpp \
+ share/vm/services/nmtCommon.cpp \
+ share/vm/services/nmtDCmd.cpp \
+ share/vm/services/psMemoryPool.cpp \
+ share/vm/services/runtimeService.cpp \
+ share/vm/services/threadService.cpp \
+ share/vm/services/virtualMemoryTracker.cpp \
+ share/vm/services/writeableFlags.cpp \
+ share/vm/trace/traceBackend.cpp \
+ share/vm/trace/traceStream.cpp \
+ share/vm/utilities/accessFlags.cpp \
+ share/vm/utilities/bitMap.cpp \
+ share/vm/utilities/constantTag.cpp \
+ share/vm/utilities/copy.cpp \
+ share/vm/utilities/debug.cpp \
+ share/vm/utilities/decoder.cpp \
+ share/vm/utilities/decoder_elf.cpp \
+ share/vm/utilities/elfFile.cpp \
+ share/vm/utilities/elfFuncDescTable.cpp \
+ share/vm/utilities/elfStringTable.cpp \
+ share/vm/utilities/elfSymbolTable.cpp \
+ share/vm/utilities/errorReporter.cpp \
+ share/vm/utilities/events.cpp \
+ share/vm/utilities/exceptions.cpp \
+ share/vm/utilities/globalDefinitions.cpp \
+ share/vm/utilities/growableArray.cpp \
+ share/vm/utilities/hashtable.cpp \
+ share/vm/utilities/histogram.cpp \
+ share/vm/utilities/internalVMTests.cpp \
+ share/vm/utilities/intHisto.cpp \
+ share/vm/utilities/json.cpp \
+ share/vm/utilities/nativeCallStack.cpp \
+ share/vm/utilities/numberSeq.cpp \
+ share/vm/utilities/ostream.cpp \
+ share/vm/utilities/preserveException.cpp \
+ share/vm/utilities/sizes.cpp \
+ share/vm/utilities/stringUtils.cpp \
+ share/vm/utilities/ticks.cpp \
+ share/vm/utilities/utf8.cpp \
+ share/vm/utilities/vmError.cpp \
+ share/vm/utilities/xmlstream.cpp
+
+CC_OPT_share/vm/runtime/vm_version += $(JDK_VERSION) \
+ -DHOTSPOT_VERSION_STRING='"9-internal+0-adhoc.genode.openjdk-jdk9-jdk9"'\
+ -DDEBUG_LEVEL='"release"' -DHOTSPOT_VM_DISTRO='"OpenJDK"' \
+ -DHOTSPOT_BUILD_USER='"genode"'
+
+CC_OPT_share/vm/interpreter/bytecodeInterpreterWithChecks += -DVM_JVMTI
+
+vpath dummies.cpp $(REP_DIR)/src/app/jdk/lib/jvm
+vpath jvmtiEnter.cpp $(JDK_GENERATED)/src
+vpath jvmtiEnterTrace.cpp $(JDK_GENERATED)/src
+vpath %.cpp $(HOTSPOT_BASE)
+
+# vi: set ft=make :
diff --git a/repos/ports/lib/mk/jzip.mk b/repos/ports/lib/mk/jzip.mk
new file mode 100644
index 0000000000..6de6ad73d1
--- /dev/null
+++ b/repos/ports/lib/mk/jzip.mk
@@ -0,0 +1,16 @@
+LIBS = libc zlib
+SHARED_LIB = yes
+JDK_BASE = $(call select_from_ports,jdk)/src/app/jdk/jdk/src/java.base
+JDK_GENERATED = $(call select_from_ports,jdk_generated)/src/app/jdk
+
+SRC_C = Adler32.c CRC32.c Deflater.c Inflater.c zip_util.c
+
+INC_DIR += $(JDK_BASE)/share/native/include \
+ $(JDK_BASE)/share/native/libjava \
+ $(JDK_BASE)/unix/native/include \
+ $(JDK_BASE)/unix/native/libjava \
+ $(JDK_GENERATED)/include/java.base
+
+CC_C_OPT = -D_ALLBSD_SOURCE
+
+vpath %.c $(JDK_BASE)/share/native/libzip
diff --git a/repos/ports/lib/mk/nio.mk b/repos/ports/lib/mk/nio.mk
new file mode 100644
index 0000000000..6ed2e26152
--- /dev/null
+++ b/repos/ports/lib/mk/nio.mk
@@ -0,0 +1,42 @@
+LIBS = libc
+SHARED_LIB = yes
+JDK_BASE = $(call select_from_ports,jdk)/src/app/jdk/jdk/src/java.base
+JDK_GENERATED = $(call select_from_ports,jdk_generated)/src/app/jdk
+
+SRC_C = fs/UnixNativeDispatcher.c \
+ fs/UnixCopyFile.c \
+ MappedByteBuffer.c \
+ ch/UnixAsynchronousServerSocketChannelImpl.c \
+ ch/FileKey.c \
+ ch/UnixAsynchronousSocketChannelImpl.c \
+ ch/SocketDispatcher.c \
+ ch/NativeThread.c \
+ ch/DatagramChannelImpl.c \
+ ch/FileChannelImpl.c \
+ ch/PollArrayWrapper.c \
+ ch/InheritedChannel.c \
+ ch/Net.c \
+ ch/FileDispatcherImpl.c \
+ ch/IOUtil.c \
+ ch/DatagramDispatcher.c \
+ ch/ServerSocketChannelImpl.c \
+ ch/SocketChannelImpl.c
+
+
+INC_DIR += $(JDK_GENERATED)/include/java.base \
+ $(JDK_BASE)/share/native/include \
+ $(JDK_BASE)/share/native/libjava \
+ $(JDK_BASE)/share/native/libnet \
+ $(JDK_BASE)/share/native/libnio \
+ $(JDK_BASE)/share/native/libnio/ch \
+ $(JDK_BASE)/unix/native/include \
+ $(JDK_BASE)/unix/native/libjava \
+ $(JDK_BASE)/unix/native/libnet \
+ $(JDK_BASE)/unix/native/libnio
+
+CC_C_OPT = -D_ALLBSD_SOURCE -include netinet/in.h
+
+CC_OPT_ch/Net += -DIPV6_ADD_MEMBERSHIP=IPV6_JOIN_GROUP -DIPV6_DROP_MEMBERSHIP=IPV6_LEAVE_GROUP
+CC_OPT_net_util_md += -include sys/socket.h
+
+vpath %.c $(JDK_BASE)/unix/native/libnio
diff --git a/repos/ports/lib/mk/spec/arm/java.mk b/repos/ports/lib/mk/spec/arm/java.mk
new file mode 100644
index 0000000000..ad243f0bad
--- /dev/null
+++ b/repos/ports/lib/mk/spec/arm/java.mk
@@ -0,0 +1,3 @@
+CC_OPT = -DARCHPROPNAME='"arm"'
+
+include $(REP_DIR)/lib/mk/java.inc
diff --git a/repos/ports/lib/mk/spec/arm/jvm.mk b/repos/ports/lib/mk/spec/arm/jvm.mk
new file mode 100644
index 0000000000..271e117ba0
--- /dev/null
+++ b/repos/ports/lib/mk/spec/arm/jvm.mk
@@ -0,0 +1,4 @@
+CC_OPT = -DHOTSPOT_LIB_ARCH='"arm"' -DARM -DARM32 \
+ -DZERO_LIBARCH='"arm"'
+
+include $(REP_DIR)/lib/mk/jvm.inc
diff --git a/repos/ports/lib/mk/spec/x86_64/java.mk b/repos/ports/lib/mk/spec/x86_64/java.mk
new file mode 100644
index 0000000000..6a307554b6
--- /dev/null
+++ b/repos/ports/lib/mk/spec/x86_64/java.mk
@@ -0,0 +1,3 @@
+CC_OPT = -DARCHPROPNAME='"amd64"'
+
+include $(REP_DIR)/lib/mk/java.inc
diff --git a/repos/ports/lib/mk/spec/x86_64/jvm.mk b/repos/ports/lib/mk/spec/x86_64/jvm.mk
new file mode 100644
index 0000000000..72c51b3c7d
--- /dev/null
+++ b/repos/ports/lib/mk/spec/x86_64/jvm.mk
@@ -0,0 +1,4 @@
+CC_OPT = -DAMD64 -DHOTSPOT_LIB_ARCH='"amd64"' \
+ -DZERO_LIBARCH='"amd64"'
+
+include $(REP_DIR)/lib/mk/jvm.inc
diff --git a/repos/ports/ports/jdk.hash b/repos/ports/ports/jdk.hash
new file mode 100644
index 0000000000..189525e2aa
--- /dev/null
+++ b/repos/ports/ports/jdk.hash
@@ -0,0 +1 @@
+1cbaaddb5f951dd82dc7da847ac86e00ef1cd1dd
diff --git a/repos/ports/ports/jdk.port b/repos/ports/ports/jdk.port
new file mode 100644
index 0000000000..0740212925
--- /dev/null
+++ b/repos/ports/ports/jdk.port
@@ -0,0 +1,22 @@
+LICENSE := GPLv2
+VERSION := 64892f1c9874938dfcdc235b5c051dd761cdd833
+DOWNLOADS := jdk.archive
+
+NAME(jdk) := jdk.tgz
+URL(jdk) := https://api.github.com/repos/dmlloyd/openjdk/tarball/$(VERSION)
+SHA(jdk) := 46a6bfab37216a8726bb55ab11743536678810ae
+DIR(jdk) := src/app/jdk
+
+PATCHES := $(addprefix src/app/jdk/patches/,jdk.patch arm.patch size.patch \
+ pollselectorprovider.patch os_bsd.patch \
+ os_bsd_zero.patch)
+PATCH_OPT := -p1 -d src/app/jdk
+
+gen_file := src/app/jdk/hotspot/src/share/vm/interpreter/bytecodeInterpreterWithChecks.cpp
+
+default: $(gen_file)
+
+$(gen_file): _patch
+ $(VERBOSE)cp $(@D)/bytecodeInterpreter.cpp $(gen_file)
+
+# vi: set ft=make :
diff --git a/repos/ports/ports/jdk_generated.hash b/repos/ports/ports/jdk_generated.hash
new file mode 100644
index 0000000000..3acc0a03ef
--- /dev/null
+++ b/repos/ports/ports/jdk_generated.hash
@@ -0,0 +1 @@
+a122728151284665ca99aa71cec49a81347fac76
diff --git a/repos/ports/ports/jdk_generated.port b/repos/ports/ports/jdk_generated.port
new file mode 100644
index 0000000000..9f8a4254a6
--- /dev/null
+++ b/repos/ports/ports/jdk_generated.port
@@ -0,0 +1,9 @@
+LICENSE := GPLv2
+VERSION := git
+DOWNLOADS := jdk_generated.git
+
+URL(jdk_generated) := https://github.com/ssumpf/jdk_generated.git
+REV(jdk_generated) := cede347a20501628db7feb43e4beacefdb6761b2
+DIR(jdk_generated) := src/app/jdk
+
+# vi: set ft=make :
diff --git a/repos/ports/run/java.run b/repos/ports/run/java.run
new file mode 100644
index 0000000000..c39618f2a6
--- /dev/null
+++ b/repos/ports/run/java.run
@@ -0,0 +1,106 @@
+set build_components {
+ core init
+ drivers/timer
+ app/jdk/java
+}
+
+build $build_components
+create_boot_directory
+
+proc copy_test_data { } {
+ set ::env(MAKEFLAGS) s
+ set jdk_data [exec [genode_dir]/tool/ports/current jdk_generated]/src/app/jdk/bin
+ exec cp $jdk_data/classes.tar bin/.
+ exec cp $jdk_data/hello.tar bin/.
+ exec cp $jdk_data/tzdb.dat bin/.
+}
+
+copy_test_data
+
+set config {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2000-01-01 00:00
+
+
+
+
+
+
+ -server KNOWN
+-client IGNORE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}
+
+install_config $config
+
+set boot_modules {
+ core init ld.lib.so timer
+ java jli.lib.so
+ java.lib.so jvm.lib.so jzip.lib.so jimage.lib.so
+ libc.lib.so libm.lib.so libc_pipe.lib.so
+ zlib.lib.so nio.lib.so jnet.lib.so
+ posix.lib.so pthread.lib.so stdcxx.lib.so ffi.lib.so
+ vfs.lib.so
+ classes.tar hello.tar
+}
+
+
+build_boot_image $boot_modules
+
+append qemu_args " -nographic"
+
+run_genode_until {.*Hello, Genode.*} 180
+
+exec rm bin/classes.tar bin/hello.tar bin/tzdb.dat
diff --git a/repos/ports/src/app/jdk/java/target.mk b/repos/ports/src/app/jdk/java/target.mk
new file mode 100644
index 0000000000..f7b7f82acf
--- /dev/null
+++ b/repos/ports/src/app/jdk/java/target.mk
@@ -0,0 +1,8 @@
+TARGET = java
+SRC_C = main.c
+LIBS = jli java jvm libc posix libc_pipe
+
+CC_C_OPT = -DVERSION_STRING='"9-genode.openjdk"' -D__GENODE__
+
+JDK_PATH = $(call select_from_ports,jdk)/src/app/jdk
+vpath main.c $(JDK_PATH)/jdk/src/java.base/share/native/launcher
diff --git a/repos/ports/src/app/jdk/lib/include/errno.h b/repos/ports/src/app/jdk/lib/include/errno.h
new file mode 100644
index 0000000000..052a9211fa
--- /dev/null
+++ b/repos/ports/src/app/jdk/lib/include/errno.h
@@ -0,0 +1,11 @@
+#ifndef _INCLUDE__ERRNO_H_
+#define _INCLUDE__ERRNO_H_
+
+#include
+
+#define ENOSTR 60
+#define ENODATA 61
+#define ETIME 62
+#define ENOSR 63
+
+#endif /* _INCLUDE__ERRNO_H_ */
diff --git a/repos/ports/src/app/jdk/lib/include/os_bsd.hpp b/repos/ports/src/app/jdk/lib/include/os_bsd.hpp
new file mode 100644
index 0000000000..299ff5aec8
--- /dev/null
+++ b/repos/ports/src/app/jdk/lib/include/os_bsd.hpp
@@ -0,0 +1,8 @@
+#ifndef _INCLUDE__OS_BSD_HPP_
+#define _INCLUDE__OS_BSD_HPP_
+
+#include
+
+static int cmpxchg(int oldval, int newval, volatile int *ptr);
+
+#endif /* _INCLUDE__OS_BSD_HPP_ */
diff --git a/repos/ports/src/app/jdk/lib/include/ucontext.h b/repos/ports/src/app/jdk/lib/include/ucontext.h
new file mode 100644
index 0000000000..73c2166c84
--- /dev/null
+++ b/repos/ports/src/app/jdk/lib/include/ucontext.h
@@ -0,0 +1 @@
+#include
diff --git a/repos/ports/src/app/jdk/lib/java/math_genode.c b/repos/ports/src/app/jdk/lib/java/math_genode.c
new file mode 100644
index 0000000000..c0fb5a16d1
--- /dev/null
+++ b/repos/ports/src/app/jdk/lib/java/math_genode.c
@@ -0,0 +1,18 @@
+#include
+
+double jacos(double d) { return acos(d); }
+double jasin(double d) { return asin(d); }
+double jatan(double d) { return atan(d); }
+double jatan2(double d1, double d2) { return atan2(d1, d2); }
+double jcos(double d) { return cos(d); }
+double jcosh(double d) { return cosh(d); }
+double jexpm1(double d) { return expm1(d); }
+double jlog(double d) { return log(d); }
+double jlog10(double d) { return log10(d); }
+double jlog1p(double d) { return log1p(d); }
+double jremainder(double d1, double d2) { return remainder(d1, d2); }
+double jsin(double d) { return sin(d); }
+double jsinh(double d) { return sinh(d); }
+double jsqrt(double d) { return sqrt(d); }
+double jtan(double d) { return tan(d); }
+double jtanh(double d) { return tanh(d); }
diff --git a/repos/ports/src/app/jdk/lib/java/target.mk b/repos/ports/src/app/jdk/lib/java/target.mk
new file mode 100644
index 0000000000..3a0ad90902
--- /dev/null
+++ b/repos/ports/src/app/jdk/lib/java/target.mk
@@ -0,0 +1 @@
+LIBS = java
diff --git a/repos/ports/src/app/jdk/lib/jvm/dummies.cpp b/repos/ports/src/app/jdk/lib/jvm/dummies.cpp
new file mode 100644
index 0000000000..a1fd475aff
--- /dev/null
+++ b/repos/ports/src/app/jdk/lib/jvm/dummies.cpp
@@ -0,0 +1,97 @@
+#include
+#include
+
+extern "C" {
+#include
+#include
+#include
+#include
+#include
+#include
+}
+
+#if 0
+#define WARN_NOT_IMPL Genode::warning(__func__, " not implemented (jvm)");
+#else
+#define WARN_NOT_IMPL
+#endif
+
+extern "C" void collector_func_load(char* name,
+ void* null_argument_1,
+ void* null_argument_2,
+ void *vaddr,
+ int size,
+ int zero_argument,
+ void* null_argument_3)
+{ }
+
+
+int getpwuid_r(uid_t uid, struct passwd *pwd,
+ char *buf, size_t buflen, struct passwd **result)
+{
+ *result = nullptr;
+ return -1;
+}
+
+
+int getpwnam_r(const char *name, struct passwd *pwd,
+ char *buf, size_t buflen, struct passwd **result)
+{
+ WARN_NOT_IMPL;
+ return -1;
+}
+
+
+int mincore(const void *, size_t, char *)
+{
+ WARN_NOT_IMPL;
+ return -1;
+}
+
+
+int msync(void *addr, size_t length, int flags)
+{
+ WARN_NOT_IMPL;
+ return -1;
+}
+
+
+int lchown(const char *pathname, uid_t owner, gid_t group)
+{
+ WARN_NOT_IMPL;
+ return -1;
+}
+
+
+int futimes(int fd, const struct timeval tv[2])
+{
+ WARN_NOT_IMPL;
+ return -1;
+}
+
+
+ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags)
+{
+ WARN_NOT_IMPL;
+ return -1;
+}
+
+
+int socketpair(int domain, int type, int protocol, int sv[2])
+{
+ WARN_NOT_IMPL;
+ return 0;
+}
+
+int sigaction(int signum, const struct sigaction *act,
+ struct sigaction *oldact)
+{
+ WARN_NOT_IMPL;
+ return 0;
+}
+
+
+extern "C" void backtrace()
+{
+ Genode::backtrace();
+}
diff --git a/repos/ports/src/app/jdk/lib/jvm/target.mk b/repos/ports/src/app/jdk/lib/jvm/target.mk
new file mode 100644
index 0000000000..af67ffa4d4
--- /dev/null
+++ b/repos/ports/src/app/jdk/lib/jvm/target.mk
@@ -0,0 +1 @@
+LIBS = jvm
diff --git a/repos/ports/src/app/jdk/patches/arm.patch b/repos/ports/src/app/jdk/patches/arm.patch
new file mode 100644
index 0000000000..322c0d6164
--- /dev/null
+++ b/repos/ports/src/app/jdk/patches/arm.patch
@@ -0,0 +1,36 @@
+diff --git a/hotspot/src/os_cpu/bsd_zero/vm/atomic_bsd_zero.hpp b/hotspot/src/os_cpu/bsd_zero/vm/atomic_bsd_zero.hpp
+index e808340..560a8d3 100644
+--- a/hotspot/src/os_cpu/bsd_zero/vm/atomic_bsd_zero.hpp
++++ b/hotspot/src/os_cpu/bsd_zero/vm/atomic_bsd_zero.hpp
+@@ -111,8 +111,12 @@ static inline int m68k_lock_test_and_set(volatile int *ptr, int newval) {
+ */
+
+ typedef int (__kernel_cmpxchg_t)(int oldval, int newval, volatile int *ptr);
+-#define __kernel_cmpxchg (*(__kernel_cmpxchg_t *) 0xffff0fc0)
+
++#ifdef __GENODE__
++#define __kernel_cmpxchg os::cmpxchg
++#else
++#define __kernel_cmpxchg (*(__kernel_cmpxchg_t *) 0xffff0fc0)
++#endif
+
+
+ /* Perform an atomic compare and swap: if the current value of `*PTR'
+diff --git a/hotspot/src/os_cpu/bsd_zero/vm/orderAccess_bsd_zero.inline.hpp b/hotspot/src/os_cpu/bsd_zero/vm/orderAccess_bsd_zero.inline.hpp
+index fb3017c..f5c2d37 100644
+--- a/hotspot/src/os_cpu/bsd_zero/vm/orderAccess_bsd_zero.inline.hpp
++++ b/hotspot/src/os_cpu/bsd_zero/vm/orderAccess_bsd_zero.inline.hpp
+@@ -37,7 +37,13 @@
+ * helper for all gcc versions so it is unreliable to use as well.
+ */
+ typedef void (__kernel_dmb_t) (void);
++
++#ifdef __GENODE__
++static inline void __kernel_dmb(void) { asm volatile ("dmb ish": : :"memory"); }
++#else
+ #define __kernel_dmb (*(__kernel_dmb_t *) 0xffff0fa0)
++#endif
++
+
+ #define FULL_MEM_BARRIER __kernel_dmb()
+ #define LIGHT_MEM_BARRIER __kernel_dmb()
diff --git a/repos/ports/src/app/jdk/patches/jdk.patch b/repos/ports/src/app/jdk/patches/jdk.patch
new file mode 100644
index 0000000000..0737da4143
--- /dev/null
+++ b/repos/ports/src/app/jdk/patches/jdk.patch
@@ -0,0 +1,101 @@
+commit 9521d3210cb2979888d3c9ed5a7c8e0e4dd548da
+Author: Sebastian Sumpf
+Date: Wed Sep 27 09:58:20 2017 +0200
+
+ hotspot: Genode patches
+
+diff --git a/hotspot/src/cpu/x86/vm/vm_version_x86.cpp b/hotspot/src/cpu/x86/vm/vm_version_x86.cpp
+index 197079ba1..b1972ca31 100644
+--- a/hotspot/src/cpu/x86/vm/vm_version_x86.cpp
++++ b/hotspot/src/cpu/x86/vm/vm_version_x86.cpp
+@@ -426,7 +426,7 @@ class VM_Version_StubGenerator: public StubCodeGenerator {
+ __ xorl(rsi, rsi);
+ VM_Version::set_cpuinfo_segv_addr(__ pc());
+ // Generate SEGV
+- __ movl(rax, Address(rsi, 0));
++ //__ movl(rax, Address(rsi, 0));
+
+ VM_Version::set_cpuinfo_cont_addr(__ pc());
+ // Returns here after signal. Save xmm0 to check it later.
+diff --git a/hotspot/src/os/bsd/vm/jvm_bsd.h b/hotspot/src/os/bsd/vm/jvm_bsd.h
+index f099198d1..5fa636a7d 100644
+--- a/hotspot/src/os/bsd/vm/jvm_bsd.h
++++ b/hotspot/src/os/bsd/vm/jvm_bsd.h
+@@ -68,7 +68,7 @@
+ #define AGENT_ONUNLOAD_SYMBOLS {"Agent_OnUnload"}
+ #define AGENT_ONATTACH_SYMBOLS {"Agent_OnAttach"}
+
+-#define JNI_LIB_PREFIX "lib"
++#define JNI_LIB_PREFIX ""
+ #ifdef __APPLE__
+ #define JNI_LIB_SUFFIX ".dylib"
+ #else
+diff --git a/hotspot/src/os/bsd/vm/os_bsd.inline.hpp b/hotspot/src/os/bsd/vm/os_bsd.inline.hpp
+index 3a405dec2..e5963f3fc 100644
+--- a/hotspot/src/os/bsd/vm/os_bsd.inline.hpp
++++ b/hotspot/src/os/bsd/vm/os_bsd.inline.hpp
+@@ -44,7 +44,7 @@ inline bool os::obsolete_option(const JavaVMOption *option) {
+ }
+
+ inline bool os::uses_stack_guard_pages() {
+- return true;
++ return false;
+ }
+
+ inline bool os::must_commit_stack_guard_pages() {
+diff --git a/hotspot/src/os/posix/vm/os_posix.cpp b/hotspot/src/os/posix/vm/os_posix.cpp
+index 5885906f6..e482a405a 100644
+--- a/hotspot/src/os/posix/vm/os_posix.cpp
++++ b/hotspot/src/os/posix/vm/os_posix.cpp
+@@ -185,7 +185,7 @@ int os::log_vsnprintf(char* buf, size_t len, const char* fmt, va_list args) {
+ }
+
+ int os::get_fileno(FILE* fp) {
+- return NOT_AIX(::)fileno(fp);
++ return fileno(fp);
+ }
+
+ struct tm* os::gmtime_pd(const time_t* clock, struct tm* res) {
+diff --git a/jdk/src/java.base/unix/native/include/jvm_md.h b/jdk/src/java.base/unix/native/include/jvm_md.h
+index 818ab732a..23692e9ac 100644
+--- a/jdk/src/java.base/unix/native/include/jvm_md.h
++++ b/jdk/src/java.base/unix/native/include/jvm_md.h
+@@ -40,10 +40,18 @@
+ #define JNI_ONLOAD_SYMBOLS {"JNI_OnLoad"}
+ #define JNI_ONUNLOAD_SYMBOLS {"JNI_OnUnload"}
+
++#ifdef __GENODE__
++#define JNI_LIB_PREFIX ""
++#else
+ #define JNI_LIB_PREFIX "lib"
++#endif
++
+ #ifdef __APPLE__
+ #define JNI_LIB_SUFFIX ".dylib"
+ #define VERSIONED_JNI_LIB_NAME(NAME, VERSION) JNI_LIB_PREFIX NAME "." VERSION JNI_LIB_SUFFIX
++#elif defined(__GENODE__)
++#define JNI_LIB_SUFFIX ".lib.so"
++#define VERSIONED_JNI_LIB_NAME(NAME, VERSION) JNI_LIB_PREFIX NAME JNI_LIB_SUFFIX "." VERSION
+ #else
+ #define JNI_LIB_SUFFIX ".so"
+ #define VERSIONED_JNI_LIB_NAME(NAME, VERSION) JNI_LIB_PREFIX NAME JNI_LIB_SUFFIX "." VERSION
+diff --git a/jdk/src/java.base/unix/native/libjli/java_md_solinux.c b/jdk/src/java.base/unix/native/libjli/java_md_solinux.c
+index cb9afc098..2d5af9fc6 100644
+--- a/jdk/src/java.base/unix/native/libjli/java_md_solinux.c
++++ b/jdk/src/java.base/unix/native/libjli/java_md_solinux.c
+@@ -37,9 +37,14 @@
+ #include
+ #include "manifest_info.h"
+
+-
++#ifdef __GENODE__
++#define JVM_DLL "jvm.lib.so"
++#define JAVA_DLL "java.lib.so"
++#else
+ #define JVM_DLL "libjvm.so"
+ #define JAVA_DLL "libjava.so"
++#endif
++
+ #ifdef AIX
+ #define LD_LIBRARY_PATH "LIBPATH"
+ #else
diff --git a/repos/ports/src/app/jdk/patches/os_bsd.patch b/repos/ports/src/app/jdk/patches/os_bsd.patch
new file mode 100644
index 0000000000..9b7a5f8975
--- /dev/null
+++ b/repos/ports/src/app/jdk/patches/os_bsd.patch
@@ -0,0 +1,1147 @@
+diff --git a/hotspot/src/os/bsd/vm/os_bsd.cpp b/hotspot/src/os/bsd/vm/os_bsd.cpp
+index 9261440..2348f1a 100644
+--- a/hotspot/src/os/bsd/vm/os_bsd.cpp
++++ b/hotspot/src/os/bsd/vm/os_bsd.cpp
+@@ -21,6 +21,26 @@
+ * questions.
+ *
+ */
++#ifdef ZERO
++#undef ZERO
++#define ZERO_ENABLE
++#endif
++
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++
++#ifdef ZERO_ENABLE
++#define ZERO
++#endif
++
++/* libc includes */
++#include /* 'malloc'/ 'exit' */
+
+ // no precompiled headers
+ #include "classfile/classLoader.hpp"
+@@ -97,7 +117,6 @@
+ # include
+ # include
+ # include
+-# include
+ #ifndef __APPLE__
+ # include
+ #endif
+@@ -106,17 +125,21 @@
+ # include
+ # include
+
++
+ #if defined(__FreeBSD__) || defined(__NetBSD__)
+ #include
+ #endif
+
+-#ifdef __APPLE__
+- #include // semaphore_* API
+- #include
+- #include
+- #include
++#if 0
++#define NOT_IMPL ({ \
++ PDBG("called not implmemented\n"); \
++})
++#else
++#define NOT_IMPL
+ #endif
+
++extern "C" void backtrace();
++
+ #ifndef MAP_ANONYMOUS
+ #define MAP_ANONYMOUS MAP_ANON
+ #endif
+@@ -141,6 +164,13 @@ int (*os::Bsd::_clock_gettime)(clockid_t, struct timespec *) = NULL;
+ pthread_t os::Bsd::_main_thread;
+ int os::Bsd::_page_size = -1;
+
++int clock_getres(clockid_t, struct timespec *res)
++{
++ res->tv_sec = 0;
++ res->tv_nsec = 1000*1000; /* 1ms */
++ return 0;
++}
++
+ static jlong initial_time_count=0;
+
+ static int clock_tics_per_sec = 100;
+@@ -547,52 +577,6 @@ bool os::Bsd::is_sig_ignored(int sig) {
+ }
+ }
+
+-void os::Bsd::signal_sets_init() {
+- // Should also have an assertion stating we are still single-threaded.
+- assert(!signal_sets_initialized, "Already initialized");
+- // Fill in signals that are necessarily unblocked for all threads in
+- // the VM. Currently, we unblock the following signals:
+- // SHUTDOWN{1,2,3}_SIGNAL: for shutdown hooks support (unless over-ridden
+- // by -Xrs (=ReduceSignalUsage));
+- // BREAK_SIGNAL which is unblocked only by the VM thread and blocked by all
+- // other threads. The "ReduceSignalUsage" boolean tells us not to alter
+- // the dispositions or masks wrt these signals.
+- // Programs embedding the VM that want to use the above signals for their
+- // own purposes must, at this time, use the "-Xrs" option to prevent
+- // interference with shutdown hooks and BREAK_SIGNAL thread dumping.
+- // (See bug 4345157, and other related bugs).
+- // In reality, though, unblocking these signals is really a nop, since
+- // these signals are not blocked by default.
+- sigemptyset(&unblocked_sigs);
+- sigemptyset(&allowdebug_blocked_sigs);
+- sigaddset(&unblocked_sigs, SIGILL);
+- sigaddset(&unblocked_sigs, SIGSEGV);
+- sigaddset(&unblocked_sigs, SIGBUS);
+- sigaddset(&unblocked_sigs, SIGFPE);
+- sigaddset(&unblocked_sigs, SR_signum);
+-
+- if (!ReduceSignalUsage) {
+- if (!os::Bsd::is_sig_ignored(SHUTDOWN1_SIGNAL)) {
+- sigaddset(&unblocked_sigs, SHUTDOWN1_SIGNAL);
+- sigaddset(&allowdebug_blocked_sigs, SHUTDOWN1_SIGNAL);
+- }
+- if (!os::Bsd::is_sig_ignored(SHUTDOWN2_SIGNAL)) {
+- sigaddset(&unblocked_sigs, SHUTDOWN2_SIGNAL);
+- sigaddset(&allowdebug_blocked_sigs, SHUTDOWN2_SIGNAL);
+- }
+- if (!os::Bsd::is_sig_ignored(SHUTDOWN3_SIGNAL)) {
+- sigaddset(&unblocked_sigs, SHUTDOWN3_SIGNAL);
+- sigaddset(&allowdebug_blocked_sigs, SHUTDOWN3_SIGNAL);
+- }
+- }
+- // Fill in signals that are blocked by all but the VM thread.
+- sigemptyset(&vm_sigs);
+- if (!ReduceSignalUsage) {
+- sigaddset(&vm_sigs, BREAK_SIGNAL);
+- }
+- debug_only(signal_sets_initialized = true);
+-
+-}
+
+ // These are signals that are unblocked while a thread is running Java.
+ // (For some reason, they get blocked by default.)
+@@ -1180,14 +1144,18 @@ int os::current_process_id() {
+
+ // DLL functions
+
+-#define JNI_LIB_PREFIX "lib"
++#define JNI_LIB_PREFIX ""
+ #ifdef __APPLE__
+ #define JNI_LIB_SUFFIX ".dylib"
+ #else
+- #define JNI_LIB_SUFFIX ".so"
++ #undef JNI_LIB_SUFFIX
++ #define JNI_LIB_SUFFIX ".lib.so"
+ #endif
+
+-const char* os::dll_file_extension() { return JNI_LIB_SUFFIX; }
++const char* os::dll_file_extension()
++{
++ return JNI_LIB_SUFFIX;
++}
+
+ // This must be hard coded because it's the system's temporary
+ // directory not the java application's temp directory, ala java.io.tmpdir.
+@@ -1375,6 +1343,7 @@ void * os::dll_load(const char *filename, char *ebuf, int ebuflen) {
+ }
+ #else
+ void * os::dll_load(const char *filename, char *ebuf, int ebuflen) {
++
+ #ifdef STATIC_BUILD
+ return os::get_default_process_handle();
+ #else
+@@ -1617,6 +1586,7 @@ int os::get_loaded_modules_info(os::LoadedModulesCallbackFunc callback, void *pa
+ }
+
+ dlclose(handle);
++ return 1;
+ #elif defined(__APPLE__)
+ for (uint32_t i = 1; i < _dyld_image_count(); i++) {
+ // Value for top_address is returned as 0 since we don't have any information about module size
+@@ -1675,30 +1645,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) {
+- unsigned int mhz;
+- size_t size = sizeof(mhz);
+- int mib[] = { CTL_HW, HW_CPU_FREQ };
+- if (sysctl(mib, 2, &mhz, &size, NULL, 0) < 0) {
+- mhz = 1; // looks like an error but can be divided by
+- } else {
+- mhz /= 1000000; // reported in millions
+- }
+-
+- char model[100];
+- size = sizeof(model);
+- int mib_model[] = { CTL_HW, HW_MODEL };
+- if (sysctl(mib_model, 2, model, &size, NULL, 0) < 0) {
+- strncpy(model, cpu_arch, sizeof(model));
+- }
+-
+- char machine[100];
+- size = sizeof(machine);
+- int mib_machine[] = { CTL_HW, HW_MACHINE };
+- if (sysctl(mib_machine, 2, machine, &size, NULL, 0) < 0) {
+- strncpy(machine, "", sizeof(machine));
+- }
+-
+- snprintf(buf, buflen, "%s %s %d MHz", model, machine, mhz);
++ NOT_IMPL;
+ }
+
+ void os::print_memory_info(outputStream* st) {
+@@ -1888,6 +1835,8 @@ void* os::signal(int signal_number, void* handler) {
+ }
+
+ void os::signal_raise(int signal_number) {
++ printf("%s called from", __func__);
++ backtrace();
+ ::raise(signal_number);
+ }
+
+@@ -2131,58 +2080,6 @@ static void warn_fail_commit_memory(char* addr, size_t size, bool exec,
+ os::errno_name(err), err);
+ }
+
+-// NOTE: Bsd kernel does not really reserve the pages for us.
+-// All it does is to check if there are enough free pages
+-// left at the time of mmap(). This could be a potential
+-// problem.
+-bool os::pd_commit_memory(char* addr, size_t size, bool exec) {
+- int prot = exec ? PROT_READ|PROT_WRITE|PROT_EXEC : PROT_READ|PROT_WRITE;
+-#ifdef __OpenBSD__
+- // XXX: Work-around mmap/MAP_FIXED bug temporarily on OpenBSD
+- if (::mprotect(addr, size, prot) == 0) {
+- return true;
+- }
+-#else
+- uintptr_t res = (uintptr_t) ::mmap(addr, size, prot,
+- MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0);
+- if (res != (uintptr_t) MAP_FAILED) {
+- return true;
+- }
+-#endif
+-
+- // Warn about any commit errors we see in non-product builds just
+- // in case mmap() doesn't work as described on the man page.
+- NOT_PRODUCT(warn_fail_commit_memory(addr, size, exec, errno);)
+-
+- return false;
+-}
+-
+-bool os::pd_commit_memory(char* addr, size_t size, size_t alignment_hint,
+- bool exec) {
+- // alignment_hint is ignored on this OS
+- return pd_commit_memory(addr, size, exec);
+-}
+-
+-void os::pd_commit_memory_or_exit(char* addr, size_t size, bool exec,
+- const char* mesg) {
+- assert(mesg != NULL, "mesg must be specified");
+- if (!pd_commit_memory(addr, size, exec)) {
+- // add extra info in product mode for vm_exit_out_of_memory():
+- PRODUCT_ONLY(warn_fail_commit_memory(addr, size, exec, errno);)
+- vm_exit_out_of_memory(size, OOM_MMAP_ERROR, "%s", mesg);
+- }
+-}
+-
+-void os::pd_commit_memory_or_exit(char* addr, size_t size,
+- size_t alignment_hint, bool exec,
+- const char* mesg) {
+- // alignment_hint is ignored on this OS
+- pd_commit_memory_or_exit(addr, size, exec, mesg);
+-}
+-
+-void os::pd_realign_memory(char *addr, size_t bytes, size_t alignment_hint) {
+-}
+-
+ void os::pd_free_memory(char *addr, size_t bytes, size_t alignment_hint) {
+ ::madvise(addr, bytes, MADV_DONTNEED);
+ }
+@@ -2220,19 +2117,9 @@ char *os::scan_pages(char *start, char* end, page_info* page_expected, page_info
+ }
+
+
+-bool os::pd_uncommit_memory(char* addr, size_t size) {
+-#ifdef __OpenBSD__
+- // XXX: Work-around mmap/MAP_FIXED bug temporarily on OpenBSD
+- return ::mprotect(addr, size, PROT_NONE) == 0;
+-#else
+- uintptr_t res = (uintptr_t) ::mmap(addr, size, PROT_NONE,
+- MAP_PRIVATE|MAP_FIXED|MAP_NORESERVE|MAP_ANONYMOUS, -1, 0);
+- return res != (uintptr_t) MAP_FAILED;
+-#endif
+-}
+-
+ bool os::pd_create_stack_guard_pages(char* addr, size_t size) {
+- return os::commit_memory(addr, size, !ExecMem);
++ NOT_IMPL;
++ return true;
+ }
+
+ // If this is a growable mapping, remove the guard pages entirely by
+@@ -2270,15 +2157,6 @@ static int anon_munmap(char * addr, size_t size) {
+ return ::munmap(addr, size) == 0;
+ }
+
+-char* os::pd_reserve_memory(size_t bytes, char* requested_addr,
+- size_t alignment_hint) {
+- return anon_mmap(requested_addr, bytes, (requested_addr != NULL));
+-}
+-
+-bool os::pd_release_memory(char* addr, size_t size) {
+- return anon_munmap(addr, size);
+-}
+-
+ static bool bsd_mprotect(char* addr, size_t size, int prot) {
+ // Bsd wants the mprotect address argument to be page aligned.
+ char* bottom = (char*)align_size_down((intptr_t)addr, os::Bsd::page_size());
+@@ -2331,80 +2209,13 @@ void os::large_page_init() {
+
+
+ char* os::reserve_memory_special(size_t bytes, size_t alignment, char* req_addr, bool exec) {
+- fatal("This code is not used or maintained.");
+-
+- // "exec" is passed in but not used. Creating the shared image for
+- // the code cache doesn't have an SHM_X executable permission to check.
+- assert(UseLargePages && UseSHM, "only for SHM large pages");
+-
+- key_t key = IPC_PRIVATE;
+- char *addr;
+-
+- bool warn_on_failure = UseLargePages &&
+- (!FLAG_IS_DEFAULT(UseLargePages) ||
+- !FLAG_IS_DEFAULT(LargePageSizeInBytes));
+-
+- // Create a large shared memory region to attach to based on size.
+- // Currently, size is the total size of the heap
+- int shmid = shmget(key, bytes, IPC_CREAT|SHM_R|SHM_W);
+- if (shmid == -1) {
+- // Possible reasons for shmget failure:
+- // 1. shmmax is too small for Java heap.
+- // > check shmmax value: cat /proc/sys/kernel/shmmax
+- // > increase shmmax value: echo "0xffffffff" > /proc/sys/kernel/shmmax
+- // 2. not enough large page memory.
+- // > check available large pages: cat /proc/meminfo
+- // > increase amount of large pages:
+- // echo new_value > /proc/sys/vm/nr_hugepages
+- // Note 1: different Bsd may use different name for this property,
+- // e.g. on Redhat AS-3 it is "hugetlb_pool".
+- // Note 2: it's possible there's enough physical memory available but
+- // they are so fragmented after a long run that they can't
+- // coalesce into large pages. Try to reserve large pages when
+- // the system is still "fresh".
+- if (warn_on_failure) {
+- warning("Failed to reserve shared memory (errno = %d).", errno);
+- }
+- return NULL;
+- }
+-
+- // attach to the region
+- addr = (char*)shmat(shmid, req_addr, 0);
+- int err = errno;
+-
+- // Remove shmid. If shmat() is successful, the actual shared memory segment
+- // will be deleted when it's detached by shmdt() or when the process
+- // terminates. If shmat() is not successful this will remove the shared
+- // segment immediately.
+- shmctl(shmid, IPC_RMID, NULL);
+-
+- if ((intptr_t)addr == -1) {
+- if (warn_on_failure) {
+- warning("Failed to attach shared memory (errno = %d).", err);
+- }
+- return NULL;
+- }
+-
+- // The memory is committed
+- MemTracker::record_virtual_memory_reserve_and_commit((address)addr, bytes, CALLER_PC);
+-
+- return addr;
++ NOT_IMPL;
++ return nullptr;
+ }
+
+ bool os::release_memory_special(char* base, size_t bytes) {
+- if (MemTracker::tracking_level() > NMT_minimal) {
+- Tracker tkr = MemTracker::get_virtual_memory_release_tracker();
+- // detaching the SHM segment will also delete it, see reserve_memory_special()
+- int rslt = shmdt(base);
+- if (rslt == 0) {
+- tkr.record((address)base, bytes);
+- return true;
+- } else {
+- return false;
+- }
+- } else {
+- return shmdt(base) == 0;
+- }
++ NOT_IMPL;
++ return false;
+ }
+
+ size_t os::large_page_size() {
+@@ -2422,82 +2233,6 @@ bool os::can_execute_large_page_memory() {
+ return UseHugeTLBFS;
+ }
+
+-// Reserve memory at an arbitrary address, only if that area is
+-// available (and not reserved for something else).
+-
+-char* os::pd_attempt_reserve_memory_at(size_t bytes, char* requested_addr) {
+- const int max_tries = 10;
+- char* base[max_tries];
+- size_t size[max_tries];
+- const size_t gap = 0x000000;
+-
+- // Assert only that the size is a multiple of the page size, since
+- // that's all that mmap requires, and since that's all we really know
+- // about at this low abstraction level. If we need higher alignment,
+- // we can either pass an alignment to this method or verify alignment
+- // in one of the methods further up the call chain. See bug 5044738.
+- assert(bytes % os::vm_page_size() == 0, "reserving unexpected size block");
+-
+- // Repeatedly allocate blocks until the block is allocated at the
+- // right spot.
+-
+- // Bsd mmap allows caller to pass an address as hint; give it a try first,
+- // if kernel honors the hint then we can return immediately.
+- char * addr = anon_mmap(requested_addr, bytes, false);
+- if (addr == requested_addr) {
+- return requested_addr;
+- }
+-
+- if (addr != NULL) {
+- // mmap() is successful but it fails to reserve at the requested address
+- anon_munmap(addr, bytes);
+- }
+-
+- int i;
+- for (i = 0; i < max_tries; ++i) {
+- base[i] = reserve_memory(bytes);
+-
+- if (base[i] != NULL) {
+- // Is this the block we wanted?
+- if (base[i] == requested_addr) {
+- size[i] = bytes;
+- break;
+- }
+-
+- // Does this overlap the block we wanted? Give back the overlapped
+- // parts and try again.
+-
+- size_t top_overlap = requested_addr + (bytes + gap) - base[i];
+- if (top_overlap >= 0 && top_overlap < bytes) {
+- unmap_memory(base[i], top_overlap);
+- base[i] += top_overlap;
+- size[i] = bytes - top_overlap;
+- } else {
+- size_t bottom_overlap = base[i] + bytes - requested_addr;
+- if (bottom_overlap >= 0 && bottom_overlap < bytes) {
+- unmap_memory(requested_addr, bottom_overlap);
+- size[i] = bytes - bottom_overlap;
+- } else {
+- size[i] = bytes;
+- }
+- }
+- }
+- }
+-
+- // Give back the unused reserved pieces.
+-
+- for (int j = 0; j < i; ++j) {
+- if (base[j] != NULL) {
+- unmap_memory(base[j], size[j]);
+- }
+- }
+-
+- if (i < max_tries) {
+- return requested_addr;
+- } else {
+- return NULL;
+- }
+-}
+
+ size_t os::read(int fd, void *buf, unsigned int nBytes) {
+ RESTARTABLE_RETURN_INT(::read(fd, buf, nBytes));
+@@ -2618,53 +2353,13 @@ static int prio_init() {
+ }
+
+ OSReturn os::set_native_priority(Thread* thread, int newpri) {
+- if (!UseThreadPriorities || ThreadPriorityPolicy == 0) return OS_OK;
+-
+-#ifdef __OpenBSD__
+- // OpenBSD pthread_setprio starves low priority threads
+- return OS_OK;
+-#elif defined(__FreeBSD__)
+- int ret = pthread_setprio(thread->osthread()->pthread_id(), newpri);
+-#elif defined(__APPLE__) || defined(__NetBSD__)
+- struct sched_param sp;
+- int policy;
+- pthread_t self = pthread_self();
+-
+- if (pthread_getschedparam(self, &policy, &sp) != 0) {
+- return OS_ERR;
+- }
+-
+- sp.sched_priority = newpri;
+- if (pthread_setschedparam(self, policy, &sp) != 0) {
+- return OS_ERR;
+- }
+-
++ NOT_IMPL;
+ return OS_OK;
+-#else
+- int ret = setpriority(PRIO_PROCESS, thread->osthread()->thread_id(), newpri);
+- return (ret == 0) ? OS_OK : OS_ERR;
+-#endif
+ }
+
+ OSReturn os::get_native_priority(const Thread* const thread, int *priority_ptr) {
+- if (!UseThreadPriorities || ThreadPriorityPolicy == 0) {
+- *priority_ptr = java_to_os_priority[NormPriority];
+- return OS_OK;
+- }
+-
+- errno = 0;
+-#if defined(__OpenBSD__) || defined(__FreeBSD__)
+- *priority_ptr = pthread_getprio(thread->osthread()->pthread_id());
+-#elif defined(__APPLE__) || defined(__NetBSD__)
+- int policy;
+- struct sched_param sp;
+-
+- pthread_getschedparam(pthread_self(), &policy, &sp);
+- *priority_ptr = sp.sched_priority;
+-#else
+- *priority_ptr = getpriority(PRIO_PROCESS, thread->osthread()->thread_id());
+-#endif
+- return (*priority_ptr != -1 || errno == 0 ? OS_OK : OS_ERR);
++ NOT_IMPL;
++ return OS_OK;
+ }
+
+ // Hint to the underlying OS that a task switch would not be good.
+@@ -2786,47 +2481,6 @@ static void SR_handler(int sig, siginfo_t* siginfo, ucontext_t* context) {
+ }
+
+
+-static int SR_initialize() {
+- struct sigaction act;
+- char *s;
+- // Get signal number to use for suspend/resume
+- if ((s = ::getenv("_JAVA_SR_SIGNUM")) != 0) {
+- int sig = ::strtol(s, 0, 10);
+- if (sig > MAX2(SIGSEGV, SIGBUS) && // See 4355769.
+- sig < NSIG) { // Must be legal signal and fit into sigflags[].
+- SR_signum = sig;
+- } else {
+- warning("You set _JAVA_SR_SIGNUM=%d. It must be in range [%d, %d]. Using %d instead.",
+- sig, MAX2(SIGSEGV, SIGBUS)+1, NSIG-1, SR_signum);
+- }
+- }
+-
+- assert(SR_signum > SIGSEGV && SR_signum > SIGBUS,
+- "SR_signum must be greater than max(SIGSEGV, SIGBUS), see 4355769");
+-
+- sigemptyset(&SR_sigset);
+- sigaddset(&SR_sigset, SR_signum);
+-
+- // Set up signal handler for suspend/resume
+- act.sa_flags = SA_RESTART|SA_SIGINFO;
+- act.sa_handler = (void (*)(int)) SR_handler;
+-
+- // SR_signum is blocked by default.
+- // 4528190 - We also need to block pthread restart signal (32 on all
+- // supported Bsd platforms). Note that BsdThreads need to block
+- // this signal for all threads to work properly. So we don't have
+- // to use hard-coded signal number when setting up the mask.
+- pthread_sigmask(SIG_BLOCK, NULL, &act.sa_mask);
+-
+- if (sigaction(SR_signum, &act, 0) == -1) {
+- return -1;
+- }
+-
+- // Save signal flag
+- os::Bsd::set_our_sigflags(SR_signum, act.sa_flags);
+- return 0;
+-}
+-
+ static int sr_notify(OSThread* osthread) {
+ int status = pthread_kill(osthread->pthread_id(), SR_signum);
+ assert_status(status == 0, status, "pthread_kill");
+@@ -3119,85 +2773,6 @@ void os::Bsd::set_signal_handler(int sig, bool set_installed) {
+ assert(oldhand2 == oldhand, "no concurrent signal handler installation");
+ }
+
+-// install signal handlers for signals that HotSpot needs to
+-// handle in order to support Java-level exception handling.
+-
+-void os::Bsd::install_signal_handlers() {
+- if (!signal_handlers_are_installed) {
+- signal_handlers_are_installed = true;
+-
+- // signal-chaining
+- typedef void (*signal_setting_t)();
+- signal_setting_t begin_signal_setting = NULL;
+- signal_setting_t end_signal_setting = NULL;
+- begin_signal_setting = CAST_TO_FN_PTR(signal_setting_t,
+- dlsym(RTLD_DEFAULT, "JVM_begin_signal_setting"));
+- if (begin_signal_setting != NULL) {
+- end_signal_setting = CAST_TO_FN_PTR(signal_setting_t,
+- dlsym(RTLD_DEFAULT, "JVM_end_signal_setting"));
+- get_signal_action = CAST_TO_FN_PTR(get_signal_t,
+- dlsym(RTLD_DEFAULT, "JVM_get_signal_action"));
+- libjsig_is_loaded = true;
+- assert(UseSignalChaining, "should enable signal-chaining");
+- }
+- if (libjsig_is_loaded) {
+- // Tell libjsig jvm is setting signal handlers
+- (*begin_signal_setting)();
+- }
+-
+- set_signal_handler(SIGSEGV, true);
+- set_signal_handler(SIGPIPE, true);
+- set_signal_handler(SIGBUS, true);
+- set_signal_handler(SIGILL, true);
+- set_signal_handler(SIGFPE, true);
+- set_signal_handler(SIGXFSZ, true);
+-
+-#if defined(__APPLE__)
+- // In Mac OS X 10.4, CrashReporter will write a crash log for all 'fatal' signals, including
+- // signals caught and handled by the JVM. To work around this, we reset the mach task
+- // signal handler that's placed on our process by CrashReporter. This disables
+- // CrashReporter-based reporting.
+- //
+- // This work-around is not necessary for 10.5+, as CrashReporter no longer intercedes
+- // on caught fatal signals.
+- //
+- // Additionally, gdb installs both standard BSD signal handlers, and mach exception
+- // handlers. By replacing the existing task exception handler, we disable gdb's mach
+- // exception handling, while leaving the standard BSD signal handlers functional.
+- kern_return_t kr;
+- kr = task_set_exception_ports(mach_task_self(),
+- EXC_MASK_BAD_ACCESS | EXC_MASK_ARITHMETIC,
+- MACH_PORT_NULL,
+- EXCEPTION_STATE_IDENTITY,
+- MACHINE_THREAD_STATE);
+-
+- assert(kr == KERN_SUCCESS, "could not set mach task signal handler");
+-#endif
+-
+- if (libjsig_is_loaded) {
+- // Tell libjsig jvm finishes setting signal handlers
+- (*end_signal_setting)();
+- }
+-
+- // We don't activate signal checker if libjsig is in place, we trust ourselves
+- // and if UserSignalHandler is installed all bets are off
+- if (CheckJNICalls) {
+- if (libjsig_is_loaded) {
+- if (PrintJNIResolving) {
+- tty->print_cr("Info: libjsig is activated, all active signal checking is disabled");
+- }
+- check_signals = false;
+- }
+- if (AllowUserSignalHandlers) {
+- if (PrintJNIResolving) {
+- tty->print_cr("Info: AllowUserSignalHandlers is activated, all active signal checking is disabled");
+- }
+- check_signals = false;
+- }
+- }
+- }
+-}
+-
+
+ /////
+ // glibc on Bsd platform uses non-documented flag
+@@ -3469,14 +3044,6 @@ jint os::init_2(void) {
+ log_info(os)("Memory Serialize Page address: " INTPTR_FORMAT, p2i(mem_serialize_page));
+ }
+
+- // initialize suspend/resume support - must do this before signal_sets_init()
+- if (SR_initialize() != 0) {
+- perror("SR_initialize failed");
+- return JNI_ERR;
+- }
+-
+- Bsd::signal_sets_init();
+- Bsd::install_signal_handlers();
+
+ // Check and sets minimum stack sizes against command line options
+ if (Posix::set_minimum_stack_sizes() == JNI_ERR) {
+@@ -3542,16 +3109,18 @@ jint os::init_2(void) {
+
+ // Mark the polling page as unreadable
+ void os::make_polling_page_unreadable(void) {
+- if (!guard_memory((char*)_polling_page, Bsd::page_size())) {
+- fatal("Could not disable polling page");
+- }
++ //if (!guard_memory((char*)_polling_page, Bsd::page_size())) {
++ // fatal("Could not disable polling page");
++ //}
++ NOT_IMPL;
+ }
+
+ // Mark the polling page as readable
+ void os::make_polling_page_readable(void) {
+- if (!bsd_mprotect((char *)_polling_page, Bsd::page_size(), PROT_READ)) {
+- fatal("Could not enable polling page");
+- }
++ //if (!bsd_mprotect((char *)_polling_page, Bsd::page_size(), PROT_READ)) {
++ // fatal("Could not enable polling page");
++ //}
++ NOT_IMPL;
+ }
+
+ int os::active_processor_count() {
+@@ -3581,6 +3150,9 @@ bool os::bind_to_processor(uint processor_id) {
+ }
+
+ void os::SuspendedThreadTask::internal_do_task() {
++ printf("%s called from", __func__);
++ backtrace();
++
+ if (do_suspend(_thread->osthread())) {
+ SuspendedThreadTaskContext context(_thread, _thread->osthread()->ucontext());
+ do_task(context);
+@@ -3721,7 +3293,7 @@ static inline struct timespec get_mtime(const char* filename) {
+ #ifdef __APPLE__
+ return st.st_mtimespec;
+ #else
+- return st.st_mtim;
++ return st.st_mtimespec;
+ #endif
+ }
+
+@@ -3910,11 +3482,6 @@ char* os::pd_remap_memory(int fd, const char* file_name, size_t file_offset,
+ }
+
+
+-// Unmap a block of memory.
+-bool os::pd_unmap_memory(char* addr, size_t bytes) {
+- return munmap(addr, bytes) == 0;
+-}
+-
+ // current_thread_cpu_time(bool) and thread_cpu_time(Thread*, bool)
+ // are used by JVM M&M and JVMTI to get user+sys or user CPU time
+ // of a thread.
+@@ -4555,3 +4122,407 @@ bool os::start_debugging(char *buf, int buflen) {
+ }
+ return yes;
+ }
++
++/**************************
++ ** VM region management **
++ **************************/
++
++
++namespace Genode {
++ class Vm_area;
++ class Vm_area_registry;
++ class Vm_region_map;
++};
++
++class Genode::Vm_region_map
++{
++ public:
++
++ typedef Region_map_client::Local_addr Local_addr;
++
++ private:
++
++ enum { VM_SIZE = 384ul * 1024 * 1024 };
++ Env &_env;
++ Rm_connection _rm_connection { _env };
++ Region_map_client _rm { _rm_connection.create(VM_SIZE) };
++ addr_t const _base { _env.rm().attach(_rm.dataspace()) };
++ Allocator_avl _range;
++
++ public:
++
++ Vm_region_map(Env &env, Allocator &md_alloc)
++ : _env(env), _range(&md_alloc)
++ {
++ _range.add_range(_base, VM_SIZE);
++ }
++
++ addr_t alloc_region(size_t size, int align)
++ {
++ addr_t addr = 0;
++ if (_range.alloc_aligned(size, (void **)&addr,
++ align > 12 ? align : 12).error())
++ throw -1;
++
++ return addr;
++ }
++
++ void free_region(addr_t vaddr) { _range.free((void *)vaddr); }
++
++ Local_addr attach_at(Dataspace_capability ds, addr_t local_addr)
++ {
++ return retry(
++ [&] () {
++ return _rm.attach_at(ds, local_addr - _base);
++ },
++ [&] () { _env.upgrade(Parent::Env::pd(), "ram_quota=8K"); });
++ }
++
++ Local_addr attach_executable(Dataspace_capability ds, addr_t local_addr)
++ {
++ return retry(
++ [&] () {
++ return _rm.attach_executable(ds, local_addr - _base);
++ },
++ [&] () { _env.upgrade(Parent::Env::pd(), "ram_quota=8K"); });
++ }
++
++ void detach(Local_addr local_addr) { _rm.detach((addr_t)local_addr - _base); }
++};
++
++class Genode::Vm_area
++{
++ private:
++
++ struct Vm_area_ds
++ {
++ addr_t base;
++ size_t size;
++ Ram_dataspace_capability ds;
++
++ Vm_area_ds(addr_t base, size_t size, Ram_dataspace_capability ds)
++ : base(base), size(size), ds(ds) { }
++
++ virtual ~Vm_area_ds() { };
++ };
++
++ typedef Registered Vm_handle;
++
++ Env &_env;
++ Heap &_heap;
++ Vm_region_map &_rm;
++ size_t const _base;
++ addr_t const _size;
++ Registry _ds;
++
++ public:
++
++ Vm_area(Env &env, Heap &heap, Vm_region_map &rm, addr_t base, size_t size)
++ : _env(env), _heap(heap), _rm(rm), _base(base), _size(size)
++ { }
++
++ addr_t base() const { return _base; }
++ size_t size() const { return _size; }
++
++ bool inside(addr_t base, size_t size) {
++ return base >= _base && (base + size) <= (_base + _size); }
++
++ bool commit(addr_t base, size_t size, bool executable)
++ {
++ if (!inside(base, size))
++ return false;
++
++ Ram_dataspace_capability ds = _env.ram().alloc(size);
++
++ try {
++ if (executable)
++ _rm.attach_executable(ds, base);
++ else
++ _rm.attach_at(ds, base);
++ } catch (...) {
++ _env.ram().free(ds);
++ return false;
++ }
++
++ new (_heap) Vm_handle(_ds, base, size, ds);
++
++ return true;
++ }
++
++ virtual ~Vm_area()
++ {
++ _ds.for_each([&] (Vm_handle &vm) {
++
++ _rm.detach(vm.base);
++ _env.ram().free(vm.ds);
++ destroy(_heap, &vm);
++ });
++ }
++};
++
++
++class Genode::Vm_area_registry
++{
++ private:
++
++ typedef Registered Vm_area_handle;
++
++ Env &_env;
++ Heap _heap { _env.ram(), _env.rm() };
++ Registry _registry;
++ Vm_region_map _rm { _env, _heap };
++
++ public:
++
++ Vm_area_registry(Env &env) : _env(env)
++ { }
++
++ addr_t reserve(size_t size, addr_t base, int align)
++ {
++ if (base) {
++ Genode::error("vm_start set");
++ while(1);
++ }
++ base = _rm.alloc_region(size, align);
++ Vm_area *vm = new (&_heap) Vm_area_handle(_registry, _env, _heap, _rm, base, size);
++ return base;
++ }
++
++ bool commit(addr_t base, size_t size, bool executable)
++ {
++ bool success = false;
++
++ _registry.for_each([&] (Vm_area_handle &vm) {
++ if (success) return;
++ success = vm.commit(base, size, executable);
++ });
++
++ return success;
++ }
++
++ bool release(addr_t base, size_t size)
++ {
++ bool success = false;
++
++ _registry.for_each([&] (Vm_area_handle &vm) {
++ if (success || !vm.inside(base, size)) return;
++
++ if (base != vm.base() || size != vm.size()) {
++ error(__func__, " sub region release ", " addr: ", Hex(base), " vm addr: ", Hex(vm.base()),
++ " size: ", Hex(size), " vm size: ", Hex(vm.size()));
++ while (1);
++ }
++
++ _rm.free_region(vm.base());
++ destroy(_heap, &vm);
++ success = true;
++ });
++
++ if (!success) error(__func__, " failed");
++
++ return success;
++ }
++};
++
++static Genode::Constructible vm_reg;
++
++char* os::pd_reserve_memory(size_t bytes, char* requested_addr,
++ size_t alignment_hint)
++{
++ try {
++ Genode::addr_t addr = vm_reg->reserve(bytes, (Genode::addr_t)requested_addr,
++ alignment_hint ? Genode::log2(alignment_hint) : 12);
++ return (char *)addr;
++ } catch (...) {
++ Genode::error(__PRETTY_FUNCTION__, " exception!");
++ }
++ return nullptr;
++}
++
++
++/*
++ * Reserve memory at an arbitrary address, only if that area is
++ * available (and not reserved for something else)
++ */
++char* os::pd_attempt_reserve_memory_at(size_t bytes, char* requested_addr)
++{
++ return pd_reserve_memory(bytes, requested_addr, 0);
++}
++
++
++bool os::pd_release_memory(char* addr, size_t size) {
++ return vm_reg->release((Genode::addr_t)addr, size);
++}
++
++
++bool os::pd_unmap_memory(char* addr, size_t bytes) {
++ return vm_reg->release((Genode::addr_t)addr, bytes);
++}
++
++
++bool os::pd_commit_memory(char* addr, size_t size, bool exec) {
++
++ if (!addr) {
++ Genode::error(__PRETTY_FUNCTION__, " addr == 0");
++ while(1);
++ }
++
++ return vm_reg->commit((Genode::addr_t)addr, size, exec);
++}
++
++
++bool os::pd_commit_memory(char* addr, size_t size, size_t alignment_hint,
++ bool exec) {
++ // alignment_hint is ignored on this OS
++ return pd_commit_memory(addr, size, exec);
++}
++
++
++void os::pd_commit_memory_or_exit(char* addr, size_t size, bool exec,
++ const char* mesg) {
++ assert(mesg != NULL, "mesg must be specified");
++ if (!pd_commit_memory(addr, size, exec)) {
++ // add extra info in product mode for vm_exit_out_of_memory():
++ PRODUCT_ONLY(warn_fail_commit_memory(addr, size, exec, errno);)
++ vm_exit_out_of_memory(size, OOM_MMAP_ERROR, "%s", mesg);
++ }
++}
++
++
++void os::pd_commit_memory_or_exit(char* addr, size_t size,
++ size_t alignment_hint, bool exec,
++ const char* mesg) {
++ // alignment_hint is ignored on this OS
++ pd_commit_memory_or_exit(addr, size, exec, mesg);
++}
++
++
++void os::pd_realign_memory(char *addr, size_t bytes, size_t alignment_hint) {
++ NOT_IMPL;
++}
++
++
++bool os::pd_uncommit_memory(char* addr, size_t size) {
++ Genode::error(__PRETTY_FUNCTION__, "addr: ", (void *)addr, " size: ", (void *)size);
++ while (1);
++#ifdef __OpenBSD__
++ // XXX: Work-around mmap/MAP_FIXED bug temporarily on OpenBSD
++ return ::mprotect(addr, size, PROT_NONE) == 0;
++#else
++ uintptr_t res = (uintptr_t) ::mmap(addr, size, PROT_NONE,
++ MAP_PRIVATE|MAP_FIXED|MAP_NORESERVE|MAP_ANONYMOUS, -1, 0);
++ return res != (uintptr_t) MAP_FAILED;
++#endif
++}
++
++
++/************
++ ** atomic **
++ ************/
++
++int os::cmpxchg(int oldval, int newval, volatile int *ptr)
++{
++ return !Genode::cmpxchg(ptr, oldval, newval);
++}
++
++
++/******************
++ ** Startup code **
++ ******************/
++
++extern char **genode_argv;
++extern int genode_argc;
++extern char **genode_envp;
++
++/* initial environment for the FreeBSD libc implementation */
++extern char **environ;
++
++/* provided by the application */
++extern "C" int main(int argc, char ** argv, char **envp);
++
++
++static void construct_component(Libc::Env &env)
++{
++ using Genode::Xml_node;
++ using Genode::Xml_attribute;
++
++ env.config([&] (Xml_node const &node) {
++ int argc = 0;
++ int envc = 0;
++ char **argv;
++ char **envp;
++
++ /* count the number of arguments and environment variables */
++ node.for_each_sub_node([&] (Xml_node const &node) {
++ /* check if the 'value' attribute exists */
++ if (node.has_type("arg") && node.has_attribute("value"))
++ ++argc;
++ else
++ if (node.has_type("env") && node.has_attribute("key") && node.has_attribute("value"))
++ ++envc;
++ });
++
++ if (argc == 0 && envc == 0)
++ return; /* from lambda */
++
++ /* arguments and environment are a contiguous array (but don't count on it) */
++ argv = (char**)malloc((argc + envc + 1) * sizeof(char*));
++ envp = &argv[argc];
++
++ /* read the arguments */
++ int arg_i = 0;
++ int env_i = 0;
++ node.for_each_sub_node([&] (Xml_node const &node) {
++ /* insert an argument */
++ if (node.has_type("arg")) try {
++ Xml_attribute attr = node.attribute("value");
++
++ Genode::size_t const arg_len = attr.value_size()+1;
++ char *arg = argv[arg_i] = (char*)malloc(arg_len);
++
++ attr.value(arg, arg_len);
++ ++arg_i;
++
++ } catch (Xml_node::Nonexistent_sub_node) { }
++
++ else
++
++ /* insert an environment variable */
++ if (node.has_type("env")) try {
++ Xml_attribute key_attr = node.attribute("key");
++ Xml_attribute val_attr = node.attribute("value");
++
++ Genode::size_t const pair_len =
++ key_attr.value_size() +
++ val_attr.value_size() + 1;
++ char *env = envp[env_i] = (char*)malloc(pair_len);
++
++ Genode::size_t off = 0;
++ key_attr.value(&env[off], key_attr.value_size()+1);
++ off = key_attr.value_size();
++ env[off++] = '=';
++ val_attr.value(&env[off], val_attr.value_size()+1);
++ ++env_i;
++
++ } catch (Xml_node::Nonexistent_sub_node) { }
++ });
++
++ envp[env_i] = NULL;
++
++ /* register command-line arguments at Genode's startup code */
++ genode_argc = argc;
++ genode_argv = argv;
++ genode_envp = environ = envp;
++ });
++
++ exit(main(genode_argc, genode_argv, genode_envp));
++}
++
++
++void Libc::Component::construct(Libc::Env &env)
++{
++ vm_reg.construct(env);
++
++ Libc::with_libc([&] () { construct_component(env); });
++}
++
diff --git a/repos/ports/src/app/jdk/patches/os_bsd_zero.patch b/repos/ports/src/app/jdk/patches/os_bsd_zero.patch
new file mode 100644
index 0000000000..4016ef35eb
--- /dev/null
+++ b/repos/ports/src/app/jdk/patches/os_bsd_zero.patch
@@ -0,0 +1,13 @@
+diff --git a/hotspot/src/os_cpu/bsd_zero/vm/os_bsd_zero.cpp b/hotspot/src/os_cpu/bsd_zero/vm/os_bsd_zero.cpp
+index 15a5b7d..e4d30f7 100644
+--- a/hotspot/src/os_cpu/bsd_zero/vm/os_bsd_zero.cpp
++++ b/hotspot/src/os_cpu/bsd_zero/vm/os_bsd_zero.cpp
+@@ -63,7 +63,7 @@
+ extern sigjmp_buf* get_jmp_buf_for_continuation();
+
+ address os::current_stack_pointer() {
+- address dummy = (address) &dummy;
++ volatile address dummy = (address) &dummy;
+ return dummy;
+ }
+
diff --git a/repos/ports/src/app/jdk/patches/pollselectorprovider.patch b/repos/ports/src/app/jdk/patches/pollselectorprovider.patch
new file mode 100644
index 0000000000..b3afb3492a
--- /dev/null
+++ b/repos/ports/src/app/jdk/patches/pollselectorprovider.patch
@@ -0,0 +1,28 @@
+Use PollSelectorProvider instead of EPollSelectorProvider
+
+diff --git a/jdk/src/java.base/linux/classes/sun/nio/ch/DefaultSelectorProvider.java b/jdk/src/java.base/linux/classes/sun/nio/ch/DefaultSelectorProvider.java
+index 1278f15..3f23cc4 100644
+--- a/jdk/src/java.base/linux/classes/sun/nio/ch/DefaultSelectorProvider.java
++++ b/jdk/src/java.base/linux/classes/sun/nio/ch/DefaultSelectorProvider.java
+@@ -42,7 +42,7 @@ public class DefaultSelectorProvider {
+ * Returns the default SelectorProvider.
+ */
+ public static SelectorProvider create() {
+- return new sun.nio.ch.EPollSelectorProvider();
++ return new sun.nio.ch.PollSelectorProvider();
+ }
+
+ }
+diff --git a/make/CompileJavaModules.gmk b/make/CompileJavaModules.gmk
+index 090434a..507dd10 100644
+--- a/make/CompileJavaModules.gmk
++++ b/make/CompileJavaModules.gmk
+@@ -55,7 +55,7 @@ java.base_EXCLUDES += java/lang/doc-files
+ # data files and shouldn't go in the product
+ java.base_EXCLUDE_FILES += sun/text/resources/BreakIteratorRules.java
+
+-ifneq ($(filter solaris macosx linux windows,$(OPENJDK_TARGET_OS)), )
++ifneq ($(filter solaris macosx windows,$(OPENJDK_TARGET_OS)), )
+ java.base_EXCLUDE_FILES += \
+ sun/nio/ch/AbstractPollSelectorImpl.java \
+ sun/nio/ch/PollSelectorImpl.java \
diff --git a/repos/ports/src/app/jdk/patches/size.patch b/repos/ports/src/app/jdk/patches/size.patch
new file mode 100644
index 0000000000..8d65c14ef9
--- /dev/null
+++ b/repos/ports/src/app/jdk/patches/size.patch
@@ -0,0 +1,85 @@
+commit 7a6a25557a0b21e0d3202f04a4172b3fa5e9a4e9
+Author: Sebastian Sumpf
+Date: Mon Apr 16 11:08:15 2018 +0200
+
+ jdk: size_t patch
+
+diff --git a/hotspot/src/share/vm/gc/g1/g1PageBasedVirtualSpace.cpp b/hotspot/src/share/vm/gc/g1/g1PageBasedVirtualSpace.cpp
+index 0a2a462..7bc5011 100644
+--- a/hotspot/src/share/vm/gc/g1/g1PageBasedVirtualSpace.cpp
++++ b/hotspot/src/share/vm/gc/g1/g1PageBasedVirtualSpace.cpp
+@@ -99,7 +99,7 @@ size_t G1PageBasedVirtualSpace::uncommitted_size() const {
+ return reserved_size() - committed_size();
+ }
+
+-size_t G1PageBasedVirtualSpace::addr_to_page_index(char* addr) const {
++uintptr_t G1PageBasedVirtualSpace::addr_to_page_index(char* addr) const {
+ return (addr - _low_boundary) / _page_size;
+ }
+
+diff --git a/hotspot/src/share/vm/prims/whitebox.cpp b/hotspot/src/share/vm/prims/whitebox.cpp
+index 952aa5f..ab3c3b8 100644
+--- a/hotspot/src/share/vm/prims/whitebox.cpp
++++ b/hotspot/src/share/vm/prims/whitebox.cpp
+@@ -1022,7 +1022,7 @@ WB_ENTRY(jobject, WB_GetUint64VMFlag(JNIEnv* env, jobject o, jstring name))
+ WB_END
+
+ WB_ENTRY(jobject, WB_GetSizeTVMFlag(JNIEnv* env, jobject o, jstring name))
+- uintx result;
++ size_t result;
+ if (GetVMFlag (thread, env, name, &result, &CommandLineFlags::size_tAt)) {
+ ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI
+ return longBox(thread, env, result);
+diff --git a/hotspot/src/share/vm/runtime/arguments.cpp b/hotspot/src/share/vm/runtime/arguments.cpp
+index 92f18dd..9164cbf 100644
+--- a/hotspot/src/share/vm/runtime/arguments.cpp
++++ b/hotspot/src/share/vm/runtime/arguments.cpp
+@@ -78,7 +78,7 @@ SystemProperty* Arguments::_system_properties = NULL;
+ const char* Arguments::_gc_log_filename = NULL;
+ bool Arguments::_has_profile = false;
+ size_t Arguments::_conservative_max_heap_alignment = 0;
+-size_t Arguments::_min_heap_size = 0;
++uintx Arguments::_min_heap_size = 0;
+ Arguments::Mode Arguments::_mode = _mixed;
+ bool Arguments::_java_compiler = false;
+ bool Arguments::_xdebug_mode = false;
+diff --git a/hotspot/src/share/vm/utilities/globalDefinitions.hpp b/hotspot/src/share/vm/utilities/globalDefinitions.hpp
+index dbb080e..11c3278 100644
+--- a/hotspot/src/share/vm/utilities/globalDefinitions.hpp
++++ b/hotspot/src/share/vm/utilities/globalDefinitions.hpp
+@@ -284,8 +284,7 @@ inline size_t byte_size_in_exact_unit(size_t s) {
+
+ // intx and uintx are the 'extended' int and 'extended' unsigned int types;
+ // they are 32bit wide on a 32-bit platform, and 64bit wide on a 64bit platform.
+-
+-typedef intptr_t intx;
++typedef intptr_t intx;
+ typedef uintptr_t uintx;
+
+ const intx min_intx = (intx)1 << (sizeof(intx)*BitsPerByte-1);
+@@ -1106,10 +1105,10 @@ inline intptr_t bitfield(intptr_t x, int start_bit_no, int field_length) {
+ // and 64-bit overloaded functions, which does not work, and having
+ // explicitly-typed versions of these routines (i.e., MAX2I, MAX2L)
+ // will be even more error-prone than macros.
+-template inline T MAX2(T a, T b) { return (a > b) ? a : b; }
+-template inline T MIN2(T a, T b) { return (a < b) ? a : b; }
++template inline T MAX2(T a, U b) { return (a > b) ? a : b; }
++template inline T MIN2(T a, U b) { return (a < b) ? a : b; }
+ template inline T MAX3(T a, T b, T c) { return MAX2(MAX2(a, b), c); }
+-template inline T MIN3(T a, T b, T c) { return MIN2(MIN2(a, b), c); }
++template inline T MIN3(T a, U b, V c) { return MIN2(MIN2(a, b), c); }
+ template inline T MAX4(T a, T b, T c, T d) { return MAX2(MAX3(a, b, c), d); }
+ template inline T MIN4(T a, T b, T c, T d) { return MIN2(MIN3(a, b, c), d); }
+
+diff --git a/hotspot/src/share/vm/utilities/macros.hpp b/hotspot/src/share/vm/utilities/macros.hpp
+index f24e4ff..534cb29 100644
+--- a/hotspot/src/share/vm/utilities/macros.hpp
++++ b/hotspot/src/share/vm/utilities/macros.hpp
+@@ -334,7 +334,6 @@
+ #endif
+
+ #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__APPLE__)
+-#define BSD
+ #define BSD_ONLY(code) code
+ #define NOT_BSD(code)
+ #else