From aa96d552397f89137a43b57efef159d42f60285d Mon Sep 17 00:00:00 2001 From: Damien Zammit Date: Sat, 18 Apr 2020 11:48:56 +1000 Subject: device/intr.c: Use spl machinery --- device/intr.c | 29 +++++++++++++++++++---------- 1 file 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 #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); } } -- cgit v1.2.3