diff options
author | David Xu <davidxu@FreeBSD.org> | 2004-07-12 07:39:20 +0000 |
---|---|---|
committer | David Xu <davidxu@FreeBSD.org> | 2004-07-12 07:39:20 +0000 |
commit | 507b03186a50e9219c948ceb9c313a843c567872 (patch) | |
tree | 4533691922b23dce2a5e5d058b14848d4c8231d3 /sys/kern/kern_kse.c | |
parent | e5996857ad1f30f74f848a2c464c75a7ae28e59a (diff) | |
download | src-507b03186a50e9219c948ceb9c313a843c567872.tar.gz src-507b03186a50e9219c948ceb9c313a843c567872.zip |
Change kse_switchin to accept kse_thr_mailbox pointer, the syscall
will be used heavily in debugging KSE threads. This breaks libpthread
on IA64, but because libpthread was not in 5.2.1 release, I would like
to change it so we needn't to introduce another syscall.
Notes
Notes:
svn path=/head/; revision=132020
Diffstat (limited to 'sys/kern/kern_kse.c')
-rw-r--r-- | sys/kern/kern_kse.c | 29 |
1 files changed, 20 insertions, 9 deletions
diff --git a/sys/kern/kern_kse.c b/sys/kern/kern_kse.c index 349812714fdb..0b4e7c55cc72 100644 --- a/sys/kern/kern_kse.c +++ b/sys/kern/kern_kse.c @@ -126,25 +126,36 @@ upcall_remove(struct thread *td) #ifndef _SYS_SYSPROTO_H_ struct kse_switchin_args { - const struct __mcontext *mcp; - long val; - long *loc; + struct kse_thr_mailbox *tmbx; + int flags; }; #endif int kse_switchin(struct thread *td, struct kse_switchin_args *uap) { - mcontext_t mc; + struct kse_thr_mailbox tmbx; + struct kse_upcall *ku; int error; - error = (uap->mcp == NULL) ? EINVAL : 0; + if ((ku = td->td_upcall) == NULL || TD_CAN_UNBIND(td)) + return (EINVAL); + error = (uap->tmbx == NULL) ? EINVAL : 0; if (!error) - error = copyin(uap->mcp, &mc, sizeof(mc)); - if (!error && uap->loc != NULL) - error = (suword(uap->loc, uap->val) != 0) ? EINVAL : 0; + error = copyin(uap->tmbx, &tmbx, sizeof(tmbx)); + if (!error && (uap->flags & KSE_SWITCHIN_SETTMBX)) + error = (suword(&ku->ku_mailbox->km_curthread, + (long)uap->tmbx) != 0 ? EINVAL : 0); if (!error) - error = set_mcontext(td, &mc); + error = set_mcontext(td, &tmbx.tm_context.uc_mcontext); + if (!error) { + if (uap->flags & KSE_SWITCHIN_SETTMBX) { + td->td_mailbox = uap->tmbx; + mtx_lock_spin(&sched_lock); + td->td_flags |= TDF_CAN_UNBIND; + mtx_unlock_spin(&sched_lock); + } + } return ((error == 0) ? EJUSTRETURN : error); } |