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>
