/* * Get the arguments to the current system call. * lwp->lwp_ap normally points to the out regs in the reg structure. * If the user is going to change the out registers and might want to * get the args (for /proc tracing), it must copy the args elsewhere * via save_syscall_args(). */ uint_t get_syscall_args(klwp_t *lwp, long *argp, int *nargsp) { kthread_t *t = lwptot(lwp); uint_t code = t->t_sysnum; long mask; long *ap; int nargs; if (lwptoproc(lwp)->p_model == DATAMODEL_ILP32) mask = (uint32_t)0xffffffffU; else mask = 0xffffffffffffffff; if (code != 0 && code < NSYSCALL) { nargs = LWP_GETSYSENT(lwp)[code].sy_narg; ASSERT(nargs <= MAXSYSARGS); *nargsp = nargs; ap = lwp->lwp_ap; while (nargs-- > 0) *argp++ = *ap++ & mask; } else { *nargsp = 0; } return (code); }
/* * If this is a process in a branded zone, then we want it to disable the * brand syscall entry points. This routine must be called when the last * lwp in a process is exiting in proc_exit(). */ void lwp_detach_brand_hdlrs(klwp_t *lwp) { kthread_t *t = lwptot(lwp); ASSERT(PROC_IS_BRANDED(lwptoproc(lwp))); if (t == curthread) kpreempt_disable(); /* Remove the original context handlers */ VERIFY(removectx(t, NULL, brand_interpositioning_disable, brand_interpositioning_enable, NULL, NULL, brand_interpositioning_disable, NULL) != 0); if (t == curthread) { /* Cleanup our MSR and IDT entries. */ brand_interpositioning_disable(); kpreempt_enable(); } }
/* * If this is a process in a branded zone, then we want it to use the brand * syscall entry points instead of the standard Solaris entry points. This * routine must be called when a new lwp is created within a branded zone * or when an existing lwp moves into a branded zone via a zone_enter() * operation. */ void lwp_attach_brand_hdlrs(klwp_t *lwp) { kthread_t *t = lwptot(lwp); ASSERT(PROC_IS_BRANDED(lwptoproc(lwp))); ASSERT(removectx(t, NULL, brand_interpositioning_disable, brand_interpositioning_enable, NULL, NULL, brand_interpositioning_disable, NULL) == 0); installctx(t, NULL, brand_interpositioning_disable, brand_interpositioning_enable, NULL, NULL, brand_interpositioning_disable, NULL); if (t == curthread) { kpreempt_disable(); brand_interpositioning_enable(); kpreempt_enable(); } }