| diff -Nru jamvm-2.0.0.orig/configure.ac jamvm-2.0.0/configure.ac |
| |
| |
| @@ -32,6 +32,7 @@ |
| |
| case "$host" in |
| i[[3456]]86-*-linux*) host_cpu=i386 host_os=linux ;; |
| +i[[3456]]86-*-midipix*) host_cpu=i386 host_os=midipix ;; |
| i[[3456]]86-*-kfreebsd*) host_cpu=i386 host_os=linux ;; |
| i[[3456]]86-*-darwin*) host_cpu=i386 host_os=darwin ;; |
| arm*-*-darwin*) host_cpu=arm host_os=darwin libdl_needed=no ;; |
| @@ -39,6 +40,7 @@ |
| i386-*-freebsd*) host_os=bsd libdl_needed=no ;; |
| i386-*-solaris*) host_cpu=x86 host_os=solaris ;; |
| x86_64-*-linux*) host_os=linux ;; |
| +x86_64-*-midipix*) host_os=midipix ;; |
| hppa*-*-linux*) host_cpu=parisc host_os=linux ;; |
| mips*-*-linux*) host_cpu=mips host_os=linux ;; |
| x86_64-*-openbsd*) host_os=bsd libdl_needed=no ;; |
| @@ -397,6 +399,7 @@ |
| src/arch/Makefile \ |
| src/os/Makefile \ |
| src/os/linux/Makefile \ |
| + src/os/midipix/Makefile \ |
| src/os/darwin/Makefile \ |
| src/os/bsd/Makefile \ |
| src/os/solaris/Makefile \ |
| @@ -407,6 +410,8 @@ |
| src/os/linux/x86_64/Makefile \ |
| src/os/linux/parisc/Makefile \ |
| src/os/linux/mips/Makefile \ |
| + src/os/midipix/x86_64/Makefile \ |
| + src/os/midipix/i386/Makefile \ |
| src/os/darwin/i386/Makefile \ |
| src/os/darwin/arm/Makefile \ |
| src/os/darwin/powerpc/Makefile \ |
| diff -Nru jamvm-2.0.0.orig/src/os/Makefile.am jamvm-2.0.0/src/os/Makefile.am |
| |
| |
| @@ -20,5 +20,5 @@ |
| ## |
| |
| SUBDIRS = @os@ |
| -DIST_SUBDIRS = linux darwin bsd solaris |
| +DIST_SUBDIRS = linux darwin bsd solaris midipix |
| |
| diff -Nru jamvm-2.0.0.orig/src/os/midipix/i386/dll_md.c jamvm-2.0.0/src/os/midipix/i386/dll_md.c |
| |
| |
| @@ -0,0 +1,117 @@ |
| +/* |
| + * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2009, 2010, 2011 |
| + * Robert Lougher <rob@jamvm.org.uk>. |
| + * |
| + * This file is part of JamVM. |
| + * |
| + * This program is free software; you can redistribute it and/or |
| + * modify it under the terms of the GNU General Public License |
| + * as published by the Free Software Foundation; either version 2, |
| + * or (at your option) any later version. |
| + * |
| + * This program is distributed in the hope that it will be useful, |
| + * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| + * GNU General Public License for more details. |
| + * |
| + * You should have received a copy of the GNU General Public License |
| + * along with this program; if not, write to the Free Software |
| + * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
| + */ |
| + |
| +#include "jam.h" |
| + |
| +#ifndef USE_FFI |
| +#include <string.h> |
| +#include "sig.h" |
| + |
| +#define RET_VOID 0 |
| +#define RET_DOUBLE 1 |
| +#define RET_LONG 2 |
| +#define RET_FLOAT 3 |
| +#define RET_BYTE 4 |
| +#define RET_CHAR 5 |
| +#define RET_SHORT 6 |
| +#define RET_DFLT 7 |
| + |
| +int nativeExtraArg(MethodBlock *mb) { |
| + int len = strlen(mb->type); |
| + if(mb->type[len-2] == ')') |
| + switch(mb->type[len-1]) { |
| + case 'V': |
| + return RET_VOID; |
| + case 'D': |
| + return RET_DOUBLE; |
| + case 'J': |
| + return RET_LONG; |
| + case 'F': |
| + return RET_FLOAT; |
| + case 'B': |
| + case 'Z': |
| + return RET_BYTE; |
| + case 'C': |
| + return RET_CHAR; |
| + case 'S': |
| + return RET_SHORT; |
| + } |
| + |
| + return RET_DFLT; |
| +} |
| + |
| +u4 *callJNIMethod(void *env, Class *class, char *sig, int ret_type, |
| + u4 *ostack, unsigned char *f, int args) { |
| + |
| + int i; |
| + u4 *sp; |
| + u4 method_args[args + (class ? 2 : 1)]; |
| + |
| + asm volatile ("movl %%esp,%0" : "=m" (sp) :); |
| + |
| + *sp++ = (u4)env; |
| + |
| + if(class) |
| + *sp++ = (u4)class; |
| + |
| + for(i = 0; i < args; i++) |
| + sp[i] = ostack[i]; |
| + |
| + switch(ret_type) { |
| + case RET_VOID: |
| + (*(void (*)())f)(); |
| + break; |
| + |
| + case RET_DOUBLE: |
| + *(double*)ostack = (*(double (*)())f)(); |
| + ostack += 2; |
| + break; |
| + |
| + case RET_LONG: |
| + *(long long*)ostack = (*(long long (*)())f)(); |
| + ostack += 2; |
| + break; |
| + |
| + case RET_FLOAT: |
| + *(float*)ostack = (*(float (*)())f)(); |
| + ostack++; |
| + break; |
| + |
| + case RET_BYTE: |
| + *ostack++ = (*(signed char (*)())f)(); |
| + break; |
| + |
| + case RET_CHAR: |
| + *ostack++ = (*(unsigned short (*)())f)(); |
| + break; |
| + |
| + case RET_SHORT: |
| + *ostack++ = (*(signed short (*)())f)(); |
| + break; |
| + |
| + default: |
| + *ostack++ = (*(u4 (*)())f)(); |
| + break; |
| + } |
| + |
| + return ostack; |
| +} |
| +#endif |
| diff -Nru jamvm-2.0.0.orig/src/os/midipix/i386/init.c jamvm-2.0.0/src/os/midipix/i386/init.c |
| |
| |
| @@ -0,0 +1,38 @@ |
| +/* |
| + * Copyright (C) 2003, 2004, 2006, 2007 |
| + * Robert Lougher <rob@jamvm.org.uk>. |
| + * |
| + * This file is part of JamVM. |
| + * |
| + * This program is free software; you can redistribute it and/or |
| + * modify it under the terms of the GNU General Public License |
| + * as published by the Free Software Foundation; either version 2, |
| + * or (at your option) any later version. |
| + * |
| + * This program is distributed in the hope that it will be useful, |
| + * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| + * GNU General Public License for more details. |
| + * |
| + * You should have received a copy of the GNU General Public License |
| + * along with this program; if not, write to the Free Software |
| + * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
| + */ |
| + |
| +#include <fpu_control.h> |
| + |
| +/* Change floating point precision to double (64-bit) from |
| + * the extended (80-bit) Linux default. */ |
| + |
| +void setDoublePrecision() { |
| + fpu_control_t cw; |
| + |
| + _FPU_GETCW(cw); |
| + cw &= ~_FPU_EXTENDED; |
| + cw |= _FPU_DOUBLE; |
| + _FPU_SETCW(cw); |
| +} |
| + |
| +void initialisePlatform() { |
| + setDoublePrecision(); |
| +} |
| diff -Nru jamvm-2.0.0.orig/src/os/midipix/i386/jni-stubs.c jamvm-2.0.0/src/os/midipix/i386/jni-stubs.c |
| |
| |
| @@ -0,0 +1,927 @@ |
| +/* Generated by gen-stubs.c from signature file sigs (profiling off) */ |
| + |
| +#include "jam.h" |
| + |
| +#ifdef USE_MD_STUBS |
| +#include "stubs.h" |
| +#include "properties.h" |
| +#include "jni-internal.h" |
| + |
| +extern void *jni_env; |
| + |
| +/* Static signatures */ |
| + |
| +/* ()I */ |
| +static uintptr_t *static__I(Class *class, MethodBlock *mb, uintptr_t *ostack) { |
| + if(!initJNILrefs()) |
| + return NULL; |
| + |
| + *ostack = (*(uintptr_t (*)(void*, void*))mb->code) ( |
| + &jni_env, |
| + class); |
| + |
| + return ostack + 1; |
| +} |
| + |
| +/* ()J */ |
| +static uintptr_t *static__J(Class *class, MethodBlock *mb, uintptr_t *ostack) { |
| + if(!initJNILrefs()) |
| + return NULL; |
| + |
| + *(int64_t*)ostack = (*(int64_t (*)(void*, void*))mb->code) ( |
| + &jni_env, |
| + class); |
| + |
| + return ostack + 2; |
| +} |
| + |
| +/* ()L */ |
| +static uintptr_t *static__L(Class *class, MethodBlock *mb, uintptr_t *ostack) { |
| + if(!initJNILrefs()) |
| + return NULL; |
| + |
| + *ostack = (uintptr_t)REF_TO_OBJ((*(uintptr_t (*)(void*, void*))mb->code) ( |
| + &jni_env, |
| + class)); |
| + |
| + return ostack + 1; |
| +} |
| + |
| +/* ()V */ |
| +static uintptr_t *static__V(Class *class, MethodBlock *mb, uintptr_t *ostack) { |
| + if(!initJNILrefs()) |
| + return NULL; |
| + |
| + (*(void (*)(void*, void*))mb->code) ( |
| + &jni_env, |
| + class); |
| + |
| + return ostack + 0; |
| +} |
| + |
| +/* (I)B */ |
| +static uintptr_t *static_I_B(Class *class, MethodBlock *mb, uintptr_t *ostack) { |
| + if(!initJNILrefs()) |
| + return NULL; |
| + |
| + *ostack = (*(int8_t (*)(void*, void*, uintptr_t))mb->code) ( |
| + &jni_env, |
| + class, |
| + *(uintptr_t *)&ostack[0]); |
| + |
| + return ostack + 1; |
| +} |
| + |
| +/* (I)F */ |
| +static uintptr_t *static_I_F(Class *class, MethodBlock *mb, uintptr_t *ostack) { |
| + if(!initJNILrefs()) |
| + return NULL; |
| + |
| + *((float*)ostack + IS_BE64) = (*(float (*)(void*, void*, uintptr_t))mb->code) ( |
| + &jni_env, |
| + class, |
| + *(uintptr_t *)&ostack[0]); |
| + |
| + return ostack + 1; |
| +} |
| + |
| +/* (I)I */ |
| +static uintptr_t *static_I_I(Class *class, MethodBlock *mb, uintptr_t *ostack) { |
| + if(!initJNILrefs()) |
| + return NULL; |
| + |
| + *ostack = (*(uintptr_t (*)(void*, void*, uintptr_t))mb->code) ( |
| + &jni_env, |
| + class, |
| + *(uintptr_t *)&ostack[0]); |
| + |
| + return ostack + 1; |
| +} |
| + |
| +/* (I)L */ |
| +static uintptr_t *static_I_L(Class *class, MethodBlock *mb, uintptr_t *ostack) { |
| + if(!initJNILrefs()) |
| + return NULL; |
| + |
| + *ostack = (uintptr_t)REF_TO_OBJ((*(uintptr_t (*)(void*, void*, uintptr_t))mb->code) ( |
| + &jni_env, |
| + class, |
| + *(uintptr_t *)&ostack[0])); |
| + |
| + return ostack + 1; |
| +} |
| + |
| +/* (J)D */ |
| +static uintptr_t *static_J_D(Class *class, MethodBlock *mb, uintptr_t *ostack) { |
| + if(!initJNILrefs()) |
| + return NULL; |
| + |
| + *(double*)ostack = (*(double (*)(void*, void*, int64_t))mb->code) ( |
| + &jni_env, |
| + class, |
| + *(int64_t *)&ostack[0]); |
| + |
| + return ostack + 2; |
| +} |
| + |
| +/* (J)I */ |
| +static uintptr_t *static_J_I(Class *class, MethodBlock *mb, uintptr_t *ostack) { |
| + if(!initJNILrefs()) |
| + return NULL; |
| + |
| + *ostack = (*(uintptr_t (*)(void*, void*, int64_t))mb->code) ( |
| + &jni_env, |
| + class, |
| + *(int64_t *)&ostack[0]); |
| + |
| + return ostack + 1; |
| +} |
| + |
| +/* (J)J */ |
| +static uintptr_t *static_J_J(Class *class, MethodBlock *mb, uintptr_t *ostack) { |
| + if(!initJNILrefs()) |
| + return NULL; |
| + |
| + *(int64_t*)ostack = (*(int64_t (*)(void*, void*, int64_t))mb->code) ( |
| + &jni_env, |
| + class, |
| + *(int64_t *)&ostack[0]); |
| + |
| + return ostack + 2; |
| +} |
| + |
| +/* (J)L */ |
| +static uintptr_t *static_J_L(Class *class, MethodBlock *mb, uintptr_t *ostack) { |
| + if(!initJNILrefs()) |
| + return NULL; |
| + |
| + *ostack = (uintptr_t)REF_TO_OBJ((*(uintptr_t (*)(void*, void*, int64_t))mb->code) ( |
| + &jni_env, |
| + class, |
| + *(int64_t *)&ostack[0])); |
| + |
| + return ostack + 1; |
| +} |
| + |
| +/* (J)V */ |
| +static uintptr_t *static_J_V(Class *class, MethodBlock *mb, uintptr_t *ostack) { |
| + if(!initJNILrefs()) |
| + return NULL; |
| + |
| + (*(void (*)(void*, void*, int64_t))mb->code) ( |
| + &jni_env, |
| + class, |
| + *(int64_t *)&ostack[0]); |
| + |
| + return ostack + 0; |
| +} |
| + |
| +/* (JI)I */ |
| +static uintptr_t *static_JI_I(Class *class, MethodBlock *mb, uintptr_t *ostack) { |
| + if(!initJNILrefs()) |
| + return NULL; |
| + |
| + *ostack = (*(uintptr_t (*)(void*, void*, int64_t, uintptr_t))mb->code) ( |
| + &jni_env, |
| + class, |
| + *(int64_t *)&ostack[0], |
| + *(uintptr_t *)&ostack[2]); |
| + |
| + return ostack + 1; |
| +} |
| + |
| +/* (JI)J */ |
| +static uintptr_t *static_JI_J(Class *class, MethodBlock *mb, uintptr_t *ostack) { |
| + if(!initJNILrefs()) |
| + return NULL; |
| + |
| + *(int64_t*)ostack = (*(int64_t (*)(void*, void*, int64_t, uintptr_t))mb->code) ( |
| + &jni_env, |
| + class, |
| + *(int64_t *)&ostack[0], |
| + *(uintptr_t *)&ostack[2]); |
| + |
| + return ostack + 2; |
| +} |
| + |
| +/* (JI)L */ |
| +static uintptr_t *static_JI_L(Class *class, MethodBlock *mb, uintptr_t *ostack) { |
| + if(!initJNILrefs()) |
| + return NULL; |
| + |
| + *ostack = (uintptr_t)REF_TO_OBJ((*(uintptr_t (*)(void*, void*, int64_t, uintptr_t))mb->code) ( |
| + &jni_env, |
| + class, |
| + *(int64_t *)&ostack[0], |
| + *(uintptr_t *)&ostack[2])); |
| + |
| + return ostack + 1; |
| +} |
| + |
| +/* (JI)V */ |
| +static uintptr_t *static_JI_V(Class *class, MethodBlock *mb, uintptr_t *ostack) { |
| + if(!initJNILrefs()) |
| + return NULL; |
| + |
| + (*(void (*)(void*, void*, int64_t, uintptr_t))mb->code) ( |
| + &jni_env, |
| + class, |
| + *(int64_t *)&ostack[0], |
| + *(uintptr_t *)&ostack[2]); |
| + |
| + return ostack + 0; |
| +} |
| + |
| +/* (JJ)B */ |
| +static uintptr_t *static_JJ_B(Class *class, MethodBlock *mb, uintptr_t *ostack) { |
| + if(!initJNILrefs()) |
| + return NULL; |
| + |
| + *ostack = (*(int8_t (*)(void*, void*, int64_t, int64_t))mb->code) ( |
| + &jni_env, |
| + class, |
| + *(int64_t *)&ostack[0], |
| + *(int64_t *)&ostack[2]); |
| + |
| + return ostack + 1; |
| +} |
| + |
| +/* (JJ)D */ |
| +static uintptr_t *static_JJ_D(Class *class, MethodBlock *mb, uintptr_t *ostack) { |
| + if(!initJNILrefs()) |
| + return NULL; |
| + |
| + *(double*)ostack = (*(double (*)(void*, void*, int64_t, int64_t))mb->code) ( |
| + &jni_env, |
| + class, |
| + *(int64_t *)&ostack[0], |
| + *(int64_t *)&ostack[2]); |
| + |
| + return ostack + 2; |
| +} |
| + |
| +/* (JJ)I */ |
| +static uintptr_t *static_JJ_I(Class *class, MethodBlock *mb, uintptr_t *ostack) { |
| + if(!initJNILrefs()) |
| + return NULL; |
| + |
| + *ostack = (*(uintptr_t (*)(void*, void*, int64_t, int64_t))mb->code) ( |
| + &jni_env, |
| + class, |
| + *(int64_t *)&ostack[0], |
| + *(int64_t *)&ostack[2]); |
| + |
| + return ostack + 1; |
| +} |
| + |
| +/* (JJ)J */ |
| +static uintptr_t *static_JJ_J(Class *class, MethodBlock *mb, uintptr_t *ostack) { |
| + if(!initJNILrefs()) |
| + return NULL; |
| + |
| + *(int64_t*)ostack = (*(int64_t (*)(void*, void*, int64_t, int64_t))mb->code) ( |
| + &jni_env, |
| + class, |
| + *(int64_t *)&ostack[0], |
| + *(int64_t *)&ostack[2]); |
| + |
| + return ostack + 2; |
| +} |
| + |
| +/* (JJ)L */ |
| +static uintptr_t *static_JJ_L(Class *class, MethodBlock *mb, uintptr_t *ostack) { |
| + if(!initJNILrefs()) |
| + return NULL; |
| + |
| + *ostack = (uintptr_t)REF_TO_OBJ((*(uintptr_t (*)(void*, void*, int64_t, int64_t))mb->code) ( |
| + &jni_env, |
| + class, |
| + *(int64_t *)&ostack[0], |
| + *(int64_t *)&ostack[2])); |
| + |
| + return ostack + 1; |
| +} |
| + |
| +/* (JJ)V */ |
| +static uintptr_t *static_JJ_V(Class *class, MethodBlock *mb, uintptr_t *ostack) { |
| + if(!initJNILrefs()) |
| + return NULL; |
| + |
| + (*(void (*)(void*, void*, int64_t, int64_t))mb->code) ( |
| + &jni_env, |
| + class, |
| + *(int64_t *)&ostack[0], |
| + *(int64_t *)&ostack[2]); |
| + |
| + return ostack + 0; |
| +} |
| + |
| +/* (JJI)L */ |
| +static uintptr_t *static_JJI_L(Class *class, MethodBlock *mb, uintptr_t *ostack) { |
| + if(!initJNILrefs()) |
| + return NULL; |
| + |
| + *ostack = (uintptr_t)REF_TO_OBJ((*(uintptr_t (*)(void*, void*, int64_t, int64_t, uintptr_t))mb->code) ( |
| + &jni_env, |
| + class, |
| + *(int64_t *)&ostack[0], |
| + *(int64_t *)&ostack[2], |
| + *(uintptr_t *)&ostack[4])); |
| + |
| + return ostack + 1; |
| +} |
| + |
| +/* (JJI)V */ |
| +static uintptr_t *static_JJI_V(Class *class, MethodBlock *mb, uintptr_t *ostack) { |
| + if(!initJNILrefs()) |
| + return NULL; |
| + |
| + (*(void (*)(void*, void*, int64_t, int64_t, uintptr_t))mb->code) ( |
| + &jni_env, |
| + class, |
| + *(int64_t *)&ostack[0], |
| + *(int64_t *)&ostack[2], |
| + *(uintptr_t *)&ostack[4]); |
| + |
| + return ostack + 0; |
| +} |
| + |
| +/* (JJJI)V */ |
| +static uintptr_t *static_JJJI_V(Class *class, MethodBlock *mb, uintptr_t *ostack) { |
| + if(!initJNILrefs()) |
| + return NULL; |
| + |
| + (*(void (*)(void*, void*, int64_t, int64_t, int64_t, uintptr_t))mb->code) ( |
| + &jni_env, |
| + class, |
| + *(int64_t *)&ostack[0], |
| + *(int64_t *)&ostack[2], |
| + *(int64_t *)&ostack[4], |
| + *(uintptr_t *)&ostack[6]); |
| + |
| + return ostack + 0; |
| +} |
| + |
| +/* (JJJJ)V */ |
| +static uintptr_t *static_JJJJ_V(Class *class, MethodBlock *mb, uintptr_t *ostack) { |
| + if(!initJNILrefs()) |
| + return NULL; |
| + |
| + (*(void (*)(void*, void*, int64_t, int64_t, int64_t, int64_t))mb->code) ( |
| + &jni_env, |
| + class, |
| + *(int64_t *)&ostack[0], |
| + *(int64_t *)&ostack[2], |
| + *(int64_t *)&ostack[4], |
| + *(int64_t *)&ostack[6]); |
| + |
| + return ostack + 0; |
| +} |
| + |
| +/* (JJJJI)I */ |
| +static uintptr_t *static_JJJJI_I(Class *class, MethodBlock *mb, uintptr_t *ostack) { |
| + if(!initJNILrefs()) |
| + return NULL; |
| + |
| + *ostack = (*(uintptr_t (*)(void*, void*, int64_t, int64_t, int64_t, int64_t, uintptr_t))mb->code) ( |
| + &jni_env, |
| + class, |
| + *(int64_t *)&ostack[0], |
| + *(int64_t *)&ostack[2], |
| + *(int64_t *)&ostack[4], |
| + *(int64_t *)&ostack[6], |
| + *(uintptr_t *)&ostack[8]); |
| + |
| + return ostack + 1; |
| +} |
| + |
| +/* (JJJJJJ)V */ |
| +static uintptr_t *static_JJJJJJ_V(Class *class, MethodBlock *mb, uintptr_t *ostack) { |
| + if(!initJNILrefs()) |
| + return NULL; |
| + |
| + (*(void (*)(void*, void*, int64_t, int64_t, int64_t, int64_t, int64_t, int64_t))mb->code) ( |
| + &jni_env, |
| + class, |
| + *(int64_t *)&ostack[0], |
| + *(int64_t *)&ostack[2], |
| + *(int64_t *)&ostack[4], |
| + *(int64_t *)&ostack[6], |
| + *(int64_t *)&ostack[8], |
| + *(int64_t *)&ostack[10]); |
| + |
| + return ostack + 0; |
| +} |
| + |
| +/* (JJJJJJJJJI)V */ |
| +static uintptr_t *static_JJJJJJJJJI_V(Class *class, MethodBlock *mb, uintptr_t *ostack) { |
| + if(!initJNILrefs()) |
| + return NULL; |
| + |
| + (*(void (*)(void*, void*, int64_t, int64_t, int64_t, int64_t, int64_t, int64_t, int64_t, int64_t, int64_t, uintptr_t))mb->code) ( |
| + &jni_env, |
| + class, |
| + *(int64_t *)&ostack[0], |
| + *(int64_t *)&ostack[2], |
| + *(int64_t *)&ostack[4], |
| + *(int64_t *)&ostack[6], |
| + *(int64_t *)&ostack[8], |
| + *(int64_t *)&ostack[10], |
| + *(int64_t *)&ostack[12], |
| + *(int64_t *)&ostack[14], |
| + *(int64_t *)&ostack[16], |
| + *(uintptr_t *)&ostack[18]); |
| + |
| + return ostack + 0; |
| +} |
| + |
| +/* (JJJJJJJJJJJJ)I */ |
| +static uintptr_t *static_JJJJJJJJJJJJ_I(Class *class, MethodBlock *mb, uintptr_t *ostack) { |
| + if(!initJNILrefs()) |
| + return NULL; |
| + |
| + *ostack = (*(uintptr_t (*)(void*, void*, int64_t, int64_t, int64_t, int64_t, int64_t, int64_t, int64_t, int64_t, int64_t, int64_t, int64_t, int64_t))mb->code) ( |
| + &jni_env, |
| + class, |
| + *(int64_t *)&ostack[0], |
| + *(int64_t *)&ostack[2], |
| + *(int64_t *)&ostack[4], |
| + *(int64_t *)&ostack[6], |
| + *(int64_t *)&ostack[8], |
| + *(int64_t *)&ostack[10], |
| + *(int64_t *)&ostack[12], |
| + *(int64_t *)&ostack[14], |
| + *(int64_t *)&ostack[16], |
| + *(int64_t *)&ostack[18], |
| + *(int64_t *)&ostack[20], |
| + *(int64_t *)&ostack[22]); |
| + |
| + return ostack + 1; |
| +} |
| + |
| +/* Non-static signatures */ |
| + |
| +/* ()B */ |
| +static uintptr_t *__B(Class *class, MethodBlock *mb, uintptr_t *ostack) { |
| + if(!initJNILrefs()) |
| + return NULL; |
| + |
| + *ostack = (*(int8_t (*)(void*, void*))mb->code) ( |
| + &jni_env, |
| + (void*)ostack[0]); |
| + |
| + return ostack + 1; |
| +} |
| + |
| +/* ()I */ |
| +static uintptr_t *__I(Class *class, MethodBlock *mb, uintptr_t *ostack) { |
| + if(!initJNILrefs()) |
| + return NULL; |
| + |
| + *ostack = (*(uintptr_t (*)(void*, void*))mb->code) ( |
| + &jni_env, |
| + (void*)ostack[0]); |
| + |
| + return ostack + 1; |
| +} |
| + |
| +/* ()J */ |
| +static uintptr_t *__J(Class *class, MethodBlock *mb, uintptr_t *ostack) { |
| + if(!initJNILrefs()) |
| + return NULL; |
| + |
| + *(int64_t*)ostack = (*(int64_t (*)(void*, void*))mb->code) ( |
| + &jni_env, |
| + (void*)ostack[0]); |
| + |
| + return ostack + 2; |
| +} |
| + |
| +/* ()L */ |
| +static uintptr_t *__L(Class *class, MethodBlock *mb, uintptr_t *ostack) { |
| + if(!initJNILrefs()) |
| + return NULL; |
| + |
| + *ostack = (uintptr_t)REF_TO_OBJ((*(uintptr_t (*)(void*, void*))mb->code) ( |
| + &jni_env, |
| + (void*)ostack[0])); |
| + |
| + return ostack + 1; |
| +} |
| + |
| +/* ()V */ |
| +static uintptr_t *__V(Class *class, MethodBlock *mb, uintptr_t *ostack) { |
| + if(!initJNILrefs()) |
| + return NULL; |
| + |
| + (*(void (*)(void*, void*))mb->code) ( |
| + &jni_env, |
| + (void*)ostack[0]); |
| + |
| + return ostack + 0; |
| +} |
| + |
| +/* (I)B */ |
| +static uintptr_t *_I_B(Class *class, MethodBlock *mb, uintptr_t *ostack) { |
| + if(!initJNILrefs()) |
| + return NULL; |
| + |
| + *ostack = (*(int8_t (*)(void*, void*, uintptr_t))mb->code) ( |
| + &jni_env, |
| + (void*)ostack[0], |
| + *(uintptr_t *)&ostack[1]); |
| + |
| + return ostack + 1; |
| +} |
| + |
| +/* (I)I */ |
| +static uintptr_t *_I_I(Class *class, MethodBlock *mb, uintptr_t *ostack) { |
| + if(!initJNILrefs()) |
| + return NULL; |
| + |
| + *ostack = (*(uintptr_t (*)(void*, void*, uintptr_t))mb->code) ( |
| + &jni_env, |
| + (void*)ostack[0], |
| + *(uintptr_t *)&ostack[1]); |
| + |
| + return ostack + 1; |
| +} |
| + |
| +/* (I)J */ |
| +static uintptr_t *_I_J(Class *class, MethodBlock *mb, uintptr_t *ostack) { |
| + if(!initJNILrefs()) |
| + return NULL; |
| + |
| + *(int64_t*)ostack = (*(int64_t (*)(void*, void*, uintptr_t))mb->code) ( |
| + &jni_env, |
| + (void*)ostack[0], |
| + *(uintptr_t *)&ostack[1]); |
| + |
| + return ostack + 2; |
| +} |
| + |
| +/* (I)L */ |
| +static uintptr_t *_I_L(Class *class, MethodBlock *mb, uintptr_t *ostack) { |
| + if(!initJNILrefs()) |
| + return NULL; |
| + |
| + *ostack = (uintptr_t)REF_TO_OBJ((*(uintptr_t (*)(void*, void*, uintptr_t))mb->code) ( |
| + &jni_env, |
| + (void*)ostack[0], |
| + *(uintptr_t *)&ostack[1])); |
| + |
| + return ostack + 1; |
| +} |
| + |
| +/* (I)V */ |
| +static uintptr_t *_I_V(Class *class, MethodBlock *mb, uintptr_t *ostack) { |
| + if(!initJNILrefs()) |
| + return NULL; |
| + |
| + (*(void (*)(void*, void*, uintptr_t))mb->code) ( |
| + &jni_env, |
| + (void*)ostack[0], |
| + *(uintptr_t *)&ostack[1]); |
| + |
| + return ostack + 0; |
| +} |
| + |
| +/* (J)B */ |
| +static uintptr_t *_J_B(Class *class, MethodBlock *mb, uintptr_t *ostack) { |
| + if(!initJNILrefs()) |
| + return NULL; |
| + |
| + *ostack = (*(int8_t (*)(void*, void*, int64_t))mb->code) ( |
| + &jni_env, |
| + (void*)ostack[0], |
| + *(int64_t *)&ostack[1]); |
| + |
| + return ostack + 1; |
| +} |
| + |
| +/* (J)J */ |
| +static uintptr_t *_J_J(Class *class, MethodBlock *mb, uintptr_t *ostack) { |
| + if(!initJNILrefs()) |
| + return NULL; |
| + |
| + *(int64_t*)ostack = (*(int64_t (*)(void*, void*, int64_t))mb->code) ( |
| + &jni_env, |
| + (void*)ostack[0], |
| + *(int64_t *)&ostack[1]); |
| + |
| + return ostack + 2; |
| +} |
| + |
| +/* (J)L */ |
| +static uintptr_t *_J_L(Class *class, MethodBlock *mb, uintptr_t *ostack) { |
| + if(!initJNILrefs()) |
| + return NULL; |
| + |
| + *ostack = (uintptr_t)REF_TO_OBJ((*(uintptr_t (*)(void*, void*, int64_t))mb->code) ( |
| + &jni_env, |
| + (void*)ostack[0], |
| + *(int64_t *)&ostack[1])); |
| + |
| + return ostack + 1; |
| +} |
| + |
| +/* (J)V */ |
| +static uintptr_t *_J_V(Class *class, MethodBlock *mb, uintptr_t *ostack) { |
| + if(!initJNILrefs()) |
| + return NULL; |
| + |
| + (*(void (*)(void*, void*, int64_t))mb->code) ( |
| + &jni_env, |
| + (void*)ostack[0], |
| + *(int64_t *)&ostack[1]); |
| + |
| + return ostack + 0; |
| +} |
| + |
| +/* (JI)I */ |
| +static uintptr_t *_JI_I(Class *class, MethodBlock *mb, uintptr_t *ostack) { |
| + if(!initJNILrefs()) |
| + return NULL; |
| + |
| + *ostack = (*(uintptr_t (*)(void*, void*, int64_t, uintptr_t))mb->code) ( |
| + &jni_env, |
| + (void*)ostack[0], |
| + *(int64_t *)&ostack[1], |
| + *(uintptr_t *)&ostack[3]); |
| + |
| + return ostack + 1; |
| +} |
| + |
| +/* (JI)J */ |
| +static uintptr_t *_JI_J(Class *class, MethodBlock *mb, uintptr_t *ostack) { |
| + if(!initJNILrefs()) |
| + return NULL; |
| + |
| + *(int64_t*)ostack = (*(int64_t (*)(void*, void*, int64_t, uintptr_t))mb->code) ( |
| + &jni_env, |
| + (void*)ostack[0], |
| + *(int64_t *)&ostack[1], |
| + *(uintptr_t *)&ostack[3]); |
| + |
| + return ostack + 2; |
| +} |
| + |
| +/* (JI)V */ |
| +static uintptr_t *_JI_V(Class *class, MethodBlock *mb, uintptr_t *ostack) { |
| + if(!initJNILrefs()) |
| + return NULL; |
| + |
| + (*(void (*)(void*, void*, int64_t, uintptr_t))mb->code) ( |
| + &jni_env, |
| + (void*)ostack[0], |
| + *(int64_t *)&ostack[1], |
| + *(uintptr_t *)&ostack[3]); |
| + |
| + return ostack + 0; |
| +} |
| + |
| +/* (JJ)V */ |
| +static uintptr_t *_JJ_V(Class *class, MethodBlock *mb, uintptr_t *ostack) { |
| + if(!initJNILrefs()) |
| + return NULL; |
| + |
| + (*(void (*)(void*, void*, int64_t, int64_t))mb->code) ( |
| + &jni_env, |
| + (void*)ostack[0], |
| + *(int64_t *)&ostack[1], |
| + *(int64_t *)&ostack[3]); |
| + |
| + return ostack + 0; |
| +} |
| + |
| +/* (JJI)I */ |
| +static uintptr_t *_JJI_I(Class *class, MethodBlock *mb, uintptr_t *ostack) { |
| + if(!initJNILrefs()) |
| + return NULL; |
| + |
| + *ostack = (*(uintptr_t (*)(void*, void*, int64_t, int64_t, uintptr_t))mb->code) ( |
| + &jni_env, |
| + (void*)ostack[0], |
| + *(int64_t *)&ostack[1], |
| + *(int64_t *)&ostack[3], |
| + *(uintptr_t *)&ostack[5]); |
| + |
| + return ostack + 1; |
| +} |
| + |
| +/* (JJI)L */ |
| +static uintptr_t *_JJI_L(Class *class, MethodBlock *mb, uintptr_t *ostack) { |
| + if(!initJNILrefs()) |
| + return NULL; |
| + |
| + *ostack = (uintptr_t)REF_TO_OBJ((*(uintptr_t (*)(void*, void*, int64_t, int64_t, uintptr_t))mb->code) ( |
| + &jni_env, |
| + (void*)ostack[0], |
| + *(int64_t *)&ostack[1], |
| + *(int64_t *)&ostack[3], |
| + *(uintptr_t *)&ostack[5])); |
| + |
| + return ostack + 1; |
| +} |
| + |
| +/* (JJJ)I */ |
| +static uintptr_t *_JJJ_I(Class *class, MethodBlock *mb, uintptr_t *ostack) { |
| + if(!initJNILrefs()) |
| + return NULL; |
| + |
| + *ostack = (*(uintptr_t (*)(void*, void*, int64_t, int64_t, int64_t))mb->code) ( |
| + &jni_env, |
| + (void*)ostack[0], |
| + *(int64_t *)&ostack[1], |
| + *(int64_t *)&ostack[3], |
| + *(int64_t *)&ostack[5]); |
| + |
| + return ostack + 1; |
| +} |
| + |
| +/* (JJJ)J */ |
| +static uintptr_t *_JJJ_J(Class *class, MethodBlock *mb, uintptr_t *ostack) { |
| + if(!initJNILrefs()) |
| + return NULL; |
| + |
| + *(int64_t*)ostack = (*(int64_t (*)(void*, void*, int64_t, int64_t, int64_t))mb->code) ( |
| + &jni_env, |
| + (void*)ostack[0], |
| + *(int64_t *)&ostack[1], |
| + *(int64_t *)&ostack[3], |
| + *(int64_t *)&ostack[5]); |
| + |
| + return ostack + 2; |
| +} |
| + |
| +/* (JJJ)L */ |
| +static uintptr_t *_JJJ_L(Class *class, MethodBlock *mb, uintptr_t *ostack) { |
| + if(!initJNILrefs()) |
| + return NULL; |
| + |
| + *ostack = (uintptr_t)REF_TO_OBJ((*(uintptr_t (*)(void*, void*, int64_t, int64_t, int64_t))mb->code) ( |
| + &jni_env, |
| + (void*)ostack[0], |
| + *(int64_t *)&ostack[1], |
| + *(int64_t *)&ostack[3], |
| + *(int64_t *)&ostack[5])); |
| + |
| + return ostack + 1; |
| +} |
| + |
| +/* (JJJ)V */ |
| +static uintptr_t *_JJJ_V(Class *class, MethodBlock *mb, uintptr_t *ostack) { |
| + if(!initJNILrefs()) |
| + return NULL; |
| + |
| + (*(void (*)(void*, void*, int64_t, int64_t, int64_t))mb->code) ( |
| + &jni_env, |
| + (void*)ostack[0], |
| + *(int64_t *)&ostack[1], |
| + *(int64_t *)&ostack[3], |
| + *(int64_t *)&ostack[5]); |
| + |
| + return ostack + 0; |
| +} |
| + |
| +/* (JJJJ)V */ |
| +static uintptr_t *_JJJJ_V(Class *class, MethodBlock *mb, uintptr_t *ostack) { |
| + if(!initJNILrefs()) |
| + return NULL; |
| + |
| + (*(void (*)(void*, void*, int64_t, int64_t, int64_t, int64_t))mb->code) ( |
| + &jni_env, |
| + (void*)ostack[0], |
| + *(int64_t *)&ostack[1], |
| + *(int64_t *)&ostack[3], |
| + *(int64_t *)&ostack[5], |
| + *(int64_t *)&ostack[7]); |
| + |
| + return ostack + 0; |
| +} |
| + |
| +/* (JJJJJ)V */ |
| +static uintptr_t *_JJJJJ_V(Class *class, MethodBlock *mb, uintptr_t *ostack) { |
| + if(!initJNILrefs()) |
| + return NULL; |
| + |
| + (*(void (*)(void*, void*, int64_t, int64_t, int64_t, int64_t, int64_t))mb->code) ( |
| + &jni_env, |
| + (void*)ostack[0], |
| + *(int64_t *)&ostack[1], |
| + *(int64_t *)&ostack[3], |
| + *(int64_t *)&ostack[5], |
| + *(int64_t *)&ostack[7], |
| + *(int64_t *)&ostack[9]); |
| + |
| + return ostack + 0; |
| +} |
| + |
| +/* (JJJJJJI)V */ |
| +static uintptr_t *_JJJJJJI_V(Class *class, MethodBlock *mb, uintptr_t *ostack) { |
| + if(!initJNILrefs()) |
| + return NULL; |
| + |
| + (*(void (*)(void*, void*, int64_t, int64_t, int64_t, int64_t, int64_t, int64_t, uintptr_t))mb->code) ( |
| + &jni_env, |
| + (void*)ostack[0], |
| + *(int64_t *)&ostack[1], |
| + *(int64_t *)&ostack[3], |
| + *(int64_t *)&ostack[5], |
| + *(int64_t *)&ostack[7], |
| + *(int64_t *)&ostack[9], |
| + *(int64_t *)&ostack[11], |
| + *(uintptr_t *)&ostack[13]); |
| + |
| + return ostack + 0; |
| +} |
| + |
| +/* (JJJJJJJJJ)V */ |
| +static uintptr_t *_JJJJJJJJJ_V(Class *class, MethodBlock *mb, uintptr_t *ostack) { |
| + if(!initJNILrefs()) |
| + return NULL; |
| + |
| + (*(void (*)(void*, void*, int64_t, int64_t, int64_t, int64_t, int64_t, int64_t, int64_t, int64_t, int64_t))mb->code) ( |
| + &jni_env, |
| + (void*)ostack[0], |
| + *(int64_t *)&ostack[1], |
| + *(int64_t *)&ostack[3], |
| + *(int64_t *)&ostack[5], |
| + *(int64_t *)&ostack[7], |
| + *(int64_t *)&ostack[9], |
| + *(int64_t *)&ostack[11], |
| + *(int64_t *)&ostack[13], |
| + *(int64_t *)&ostack[15], |
| + *(int64_t *)&ostack[17]); |
| + |
| + return ostack + 0; |
| +} |
| + |
| + |
| +JNIStub jni_static_stubs[] = { |
| + {"()I", static__I}, |
| + {"()J", static__J}, |
| + {"()L", static__L}, |
| + {"()V", static__V}, |
| + {"(I)B", static_I_B}, |
| + {"(I)F", static_I_F}, |
| + {"(I)I", static_I_I}, |
| + {"(I)L", static_I_L}, |
| + {"(J)D", static_J_D}, |
| + {"(J)I", static_J_I}, |
| + {"(J)J", static_J_J}, |
| + {"(J)L", static_J_L}, |
| + {"(J)V", static_J_V}, |
| + {"(JI)I", static_JI_I}, |
| + {"(JI)J", static_JI_J}, |
| + {"(JI)L", static_JI_L}, |
| + {"(JI)V", static_JI_V}, |
| + {"(JJ)B", static_JJ_B}, |
| + {"(JJ)D", static_JJ_D}, |
| + {"(JJ)I", static_JJ_I}, |
| + {"(JJ)J", static_JJ_J}, |
| + {"(JJ)L", static_JJ_L}, |
| + {"(JJ)V", static_JJ_V}, |
| + {"(JJI)L", static_JJI_L}, |
| + {"(JJI)V", static_JJI_V}, |
| + {"(JJJI)V", static_JJJI_V}, |
| + {"(JJJJ)V", static_JJJJ_V}, |
| + {"(JJJJI)I", static_JJJJI_I}, |
| + {"(JJJJJJ)V", static_JJJJJJ_V}, |
| + {"(JJJJJJJJJI)V", static_JJJJJJJJJI_V}, |
| + {"(JJJJJJJJJJJJ)I", static_JJJJJJJJJJJJ_I}, |
| + {NULL, NULL} |
| +}; |
| + |
| +JNIStub jni_stubs[] = { |
| + {"()B", __B}, |
| + {"()I", __I}, |
| + {"()J", __J}, |
| + {"()L", __L}, |
| + {"()V", __V}, |
| + {"(I)B", _I_B}, |
| + {"(I)I", _I_I}, |
| + {"(I)J", _I_J}, |
| + {"(I)L", _I_L}, |
| + {"(I)V", _I_V}, |
| + {"(J)B", _J_B}, |
| + {"(J)J", _J_J}, |
| + {"(J)L", _J_L}, |
| + {"(J)V", _J_V}, |
| + {"(JI)I", _JI_I}, |
| + {"(JI)J", _JI_J}, |
| + {"(JI)V", _JI_V}, |
| + {"(JJ)V", _JJ_V}, |
| + {"(JJI)I", _JJI_I}, |
| + {"(JJI)L", _JJI_L}, |
| + {"(JJJ)I", _JJJ_I}, |
| + {"(JJJ)J", _JJJ_J}, |
| + {"(JJJ)L", _JJJ_L}, |
| + {"(JJJ)V", _JJJ_V}, |
| + {"(JJJJ)V", _JJJJ_V}, |
| + {"(JJJJJ)V", _JJJJJ_V}, |
| + {"(JJJJJJI)V", _JJJJJJI_V}, |
| + {"(JJJJJJJJJ)V", _JJJJJJJJJ_V}, |
| + {NULL, NULL} |
| +}; |
| +#endif |
| diff -Nru jamvm-2.0.0.orig/src/os/midipix/i386/Makefile.am jamvm-2.0.0/src/os/midipix/i386/Makefile.am |
| |
| |
| @@ -0,0 +1,25 @@ |
| +## |
| +## Copyright (C) 2003, 2004, 2005, 2006, 2007, 2010 |
| +## Robert Lougher <rob@jamvm.org.uk>. |
| +## |
| +## This file is part of JamVM. |
| +## |
| +## This program is free software; you can redistribute it and/or |
| +## modify it under the terms of the GNU General Public License |
| +## as published by the Free Software Foundation; either version 2, |
| +## or (at your option) any later version. |
| +## |
| +## This program is distributed in the hope that it will be useful, |
| +## but WITHOUT ANY WARRANTY; without even the implied warranty of |
| +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| +## GNU General Public License for more details. |
| +## |
| +## You should have received a copy of the GNU General Public License |
| +## along with this program; if not, write to the Free Software |
| +## Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
| +## |
| + |
| +noinst_LTLIBRARIES = libnative.la |
| +libnative_la_SOURCES = init.c dll_md.c stubs_md.c jni-stubs.c |
| + |
| +AM_CPPFLAGS = -I$(top_builddir)/src -I$(top_srcdir)/src |
| diff -Nru jamvm-2.0.0.orig/src/os/midipix/i386/stubs_md.c jamvm-2.0.0/src/os/midipix/i386/stubs_md.c |
| |
| |
| @@ -0,0 +1,63 @@ |
| +/* |
| + * Copyright (C) 2010, 2012 Robert Lougher <rob@jamvm.org.uk>. |
| + * |
| + * This file is part of JamVM. |
| + * |
| + * This program is free software; you can redistribute it and/or |
| + * modify it under the terms of the GNU General Public License |
| + * as published by the Free Software Foundation; either version 2, |
| + * or (at your option) any later version. |
| + * |
| + * This program is distributed in the hope that it will be useful, |
| + * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| + * GNU General Public License for more details. |
| + * |
| + * You should have received a copy of the GNU General Public License |
| + * along with this program; if not, write to the Free Software |
| + * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
| + */ |
| + |
| +#ifndef GEN_STUBS_INC |
| +#include "jam.h" |
| +#endif |
| + |
| +#if defined(GEN_STUBS_INC) || defined(USE_MD_STUBS) |
| +#include <string.h> |
| +#include "sig.h" |
| + |
| +char *convertSig2Simple(char *sig) { |
| + char *simple_sig, *simple_pntr; |
| + int count = 0; |
| + int i; |
| + |
| + SCAN_SIG(sig, count+=2, count++); |
| + simple_sig = simple_pntr = sysMalloc((count + 1)/2 + 4); |
| + |
| + *simple_pntr++ = '('; |
| + for(i = 0; i < count/2; i++) |
| + *simple_pntr++ = 'J'; |
| + |
| + if(count&0x1) |
| + *simple_pntr++ = 'I'; |
| + *simple_pntr++ = ')'; |
| + |
| + switch(*sig) { |
| + case 'Z': |
| + *simple_pntr++ = 'B'; |
| + break; |
| + |
| + case '[': |
| + *simple_pntr++ = 'L'; |
| + break; |
| + |
| + default: |
| + *simple_pntr++ = *sig; |
| + break; |
| + } |
| + |
| + *simple_pntr = '\0'; |
| + return simple_sig; |
| +} |
| +#endif |
| + |
| diff -Nru jamvm-2.0.0.orig/src/os/midipix/Makefile.am jamvm-2.0.0/src/os/midipix/Makefile.am |
| |
| |
| @@ -0,0 +1,28 @@ |
| +## |
| +## Copyright (C) 2003, 2004, 2005, 2006, 2007 |
| +## Robert Lougher <rob@jamvm.org.uk>. |
| +## |
| +## This file is part of JamVM. |
| +## |
| +## This program is free software; you can redistribute it and/or |
| +## modify it under the terms of the GNU General Public License |
| +## as published by the Free Software Foundation; either version 2, |
| +## or (at your option) any later version. |
| +## |
| +## This program is distributed in the hope that it will be useful, |
| +## but WITHOUT ANY WARRANTY; without even the implied warranty of |
| +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| +## GNU General Public License for more details. |
| +## |
| +## You should have received a copy of the GNU General Public License |
| +## along with this program; if not, write to the Free Software |
| +## Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
| +## |
| + |
| +SUBDIRS = @arch@ |
| +DIST_SUBDIRS = i386 x86_64 |
| + |
| +noinst_LTLIBRARIES = libos.la |
| +libos_la_SOURCES = os.c |
| + |
| +AM_CPPFLAGS = -I$(top_builddir)/src |
| diff -Nru jamvm-2.0.0.orig/src/os/midipix/os.c jamvm-2.0.0/src/os/midipix/os.c |
| |
| |
| @@ -0,0 +1,108 @@ |
| +/* |
| + * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2014 |
| + * Robert Lougher <rob@jamvm.org.uk>. |
| + * |
| + * This file is part of JamVM. |
| + * |
| + * This program is free software; you can redistribute it and/or |
| + * modify it under the terms of the GNU General Public License |
| + * as published by the Free Software Foundation; either version 2, |
| + * or (at your option) any later version. |
| + * |
| + * This program is distributed in the hope that it will be useful, |
| + * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| + * GNU General Public License for more details. |
| + * |
| + * You should have received a copy of the GNU General Public License |
| + * along with this program; if not, write to the Free Software |
| + * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
| + */ |
| + |
| +#include <stdio.h> |
| +#include <string.h> |
| +#include <stdlib.h> |
| +#include <unistd.h> |
| +#include <sys/sysinfo.h> |
| + |
| +#define __USE_GNU |
| +#include <dlfcn.h> |
| +#include <pthread.h> |
| + |
| +#include "../../jam.h" |
| + |
| +long long nativePhysicalMemory() { |
| + /* Long longs are used here because with PAE, a 32-bit |
| + machine can have more than 4GB of physical memory */ |
| + |
| + long long num_pages = sysconf(_SC_PHYS_PAGES); |
| + long long page_size = sysconf(_SC_PAGESIZE); |
| + |
| + return num_pages * page_size; |
| +} |
| + |
| +void *nativeStackBase() { |
| +#ifdef __UCLIBC__ |
| + return NULL; |
| +#else |
| + pthread_attr_t attr; |
| + void *addr; |
| + size_t size; |
| + |
| + pthread_getattr_np(pthread_self(), &attr); |
| + pthread_attr_getstack(&attr, &addr, &size); |
| + |
| + return addr+size; |
| +#endif |
| +} |
| + |
| +int nativeAvailableProcessors() { |
| +#ifdef __UCLIBC__ |
| + return 1; |
| +#else |
| + return get_nprocs(); |
| +#endif |
| +} |
| + |
| +char *nativeLibError() { |
| + return dlerror(); |
| +} |
| + |
| +char *nativeLibPath() { |
| + return getenv("LD_LIBRARY_PATH"); |
| +} |
| + |
| +void *nativeLibOpen(char *path) { |
| + return dlopen(path, RTLD_LAZY); |
| +} |
| + |
| +void nativeLibClose(void *handle) { |
| + dlclose(handle); |
| +} |
| + |
| +void *nativeLibSym(void *handle, char *symbol) { |
| + return dlsym(handle, symbol); |
| +} |
| + |
| +char *nativeLibMapName(char *name) { |
| + char *buff = sysMalloc(strlen(name) + sizeof("lib.so") + 1); |
| + |
| + sprintf(buff, "lib%s.so", name); |
| + return buff; |
| +} |
| + |
| +char *nativeJVMPath() { |
| + Dl_info info; |
| + char *path; |
| + |
| + if(dladdr(nativeJVMPath, &info) == 0) { |
| + printf("Error: dladdr failed. Aborting VM\n"); |
| + exitVM(1); |
| + } |
| + |
| + path = sysMalloc(strlen(info.dli_fname) + 1); |
| + strcpy(path, info.dli_fname); |
| + |
| + return path; |
| +} |
| + |
| diff -Nru jamvm-2.0.0.orig/src/os/midipix/x86_64/callNative.S jamvm-2.0.0/src/os/midipix/x86_64/callNative.S |
| |
| |
| @@ -0,0 +1,269 @@ |
| +/* |
| + * Copyright (C) 2008, 2009 Robert Lougher <rob@jamvm.org.uk>. |
| + * |
| + * This file is part of JamVM. |
| + * |
| + * This program is free software; you can redistribute it and/or |
| + * modify it under the terms of the GNU General Public License |
| + * as published by the Free Software Foundation; either version 2, |
| + * or (at your option) any later version. |
| + * |
| + * This program is distributed in the hope that it will be useful, |
| + * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| + * GNU General Public License for more details. |
| + * |
| + * You should have received a copy of the GNU General Public License |
| + * along with this program; if not, write to the Free Software |
| + * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
| + */ |
| + |
| +#include "config.h" |
| + |
| +#ifndef USE_FFI |
| +.text |
| +.align 2 |
| +.global callJNIMethod |
| +.type callJNIMethod,function |
| + |
| +/* |
| + * Arguments passed in: |
| + * |
| + * %rdi JNIEnv |
| + * %rsi class or NULL |
| + * %rdx sig |
| + * %rcx extra arg |
| + * %r8 ostack |
| + * %r9 function pntr |
| + */ |
| + |
| +callJNIMethod: |
| + pushq %rbp |
| + movq %rsp, %rbp |
| + |
| + pushq %r8 |
| + pushq %r9 |
| + pushq %rbx |
| + pushq %r12 |
| + pushq %r14 |
| + pushq %r15 |
| + |
| + testq %rsi, %rsi |
| + jne alloc_space |
| + |
| + movq (%r8), %rsi |
| + addq $8, %r8 |
| + |
| +alloc_space: |
| + subq %rcx, %rsp |
| + |
| +/* Setup argument registers: |
| + * rdx, rcx, r8, r9 |
| + * xmm0 - xmm7 |
| + * |
| + * local register usage: |
| + * r10 = int reg count |
| + * r11 = double handler |
| + * r12 = float handler |
| + * r14 = sig pntr |
| + * r15 = stack pntr |
| + * rbx = ostack pntr |
| + */ |
| + |
| + leaq double_regs-10(%rip), %r11 |
| + leaq float_regs-10(%rip), %r12 |
| + leaq 1(%rdx), %r14 |
| + movq %rsp, %r15 |
| + xorq %r10, %r10 |
| + movq %r8, %rbx |
| + |
| +next: |
| + movzbq (%r14), %rax |
| + incq %r14 |
| + |
| + cmpq $41, %rax /* ')' */ |
| + je done |
| + cmpq $68, %rax /* 'D' */ |
| + je double |
| + cmpq $70, %rax /* 'F' */ |
| + je float |
| + cmpq $74, %rax /* 'J' */ |
| + je long |
| + |
| +skip_brackets: |
| + cmpq $91, %rax /* '[' */ |
| + jne check_ref |
| + movzbq (%r14), %rax |
| + incq %r14 |
| + jmp skip_brackets |
| + |
| +check_ref: |
| + cmpq $76, %rax /* 'L' */ |
| + jne int |
| + |
| +skip_ref: |
| + movzbq (%r14), %rax |
| + incq %r14 |
| + cmpq $59, %rax /* ';' */ |
| + jne skip_ref |
| + |
| +int: |
| + movq (%rbx), %rax |
| + addq $8, %rbx |
| + |
| +check_regs: |
| + incq %r10 |
| + cmpq $2, %r10 |
| + jg check_4 |
| + |
| + cmovneq %rax, %rdx |
| + cmoveq %rax, %rcx |
| + jmp next |
| + |
| +check_4: |
| + cmpq $4, %r10 |
| + jg stack_push |
| + |
| + cmovneq %rax, %r8 |
| + cmoveq %rax, %r9 |
| + jmp next |
| + |
| +stack_push: |
| + movq %rax, (%r15) |
| + addq $8, %r15 |
| + jmp next |
| + |
| +long: |
| + movq (%rbx), %rax |
| + addq $16, %rbx |
| + jmp check_regs |
| + |
| +double: |
| + addq $10, %r11 |
| + addq $10, %r12 |
| + addq $16, %rbx |
| + jmp *%r11 |
| + |
| +double_regs: |
| + movsd -16(%rbx), %xmm0 |
| + jmp next |
| + movsd -16(%rbx), %xmm1 |
| + jmp next |
| + movsd -16(%rbx), %xmm2 |
| + jmp next |
| + movsd -16(%rbx), %xmm3 |
| + jmp next |
| + movsd -16(%rbx), %xmm4 |
| + jmp next |
| + movsd -16(%rbx), %xmm5 |
| + jmp next |
| + movsd -16(%rbx), %xmm6 |
| + jmp next |
| + movsd -16(%rbx), %xmm7 |
| + jmp next |
| + movq -16(%rbx), %rax |
| + subq $10, %r11 |
| + subq $10, %r12 |
| + jmp stack_push |
| + |
| +float: |
| + addq $10, %r11 |
| + addq $10, %r12 |
| + addq $8, %rbx |
| + jmp *%r12 |
| + |
| +float_regs: |
| + movss -8(%rbx), %xmm0 |
| + jmp next |
| + movss -8(%rbx), %xmm1 |
| + jmp next |
| + movss -8(%rbx), %xmm2 |
| + jmp next |
| + movss -8(%rbx), %xmm3 |
| + jmp next |
| + movss -8(%rbx), %xmm4 |
| + jmp next |
| + movss -8(%rbx), %xmm5 |
| + jmp next |
| + movss -8(%rbx), %xmm6 |
| + jmp next |
| + movss -8(%rbx), %xmm7 |
| + jmp next |
| + movl -8(%rbx), %eax |
| + subq $10, %r11 |
| + subq $10, %r12 |
| + jmp stack_push |
| + |
| +done: |
| + /* Arguments all setup -- |
| + call the native method */ |
| + |
| + callq *-16(%rbp) |
| + |
| + /* Get back ostack for return value */ |
| + movq -8(%rbp), %rcx |
| + |
| + /* Handle return type */ |
| + |
| + movzbq (%r14), %rbx |
| + cmpq $86, %rbx /* 'V' */ |
| + je return |
| + cmpq $76, %rbx /* 'L' */ |
| + je int_ret |
| + cmpq $91, %rbx /* '[' */ |
| + je int_ret |
| + cmpq $73, %rbx /* 'I' */ |
| + je int_ret |
| + cmpq $68, %rbx /* 'D' */ |
| + je double_ret |
| + cmpq $70, %rbx /* 'F' */ |
| + je float_ret |
| + cmpq $74, %rbx /* 'J' */ |
| + je long_ret |
| + cmpq $67, %rbx /* 'C' */ |
| + je char_ret |
| + cmpq $83, %rbx /* 'S' */ |
| + je short_ret |
| + |
| + /* remaining types Z and B */ |
| + movsbq %al, %rax |
| + |
| +int_ret: |
| + movq %rax, (%rcx) |
| + addq $8, %rcx |
| + |
| +return: |
| + movq -24(%rbp), %rbx |
| + movq -32(%rbp), %r12 |
| + movq -40(%rbp), %r14 |
| + movq -48(%rbp), %r15 |
| + |
| + movq %rbp, %rsp |
| + popq %rbp |
| + |
| + movq %rcx, %rax |
| + retq |
| + |
| +char_ret: |
| + movzwq %ax, %rax |
| + jmp int_ret |
| + |
| +short_ret: |
| + movswq %ax, %rax |
| + jmp int_ret |
| + |
| +long_ret: |
| + movq %rax, (%rcx) |
| + addq $16, %rcx |
| + jmp return |
| + |
| +double_ret: |
| + movsd %xmm0, (%rcx) |
| + addq $16, %rcx |
| + jmp return |
| + |
| +float_ret: |
| + movss %xmm0, (%rcx) |
| + addq $8, %rcx |
| + jmp return |
| +#endif |
| diff -Nru jamvm-2.0.0.orig/src/os/midipix/x86_64/dll_md.c jamvm-2.0.0/src/os/midipix/x86_64/dll_md.c |
| |
| |
| @@ -0,0 +1,57 @@ |
| +/* |
| + * Copyright (C) 2008, 2010 Robert Lougher <rob@jamvm.org.uk>. |
| + * |
| + * This file is part of JamVM. |
| + * |
| + * This program is free software; you can redistribute it and/or |
| + * modify it under the terms of the GNU General Public License |
| + * as published by the Free Software Foundation; either version 2, |
| + * or (at your option) any later version. |
| + * |
| + * This program is distributed in the hope that it will be useful, |
| + * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| + * GNU General Public License for more details. |
| + * |
| + * You should have received a copy of the GNU General Public License |
| + * along with this program; if not, write to the Free Software |
| + * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
| + */ |
| + |
| +#include "jam.h" |
| + |
| +#ifndef USE_FFI |
| +#include <stdio.h> |
| + |
| +int nativeExtraArg(MethodBlock *mb) { |
| + char *sig = mb->type; |
| + int stack_space; |
| + int iargs = 0; |
| + int fargs = 0; |
| + |
| + while(*++sig != ')') |
| + switch(*sig) { |
| + case 'D': |
| + case 'F': |
| + fargs++; |
| + break; |
| + |
| + default: |
| + iargs++; |
| + |
| + if(*sig == '[') |
| + while(*++sig == '['); |
| + if(*sig == 'L') |
| + while(*++sig != ';'); |
| + break; |
| + } |
| + |
| + stack_space = ((iargs > 4 ? iargs - 4 : 0) + |
| + (fargs > 8 ? fargs - 8 : 0)) << 3; |
| + |
| + /* Ensure the stack remains 16 byte aligned. As |
| + callJNIMethod pushes an even number of registers |
| + the extra space must also be even. */ |
| + return (stack_space + 15) & ~15; |
| +} |
| +#endif |
| diff -Nru jamvm-2.0.0.orig/src/os/midipix/x86_64/init.c jamvm-2.0.0/src/os/midipix/x86_64/init.c |
| |
| |
| @@ -0,0 +1,45 @@ |
| +/* |
| + * Copyright (C) 2003, 2004, 2005, 2006, 2007 |
| + * Robert Lougher <rob@jamvm.org.uk>. |
| + * |
| + * This file is part of JamVM. |
| + * |
| + * This program is free software; you can redistribute it and/or |
| + * modify it under the terms of the GNU General Public License |
| + * as published by the Free Software Foundation; either version 2, |
| + * or (at your option) any later version. |
| + * |
| + * This program is distributed in the hope that it will be useful, |
| + * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| + * GNU General Public License for more details. |
| + * |
| + * You should have received a copy of the GNU General Public License |
| + * along with this program; if not, write to the Free Software |
| + * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
| + */ |
| + |
| +#ifdef __linux__ |
| +#include <fpu_control.h> |
| +#endif |
| + |
| +/* Change the x87 FPU precision to double (64-bit) from the extended |
| + (80-bit) Linux default. Note, unlike on i386, my testcases pass |
| + without this. This is probably because gcc assumes and uses SSE |
| + by default, not the x87 FPU. However, keep it in to be safe. |
| +*/ |
| + |
| +void setDoublePrecision() { |
| +#ifdef __linux__ |
| + fpu_control_t cw; |
| + |
| + _FPU_GETCW(cw); |
| + cw &= ~_FPU_EXTENDED; |
| + cw |= _FPU_DOUBLE; |
| + _FPU_SETCW(cw); |
| +#endif |
| +} |
| + |
| +void initialisePlatform() { |
| + setDoublePrecision(); |
| +} |
| diff -Nru jamvm-2.0.0.orig/src/os/midipix/x86_64/Makefile.am jamvm-2.0.0/src/os/midipix/x86_64/Makefile.am |
| |
| |
| @@ -0,0 +1,26 @@ |
| +## |
| +## Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2010 |
| +## Robert Lougher <rob@jamvm.org.uk>. |
| +## |
| +## This file is part of JamVM. |
| +## |
| +## This program is free software; you can redistribute it and/or |
| +## modify it under the terms of the GNU General Public License |
| +## as published by the Free Software Foundation; either version 2, |
| +## or (at your option) any later version. |
| +## |
| +## This program is distributed in the hope that it will be useful, |
| +## but WITHOUT ANY WARRANTY; without even the implied warranty of |
| +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| +## GNU General Public License for more details. |
| +## |
| +## You should have received a copy of the GNU General Public License |
| +## along with this program; if not, write to the Free Software |
| +## Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
| +## |
| + |
| +noinst_LTLIBRARIES = libnative.la |
| +libnative_la_SOURCES = init.c dll_md.c callNative.S |
| + |
| +AM_CPPFLAGS = -I$(top_builddir)/src -I$(top_srcdir)/src |
| +AM_CCASFLAGS = -I$(top_builddir)/src -I$(top_srcdir)/src |