diff options
Diffstat (limited to 'debian/patches/700013-Avoid-cli-sti-in-favor-of-cpu_intr_-save-restore.patch')
-rw-r--r-- | debian/patches/700013-Avoid-cli-sti-in-favor-of-cpu_intr_-save-restore.patch | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/debian/patches/700013-Avoid-cli-sti-in-favor-of-cpu_intr_-save-restore.patch b/debian/patches/700013-Avoid-cli-sti-in-favor-of-cpu_intr_-save-restore.patch new file mode 100644 index 0000000..cbfad93 --- /dev/null +++ b/debian/patches/700013-Avoid-cli-sti-in-favor-of-cpu_intr_-save-restore.patch @@ -0,0 +1,127 @@ +From c113575502e58f8bfb9870867472d08e653e7c09 Mon Sep 17 00:00:00 2001 +From: Justus Winter <justus@gnupg.org> +Date: Fri, 26 Feb 2016 17:53:16 +0100 +Subject: [PATCH gnumach 13/15] Avoid cli/sti in favor of + cpu_intr_{save,restore} + +--- + device/intr.c | 31 +++++++++++++++++-------------- + 1 file changed, 17 insertions(+), 14 deletions(-) + +diff --git a/device/intr.c b/device/intr.c +index 1cbe661..c930e84 100644 +--- a/device/intr.c ++++ b/device/intr.c +@@ -22,13 +22,11 @@ + #include <kern/queue.h> + #include <kern/printf.h> + #include <mach/notify.h> ++#include <machine/cpu.h> + + #include "interrupt.h" + + #ifndef MACH_XEN +-// TODO this is only for x86 system +-#define sti() __asm__ __volatile__ ("sti": : :"memory") +-#define cli() __asm__ __volatile__ ("cli": : :"memory") + + /* The cache which holds our proxy memory objects. */ + static struct kmem_cache intr_entry_cache; +@@ -50,9 +48,11 @@ static queue_head_t intr_queue; + boolean_t + queue_intr (struct intr_entry *e) + { +- cli (); ++ unsigned long flags; ++ ++ cpu_intr_save (&flags); + e->interrupts++; +- sti (); ++ cpu_intr_restore (flags); + + thread_wakeup ((event_t) &intr_thread); + return TRUE; +@@ -65,6 +65,7 @@ kern_return_t + insert_intr_entry (int line, ipc_port_t dest, struct intr_entry **entry) + { + kern_return_t err = 0; ++ unsigned long flags; + struct intr_entry *e, *new; + int free = 0; + ipc_port_t dnnotify; +@@ -114,7 +115,7 @@ insert_intr_entry (int line, ipc_port_t dest, struct intr_entry **entry) + might decide to cancel. */ + + /* check whether the intr entry has been in the queue. */ +- cli (); ++ cpu_intr_save (&flags); + queue_iterate (&intr_queue, e, struct intr_entry *, chain) + if (e->dest == dest && e->line == line) + { +@@ -126,8 +127,8 @@ insert_intr_entry (int line, ipc_port_t dest, struct intr_entry **entry) + goto out; + } + queue_enter (&intr_queue, new, struct intr_entry *, chain); +-out: +- sti (); ++ out: ++ cpu_intr_restore (flags); + if (free) + { + ipc_port_dncancel (new->dest, (mach_port_t) 1, dnindex); +@@ -171,17 +172,18 @@ intr_entry_notify (mach_msg_header_t *msg) + struct intr_entry *entry; + int line; + mach_dead_name_notification_t *dn; ++ unsigned long flags; + + dn = (mach_dead_name_notification_t *) msg; + entry = intr_entry_port_lookup + ((ipc_port_t) dn->not_header.msgh_remote_port); + assert (entry); + +- cli (); ++ cpu_intr_save (&flags); + line = entry->line; + assert (!queue_empty (&intr_queue)); + queue_remove (&intr_queue, entry, struct intr_entry *, chain); +- sti (); ++ cpu_intr_restore (flags); + + ipc_port_dealloc_kernel (entry->port); + ipc_port_release_send (entry->dest); +@@ -262,8 +264,9 @@ intr_thread () + + for (;;) + { ++ unsigned long flags; + assert_wait ((event_t) &intr_thread, FALSE); +- cli (); ++ cpu_intr_save (&flags); + + restart: + queue_iterate (&intr_queue, e, struct intr_entry *, chain) +@@ -273,9 +276,9 @@ intr_thread () + dest = e->dest; + e->interrupts--; + +- sti (); ++ cpu_intr_restore (flags); + deliver_intr (line, dest); +- cli (); ++ cpu_intr_save (&flags); + + /* We cannot assume that e still exists at this point + because we released the lock. Hence we restart the +@@ -283,7 +286,7 @@ intr_thread () + goto restart; + } + +- sti (); ++ cpu_intr_restore (flags); + thread_block (thread_no_continuation); + } + } +-- +2.1.4 + |