Re: git: 84369dd52369 - main - x86: Probe the TSC frequency earlier

From: Mark Johnston <markj_at_freebsd.org>
Date: Fri, 04 Mar 2022 15:13:54 UTC
On Fri, Mar 04, 2022 at 09:24:47AM -0500, Shawn Webb wrote:
> On Tue, Mar 01, 2022 at 02:39:55PM +0000, Mark Johnston wrote:
> > The branch main has been updated by markj:
> > 
> > URL: https://cgit.FreeBSD.org/src/commit/?id=84369dd52369cbae28970dca20a53d3de1719907
> > 
> > commit 84369dd52369cbae28970dca20a53d3de1719907
> > Author:     Mark Johnston <markj@FreeBSD.org>
> > AuthorDate: 2022-03-01 14:39:35 +0000
> > Commit:     Mark Johnston <markj@FreeBSD.org>
> > CommitDate: 2022-03-01 14:39:35 +0000
> > 
> >     x86: Probe the TSC frequency earlier
> >     
> >     This lets us use the TSC to implement early DELAY, limiting the use of
> >     the sometimes-unreliable 8254 PIT.
> >     
> >     PR:             262155
> >     Reviewed by:    emaste
> >     Tested by:      emaste, mike tancsa <mike@sentex.net>, Stefan Hegnauer <stefan.hegnauer@gmx.ch>
> >     MFC after:      1 month
> >     Sponsored by:   The FreeBSD Foundation
> >     Differential Revision:  https://reviews.freebsd.org/D34367
> > ---
> >  sys/amd64/amd64/machdep.c |  14 +++++-
> >  sys/i386/i386/machdep.c   |  11 ++++-
> >  sys/x86/include/clock.h   |   3 +-
> >  sys/x86/isa/clock.c       |   4 +-
> >  sys/x86/x86/tsc.c         | 123 +++++++++++++++++++++++++---------------------
> >  5 files changed, 94 insertions(+), 61 deletions(-)
> 
> Hey Mark,
> 
> Something about this commit breaks booting in Hyper-V. Reverting this
> particular commit makes Hyper-V happy again.

The patch below might be sufficient.  I'll test it in Azure but it'll
take me some time.

diff --git a/sys/x86/x86/delay.c b/sys/x86/x86/delay.c
index c767250954da..95b994b15f81 100644
--- a/sys/x86/x86/delay.c
+++ b/sys/x86/x86/delay.c
@@ -89,7 +89,7 @@ delay_tc(int n)
 		return (1);
 	}
 	tc = timecounter;
-	if (tc->tc_quality <= 0)
+	if (tc == NULL || tc->tc_quality <= 0)
 		return (0);
 	func = tc->tc_get_timecount;
 	mask = tc->tc_counter_mask;