Received: by 2002:ac0:a581:0:0:0:0:0 with SMTP id m1-v6csp437159imm; Thu, 21 Jun 2018 22:27:04 -0700 (PDT) X-Google-Smtp-Source: ADUXVKL1SVs2UkSuhF2lxn6Xorskq2wf+CoD7F36a+OYSE++iyyJzE67jnVwhM+8Ye0SVqxiHZkq X-Received: by 2002:a63:920c:: with SMTP id o12-v6mr104719pgd.233.1529645224282; Thu, 21 Jun 2018 22:27:04 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1529645224; cv=none; d=google.com; s=arc-20160816; b=u/xI8RBRDrOFioaFGhlnUTRmvGPj2RXKqA3n2YIxkWi6nrVYfntzFE8r35/AolskIV l8uPfqzqgzoY/LNxBkW7bGG+T3JDRN7LHS1qWQseiai5vjtc8Al5+GHF9Gtin5ULp0Rt yZIovcZOPFEo8Ab5a5jnwcJiIkhr4wCSEwSbNWXwt1LbKfw7Trg0GrAF/5oMmjgqyM0G Of+m90k5QB4j9UD0Y4QN68e/vtybbZGnah54PumpJG3RU8hmVe9Eoi3UrIitbwNYkQXY dKe24WP7lsLjcYSUwwYPV01/XDCklFPMX7Q5R25bEd94mToWdp/R3iB+2hBkqBzwUoIi +wdw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:references:message-id :in-reply-to:subject:cc:to:from:date:arc-authentication-results; bh=MT47qm+QAdLr1O0zARrSClcyRxDeXGEfC3cERup0HTQ=; b=Yv/P+oYoX56BRJCevLW1ztAwmH6EhYifYIM/aYkmzOzfnROzWOV82qmIx12TEs4+MA e335ex3BFlgAexlPadeGcY8+lFptmKAxIpAGVlcaZUcFr/Uj0eeYEqG40hM1k6ikqY9x UL0rzFo4AEm0ClD5R7VajIdmVi43h37/Jd1gvjtur+6AUW7OIwM6DBd91cabqC5ucg+S epnKwabXoxUkWnG1hrWnDyDF0wGbmM68wAgWa3RPek9Lp0W6jDaL6iukjPpDsPYeRmHO YbgNnmuA4uil/5po5twS/QMX1EEimGGlF5/76ydeZ5nIWAG6woxI4ebLQmvb2N4/Z2st rQYQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id bd1-v6si6777744plb.338.2018.06.21.22.26.48; Thu, 21 Jun 2018 22:27:04 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751274AbeFVF0I (ORCPT + 99 others); Fri, 22 Jun 2018 01:26:08 -0400 Received: from kvm5.telegraphics.com.au ([98.124.60.144]:51610 "EHLO kvm5.telegraphics.com.au" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750937AbeFVF0G (ORCPT ); Fri, 22 Jun 2018 01:26:06 -0400 Received: from localhost (localhost.localdomain [127.0.0.1]) by kvm5.telegraphics.com.au (Postfix) with ESMTP id 398672359B; Fri, 22 Jun 2018 01:26:02 -0400 (EDT) Date: Fri, 22 Jun 2018 15:26:52 +1000 (AEST) From: Finn Thain To: Arnd Bergmann cc: Paul Mackerras , Michael Ellerman , Geert Uytterhoeven , Joshua Thompson , Mathieu Malaterre , Benjamin Herrenschmidt , Greg Ungerer , linux-m68k@lists.linux-m68k.org, linuxppc-dev@lists.ozlabs.org, linux-kernel@vger.kernel.org, y2038@lists.linaro.org, Meelis Roos , Andreas Schwab Subject: Re: [PATCH 2/3] [v2] m68k: mac: use time64_t in RTC handling In-Reply-To: <20180619140229.3615110-2-arnd@arndb.de> Message-ID: References: <20180619140229.3615110-1-arnd@arndb.de> <20180619140229.3615110-2-arnd@arndb.de> MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, 19 Jun 2018, Arnd Bergmann wrote: > The real-time clock on m68k (and powerpc) mac systems uses an unsigned > 32-bit value starting in 1904, which overflows in 2040, about two years > later than everyone else, but this gets wrapped around in the Linux code > in 2038 already because of the deprecated usage of time_t and/or long in > the conversion. > > Getting rid of the deprecated interfaces makes it work until 2040 as > documented, and it could be easily extended by reinterpreting the > resulting time64_t as a positive number. For the moment, I'm adding a > WARN_ON() that triggers if we encounter a time before 1970 or after 2040 > (the two are indistinguishable). > I really don't like the WARN_ON(), but I'd prefer to address that in a separate patch rather than impede the progress of this patch (or of this series, since 3/3 seems to be unrelated). BTW, have you considered using the same wrap-around test (i.e. YY < 70) that we use for the year register in the other RTC chips? > This brings it in line with the corresponding code that we have on > powerpc macintosh. > Your recent patches to the Mac RTC routines (which are duplicated under arch/m68k and arch/powerpc) conflict with my recent patch that deduplicates the same code. So I will rebase and resubmit after someone merges these fixes. Apparently the PowerMac routines work now, which is sufficient testing for me; the PowerMac routines will get tested on m68k Macs when that code gets deduplicated again. BTW, Joshua tells me that he is not doing code review. We should probably drop the "M68K ON APPLE MACINTOSH" entry from the MAINTAINERS file, like the Amiga and Atari ports... -- > Signed-off-by: Arnd Bergmann > --- > v2: Fix varargs passing bug pointed out by Andreas Schwab > Fix a typo that caused a build regression > --- > arch/m68k/mac/misc.c | 62 +++++++++++++++++++++++++++++++++------------------- > 1 file changed, 39 insertions(+), 23 deletions(-) > > diff --git a/arch/m68k/mac/misc.c b/arch/m68k/mac/misc.c > index c68054361615..0a2572a6bfe5 100644 > --- a/arch/m68k/mac/misc.c > +++ b/arch/m68k/mac/misc.c > @@ -26,33 +26,39 @@ > > #include > > -/* Offset between Unix time (1970-based) and Mac time (1904-based) */ > +/* Offset between Unix time (1970-based) and Mac time (1904-based). Cuda and PMU > + * times wrap in 2040. If we need to handle later times, the read_time functions > + * need to be changed to interpret wrapped times as post-2040. */ > > #define RTC_OFFSET 2082844800 > > static void (*rom_reset)(void); > > #ifdef CONFIG_ADB_CUDA > -static long cuda_read_time(void) > +static time64_t cuda_read_time(void) > { > struct adb_request req; > - long time; > + time64_t time; > > if (cuda_request(&req, NULL, 2, CUDA_PACKET, CUDA_GET_TIME) < 0) > return 0; > while (!req.complete) > cuda_poll(); > > - time = (req.reply[3] << 24) | (req.reply[4] << 16) | > - (req.reply[5] << 8) | req.reply[6]; > + time = (u32)((req.reply[3] << 24) | (req.reply[4] << 16) | > + (req.reply[5] << 8) | req.reply[6]); > + > + /* it's either after year 2040, or the RTC has gone backwards */ > + WARN_ON(time < RTC_OFFSET); > + > return time - RTC_OFFSET; > } > > -static void cuda_write_time(long data) > +static void cuda_write_time(time64_t time) > { > struct adb_request req; > + u32 data = lower_32_bits(time + RTC_OFFSET); > > - data += RTC_OFFSET; > if (cuda_request(&req, NULL, 6, CUDA_PACKET, CUDA_SET_TIME, > (data >> 24) & 0xFF, (data >> 16) & 0xFF, > (data >> 8) & 0xFF, data & 0xFF) < 0) > @@ -86,26 +92,30 @@ static void cuda_write_pram(int offset, __u8 data) > #endif /* CONFIG_ADB_CUDA */ > > #ifdef CONFIG_ADB_PMU68K > -static long pmu_read_time(void) > +static time64_t pmu_read_time(void) > { > struct adb_request req; > - long time; > + time64_t time; > > if (pmu_request(&req, NULL, 1, PMU_READ_RTC) < 0) > return 0; > while (!req.complete) > pmu_poll(); > > - time = (req.reply[1] << 24) | (req.reply[2] << 16) | > - (req.reply[3] << 8) | req.reply[4]; > + time = (u32)((req.reply[1] << 24) | (req.reply[2] << 16) | > + (req.reply[3] << 8) | req.reply[4]); > + > + /* it's either after year 2040, or the RTC has gone backwards */ > + WARN_ON(time < RTC_OFFSET); > + > return time - RTC_OFFSET; > } > > -static void pmu_write_time(long data) > +static void pmu_write_time(time64_t time) > { > struct adb_request req; > + u32 data = lower_32_bits(time + RTC_OFFSET); > > - data += RTC_OFFSET; > if (pmu_request(&req, NULL, 5, PMU_SET_RTC, > (data >> 24) & 0xFF, (data >> 16) & 0xFF, > (data >> 8) & 0xFF, data & 0xFF) < 0) > @@ -269,8 +279,12 @@ static long via_read_time(void) > via_pram_command(0x89, &result.cdata[1]); > via_pram_command(0x8D, &result.cdata[0]); > > - if (result.idata == last_result.idata) > + if (result.idata == last_result.idata) { > + if (result.idata < RTC_OFFSET) > + result.idata += 0x100000000ull; > + > return result.idata - RTC_OFFSET; > + } > > if (++count > 10) > break; > @@ -291,11 +305,11 @@ static long via_read_time(void) > * is basically any machine with Mac II-style ADB. > */ > > -static void via_write_time(long time) > +static void via_write_time(time64_t time) > { > union { > __u8 cdata[4]; > - long idata; > + __u32 idata; > } data; > __u8 temp; > > @@ -585,12 +599,15 @@ void mac_reset(void) > * This function translates seconds since 1970 into a proper date. > * > * Algorithm cribbed from glibc2.1, __offtime(). > + * > + * This is roughly same as rtc_time64_to_tm(), which we should probably > + * use here, but it's only available when CONFIG_RTC_LIB is enabled. > */ > #define SECS_PER_MINUTE (60) > #define SECS_PER_HOUR (SECS_PER_MINUTE * 60) > #define SECS_PER_DAY (SECS_PER_HOUR * 24) > > -static void unmktime(unsigned long time, long offset, > +static void unmktime(time64_t time, long offset, > int *yearp, int *monp, int *dayp, > int *hourp, int *minp, int *secp) > { > @@ -602,11 +619,10 @@ static void unmktime(unsigned long time, long offset, > /* Leap years. */ > { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 } > }; > - long int days, rem, y, wday, yday; > + int days, rem, y, wday, yday; > const unsigned short int *ip; > > - days = time / SECS_PER_DAY; > - rem = time % SECS_PER_DAY; > + days = div_u64_rem(time, SECS_PER_DAY, &rem); > rem += offset; > while (rem < 0) { > rem += SECS_PER_DAY; > @@ -657,7 +673,7 @@ static void unmktime(unsigned long time, long offset, > > int mac_hwclk(int op, struct rtc_time *t) > { > - unsigned long now; > + time64_t now; > > if (!op) { /* read */ > switch (macintosh_config->adb_type) { > @@ -693,8 +709,8 @@ int mac_hwclk(int op, struct rtc_time *t) > __func__, t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, > t->tm_hour, t->tm_min, t->tm_sec); > > - now = mktime(t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, > - t->tm_hour, t->tm_min, t->tm_sec); > + now = mktime64(t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, > + t->tm_hour, t->tm_min, t->tm_sec); > > switch (macintosh_config->adb_type) { > case MAC_ADB_IOP: >