From patchwork Tue Aug 20 13:21:40 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Zack Weinberg X-Patchwork-Id: 1150145 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=sourceware.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=libc-alpha-return-104582-incoming=patchwork.ozlabs.org@sourceware.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=panix.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; secure) header.d=sourceware.org header.i=@sourceware.org header.b="F5lh9rXj"; dkim-atps=neutral Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 46CWgh3JmYz9s00 for ; Tue, 20 Aug 2019 23:22:56 +1000 (AEST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:cc:subject:date:message-id :mime-version:content-type:content-transfer-encoding; q=dns; s= default; b=Uk47r167gma8JfbBm52Z44D+bsDE68wa+yrJay8hSrPaX2/TFqbdy fyeMa/V9nTWMvgbzWriEAEcrGI8WXkeOTH5zTtuYULYd9roPzE9Hu9ui/9MUvmP1 akGEEbOJthsAgO3PhhSW978TWiP5FAQkczPdRuqrN2aPyQWS2iK0Zw= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:cc:subject:date:message-id :mime-version:content-type:content-transfer-encoding; s=default; bh=TY1Da+vVGAB4E7Sb6GEcL6986ao=; b=F5lh9rXjLelb82/I4wKEhMIf+wCn K3fRtm3cAJCL/ibcvBpIKVHAxMHVi2Q+y6Rjxu22VOd+dNja9QnR00oARNCIZDe3 fNbPAkoVf9OktBisYLBykpEyNZ5hUXile/beuisSEGxM4hNC8+1yUsj3KnDOqU0t 4QGL8B2wO7ojQGQ= Received: (qmail 48824 invoked by alias); 20 Aug 2019 13:22:05 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 48449 invoked by uid 89); 20 Aug 2019 13:22:02 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-10.1 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_2, GIT_PATCH_3, SPF_HELO_PASS, SPF_PASS autolearn=ham version=3.3.1 spammy=degree X-HELO: l2mail1.panix.com From: Zack Weinberg To: libc-alpha@sourceware.org Cc: Joseph Myers , Florian Weimer , Lukasz Majewski , Alistair Francis , Stepan Golosunov , Arnd Bergmann Subject: [PATCH 00/12] Y2038 preparation: use clock_[gs]ettime to implement the other time-getting and -setting functions Date: Tue, 20 Aug 2019 09:21:40 -0400 Message-Id: <20190820132152.24100-1-zackw@panix.com> MIME-Version: 1.0 This patchset aims to make the Y2038 project a little easier by implementing the other time-getting and time-setting functions (time, ftime, stime, gettimeofday, and settimeofday) in terms of clock_gettime and clock_settime. Internal uses of (__)gettimeofday are also all changed to __clock_gettime. Internal uses of time() are mostly left alone, since time() is easier and clearer when you don’t care about sub-second resolution and don’t need a struct timespec for some other reason. As a consequence, gettimeofday will no longer report crude timezone information under any circumstances. If its ‘tzp’ argument is not NULL, it will write zeroes to both fields of the ‘struct timezone’, even if the gettimeofday system call exists and would have produced different output. Similarly, ftime will always write zeroes to the timezone and dstflag fields of ‘struct timeb’. Joseph Myers raised an objection to this change; I rebutted the objection, and he did not reply; I do not think either of us will persuade the other, so I’m formally asking for a third maintainer to make a decision. settimeofday _will_ still call the settimeofday system call and pass down a non-null ‘tzp’ argument if it receives one, but, if _both_ of its arguments are non-null, it will fail and set errno to EINVAL. Also, its invocation of a settimeofday system call goes through an internal sysdep function called __settimezone. On the Hurd this is an unconditional ENOSYS stub, and on Linux it’s an ENOSYS stub when __NR_settimeofday is not defined. Relatedly, there is a macro-based hack to issue warnings when gettimeofday is called with a ‘tzp’ argument that is not a compile-time null pointer. I think this is probably a better option at this stage than various suggested alternatives (e.g. renaming the fields of ‘struct timezone’, or removing it from sys/time.h altogether) because the remaining valid uses of settimeofday with non-null ‘tzp’ should still be able to use struct timezone. The hack is in a separate patch because, well, it’s a hack and I’m hoping someone has a better implementation idea. (I tried an inline function instead of a macro, but it threw false positives all over the place on ‘gettimeofday (&tv, 0)’...) This patchset also includes an overhaul of Linux/Alpha’s GLIBC_2.0 compatibility symbols for several system calls that consume or produce struct timeval. It appears that early releases of glibc and/or Linux for Alpha attempted to achieve some degree of binary compatibility with OSF/1, but this came at the expense of using 32-bit time_t inside struct timeval. Up till now, we were invoking compatibility system calls from the compatibility symbols. This patch changes them to wrap the 64-bit implementations and convert between 32-bit and 64-bit struct timeval in user space. If a 64-bit tv_sec value returned by the kernel is found to be greater than INT32_MAX, the caller will receive a saturated 32-bit struct timeval, { INT32_MAX, 0 }, and the function will return -1 with errno set to EOVERFLOW. Because many of these calls are assumed unable to fail, we make sure to write all the fields of any output data structure even when this happens. I did this partially because it simplified conversion of gettimeofday to call clock_gettime, and partially as a worked example of the semantics that I think are probably best for the 32-bit time_t compatibility symbols we’re going to have to add for many other architectures. Comments on these semantics are requested. This patchset also includes a partial revision of manual/time.texi. clock_gettime and clock_settime are now documented, and the obsolescent status of stime, settimeofday, and gettimeofday is clearer. I only documented CLOCK_REALTIME and CLOCK_MONOTONIC, because most of the other clock constants are either extremely Linux-specific or they have to do with measuring CPU time, and I didn’t touch the measuring-CPU-time part of time.texi. (That part also deserves a rewrite, but I don’t know enough about the topic and this patchset is already long enough.) Finally, there is a case for demoting ftime and stime to compatibility symbols and removing their public prototypes (for ftime, we would stop installing altogether). I tried to investigate how much this might break, using codesearch.debian.net, but the identifiers ‘ftime’ and ‘stime’ turn out to be heavily used for unrelated purposes, so I didn’t get anywhere. Zack Weinberg (12): Remove implementations of clock_[gs]ettime using [gs]ettimeofday. Change most internal uses of __gettimeofday to __clock_gettime. Don’t use the argument to time. Use clock_settime to implement stime. Use clock_settime to implement settimeofday. Use clock_gettime to implement time. Use clock_gettime to implement ftime. Use clock_gettime to implement gettimeofday. Finish move of clock_* functions to libc. Warn when gettimeofday is called with non-null tzp argument. Linux/Alpha: don’t use timeval32 system calls. Revise the documentation of ‘simple calendar time’. NEWS | 53 +- include/sys/time.h | 7 +- include/time.h | 4 +- inet/deadline.c | 9 +- login/logout.c | 9 +- login/logwtmp.c | 7 +- manual/filesys.texi | 2 +- manual/llio.texi | 10 +- manual/threads.texi | 2 +- manual/time.texi | 1062 +++++++++-------- misc/syslog.c | 2 +- nis/nis_call.c | 4 +- nptl/pthread_join_common.c | 7 +- nptl/pthread_mutex_timedlock.c | 7 +- nscd/nscd_helper.c | 24 +- resolv/gai_misc.c | 6 +- resolv/gai_suspend.c | 6 +- resolv/res_send.c | 6 +- rt/Makefile | 15 +- rt/Versions | 7 +- rt/clock-compat.c | 63 - string/strfry.c | 2 +- sunrpc/auth_des.c | 19 +- sunrpc/auth_unix.c | 9 +- sunrpc/create_xid.c | 6 +- sunrpc/svcauth_des.c | 7 +- support/support_test_main.c | 14 +- sysdeps/generic/memusage.h | 16 +- .../mach/{gettimeofday.c => clock_gettime.c} | 25 +- .../hurd/{settimeofday.c => clock_settime.c} | 27 +- sysdeps/mach/hurd/getitimer.c | 3 +- sysdeps/mach/hurd/i386/libc.abilist | 1 - sysdeps/mach/hurd/i386/librt.abilist | 5 - sysdeps/mach/hurd/setitimer.c | 3 +- sysdeps/mach/hurd/times.c | 6 +- sysdeps/mach/nanosleep.c | 33 +- sysdeps/mach/sleep.c | 4 +- sysdeps/mach/usleep.c | 5 - sysdeps/posix/gettimeofday.c | 67 -- sysdeps/posix/tempname.c | 9 +- sysdeps/posix/time.c | 40 - sysdeps/pthread/aio_misc.c | 6 +- sysdeps/pthread/aio_suspend.c | 6 +- sysdeps/unix/clock_gettime.c | 64 - sysdeps/unix/make-syscalls.sh | 2 +- sysdeps/unix/syscalls.list | 2 - .../unix/sysv/linux/aarch64/gettimeofday.c | 71 -- sysdeps/unix/sysv/linux/aarch64/init-first.c | 7 +- sysdeps/unix/sysv/linux/aarch64/libc-vdso.h | 2 - sysdeps/unix/sysv/linux/aarch64/libc.abilist | 1 - sysdeps/unix/sysv/linux/alpha/Makefile | 2 +- sysdeps/unix/sysv/linux/alpha/Versions | 1 - sysdeps/unix/sysv/linux/alpha/adjtime.c | 70 +- .../linux/{time.c => alpha/gettimeofday.c} | 31 +- sysdeps/unix/sysv/linux/alpha/libc.abilist | 2 - sysdeps/unix/sysv/linux/alpha/librt.abilist | 5 - sysdeps/unix/sysv/linux/alpha/osf_adjtime.c | 135 +++ sysdeps/unix/sysv/linux/alpha/osf_getitimer.c | 48 + sysdeps/unix/sysv/linux/alpha/osf_getrusage.c | 44 + .../unix/sysv/linux/alpha/osf_gettimeofday.c | 53 + sysdeps/unix/sysv/linux/alpha/osf_setitimer.c | 55 + .../unix/sysv/linux/alpha/osf_settimeofday.c | 51 + .../ftime.c => sysv/linux/alpha/osf_utimes.c} | 34 +- .../linux/alpha/osf_wait4.c} | 51 +- sysdeps/unix/sysv/linux/alpha/settimeofday.c | 22 + sysdeps/unix/sysv/linux/alpha/syscalls.list | 13 +- sysdeps/unix/sysv/linux/alpha/tv32-compat.h | 151 +++ sysdeps/unix/sysv/linux/arm/init-first.c | 7 +- sysdeps/unix/sysv/linux/arm/libc-vdso.h | 2 - sysdeps/unix/sysv/linux/arm/libc.abilist | 1 - sysdeps/unix/sysv/linux/arm/librt.abilist | 5 - sysdeps/unix/sysv/linux/clock_settime.c | 1 + sysdeps/unix/sysv/linux/csky/libc.abilist | 1 - sysdeps/unix/sysv/linux/ftime.c | 3 - sysdeps/unix/sysv/linux/gettimeofday.c | 39 - sysdeps/unix/sysv/linux/hppa/libc.abilist | 1 - sysdeps/unix/sysv/linux/hppa/librt.abilist | 5 - sysdeps/unix/sysv/linux/i386/gettimeofday.c | 35 - sysdeps/unix/sysv/linux/i386/libc.abilist | 1 - sysdeps/unix/sysv/linux/i386/librt.abilist | 5 - sysdeps/unix/sysv/linux/i386/time.c | 34 - sysdeps/unix/sysv/linux/ia64/libc.abilist | 1 - sysdeps/unix/sysv/linux/ia64/librt.abilist | 5 - .../sysv/linux/m68k/coldfire/libc.abilist | 1 - .../sysv/linux/m68k/coldfire/librt.abilist | 5 - .../unix/sysv/linux/m68k/m680x0/libc.abilist | 1 - .../unix/sysv/linux/m68k/m680x0/librt.abilist | 5 - .../unix/sysv/linux/microblaze/libc.abilist | 1 - .../unix/sysv/linux/microblaze/librt.abilist | 5 - sysdeps/unix/sysv/linux/mips/init-first.c | 7 +- sysdeps/unix/sysv/linux/mips/libc-vdso.h | 2 - .../sysv/linux/mips/mips32/fpu/libc.abilist | 1 - .../unix/sysv/linux/mips/mips32/librt.abilist | 5 - .../sysv/linux/mips/mips32/nofpu/libc.abilist | 1 - .../unix/sysv/linux/mips/mips64/librt.abilist | 5 - .../sysv/linux/mips/mips64/n32/libc.abilist | 1 - .../sysv/linux/mips/mips64/n64/libc.abilist | 1 - sysdeps/unix/sysv/linux/nios2/libc.abilist | 1 - sysdeps/unix/sysv/linux/powerpc/Versions | 1 - .../unix/sysv/linux/powerpc/gettimeofday.c | 85 -- sysdeps/unix/sysv/linux/powerpc/init-first.c | 13 +- sysdeps/unix/sysv/linux/powerpc/libc-vdso.h | 2 - .../linux/powerpc/powerpc32/fpu/libc.abilist | 1 - .../linux/powerpc/powerpc32/librt.abilist | 5 - .../powerpc/powerpc32/nofpu/libc.abilist | 1 - .../linux/powerpc/powerpc64/be/libc.abilist | 1 - .../linux/powerpc/powerpc64/be/librt.abilist | 5 - .../linux/powerpc/powerpc64/le/libc.abilist | 1 - sysdeps/unix/sysv/linux/powerpc/time.c | 84 -- sysdeps/unix/sysv/linux/riscv/init-first.c | 10 +- sysdeps/unix/sysv/linux/riscv/libc-vdso.h | 2 - .../unix/sysv/linux/riscv/rv64/libc.abilist | 1 - sysdeps/unix/sysv/linux/s390/init-first.c | 9 +- sysdeps/unix/sysv/linux/s390/libc-vdso.h | 3 - .../unix/sysv/linux/s390/s390-32/libc.abilist | 1 - .../sysv/linux/s390/s390-32/librt.abilist | 5 - .../unix/sysv/linux/s390/s390-64/libc.abilist | 1 - .../sysv/linux/s390/s390-64/librt.abilist | 5 - sysdeps/unix/sysv/linux/settimezone.c | 39 + sysdeps/unix/sysv/linux/sh/libc.abilist | 1 - sysdeps/unix/sysv/linux/sh/librt.abilist | 5 - sysdeps/unix/sysv/linux/sparc/init-first.c | 8 +- sysdeps/unix/sysv/linux/sparc/libc-vdso.h | 2 - .../sysv/linux/sparc/sparc32/libc.abilist | 1 - .../sysv/linux/sparc/sparc32/librt.abilist | 5 - .../sysv/linux/sparc/sparc64/libc.abilist | 1 - .../sysv/linux/sparc/sparc64/librt.abilist | 5 - sysdeps/unix/sysv/linux/sparc/sparc64/time.c | 1 - sysdeps/unix/sysv/linux/syscalls.list | 1 - sysdeps/unix/sysv/linux/x86/gettimeofday.c | 61 - sysdeps/unix/sysv/linux/x86/time.c | 59 - .../unix/sysv/linux/x86_64/64/libc.abilist | 1 - .../unix/sysv/linux/x86_64/64/librt.abilist | 5 - .../unix/sysv/linux/x86_64/x32/libc.abilist | 1 - .../unix/sysv/linux/x86_64/x32/librt.abilist | 5 - .../unix/sysv/linux/x86_64/x32/syscalls.list | 2 - time/Makefile | 8 +- time/Versions | 2 +- {rt => time}/clock_getcpuclockid.c | 0 {rt => time}/clock_getres.c | 0 {rt => time}/clock_gettime.c | 0 {rt => time}/clock_nanosleep.c | 0 {rt => time}/clock_settime.c | 1 + time/ftime.c | 26 +- time/getdate.c | 2 +- time/gettimeofday.c | 30 +- time/settimeofday.c | 24 +- sysdeps/unix/stime.c => time/settimezone.c | 23 +- time/stime.c | 15 +- time/sys/time.h | 36 +- time/time.c | 17 +- {rt => time}/tst-clock.c | 0 {rt => time}/tst-clock2.c | 0 {rt => time}/tst-clock_nanosleep.c | 0 {rt => time}/tst-cpuclock1.c | 0 time/tst_wcsftime.c | 2 +- 156 files changed, 1580 insertions(+), 1775 deletions(-) delete mode 100644 rt/clock-compat.c rename sysdeps/mach/{gettimeofday.c => clock_gettime.c} (67%) rename sysdeps/mach/hurd/{settimeofday.c => clock_settime.c} (71%) delete mode 100644 sysdeps/posix/gettimeofday.c delete mode 100644 sysdeps/posix/time.c delete mode 100644 sysdeps/unix/clock_gettime.c delete mode 100644 sysdeps/unix/sysv/linux/aarch64/gettimeofday.c rename sysdeps/unix/sysv/linux/{time.c => alpha/gettimeofday.c} (64%) create mode 100644 sysdeps/unix/sysv/linux/alpha/osf_adjtime.c create mode 100644 sysdeps/unix/sysv/linux/alpha/osf_getitimer.c create mode 100644 sysdeps/unix/sysv/linux/alpha/osf_getrusage.c create mode 100644 sysdeps/unix/sysv/linux/alpha/osf_gettimeofday.c create mode 100644 sysdeps/unix/sysv/linux/alpha/osf_setitimer.c create mode 100644 sysdeps/unix/sysv/linux/alpha/osf_settimeofday.c rename sysdeps/unix/{bsd/ftime.c => sysv/linux/alpha/osf_utimes.c} (60%) rename sysdeps/unix/{clock_settime.c => sysv/linux/alpha/osf_wait4.c} (55%) create mode 100644 sysdeps/unix/sysv/linux/alpha/settimeofday.c create mode 100644 sysdeps/unix/sysv/linux/alpha/tv32-compat.h delete mode 100644 sysdeps/unix/sysv/linux/ftime.c delete mode 100644 sysdeps/unix/sysv/linux/gettimeofday.c delete mode 100644 sysdeps/unix/sysv/linux/i386/gettimeofday.c delete mode 100644 sysdeps/unix/sysv/linux/i386/time.c delete mode 100644 sysdeps/unix/sysv/linux/powerpc/gettimeofday.c delete mode 100644 sysdeps/unix/sysv/linux/powerpc/time.c create mode 100644 sysdeps/unix/sysv/linux/settimezone.c delete mode 100644 sysdeps/unix/sysv/linux/sparc/sparc64/time.c delete mode 100644 sysdeps/unix/sysv/linux/x86/gettimeofday.c delete mode 100644 sysdeps/unix/sysv/linux/x86/time.c rename {rt => time}/clock_getcpuclockid.c (100%) rename {rt => time}/clock_getres.c (100%) rename {rt => time}/clock_gettime.c (100%) rename {rt => time}/clock_nanosleep.c (100%) rename {rt => time}/clock_settime.c (96%) rename sysdeps/unix/stime.c => time/settimezone.c (67%) rename {rt => time}/tst-clock.c (100%) rename {rt => time}/tst-clock2.c (100%) rename {rt => time}/tst-clock_nanosleep.c (100%) rename {rt => time}/tst-cpuclock1.c (100%)