Beispiel #1
0
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;
}
Beispiel #2
0
/*
 * 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;
}
Beispiel #3
0
/**
 * 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;
}
Beispiel #4
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);
}