From 3135dafcdb738769c4887a245db5c82b7edb7b4b Mon Sep 17 00:00:00 2001 From: tegge Date: Wed, 22 Apr 1998 22:49:29 +0000 Subject: [PATCH] Mask the interrupt before setting the corresponding bit in ipending if the interrupt is already active. Don't use lock prefix for operations on ipending. Always use lock prefix for operations on iactive. --- sys/amd64/amd64/apic_vector.S | 13 +++++++------ sys/i386/i386/apic_vector.s | 13 +++++++------ sys/i386/isa/apic_ipl.s | 3 +-- sys/i386/isa/apic_vector.s | 13 +++++++------ 4 files changed, 22 insertions(+), 20 deletions(-) diff --git a/sys/amd64/amd64/apic_vector.S b/sys/amd64/amd64/apic_vector.S index 72dab845445f..b3dd56af0d35 100644 --- a/sys/amd64/amd64/apic_vector.S +++ b/sys/amd64/amd64/apic_vector.S @@ -1,6 +1,6 @@ /* * from: vector.s, 386BSD 0.1 unknown origin - * $Id: apic_vector.s,v 1.27 1998/03/03 22:56:28 tegge Exp $ + * $Id: apic_vector.s,v 1.28 1998/03/05 21:45:53 tegge Exp $ */ @@ -372,11 +372,12 @@ __CONCAT(Xresume,irq_num): ; \ ALIGN_TEXT ; \ 1: ; /* active */ \ APIC_ITRACE(apic_itrace_active, irq_num, APIC_ITRACE_ACTIVE) ; \ + MASK_IRQ(irq_num) ; \ + EOI_IRQ(irq_num) ; \ AVCPL_LOCK ; /* MP-safe */ \ orl $IRQ_BIT(irq_num), _ipending ; \ AVCPL_UNLOCK ; \ - MASK_IRQ(irq_num) ; \ - EOI_IRQ(irq_num) ; \ + lock ; \ btsl $(irq_num), iactive ; /* still active */ \ jnc 0b ; /* retry */ \ POP_FRAME ; \ @@ -477,11 +478,12 @@ __CONCAT(Xresume,irq_num): ; \ ALIGN_TEXT ; \ 1: ; /* active */ \ APIC_ITRACE(apic_itrace_active, irq_num, APIC_ITRACE_ACTIVE) ; \ + MASK_IRQ(irq_num) ; \ + EOI_IRQ(irq_num) ; \ AVCPL_LOCK ; /* MP-safe */ \ orl $IRQ_BIT(irq_num), _ipending ; \ AVCPL_UNLOCK ; \ - MASK_IRQ(irq_num) ; \ - EOI_IRQ(irq_num) ; \ + lock ; \ btsl $(irq_num), iactive ; /* still active */ \ jnc 0b ; /* retry */ \ POP_FRAME ; \ @@ -662,7 +664,6 @@ _Xcpuast: movl _cpl, %eax #endif pushl %eax - lock orl $SWI_AST_PENDING, _ipending AVCPL_UNLOCK lock diff --git a/sys/i386/i386/apic_vector.s b/sys/i386/i386/apic_vector.s index 72dab845445f..b3dd56af0d35 100644 --- a/sys/i386/i386/apic_vector.s +++ b/sys/i386/i386/apic_vector.s @@ -1,6 +1,6 @@ /* * from: vector.s, 386BSD 0.1 unknown origin - * $Id: apic_vector.s,v 1.27 1998/03/03 22:56:28 tegge Exp $ + * $Id: apic_vector.s,v 1.28 1998/03/05 21:45:53 tegge Exp $ */ @@ -372,11 +372,12 @@ __CONCAT(Xresume,irq_num): ; \ ALIGN_TEXT ; \ 1: ; /* active */ \ APIC_ITRACE(apic_itrace_active, irq_num, APIC_ITRACE_ACTIVE) ; \ + MASK_IRQ(irq_num) ; \ + EOI_IRQ(irq_num) ; \ AVCPL_LOCK ; /* MP-safe */ \ orl $IRQ_BIT(irq_num), _ipending ; \ AVCPL_UNLOCK ; \ - MASK_IRQ(irq_num) ; \ - EOI_IRQ(irq_num) ; \ + lock ; \ btsl $(irq_num), iactive ; /* still active */ \ jnc 0b ; /* retry */ \ POP_FRAME ; \ @@ -477,11 +478,12 @@ __CONCAT(Xresume,irq_num): ; \ ALIGN_TEXT ; \ 1: ; /* active */ \ APIC_ITRACE(apic_itrace_active, irq_num, APIC_ITRACE_ACTIVE) ; \ + MASK_IRQ(irq_num) ; \ + EOI_IRQ(irq_num) ; \ AVCPL_LOCK ; /* MP-safe */ \ orl $IRQ_BIT(irq_num), _ipending ; \ AVCPL_UNLOCK ; \ - MASK_IRQ(irq_num) ; \ - EOI_IRQ(irq_num) ; \ + lock ; \ btsl $(irq_num), iactive ; /* still active */ \ jnc 0b ; /* retry */ \ POP_FRAME ; \ @@ -662,7 +664,6 @@ _Xcpuast: movl _cpl, %eax #endif pushl %eax - lock orl $SWI_AST_PENDING, _ipending AVCPL_UNLOCK lock diff --git a/sys/i386/isa/apic_ipl.s b/sys/i386/isa/apic_ipl.s index f2579ed7d288..fa83c9f08b9a 100644 --- a/sys/i386/isa/apic_ipl.s +++ b/sys/i386/isa/apic_ipl.s @@ -22,7 +22,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: apic_ipl.s,v 1.18 1998/03/03 22:56:28 tegge Exp $ + * $Id: apic_ipl.s,v 1.19 1998/03/05 21:45:50 tegge Exp $ */ @@ -116,7 +116,6 @@ splz_next: ALIGN_TEXT splz_unpend: bsfl %ecx,%ecx - lock btrl %ecx, _ipending jnc splz_next /* diff --git a/sys/i386/isa/apic_vector.s b/sys/i386/isa/apic_vector.s index 72dab845445f..b3dd56af0d35 100644 --- a/sys/i386/isa/apic_vector.s +++ b/sys/i386/isa/apic_vector.s @@ -1,6 +1,6 @@ /* * from: vector.s, 386BSD 0.1 unknown origin - * $Id: apic_vector.s,v 1.27 1998/03/03 22:56:28 tegge Exp $ + * $Id: apic_vector.s,v 1.28 1998/03/05 21:45:53 tegge Exp $ */ @@ -372,11 +372,12 @@ __CONCAT(Xresume,irq_num): ; \ ALIGN_TEXT ; \ 1: ; /* active */ \ APIC_ITRACE(apic_itrace_active, irq_num, APIC_ITRACE_ACTIVE) ; \ + MASK_IRQ(irq_num) ; \ + EOI_IRQ(irq_num) ; \ AVCPL_LOCK ; /* MP-safe */ \ orl $IRQ_BIT(irq_num), _ipending ; \ AVCPL_UNLOCK ; \ - MASK_IRQ(irq_num) ; \ - EOI_IRQ(irq_num) ; \ + lock ; \ btsl $(irq_num), iactive ; /* still active */ \ jnc 0b ; /* retry */ \ POP_FRAME ; \ @@ -477,11 +478,12 @@ __CONCAT(Xresume,irq_num): ; \ ALIGN_TEXT ; \ 1: ; /* active */ \ APIC_ITRACE(apic_itrace_active, irq_num, APIC_ITRACE_ACTIVE) ; \ + MASK_IRQ(irq_num) ; \ + EOI_IRQ(irq_num) ; \ AVCPL_LOCK ; /* MP-safe */ \ orl $IRQ_BIT(irq_num), _ipending ; \ AVCPL_UNLOCK ; \ - MASK_IRQ(irq_num) ; \ - EOI_IRQ(irq_num) ; \ + lock ; \ btsl $(irq_num), iactive ; /* still active */ \ jnc 0b ; /* retry */ \ POP_FRAME ; \ @@ -662,7 +664,6 @@ _Xcpuast: movl _cpl, %eax #endif pushl %eax - lock orl $SWI_AST_PENDING, _ipending AVCPL_UNLOCK lock