summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authortegge <tegge@FreeBSD.org>1998-04-22 22:49:29 +0000
committertegge <tegge@FreeBSD.org>1998-04-22 22:49:29 +0000
commit3135dafcdb738769c4887a245db5c82b7edb7b4b (patch)
tree356e35b55c099ddad9835f4f247941b22393752b /sys
parentded4386b97422b817039e98fe81f2ca10c5027b2 (diff)
downloadFreeBSD-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.S13
-rw-r--r--sys/i386/i386/apic_vector.s13
-rw-r--r--sys/i386/isa/apic_ipl.s3
-rw-r--r--sys/i386/isa/apic_vector.s13
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
OpenPOWER on IntegriCloud