summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--device/intr.c29
1 files changed, 19 insertions, 10 deletions
diff --git a/device/intr.c b/device/intr.c
index cf5d93f6..476625cb 100644
--- a/device/intr.c
+++ b/device/intr.c
@@ -5,7 +5,7 @@
#ifndef MACH_XEN
// TODO this is only for x86 system
-#define sti() __asm__ __volatile__ ("sti": : :"memory")
+#include <i386/spl.h>
#define cli() __asm__ __volatile__ ("cli": : :"memory")
static boolean_t deliver_intr (int line, ipc_port_t dest_port);
@@ -42,12 +42,13 @@ queue_intr (int line, ipc_port_t dest)
extern void intr_thread ();
struct intr_entry *e;
+ spl_t s = splhi();
cli ();
e = search_intr (line, dest);
assert (e);
e->interrupts++;
tot_num_intr++;
- sti ();
+ splx(s);
thread_wakeup ((event_t) &intr_thread);
}
@@ -61,12 +62,15 @@ insert_intr_entry (int line, ipc_port_t dest)
int err = 0;
struct intr_entry *e, *new;
int free = 0;
+ spl_t s;
new = (struct intr_entry *) kalloc (sizeof (*new));
if (new == NULL)
return D_NO_MEMORY;
/* check whether the intr entry has been in the queue. */
+
+ s = splhi();
cli ();
e = search_intr (line, dest);
if (e)
@@ -82,7 +86,7 @@ insert_intr_entry (int line, ipc_port_t dest)
new->interrupts = 0;
queue_enter (&intr_queue, new, struct intr_entry *, chain);
out:
- sti ();
+ splx(s);
if (free)
kfree ((vm_offset_t) new, sizeof (*new));
return err;
@@ -105,11 +109,13 @@ intr_thread ()
int line;
ipc_port_t dest;
queue_init (&intr_queue);
-
+ spl_t s;
+
for (;;)
{
assert_wait ((event_t) &intr_thread, FALSE);
- cli ();
+ s = splhi();
+ cli();
while (tot_num_intr)
{
int del = 0;
@@ -133,9 +139,10 @@ intr_thread ()
e->interrupts--;
tot_num_intr--;
- sti ();
+ splx(s);
deliver_intr (line, dest);
- cli ();
+ s = splhi();
+ cli();
}
}
@@ -144,12 +151,14 @@ intr_thread ()
{
assert (!queue_empty (&intr_queue));
queue_remove (&intr_queue, e, struct intr_entry *, chain);
- sti ();
+
+ splx(s);
kfree ((vm_offset_t) e, sizeof (*e));
- cli ();
+ s = splhi();
+ cli();
}
}
- sti ();
+ splx(s);
thread_block (NULL);
}
}