< prev index next >

src/hotspot/share/prims/unsafe.cpp

Print this page

        

@@ -40,10 +40,11 @@
 #include "runtime/globals.hpp"
 #include "runtime/interfaceSupport.inline.hpp"
 #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"
 #include "services/threadService.hpp"
 #include "utilities/align.hpp"

@@ -440,10 +441,78 @@
       Copy::conjoint_swap(src, dst, sz, esz);
     } JVM_END
   }
 } 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)) {
   return sizeof(void*);
 } UNSAFE_END

@@ -1059,10 +1128,11 @@
     {CC "staticFieldOffset0", CC "(" FLD ")J",           FN_PTR(Unsafe_StaticFieldOffset0)},
     {CC "staticFieldBase0",   CC "(" FLD ")" OBJ,        FN_PTR(Unsafe_StaticFieldBase0)},
     {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)},
 
     {CC "defineClass0",       CC "(" DC_Args ")" CLS,    FN_PTR(Unsafe_DefineClass0)},
     {CC "allocateInstance",   CC "(" CLS ")" OBJ,        FN_PTR(Unsafe_AllocateInstance)},

@@ -1079,10 +1149,13 @@
 
     {CC "getLoadAverage0",    CC "([DI)I",               FN_PTR(Unsafe_GetLoadAverage0)},
 
     {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)},
 
     {CC "shouldBeInitialized0", CC "(" CLS ")Z",         FN_PTR(Unsafe_ShouldBeInitialized0)},
< prev index next >