extern "C" u64 doSyscalls(int sysnum, u64 arg1, u64 arg2, u64 arg3, u64 arg4, u64 arg5) { (void)arg1; (void)arg2; (void)arg3; (void)arg4; (void)arg5; /// TODO: Implement and use copyFromUser/copyToUser /// Right now we'll use any arbitrary pointer userland gives us without any checks /// It still works since we're on the user's cr3, but it's a blatant sec hole... u64 ret=0; switch (sysnum) { case 1: // exit { sysExit(arg1); break; } case 0x10000+1: // print { if (isUserPtrValid(arg1)) VGAText::print((const char*)arg1); break; } case 0x10000+2: // nget { if (isUserPtrValid(arg1) && isUserPtrValid(arg1+arg2)) Keyboard::nget((char*)arg1, arg2); break; } case 0x10000+3: // run { if (isUserPtrValid(arg1)) ret = TaskManager::loadTask((char*)arg1); else ret = 0; break; } default: error("Unknow syscall received : %d\n",sysnum); } return ret; }
/* * service call */ EXPORT W procSVC( W fno, W p1, W p2, W p3, W p4 ) { W er = E_OK; W n; switch ( fno ) { case TM_MONITOR: /* void tm_monitor( void ) */ procCommand(NULL, 0); break; case TM_GETCHAR: /* INT tm_getchar( INT wait ) */ er = getChar(p1); break; case TM_PUTCHAR: /* INT tm_putchar( INT c ) */ er = putChar(p1); break; case TM_GETLINE: /* INT tm_getline( UB *buff ) */ er = getString(wrkBuf); if ( er < 0 ) break; n = er + 1; if ( writeMem(p1, wrkBuf, n, 1) != n ) er = E_MACV; break; case TM_PUTSTRING: /* INT tm_putstring( const UB *buff ) */ n = readMemStr(p1, wrkBuf, WRKBUF_SZ); if ( n < 0 ) { er = E_MACV; break; } er = putString(wrkBuf); break; case TM_COMMAND: /* INT tm_command( const UB *buff ) */ n = readMemStr(p1, lineBuf, L_LINE); if ( n < 0 ) { er = E_MACV; break; } procCommand(( n == 0 )? NULL: lineBuf, 1); break; case TM_READDISK: case TM_WRITEDISK: case TM_INFODISK: /* INT tm_readdisk( const UB *dev, INT sec, INT nsec, void *addr ) * INT tm_writedisk( const UB *dev, INT sec, INT nsec, void *addr ) * INT tm_infodisk( const UB *dev, INT *blksz, INT *nblks ) */ n = readMemStr(p1, lineBuf, L_LINE); if ( n < 0 ) { er = E_MACV; break; } if ( fno == TM_INFODISK ) { er = infoDisk(lineBuf, (UW*)p2, (UW*)p3); } else { n = ( fno == TM_READDISK )? 0: 1; er = rwDisk(lineBuf, p2, p3, (void*)p4, n); } break; case TM_EXIT: /* void tm_exit( INT mode ) */ sysExit(p1); /* do not return */ break; case TM_EXTSVC: /* INT tm_extsvc( INT fno, INT par1, INT par2, INT par3 ) */ er = procExtSVC(p1, p2, p3, p4); break; default: er = E_PAR; } return er; }
/** * Parse command line arguments to find those arguments that * 1) affect the starting of the VM, * 2) can be handled without starting the VM, or * 3) contain quotes * then call createVM(). */ int main(int argc, const char **argv) { int j, ret; JavaVMInitArgs initArgs; JavaVM *mainJavaVM; JNIEnv *mainJNIEnv; SYS_START(); #ifndef RVM_FOR_HARMONY SysErrorFile = stderr; SysTraceFile = stdout; setbuf (SysErrorFile, NULL); setbuf (SysTraceFile, NULL); setvbuf(stdout,NULL,_IONBF,0); setvbuf(stderr,NULL,_IONBF,0); #endif #ifndef RVM_FOR_WINDOWS Me = strrchr(*argv, '/'); #else Me = strrchr(*argv, '\\'); #endif if (Me == NULL) { Me = "RVM"; } else { Me++; } ++argv, --argc; initialHeapSize = heap_default_initial_size; maximumHeapSize = heap_default_maximum_size; /* Initialize system call routines and side data structures */ sysInitialize(); /* * Debugging: print out command line arguments. */ if (TRACE) { TRACE_PRINTF("RunBootImage.main(): process %d command line arguments\n",argc); for (j=0; j<argc; j++) { TRACE_PRINTF("\targv[%d] is \"%s\"\n",j, argv[j]); } } /* Initialize JavaArgc, JavaArgs and initArg */ initArgs.version = JNI_VERSION_1_4; initArgs.ignoreUnrecognized = JNI_TRUE; JavaArgs = (char **)processCommandLineArguments(&initArgs, argv, argc); if (TRACE) { TRACE_PRINTF("RunBootImage.main(): after processCommandLineArguments: %d command line arguments\n", JavaArgc); for (j = 0; j < JavaArgc; j++) { TRACE_PRINTF("\tJavaArgs[%d] is \"%s\"\n", j, JavaArgs[j]); } } /* Verify heap sizes for sanity. */ if (initialHeapSize == heap_default_initial_size && maximumHeapSize != heap_default_maximum_size && initialHeapSize > maximumHeapSize) { initialHeapSize = maximumHeapSize; } if (maximumHeapSize == heap_default_maximum_size && initialHeapSize != heap_default_initial_size && initialHeapSize > maximumHeapSize) { maximumHeapSize = initialHeapSize; } if (maximumHeapSize < initialHeapSize) { CONSOLE_PRINTF( "%s: maximum heap size %lu MiB is less than initial heap size %lu MiB\n", Me, (unsigned long) maximumHeapSize/(1024*1024), (unsigned long) initialHeapSize/(1024*1024)); return EXIT_STATUS_BOGUS_COMMAND_LINE_ARG; } TRACE_PRINTF("\nRunBootImage.main(): VM variable settings\n"); TRACE_PRINTF("initialHeapSize %lu\nmaxHeapSize %lu\n" "bootCodeFileName \"%s\"\nbootDataFileName \"%s\"\n" "bootRmapFileName \"%s\"\n" "verbose %d\n", (unsigned long) initialHeapSize, (unsigned long) maximumHeapSize, bootCodeFilename, bootDataFilename, bootRMapFilename, verbose); if (!bootCodeFilename) { CONSOLE_PRINTF( "%s: please specify name of boot image code file using \"-X:ic=<filename>\"\n", Me); return EXIT_STATUS_BOGUS_COMMAND_LINE_ARG; } if (!bootDataFilename) { CONSOLE_PRINTF( "%s: please specify name of boot image data file using \"-X:id=<filename>\"\n", Me); return EXIT_STATUS_BOGUS_COMMAND_LINE_ARG; } if (!bootRMapFilename) { CONSOLE_PRINTF( "%s: please specify name of boot image ref map file using \"-X:ir=<filename>\"\n", Me); return EXIT_STATUS_BOGUS_COMMAND_LINE_ARG; } ret = JNI_CreateJavaVM(&mainJavaVM, &mainJNIEnv, &initArgs); if (ret < 0) { ERROR_PRINTF("%s: Could not create the virtual machine; goodbye\n", Me); sysExit(EXIT_STATUS_MISC_TROUBLE); } return 0; }
/* * Initial Processing after Reset */ EXPORT void procReset( void ) { FP fp; UW va; /* Disable all interupts */ /* Turn ON all LEDs */ cpuLED(0x0F); /* initialize console serial port */ initSIO(CONS_PORT, HI_BAUD_RATE); /* setting up the initial count for micro-wait */ setupWaitUsec(); /* initialize console serial port */ initSIO(CONS_PORT, HI_BAUD_RATE); /* Clear system common area (vector table, and SysInfo) */ memset(SCArea, 0, sizeof(SysCommonArea)); /* Initialize system common information (SysInfo) */ SCInfo.ramtop = (void *)RAM_TOP; va = (UW)ROMInfo->userarea; if ( va < RAM_TOP || va > RAM_END ) va = RAM_END; SCInfo.ramend = (void *)va; SCInfo.istkpos = (void *)EIT_STACK; /* Set up EIT vectors */ SCArea->intvec[EIT_DEFAULT] = _defaultHdr; // default handler SCArea->intvec[EIT_EXC(0)] = _intHdr; // Interrupt handler SCArea->intvec[EIT_EXC(8)] = _svcHdr; // SYSCALL handler SCArea->intvec[EIT_IP(2)] = _ip2Hdr; // Interrupt (IP 2) SCArea->intvec[EIT_IP(3)] = _ip3Hdr; // Interrupt (IP 3) SCArea->intvec[EIT_IP(4)] = _ip4Hdr; // Interrupt (IP 4) SCArea->intvec[EIT_IP(5)] = _ip5Hdr; // Interrupt (IP 5) SCArea->intvec[EIT_IP(6)] = _ip6Hdr; // Interrupt (IP 6) SCArea->intvec[CALL_MONITOR] = _defaultHdr; // M SVC(SYSCALL 37) SCArea->intvec[CALL_MONBREAK] = _defaultHdr; // M SVC(SYSCALL 42) /* Invoke user reset initialization */ fp = ROMInfo->resetinit; if ( fp != NULL ) (*fp)(); /* Turn ON Green LED */ cpuLED(0x01); /* Kernel entry address */ fp = ROMInfo->kernel; /* Command */ if ( (dipSW() & 0x10) != 0 || fp == NULL ) { printk(("\n** T-Monitor for APP-M150 **\n")); procCommand(&fp); } /* Invoke the Kernel */ if ( fp != NULL ) (*fp)(); sysExit(0); }