Skip site navigation (1)Skip section navigation (2)
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>