On Wed, 6 Mar 2002, Poul-Henning Kamp wrote:

> The only thing I know off right now is this thing from BDE which
> I havn't been able to verify yet:

I got the hang for all boots, but it was a local problem.  I had added
a nanouptime() call the tc_windup(), and this spins forever when
tc_windup() is called from tc_init() or switch_timecounter() (because
timecounter->generation is 0).  At least one of these calls is made
unconditionally at boot time, but there is normally no problem, at
least if WITNESS and KTR are not enabled (my default) because the
functions that spin on the generation update are not called.  But
interrupt activity might result in them being called, and WITNESS
and/or KTR call them if a lock is witnessed.

The following patch is the result of attempting to debug this.  I first
had to debug the debugger, since it has the same problem.

> ============================================================================
> From:    Bruce Evans <[EMAIL PROTECTED]>
> Subject: dummy_timecounter broken; breaks booting with -d
> To:      <[EMAIL PROTECTED]>
> Message-Id: <[EMAIL PROTECTED]>
> 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
>
>
> In message <20020306054514.GA395@gzl>, [EMAIL PROTECTED] 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)\?
> >
> >To Unsubscribe: send mail to [EMAIL PROTECTED]
> >with "unsubscribe freebsd-current" in the body of the message
> >
>
> --
> Poul-Henning Kamp       | UNIX since Zilog Zeus 3.20
> [EMAIL PROTECTED]         | TCP/IP since RFC 956
> FreeBSD committer       | BSD since 4.3-tahoe
> Never attribute to malice what can adequately be explained by incompetence.
>
> To Unsubscribe: send mail to [EMAIL PROTECTED]
> with "unsubscribe freebsd-current" in the body of the message

Bruce


To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-current" in the body of the message

Reply via email to