1*433d6423SLionel Sambuc #include "kernel/system.h" 2*433d6423SLionel Sambuc #include <minix/endpoint.h> 3*433d6423SLionel Sambuc 4*433d6423SLionel Sambuc /*===========================================================================* 5*433d6423SLionel Sambuc * do_schedctl * 6*433d6423SLionel Sambuc *===========================================================================*/ 7*433d6423SLionel Sambuc int do_schedctl(struct proc * caller, message * m_ptr) 8*433d6423SLionel Sambuc { 9*433d6423SLionel Sambuc struct proc *p; 10*433d6423SLionel Sambuc uint32_t flags; 11*433d6423SLionel Sambuc int priority, quantum, cpu; 12*433d6423SLionel Sambuc int proc_nr; 13*433d6423SLionel Sambuc int r; 14*433d6423SLionel Sambuc 15*433d6423SLionel Sambuc /* check parameter validity */ 16*433d6423SLionel Sambuc flags = m_ptr->m_lsys_krn_schedctl.flags; 17*433d6423SLionel Sambuc if (flags & ~SCHEDCTL_FLAG_KERNEL) { 18*433d6423SLionel Sambuc printf("do_schedctl: flags 0x%x invalid, caller=%d\n", 19*433d6423SLionel Sambuc flags, caller - proc); 20*433d6423SLionel Sambuc return EINVAL; 21*433d6423SLionel Sambuc } 22*433d6423SLionel Sambuc 23*433d6423SLionel Sambuc if (!isokendpt(m_ptr->m_lsys_krn_schedctl.endpoint, &proc_nr)) 24*433d6423SLionel Sambuc return EINVAL; 25*433d6423SLionel Sambuc 26*433d6423SLionel Sambuc p = proc_addr(proc_nr); 27*433d6423SLionel Sambuc 28*433d6423SLionel Sambuc if ((flags & SCHEDCTL_FLAG_KERNEL) == SCHEDCTL_FLAG_KERNEL) { 29*433d6423SLionel Sambuc /* the kernel becomes the scheduler and starts 30*433d6423SLionel Sambuc * scheduling the process. 31*433d6423SLionel Sambuc */ 32*433d6423SLionel Sambuc priority = m_ptr->m_lsys_krn_schedctl.priority; 33*433d6423SLionel Sambuc quantum = m_ptr->m_lsys_krn_schedctl.quantum; 34*433d6423SLionel Sambuc cpu = m_ptr->m_lsys_krn_schedctl.cpu; 35*433d6423SLionel Sambuc 36*433d6423SLionel Sambuc /* Try to schedule the process. */ 37*433d6423SLionel Sambuc if((r = sched_proc(p, priority, quantum, cpu) != OK)) 38*433d6423SLionel Sambuc return r; 39*433d6423SLionel Sambuc p->p_scheduler = NULL; 40*433d6423SLionel Sambuc } else { 41*433d6423SLionel Sambuc /* the caller becomes the scheduler */ 42*433d6423SLionel Sambuc p->p_scheduler = caller; 43*433d6423SLionel Sambuc } 44*433d6423SLionel Sambuc 45*433d6423SLionel Sambuc return(OK); 46*433d6423SLionel Sambuc } 47