1 /* src/native/vm/sun_misc_Unsafe.c - sun/misc/Unsafe
3 Copyright (C) 2006, 2007, 2008
4 CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
6 This file is part of CACAO.
8 This program is free software; you can redistribute it and/or
9 modify it under the terms of the GNU General Public License as
10 published by the Free Software Foundation; either version 2, or (at
11 your option) any later version.
13 This program is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
31 #include "threads/atomic.hpp"
33 #include "mm/memory.h"
35 #include "native/jni.h"
36 #include "native/llni.h"
37 #include "native/native.h"
39 #include "native/include/java_lang_Object.h" /* before c.l.C */
40 #include "native/include/java_lang_String.h" /* required by j.l.CL */
42 #if defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
43 # include "native/include/java_nio_ByteBuffer.h" /* required by j.l.CL */
46 #include "native/include/java_lang_ClassLoader.h" /* required by j.l.C */
47 #include "native/include/java_lang_Class.h"
48 #include "native/include/java_lang_reflect_Field.h"
49 #include "native/include/java_lang_Thread.h" /* required by s.m.U */
50 #include "native/include/java_lang_Throwable.h"
52 #if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
53 # include "native/include/java_lang_reflect_VMField.h"
56 #include "native/include/java_security_ProtectionDomain.h" /* required by smU */
58 #include "native/include/sun_misc_Unsafe.h"
60 #include "vm/builtin.h"
61 #include "vm/exceptions.h"
62 #include "vm/initialize.h"
63 #include "vm/stringlocal.h"
65 #include "vmcore/system.h"
66 #include "vmcore/utf8.h"
69 /* native methods implemented by this file ************************************/
71 static JNINativeMethod methods[] = {
72 { "registerNatives", "()V", (void *) (intptr_t) &Java_sun_misc_Unsafe_registerNatives },
73 { "getInt", "(Ljava/lang/Object;J)I", (void *) (intptr_t) &Java_sun_misc_Unsafe_getInt__Ljava_lang_Object_2J },
74 { "putInt", "(Ljava/lang/Object;JI)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putInt__Ljava_lang_Object_2JI },
75 { "getObject", "(Ljava/lang/Object;J)Ljava/lang/Object;", (void *) (intptr_t) &Java_sun_misc_Unsafe_getObject },
76 { "putObject", "(Ljava/lang/Object;JLjava/lang/Object;)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putObject },
77 { "getBoolean", "(Ljava/lang/Object;J)Z", (void *) (intptr_t) &Java_sun_misc_Unsafe_getBoolean },
78 { "putBoolean", "(Ljava/lang/Object;JZ)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putBoolean },
79 { "getByte", "(Ljava/lang/Object;J)B", (void *) (intptr_t) &Java_sun_misc_Unsafe_getByte__Ljava_lang_Object_2J },
80 { "putByte", "(Ljava/lang/Object;JB)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putByte__Ljava_lang_Object_2JB },
81 { "getShort", "(Ljava/lang/Object;J)S", (void *) (intptr_t) &Java_sun_misc_Unsafe_getShort__Ljava_lang_Object_2J },
82 { "putShort", "(Ljava/lang/Object;JS)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putShort__Ljava_lang_Object_2JS },
83 { "getChar", "(Ljava/lang/Object;J)C", (void *) (intptr_t) &Java_sun_misc_Unsafe_getChar__Ljava_lang_Object_2J },
84 { "putChar", "(Ljava/lang/Object;JC)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putChar__Ljava_lang_Object_2JC },
85 { "getLong", "(Ljava/lang/Object;J)J", (void *) (intptr_t) &Java_sun_misc_Unsafe_getLong__Ljava_lang_Object_2J },
86 { "putLong", "(Ljava/lang/Object;JJ)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putLong__Ljava_lang_Object_2JJ },
87 { "getFloat", "(Ljava/lang/Object;J)F", (void *) (intptr_t) &Java_sun_misc_Unsafe_getFloat__Ljava_lang_Object_2J },
88 { "putFloat", "(Ljava/lang/Object;JF)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putFloat__Ljava_lang_Object_2JF },
89 { "getDouble", "(Ljava/lang/Object;J)D", (void *) (intptr_t) &Java_sun_misc_Unsafe_getDouble__Ljava_lang_Object_2J },
90 { "putDouble", "(Ljava/lang/Object;JD)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putDouble__Ljava_lang_Object_2JD },
91 { "getByte", "(J)B", (void *) (intptr_t) &Java_sun_misc_Unsafe_getByte__J },
92 { "putByte", "(JB)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putByte__JB },
93 { "getShort", "(J)S", (void *) (intptr_t) &Java_sun_misc_Unsafe_getShort__J },
94 { "putShort", "(JS)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putShort__JS },
95 { "getChar", "(J)C", (void *) (intptr_t) &Java_sun_misc_Unsafe_getChar__J },
96 { "putChar", "(JC)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putChar__JC },
97 { "getInt", "(J)I", (void *) (intptr_t) &Java_sun_misc_Unsafe_getInt__J },
98 { "putInt", "(JI)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putInt__JI },
99 { "getLong", "(J)J", (void *) (intptr_t) &Java_sun_misc_Unsafe_getLong__J },
100 { "putLong", "(JJ)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putLong__JJ },
101 { "getFloat", "(J)F", (void *) (intptr_t) &Java_sun_misc_Unsafe_getFloat__J },
102 { "objectFieldOffset", "(Ljava/lang/reflect/Field;)J", (void *) (intptr_t) &Java_sun_misc_Unsafe_objectFieldOffset },
103 { "allocateMemory", "(J)J", (void *) (intptr_t) &Java_sun_misc_Unsafe_allocateMemory },
106 { "setMemory", "(Ljava/lang/Object;JJB)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_setMemory },
107 { "copyMemory", "(Ljava/lang/Object;JLjava/lang/Object;JJ)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_copyMemory },
109 { "setMemory", "(JJB)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_setMemory },
110 { "copyMemory", "(JJJ)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_copyMemory },
112 { "freeMemory", "(J)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_freeMemory },
113 { "staticFieldOffset", "(Ljava/lang/reflect/Field;)J", (void *) (intptr_t) &Java_sun_misc_Unsafe_staticFieldOffset },
114 { "staticFieldBase", "(Ljava/lang/reflect/Field;)Ljava/lang/Object;", (void *) (intptr_t) &Java_sun_misc_Unsafe_staticFieldBase },
115 { "ensureClassInitialized", "(Ljava/lang/Class;)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_ensureClassInitialized },
116 { "arrayBaseOffset", "(Ljava/lang/Class;)I", (void *) (intptr_t) &Java_sun_misc_Unsafe_arrayBaseOffset },
117 { "arrayIndexScale", "(Ljava/lang/Class;)I", (void *) (intptr_t) &Java_sun_misc_Unsafe_arrayIndexScale },
118 { "addressSize", "()I", (void *) (intptr_t) &Java_sun_misc_Unsafe_addressSize },
119 { "pageSize", "()I", (void *) (intptr_t) &Java_sun_misc_Unsafe_pageSize },
120 { "defineClass", "(Ljava/lang/String;[BIILjava/lang/ClassLoader;Ljava/security/ProtectionDomain;)Ljava/lang/Class;", (void *) (intptr_t) &Java_sun_misc_Unsafe_defineClass__Ljava_lang_String_2_3BIILjava_lang_ClassLoader_2Ljava_security_ProtectionDomain_2 },
121 { "allocateInstance", "(Ljava/lang/Class;)Ljava/lang/Object;", (void *) (intptr_t) &Java_sun_misc_Unsafe_allocateInstance },
122 { "throwException", "(Ljava/lang/Throwable;)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_throwException },
123 { "compareAndSwapObject", "(Ljava/lang/Object;JLjava/lang/Object;Ljava/lang/Object;)Z", (void *) (intptr_t) &Java_sun_misc_Unsafe_compareAndSwapObject },
124 { "compareAndSwapInt", "(Ljava/lang/Object;JII)Z", (void *) (intptr_t) &Java_sun_misc_Unsafe_compareAndSwapInt },
125 { "compareAndSwapLong", "(Ljava/lang/Object;JJJ)Z", (void *) (intptr_t) &Java_sun_misc_Unsafe_compareAndSwapLong },
126 { "getObjectVolatile", "(Ljava/lang/Object;J)Ljava/lang/Object;", (void *) (intptr_t) &Java_sun_misc_Unsafe_getObjectVolatile },
127 { "putObjectVolatile", "(Ljava/lang/Object;JLjava/lang/Object;)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putObjectVolatile },
128 { "getIntVolatile", "(Ljava/lang/Object;J)I", (void *) (intptr_t) &Java_sun_misc_Unsafe_getIntVolatile },
129 { "putIntVolatile", "(Ljava/lang/Object;JI)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putIntVolatile },
130 { "getLongVolatile", "(Ljava/lang/Object;J)J", (void *) (intptr_t) &Java_sun_misc_Unsafe_getLongVolatile },
131 { "putLongVolatile", "(Ljava/lang/Object;JJ)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putLongVolatile },
132 { "getDoubleVolatile", "(Ljava/lang/Object;J)D", (void *) (intptr_t) &Java_sun_misc_Unsafe_getDoubleVolatile },
133 { "putOrderedObject", "(Ljava/lang/Object;JLjava/lang/Object;)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putOrderedObject },
134 { "putOrderedInt", "(Ljava/lang/Object;JI)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putOrderedInt },
135 { "putOrderedLong", "(Ljava/lang/Object;JJ)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putOrderedLong },
136 { "unpark", "(Ljava/lang/Object;)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_unpark },
137 { "park", "(ZJ)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_park },
141 /* _Jv_sun_misc_Unsafe_init ****************************************************
143 Register native functions.
145 *******************************************************************************/
147 void _Jv_sun_misc_Unsafe_init(void)
151 u = utf_new_char("sun/misc/Unsafe");
153 native_method_register(u, methods, NATIVE_METHODS_COUNT);
158 * Class: sun/misc/Unsafe
159 * Method: registerNatives
162 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_registerNatives(JNIEnv *env, jclass clazz)
164 /* The native methods of this function are already registered in
165 _Jv_sun_misc_Unsafe_init() which is called during VM
171 * Class: sun/misc/Unsafe
173 * Signature: (Ljava/lang/Object;J)I
175 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_getInt__Ljava_lang_Object_2J(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset)
180 p = (int32_t *) (((uint8_t *) o) + offset);
189 * Class: sun/misc/Unsafe
191 * Signature: (Ljava/lang/Object;JI)V
193 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putInt__Ljava_lang_Object_2JI(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset, int32_t x)
197 p = (int32_t *) (((uint8_t *) o) + offset);
204 * Class: sun/misc/Unsafe
206 * Signature: (Ljava/lang/Object;J)Ljava/lang/Object;
208 JNIEXPORT java_lang_Object* JNICALL Java_sun_misc_Unsafe_getObject(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset)
213 p = (void **) (((uint8_t *) o) + offset);
222 * Class: sun/misc/Unsafe
224 * Signature: (Ljava/lang/Object;JLjava/lang/Object;)V
226 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putObject(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset, java_lang_Object *x)
230 p = (void **) (((uint8_t *) o) + offset);
237 * Class: sun/misc/Unsafe
239 * Signature: (Ljava/lang/Object;J)Z
241 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_getBoolean(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset)
246 p = (int32_t *) (((uint8_t *) o) + offset);
255 * Class: sun/misc/Unsafe
257 * Signature: (Ljava/lang/Object;JZ)V
259 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putBoolean(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset, int32_t x)
263 p = (int32_t *) (((uint8_t *) o) + offset);
270 * Class: sun/misc/Unsafe
272 * Signature: (Ljava/lang/Object;J)B
274 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_getByte__Ljava_lang_Object_2J(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset)
279 p = (int32_t *) (((uint8_t *) o) + offset);
288 * Class: sun/misc/Unsafe
290 * Signature: (Ljava/lang/Object;JB)V
292 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putByte__Ljava_lang_Object_2JB(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset, int32_t x)
296 p = (int32_t *) (((uint8_t *) o) + offset);
303 * Class: sun/misc/Unsafe
305 * Signature: (Ljava/lang/Object;J)S
307 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_getShort__Ljava_lang_Object_2J(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset)
312 p = (int32_t *) (((uint8_t *) o) + offset);
321 * Class: sun/misc/Unsafe
323 * Signature: (Ljava/lang/Object;JS)V
325 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putShort__Ljava_lang_Object_2JS(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset, int32_t x)
329 p = (int32_t *) (((uint8_t *) o) + offset);
336 * Class: sun/misc/Unsafe
338 * Signature: (Ljava/lang/Object;J)C
340 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_getChar__Ljava_lang_Object_2J(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset)
345 p = (int32_t *) (((uint8_t *) o) + offset);
354 * Class: sun/misc/Unsafe
356 * Signature: (Ljava/lang/Object;JC)V
358 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putChar__Ljava_lang_Object_2JC(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset, int32_t x)
362 p = (int32_t *) (((uint8_t *) o) + offset);
369 * Class: sun/misc/Unsafe
371 * Signature: (Ljava/lang/Object;J)J
373 JNIEXPORT int64_t JNICALL Java_sun_misc_Unsafe_getLong__Ljava_lang_Object_2J(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset)
378 p = (int64_t *) (((uint8_t *) o) + offset);
387 * Class: sun/misc/Unsafe
389 * Signature: (Ljava/lang/Object;JJ)V
391 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putLong__Ljava_lang_Object_2JJ(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset, int64_t x)
395 p = (int64_t *) (((uint8_t *) o) + offset);
402 * Class: sun/misc/Unsafe
404 * Signature: (Ljava/lang/Object;J)F
406 JNIEXPORT float JNICALL Java_sun_misc_Unsafe_getFloat__Ljava_lang_Object_2J(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset)
411 p = (float *) (((uint8_t *) o) + offset);
420 * Class: sun/misc/Unsafe
422 * Signature: (Ljava/lang/Object;JF)V
424 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putFloat__Ljava_lang_Object_2JF(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset, float x)
428 p = (float *) (((uint8_t *) o) + offset);
435 * Class: sun/misc/Unsafe
437 * Signature: (Ljava/lang/Object;J)D
439 JNIEXPORT double JNICALL Java_sun_misc_Unsafe_getDouble__Ljava_lang_Object_2J(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset)
444 p = (double *) (((uint8_t *) o) + offset);
453 * Class: sun/misc/Unsafe
455 * Signature: (Ljava/lang/Object;JD)V
457 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putDouble__Ljava_lang_Object_2JD(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset, double x)
461 p = (double *) (((uint8_t *) o) + offset);
468 * Class: sun/misc/Unsafe
472 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_getByte__J(JNIEnv *env, sun_misc_Unsafe *this, int64_t address)
477 p = (int8_t *) (intptr_t) address;
481 return (int32_t) value;
486 * Class: sun/misc/Unsafe
490 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putByte__JB(JNIEnv *env, sun_misc_Unsafe *this, int64_t address, int32_t value)
494 p = (int8_t *) (intptr_t) address;
501 * Class: sun/misc/Unsafe
505 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_getShort__J(JNIEnv *env, sun_misc_Unsafe *this, int64_t address)
510 p = (int16_t *) (intptr_t) address;
514 return (int32_t) value;
519 * Class: sun/misc/Unsafe
523 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putShort__JS(JNIEnv *env, sun_misc_Unsafe *this, int64_t address, int32_t value)
527 p = (int16_t *) (intptr_t) address;
529 *p = (int16_t) value;
534 * Class: sun/misc/Unsafe
538 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_getChar__J(JNIEnv *env, sun_misc_Unsafe *this, int64_t address)
543 p = (uint16_t *) (intptr_t) address;
547 return (int32_t) value;
552 * Class: sun/misc/Unsafe
556 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putChar__JC(JNIEnv *env, sun_misc_Unsafe *this, int64_t address, int32_t value)
560 p = (uint16_t *) (intptr_t) address;
562 *p = (uint16_t) value;
567 * Class: sun/misc/Unsafe
571 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_getInt__J(JNIEnv *env, sun_misc_Unsafe *this, int64_t address)
576 p = (int32_t *) (intptr_t) address;
585 * Class: sun/misc/Unsafe
589 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putInt__JI(JNIEnv *env, struct sun_misc_Unsafe* this, int64_t address, int32_t value)
593 p = (int32_t *) (intptr_t) address;
600 * Class: sun/misc/Unsafe
604 JNIEXPORT int64_t JNICALL Java_sun_misc_Unsafe_getLong__J(JNIEnv *env, sun_misc_Unsafe *this, int64_t address)
609 p = (int64_t *) (intptr_t) address;
618 * Class: sun/misc/Unsafe
622 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putLong__JJ(JNIEnv *env, sun_misc_Unsafe *this, int64_t address, int64_t value)
626 p = (int64_t *) (intptr_t) address;
633 * Class: sun/misc/Unsafe
637 JNIEXPORT float JNICALL Java_sun_misc_Unsafe_getFloat__J(JNIEnv *env, sun_misc_Unsafe *this, int64_t address)
642 p = (float *) (intptr_t) address;
651 * Class: sun/misc/Unsafe
652 * Method: objectFieldOffset
653 * Signature: (Ljava/lang/reflect/Field;)J
655 JNIEXPORT int64_t JNICALL Java_sun_misc_Unsafe_objectFieldOffset(JNIEnv *env, sun_misc_Unsafe *this, java_lang_reflect_Field *field)
661 #if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
662 java_lang_reflect_VMField *rvmf;
665 #if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
667 LLNI_field_get_ref(field, f, rvmf);
668 LLNI_field_get_cls(rvmf, clazz, c);
669 LLNI_field_get_val(rvmf, slot , slot);
671 #elif defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
673 LLNI_field_get_cls(field, clazz, c);
674 LLNI_field_get_val(field, slot , slot);
677 # error unknown configuration
680 f = &(c->fields[slot]);
682 return (int64_t) f->offset;
687 * Class: sun/misc/Unsafe
688 * Method: allocateMemory
691 JNIEXPORT int64_t JNICALL Java_sun_misc_Unsafe_allocateMemory(JNIEnv *env, sun_misc_Unsafe *this, int64_t bytes)
696 length = (size_t) bytes;
698 if ((length != (uint64_t) bytes) || (bytes < 0)) {
699 exceptions_throw_illegalargumentexception();
703 p = MNEW(uint8_t, length);
705 return (int64_t) (intptr_t) p;
713 * Class: sun/misc/Unsafe
715 * Signature: (Ljava/lang/Object;JJB)V
717 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_setMemory(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset, int64_t bytes, int32_t value)
722 length = (size_t) bytes;
724 if ((length != (uint64_t) bytes) || (bytes < 0)) {
725 exceptions_throw_illegalargumentexception();
729 /* XXX Missing LLNI: we need to unwrap this object. */
731 p = (void *) (((uint8_t *) o) + offset);
733 /* XXX Not sure this is correct. */
735 system_memset(p, value, length);
740 * Class: sun/misc/Unsafe
742 * Signature: (Ljava/lang/Object;JLjava/lang/Object;JJ)V
744 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_copyMemory(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *srcBase, int64_t srcOffset, java_lang_Object *destBase, int64_t destOffset, int64_t bytes)
753 length = (size_t) bytes;
755 if ((length != (uint64_t) bytes) || (bytes < 0)) {
756 exceptions_throw_illegalargumentexception();
760 /* XXX Missing LLNI: We need to unwrap these objects. */
762 src = (void *) (((uint8_t *) srcBase) + srcOffset);
763 dest = (void *) (((uint8_t *) destBase) + destOffset);
765 system_memcpy(dest, src, length);
769 * Class: sun/misc/Unsafe
773 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_setMemory(JNIEnv *env, sun_misc_Unsafe *this, int64_t address, int64_t bytes, int32_t value)
778 length = (size_t) bytes;
780 if ((length != (uint64_t) bytes) || (bytes < 0)) {
781 exceptions_throw_illegalargumentexception();
785 p = (void *) (intptr_t) address;
787 /* XXX Not sure this is correct. */
789 system_memset(p, value, length);
794 * Class: sun/misc/Unsafe
798 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_copyMemory(JNIEnv *env, sun_misc_Unsafe *this, int64_t srcAddress, int64_t destAddress, int64_t bytes)
807 length = (size_t) bytes;
809 if ((length != (uint64_t) bytes) || (bytes < 0)) {
810 exceptions_throw_illegalargumentexception();
814 src = (void *) (intptr_t) srcAddress;
815 dest = (void *) (intptr_t) destAddress;
817 system_memcpy(dest, src, length);
823 * Class: sun/misc/Unsafe
827 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_freeMemory(JNIEnv *env, sun_misc_Unsafe *this, int64_t address)
831 p = (void *) (intptr_t) address;
836 /* we pass length 1 to trick the free function */
838 MFREE(p, uint8_t, 1);
843 * Class: sun/misc/Unsafe
844 * Method: staticFieldOffset
845 * Signature: (Ljava/lang/reflect/Field;)J
847 JNIEXPORT int64_t JNICALL Java_sun_misc_Unsafe_staticFieldOffset(JNIEnv *env, sun_misc_Unsafe *this, java_lang_reflect_Field *f)
849 /* The offset of static fields is 0. */
856 * Class: sun/misc/Unsafe
857 * Method: staticFieldBase
858 * Signature: (Ljava/lang/reflect/Field;)Ljava/lang/Object;
860 JNIEXPORT java_lang_Object* JNICALL Java_sun_misc_Unsafe_staticFieldBase(JNIEnv *env, sun_misc_Unsafe *this, java_lang_reflect_Field *rf)
866 #if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
867 java_lang_reflect_VMField *rvmf;
870 #if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
872 LLNI_field_get_ref(rf, f, rvmf);
873 LLNI_field_get_cls(rvmf, clazz, c);
874 LLNI_field_get_val(rvmf, slot , slot);
876 #elif defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
878 LLNI_field_get_cls(rf, clazz, c);
879 LLNI_field_get_val(rf, slot , slot);
882 # error unknown configuration
885 f = &(c->fields[slot]);
887 return (java_lang_Object *) (f->value);
892 * Class: sun/misc/Unsafe
893 * Method: ensureClassInitialized
894 * Signature: (Ljava/lang/Class;)V
896 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_ensureClassInitialized(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Class *class)
900 c = LLNI_classinfo_unwrap(class);
902 if (!(c->state & CLASS_INITIALIZED))
908 * Class: sun/misc/Unsafe
909 * Method: arrayBaseOffset
910 * Signature: (Ljava/lang/Class;)I
912 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_arrayBaseOffset(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Class *arrayClass)
917 c = LLNI_classinfo_unwrap(arrayClass);
918 ad = c->vftbl->arraydesc;
921 /* XXX does that exception exist? */
922 exceptions_throw_internalerror("java/lang/InvalidClassException");
926 return ad->dataoffset;
931 * Class: sun/misc/Unsafe
932 * Method: arrayIndexScale
933 * Signature: (Ljava/lang/Class;)I
935 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_arrayIndexScale(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Class *arrayClass)
940 c = LLNI_classinfo_unwrap(arrayClass);
941 ad = c->vftbl->arraydesc;
944 /* XXX does that exception exist? */
945 exceptions_throw_internalerror("java/lang/InvalidClassException");
949 return ad->componentsize;
954 * Class: sun/misc/Unsafe
955 * Method: addressSize
958 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_addressSize(JNIEnv *env, sun_misc_Unsafe *this)
960 return SIZEOF_VOID_P;
965 * Class: sun/misc/Unsafe
969 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_pageSize(JNIEnv *env, sun_misc_Unsafe *this)
980 * Class: sun/misc/Unsafe
981 * Method: defineClass
982 * Signature: (Ljava/lang/String;[BIILjava/lang/ClassLoader;Ljava/security/ProtectionDomain;)Ljava/lang/Class;
984 JNIEXPORT java_lang_Class* JNICALL Java_sun_misc_Unsafe_defineClass__Ljava_lang_String_2_3BIILjava_lang_ClassLoader_2Ljava_security_ProtectionDomain_2(JNIEnv *env, sun_misc_Unsafe *this, java_lang_String *name, java_handle_bytearray_t *b, int32_t off, int32_t len, java_lang_ClassLoader *loader, java_security_ProtectionDomain *protectionDomain)
991 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
993 /* check if data was passed */
996 exceptions_throw_nullpointerexception();
1000 /* check the indexes passed */
1002 if ((off < 0) || (len < 0) || ((off + len) > LLNI_array_size(b))) {
1003 exceptions_throw_arrayindexoutofboundsexception();
1008 /* convert '.' to '/' in java string */
1010 utfname = javastring_toutf((java_handle_t *) name, true);
1016 /* define the class */
1018 c = class_define(utfname, cl, len, (uint8_t *) &(LLNI_array_direct(b, off)),
1019 (java_handle_t *) protectionDomain);
1024 /* for convenience */
1026 o = LLNI_classinfo_wrap(c);
1028 #if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
1029 /* set ProtectionDomain */
1031 LLNI_field_set_ref(o, pd, protectionDomain);
1039 * Class: sun/misc/Unsafe
1040 * Method: allocateInstance
1041 * Signature: (Ljava/lang/Class;)Ljava/lang/Object;
1043 JNIEXPORT java_lang_Object* JNICALL Java_sun_misc_Unsafe_allocateInstance(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Class *cls)
1048 c = LLNI_classinfo_unwrap(cls);
1052 return (java_lang_Object *) o;
1057 * Class: sun/misc/Unsafe
1058 * Method: throwException
1059 * Signature: (Ljava/lang/Throwable;)V
1061 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_throwException(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Throwable *ee)
1065 o = (java_handle_t *) ee;
1067 exceptions_set_exception(o);
1072 * Class: sun/misc/Unsafe
1073 * Method: compareAndSwapObject
1074 * Signature: (Ljava/lang/Object;JLjava/lang/Object;Ljava/lang/Object;)Z
1076 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_compareAndSwapObject(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset, java_lang_Object *expected, java_lang_Object *x)
1083 p = (volatile void **) (((uint8_t *) o) + offset);
1085 result = Atomic_compare_and_swap_ptr(p, expected, x);
1087 if (result == expected)
1095 * Class: sun/misc/Unsafe
1096 * Method: compareAndSwapInt
1097 * Signature: (Ljava/lang/Object;JII)Z
1099 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_compareAndSwapInt(JNIEnv *env, sun_misc_Unsafe* this, java_lang_Object* o, int64_t offset, int32_t expected, int32_t x)
1106 p = (uint32_t *) (((uint8_t *) o) + offset);
1108 result = Atomic_compare_and_swap_32(p, expected, x);
1110 if (result == expected)
1118 * Class: sun/misc/Unsafe
1119 * Method: compareAndSwapLong
1120 * Signature: (Ljava/lang/Object;JJJ)Z
1122 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_compareAndSwapLong(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset, int64_t expected, int64_t x)
1129 p = (uint64_t *) (((uint8_t *) o) + offset);
1131 result = Atomic_compare_and_swap_64(p, expected, x);
1133 if (result == expected)
1141 * Class: sun/misc/Unsafe
1142 * Method: getObjectVolatile
1143 * Signature: (Ljava/lang/Object;J)Ljava/lang/Object;
1145 JNIEXPORT java_lang_Object* JNICALL Java_sun_misc_Unsafe_getObjectVolatile(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset)
1148 volatile void *value;
1150 p = (volatile void **) (((uint8_t *) o) + offset);
1154 return (java_lang_Object *) value;
1159 * Class: sun/misc/Unsafe
1160 * Method: putObjectVolatile
1161 * Signature: (Ljava/lang/Object;JLjava/lang/Object;)V
1163 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putObjectVolatile(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset, java_lang_Object *x)
1167 p = (volatile void **) (((uint8_t *) o) + offset);
1173 #define UNSAFE_GET_VOLATILE(type) \
1174 java_handle_t *_h; \
1175 java_object_t *_o; \
1176 volatile type *_p; \
1179 _h = (java_handle_t *) o; \
1181 LLNI_CRITICAL_START; \
1183 _o = LLNI_UNWRAP(_h); \
1184 _p = (volatile type *) (((uint8_t *) _o) + offset); \
1188 LLNI_CRITICAL_END; \
1193 #define UNSAFE_PUT_VOLATILE(type) \
1194 java_handle_t *_h; \
1195 java_object_t *_o; \
1196 volatile type *_p; \
1198 _h = (java_handle_t *) o; \
1200 LLNI_CRITICAL_START; \
1202 _o = LLNI_UNWRAP(_h); \
1203 _p = (volatile type *) (((uint8_t *) _o) + offset); \
1207 Atomic_memory_barrier(); \
1213 * Class: sun/misc/Unsafe
1214 * Method: getIntVolatile
1215 * Signature: (Ljava/lang/Object;J)I
1217 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_getIntVolatile(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset)
1219 UNSAFE_GET_VOLATILE(int32_t);
1224 * Class: sun/misc/Unsafe
1225 * Method: putIntVolatile
1226 * Signature: (Ljava/lang/Object;JI)V
1228 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putIntVolatile(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset, int32_t x)
1230 UNSAFE_PUT_VOLATILE(int32_t);
1235 * Class: sun/misc/Unsafe
1236 * Method: getLongVolatile
1237 * Signature: (Ljava/lang/Object;J)J
1239 JNIEXPORT int64_t JNICALL Java_sun_misc_Unsafe_getLongVolatile(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset)
1241 UNSAFE_GET_VOLATILE(int64_t);
1246 * Class: sun/misc/Unsafe
1247 * Method: putLongVolatile
1248 * Signature: (Ljava/lang/Object;JJ)V
1250 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putLongVolatile(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset, int64_t x)
1252 UNSAFE_PUT_VOLATILE(int64_t);
1257 * Class: sun/misc/Unsafe
1258 * Method: getDoubleVolatile
1259 * Signature: (Ljava/lang/Object;J)D
1261 JNIEXPORT double JNICALL Java_sun_misc_Unsafe_getDoubleVolatile(JNIEnv *env, sun_misc_Unsafe* _this, java_lang_Object* o, int64_t offset)
1263 UNSAFE_GET_VOLATILE(double);
1268 * Class: sun/misc/Unsafe
1269 * Method: putOrderedObject
1270 * Signature: (Ljava/lang/Object;JLjava/lang/Object;)V
1272 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putOrderedObject(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset, java_lang_Object *x)
1280 _h = (java_handle_t *) o;
1281 _hx = (java_handle_t *) x;
1283 LLNI_CRITICAL_START;
1285 _o = LLNI_UNWRAP(_h);
1286 _x = LLNI_UNWRAP(_hx);
1287 _p = (volatile void **) (((uint8_t *) _o) + offset);
1291 Atomic_memory_barrier();
1298 * Class: sun/misc/Unsafe
1299 * Method: putOrderedInt
1300 * Signature: (Ljava/lang/Object;JI)V
1302 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putOrderedInt(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset, int32_t x)
1304 UNSAFE_PUT_VOLATILE(int32_t);
1309 * Class: sun/misc/Unsafe
1310 * Method: putOrderedLong
1311 * Signature: (Ljava/lang/Object;JJ)V
1313 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putOrderedLong(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset, int64_t x)
1315 UNSAFE_PUT_VOLATILE(int64_t);
1320 * Class: sun/misc/Unsafe
1322 * Signature: (Ljava/lang/Object;)V
1324 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_unpark(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *thread)
1326 /* XXX IMPLEMENT ME */
1331 * Class: sun/misc/Unsafe
1335 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_park(JNIEnv *env, sun_misc_Unsafe *this, int32_t isAbsolute, int64_t time)
1337 /* XXX IMPLEMENT ME */
1342 * These are local overrides for various environment variables in Emacs.
1343 * Please do not remove this and leave it at the end of the file, where
1344 * Emacs will automagically detect them.
1345 * ---------------------------------------------------------------------
1348 * indent-tabs-mode: t