RE: [PATCH] net: stmmac: Fix signed/unsigned wreckage
From: David Laight <hidden>
Date: 2021-11-16 13:06:57
From: Thomas Gleixner
Sent: 15 November 2021 15:21
The recent addition of timestamp correction to compensate the CDC error
introduced a subtle signed/unsigned bug in stmmac_get_tx_hwtstamp() while
it managed for some obscure reason to avoid that in stmmac_get_rx_hwtstamp().
The issue is:
s64 adjust = 0;
u64 ns;
adjust += -(2 * (NSEC_PER_SEC / priv->plat->clk_ptp_rate));
ns += adjust;
works by chance on 64bit, but falls apart on 32bit because the compiler
knows that adjust fits into 32bit and then treats the addition as a u64 +
u32 resulting in an off by ~2 seconds failure.The problem is earlier. NSEC_PER_SEC and clk_ptp_rate are almost certainly 32bit and unsigned. So you have: adjust = (s64)((u64)adjust + (u32)-(2 * (NSEC_PER_SEC/...))); David - Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK Registration No: 1397386 (Wales)