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 "machine-instr.h"
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_CLASSPATH_SUN)
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 #include "native/include/java_security_ProtectionDomain.h" /* required by smU */
54 #include "native/include/sun_misc_Unsafe.h"
56 #include "vm/builtin.h"
57 #include "vm/exceptions.h"
58 #include "vm/initialize.h"
59 #include "vm/stringlocal.h"
61 #include "vmcore/system.h"
62 #include "vmcore/utf8.h"
65 /* native methods implemented by this file ************************************/
67 static JNINativeMethod methods[] = {
68 { "registerNatives", "()V", (void *) (intptr_t) &Java_sun_misc_Unsafe_registerNatives },
69 { "getInt", "(Ljava/lang/Object;J)I", (void *) (intptr_t) &Java_sun_misc_Unsafe_getInt__Ljava_lang_Object_2J },
70 { "putInt", "(Ljava/lang/Object;JI)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putInt__Ljava_lang_Object_2JI },
71 { "getObject", "(Ljava/lang/Object;J)Ljava/lang/Object;", (void *) (intptr_t) &Java_sun_misc_Unsafe_getObject },
72 { "putObject", "(Ljava/lang/Object;JLjava/lang/Object;)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putObject },
73 { "getBoolean", "(Ljava/lang/Object;J)Z", (void *) (intptr_t) &Java_sun_misc_Unsafe_getBoolean },
74 { "putBoolean", "(Ljava/lang/Object;JZ)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putBoolean },
75 { "getByte", "(Ljava/lang/Object;J)B", (void *) (intptr_t) &Java_sun_misc_Unsafe_getByte__Ljava_lang_Object_2J },
76 { "putByte", "(Ljava/lang/Object;JB)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putByte__Ljava_lang_Object_2JB },
77 { "getShort", "(Ljava/lang/Object;J)S", (void *) (intptr_t) &Java_sun_misc_Unsafe_getShort__Ljava_lang_Object_2J },
78 { "putShort", "(Ljava/lang/Object;JS)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putShort__Ljava_lang_Object_2JS },
79 { "getChar", "(Ljava/lang/Object;J)C", (void *) (intptr_t) &Java_sun_misc_Unsafe_getChar__Ljava_lang_Object_2J },
80 { "putChar", "(Ljava/lang/Object;JC)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putChar__Ljava_lang_Object_2JC },
81 { "getLong", "(Ljava/lang/Object;J)J", (void *) (intptr_t) &Java_sun_misc_Unsafe_getLong__Ljava_lang_Object_2J },
82 { "putLong", "(Ljava/lang/Object;JJ)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putLong__Ljava_lang_Object_2JJ },
83 { "getFloat", "(Ljava/lang/Object;J)F", (void *) (intptr_t) &Java_sun_misc_Unsafe_getFloat__Ljava_lang_Object_2J },
84 { "putFloat", "(Ljava/lang/Object;JF)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putFloat__Ljava_lang_Object_2JF },
85 { "getDouble", "(Ljava/lang/Object;J)D", (void *) (intptr_t) &Java_sun_misc_Unsafe_getDouble__Ljava_lang_Object_2J },
86 { "putDouble", "(Ljava/lang/Object;JD)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putDouble__Ljava_lang_Object_2JD },
87 { "getByte", "(J)B", (void *) (intptr_t) &Java_sun_misc_Unsafe_getByte__J },
88 { "putByte", "(JB)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putByte__JB },
89 { "getShort", "(J)S", (void *) (intptr_t) &Java_sun_misc_Unsafe_getShort__J },
90 { "putShort", "(JS)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putShort__JS },
91 { "getChar", "(J)C", (void *) (intptr_t) &Java_sun_misc_Unsafe_getChar__J },
92 { "putChar", "(JC)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putChar__JC },
93 { "getInt", "(J)I", (void *) (intptr_t) &Java_sun_misc_Unsafe_getInt__J },
94 { "putInt", "(JI)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putInt__JI },
95 { "getLong", "(J)J", (void *) (intptr_t) &Java_sun_misc_Unsafe_getLong__J },
96 { "putLong", "(JJ)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putLong__JJ },
97 { "getFloat", "(J)F", (void *) (intptr_t) &Java_sun_misc_Unsafe_getFloat__J },
98 { "objectFieldOffset", "(Ljava/lang/reflect/Field;)J", (void *) (intptr_t) &Java_sun_misc_Unsafe_objectFieldOffset },
99 { "allocateMemory", "(J)J", (void *) (intptr_t) &Java_sun_misc_Unsafe_allocateMemory },
102 { "setMemory", "(Ljava/lang/Object;JJB)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_setMemory },
103 { "copyMemory", "(Ljava/lang/Object;JLjava/lang/Object;JJ)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_copyMemory },
105 { "setMemory", "(JJB)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_setMemory },
106 { "copyMemory", "(JJJ)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_copyMemory },
108 { "freeMemory", "(J)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_freeMemory },
109 { "staticFieldOffset", "(Ljava/lang/reflect/Field;)J", (void *) (intptr_t) &Java_sun_misc_Unsafe_staticFieldOffset },
110 { "staticFieldBase", "(Ljava/lang/reflect/Field;)Ljava/lang/Object;", (void *) (intptr_t) &Java_sun_misc_Unsafe_staticFieldBase },
111 { "ensureClassInitialized", "(Ljava/lang/Class;)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_ensureClassInitialized },
112 { "arrayBaseOffset", "(Ljava/lang/Class;)I", (void *) (intptr_t) &Java_sun_misc_Unsafe_arrayBaseOffset },
113 { "arrayIndexScale", "(Ljava/lang/Class;)I", (void *) (intptr_t) &Java_sun_misc_Unsafe_arrayIndexScale },
114 { "addressSize", "()I", (void *) (intptr_t) &Java_sun_misc_Unsafe_addressSize },
115 { "pageSize", "()I", (void *) (intptr_t) &Java_sun_misc_Unsafe_pageSize },
116 { "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 },
117 { "allocateInstance", "(Ljava/lang/Class;)Ljava/lang/Object;", (void *) (intptr_t) &Java_sun_misc_Unsafe_allocateInstance },
118 { "throwException", "(Ljava/lang/Throwable;)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_throwException },
119 { "compareAndSwapObject", "(Ljava/lang/Object;JLjava/lang/Object;Ljava/lang/Object;)Z", (void *) (intptr_t) &Java_sun_misc_Unsafe_compareAndSwapObject },
120 { "compareAndSwapInt", "(Ljava/lang/Object;JII)Z", (void *) (intptr_t) &Java_sun_misc_Unsafe_compareAndSwapInt },
121 { "compareAndSwapLong", "(Ljava/lang/Object;JJJ)Z", (void *) (intptr_t) &Java_sun_misc_Unsafe_compareAndSwapLong },
122 { "getObjectVolatile", "(Ljava/lang/Object;J)Ljava/lang/Object;", (void *) (intptr_t) &Java_sun_misc_Unsafe_getObjectVolatile },
123 { "putObjectVolatile", "(Ljava/lang/Object;JLjava/lang/Object;)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putObjectVolatile },
124 { "getIntVolatile", "(Ljava/lang/Object;J)I", (void *) (intptr_t) &Java_sun_misc_Unsafe_getIntVolatile },
125 { "putIntVolatile", "(Ljava/lang/Object;JI)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putIntVolatile },
126 { "getLongVolatile", "(Ljava/lang/Object;J)J", (void *) (intptr_t) &Java_sun_misc_Unsafe_getLongVolatile },
127 { "putLongVolatile", "(Ljava/lang/Object;JJ)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putLongVolatile },
128 { "putOrderedObject", "(Ljava/lang/Object;JLjava/lang/Object;)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putOrderedObject },
129 { "putOrderedInt", "(Ljava/lang/Object;JI)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putOrderedInt },
130 { "putOrderedLong", "(Ljava/lang/Object;JJ)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putOrderedLong },
131 { "unpark", "(Ljava/lang/Object;)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_unpark },
132 { "park", "(ZJ)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_park },
136 /* _Jv_sun_misc_Unsafe_init ****************************************************
138 Register native functions.
140 *******************************************************************************/
142 void _Jv_sun_misc_Unsafe_init(void)
146 u = utf_new_char("sun/misc/Unsafe");
148 native_method_register(u, methods, NATIVE_METHODS_COUNT);
153 * Class: sun/misc/Unsafe
154 * Method: registerNatives
157 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_registerNatives(JNIEnv *env, jclass clazz)
159 /* The native methods of this function are already registered in
160 _Jv_sun_misc_Unsafe_init() which is called during VM
166 * Class: sun/misc/Unsafe
168 * Signature: (Ljava/lang/Object;J)I
170 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)
175 p = (int32_t *) (((uint8_t *) o) + offset);
184 * Class: sun/misc/Unsafe
186 * Signature: (Ljava/lang/Object;JI)V
188 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)
192 p = (int32_t *) (((uint8_t *) o) + offset);
199 * Class: sun/misc/Unsafe
201 * Signature: (Ljava/lang/Object;J)Ljava/lang/Object;
203 JNIEXPORT java_lang_Object* JNICALL Java_sun_misc_Unsafe_getObject(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset)
208 p = (void **) (((uint8_t *) o) + offset);
217 * Class: sun/misc/Unsafe
219 * Signature: (Ljava/lang/Object;JLjava/lang/Object;)V
221 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)
225 p = (void **) (((uint8_t *) o) + offset);
232 * Class: sun/misc/Unsafe
234 * Signature: (Ljava/lang/Object;J)Z
236 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_getBoolean(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset)
241 p = (int32_t *) (((uint8_t *) o) + offset);
250 * Class: sun/misc/Unsafe
252 * Signature: (Ljava/lang/Object;JZ)V
254 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putBoolean(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset, int32_t x)
258 p = (int32_t *) (((uint8_t *) o) + offset);
265 * Class: sun/misc/Unsafe
267 * Signature: (Ljava/lang/Object;J)B
269 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)
274 p = (int32_t *) (((uint8_t *) o) + offset);
283 * Class: sun/misc/Unsafe
285 * Signature: (Ljava/lang/Object;JB)V
287 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)
291 p = (int32_t *) (((uint8_t *) o) + offset);
298 * Class: sun/misc/Unsafe
300 * Signature: (Ljava/lang/Object;J)S
302 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)
307 p = (int32_t *) (((uint8_t *) o) + offset);
316 * Class: sun/misc/Unsafe
318 * Signature: (Ljava/lang/Object;JS)V
320 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)
324 p = (int32_t *) (((uint8_t *) o) + offset);
331 * Class: sun/misc/Unsafe
333 * Signature: (Ljava/lang/Object;J)C
335 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)
340 p = (int32_t *) (((uint8_t *) o) + offset);
349 * Class: sun/misc/Unsafe
351 * Signature: (Ljava/lang/Object;JC)V
353 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)
357 p = (int32_t *) (((uint8_t *) o) + offset);
364 * Class: sun/misc/Unsafe
366 * Signature: (Ljava/lang/Object;J)J
368 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)
373 p = (int64_t *) (((uint8_t *) o) + offset);
382 * Class: sun/misc/Unsafe
384 * Signature: (Ljava/lang/Object;JJ)V
386 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)
390 p = (int64_t *) (((uint8_t *) o) + offset);
397 * Class: sun/misc/Unsafe
399 * Signature: (Ljava/lang/Object;J)F
401 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)
406 p = (float *) (((uint8_t *) o) + offset);
415 * Class: sun/misc/Unsafe
417 * Signature: (Ljava/lang/Object;JF)V
419 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)
423 p = (float *) (((uint8_t *) o) + offset);
430 * Class: sun/misc/Unsafe
432 * Signature: (Ljava/lang/Object;J)D
434 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)
439 p = (double *) (((uint8_t *) o) + offset);
448 * Class: sun/misc/Unsafe
450 * Signature: (Ljava/lang/Object;JD)V
452 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)
456 p = (double *) (((uint8_t *) o) + offset);
463 * Class: sun/misc/Unsafe
467 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_getByte__J(JNIEnv *env, sun_misc_Unsafe *this, int64_t address)
472 p = (int8_t *) (intptr_t) address;
476 return (int32_t) value;
481 * Class: sun/misc/Unsafe
485 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putByte__JB(JNIEnv *env, sun_misc_Unsafe *this, int64_t address, int32_t value)
489 p = (int8_t *) (intptr_t) address;
496 * Class: sun/misc/Unsafe
500 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_getShort__J(JNIEnv *env, sun_misc_Unsafe *this, int64_t address)
505 p = (int16_t *) (intptr_t) address;
509 return (int32_t) value;
514 * Class: sun/misc/Unsafe
518 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putShort__JS(JNIEnv *env, sun_misc_Unsafe *this, int64_t address, int32_t value)
522 p = (int16_t *) (intptr_t) address;
524 *p = (int16_t) value;
529 * Class: sun/misc/Unsafe
533 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_getChar__J(JNIEnv *env, sun_misc_Unsafe *this, int64_t address)
538 p = (uint16_t *) (intptr_t) address;
542 return (int32_t) value;
547 * Class: sun/misc/Unsafe
551 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putChar__JC(JNIEnv *env, sun_misc_Unsafe *this, int64_t address, int32_t value)
555 p = (uint16_t *) (intptr_t) address;
557 *p = (uint16_t) value;
562 * Class: sun/misc/Unsafe
566 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_getInt__J(JNIEnv *env, sun_misc_Unsafe *this, int64_t address)
571 p = (int32_t *) (intptr_t) address;
580 * Class: sun/misc/Unsafe
584 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putInt__JI(JNIEnv *env, struct sun_misc_Unsafe* this, int64_t address, int32_t value)
588 p = (int32_t *) (intptr_t) address;
595 * Class: sun/misc/Unsafe
599 JNIEXPORT int64_t JNICALL Java_sun_misc_Unsafe_getLong__J(JNIEnv *env, sun_misc_Unsafe *this, int64_t address)
604 p = (int64_t *) (intptr_t) address;
613 * Class: sun/misc/Unsafe
617 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putLong__JJ(JNIEnv *env, sun_misc_Unsafe *this, int64_t address, int64_t value)
621 p = (int64_t *) (intptr_t) address;
628 * Class: sun/misc/Unsafe
632 JNIEXPORT float JNICALL Java_sun_misc_Unsafe_getFloat__J(JNIEnv *env, sun_misc_Unsafe *this, int64_t address)
637 p = (float *) (intptr_t) address;
646 * Class: sun/misc/Unsafe
647 * Method: objectFieldOffset
648 * Signature: (Ljava/lang/reflect/Field;)J
650 JNIEXPORT int64_t JNICALL Java_sun_misc_Unsafe_objectFieldOffset(JNIEnv *env, sun_misc_Unsafe *this, java_lang_reflect_Field *field)
656 LLNI_field_get_cls(field, clazz, c);
657 LLNI_field_get_val(field, slot , slot);
659 f = &c->fields[slot];
661 return (int64_t) f->offset;
666 * Class: sun/misc/Unsafe
667 * Method: allocateMemory
670 JNIEXPORT int64_t JNICALL Java_sun_misc_Unsafe_allocateMemory(JNIEnv *env, sun_misc_Unsafe *this, int64_t bytes)
675 length = (size_t) bytes;
677 if ((length != (uint64_t) bytes) || (bytes < 0)) {
678 exceptions_throw_illegalargumentexception();
682 p = MNEW(uint8_t, length);
684 return (int64_t) (intptr_t) p;
692 * Class: sun/misc/Unsafe
694 * Signature: (Ljava/lang/Object;JJB)V
696 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)
701 length = (size_t) bytes;
703 if ((length != (uint64_t) bytes) || (bytes < 0)) {
704 exceptions_throw_illegalargumentexception();
708 /* XXX Missing LLNI: we need to unwrap this object. */
710 p = (void *) (((uint8_t *) o) + offset);
712 /* XXX Not sure this is correct. */
714 system_memset(p, value, length);
719 * Class: sun/misc/Unsafe
721 * Signature: (Ljava/lang/Object;JLjava/lang/Object;JJ)V
723 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)
732 length = (size_t) bytes;
734 if ((length != (uint64_t) bytes) || (bytes < 0)) {
735 exceptions_throw_illegalargumentexception();
739 /* XXX Missing LLNI: We need to unwrap these objects. */
741 src = (void *) (((uint8_t *) srcBase) + srcOffset);
742 dest = (void *) (((uint8_t *) destBase) + destOffset);
744 system_memcpy(dest, src, length);
748 * Class: sun/misc/Unsafe
752 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_setMemory(JNIEnv *env, sun_misc_Unsafe *this, int64_t address, int64_t bytes, int32_t value)
757 length = (size_t) bytes;
759 if ((length != (uint64_t) bytes) || (bytes < 0)) {
760 exceptions_throw_illegalargumentexception();
764 p = (void *) (intptr_t) address;
766 /* XXX Not sure this is correct. */
768 system_memset(p, value, length);
773 * Class: sun/misc/Unsafe
777 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_copyMemory(JNIEnv *env, sun_misc_Unsafe *this, int64_t srcAddress, int64_t destAddress, int64_t bytes)
786 length = (size_t) bytes;
788 if ((length != (uint64_t) bytes) || (bytes < 0)) {
789 exceptions_throw_illegalargumentexception();
793 src = (void *) (intptr_t) srcAddress;
794 dest = (void *) (intptr_t) destAddress;
796 system_memcpy(dest, src, length);
802 * Class: sun/misc/Unsafe
806 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_freeMemory(JNIEnv *env, sun_misc_Unsafe *this, int64_t address)
810 p = (void *) (intptr_t) address;
815 /* we pass length 1 to trick the free function */
817 MFREE(p, uint8_t, 1);
822 * Class: sun/misc/Unsafe
823 * Method: staticFieldOffset
824 * Signature: (Ljava/lang/reflect/Field;)J
826 JNIEXPORT int64_t JNICALL Java_sun_misc_Unsafe_staticFieldOffset(JNIEnv *env, sun_misc_Unsafe *this, java_lang_reflect_Field *f)
828 /* The offset of static fields is 0. */
835 * Class: sun/misc/Unsafe
836 * Method: staticFieldBase
837 * Signature: (Ljava/lang/reflect/Field;)Ljava/lang/Object;
839 JNIEXPORT java_lang_Object* JNICALL Java_sun_misc_Unsafe_staticFieldBase(JNIEnv *env, sun_misc_Unsafe *this, java_lang_reflect_Field *rf)
845 LLNI_field_get_cls(rf, clazz, c);
846 LLNI_field_get_val(rf, slot , slot);
848 f = &(c->fields[slot]);
850 return (java_lang_Object *) (f->value);
855 * Class: sun/misc/Unsafe
856 * Method: ensureClassInitialized
857 * Signature: (Ljava/lang/Class;)V
859 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_ensureClassInitialized(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Class *class)
863 c = LLNI_classinfo_unwrap(class);
865 if (!(c->state & CLASS_INITIALIZED))
871 * Class: sun/misc/Unsafe
872 * Method: arrayBaseOffset
873 * Signature: (Ljava/lang/Class;)I
875 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_arrayBaseOffset(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Class *arrayClass)
880 c = LLNI_classinfo_unwrap(arrayClass);
881 ad = c->vftbl->arraydesc;
884 /* XXX does that exception exist? */
885 exceptions_throw_internalerror("java/lang/InvalidClassException");
889 return ad->dataoffset;
894 * Class: sun/misc/Unsafe
895 * Method: arrayIndexScale
896 * Signature: (Ljava/lang/Class;)I
898 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_arrayIndexScale(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Class *arrayClass)
903 c = LLNI_classinfo_unwrap(arrayClass);
904 ad = c->vftbl->arraydesc;
907 /* XXX does that exception exist? */
908 exceptions_throw_internalerror("java/lang/InvalidClassException");
912 return ad->componentsize;
917 * Class: sun/misc/Unsafe
918 * Method: addressSize
921 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_addressSize(JNIEnv *env, sun_misc_Unsafe *this)
923 return SIZEOF_VOID_P;
928 * Class: sun/misc/Unsafe
932 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_pageSize(JNIEnv *env, sun_misc_Unsafe *this)
943 * Class: sun/misc/Unsafe
944 * Method: defineClass
945 * Signature: (Ljava/lang/String;[BIILjava/lang/ClassLoader;Ljava/security/ProtectionDomain;)Ljava/lang/Class;
947 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)
954 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
956 /* check if data was passed */
959 exceptions_throw_nullpointerexception();
963 /* check the indexes passed */
965 if ((off < 0) || (len < 0) || ((off + len) > LLNI_array_size(b))) {
966 exceptions_throw_arrayindexoutofboundsexception();
971 /* convert '.' to '/' in java string */
973 utfname = javastring_toutf((java_handle_t *) name, true);
979 /* define the class */
981 c = class_define(utfname, cl, len, (uint8_t *) &(LLNI_array_direct(b, off)),
982 (java_handle_t *) protectionDomain);
987 /* for convenience */
989 o = LLNI_classinfo_wrap(c);
991 #if defined(WITH_CLASSPATH_GNU)
992 /* set ProtectionDomain */
994 LLNI_field_set_ref(o, pd, protectionDomain);
1002 * Class: sun/misc/Unsafe
1003 * Method: allocateInstance
1004 * Signature: (Ljava/lang/Class;)Ljava/lang/Object;
1006 JNIEXPORT java_lang_Object* JNICALL Java_sun_misc_Unsafe_allocateInstance(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Class *cls)
1011 c = LLNI_classinfo_unwrap(cls);
1015 return (java_lang_Object *) o;
1020 * Class: sun/misc/Unsafe
1021 * Method: throwException
1022 * Signature: (Ljava/lang/Throwable;)V
1024 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_throwException(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Throwable *ee)
1028 o = (java_handle_t *) ee;
1030 exceptions_set_exception(o);
1035 * Class: sun/misc/Unsafe
1036 * Method: compareAndSwapObject
1037 * Signature: (Ljava/lang/Object;JLjava/lang/Object;Ljava/lang/Object;)Z
1039 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)
1045 p = (void **) (((uint8_t *) o) + offset);
1047 /* XXX this should be atomic */
1051 if (value == expected) {
1064 p = (volatile void **) (((uint8_t *) o) + offset);
1066 result = atomic_compare_and_swap_address(p, expected, x);
1068 if (result == expected)
1077 * Class: sun/misc/Unsafe
1078 * Method: compareAndSwapInt
1079 * Signature: (Ljava/lang/Object;JII)Z
1081 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)
1087 p = (int32_t *) (((uint8_t *) o) + offset);
1089 /* XXX this should be atomic */
1093 if (value == expected) {
1106 p = (int32_t *) (((uint8_t *) o) + offset);
1108 result = atomic_compare_and_swap_int(p, expected, x);
1110 if (result == expected)
1119 * Class: sun/misc/Unsafe
1120 * Method: compareAndSwapLong
1121 * Signature: (Ljava/lang/Object;JJJ)Z
1123 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)
1128 p = (int64_t *) (((uint8_t *) o) + offset);
1130 /* XXX this should be atomic */
1134 if (value == expected) {
1145 * Class: sun/misc/Unsafe
1146 * Method: getObjectVolatile
1147 * Signature: (Ljava/lang/Object;J)Ljava/lang/Object;
1149 JNIEXPORT java_lang_Object* JNICALL Java_sun_misc_Unsafe_getObjectVolatile(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset)
1152 volatile void *value;
1154 p = (volatile void **) (((uint8_t *) o) + offset);
1158 return (java_lang_Object *) value;
1163 * Class: sun/misc/Unsafe
1164 * Method: putObjectVolatile
1165 * Signature: (Ljava/lang/Object;JLjava/lang/Object;)V
1167 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)
1171 p = (volatile void **) (((uint8_t *) o) + offset);
1177 #define UNSAFE_GET_VOLATILE(type) \
1178 java_handle_t *_h; \
1179 java_object_t *_o; \
1180 volatile type *_p; \
1183 _h = (java_handle_t *) o; \
1185 LLNI_CRITICAL_START; \
1187 _o = LLNI_UNWRAP(_h); \
1188 _p = (volatile type *) (((uint8_t *) _o) + offset); \
1192 LLNI_CRITICAL_END; \
1197 #define UNSAFE_PUT_VOLATILE(type) \
1198 java_handle_t *_h; \
1199 java_object_t *_o; \
1200 volatile type *_p; \
1202 _h = (java_handle_t *) o; \
1204 LLNI_CRITICAL_START; \
1206 _o = LLNI_UNWRAP(_h); \
1207 _p = (volatile type *) (((uint8_t *) _o) + offset); \
1217 * Class: sun/misc/Unsafe
1218 * Method: getIntVolatile
1219 * Signature: (Ljava/lang/Object;J)I
1221 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_getIntVolatile(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset)
1223 UNSAFE_GET_VOLATILE(int32_t);
1228 * Class: sun/misc/Unsafe
1229 * Method: putIntVolatile
1230 * Signature: (Ljava/lang/Object;JI)V
1232 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putIntVolatile(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset, int32_t x)
1234 UNSAFE_PUT_VOLATILE(int32_t);
1239 * Class: sun/misc/Unsafe
1240 * Method: getLongVolatile
1241 * Signature: (Ljava/lang/Object;J)J
1243 JNIEXPORT int64_t JNICALL Java_sun_misc_Unsafe_getLongVolatile(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset)
1245 UNSAFE_GET_VOLATILE(int64_t);
1250 * Class: sun/misc/Unsafe
1251 * Method: putLongVolatile
1252 * Signature: (Ljava/lang/Object;JJ)V
1254 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putLongVolatile(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset, int64_t x)
1256 UNSAFE_PUT_VOLATILE(int64_t);
1261 * Class: sun/misc/Unsafe
1262 * Method: putOrderedObject
1263 * Signature: (Ljava/lang/Object;JLjava/lang/Object;)V
1265 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)
1273 _h = (java_handle_t *) o;
1274 _hx = (java_handle_t *) x;
1276 LLNI_CRITICAL_START;
1278 _o = LLNI_UNWRAP(_h);
1279 _x = LLNI_UNWRAP(_hx);
1280 _p = (volatile void **) (((uint8_t *) _o) + offset);
1291 * Class: sun/misc/Unsafe
1292 * Method: putOrderedInt
1293 * Signature: (Ljava/lang/Object;JI)V
1295 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putOrderedInt(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset, int32_t x)
1297 UNSAFE_PUT_VOLATILE(int32_t);
1302 * Class: sun/misc/Unsafe
1303 * Method: putOrderedLong
1304 * Signature: (Ljava/lang/Object;JJ)V
1306 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putOrderedLong(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset, int64_t x)
1308 UNSAFE_PUT_VOLATILE(int64_t);
1313 * Class: sun/misc/Unsafe
1315 * Signature: (Ljava/lang/Object;)V
1317 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_unpark(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *thread)
1319 /* XXX IMPLEMENT ME */
1324 * Class: sun/misc/Unsafe
1328 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_park(JNIEnv *env, sun_misc_Unsafe *this, int32_t isAbsolute, int64_t time)
1330 /* XXX IMPLEMENT ME */
1335 * These are local overrides for various environment variables in Emacs.
1336 * Please do not remove this and leave it at the end of the file, where
1337 * Emacs will automagically detect them.
1338 * ---------------------------------------------------------------------
1341 * indent-tabs-mode: t