strange problem with int64_t variables

pluknet pluknet at gmail.com
Mon Jul 12 07:29:38 UTC 2010


On 11 July 2010 18:58, Gabor Kovesdan <gabor at freebsd.org> wrote:
> 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
>

Looking at getjid() impl, I see you're trying to put jid_t into the
one register_t
which are 64-bit vs 32-bit capable respectively.
You need to cast so you put 64-bit into two 32-bit as done for e.g. lseek().

-- 
wbr,
pluknet


More information about the freebsd-hackers mailing list