/*===========================================================================* * get_work * *===========================================================================*/ static void get_work( message *m_ptr /* message buffer */ ) { int status = sef_receive_status(ANY, m_ptr, &ipc_status); /* blocks until message arrives */ if (OK != status) panic("failed to receive message!: %d", status); who_e = m_ptr->m_source; /* message arrived! set sender */ callnr = m_ptr->m_type; /* set function call number */ }
/*===========================================================================* * chardriver_task * *===========================================================================*/ void chardriver_task(struct chardriver *cdp, int driver_type) { /* Main program of any device driver task. */ int r, ipc_status; message mess; running = TRUE; /* Here is the main loop of the disk task. It waits for a message, carries * it out, and sends a reply. */ while (running) { if ((r = sef_receive_status(ANY, &mess, &ipc_status)) != OK) panic("driver_receive failed: %d", r); chardriver_process(cdp, driver_type, &mess, ipc_status); } }
int main(__unused int argc, __unused char ** argv) { sef_local_startup(); for(;;) { int err, ipc_status; message m; netif_poll_lo(); mq_process(); if ((err = sef_receive_status(ANY, &m, &ipc_status)) != OK) { printf("LWIP : sef_receive_status errr %d\n", err); continue; } if (m.m_source == VFS_PROC_NR) socket_request(&m, ipc_status); else if (is_ipc_notify(ipc_status)) { switch (m.m_source) { case CLOCK: expire_timers(m.m_notify.timestamp); break; case DS_PROC_NR: ds_event(); break; case PM_PROC_NR: panic("LWIP : unhandled event from PM"); break; default: printf("LWIP : unexpected notify from %d\n", m.m_source); continue; } } else /* all other request can be from drivers only */ driver_request(&m); } return 0; }
int main(int argc, char *argv[]) { int r, i; struct tm t; endpoint_t user, caller; message m; int ipc_status, reply_status; env_setargs(argc, argv); r = i2cdriver_env_parse(&bus, &addresses[0], valid_addrs); if (r < 0) { log_warn(&log, "Expecting -args 'bus=X address=0xYY'\n"); log_warn(&log, "Example -args 'bus=1 address=0x48'\n"); return EXIT_FAILURE; } else if (r > 0) { log_warn(&log, "Invalid slave address for device, expecting 0x48\n"); return EXIT_FAILURE; } sef_local_startup(); while (TRUE) { /* Receive Message */ r = sef_receive_status(ANY, &m, &ipc_status); if (r != OK) { log_warn(&log, "sef_receive_status() failed\n"); continue; } if (is_ipc_notify(ipc_status)) { if (m.m_source == DS_PROC_NR) { for (i = 0; i < NADDRESSES; i++) { /* changed state, update endpoint */ i2cdriver_handle_bus_update (&bus_endpoint, bus, addresses[i]); } } /* Do not reply to notifications. */ continue; } caller = m.m_source; log_debug(&log, "Got message 0x%x from 0x%x\n", m.m_type, caller); switch (m.m_type) { case RTCDEV_GET_TIME_G: /* Any user can read the time */ reply_status = rtc_get_time(&t, m.RTCDEV_FLAGS); if (reply_status != OK) { break; } /* write results back to calling process */ reply_status = store_t(caller, (cp_grant_id_t) m.RTCDEV_GRANT, &t); break; case RTCDEV_SET_TIME_G: /* Only super user is allowed to set the time */ if (getnuid(caller) == SUPER_USER) { /* read time from calling process */ reply_status = fetch_t(caller, (cp_grant_id_t) m.RTCDEV_GRANT, &t); if (reply_status != OK) { break; } reply_status = rtc_set_time(&t, m.RTCDEV_FLAGS); } else { reply_status = EPERM; } break; case RTCDEV_PWR_OFF: reply_status = ENOSYS; break; default: /* Unrecognized call */ reply_status = EINVAL; break; } /* Send Reply */ m.m_type = RTCDEV_REPLY; m.RTCDEV_STATUS = reply_status; log_debug(&log, "Sending Reply"); r = sendnb(caller, &m); if (r != OK) { log_warn(&log, "sendnb() failed\n"); continue; } } rtc_exit(); return 0; }
/*===========================================================================* * 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 * *===========================================================================*/ int main() { /* Main routine of the process manager. */ int result; /* SEF local startup. */ sef_local_startup(); // Initialization of the semarray (of pointers) to NULL register struct mproc *rmp; // rmp is the pointer to the struct of the process table for (rmp = &mproc[0]; rmp < &mproc[NR_PROCS]; rmp++) { for(int i=0; i<12; i++) // for all 12 semaphores { rmp->semarray[i]=NULL; } } // end of Initialization /* This is PM'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("PM sef_receive_status error"); who_e = m_in.m_source; /* who sent the message */ if(pm_isokendpt(who_e, &who_p) != OK) panic("PM got message from invalid endpoint: %d", who_e); call_nr = m_in.m_type; /* system call number */ /* Process slot of caller. Misuse PM's own process slot if the kernel is * calling. This can happen in case of synchronous alarms (CLOCK) or or * event like pending kernel signals (SYSTEM). */ mp = &mproc[who_p < 0 ? PM_PROC_NR : who_p]; if(who_p >= 0 && mp->mp_endpoint != who_e) { panic("PM endpoint number out of sync with source: %d", mp->mp_endpoint); } /* Drop delayed calls from exiting processes. */ if (mp->mp_flags & EXITING) continue; /* Check for system notifications first. Special cases. */ if (is_ipc_notify(ipc_status)) { if (who_p == CLOCK) { expire_timers(m_in.NOTIFY_TIMESTAMP); } /* done, send reply and continue */ sendreply(); continue; } switch(call_nr) { case PM_SETUID_REPLY: case PM_SETGID_REPLY: case PM_SETSID_REPLY: case PM_EXEC_REPLY: case PM_EXIT_REPLY: case PM_CORE_REPLY: case PM_FORK_REPLY: case PM_SRV_FORK_REPLY: case PM_UNPAUSE_REPLY: case PM_REBOOT_REPLY: case PM_SETGROUPS_REPLY: if (who_e == VFS_PROC_NR) { handle_vfs_reply(); result= SUSPEND; /* don't reply */ } else result= ENOSYS; break; case COMMON_GETSYSINFO: result = do_getsysinfo(); break; default: /* Else, if the system call number is valid, perform the * call. */ if ((unsigned) call_nr >= NCALLS) { result = ENOSYS; } else { #if ENABLE_SYSCALL_STATS calls_stats[call_nr]++; #endif result = (*call_vec[call_nr])(); } break; } /* Send reply. */ if (result != SUSPEND) setreply(who_p, result); sendreply(); } return(OK); }
/*===========================================================================* * 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 * *===========================================================================*/ int main() { /* Main routine of the process manager. */ unsigned int call_index; int ipc_status, result; /* SEF local startup. */ sef_local_startup(); /* This is PM's main loop- get work and do it, forever and forever. */ while (TRUE) { /* Wait for the next message. */ if (sef_receive_status(ANY, &m_in, &ipc_status) != OK) panic("PM sef_receive_status error"); /* Check for system notifications first. Special cases. */ if (is_ipc_notify(ipc_status)) { if (_ENDPOINT_P(m_in.m_source) == CLOCK) expire_timers(m_in.m_notify.timestamp); /* done, continue */ continue; } /* Extract useful information from the message. */ who_e = m_in.m_source; /* who sent the message */ if (pm_isokendpt(who_e, &who_p) != OK) panic("PM got message from invalid endpoint: %d", who_e); mp = &mproc[who_p]; /* process slot of caller */ call_nr = m_in.m_type; /* system call number */ /* Drop delayed calls from exiting processes. */ if (mp->mp_flags & EXITING) continue; if (IS_VFS_PM_RS(call_nr) && who_e == VFS_PROC_NR) { handle_vfs_reply(); result = SUSPEND; /* don't reply */ } else if (call_nr == PROC_EVENT_REPLY) { result = do_proc_event_reply(); } else if (IS_PM_CALL(call_nr)) { /* If the system call number is valid, perform the call. */ call_index = (unsigned int) (call_nr - PM_BASE); if (call_index < NR_PM_CALLS && call_vec[call_index] != NULL) { #if ENABLE_SYSCALL_STATS calls_stats[call_index]++; #endif result = (*call_vec[call_index])(); } else result = ENOSYS; } else result = ENOSYS; /* Send reply. */ if (result != SUSPEND) reply(who_p, result); } return(OK); }
int main(int argc, char *argv[]) { int r; endpoint_t user, caller; message m; int ipc_status; env_setargs(argc, argv); r = i2cdriver_env_parse(&bus, &address, valid_addrs); if (r < 0) { log_warn(&log, "Expecting -args 'bus=X address=0xYY'\n"); log_warn(&log, "Example -args 'bus=1 address=0x24'\n"); return EXIT_FAILURE; } else if (r > 0) { log_warn(&log, "Invalid slave address for device, expecting 0x24\n"); return EXIT_FAILURE; } sef_local_startup(); while (TRUE) { /* Receive Message */ r = sef_receive_status(ANY, &m, &ipc_status); if (r != OK) { log_warn(&log, "sef_receive_status() failed\n"); continue; } log_trace(&log, "Got a message 0x%x from 0x%x\n", m.m_type, m.m_source); if (is_ipc_notify(ipc_status)) { switch (m.m_source) { case DS_PROC_NR: /* bus driver changed state, update endpoint */ i2cdriver_handle_bus_update(&bus_endpoint, bus, address); break; case HARDWARE: intr_handler(); break; default: break; } /* Do not reply to notifications. */ continue; } caller = m.m_source; user = m.USER_ENDPT; /* * Handle Message * * So far this driver only deals with notifications * so it always replies to non-notifications with EINVAL. */ /* Send Reply */ m.m_type = TASK_REPLY; m.REP_ENDPT = user; m.REP_STATUS = EINVAL; r = sendnb(caller, &m); if (r != OK) { log_warn(&log, "sendnb() failed\n"); continue; } } return 0; }
static void dispatcher_thread(void *unused) { /* * Gets all messages and dispatches them. * * NOTE: this thread runs only when no other ddekit is * ready. So please take care that youre threads * leave some time for the others! */ message m; int r; int i; int ipc_status; _ddekit_thread_set_myprio(0); for( ; ; ) { /* Trigger a timer interrupt at each loop iteration */ _ddekit_timer_update(); /* Wait for messages */ if ((r = sef_receive_status(ANY, &m, &ipc_status)) != 0) { ddekit_panic("ddekit", "sef_receive failed", r); } _ddekit_timer_interrupt(); _ddekit_thread_wakeup_sleeping(); if (is_notify(m.m_type)) { switch (_ENDPOINT_P(m.m_source)) { case HARDWARE: for (i =0 ; i < 32 ; i++) { if(m.NOTIFY_ARG & (1 << i)) { _ddekit_interrupt_trigger(i); } } break; case CLOCK: _ddekit_timer_pending = 0; break; default: ddekit_thread_schedule(); } } else { /* * I don't know how to handle this msg, * but maybe we have a msg queue which can * handle this msg. */ ddekit_minix_queue_msg(&m, ipc_status); } } }
int main(int argc, char **argv) { int r; endpoint_t caller; struct tm t; message m; int ipc_status, reply_status; env_setargs(argc, argv); sef_local_startup(); while (TRUE) { /* Receive Message */ r = sef_receive_status(ANY, &m, &ipc_status); if (r != OK) { log_warn(&log, "sef_receive_status() failed\n"); continue; } if (is_ipc_notify(ipc_status)) { /* Do not reply to notifications. */ continue; } caller = m.m_source; log_debug(&log, "Got message 0x%x from 0x%x\n", m.m_type, caller); switch (m.m_type) { case RTCDEV_GET_TIME: /* Any user can read the time */ reply_status = rtc.get_time(&t, m.m_lc_readclock_rtcdev.flags); if (reply_status != OK) { break; } /* write results back to calling process */ reply_status = store_t(caller, m.m_lc_readclock_rtcdev.tm, &t); break; case RTCDEV_SET_TIME: /* Only super user is allowed to set the time */ if (getnuid(caller) == SUPER_USER) { /* read time from calling process */ reply_status = fetch_t(caller, m.m_lc_readclock_rtcdev.tm, &t); if (reply_status != OK) { break; } reply_status = rtc.set_time(&t, m.m_lc_readclock_rtcdev.flags); } else { reply_status = EPERM; } break; case RTCDEV_PWR_OFF: /* Only PM is allowed to set the power off time */ if (caller == PM_PROC_NR) { reply_status = rtc.pwr_off(); } else { reply_status = EPERM; } break; default: /* Unrecognized call */ reply_status = EINVAL; break; } /* Send Reply */ m.m_type = RTCDEV_REPLY; m.m_readclock_lc_rtcdev.status = reply_status; log_debug(&log, "Sending Reply"); r = ipc_sendnb(caller, &m); if (r != OK) { log_warn(&log, "ipc_sendnb() failed\n"); continue; } } rtc.exit(); return 0; }
PUBLIC int main(int argc, char *argv[]) { mq_t *mq; int ipc_status; int r; endpoint_t source; int m_type; /* SEF local startup. */ sef_local_startup(); while (TRUE) { #ifdef BUF_CONSISTENCY_CHECK if (inet_buf_debug) { static int buf_debug_count= 0; if (++buf_debug_count >= inet_buf_debug) { buf_debug_count= 0; if (!bf_consistency_check()) break; } } #endif if (ev_head) { ev_process(); continue; } if (clck_call_expire) { clck_expire_timers(); continue; } mq= mq_get(); if (!mq) ip_panic(("out of messages")); r= sef_receive_status(ANY, &mq->mq_mess, &ipc_status); if (r<0) { ip_panic(("unable to receive: %d", r)); } reset_time(); source= mq->mq_mess.m_source; m_type= mq->mq_mess.m_type; if (source == VFS_PROC_NR) { sr_rec(mq); } else if (is_ipc_notify(ipc_status)) { if (source == CLOCK) { clck_tick(&mq->mq_mess); mq_free(mq); } else if (source == PM_PROC_NR) { /* signaled */ /* probably SIGTERM */ mq_free(mq); } else if (source == DS_PROC_NR) { /* DS notifies us of an event. */ ds_event(); mq_free(mq); } else { printf("inet: got unexpected notify from %d\n", mq->mq_mess.m_source); mq_free(mq); } } else if (m_type == DL_CONF_REPLY || m_type == DL_TASK_REPLY || m_type == DL_STAT_REPLY) { eth_rec(&mq->mq_mess); mq_free(mq); } else { printf("inet: got bad message type 0x%x from %d\n", mq->mq_mess.m_type, mq->mq_mess.m_source); mq_free(mq); } } ip_panic(("task is not allowed to terminate")); return 1; }
/*===========================================================================* * main * *===========================================================================*/ PUBLIC int main() { /* Main routine of the process manager. */ int result; /* SEF local startup. */ sef_local_startup(); sched_init(); /* initialize user-space scheduling */ /* This is PM'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("PM sef_receive_status error"); who_e = m_in.m_source; /* who sent the message */ if(pm_isokendpt(who_e, &who_p) != OK) panic("PM got message from invalid endpoint: %d", who_e); call_nr = m_in.m_type; /* system call number */ /* Process slot of caller. Misuse PM's own process slot if the kernel is * calling. This can happen in case of synchronous alarms (CLOCK) or or * event like pending kernel signals (SYSTEM). */ mp = &mproc[who_p < 0 ? PM_PROC_NR : who_p]; if(who_p >= 0 && mp->mp_endpoint != who_e) { panic("PM endpoint number out of sync with source: %d", mp->mp_endpoint); } /* Drop delayed calls from exiting processes. */ if (mp->mp_flags & EXITING) continue; /* Check for system notifications first. Special cases. */ if (is_ipc_notify(ipc_status)) { switch(who_p) { case CLOCK: pm_expire_timers(m_in.NOTIFY_TIMESTAMP); result = SUSPEND; /* don't reply */ break; default : result = ENOSYS; } /* done, send reply and continue */ if (result != SUSPEND) setreply(who_p, result); sendreply(); continue; } switch(call_nr) { case PM_SETUID_REPLY: case PM_SETGID_REPLY: case PM_SETSID_REPLY: case PM_EXEC_REPLY: case PM_EXIT_REPLY: case PM_CORE_REPLY: case PM_FORK_REPLY: case PM_SRV_FORK_REPLY: case PM_UNPAUSE_REPLY: case PM_REBOOT_REPLY: case PM_SETGROUPS_REPLY: /*?????????????????????????????????????????????????????????????????????*/ /*?????????????????????????????????????????????????????????????????????*/ /* Chamando a funcao terminator() para todos os processos finalizados. */ if ( call_nr==PM_EXIT_REPLY ) terminator( _ENDPOINT_P(m_in.m1_i1)); /*?????????????????????????????????????????????????????????????????????*/ /*?????????????????????????????????????????????????????????????????????*/ if (who_e == FS_PROC_NR) { handle_fs_reply(); result= SUSPEND; /* don't reply */ } else result= ENOSYS; break; default: /* Else, if the system call number is valid, perform the * call. */ if ((unsigned) call_nr >= NCALLS) { result = ENOSYS; } else { #if ENABLE_SYSCALL_STATS calls_stats[call_nr]++; #endif result = (*call_vec[call_nr])(); } break; } /* Send reply. */ if (result != SUSPEND) setreply(who_p, result); sendreply(); } 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); }