From owner-freebsd-hackers@FreeBSD.ORG Sun Jul 11 14:58:13 2010 Return-Path: Delivered-To: hackers@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 372C5106567A for ; Sun, 11 Jul 2010 14:58:13 +0000 (UTC) (envelope-from gabor@FreeBSD.org) Received: from server.mypc.hu (server.mypc.hu [87.229.73.95]) by mx1.freebsd.org (Postfix) with ESMTP id B64018FC15 for ; Sun, 11 Jul 2010 14:58:12 +0000 (UTC) Received: from server.mypc.hu (localhost [127.0.0.1]) by server.mypc.hu (Postfix) with ESMTP id 44F8E14DC04E; Sun, 11 Jul 2010 16:58:11 +0200 (CEST) X-Virus-Scanned: amavisd-new at server.mypc.hu Received: from server.mypc.hu ([127.0.0.1]) by server.mypc.hu (server.mypc.hu [127.0.0.1]) (amavisd-new, port 10024) with LMTP id kKPDgbnudevF; Sun, 11 Jul 2010 16:58:09 +0200 (CEST) Received: from [192.168.1.105] (catv-80-99-92-167.catv.broadband.hu [80.99.92.167]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by server.mypc.hu (Postfix) with ESMTPSA id 234A414DC04A; Sun, 11 Jul 2010 16:58:09 +0200 (CEST) Message-ID: <4C39DBFF.2000307@FreeBSD.org> Date: Sun, 11 Jul 2010 16:58:07 +0200 From: Gabor Kovesdan User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-PT; rv:1.9.1.10) Gecko/20100512 Thunderbird/3.0.5 MIME-Version: 1.0 To: Dimitry Andric References: <4C39D92F.4050605@FreeBSD.org> <4C39DB09.6010808@andric.com> In-Reply-To: <4C39DB09.6010808@andric.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: FreeBSD Hackers Subject: Re: strange problem with int64_t variables X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 11 Jul 2010 14:58:13 -0000 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