Beispiel #1
0
static int
my_handler(int task, int arg1, int arg2, int ipctype, u_int envid, void* d)
{
  int i=0;
 
  if (arg1 == 16)
  {
    printf("server: 16 received\n");
    for(i=0; i<500000; i++)
      sys_null();
    printf("server: done, 16\n");
  }

  else if (arg1 == 15)
  {
    printf("server: 15 received\n");
    for(i=0; i<1000000; i++)
      sys_null();
    sys_set_allowipc1(XOK_IPC_BLOCKED);
    printf("server: done, 15\n");
  }

  else if (arg1 == 14)
  {
    printf("server: 14 received\n");
    for(i=0; i<500000; i++)
      sys_null();
    printf("server: done, 14\n");
  }

  else if (arg1 == 13)
  {
    printf("server: 13 received\n");
    
    for(i=0; i<500000; i++)
      sys_null();

    printf("server: done, 13\n");
  }

  else if (arg1 == 12)
  {
    printf("server: 12 received, program not available\n");
    RETERR(V_PROGUNAVAIL);
  }

  return arg1;
}
Beispiel #2
0
static void global_tests(uint32_t vcoreid)
{
	int retval;
	switch (test) {
		case TEST_YIELD_ALL:
			printf("Core %d yielding\n", vcoreid);
			sys_yield(0);
			// should be RUNNABLE_M now, amt_wanted == 1
			while(1);
		case TEST_SWITCH_TO_RUNNABLE_S:
			if (vcoreid == 2) {
				printf("Core %d trying to request 0/ switch to _S\n", vcoreid);
				udelay(3000000);
				retval = vcore_request(0);
				// will only see this if we are scheduled()
				printf("Core %d back up! (retval:%d)\n", vcoreid, retval);
				printf("And exiting\n");
				exit(0);
			} 
			while(1);
		case TEST_CRAZY_YIELDS:
			udelay(300000*vcoreid);
			vcore_request(5);
			sys_yield(0);
			printf("should  never see me, unless you slip into *_S\n");
			break;
		case TEST_CONCURRENT_SYSCALLS:
			for (int i = 0; i < 10; i++) {
				for (int j = 0; j < 100; j++)
					sys_null();
				printf("Hello from vcore %d, iteration %d\n", vcoreid, i);
			}
			break;
	}
}
Beispiel #3
0
/***
 *
 * @TODO Could be handled by a lowlevel lookup-table, but this is probably a bit more readable
 *
 * Calling paramters:
 *   param 1 : EBX
 *   param 2 : ECX
 *   param 3 : EDX
 *   param 4 : ESI
 *   param 5 : EDI
 *   param 6 : time for using a structure instead of so many parameters...
 *
 *  This parameter list is defined in the create_syscall_entryX macro's (service.h)
 *
 */
int service_interrupt (regs_t *r) {
    int retval = 0;
    int service = (r->eax & 0x0000FFFF);

    switch (service) {
    default        :
    case  SYS_NULL :
        retval = sys_null ();
        break;
    case  SYS_CONSOLE :
        retval = sys_console (r->ebx, (console_t *)r->ecx, (char *)r->edx);
        break;
    case  SYS_CONWRITE :
        retval = sys_conwrite ((char)r->ebx, r->ecx);
        break;
    case  SYS_CONFLUSH :
        retval = sys_conflush ();
        break;
    case  SYS_FORK :
        retval = sys_fork (r);
        break;
    case  SYS_GETPID :
        retval = sys_getpid ();
        break;
    case  SYS_GETPPID :
        retval = sys_getppid ();
        break;
    case  SYS_SLEEP :
        retval = sys_sleep (r->ebx);
        break;
    case  SYS_IDLE :
        retval = sys_idle ();
        break;
    case  SYS_EXIT :
        retval = sys_exit (r->ebx);
        break;
    case  SYS_EXECVE :
        retval = sys_execve (r, (char *)r->ebx, (char **)r->ecx, (char **)r->edx);
        break;
    }
    return retval;
}