On Tue, 2007-06-26 at 09:50 +1000, Tony Breeds wrote: > Updated to include feedback from Ben and Segher, also reposition the > compare in the 64bit VDSO to catch all the references to tv.
> --- working.orig/arch/powerpc/kernel/vdso64/gettimeofday.S > +++ working/arch/powerpc/kernel/vdso64/gettimeofday.S <snippage> > @@ -32,6 +31,8 @@ V_FUNCTION_BEGIN(__kernel_gettimeofday) > mr r11,r3 /* r11 holds tv */ > mr r10,r4 /* r10 holds tz */ > bl V_LOCAL_FUNC(__get_datapage) /* get data page */ > + cmpldi r10,0 /* check if tv is NULL */ Whoops! r10 holds tz value, not tv. This should be r11. As is, a (64-bit) userspace app calling gettimeofday(&tv,NULL); will "silently fail", and the application is left using whatever old data happens to be in the tv structure. This affected my G5 (gentoo), most noticable when apps like 'ping' and nfs-mounts quit working properly. :-) patch follows momentarily... > + beq 2f > bl V_LOCAL_FUNC(__do_get_xsec) /* get xsec from tb & kernel */ > lis r7,15 /* r7 = 1000000 = USEC_PER_SEC */ > ori r7,r7,16960 > @@ -43,8 +44,8 @@ V_FUNCTION_BEGIN(__kernel_gettimeofday) > * XSEC_PER_SEC > */ > rldicl r0,r0,44,20 > - cmpldi cr0,r10,0 /* check if tz is NULL */ > std r0,TVAL64_TV_USEC(r11) /* store usec in tv */ > +2: cmpldi r10,0 /* check if tz is NULL */ > beq 1f > lwz r4,CFG_TZ_MINUTEWEST(r3)/* fill tz */ > lwz r5,CFG_TZ_DSTTIME(r3) > > Yours Tony > > linux.conf.au http://linux.conf.au/ || http://lca2008.linux.org.au/ > Jan 28 - Feb 02 2008 The Australian Linux Technical Conference! > > _______________________________________________ > Linuxppc-dev mailing list > Linuxppc-dev@ozlabs.org > https://ozlabs.org/mailman/listinfo/linuxppc-dev _______________________________________________ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev