diff options
author | peter <peter@FreeBSD.org> | 2001-01-15 04:18:58 +0000 |
---|---|---|
committer | peter <peter@FreeBSD.org> | 2001-01-15 04:18:58 +0000 |
commit | 068a9ad88f4e55a2e766999e2f3322d780a660be (patch) | |
tree | 99c17248755aa88c679d108265336db3f33c20f6 /sys/amd64 | |
parent | e2baa95c06580714e09a865e2a018fa924bb5543 (diff) | |
download | FreeBSD-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/amd64')
-rw-r--r-- | sys/amd64/isa/icu_ipl.S | 14 | ||||
-rw-r--r-- | sys/amd64/isa/icu_ipl.s | 14 |
2 files changed, 28 insertions, 0 deletions
diff --git a/sys/amd64/isa/icu_ipl.S b/sys/amd64/isa/icu_ipl.S index 3af9f66..6ea9052 100644 --- a/sys/amd64/isa/icu_ipl.S +++ b/sys/amd64/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 diff --git a/sys/amd64/isa/icu_ipl.s b/sys/amd64/isa/icu_ipl.s index 3af9f66..6ea9052 100644 --- a/sys/amd64/isa/icu_ipl.s +++ b/sys/amd64/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 |