Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 6 Mar 2002 22:47:47 +0900
From:      qhwt@myrealbox.com
To:        current@FreeBSD.ORG
Subject:   Re: Won't boot after the commits to timecounter code
Message-ID:  <20020306134746.GA342@gzl>
In-Reply-To: <91591.1015400958@critter.freebsd.dk>
References:  <20020306054514.GA395@gzl> <91591.1015400958@critter.freebsd.dk>

next in thread | previous in thread | raw e-mail | index | archive | help
On Wed, Mar 06, 2002 at 08:49:18AM +0100, Poul-Henning Kamp wrote:
> > In message <20020306054514.GA395@gzl>, qhwt@myrealbox.com writes:
> > >Hello.
> > >After upgrading to the kernel as of 2002-03-03 00:00:00(UTC), it stopped
> > >booting just after the message:
> > >
> > >Timecounter "i8254"  frequency 1193182 Hz
> > >
> > >With some debugging printf()'s inserted, I found it was tc->tc_get_timecount()
> > >called from tco_delta() called just after the bcopy() in tc_windup().
> > >So maybe the next place I have to look at is i8254_get_timecount(), which is in
> > >/sys/i386/isa/clock.c, but the last (effective) commit to this file is
> > >revision 1.180(at the end of January).
> > >
> > >I couldn't even drop into DDB; no response other than to power button.
> > >The last bootable(and stable so far) kernel is from 2002-02-24.
> > >I don't think this is caused by some leftover in the work directory
> > >since I always build kernels in a new empty directory under /usr/obj.
> > >
> > >Any (clue|fix)\?
>
> The only thing I know off right now is this thing from BDE which
> I havn't been able to verify yet:
>
>
>
> ============================================================================
> From:    Bruce Evans <bde@zeta.org.au>
> Subject: dummy_timecounter broken; breaks booting with -d
> To:      <phk@freebsd.org>
> Message-Id: <20020305075815.D2623-100000@gamplex.bde.org>
> Date:    Tue, 05 Mar 2002 08:09:26 +1100
> 
> %%%
> Index: kern_tc.c
> ===================================================================
> RCS file: /home/ncvs/src/sys/kern/kern_tc.c,v
> retrieving revision 1.116
> diff -u -2 -r1.116 kern_tc.c
> --- kern_tc.c	26 Feb 2002 09:16:27 -0000	1.116
> +++ kern_tc.c	4 Mar 2002 21:08:03 -0000
> @@ -192,4 +252,14 @@
>  		gen = tc->tc_generation;
>  		bintime2timeval(&tc->tc_offset, tvp);
> +		/*
> +		 * XXX dummy_timecounter is now broken.  Its tc_get_timecount
> +		 * needs to be called before it works, and that doesn't
> +		 * always happen naturally.  In particular, we spin forever
> +		 * here after booting with -d unless we do an unnatural call
> +		 * here, since the screen timeout code is always run on entry
> +		 * to ddb, and it calls here.
> +		 */
> +		if (gen == 0 && timecounter == &dummy_timecounter)
> +			(void)tc->tc_get_timecount(tc);
>  	} while (gen == 0 || gen != tc->tc_generation);
>  }
> %%%
> 
> Bruce

Hmm, this doesn't seem to change the situation.

I tried reverting the following files:
  /sys/sys/timetc.h:	1.46 -> 1.45
  /sys/kern/kern_tc.c:	1.116 -> 1.114
and managed to get into the single-user mode, but this of course doesn't solve
the problem.

I inserted a pair of printf() inside mtx_lock_spin/mtx_unlock_spin in
i8254_get_timecount() and it kept printing the message while tc_init()
was blocked, so I think it's blocked at mtx_lock_spin in i8254_get_timecount()
when called from tc_init(), but not when called from somewhere else.
(maybe an interrupt handler?)

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20020306134746.GA342>