> 在 2015年9月14日,16:37,Arnd Bergmann <[email protected]> 写道:
> 
> On Sunday 13 September 2015 19:00:11 WEN Pingbo wrote:
>> proc_show only output string, so we can keep userspace untouched
>> while replacing timeval with timespec64 in kernel.
>> 
>> Not all timer in i8042 have y2038 risk(handshake, match timer, etc),
>> Replacements in those timer are just for consistency.
> 
> The patch looks mostly ok, a few details here:
> 
> - Please start the changelog with an explanation of what the driver does
>  and why that is a problem, e.g.
> 
> "The SDC real time clock driver internally uses an 'struct timeval' to
>  represent times, which will overflow on 32-bit machines in 2038.”
> 

Ok, I will rearrange it later. Thanks.

>> @@ -209,15 +209,15 @@ static inline int hp_sdc_rtc_read_rt(struct timeval 
>> *res) {
>>      tenms = (uint32_t)raw & 0xffffff;
>>      days  = (unsigned int)(raw >> 24) & 0xffff;
>> 
>> -    res->tv_usec = (suseconds_t)(tenms % 100) * 10000;
>> -    res->tv_sec =  (time_t)(tenms / 100) + days * 86400;
>> +    res->tv_nsec = (long)(tenms % 100) * 10000 * 1000;
> 
> For clarity, I would suggest changing the code to use the USEC_PER_SEC
> macro. We don't have a global SECONDS_PER_DAY macro unfortunately. If
> you are really keen, you could introduce one in include/linux/time64.h,
> otherwise just leave it as it is.

That make sense.

> 
>> +    res->tv_sec =  (time64_t)(tenms / 100) + days * 86400;
> 
> If I read this right, you still have a bug here: "days" is an "unsigned int"
> variable, and multiplying that with 86400 will overflow in 2106. We
> don't care that much about this overflow yet, but there is no reason
> to not get it right here if it's cheap.
> 
> If you move the type cast, it will be fine.

Yes, we need one more type cast here.

> 
>> @@ -452,36 +452,36 @@ static int hp_sdc_rtc_proc_show(struct seq_file *m, 
>> void *v)
>>      if (hp_sdc_rtc_read_rt(&tv)) {
>>              seq_puts(m, "i8042 rtc\t: READ FAILED!\n");
>>      } else {
>> -            seq_printf(m, "i8042 rtc\t: %ld.%02d seconds\n", 
>> -                         tv.tv_sec, (int)tv.tv_usec/1000);
>> +            seq_printf(m, "i8042 rtc\t: %lld.%02ld seconds\n",
>> +                         tv.tv_sec, (long)tv.tv_nsec/1000000L);
>>      }
>> 
> 
> The change from (int) to (long) is not necessary here, because the nanoseconds
> always fit in a 32bit int type.
> 
> However, the tv_sec variable is currently defined in a slightly awkward way,
> and is 'long' on 64-bit architectures but 'long long' on 32-bit architectures.
> 
> This means you get a compile warning for a type mismatch on 64-bit compilers
> that print a 'long' argument with %lld. The best workaround I've come up
> with is to add a cast to 'long long' or 's64', which is defined as 'long long'
> on all architectures.
> 
> To avoid problems like this, it's useful to build test with both 32-bit and
> 64-bit compilers, and to list in the changelog text what kind of testing
> you have done to verify the driver.

I didn’t notice that. It seems hp_sdc_rtc only available in m68k & hppa arch. I 
am still on the way to compile it correctly.

> 
>       Arnd

_______________________________________________
Y2038 mailing list
[email protected]
https://lists.linaro.org/mailman/listinfo/y2038

Reply via email to