/*===========================================================================* * main * *===========================================================================*/ int main(void) { message msg; int result, who_e, rcv_sts; int caller_slot; /* Initialize system so that all processes are runnable */ init_vm(); /* Register init callbacks. */ sef_setcb_init_restart(sef_cb_init_fail); sef_setcb_signal_handler(sef_cb_signal_handler); /* Let SEF perform startup. */ sef_startup(); SANITYCHECK(SCL_TOP); /* This is VM's main loop. */ while (TRUE) { int r, c; u32_t type, param; SANITYCHECK(SCL_TOP); if(missing_spares > 0) { alloc_cycle(); /* mem alloc code wants to be called */ } if ((r=sef_receive_status(ANY, &msg, &rcv_sts)) != OK) panic("sef_receive_status() error: %d", r); if (is_ipc_notify(rcv_sts)) { /* Unexpected notify(). */ printf("VM: ignoring notify() from %d\n", msg.m_source); continue; } who_e = msg.m_source; if(vm_isokendpt(who_e, &caller_slot) != OK) panic("invalid caller %d", who_e); type = param = msg.m_type; type &= 0x0000FFFF; param >>= 16; c = CALLNUMBER(type); result = ENOSYS; /* Out of range or restricted calls return this. */ if(msg.m_type == RS_INIT && msg.m_source == RS_PROC_NR) { result = do_rs_init(&msg); } else if (msg.m_type == VM_PAGEFAULT) { if (!IPC_STATUS_FLAGS_TEST(rcv_sts, IPC_FLG_MSG_FROM_KERNEL)) { printf("VM: process %d faked VM_PAGEFAULT " "message!\n", msg.m_source); } do_pagefaults(&msg); /* * do not reply to this call, the caller is unblocked by * a sys_vmctl() call in do_pagefaults if success. VM panics * otherwise */ continue; } else if(c < 0 || !vm_calls[c].vmc_func) { /* out of range or missing callnr */ } else { if (acl_check(&vmproc[caller_slot], c) != OK) { printf("VM: unauthorized %s by %d\n", vm_calls[c].vmc_name, who_e); } else { SANITYCHECK(SCL_FUNCTIONS); result = vm_calls[c].vmc_func(&msg); SANITYCHECK(SCL_FUNCTIONS); } } /* Send reply message, unless the return code is SUSPEND, * which is a pseudo-result suppressing the reply message. */ if(result != SUSPEND) { msg.m_type = result; if((r=send(who_e, &msg)) != OK) { printf("VM: couldn't send %d to %d (err %d)\n", msg.m_type, who_e, r); panic("send() error"); } } } return(OK); }
/*===========================================================================* * main * *===========================================================================*/ PUBLIC int main(void) { /* Main routine of the scheduler. */ message m_in; /* the incoming message itself is kept here. */ int call_nr; /* system call number */ int who_e; /* caller's endpoint */ int result; /* result to system call */ int rv; /* SEF local startup. */ sef_local_startup(); /* Initialize scheduling timers, used for running balance_queues */ init_scheduling(); /* my Hello code*/ printf("\n%s\n", " ========================================================="); printf("%s\n", " Hello, Minix is now using a lottery scheduler."); printf("%s\n\n", " ========================================================="); /* This is SCHED's main loop - get work and do it, forever and forever. */ while (TRUE) { int ipc_status; /* Wait for the next message and extract useful information from it. */ if (sef_receive_status(ANY, &m_in, &ipc_status) != OK) panic("SCHED sef_receive error"); who_e = m_in.m_source; /* who sent the message */ call_nr = m_in.m_type; /* system call number */ /* Check for system notifications first. Special cases. */ if (is_ipc_notify(ipc_status)) { switch(who_e) { case CLOCK: expire_timers(m_in.NOTIFY_TIMESTAMP); continue; /* don't reply */ default : result = ENOSYS; } goto sendreply; } switch(call_nr) { case SCHEDULING_INHERIT: case SCHEDULING_START: result = do_start_scheduling(&m_in); break; case SCHEDULING_STOP: result = do_stop_scheduling(&m_in); break; case SCHEDULING_SET_NICE: result = do_nice(&m_in); break; case SCHEDULING_NO_QUANTUM: /* This message was sent from the kernel, don't reply */ if (IPC_STATUS_FLAGS_TEST(ipc_status, IPC_FLG_MSG_FROM_KERNEL)) { if ((rv = do_noquantum(&m_in)) != (OK)) { printf("SCHED: Warning, do_noquantum " "failed with %d\n", rv); } continue; /* Don't reply */ } else { printf("SCHED: process %d faked " "SCHEDULING_NO_QUANTUM message!\n", who_e); result = EPERM; } break; default: result = no_sys(who_e, call_nr); } sendreply: /* Send reply. */ if (result != SUSPEND) { m_in.m_type = result; /* build reply message */ reply(who_e, &m_in); /* send it away */ } } return(OK); }
/*===========================================================================* * main * *===========================================================================*/ PUBLIC int main(void) { message msg; int result, who_e, rcv_sts; int caller_slot; struct vmproc *vmp_caller; /* SEF local startup. */ sef_local_startup(); SANITYCHECK(SCL_TOP); /* This is VM's main loop. */ while (TRUE) { int r, c; SANITYCHECK(SCL_TOP); if(missing_spares > 0) { pt_cycle(); /* pagetable code wants to be called */ } if ((r=sef_receive_status(ANY, &msg, &rcv_sts)) != OK) panic("sef_receive_status() error: %d", r); if (is_ipc_notify(rcv_sts)) { /* Unexpected notify(). */ printf("VM: ignoring notify() from %d\n", msg.m_source); continue; } who_e = msg.m_source; if(vm_isokendpt(who_e, &caller_slot) != OK) panic("invalid caller", who_e); vmp_caller = &vmproc[caller_slot]; c = CALLNUMBER(msg.m_type); result = ENOSYS; /* Out of range or restricted calls return this. */ if (msg.m_type == VM_PAGEFAULT) { if (!IPC_STATUS_FLAGS_TEST(rcv_sts, IPC_FLG_MSG_FROM_KERNEL)) { printf("VM: process %d faked VM_PAGEFAULT " "message!\n", msg.m_source); } do_pagefaults(&msg); /* * do not reply to this call, the caller is unblocked by * a sys_vmctl() call in do_pagefaults if success. VM panics * otherwise */ continue; } else if(c < 0 || !vm_calls[c].vmc_func) { /* out of range or missing callnr */ } else { if (vm_acl_ok(who_e, c) != OK) { printf("VM: unauthorized %s by %d\n", vm_calls[c].vmc_name, who_e); } else { SANITYCHECK(SCL_FUNCTIONS); result = vm_calls[c].vmc_func(&msg); SANITYCHECK(SCL_FUNCTIONS); } } /* Send reply message, unless the return code is SUSPEND, * which is a pseudo-result suppressing the reply message. */ if(result != SUSPEND) { msg.m_type = result; if((r=send(who_e, &msg)) != OK) { printf("VM: couldn't send %d to %d (err %d)\n", msg.m_type, who_e, r); panic("send() error"); } } } return(OK); }