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