summaryrefslogtreecommitdiff
path: root/firmware/kernel.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/kernel.c')
-rw-r--r--firmware/kernel.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/firmware/kernel.c b/firmware/kernel.c
index c5e47a81ff..e09edeff77 100644
--- a/firmware/kernel.c
+++ b/firmware/kernel.c
@@ -126,7 +126,7 @@ static void queue_release_sender(struct thread_entry **sender,
126 intptr_t retval) 126 intptr_t retval)
127{ 127{
128 (*sender)->retval = retval; 128 (*sender)->retval = retval;
129 wakeup_thread(sender); 129 wakeup_thread_irq_safe(sender);
130#if 0 130#if 0
131 /* This should _never_ happen - there must never be multiple 131 /* This should _never_ happen - there must never be multiple
132 threads in this list and it is a corrupt state */ 132 threads in this list and it is a corrupt state */
@@ -289,11 +289,14 @@ void queue_post(struct event_queue *q, long id, intptr_t data)
289 } 289 }
290#endif 290#endif
291 291
292 wakeup_thread(&q->thread); 292 wakeup_thread_irq_safe(&q->thread);
293 set_irq_level(oldlevel); 293 set_irq_level(oldlevel);
294} 294}
295 295
296#ifdef HAVE_EXTENDED_MESSAGING_AND_NAME 296#ifdef HAVE_EXTENDED_MESSAGING_AND_NAME
297/* No wakeup_thread_irq_safe here because IRQ handlers are not allowed
298 use of this function - we only aim to protect the queue integrity by
299 turning them off. */
297intptr_t queue_send(struct event_queue *q, long id, intptr_t data) 300intptr_t queue_send(struct event_queue *q, long id, intptr_t data)
298{ 301{
299 int oldlevel = set_irq_level(HIGHEST_IRQ_LEVEL); 302 int oldlevel = set_irq_level(HIGHEST_IRQ_LEVEL);