aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/uapi/conf.c2
-rw-r--r--src/uapi/proc.c6
2 files changed, 8 insertions, 0 deletions
diff --git a/src/uapi/conf.c b/src/uapi/conf.c
index 7925616..242239c 100644
--- a/src/uapi/conf.c
+++ b/src/uapi/conf.c
@@ -126,5 +126,7 @@ SYSCALL_DEFINE0(sleep)(struct tcb *t)
if (!(has_cap(t->caps, CAP_POWER)))
return_args1(t, ERR_PERM);
+ /* presumably we want to wake up on an interrupt */
+ enable_irqs();
return_args1(t, sleep());
}
diff --git a/src/uapi/proc.c b/src/uapi/proc.c
index e87a2ec..bb4b463 100644
--- a/src/uapi/proc.c
+++ b/src/uapi/proc.c
@@ -181,6 +181,9 @@ SYSCALL_DEFINE1(swap)(struct tcb *t, sys_arg_t tid){
if (!s)
return_args1(t, ERR_INVAL);
+ if (running(s))
+ return_args1(t, ERR_EXT);
+
/* switch over to new thread */
use_tcb(s);
@@ -195,6 +198,9 @@ SYSCALL_DEFINE1(swap)(struct tcb *t, sys_arg_t tid){
if (s->notify_state == NOTIFY_QUEUED)
notify(s, 0);
+ /* if an irq handler is directly swapping to some other thread,
+ * interpret it as the thread being finished with its critical section */
+ enable_irqs();
/* get register state for new thread */
return_args(s, get_args(s));
}