From owner-freebsd-threads@FreeBSD.ORG Tue Sep 21 18:45:05 2004 Return-Path: Delivered-To: freebsd-threads@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 1A3D516A4CE for ; Tue, 21 Sep 2004 18:45:05 +0000 (GMT) Received: from mail.vicor-nb.com (bigwoop.vicor-nb.com [208.206.78.2]) by mx1.FreeBSD.org (Postfix) with ESMTP id E549D43D5E for ; Tue, 21 Sep 2004 18:45:04 +0000 (GMT) (envelope-from julian@elischer.org) Received: from elischer.org (julian.vicor-nb.com [208.206.78.97]) by mail.vicor-nb.com (Postfix) with ESMTP id 9380D7A3D2; Tue, 21 Sep 2004 11:45:04 -0700 (PDT) Message-ID: <415076B0.2050401@elischer.org> Date: Tue, 21 Sep 2004 11:45:04 -0700 From: Julian Elischer User-Agent: Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.3.1) Gecko/20030516 X-Accept-Language: en, hu MIME-Version: 1.0 To: Andrew Belashov References: <41502E36.8070403@orel.ru> In-Reply-To: <41502E36.8070403@orel.ru> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit cc: freebsd-threads@freebsd.org Subject: Re: Bug in kse_switchin()? X-BeenThere: freebsd-threads@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: Threading on FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 21 Sep 2004 18:45:05 -0000 Andrew Belashov wrote: > 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? yes and no. You are correct. It is never correct to "not check" however we have just looked at that location 7 lines earlier, so we know that the page in question is loaded and valid. This is is "prbably safe". Probably we should look at the error value also, even if this is true. > > ---[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. > _______________________________________________ > freebsd-threads@freebsd.org mailing list > http://lists.freebsd.org/mailman/listinfo/freebsd-threads > To unsubscribe, send any mail to > "freebsd-threads-unsubscribe@freebsd.org"