Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 21 Sep 2004 17:35:50 +0400
From:      Andrew Belashov <bel@orel.ru>
To:        freebsd-threads@freebsd.org
Subject:   Bug in kse_switchin()?
Message-ID:  <41502E36.8070403@orel.ru>

next in thread | raw e-mail | index | archive | help
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.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?41502E36.8070403>