static int __wind_task_setmode(struct task_struct *curr, struct pt_regs *regs) { int setmask, clrmask, mode_r; clrmask = __xn_reg_arg1(regs); setmask = __xn_reg_arg2(regs); /* Primary required: current thread must be valid. */ mode_r = xnpod_set_thread_mode(xnpod_current_thread(), clrmask, setmask); if (__xn_reg_arg3(regs)) __xn_copy_to_user(curr, (void __user *)__xn_reg_arg3(regs), &mode_r, sizeof(mode_r)); return 0; }
u_long t_mode(u_long mask, u_long newmask, u_long *oldmode) { psostask_t *task; if (!xnpod_primary_p()) return -EPERM; task = psos_current_task(); /* We have no error case here: just clear out any unwanted bit. */ mask &= T_MODE_MASK; newmask &= T_MODE_MASK; *oldmode = xeno_mode_to_psos(xnthread_state_flags(&task->threadbase) & XNTHREAD_MODE_BITS); *oldmode |= ((task->threadbase.imask & 0x7) << 8); if (mask & T_TSLICE) { if (newmask & T_TSLICE) xnpod_set_thread_tslice(&task->threadbase, psos_time_slice); else xnpod_set_thread_tslice(&task->threadbase, XN_INFINITE); mask &= ~T_TSLICE; } if (mask == 0) return SUCCESS; xnpod_set_thread_mode(&task->threadbase, psos_mode_to_xeno(mask), psos_mode_to_xeno(newmask)); /* Reschedule in case the scheduler has been unlocked. */ xnpod_schedule(); return SUCCESS; }