summaryrefslogtreecommitdiff
path: root/i386
diff options
context:
space:
mode:
Diffstat (limited to 'i386')
-rw-r--r--i386/i386/irq.c47
-rw-r--r--i386/i386/irq.h1
-rw-r--r--i386/i386at/model_dep.c1
3 files changed, 38 insertions, 11 deletions
diff --git a/i386/i386/irq.c b/i386/i386/irq.c
index 91318f67..30457a3d 100644
--- a/i386/i386/irq.c
+++ b/i386/i386/irq.c
@@ -34,32 +34,57 @@ irq_eoi (struct irqdev *dev, int id)
#endif
}
-static unsigned int ndisabled_irq[NINTR];
+/* Each array elem fits in a cache line */
+struct nested_irq {
+ simple_lock_irq_data_t irq_lock;
+ int32_t ndisabled;
+ uint32_t unused[14];
+} __attribute__((packed)) nested_irqs[NINTR];
+
+void
+init_irqs (void)
+{
+ int i;
+
+ for (i = 0; i < NINTR; i++)
+ {
+ simple_lock_init_irq(&nested_irqs[i].irq_lock);
+ nested_irqs[i].ndisabled = 0;
+ }
+}
void
__disable_irq (irq_t irq_nr)
{
+ spl_t s;
assert (irq_nr < NINTR);
+ struct nested_irq *nirq = &nested_irqs[irq_nr];
- spl_t s = splhigh();
- ndisabled_irq[irq_nr]++;
- assert (ndisabled_irq[irq_nr] > 0);
- if (ndisabled_irq[irq_nr] == 1)
+ s = simple_lock_irq(&nirq->irq_lock);
+
+ nirq->ndisabled++;
+ assert (nirq->ndisabled > 0);
+ if (nirq->ndisabled == 1)
mask_irq (irq_nr);
- splx(s);
+
+ simple_unlock_irq(s, &nirq->irq_lock);
}
void
__enable_irq (irq_t irq_nr)
{
+ spl_t s;
assert (irq_nr < NINTR);
+ struct nested_irq *nirq = &nested_irqs[irq_nr];
- spl_t s = splhigh();
- assert (ndisabled_irq[irq_nr] > 0);
- ndisabled_irq[irq_nr]--;
- if (ndisabled_irq[irq_nr] == 0)
+ s = simple_lock_irq(&nirq->irq_lock);
+
+ assert (nirq->ndisabled > 0);
+ nirq->ndisabled--;
+ if (nirq->ndisabled == 0)
unmask_irq (irq_nr);
- splx(s);
+
+ simple_unlock_irq(s, &nirq->irq_lock);
}
struct irqdev irqtab = {
diff --git a/i386/i386/irq.h b/i386/i386/irq.h
index 72bbe57b..e1f41045 100644
--- a/i386/i386/irq.h
+++ b/i386/i386/irq.h
@@ -23,6 +23,7 @@
typedef unsigned int irq_t;
+void init_irqs (void);
void __enable_irq (irq_t irq);
void __disable_irq (irq_t irq);
diff --git a/i386/i386at/model_dep.c b/i386/i386at/model_dep.c
index 42dadeb8..071c23fa 100644
--- a/i386/i386at/model_dep.c
+++ b/i386/i386at/model_dep.c
@@ -173,6 +173,7 @@ void machine_init(void)
#if (NCPUS > 1)
smp_init();
#endif
+ init_irqs();
#if defined(APIC)
ioapic_configure();
#endif