void JVMSPI_PrintRaw(const char* s) { #if ENABLE_PCSL pcsl_print(s); #else jvm_printf("%s", s); jvm_fflush(stdout); #endif }
/** * This function is called when the network initialization * or finalization is completed. * * @param isInit 0 if the network finalization has been finished, * not 0 - if the initialization * @param status one of PCSL_NET_* completion codes */ void SocketTransport::network_initialized_callback(int isInit, int status) { if (Verbose) { tty->print_cr("SocketTransport::network_initialized_callback()"); } if (isInit) { if (status == PCSL_NET_SUCCESS) { SocketTransport::_wait_for_network_init = false; SocketTransport::_network_is_up = true; } } else { if (status == PCSL_NET_SUCCESS) { SocketTransport::_wait_for_network_init = false; SocketTransport::_network_is_up = false; SocketTransport::_first_time = true; } } if (Verbose) { jvm_printf("Network status: %s\n", SocketTransport::_network_is_up ? "UP" : "DOWN"); } }
void __rhe(OopDesc* o) { ROMizerHashEntry entry(o); jvm_printf("%d\n", entry.offset()); //BREAKPOINT; }
int jvm_core_core_handler(struct _JVM *jvm, struct _JVMBundle *bundle, struct _JVMClass *jclass, uint8 *method8, uint8 *type8, JVMLocal *locals, int localCnt, JVMLocal *result) { int x; int c; int error; JVMBundleClass *cbc; JVMObject *jobject; JVMObject *sobject; JVMObject *pobject; uint8 *cn; uint8 lbuf[128]; uint8 *buf; FILE *fp; struct stat _stat; JVMObject *_jobject; debugf("success:%s:%s\n", method8, type8); // determine what is being called for (x = 0, c = 0; method8[x] != 0; ++x) c += method8[x]; debugf("native:%s:%x\n", method8, c); //jvm_exit(-5); switch (c) { // Collect case 0x2c6: jvm_Collect(jvm); result->data = 0; result->flags = 0; break; // LoadResource case 0x4c8: sobject = (JVMObject*)locals[0].data; debugf("sobject %x\n", sobject); if (!sobject) break; pobject = (JVMObject*)sobject->_fields[0].value; for (c = 0; c < pobject->fieldCnt; ++c) lbuf[c] = ((uint8*)pobject->fields)[c]; lbuf[c] = 0; fp = fopen(&lbuf[0], "rb"); fstat(fileno(fp), &_stat); c = _stat.st_size; buf = (uint8*)jvm_malloc(sizeof(uint8) * c); fread(&buf[0], c, 1, fp); fclose(fp); error = jvm_CreatePrimArray(jvm, bundle, JVM_ATYPE_BYTE, c, &_jobject, buf); if (error) return error; result->data = (uint64)_jobject; result->flags = JVM_STACK_ISARRAYREF | JVM_STACK_ISOBJECTREF | JVM_STACK_ISBYTE; break; // Exit case 0x19a: jvm_exit(-1); break; // Print case 0x20d: sobject = (JVMObject*)locals[0].data; debugf("sobject %x\n", sobject); if (!sobject) break; pobject = (JVMObject*)sobject->_fields[0].value; debugf("pobject %x %u\n", pobject, sobject->fieldCnt); if (!pobject) break; debugf("##:printc[%u]:", pobject->fieldCnt); for (c = 0; c < pobject->fieldCnt; ++c) { jvm_printf("%c", ((uint16*)pobject->fields)[c]); } jvm_printf("\n"); exit(-3); break; // EnumClasses case 0x463: // get count of classes for (c = 0, cbc = bundle->first; cbc != 0; cbc = cbc->next, ++c); error = jvm_CreateObjectArray(jvm, bundle, "java/lang/String", c, &jobject); if (error) { return error; } for (c = 0, cbc = bundle->first; cbc != 0; cbc = cbc->next, ++c) { // create string object error = jvm_CreateObject(jvm, bundle, "java/lang/String", &sobject); if (error) return error; // get string we need to put in it cn = jvm_GetClassNameFromClass(cbc->jclass); // get length of that string for (x = 0; cn[x] != 0; ++x); // create primitive array to hold string error = jvm_CreatePrimArray(jvm, bundle, JVM_ATYPE_BYTE, x, &pobject, 0); // fill primitive array for (x = 0; cn[x] != 0; ++x) ((uint8*)pobject->fields)[x] = cn[x]; if (error) return error; // add primitive array to String field sobject->_fields[0].value = (uintptr)pobject; sobject->_fields[0].jclass = 0; sobject->_fields[0].aflags = JVM_STACK_ISOBJECTREF | JVM_STACK_ISARRAYREF; // add to object array of String jobject->fields[c] = (uint64)sobject; //jvm_exit(-5); } // return the object array of String result->data = (uintptr)jobject; result->flags = JVM_STACK_ISOBJECTREF | JVM_STACK_ISARRAYREF; return JVM_SUCCESS; } return JVM_SUCCESS; }
int main(int argc, char *argv[]) { uint8 *buf; JVMMemoryStream m; JVMClass *jclass; JVMBundle jbundle; JVMBundleClass *jbclass; JVM jvm; JVMObject *jobject; JVMLocal locals[10]; uint32 size; int result; JVMLocal jvm_result; JVMLocal _result; int x; uint8 *entryClass; uint8 *utf8; uint8 o; uintptr n; void *p; jvm.objects = 0; jvm.cmark = 0; jvm.mutex = 0; jbundle.first = 0; jvm.bundle = &jbundle; //x = jvm_GetMethodTypeArgumentCount("(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;"); //jvm_printf("argcnt:%u\n", x); // if the internal malloc is enabled we simply just hand it // a rather large chunk of memory to use #ifdef INTERNALMALLOC p = malloc(1024 * 1024 * 8); jvm_m_give(p, 1024 * 1024 * 8); #endif buf = jvm_ReadWholeFile("./ert/sys/Core.class", &size); msWrap(&m, buf, size); jclass = jvm_LoadClass(&m); jclass->flags = JVM_CLASS_NATIVE; jclass->nhand = jvm_core_core_handler; jvm_free(buf); jvm_AddClassToBundle(&jbundle, jclass); entryClass = 0; for (x = 1; x < argc; ++x) { if (argv[x][0] == ':') { // holds classpath and class name for entry entryClass = &argv[x][1]; } else { debugf("@@>loading %s\n", argv[x]); buf = jvm_ReadWholeFile(argv[x], &size); msWrap(&m, buf, size); jclass = jvm_LoadClass(&m); jvm_free(buf); debugf("@@>jclass: %lx\n", jclass); jvm_AddClassToBundle(&jbundle, jclass); } } // make static fields for all classes in bundle, // also this calls the special <clinit>:()V method debugf("here\n"); jvm_MakeStaticFieldsOnBundle(&jvm, &jbundle); debugf("here\n"); // catch common mistake and present user with something meaningful if (!entryClass) { debugf("No entry class specified on command line with :<entryclass>\n"); return -1; } /// create initial object result = jvm_CreateObject(&jvm, &jbundle, entryClass, &jobject); jclass = jvm_FindClassInBundle(&jbundle, entryClass); if (!jobject) { debugf("could not create object?\n"); jvm_exit(-1); } locals[0].data = (uint64)jobject; locals[0].flags = JVM_STACK_ISOBJECTREF; jvm_result.data = 0; jvm_result.flags = 0; result = jvm_ExecuteObjectMethod(&jvm, &jbundle, jclass, "main", "()J", &locals[0], 1, &jvm_result); if (result < 0) { if (!jvm_result.data) { debugf("error occured too soon; error-code:%i\n", result); exit(-1); } // the exception should be stored in jvm_result debugf("exception code:%i\n", result); debugf("jvm_result.data:%x jvm_result.flags:%x\n", jvm_result.data, jvm_result.flags); // walk the stack errorf("-------- UNCAUGHT EXCEPTION ---------\n"); errorf(" %s\n", jvm_GetClassNameFromClass(((JVMObject*)jvm_result.data)->class)); jvm_GetField((JVMObject*)jvm_result.data, "msg", &_result); debugf("here %x\n", _result.data); jvm_GetString((JVMObject*)_result.data, &utf8); errorf(" msg:%s\n", utf8); jvm_GetField((JVMObject*)jvm_result.data, "code", &_result); errorf(" code:%i\n", _result.data); result = jvm_GetField((JVMObject*)jvm_result.data, "first", &_result); while (_result.data != 0) { result = jvm_GetField((JVMObject*)_result.data, "methodName", &jvm_result); jvm_GetString((JVMObject*)jvm_result.data, &utf8); errorf(" method:%s", utf8); result = jvm_GetField((JVMObject*)_result.data, "className", &jvm_result); jvm_GetString((JVMObject*)jvm_result.data, &utf8); errorf(" class:%s", utf8); result = jvm_GetField((JVMObject*)_result.data, "methodType", &jvm_result); jvm_GetString((JVMObject*)jvm_result.data, &utf8); errorf(" type:%s", utf8); result = jvm_GetField((JVMObject*)_result.data, "opcodeIndex", &jvm_result); errorf(" opcode:%u\n", jvm_result.data); //result = jvm_GetField((JVMObject*)_result.data, "sourceLine", &jvm_result); //debugf("sourceLine:%u\n", jvm_result.data); // get next item, if any debugf(" -----\n"); result = jvm_GetField((JVMObject*)_result.data, "next", &_result); } debugf("calling collect.. %x\n", jobject); jvm_Collect(&jvm); return -1; } jvm_printf("done! result.data:%i result.flags:%u\n", jvm_result.data, jvm_result.flags); jvm_Collect(&jvm); return 1; }