Ask for switching back to oob mode once ptrace core tell that
current is resuming from a stopped state, leaving space for
other runnable RT threads of the process to take over.

Signed-off-by: hongzha1 <[email protected]>

diff --git a/kernel/cobalt/dovetail/kevents.c b/kernel/cobalt/dovetail/kevents.c
index 966a63ce0..a640c4d9e 100644
--- a/kernel/cobalt/dovetail/kevents.c
+++ b/kernel/cobalt/dovetail/kevents.c
@@ -492,6 +492,8 @@ static void handle_ptrace_cont(void)
                        unregister_debugged_thread(curr);
 
                xnthread_set_localinfo(curr, XNHICCUP);
+
+               dovetail_request_ucall(current);
        }
 
        xnlock_put_irqrestore(&nklock, s);
diff --git a/kernel/cobalt/dovetail/sched.c b/kernel/cobalt/dovetail/sched.c
index de7c43b70..2bdddfeef 100644
--- a/kernel/cobalt/dovetail/sched.c
+++ b/kernel/cobalt/dovetail/sched.c
@@ -56,9 +56,21 @@ int pipeline_leave_inband(void)
 
 int pipeline_leave_oob_prepare(void)
 {
-       dovetail_leave_oob();
+       int suspmask = XNRELAX;
+       struct xnthread *curr = xnthread_current();
 
-       return XNRELAX;
+       dovetail_leave_oob();
+       /*
+        * If current is being debugged, record that it should migrate
+        * back in case it resumes in userspace. If it resumes in
+        * kernel space, i.e.  over a restarting syscall, the
+        * associated hardening will clear XNCONTHI.
+        */
+       if (xnthread_test_state(curr, XNSSTEP)) {
+               xnthread_set_info(curr, XNCONTHI);
+               suspmask |= XNDBGSTOP;
+       }
+       return suspmask;
 }
 
 void pipeline_leave_oob_finish(void)
-- 
2.17.1


Reply via email to