aboutsummaryrefslogtreecommitdiff
path: root/sys/kern/kern_kse.c
diff options
context:
space:
mode:
authorDavid Xu <davidxu@FreeBSD.org>2004-07-12 07:39:20 +0000
committerDavid Xu <davidxu@FreeBSD.org>2004-07-12 07:39:20 +0000
commit507b03186a50e9219c948ceb9c313a843c567872 (patch)
tree4533691922b23dce2a5e5d058b14848d4c8231d3 /sys/kern/kern_kse.c
parente5996857ad1f30f74f848a2c464c75a7ae28e59a (diff)
downloadsrc-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.c29
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);
}