Re: Suspend broken ?

From: John Baldwin <jhb_at_FreeBSD.org>
Date: Mon, 11 Jul 2005 11:01:28 -0400
On Saturday 09 July 2005 04:10 pm, Stefan Ehmann wrote:
> On Sat, 2005-07-09 at 15:17 -0400, John Baldwin wrote:
> > I think you just need to remove the extra { after the if statement on
> > line 539 at the end of the line.
>
> This and changing timer0_max_real_count to timer0_real_max_count made it
> compilable.
>
> But this time the system is immediately very slow (not just after
> suspend) and I get this strange error message on startup:
>
> calcru: runtime went backwards from 68378390 usec to 67512958 usec for
> pid 11 (idle: cpu0)

I had never set timer0_real_max_count. :(  One more time:

--- //depot/vendor/freebsd/src/sys/amd64/isa/clock.c	2005/07/05 20:15:24
+++ //depot/user/jhb/acpipci/amd64/isa/clock.c	2005/07/11 14:46:07
_at__at_ -101,6 +101,7 _at__at_
 #endif
 u_int	timer_freq = TIMER_FREQ;
 int	timer0_max_count;
+int	timer0_real_max_count;
 int	wall_cmos_clock;	/* wall CMOS clock assumed if != 0 */
 struct mtx clock_lock;
 #define	RTC_LOCK	mtx_lock_spin(&clock_lock)
_at__at_ -108,7 +109,6 _at__at_
 
 static	int	beeping = 0;
 static	const u_char daysinmonth[] = {31,28,31,30,31,30,31,31,30,31,30,31};
-static	u_int	hardclock_max_count;
 static	struct intsrc *i8254_intsrc;
 static	u_int32_t i8254_lastcount;
 static	u_int32_t i8254_offset;
_at__at_ -517,21 +517,24 _at__at_
 static void
 set_timer_freq(u_int freq, int intr_freq)
 {
-	int new_timer0_max_count;
+	int new_timer0_real_max_count;
 
 	i8254_timecounter.tc_frequency = freq;
 	mtx_lock_spin(&clock_lock);
 	timer_freq = freq;
-	new_timer0_max_count = hardclock_max_count = TIMER_DIV(intr_freq);
-	if (using_lapic_timer) {
+	if (using_lapic_timer)
+		new_timer0_real_max_count = 0x10000;
+	else
+		new_timer0_real_max_count = TIMER_DIV(intr_freq);
+	if (new_timer0_real_max_count != timer0_real_max_count) {
+		timer0_real_max_count = new_timer0_real_max_count;
+		if (timer0_real_max_count == 0x10000)
+			timer0_max_count = 0xffff;
+		else
+			timer0_max_count = timer0_real_max_count;
 		outb(TIMER_MODE, TIMER_SEL0 | TIMER_RATEGEN | TIMER_16BIT);
-		outb(TIMER_CNTR0, 0);
-		outb(TIMER_CNTR0, 0);
-	} else if (new_timer0_max_count != timer0_max_count) {
-		timer0_max_count = new_timer0_max_count;
-		outb(TIMER_MODE, TIMER_SEL0 | TIMER_RATEGEN | TIMER_16BIT);
-		outb(TIMER_CNTR0, timer0_max_count & 0xff);
-		outb(TIMER_CNTR0, timer0_max_count >> 8);
+		outb(TIMER_CNTR0, timer0_real_max_count & 0xff);
+		outb(TIMER_CNTR0, timer0_real_max_count >> 8);
 	}
 	mtx_unlock_spin(&clock_lock);
 }
_at__at_ -826,19 +829,8 _at__at_
 static unsigned
 i8254_simple_get_timecount(struct timecounter *tc)
 {
-	u_int count;
-	u_int high, low;
 
-	mtx_lock_spin(&clock_lock);
-
-	/* Select timer0 and latch counter value. */
-	outb(TIMER_MODE, TIMER_SEL0 | TIMER_LATCH);
-
-	low = inb(TIMER_CNTR0);
-	high = inb(TIMER_CNTR0);
-	count = 0xffff - ((high << 8) | low);
-	mtx_unlock_spin(&clock_lock);
-	return (count);
+	return (timer0_max_count - getit());
 }
 
 static unsigned
--- //depot/vendor/freebsd/src/sys/i386/isa/clock.c	2005/07/05 20:15:24
+++ //depot/user/jhb/acpipci/i386/isa/clock.c	2005/07/11 14:46:07
_at__at_ -110,6 +110,7 _at__at_
 #endif
 u_int	timer_freq = TIMER_FREQ;
 int	timer0_max_count;
+int	timer0_real_max_count;
 int	wall_cmos_clock;	/* wall CMOS clock assumed if != 0 */
 struct mtx clock_lock;
 #define	RTC_LOCK	mtx_lock_spin(&clock_lock)
_at__at_ -117,7 +118,6 _at__at_
 
 static	int	beeping = 0;
 static	const u_char daysinmonth[] = {31,28,31,30,31,30,31,31,30,31,30,31};
-static	u_int	hardclock_max_count;
 static	struct intsrc *i8254_intsrc;
 static	u_int32_t i8254_lastcount;
 static	u_int32_t i8254_offset;
_at__at_ -531,21 +531,24 _at__at_
 static void
 set_timer_freq(u_int freq, int intr_freq)
 {
-	int new_timer0_max_count;
+	int new_timer0_real_max_count;
 
 	i8254_timecounter.tc_frequency = freq;
 	mtx_lock_spin(&clock_lock);
 	timer_freq = freq;
-	new_timer0_max_count = hardclock_max_count = TIMER_DIV(intr_freq);
-	if (using_lapic_timer) {
+	if (using_lapic_timer)
+		new_timer0_real_max_count = 0x10000;
+	else
+		new_timer0_real_max_count = TIMER_DIV(intr_freq);
+	if (new_timer0_real_max_count != timer0_real_max_count) {
+		timer0_real_max_count = new_timer0_real_max_count;
+		if (timer0_real_max_count == 0x10000)
+			timer0_max_count = 0xffff;
+		else
+			timer0_max_count = timer0_real_max_count;
 		outb(TIMER_MODE, TIMER_SEL0 | TIMER_RATEGEN | TIMER_16BIT);
-		outb(TIMER_CNTR0, 0);
-		outb(TIMER_CNTR0, 0);
-	} else if (new_timer0_max_count != timer0_max_count) {
-		timer0_max_count = new_timer0_max_count;
-		outb(TIMER_MODE, TIMER_SEL0 | TIMER_RATEGEN | TIMER_16BIT);
-		outb(TIMER_CNTR0, timer0_max_count & 0xff);
-		outb(TIMER_CNTR0, timer0_max_count >> 8);
+		outb(TIMER_CNTR0, timer0_real_max_count & 0xff);
+		outb(TIMER_CNTR0, timer0_real_max_count >> 8);
 	}
 	mtx_unlock_spin(&clock_lock);
 }
_at__at_ -554,7 +557,11 _at__at_
 i8254_restore(void)
 {
 
-	set_timer_freq(timer_freq, hz);
+	mtx_lock_spin(&clock_lock);
+	outb(TIMER_MODE, TIMER_SEL0 | TIMER_RATEGEN | TIMER_16BIT);
+	outb(TIMER_CNTR0, timer0_real_max_count & 0xff);
+	outb(TIMER_CNTR0, timer0_real_max_count >> 8);
+	mtx_unlock_spin(&clock_lock);
 }
 
 static void
_at__at_ -876,19 +883,8 _at__at_
 static unsigned
 i8254_simple_get_timecount(struct timecounter *tc)
 {
-	u_int count;
-	u_int high, low;
 
-	mtx_lock_spin(&clock_lock);
-
-	/* Select timer0 and latch counter value. */
-	outb(TIMER_MODE, TIMER_SEL0 | TIMER_LATCH);
-
-	low = inb(TIMER_CNTR0);
-	high = inb(TIMER_CNTR0);
-	count = 0xffff - ((high << 8) | low);
-	mtx_unlock_spin(&clock_lock);
-	return (count);
+	return (timer0_max_count - getit());
 }
 
 static unsigned
--- //depot/vendor/freebsd/src/sys/pc98/cbus/clock.c	2005/07/05 20:15:24
+++ //depot/user/jhb/acpipci/pc98/cbus/clock.c	2005/07/11 14:46:07
_at__at_ -109,12 +109,12 _at__at_
 #endif
 u_int	timer_freq = TIMER_FREQ;
 int	timer0_max_count;
+int	timer0_real_max_count;
 int	wall_cmos_clock;	/* wall CMOS clock assumed if != 0 */
 struct mtx clock_lock;
 
 static	int	beeping = 0;
 static	const u_char daysinmonth[] = {31,28,31,30,31,30,31,31,30,31,30,31};
-static	u_int	hardclock_max_count;
 static	struct intsrc *i8254_intsrc;
 static	u_int32_t i8254_lastcount;
 static	u_int32_t i8254_offset;
_at__at_ -472,21 +472,24 _at__at_
 static void
 set_timer_freq(u_int freq, int intr_freq)
 {
-	int new_timer0_max_count;
+	int new_timer0_real_max_count;
 
 	i8254_timecounter.tc_frequency = freq;
 	mtx_lock_spin(&clock_lock);
 	timer_freq = freq;
-	new_timer0_max_count = hardclock_max_count = TIMER_DIV(intr_freq);
-	if (using_lapic_timer) {
+	if (using_lapic_timer)
+		new_timer0_real_max_count = 0x10000;
+	else
+		new_timer0_real_max_count = TIMER_DIV(intr_freq);
+	if (new_timer0_real_max_count != timer0_real_max_count) {
+		timer0_real_max_count = new_timer0_real_max_count;
+		if (timer0_real_max_count == 0x10000)
+			timer0_max_count = 0xffff;
+		else
+			timer0_max_count = timer0_real_max_count;
 		outb(TIMER_MODE, TIMER_SEL0 | TIMER_RATEGEN | TIMER_16BIT);
-		outb(TIMER_CNTR0, 0);
-		outb(TIMER_CNTR0, 0);
-	} else if (new_timer0_max_count != timer0_max_count) {
-		timer0_max_count = new_timer0_max_count;
-		outb(TIMER_MODE, TIMER_SEL0 | TIMER_RATEGEN | TIMER_16BIT);
-		outb(TIMER_CNTR0, timer0_max_count & 0xff);
-		outb(TIMER_CNTR0, timer0_max_count >> 8);
+		outb(TIMER_CNTR0, timer0_real_max_count & 0xff);
+		outb(TIMER_CNTR0, timer0_real_max_count >> 8);
 	}
 	mtx_unlock_spin(&clock_lock);
 }
_at__at_ -495,7 +498,11 _at__at_
 i8254_restore(void)
 {
 
-	set_timer_freq(timer_freq, hz);
+	mtx_lock_spin(&clock_lock);
+	outb(TIMER_MODE, TIMER_SEL0 | TIMER_RATEGEN | TIMER_16BIT);
+	outb(TIMER_CNTR0, timer0_real_max_count & 0xff);
+	outb(TIMER_CNTR0, timer0_real_max_count >> 8);
+	mtx_unlock_spin(&clock_lock);
 }
 
 
_at__at_ -815,19 +822,8 _at__at_
 static unsigned
 i8254_simple_get_timecount(struct timecounter *tc)
 {
-	u_int count;
-	u_int high, low;
 
-	mtx_lock_spin(&clock_lock);
-
-	/* Select timer0 and latch counter value. */
-	outb(TIMER_MODE, TIMER_SEL0 | TIMER_LATCH);
-
-	low = inb(TIMER_CNTR0);
-	high = inb(TIMER_CNTR0);
-	count = 0xffff - ((high << 8) | low);
-	mtx_unlock_spin(&clock_lock);
-	return (count);
+	return (timer0_max_count - getit());
 }
 
 static unsigned


-- 
John Baldwin <jhb_at_FreeBSD.org>  <><  http://www.FreeBSD.org/~jhb/
"Power Users Use the Power to Serve"  =  http://www.FreeBSD.org
Received on Mon Jul 11 2005 - 13:09:07 UTC

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