diff options
author | tegge <tegge@FreeBSD.org> | 1998-04-22 22:49:29 +0000 |
---|---|---|
committer | tegge <tegge@FreeBSD.org> | 1998-04-22 22:49:29 +0000 |
commit | 3135dafcdb738769c4887a245db5c82b7edb7b4b (patch) | |
tree | 356e35b55c099ddad9835f4f247941b22393752b /sys | |
parent | ded4386b97422b817039e98fe81f2ca10c5027b2 (diff) | |
download | FreeBSD-src-3135dafcdb738769c4887a245db5c82b7edb7b4b.zip FreeBSD-src-3135dafcdb738769c4887a245db5c82b7edb7b4b.tar.gz |
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.
Diffstat (limited to 'sys')
-rw-r--r-- | sys/amd64/amd64/apic_vector.S | 13 | ||||
-rw-r--r-- | sys/i386/i386/apic_vector.s | 13 | ||||
-rw-r--r-- | sys/i386/isa/apic_ipl.s | 3 | ||||
-rw-r--r-- | 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 72dab84..b3dd56a 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 72dab84..b3dd56a 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 f2579ed..fa83c9f 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 72dab84..b3dd56a 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 |