--- old/src/hotspot/share/prims/unsafe.cpp 2018-07-19 11:58:50.481280067 +0100 +++ new/src/hotspot/share/prims/unsafe.cpp 2018-07-19 11:58:50.214279263 +0100 @@ -42,6 +42,7 @@ #include "runtime/jniHandles.inline.hpp" #include "runtime/orderAccess.hpp" #include "runtime/reflection.hpp" +#include "runtime/sharedRuntime.hpp" #include "runtime/thread.hpp" #include "runtime/threadSMR.hpp" #include "runtime/vm_version.hpp" @@ -442,6 +443,74 @@ } } UNSAFE_END +UNSAFE_LEAF (void, Unsafe_WriteBack0(JNIEnv *env, jobject unsafe, jlong line)) { +#ifndef PRODUCT + if (TraceMemoryWriteback) { + tty->print_cr("Unsafe: writeback 0x%p", addr_from_java(line)); + } +#endif + + // guard against currently unimplemented cases +#if !defined(LINUX) || !(defined(AARCH64) || defined(AMD64)) + // TODO - implement for solaris/AIX/BSD/WINDOWS and for 32 bit + JNU_ThrowRuntimeException(env, "writeback is not implemented"); + return IOS_THROWN; +#else + void (*wb)(void *); + void *a = addr_from_java(line); + wb = (void (*)(void *)) StubRoutines::data_cache_writeback(); + assert(wb != NULL, "generate writeback stub!"); + (*wb)(a); +#endif +} UNSAFE_END + +static void doWriteBackSync0(bool isPre) +{ + void (*wbsync)(int); + wbsync = (void (*)(int)) StubRoutines::data_cache_writeback_sync(); + assert(wbsync != NULL, "generate writeback sync stub!"); + (*wbsync)(isPre); +} + +UNSAFE_LEAF (void, Unsafe_WriteBackPreSync0(JNIEnv *env, jobject unsafe)) { +#ifndef PRODUCT + if (TraceMemoryWriteback) { + tty->print_cr("Unsafe: writeback pre-sync"); + } +#endif +#if !defined(LINUX) || !(defined(AARCH64) || defined(AMD64)) + // TODO - implement for solaris/AIX/BSD/WINDOWS and for 32 bit + JNU_ThrowRuntimeException(env, "writeback sync is not implemented"); + return IOS_THROWN; +#else + doWriteBackSync0(true); +#endif +} UNSAFE_END + +UNSAFE_LEAF (void, Unsafe_WriteBackPostSync0(JNIEnv *env, jobject unsafe)) { +#ifndef PRODUCT + if (TraceMemoryWriteback) { + tty->print_cr("Unsafe: writeback pre-sync"); + } +#endif +#if !defined(LINUX) || !(defined(AARCH64) || defined(AMD64)) + // TODO - implement for solaris/AIX/BSD/WINDOWS and for 32 bit + JNU_ThrowRuntimeException(env, "writeback sync is not implemented"); + return IOS_THROWN; +#else + doWriteBackSync0(false); +#endif +} UNSAFE_END + +UNSAFE_LEAF(jint, Unsafe_DataCacheLineFlushSize0()) { + jint size = (jint)VM_Version::data_cache_line_flush_size(); + // TODO -- ensure every CPU actually sets this + if (size == 0) { + size = (jint)DEFAULT_CACHE_LINE_SIZE; + } + return size; +} UNSAFE_END + ////// Random queries UNSAFE_LEAF(jint, Unsafe_AddressSize0(JNIEnv *env, jobject unsafe)) { @@ -1061,6 +1130,7 @@ {CC "ensureClassInitialized0", CC "(" CLS ")V", FN_PTR(Unsafe_EnsureClassInitialized0)}, {CC "arrayBaseOffset0", CC "(" CLS ")I", FN_PTR(Unsafe_ArrayBaseOffset0)}, {CC "arrayIndexScale0", CC "(" CLS ")I", FN_PTR(Unsafe_ArrayIndexScale0)}, + {CC "dataCacheLineFlushSize0", CC "()I", FN_PTR(Unsafe_DataCacheLineFlushSize0)}, {CC "addressSize0", CC "()I", FN_PTR(Unsafe_AddressSize0)}, {CC "pageSize", CC "()I", FN_PTR(Unsafe_PageSize)}, @@ -1081,6 +1151,9 @@ {CC "copyMemory0", CC "(" OBJ "J" OBJ "JJ)V", FN_PTR(Unsafe_CopyMemory0)}, {CC "copySwapMemory0", CC "(" OBJ "J" OBJ "JJJ)V", FN_PTR(Unsafe_CopySwapMemory0)}, + {CC "writeback0", CC "(" "J" ")V", FN_PTR(Unsafe_WriteBack0)}, + {CC "writebackPreSync0", CC "()V", FN_PTR(Unsafe_WriteBackPreSync0)}, + {CC "writebackPostSync0", CC "()V", FN_PTR(Unsafe_WriteBackPostSync0)}, {CC "setMemory0", CC "(" OBJ "JJB)V", FN_PTR(Unsafe_SetMemory0)}, {CC "defineAnonymousClass0", CC "(" DAC_Args ")" CLS, FN_PTR(Unsafe_DefineAnonymousClass0)},