Date: Sun, 11 Jul 2010 16:58:07 +0200 From: Gabor Kovesdan <gabor@FreeBSD.org> To: Dimitry Andric <dimitry@andric.com> Cc: FreeBSD Hackers <hackers@freebsd.org> Subject: Re: strange problem with int64_t variables Message-ID: <4C39DBFF.2000307@FreeBSD.org> In-Reply-To: <4C39DB09.6010808@andric.com> References: <4C39D92F.4050605@FreeBSD.org> <4C39DB09.6010808@andric.com>
next in thread | previous in thread | raw e-mail | index | archive | help
Em 2010.07.11. 16:54, Dimitry Andric escreveu: > On 2010-07-11 16:46, Gabor Kovesdan wrote: > >> I have two int64_t variables in kernel code, first is stored internally >> and the second one is passed from a syscall argument. When I print them >> with printf %lld modifier, the internal one behaves correctly but the >> other one I pass from a syscall has a corrupted value. If I pass 1, it >> prints out 3735348794091372545. I'm not doing anything special with it >> just reading it out from the struct that was generated with make sysent. >> > Since 3735348794091372545 is 0x33d69ff000000001, it looks like the upper > word got corrupted somehow. Maybe some part of it got non-atomically > assigned? Maybe the wrong word was read? It is hard to tell without > code... :) > Userland syscall calling: killjob(getjid(), SIGINT); //getjid() returns 1 this case, whose type is jid_t Kernel code: int killjob(struct thread *td, struct killjob_args *uap) { struct jobentry *jp, *jtmp; struct procentry *pp, *ptmp; JOBLIST_WLOCK; LIST_FOREACH_SAFE(jp,&irix_joblist, entries, jtmp) { if (jp->jid == uap->jid) { /* never reached code, comparison always fail because of corrupted value */ } } JOBLIST_WUNLOCK; /* not such job */ td->td_retval[0] = -1; return (ENOJOB); } Gabor
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4C39DBFF.2000307>