From 58f49b7da7da50d1ea66b5d810a5e8769b5319f4 Mon Sep 17 00:00:00 2001 From: Mark Johnston Date: Thu, 20 Jan 2022 08:23:38 -0500 Subject: [PATCH] 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. Fixes: c2705ceaeb09 ("x86: Speed up clock calibration") Reviewed by: cperciva Sponsored by: The FreeBSD Foundation (cherry picked from commit c3196306f092e46008d5ffa626fbafe1f8a94848) --- sys/kern/subr_clockcalib.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sys/kern/subr_clockcalib.c b/sys/kern/subr_clockcalib.c index 2d6a8c31a9b..3e93dd0869b 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; -- 2.45.0