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 "mm/memory.h"
33 #include "native/jni.h"
34 #include "native/llni.h"
35 #include "native/native.h"
37 #include "native/include/java_lang_Object.h" /* before c.l.C */
38 #include "native/include/java_lang_String.h" /* required by j.l.CL */
40 #if defined(WITH_CLASSPATH_SUN)
41 # include "native/include/java_nio_ByteBuffer.h" /* required by j.l.CL */
44 #include "native/include/java_lang_ClassLoader.h" /* required by j.l.C */
45 #include "native/include/java_lang_Class.h"
46 #include "native/include/java_lang_reflect_Field.h"
47 #include "native/include/java_lang_Thread.h" /* required by s.m.U */
48 #include "native/include/java_lang_Throwable.h"
50 #include "native/include/java_security_ProtectionDomain.h" /* required by smU */
52 #include "native/include/sun_misc_Unsafe.h"
54 #include "vm/builtin.h"
55 #include "vm/exceptions.h"
56 #include "vm/initialize.h"
57 #include "vm/stringlocal.h"
59 #include "vmcore/system.h"
60 #include "vmcore/utf8.h"
63 /* native methods implemented by this file ************************************/
65 static JNINativeMethod methods[] = {
66 { "registerNatives", "()V", (void *) (intptr_t) &Java_sun_misc_Unsafe_registerNatives },
67 { "getInt", "(Ljava/lang/Object;J)I", (void *) (intptr_t) &Java_sun_misc_Unsafe_getInt__Ljava_lang_Object_2J },
68 { "putInt", "(Ljava/lang/Object;JI)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putInt__Ljava_lang_Object_2JI },
69 { "getObject", "(Ljava/lang/Object;J)Ljava/lang/Object;", (void *) (intptr_t) &Java_sun_misc_Unsafe_getObject },
70 { "putObject", "(Ljava/lang/Object;JLjava/lang/Object;)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putObject },
71 { "getBoolean", "(Ljava/lang/Object;J)Z", (void *) (intptr_t) &Java_sun_misc_Unsafe_getBoolean },
72 { "putBoolean", "(Ljava/lang/Object;JZ)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putBoolean },
73 { "getByte", "(Ljava/lang/Object;J)B", (void *) (intptr_t) &Java_sun_misc_Unsafe_getByte__Ljava_lang_Object_2J },
74 { "putByte", "(Ljava/lang/Object;JB)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putByte__Ljava_lang_Object_2JB },
75 { "getShort", "(Ljava/lang/Object;J)S", (void *) (intptr_t) &Java_sun_misc_Unsafe_getShort__Ljava_lang_Object_2J },
76 { "putShort", "(Ljava/lang/Object;JS)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putShort__Ljava_lang_Object_2JS },
77 { "getChar", "(Ljava/lang/Object;J)C", (void *) (intptr_t) &Java_sun_misc_Unsafe_getChar__Ljava_lang_Object_2J },
78 { "putChar", "(Ljava/lang/Object;JC)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putChar__Ljava_lang_Object_2JC },
79 { "getLong", "(Ljava/lang/Object;J)J", (void *) (intptr_t) &Java_sun_misc_Unsafe_getLong__Ljava_lang_Object_2J },
80 { "putLong", "(Ljava/lang/Object;JJ)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putLong__Ljava_lang_Object_2JJ },
81 { "getFloat", "(Ljava/lang/Object;J)F", (void *) (intptr_t) &Java_sun_misc_Unsafe_getFloat__Ljava_lang_Object_2J },
82 { "putFloat", "(Ljava/lang/Object;JF)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putFloat__Ljava_lang_Object_2JF },
83 { "getDouble", "(Ljava/lang/Object;J)D", (void *) (intptr_t) &Java_sun_misc_Unsafe_getDouble__Ljava_lang_Object_2J },
84 { "putDouble", "(Ljava/lang/Object;JD)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putDouble__Ljava_lang_Object_2JD },
85 { "getByte", "(J)B", (void *) (intptr_t) &Java_sun_misc_Unsafe_getByte__J },
86 { "putByte", "(JB)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putByte__JB },
87 { "getShort", "(J)S", (void *) (intptr_t) &Java_sun_misc_Unsafe_getShort__J },
88 { "putShort", "(JS)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putShort__JS },
89 { "getChar", "(J)C", (void *) (intptr_t) &Java_sun_misc_Unsafe_getChar__J },
90 { "putChar", "(JC)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putChar__JC },
91 { "getInt", "(J)I", (void *) (intptr_t) &Java_sun_misc_Unsafe_getInt__J },
92 { "putInt", "(JI)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putInt__JI },
93 { "getLong", "(J)J", (void *) (intptr_t) &Java_sun_misc_Unsafe_getLong__J },
94 { "putLong", "(JJ)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putLong__JJ },
95 { "getFloat", "(J)F", (void *) (intptr_t) &Java_sun_misc_Unsafe_getFloat__J },
96 { "objectFieldOffset", "(Ljava/lang/reflect/Field;)J", (void *) (intptr_t) &Java_sun_misc_Unsafe_objectFieldOffset },
97 { "allocateMemory", "(J)J", (void *) (intptr_t) &Java_sun_misc_Unsafe_allocateMemory },
100 { "setMemory", "(Ljava/lang/Object;JJB)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_setMemory },
101 { "copyMemory", "(Ljava/lang/Object;JLjava/lang/Object;JJ)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_copyMemory },
103 { "setMemory", "(JJB)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_setMemory },
104 { "copyMemory", "(JJJ)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_copyMemory },
106 { "freeMemory", "(J)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_freeMemory },
107 { "staticFieldOffset", "(Ljava/lang/reflect/Field;)J", (void *) (intptr_t) &Java_sun_misc_Unsafe_staticFieldOffset },
108 { "staticFieldBase", "(Ljava/lang/reflect/Field;)Ljava/lang/Object;", (void *) (intptr_t) &Java_sun_misc_Unsafe_staticFieldBase },
109 { "ensureClassInitialized", "(Ljava/lang/Class;)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_ensureClassInitialized },
110 { "arrayBaseOffset", "(Ljava/lang/Class;)I", (void *) (intptr_t) &Java_sun_misc_Unsafe_arrayBaseOffset },
111 { "arrayIndexScale", "(Ljava/lang/Class;)I", (void *) (intptr_t) &Java_sun_misc_Unsafe_arrayIndexScale },
112 { "addressSize", "()I", (void *) (intptr_t) &Java_sun_misc_Unsafe_addressSize },
113 { "pageSize", "()I", (void *) (intptr_t) &Java_sun_misc_Unsafe_pageSize },
114 { "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 },
115 { "allocateInstance", "(Ljava/lang/Class;)Ljava/lang/Object;", (void *) (intptr_t) &Java_sun_misc_Unsafe_allocateInstance },
116 { "throwException", "(Ljava/lang/Throwable;)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_throwException },
117 { "compareAndSwapObject", "(Ljava/lang/Object;JLjava/lang/Object;Ljava/lang/Object;)Z", (void *) (intptr_t) &Java_sun_misc_Unsafe_compareAndSwapObject },
118 { "compareAndSwapInt", "(Ljava/lang/Object;JII)Z", (void *) (intptr_t) &Java_sun_misc_Unsafe_compareAndSwapInt },
119 { "compareAndSwapLong", "(Ljava/lang/Object;JJJ)Z", (void *) (intptr_t) &Java_sun_misc_Unsafe_compareAndSwapLong },
120 { "getObjectVolatile", "(Ljava/lang/Object;J)Ljava/lang/Object;", (void *) (intptr_t) &Java_sun_misc_Unsafe_getObjectVolatile },
121 { "putObjectVolatile", "(Ljava/lang/Object;JLjava/lang/Object;)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putObjectVolatile },
122 { "getIntVolatile", "(Ljava/lang/Object;J)I", (void *) (intptr_t) &Java_sun_misc_Unsafe_getIntVolatile },
123 { "getLongVolatile", "(Ljava/lang/Object;J)J", (void *) (intptr_t) &Java_sun_misc_Unsafe_getLongVolatile },
124 { "unpark", "(Ljava/lang/Object;)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_unpark },
125 { "park", "(ZJ)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_park },
129 /* _Jv_sun_misc_Unsafe_init ****************************************************
131 Register native functions.
133 *******************************************************************************/
135 void _Jv_sun_misc_Unsafe_init(void)
139 u = utf_new_char("sun/misc/Unsafe");
141 native_method_register(u, methods, NATIVE_METHODS_COUNT);
146 * Class: sun/misc/Unsafe
147 * Method: registerNatives
150 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_registerNatives(JNIEnv *env, jclass clazz)
152 /* The native methods of this function are already registered in
153 _Jv_sun_misc_Unsafe_init() which is called during VM
159 * Class: sun/misc/Unsafe
161 * Signature: (Ljava/lang/Object;J)I
163 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)
168 p = (int32_t *) (((uint8_t *) o) + offset);
177 * Class: sun/misc/Unsafe
179 * Signature: (Ljava/lang/Object;JI)V
181 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)
185 p = (int32_t *) (((uint8_t *) o) + offset);
192 * Class: sun/misc/Unsafe
194 * Signature: (Ljava/lang/Object;J)Ljava/lang/Object;
196 JNIEXPORT java_lang_Object* JNICALL Java_sun_misc_Unsafe_getObject(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset)
201 p = (void **) (((uint8_t *) o) + offset);
210 * Class: sun/misc/Unsafe
212 * Signature: (Ljava/lang/Object;JLjava/lang/Object;)V
214 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)
218 p = (void **) (((uint8_t *) o) + offset);
225 * Class: sun/misc/Unsafe
227 * Signature: (Ljava/lang/Object;J)Z
229 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_getBoolean(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset)
234 p = (int32_t *) (((uint8_t *) o) + offset);
243 * Class: sun/misc/Unsafe
245 * Signature: (Ljava/lang/Object;JZ)V
247 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putBoolean(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset, int32_t x)
251 p = (int32_t *) (((uint8_t *) o) + offset);
258 * Class: sun/misc/Unsafe
260 * Signature: (Ljava/lang/Object;J)B
262 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)
267 p = (int32_t *) (((uint8_t *) o) + offset);
276 * Class: sun/misc/Unsafe
278 * Signature: (Ljava/lang/Object;JB)V
280 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)
284 p = (int32_t *) (((uint8_t *) o) + offset);
291 * Class: sun/misc/Unsafe
293 * Signature: (Ljava/lang/Object;J)S
295 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)
300 p = (int32_t *) (((uint8_t *) o) + offset);
309 * Class: sun/misc/Unsafe
311 * Signature: (Ljava/lang/Object;JS)V
313 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)
317 p = (int32_t *) (((uint8_t *) o) + offset);
324 * Class: sun/misc/Unsafe
326 * Signature: (Ljava/lang/Object;J)C
328 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)
333 p = (int32_t *) (((uint8_t *) o) + offset);
342 * Class: sun/misc/Unsafe
344 * Signature: (Ljava/lang/Object;JC)V
346 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)
350 p = (int32_t *) (((uint8_t *) o) + offset);
357 * Class: sun/misc/Unsafe
359 * Signature: (Ljava/lang/Object;J)J
361 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)
366 p = (int64_t *) (((uint8_t *) o) + offset);
375 * Class: sun/misc/Unsafe
377 * Signature: (Ljava/lang/Object;JJ)V
379 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)
383 p = (int64_t *) (((uint8_t *) o) + offset);
390 * Class: sun/misc/Unsafe
392 * Signature: (Ljava/lang/Object;J)F
394 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)
399 p = (float *) (((uint8_t *) o) + offset);
408 * Class: sun/misc/Unsafe
410 * Signature: (Ljava/lang/Object;JF)V
412 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)
416 p = (float *) (((uint8_t *) o) + offset);
423 * Class: sun/misc/Unsafe
425 * Signature: (Ljava/lang/Object;J)D
427 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)
432 p = (double *) (((uint8_t *) o) + offset);
441 * Class: sun/misc/Unsafe
443 * Signature: (Ljava/lang/Object;JD)V
445 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)
449 p = (double *) (((uint8_t *) o) + offset);
456 * Class: sun/misc/Unsafe
460 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_getByte__J(JNIEnv *env, sun_misc_Unsafe *this, int64_t address)
465 p = (int8_t *) (intptr_t) address;
469 return (int32_t) value;
474 * Class: sun/misc/Unsafe
478 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putByte__JB(JNIEnv *env, sun_misc_Unsafe *this, int64_t address, int32_t value)
482 p = (int8_t *) (intptr_t) address;
489 * Class: sun/misc/Unsafe
493 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_getShort__J(JNIEnv *env, sun_misc_Unsafe *this, int64_t address)
498 p = (int16_t *) (intptr_t) address;
502 return (int32_t) value;
507 * Class: sun/misc/Unsafe
511 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putShort__JS(JNIEnv *env, sun_misc_Unsafe *this, int64_t address, int32_t value)
515 p = (int16_t *) (intptr_t) address;
517 *p = (int16_t) value;
522 * Class: sun/misc/Unsafe
526 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_getChar__J(JNIEnv *env, sun_misc_Unsafe *this, int64_t address)
531 p = (uint16_t *) (intptr_t) address;
535 return (int32_t) value;
540 * Class: sun/misc/Unsafe
544 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putChar__JC(JNIEnv *env, sun_misc_Unsafe *this, int64_t address, int32_t value)
548 p = (uint16_t *) (intptr_t) address;
550 *p = (uint16_t) value;
555 * Class: sun/misc/Unsafe
559 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_getInt__J(JNIEnv *env, sun_misc_Unsafe *this, int64_t address)
564 p = (int32_t *) (intptr_t) address;
573 * Class: sun/misc/Unsafe
577 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putInt__JI(JNIEnv *env, struct sun_misc_Unsafe* this, int64_t address, int32_t value)
581 p = (int32_t *) (intptr_t) address;
588 * Class: sun/misc/Unsafe
592 JNIEXPORT int64_t JNICALL Java_sun_misc_Unsafe_getLong__J(JNIEnv *env, sun_misc_Unsafe *this, int64_t address)
597 p = (int64_t *) (intptr_t) address;
606 * Class: sun/misc/Unsafe
610 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putLong__JJ(JNIEnv *env, sun_misc_Unsafe *this, int64_t address, int64_t value)
614 p = (int64_t *) (intptr_t) address;
621 * Class: sun/misc/Unsafe
625 JNIEXPORT float JNICALL Java_sun_misc_Unsafe_getFloat__J(JNIEnv *env, sun_misc_Unsafe *this, int64_t address)
630 p = (float *) (intptr_t) address;
639 * Class: sun/misc/Unsafe
640 * Method: objectFieldOffset
641 * Signature: (Ljava/lang/reflect/Field;)J
643 JNIEXPORT int64_t JNICALL Java_sun_misc_Unsafe_objectFieldOffset(JNIEnv *env, sun_misc_Unsafe *this, java_lang_reflect_Field *field)
649 LLNI_field_get_cls(field, clazz, c);
650 LLNI_field_get_val(field, slot , slot);
652 f = &c->fields[slot];
654 return (int64_t) f->offset;
659 * Class: sun/misc/Unsafe
660 * Method: allocateMemory
663 JNIEXPORT int64_t JNICALL Java_sun_misc_Unsafe_allocateMemory(JNIEnv *env, sun_misc_Unsafe *this, int64_t bytes)
668 length = (size_t) bytes;
670 if ((length != (uint64_t) bytes) || (bytes < 0)) {
671 exceptions_throw_illegalargumentexception();
675 p = MNEW(uint8_t, length);
677 return (int64_t) (intptr_t) p;
685 * Class: sun/misc/Unsafe
687 * Signature: (Ljava/lang/Object;JJB)V
689 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)
694 length = (size_t) bytes;
696 if ((length != (uint64_t) bytes) || (bytes < 0)) {
697 exceptions_throw_illegalargumentexception();
701 /* XXX Missing LLNI: we need to unwrap this object. */
703 p = (void *) (((uint8_t *) o) + offset);
705 /* XXX Not sure this is correct. */
707 system_memset(p, value, length);
712 * Class: sun/misc/Unsafe
714 * Signature: (Ljava/lang/Object;JLjava/lang/Object;JJ)V
716 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)
725 length = (size_t) bytes;
727 if ((length != (uint64_t) bytes) || (bytes < 0)) {
728 exceptions_throw_illegalargumentexception();
732 /* XXX Missing LLNI: We need to unwrap these objects. */
734 src = (void *) (((uint8_t *) srcBase) + srcOffset);
735 dest = (void *) (((uint8_t *) destBase) + destOffset);
737 system_memcpy(dest, src, length);
741 * Class: sun/misc/Unsafe
745 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_setMemory(JNIEnv *env, sun_misc_Unsafe *this, int64_t address, int64_t bytes, int32_t value)
750 length = (size_t) bytes;
752 if ((length != (uint64_t) bytes) || (bytes < 0)) {
753 exceptions_throw_illegalargumentexception();
757 p = (void *) (intptr_t) address;
759 /* XXX Not sure this is correct. */
761 system_memset(p, value, length);
766 * Class: sun/misc/Unsafe
770 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_copyMemory(JNIEnv *env, sun_misc_Unsafe *this, int64_t srcAddress, int64_t destAddress, int64_t bytes)
779 length = (size_t) bytes;
781 if ((length != (uint64_t) bytes) || (bytes < 0)) {
782 exceptions_throw_illegalargumentexception();
786 src = (void *) (intptr_t) srcAddress;
787 dest = (void *) (intptr_t) destAddress;
789 system_memcpy(dest, src, length);
795 * Class: sun/misc/Unsafe
799 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_freeMemory(JNIEnv *env, sun_misc_Unsafe *this, int64_t address)
803 p = (void *) (intptr_t) address;
808 /* we pass length 1 to trick the free function */
810 MFREE(p, uint8_t, 1);
815 * Class: sun/misc/Unsafe
816 * Method: staticFieldOffset
817 * Signature: (Ljava/lang/reflect/Field;)J
819 JNIEXPORT int64_t JNICALL Java_sun_misc_Unsafe_staticFieldOffset(JNIEnv *env, sun_misc_Unsafe *this, java_lang_reflect_Field *f)
821 /* The offset of static fields is 0. */
828 * Class: sun/misc/Unsafe
829 * Method: staticFieldBase
830 * Signature: (Ljava/lang/reflect/Field;)Ljava/lang/Object;
832 JNIEXPORT java_lang_Object* JNICALL Java_sun_misc_Unsafe_staticFieldBase(JNIEnv *env, sun_misc_Unsafe *this, java_lang_reflect_Field *rf)
838 LLNI_field_get_cls(rf, clazz, c);
839 LLNI_field_get_val(rf, slot , slot);
841 f = &(c->fields[slot]);
843 return (java_lang_Object *) (f->value);
848 * Class: sun/misc/Unsafe
849 * Method: ensureClassInitialized
850 * Signature: (Ljava/lang/Class;)V
852 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_ensureClassInitialized(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Class *class)
856 c = LLNI_classinfo_unwrap(class);
858 if (!(c->state & CLASS_INITIALIZED))
864 * Class: sun/misc/Unsafe
865 * Method: arrayBaseOffset
866 * Signature: (Ljava/lang/Class;)I
868 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_arrayBaseOffset(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Class *arrayClass)
873 c = LLNI_classinfo_unwrap(arrayClass);
874 ad = c->vftbl->arraydesc;
877 /* XXX does that exception exist? */
878 exceptions_throw_internalerror("java/lang/InvalidClassException");
882 return ad->dataoffset;
887 * Class: sun/misc/Unsafe
888 * Method: arrayIndexScale
889 * Signature: (Ljava/lang/Class;)I
891 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_arrayIndexScale(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Class *arrayClass)
896 c = LLNI_classinfo_unwrap(arrayClass);
897 ad = c->vftbl->arraydesc;
900 /* XXX does that exception exist? */
901 exceptions_throw_internalerror("java/lang/InvalidClassException");
905 return ad->componentsize;
910 * Class: sun/misc/Unsafe
911 * Method: addressSize
914 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_addressSize(JNIEnv *env, sun_misc_Unsafe *this)
916 return SIZEOF_VOID_P;
921 * Class: sun/misc/Unsafe
925 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_pageSize(JNIEnv *env, sun_misc_Unsafe *this)
936 * Class: sun/misc/Unsafe
937 * Method: defineClass
938 * Signature: (Ljava/lang/String;[BIILjava/lang/ClassLoader;Ljava/security/ProtectionDomain;)Ljava/lang/Class;
940 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)
947 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
949 /* check if data was passed */
952 exceptions_throw_nullpointerexception();
956 /* check the indexes passed */
958 if ((off < 0) || (len < 0) || ((off + len) > LLNI_array_size(b))) {
959 exceptions_throw_arrayindexoutofboundsexception();
964 /* convert '.' to '/' in java string */
966 utfname = javastring_toutf((java_handle_t *) name, true);
972 /* define the class */
974 c = class_define(utfname, cl, len, (uint8_t *) &(LLNI_array_direct(b, off)),
975 (java_handle_t *) protectionDomain);
980 /* for convenience */
982 o = LLNI_classinfo_wrap(c);
984 #if defined(WITH_CLASSPATH_GNU)
985 /* set ProtectionDomain */
987 LLNI_field_set_ref(o, pd, protectionDomain);
995 * Class: sun/misc/Unsafe
996 * Method: allocateInstance
997 * Signature: (Ljava/lang/Class;)Ljava/lang/Object;
999 JNIEXPORT java_lang_Object* JNICALL Java_sun_misc_Unsafe_allocateInstance(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Class *cls)
1004 c = LLNI_classinfo_unwrap(cls);
1008 return (java_lang_Object *) o;
1013 * Class: sun/misc/Unsafe
1014 * Method: throwException
1015 * Signature: (Ljava/lang/Throwable;)V
1017 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_throwException(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Throwable *ee)
1021 o = (java_handle_t *) ee;
1023 exceptions_set_exception(o);
1028 * Class: sun/misc/Unsafe
1029 * Method: compareAndSwapObject
1030 * Signature: (Ljava/lang/Object;JLjava/lang/Object;Ljava/lang/Object;)Z
1032 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)
1037 p = (void **) (((uint8_t *) o) + offset);
1039 /* XXX this should be atomic */
1043 if (value == expected) {
1054 * Class: sun/misc/Unsafe
1055 * Method: compareAndSwapInt
1056 * Signature: (Ljava/lang/Object;JII)Z
1058 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_compareAndSwapInt(JNIEnv *env, sun_misc_Unsafe* this, java_lang_Object* obj, int64_t offset, int32_t expect, int32_t update)
1063 p = (int32_t *) (((uint8_t *) obj) + offset);
1065 /* XXX this should be atomic */
1069 if (value == expect) {
1080 * Class: sun/misc/Unsafe
1081 * Method: compareAndSwapLong
1082 * Signature: (Ljava/lang/Object;JJJ)Z
1084 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)
1089 p = (int64_t *) (((uint8_t *) o) + offset);
1091 /* XXX this should be atomic */
1095 if (value == expected) {
1106 * Class: sun/misc/Unsafe
1107 * Method: getObjectVolatile
1108 * Signature: (Ljava/lang/Object;J)Ljava/lang/Object;
1110 JNIEXPORT java_lang_Object* JNICALL Java_sun_misc_Unsafe_getObjectVolatile(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset)
1113 volatile void *value;
1115 p = (volatile void **) (((uint8_t *) o) + offset);
1119 return (java_lang_Object *) value;
1124 * Class: sun/misc/Unsafe
1125 * Method: putObjectVolatile
1126 * Signature: (Ljava/lang/Object;JLjava/lang/Object;)V
1128 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)
1132 p = (volatile void **) (((uint8_t *) o) + offset);
1139 * Class: sun/misc/Unsafe
1140 * Method: getIntVolatile
1141 * Signature: (Ljava/lang/Object;J)I
1143 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_getIntVolatile(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset)
1145 volatile int32_t *p;
1146 volatile int32_t value;
1148 p = (volatile int32_t *) (((uint8_t *) o) + offset);
1157 * Class: sun/misc/Unsafe
1158 * Method: getLongVolatile
1159 * Signature: (Ljava/lang/Object;J)J
1161 JNIEXPORT int64_t JNICALL Java_sun_misc_Unsafe_getLongVolatile(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset)
1163 volatile int64_t *p;
1164 volatile int64_t value;
1166 p = (volatile int64_t *) (((uint8_t *) o) + offset);
1175 * Class: sun/misc/Unsafe
1177 * Signature: (Ljava/lang/Object;)V
1179 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_unpark(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *thread)
1181 /* XXX IMPLEMENT ME */
1186 * Class: sun/misc/Unsafe
1190 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_park(JNIEnv *env, sun_misc_Unsafe *this, int32_t isAbsolute, int64_t time)
1192 /* XXX IMPLEMENT ME */
1197 * These are local overrides for various environment variables in Emacs.
1198 * Please do not remove this and leave it at the end of the file, where
1199 * Emacs will automagically detect them.
1200 * ---------------------------------------------------------------------
1203 * indent-tabs-mode: t