Bug in kse_switchin()?
Andrew Belashov
bel at orel.ru
Tue Sep 21 06:35:55 PDT 2004
Hello!
See sys/kern/kern_kse.c
In line with "suword32(&uap->tmbx->tm_lwp, td->td_tid)" kernel
not check return value (error state). This is correct?
---[sys/kern/kern_kse.c]--------------------------------------
int
kse_switchin(struct thread *td, struct kse_switchin_args *uap)
{
struct kse_thr_mailbox tmbx;
struct kse_upcall *ku;
int error;
if ((ku = td->td_upcall) == NULL || TD_CAN_UNBIND(td))
return (EINVAL);
error = (uap->tmbx == NULL) ? EINVAL : 0;
if (!error)
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, &tmbx.tm_context.uc_mcontext);
if (!error) {
suword32(&uap->tmbx->tm_lwp, td->td_tid);
if (uap->flags & KSE_SWITCHIN_SETTMBX) {
td->td_mailbox = uap->tmbx;
td->td_pflags |= TDP_CAN_UNBIND;
}
if (td->td_proc->p_flag & P_TRACED) {
if (tmbx.tm_dflags & TMDF_SSTEP)
ptrace_single_step(td);
else
ptrace_clear_single_step(td);
if (tmbx.tm_dflags & TMDF_SUSPEND) {
mtx_lock_spin(&sched_lock);
/* fuword can block, check again */
if (td->td_upcall)
ku->ku_flags |= KUF_DOUPCALL;
mtx_unlock_spin(&sched_lock);
}
}
}
return ((error == 0) ? EJUSTRETURN : error);
}
--------------------------------------------------------------
On FreeBSD/sparc64 suword32() in this place generate trap "memory address
not aligned (kernel)", and kse_switchin() returning EJUSTRETURN.
How it to correct?
--
With best regards,
Andrew Belashov.
More information about the freebsd-threads
mailing list