Messages in this thread Patch in this message | | | Date | Wed, 14 May 2008 13:21:08 +0200 | From | Andi Kleen <> | Subject | Re: [PATCH] common implementation of iterative div/mod |
| |
> It's: > jeremy@cosworth:~/hg/xen/paravirt/linux-x86_64$ gcc -v > Reading specs from /usr/lib/gcc/x86_64-linux/3.4.4/specs > Configured with: ../src/configure -v > --enable-languages=c,c++,java,f77,pascal,objc,ada,treelang --prefix=/usr > --libexecdir=/usr/lib --with-gxx-include-dir=/usr/include/c++/3.4 > --enable-shared --with-system-zlib --enable-nls > --without-included-gettext --program-suffix=-3.4 --enable-__cxa_atexit > --enable-libstdcxx-allocator=mt --enable-clocale=gnu > --enable-libstdcxx-debug --enable-java-gc=boehm --enable-java-awt=gtk > --disable-werror x86_64-linux > Thread model: posix > gcc version 3.4.4 20050314 (prerelease) (Debian 3.4.3-13) > > I think this is still a supported compiler, isn't it?
Yes. Here's a patch. You probably didn't see problems because you either don't have a glibc that supports the vdso or none of your programs gets the timezone from gettimeofday() [that is very obscure obsolete functionality anyways, normally it should be gotten from the disk locales]
-Andi
Use explicit copy in vdso_gettimeofday()
Jeremy's gcc 3.4 seems to be unable to inline a 8 byte memcpy. But the vdso doesn't support external references. Copy the structure members of struct timezone explicitely instead.
Signed-off-by: Andi Kleen <ak@linux.intel.com>
Index: linux/arch/x86/vdso/vclock_gettime.c =================================================================== --- linux.orig/arch/x86/vdso/vclock_gettime.c +++ linux/arch/x86/vdso/vclock_gettime.c @@ -106,9 +106,9 @@ int __vdso_gettimeofday(struct timeval * do_realtime((struct timespec *)tv); tv->tv_usec /= 1000; if (tz != NULL) { - /* This relies on gcc inlining the memcpy. We'll notice - if it ever fails to do so. */ - memcpy(tz, >od->sys_tz, sizeof(struct timezone)); + /* Don't use memcpy. Some old compilers fail to inline it */ + tz->tz_minuteswest = gtod->sys_tz.tz_minuteswest; + tz->tz_dsttime = gtod->sys_tz.tz_dsttime; } return 0; }
| |