notebook freezes
Stefan Ehmann
shoesoft at gmx.net
Mon Mar 5 10:40:57 UTC 2007
On Mon, 2007-03-05 at 20:39 +1100, Bruce Evans wrote:
> On Mon, 5 Mar 2007, Stefan Ehmann wrote:
>
> > On Mon, 2007-03-05 at 15:21 +1100, Bruce Evans wrote:
> >> On Sun, 4 Mar 2007, Stefan Ehmann wrote:
> >>> Oops, seems I somehow screwed up Bruce's patch on first try (pmtimer was
> >>> already in my config). Probably the aftermath of the lunar eclipse :)
> >>>
> >>> On my second try, timer_restore really gets called and it also fixes my
> >>> problem.
> >>
> >> Could you add some RTC accesses to determine exactly what state is
> >> inconsistent? Something like the following:
> >>
> >> cur_rtc_reg = inb(IO_RTC); /* Sloppy locking. */
> >> printf("cur_rtc_reg = %02x, rtc_reg = %02x\n", cur_rtc_reg, rtc_reg);
> >> rtc_reg = -1;
> >> cur_rtc_statusa = rtcin(RTC_STATUSA);
> >> printf(...);
> >> cur_rtc_statusb = rtcin(RTC_STATUSB);
> >> printf(...);
> >>
> >
> > Putting this on top of rtc_resume, I get this on resume (all values are
> > hexadecimal):
> >
> > cur_rtc_reg = ff, rtc_reg = 0c
> > cur_rtc_statusa = 29
> > cur_rtc_statusb = 42
>
> Thanks. 29 and 42 are unclobbered, but ff is just invalid. Maybe it is
> what the BIOS writes to indicate invalidity. 0xc is the register usually
> accessed (RTC_INTR).
>
> Now I want to know what is the result of using this invalid index.
> Read through this index using inb(IO_RTC + 1) and rtcin(rtc_reg) before
> changing rtc_reg (the results should be the same). On my VIA amd64
> system, the result of rtcin(0xff) is 0xff. Probably nothing there.
> This is is the worst possible result, since it ensures the problem
> pointed out in my commit of the initial fix -- rtcintr() will spin
> forever if it is called before rtc_restore(), waiting for one of
> the const bits in the 0xff result to become unset.
It's 0xc8 here.
More information about the freebsd-acpi
mailing list