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.
This commit is contained in:
Tor Egge 1998-04-22 22:49:29 +00:00
parent ac51e2822d
commit beede91e58
4 changed files with 22 additions and 20 deletions

View File

@ -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

View File

@ -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

View File

@ -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
/*

View File

@ -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