Bug in kse_switchin()?

Julian Elischer julian at elischer.org
Tue Sep 21 11:45:05 PDT 2004



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 at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-threads
> To unsubscribe, send any mail to 
> "freebsd-threads-unsubscribe at freebsd.org"




More information about the freebsd-threads mailing list