git: 9470a2f7da48 - releng/13.1 - clockcalib: Fix an overflow bug

From: Mark Johnston <markj_at_FreeBSD.org>
Date: Thu, 05 May 2022 18:38:10 UTC
The branch releng/13.1 has been updated by markj:

URL: https://cgit.FreeBSD.org/src/commit/?id=9470a2f7da488f3c14051e39691fbfddcf2aa0fe

commit 9470a2f7da488f3c14051e39691fbfddcf2aa0fe
Author:     Mark Johnston <markj@FreeBSD.org>
AuthorDate: 2022-01-20 13:23:38 +0000
Commit:     Mark Johnston <markj@FreeBSD.org>
CommitDate: 2022-05-05 18:37:48 +0000

    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)
---
 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 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;