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

From: Shawn Webb <shawn.webb_at_hardenedbsd.org>
Date: Fri, 04 Mar 2022 17:52:26 UTC
On Fri, Mar 04, 2022 at 10:13:54AM -0500, Mark Johnston wrote:
> 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;

Great! I'll give this patch a try and report back.

-- 
Shawn Webb
Cofounder / Security Engineer
HardenedBSD

https://git.hardenedbsd.org/hardenedbsd/pubkeys/-/raw/master/Shawn_Webb/03A4CBEBB82EA5A67D9F3853FF2E67A277F8E1FA.pub.asc