Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 21 Sep 2004 11:45:04 -0700
From:      Julian Elischer <julian@elischer.org>
To:        Andrew Belashov <bel@orel.ru>
Cc:        freebsd-threads@freebsd.org
Subject:   Re: Bug in kse_switchin()?
Message-ID:  <415076B0.2050401@elischer.org>
In-Reply-To: <41502E36.8070403@orel.ru>
References:  <41502E36.8070403@orel.ru>

next in thread | previous in thread | raw e-mail | index | archive | help


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"




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?415076B0.2050401>