diff options
| author | Mark Johnston <markj@FreeBSD.org> | 2022-01-20 13:23:38 +0000 |
|---|---|---|
| committer | Mark Johnston <markj@FreeBSD.org> | 2022-05-05 18:37:48 +0000 |
| commit | 9470a2f7da488f3c14051e39691fbfddcf2aa0fe (patch) | |
| tree | 91bbdfa99b6d596a8a65ad7d4221f0cc9e0adbc2 | |
| parent | cd651fcc491c509e2f7d516c56410d3fdfb2be58 (diff) | |
clockcalib: Fix an overflow bug
tc_counter_mask is an unsigned int and in the TSC timecounter is equal
to UINT_MAX, so the addition tc->tc_counter_mask + 1 can overflow to 0,
resulting in a hang during boot.
Approved by: re (gjb)
Fixes: c2705ceaeb09 ("x86: Speed up clock calibration")
Reviewed by: cperciva
Sponsored by: The FreeBSD Foundation
(cherry picked from commit c3196306f092e46008d5ffa626fbafe1f8a94848)
(cherry picked from commit 58f49b7da7da50d1ea66b5d810a5e8769b5319f4)
| -rw-r--r-- | sys/kern/subr_clockcalib.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/sys/kern/subr_clockcalib.c b/sys/kern/subr_clockcalib.c index 2d6a8c31a9b9..3e93dd0869bf 100644 --- a/sys/kern/subr_clockcalib.c +++ b/sys/kern/subr_clockcalib.c @@ -108,7 +108,7 @@ clockcalib(uint64_t (*clk)(void), const char *clkname) clk1 = clk() - clk0; t1 = tc->tc_get_timecount(tc) & tc->tc_counter_mask; while (t1 + tadj < tlast) - tadj += tc->tc_counter_mask + 1; + tadj += (uint64_t)tc->tc_counter_mask + 1; tlast = t1 + tadj; t1 += tadj - t0; |
