summaryrefslogtreecommitdiffstats
path: root/sys/i386
diff options
context:
space:
mode:
authorpeter <peter@FreeBSD.org>2001-01-15 04:18:58 +0000
committerpeter <peter@FreeBSD.org>2001-01-15 04:18:58 +0000
commit068a9ad88f4e55a2e766999e2f3322d780a660be (patch)
tree99c17248755aa88c679d108265336db3f33c20f6 /sys/i386
parente2baa95c06580714e09a865e2a018fa924bb5543 (diff)
downloadFreeBSD-src-068a9ad88f4e55a2e766999e2f3322d780a660be.zip
FreeBSD-src-068a9ad88f4e55a2e766999e2f3322d780a660be.tar.gz
Implement an optimization for INTREN/INTRDIS that bde pointed out last
time I tinkered around here. Since INTREN is called from the interrupt critical path now, it should not be too expensive. In this case, we look at the bits being changed to decide which 8 bit IO port to write to rather than unconditionally writing to both. I could probably have gone further and only done the write if the bits actually changed, but that seemed overkill for the usual case in interrupt threads. [an outb is rather expensive when it has to cross the ISA bus]
Diffstat (limited to 'sys/i386')
-rw-r--r--sys/i386/isa/icu_ipl.s14
1 files changed, 14 insertions, 0 deletions
diff --git a/sys/i386/isa/icu_ipl.s b/sys/i386/isa/icu_ipl.s
index 3af9f66..6ea9052 100644
--- a/sys/i386/isa/icu_ipl.s
+++ b/sys/i386/isa/icu_ipl.s
@@ -55,19 +55,33 @@ _imen: .long HWI_MASK
ENTRY(INTREN)
movl 4(%esp), %eax
+ movl %eax, %ecx
notl %eax
andl %eax, imen
movl imen, %eax
+ testb %cl, %cl
+ je 1f
outb %al, $(IO_ICU1 + MASK_OFFSET)
+1:
+ testb %ch, %ch
+ je 2f
shrl $8, %eax
outb %al, $(IO_ICU2 + MASK_OFFSET)
+2:
ret
ENTRY(INTRDIS)
movl 4(%esp), %eax
+ movl %eax, %ecx
orl %eax, imen
movl imen, %eax
+ testb %cl, %cl
+ je 1f
outb %al, $(IO_ICU1 + MASK_OFFSET)
+1:
+ testb %ch, %ch
+ je 2f
shrl $8, %eax
outb %al, $(IO_ICU2 + MASK_OFFSET)
+2:
ret
OpenPOWER on IntegriCloud