Re: notebook freezes

From: Bruce Evans <bde_at_zeta.org.au>
Date: Sun, 4 Mar 2007 23:27:48 +1100 (EST)
On Fri, 2 Mar 2007, Stefan Ehmann wrote:

> On Thursday 01 March 2007 16:12, Stefan Ehmann wrote:
>> My few days old -current freezes if I press Fn-F6 (this is the combination
>> to adjust display brightness) if I've done a suspend/resume before.
>> Directly after boot it works fine.
> ...
> So I did a binary search.
>
> src/sys/i386/isa/clock.c r1.231 causes my notebook to freeze.
>
> Reverting this change in a CURRENT from today fixes the problem.
>
> The notebook is still pingable in this state. I experienced some other random
> hangs recently but don't know yet if those are related.

Oops.  If suspend/resume clobbers the RTC state (which we already have code
to restore), then it can clobber the RTC index (which even the restoral code
assumes is unclobbered).  Try this fix.

%%%
Index: clock.c
===================================================================
RCS file: /home/ncvs/src/sys/i386/isa/clock.c,v
retrieving revision 1.234
diff -u -2 -r1.234 clock.c
--- clock.c	4 Mar 2007 04:55:19 -0000	1.234
+++ clock.c	4 Mar 2007 11:58:00 -0000
_at__at_ -580,4 +582,5 _at__at_
  	/* Restore all of the RTC's "status" (actually, control) registers. */
  	/* XXX locking is needed for RTC access. */
+	rtc_reg = -1;
  	writertc(RTC_STATUSB, RTCSB_24HR);
  	writertc(RTC_STATUSA, rtc_statusa);
%%%

A similar fix might be needed for amd64, but amd64 doesn't have a resume
hook for putting it in.  The RTC index might get clobbered even if the
data registers aren't.

I don't know how any of this works with ACPI.  AFAIK (not far), the resume
hook is only called for APM.

I think the resume hook is not actually called on your system since
it would fix up the RTC index as a side effect of accessing 2 different
RTC registers.  At worst, if it is called then it might do the following:
- write garbage to the current RTC register, and fail to mask interrupts.
   This only happens if on resume rtc_reg is RTC_STATUSB but the physical
   index is different.  If RTC interrupts are used (which is normal if
   ACPI timer interrups are not used), then rtc_reg is normally RTC_INTR
   so there is no problem.  Otherwise, there might be no problem because
   the last RTC access might be to RTC_YEAR for inittodr().
- write the correct value to RTC_STATUSA, but lose if the RTC interrupt
   disabling in the previous access was critical.
- write the correct value to RTC_STATUSB.
   disabling in the previous access was critical, and end up with a
   consistent index.

Bruce
Received on Sun Mar 04 2007 - 11:27:52 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:39:06 UTC