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; }
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; } }
/*** * * @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; }