aboutsummaryrefslogtreecommitdiff
path: root/sys/i386/isa/atpic_vector.s
diff options
context:
space:
mode:
authorBruce Evans <bde@FreeBSD.org>1999-05-28 14:08:59 +0000
committerBruce Evans <bde@FreeBSD.org>1999-05-28 14:08:59 +0000
commitb50641ef9cc5247b0d319ddc706a6e27375f48ed (patch)
tree1f5a10acd08d68a8da8123622e68884393b97203 /sys/i386/isa/atpic_vector.s
parent8a9cbccd6f708b709de55e3f68d8f6a8bf21908b (diff)
downloadsrc-b50641ef9cc5247b0d319ddc706a6e27375f48ed.tar.gz
src-b50641ef9cc5247b0d319ddc706a6e27375f48ed.zip
Fixed glitches (jumps) of about 1/HZ seconds for the i8254 timecounter.
The old version only worked right when the time was read strictly more often than every 1/HZ seconds, but we only guarantee reading it every (1/HZ + epsilon) seconds. Part of rev.1.126-1.127 attempted to fix this but didn't succeed. Detect counter rollover using the heuristic from the old version of microtime() with additional complications for supporting calls from fast interrupt handlers. This works provided i8254 interrupts are not delayed by more than 1/(2*HZ) seconds. This needs more comments, and cleanups for the SMP case, and more testing of the SMP case before it is merged into RELENG_3. Tested by: jhay
Notes
Notes: svn path=/head/; revision=47588
Diffstat (limited to 'sys/i386/isa/atpic_vector.s')
-rw-r--r--sys/i386/isa/atpic_vector.s38
1 files changed, 20 insertions, 18 deletions
diff --git a/sys/i386/isa/atpic_vector.s b/sys/i386/isa/atpic_vector.s
index 446030303231..453f9d553b84 100644
--- a/sys/i386/isa/atpic_vector.s
+++ b/sys/i386/isa/atpic_vector.s
@@ -1,6 +1,6 @@
/*
* from: vector.s, 386BSD 0.1 unknown origin
- * $Id: icu_vector.s,v 1.10 1999/04/14 14:26:36 bde Exp $
+ * $Id: icu_vector.s,v 1.11 1999/04/28 01:04:13 luoqi Exp $
*/
/*
@@ -106,7 +106,7 @@ IDTVEC(vec_name) ; \
MEXITCOUNT ; \
jmp _doreti
-#define INTR(irq_num, vec_name, icu, enable_icus, reg) \
+#define INTR(irq_num, vec_name, icu, enable_icus, reg, maybe_extra_ipending) \
.text ; \
SUPERALIGN_TEXT ; \
IDTVEC(vec_name) ; \
@@ -120,6 +120,7 @@ IDTVEC(vec_name) ; \
movl %ax,%ds ; /* ... early for obsolete reasons */ \
movl %ax,%es ; \
movl %ax,%fs ; \
+ maybe_extra_ipending ; \
movb _imen + IRQ_BYTE(irq_num),%al ; \
orb $IRQ_BIT(irq_num),%al ; \
movb %al,_imen + IRQ_BYTE(irq_num) ; \
@@ -180,22 +181,23 @@ MCOUNT_LABEL(bintr)
FAST_INTR(13,fastintr13, ENABLE_ICU1_AND_2)
FAST_INTR(14,fastintr14, ENABLE_ICU1_AND_2)
FAST_INTR(15,fastintr15, ENABLE_ICU1_AND_2)
- INTR(0,intr0, IO_ICU1, ENABLE_ICU1, al)
- INTR(1,intr1, IO_ICU1, ENABLE_ICU1, al)
- INTR(2,intr2, IO_ICU1, ENABLE_ICU1, al)
- INTR(3,intr3, IO_ICU1, ENABLE_ICU1, al)
- INTR(4,intr4, IO_ICU1, ENABLE_ICU1, al)
- INTR(5,intr5, IO_ICU1, ENABLE_ICU1, al)
- INTR(6,intr6, IO_ICU1, ENABLE_ICU1, al)
- INTR(7,intr7, IO_ICU1, ENABLE_ICU1, al)
- INTR(8,intr8, IO_ICU2, ENABLE_ICU1_AND_2, ah)
- INTR(9,intr9, IO_ICU2, ENABLE_ICU1_AND_2, ah)
- INTR(10,intr10, IO_ICU2, ENABLE_ICU1_AND_2, ah)
- INTR(11,intr11, IO_ICU2, ENABLE_ICU1_AND_2, ah)
- INTR(12,intr12, IO_ICU2, ENABLE_ICU1_AND_2, ah)
- INTR(13,intr13, IO_ICU2, ENABLE_ICU1_AND_2, ah)
- INTR(14,intr14, IO_ICU2, ENABLE_ICU1_AND_2, ah)
- INTR(15,intr15, IO_ICU2, ENABLE_ICU1_AND_2, ah)
+#define CLKINTR_PENDING movl $1,CNAME(clkintr_pending)
+ INTR(0,intr0, IO_ICU1, ENABLE_ICU1, al, CLKINTR_PENDING)
+ INTR(1,intr1, IO_ICU1, ENABLE_ICU1, al,)
+ INTR(2,intr2, IO_ICU1, ENABLE_ICU1, al,)
+ INTR(3,intr3, IO_ICU1, ENABLE_ICU1, al,)
+ INTR(4,intr4, IO_ICU1, ENABLE_ICU1, al,)
+ INTR(5,intr5, IO_ICU1, ENABLE_ICU1, al,)
+ INTR(6,intr6, IO_ICU1, ENABLE_ICU1, al,)
+ INTR(7,intr7, IO_ICU1, ENABLE_ICU1, al,)
+ INTR(8,intr8, IO_ICU2, ENABLE_ICU1_AND_2, ah,)
+ INTR(9,intr9, IO_ICU2, ENABLE_ICU1_AND_2, ah,)
+ INTR(10,intr10, IO_ICU2, ENABLE_ICU1_AND_2, ah,)
+ INTR(11,intr11, IO_ICU2, ENABLE_ICU1_AND_2, ah,)
+ INTR(12,intr12, IO_ICU2, ENABLE_ICU1_AND_2, ah,)
+ INTR(13,intr13, IO_ICU2, ENABLE_ICU1_AND_2, ah,)
+ INTR(14,intr14, IO_ICU2, ENABLE_ICU1_AND_2, ah,)
+ INTR(15,intr15, IO_ICU2, ENABLE_ICU1_AND_2, ah,)
MCOUNT_LABEL(eintr)
.data