From b6c53d291c022a71b4d8b16e2af6ee9bbef370dc Mon Sep 17 00:00:00 2001 From: Ian Rogers Date: Wed, 25 Mar 2009 17:41:52 +0000 Subject: [PATCH] Windows build fixes --- tools/bootloader/jvm.c | 61 ++++++++++++++++++----------------- tools/bootloader/sys.h | 41 ++++++++++++++--------- tools/bootloader/sysConsole.c | 2 +- tools/bootloader/sysLibrary.c | 6 ++-- tools/bootloader/sysMemory.c | 15 ++++++--- tools/bootloader/sysMisc.c | 25 ++++++++------ tools/bootloader/sysThread.c | 5 ++- tools/bootloader/sysTime.c | 3 ++ 8 files changed, 94 insertions(+), 64 deletions(-) mode change 100644 => 100755 tools/bootloader/sys.h diff --git a/tools/bootloader/jvm.c b/tools/bootloader/jvm.c index b0745959f..af7280f41 100644 --- a/tools/bootloader/jvm.c +++ b/tools/bootloader/jvm.c @@ -52,17 +52,17 @@ static void *getFieldAsAddress(void *objPtr, int fieldOffset) // Get the JNI environment object from the Processor. static JNIEnv * getJniEnvFromVmThread(void *vmThreadPtr) { - if (vmThreadPtr == 0) - return 0; // oops - - // Follow chain of pointers: - // RVMThread -> JNIEnvironment -> thread's native JNIEnv - void *jniEnvironment = - getFieldAsAddress(vmThreadPtr, RVMThread_jniEnv_offset); - // Convert JNIEnvironment to JNIEnv* expected by native code - // by creating the appropriate interior pointer. - void *jniEnv = ((char*)jniEnvironment + JNIEnvironment_JNIExternalFunctions_offset); - + void *jniEnvironment; + void *jniEnv; + if (vmThreadPtr == 0) + return 0; // oops + + // Follow chain of pointers: + // RVMThread -> JNIEnvironment -> thread's native JNIEnv + jniEnvironment = getFieldAsAddress(vmThreadPtr, RVMThread_jniEnv_offset); + // Convert JNIEnvironment to JNIEnv* expected by native code + // by creating the appropriate interior pointer. + jniEnv = ((char*)jniEnvironment + JNIEnvironment_JNIExternalFunctions_offset); return (JNIEnv*) jniEnv; } @@ -99,6 +99,7 @@ static jint AttachCurrentThread(JavaVM UNUSED * vm, /* JNIEnv */ void ** penv, / { JavaVMAttachArgs *aargs = (JavaVMAttachArgs *) args; jint version; + jint retval; if (args == NULL) { version = JNI_VERSION_1_1; } else { @@ -112,7 +113,7 @@ static jint AttachCurrentThread(JavaVM UNUSED * vm, /* JNIEnv */ void ** penv, / return JNI_EVERSION; /* If we're already attached, we're gold. */ - register jint retval = GetEnv(vm, penv, version); + retval = GetEnv(vm, penv, version); if (retval == JNI_OK) return retval; else if (retval == JNI_EDETACHED) { @@ -135,33 +136,36 @@ static jint DetachCurrentThread(JavaVM UNUSED *vm) jint GetEnv(JavaVM UNUSED *vm, void **penv, jint version) { - if (version > JNI_VERSION_1_4) - return JNI_EVERSION; + void *vmThread; + JNIEnv *env; + if (version > JNI_VERSION_1_4) + return JNI_EVERSION; - // Return NULL if we are not on a VM thread - void *vmThread = getVMThread(); - if (vmThread == NULL) { - *penv = NULL; - return JNI_EDETACHED; - } + // Return NULL if we are not on a VM thread + vmThread = getVMThread(); + if (vmThread == NULL) { + *penv = NULL; + return JNI_EDETACHED; + } - // Get the JNIEnv from the RVMThread object - JNIEnv *env = getJniEnvFromVmThread(vmThread); + // Get the JNIEnv from the RVMThread object + env = getJniEnvFromVmThread(vmThread); - *penv = env; + *penv = env; - return JNI_OK; + return JNI_OK; } /** JNI 1.4 */ /* TODO: Implement */ static jint AttachCurrentThreadAsDaemon(JavaVM UNUSED * vm, /* JNIEnv */ void UNUSED ** penv, /* JavaVMAttachArgs */ void UNUSED *args) { - fprintf(stderr, "Unimplemented JNI call AttachCurrentThreadAsDaemon\n"); - return JNI_ERR; + SYS_START(); + ERROR_PRINTF("Unimplemented JNI call AttachCurrentThreadAsDaemon\n"); + return JNI_ERR; } -const struct JNIInvokeInterface_ externalJNIFunctions = { +static const struct JNIInvokeInterface_ externalJNIFunctions = { NULL, // reserved0 NULL, // reserved1 NULL, // reserved2 @@ -172,7 +176,7 @@ const struct JNIInvokeInterface_ externalJNIFunctions = { AttachCurrentThreadAsDaemon // JNI 1.4 }; -struct JavaVM_ sysJavaVM = { +const struct JavaVM_ sysJavaVM = { &externalJNIFunctions, // functions NULL, // reserved0 NULL, // reserved1 @@ -180,4 +184,3 @@ struct JavaVM_ sysJavaVM = { NULL, // threadIDTable NULL, // jniEnvTable }; - diff --git a/tools/bootloader/sys.h b/tools/bootloader/sys.h old mode 100644 new mode 100755 index 923f1bfae..e8c3513d4 --- a/tools/bootloader/sys.h +++ b/tools/bootloader/sys.h @@ -16,11 +16,13 @@ #include #include -#include #include "cAttributePortability.h" #ifdef __MACH__ #include #endif +#ifndef _WIN32 +#include +#endif #ifdef __cplusplus #define EXTERNAL extern "C" @@ -40,6 +42,25 @@ EXTERNAL void VMI_Initialize(); EXTERNAL UDATA DefaultPageSize; #endif +#ifdef _WIN32 +typedef __int32 int32_t; +typedef unsigned __int32 uint32_t; +typedef __int32 int32_t; +typedef unsigned __int32 uint32_t; +#endif + +#ifdef RVM_FOR_32_ADDR +typedef uint32_t Address; +typedef int32_t Offset; +typedef uint32_t Extent; +typedef uint32_t Word; +#else +typedef uint64_t Address; +typedef int64_t Offset; +typedef uint64_t Extent; +typedef uint64_t Word; +#endif + #ifndef __SIZEOF_POINTER__ # ifdef RVM_FOR_32_ADDR # define __SIZEOF_POINTER__ 4 @@ -48,21 +69,9 @@ EXTERNAL UDATA DefaultPageSize; # endif #endif -#ifdef RVM_FOR_32_ADDR -# define Address uint32_t -# define Offset int32_t -# define Extent uint32_t -# define Word uint32_t -#else -# define Address uint64_t -# define Offset int64_t -# define Extent uint64_t -# define Word uint64_t -#endif - /** Macro that starts all sys related functions */ #ifdef RVM_FOR_HARMONY -#define SYS_START() PORT_ACCESS_FROM_VMI(VMI_GetVMIFromJavaVM(&sysJavaVM)) +#define SYS_START() PORT_ACCESS_FROM_VMI(VMI_GetVMIFromJavaVM((JavaVM*)(&sysJavaVM))) #else #define SYS_START() #endif @@ -100,7 +109,7 @@ extern char **JavaArgs; /** C access to shared C/Java boot record data structure */ extern struct BootRecord *bootRecord; /** JVM datastructure used for JNI declared in jvm.c */ -extern struct JavaVM_ sysJavaVM; +extern const struct JavaVM_ sysJavaVM; #ifdef RVM_WITH_ALIGNMENT_CHECKING extern volatile int numEnableAlignCheckingCalls; @@ -232,7 +241,7 @@ EXTERNAL void sysExit(int) NORETURN; EXTERNAL void sysStashVMThread(Address vmThread); EXTERNAL void* getVMThread(); EXTERNAL int sysNumProcessors(); -EXTERNAL void sysStartMainThread(jboolean vmInSeparateThread, Address ip, Address fp, Address tr, Address jtoc, uint32_t *bootCompleted); +EXTERNAL void sysStartMainThread(jboolean vmInSeparateThread, Address ip, Address fp, Address tr, Address jtoc, jint *bootCompleted); EXTERNAL Address sysThreadCreate(Address ip, Address fp, Address tr, Address jtoc); EXTERNAL void sysThreadTerminate(); EXTERNAL int sysThreadBindSupported(); diff --git a/tools/bootloader/sysConsole.c b/tools/bootloader/sysConsole.c index 81216a393..a06ab080f 100644 --- a/tools/bootloader/sysConsole.c +++ b/tools/bootloader/sysConsole.c @@ -55,11 +55,11 @@ EXTERNAL void sysConsoleWriteLong(long long value, int hexToo) EXTERNAL void sysConsoleWriteDouble(double value, int postDecimalDigits) { SYS_START(); + char tmp[5] = {'%', '.', '0'+postDecimalDigits, 'f', 0}; if (value != value) { CONSOLE_PRINTF("NaN"); } else { if (postDecimalDigits > 9) postDecimalDigits = 9; - char tmp[5] = {'%', '.', '0'+postDecimalDigits, 'f', 0}; CONSOLE_PRINTF(tmp, value); } } diff --git a/tools/bootloader/sysLibrary.c b/tools/bootloader/sysLibrary.c index ee1df8832..4508d2458 100644 --- a/tools/bootloader/sysLibrary.c +++ b/tools/bootloader/sysLibrary.c @@ -26,9 +26,9 @@ EXTERNAL void* sysDlopen(char *libname) { SYS_START(); - TRACE_PRINTF("%s: sysDlopen %s\n", Me, libname); #ifdef RVM_FOR_HARMONY UDATA descriptor; + TRACE_PRINTF("%s: sysDlopen %s\n", Me, libname); if (hysl_open_shared_library(libname, &descriptor, FALSE) != 0) { TRACE_PRINTF("%s: error loading library %s\n", Me, libname); return NULL; @@ -37,6 +37,7 @@ EXTERNAL void* sysDlopen(char *libname) } #else void * libHandler; + TRACE_PRINTF("%s: sysDlopen %s\n", Me, libname); do { libHandler = dlopen(libname, RTLD_LAZY|RTLD_GLOBAL); } @@ -55,16 +56,17 @@ EXTERNAL void* sysDlopen(char *libname) EXTERNAL void* sysDlsym(Address libHandler, char *symbolName) { SYS_START(); - TRACE_PRINTF("%s: sysDlsym %s\n", Me, symbolName); #ifdef RVM_FOR_HARMONY UDATA func; char *argSignature=NULL; + TRACE_PRINTF("%s: sysDlsym %s\n", Me, symbolName); if(hysl_lookup_name((UDATA)libHandler, symbolName, &func, argSignature) != 0) { return NULL; } else { return (void*)func; } #else + TRACE_PRINTF("%s: sysDlsym %s\n", Me, symbolName); return dlsym((void *) libHandler, symbolName); #endif // RVM_FOR_HARMONY } diff --git a/tools/bootloader/sysMemory.c b/tools/bootloader/sysMemory.c index fa34ee8f5..1a9bb8536 100644 --- a/tools/bootloader/sysMemory.c +++ b/tools/bootloader/sysMemory.c @@ -207,10 +207,10 @@ EXTERNAL void * sysMemoryReserve(char *start, size_t length, jboolean exec, jboolean commit) { SYS_START(); - TRACE_PRINTF("%s: sysMemoryReserve %p %d - %d %d %d %d\n", - Me, start, length, read, write, exec, commit); #ifdef RVM_FOR_HARMONY HyPortVmemIdentifier ident; + TRACE_PRINTF("%s: sysMemoryReserve %p %d - %d %d %d %d\n", + Me, start, length, read, write, exec, commit); ident.pageSize = DefaultPageSize; ident.mode = 0; if (read) { @@ -231,6 +231,8 @@ EXTERNAL void * sysMemoryReserve(char *start, size_t length, int flags = MAP_PRIVATE; int fd = -1; off_t offset = 0; + TRACE_PRINTF("%s: sysMemoryReserve %p %d - %d %d %d %d\n", + Me, start, length, read, write, exec, commit); #if defined(MAP_ANONYMOUS) flags |= MAP_ANONYMOUS; #elif defined(MAP_ANON) @@ -306,10 +308,10 @@ EXTERNAL jboolean sysMemoryCommit(char *start, size_t length, jboolean exec) { SYS_START(); - TRACE_PRINTF("%s: sysMemoryCommit %p %d - %d %d %d\n", - Me, start, length, read, write, exec); #ifdef RVM_FOR_HARMONY HyPortVmemIdentifier ident; + TRACE_PRINTF("%s: sysMemoryCommit %p %d - %d %d %d\n", + Me, start, length, read, write, exec); ident.pageSize = DefaultPageSize; ident.mode = 0; if (read) { @@ -328,6 +330,8 @@ EXTERNAL jboolean sysMemoryCommit(char *start, size_t length, } #else int protection = 0; + TRACE_PRINTF("%s: sysMemoryCommit %p %d - %d %d %d\n", + Me, start, length, read, write, exec); if (read) { protection |= PROT_READ; } @@ -354,9 +358,9 @@ EXTERNAL jboolean sysMemoryCommit(char *start, size_t length, EXTERNAL jboolean sysMemoryDecommit(char *start, size_t length) { SYS_START(); - TRACE_PRINTF("%s: sysMemoryDecommit %p %d\n", Me, start, length); #ifdef RVM_FOR_HARMONY HyPortVmemIdentifier ident; + TRACE_PRINTF("%s: sysMemoryDecommit %p %d\n", Me, start, length); ident.pageSize = DefaultPageSize; if(hyvmem_decommit_memory(start, length, &ident) == 0) { return JNI_TRUE; @@ -364,6 +368,7 @@ EXTERNAL jboolean sysMemoryDecommit(char *start, size_t length) return JNI_FALSE; } #else + TRACE_PRINTF("%s: sysMemoryDecommit %p %d\n", Me, start, length); return JNI_TRUE; // success - unsupported operation for UNIX environments #endif // RVM_FOR_HARMONY } diff --git a/tools/bootloader/sysMisc.c b/tools/bootloader/sysMisc.c index efe6e7240..738e34150 100644 --- a/tools/bootloader/sysMisc.c +++ b/tools/bootloader/sysMisc.c @@ -129,13 +129,18 @@ EXTERNAL unsigned int parse_memory_size(const char *sizeName, const char *sizeFl int *fastExit) { SYS_START(); - errno = 0; double userNum; char *endp; /* Should be const char *, but if we do that, then the C++ compiler complains about the prototype for strtold() or strtod(). This is probably a bug in the specification of the prototype. */ + const char *factorStr = defaultFactor; + long double factor = 0.0; // 0.0 is a sentinel meaning Unset + long double tot_d; + unsigned tot; + + errno = 0; userNum = strtod(subtoken, &endp); if (endp == subtoken) { CONSOLE_PRINTF( "%s: \"%s\": -X%s must be followed by a number.\n", Me, token, sizeFlag); @@ -144,9 +149,6 @@ EXTERNAL unsigned int parse_memory_size(const char *sizeName, const char *sizeFl // First, set the factor appropriately, and make sure there aren't extra // characters at the end of the line. - const char *factorStr = defaultFactor; - long double factor = 0.0; // 0.0 is a sentinel meaning Unset - if (*endp == '\0') { /* no suffix. Along with the Sun JVM, we now assume Bytes by default. (This is a change from previous Jikes RVM behaviour.) */ @@ -211,11 +213,11 @@ EXTERNAL unsigned int parse_memory_size(const char *sizeName, const char *sizeFl } return 0U; // Distinguished value meaning trouble. } - long double tot_d = userNum * factor; + tot_d = userNum * factor; if ((tot_d > (UINT_MAX - roundTo)) || (tot_d < 1)) { ERROR_PRINTF("Unexpected memory size %f", tot_d); } - unsigned tot = (unsigned) tot_d; + tot = (unsigned) tot_d; if (tot % roundTo) { unsigned newTot = tot + roundTo - (tot % roundTo); CONSOLE_PRINTF("%s: Rounding up %s size from %u bytes to %u,\n" @@ -244,11 +246,14 @@ EXTERNAL jlong sysParseMemorySize(const char *sizeName, const char *sizeFlag, const char *token, const char *subtoken) { SYS_START(); - TRACE_PRINTF("%s: sysParseMemorySize %s\n", Me, token); int fastExit = 0; - unsigned ret_uns= parse_memory_size(sizeName, sizeFlag, defaultFactor, - (unsigned) roundTo, token, subtoken, - &fastExit); + unsigned ret_uns; + + TRACE_PRINTF("%s: sysParseMemorySize %s\n", Me, token); + + ret_uns= parse_memory_size(sizeName, sizeFlag, defaultFactor, + (unsigned) roundTo, token, subtoken, + &fastExit); if (fastExit) return -1; else diff --git a/tools/bootloader/sysThread.c b/tools/bootloader/sysThread.c index 14ac3f909..06faa6a8c 100644 --- a/tools/bootloader/sysThread.c +++ b/tools/bootloader/sysThread.c @@ -69,8 +69,11 @@ static void* sysThreadStartup(void *args); EXTERNAL void sysInitialize() { #ifdef RVM_FOR_HARMONY + VMInterface *vmi; + HyPortLibrary *privatePortLibrary; VMI_Initialize(); - SYS_START(); /* start after VMI is initialized */ + vmi = VMI_GetVMIFromJavaVM((JavaVM*)(&sysJavaVM)); + privatePortLibrary = (*vmi)->GetPortLibrary(vmi); DefaultPageSize = hyvmem_supported_page_sizes()[0]; #else #ifdef __MACH__ diff --git a/tools/bootloader/sysTime.c b/tools/bootloader/sysTime.c index ef005a416..b6be2f148 100644 --- a/tools/bootloader/sysTime.c +++ b/tools/bootloader/sysTime.c @@ -12,8 +12,11 @@ */ #include "sys.h" + +#ifndef RVM_FOR_HARMONY #include #include +#endif #if !defined(RVM_FOR_HARMONY) && defined(__MACH__) mach_timebase_info_data_t timebaseInfo;