在 2021/7/8 下午4:05, Jan Kiszka 写道:
On 08.07.21 09:58, Florian Bezdeka wrote:
On 07.07.21 22:16, Jan Kiszka via Xenomai wrote:
From: Jan Kiszka <[email protected]>

This introduces the concept of a debugging helper thread. It can
register itself with the cobalt core and then wait for ptrace stop and
resumption events. This can be used to bring the connected devices or
other parts of the system into a state that can tolerate the potentially
long interruption and also synchronize again with it to continue.

On stop events (breakpoints, debugger interceptions), the core will
ensure that the helper is run after all primary-mode threads were put on
hold and before the debugger will gain control over the whole process.
For that purpose, the helper will receive a notification when it was
pending on the corresponding event-wait syscall and will release the
process into debugging by invoking that syscall to wait for the
resumption event.

When the debugger resumes the whole process, the helper is resumed
first, right before all threads that will continue in primary mode are
released (threads in secondary mode may run earlier but will have to
wait when trying to enter primary mode). Again, the helper thread
decides when to continue by calling the event-wait system again, in
that case in order to wait for the next stop event.

Signed-off-by: Jan Kiszka <[email protected]>
---
  include/cobalt/Makefile.am      |  1 +
  include/cobalt/ptrace.h         | 37 ++++++++++++++
  include/cobalt/uapi/Makefile.am |  1 +
  include/cobalt/uapi/ptrace.h    | 24 +++++++++
  include/cobalt/uapi/syscall.h   |  2 +
  kernel/cobalt/posix/process.c   | 34 +++++++++++-
  kernel/cobalt/posix/process.h   |  5 ++
  kernel/cobalt/posix/syscall.c   | 86 +++++++++++++++++++++++++++++++
  lib/cobalt/Makefile.am          |  1 +
  lib/cobalt/ptrace.c             | 91 +++++++++++++++++++++++++++++++++
  10 files changed, 280 insertions(+), 2 deletions(-)
  create mode 100644 include/cobalt/ptrace.h
  create mode 100644 include/cobalt/uapi/ptrace.h
  create mode 100644 lib/cobalt/ptrace.c

diff --git a/include/cobalt/Makefile.am b/include/cobalt/Makefile.am
index 19e96112e8..e0b203193d 100644
--- a/include/cobalt/Makefile.am
+++ b/include/cobalt/Makefile.am
@@ -4,6 +4,7 @@ includesub_HEADERS =    \
        fcntl.h         \
        mqueue.h        \
        pthread.h       \
+       ptrace.h        \
        sched.h         \
        semaphore.h     \
        signal.h        \
diff --git a/include/cobalt/ptrace.h b/include/cobalt/ptrace.h
new file mode 100644
index 0000000000..f5bec56c9d
--- /dev/null
+++ b/include/cobalt/ptrace.h
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) Siemens AG, 2015-2021
+ *
+ * Authors:
+ *  Jan Kiszka <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA.
+ */
+#ifndef _COBALT_PTRACE_H
+#define _COBALT_PTRACE_H
+
+#include <cobalt/uapi/ptrace.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int cobalt_ptrace_helper_init(void);
+int cobalt_ptrace_event_wait(int event);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* !_COBALT_PTRACE_H */
diff --git a/include/cobalt/uapi/Makefile.am b/include/cobalt/uapi/Makefile.am
index d887213f8e..41076e23d9 100644
--- a/include/cobalt/uapi/Makefile.am
+++ b/include/cobalt/uapi/Makefile.am
@@ -6,6 +6,7 @@ includesub_HEADERS =    \
        event.h         \
        monitor.h       \
        mutex.h         \
+       ptrace.h        \
        sched.h         \
        sem.h           \
        signal.h        \
diff --git a/include/cobalt/uapi/ptrace.h b/include/cobalt/uapi/ptrace.h
new file mode 100644
index 0000000000..4e61d458c1
--- /dev/null
+++ b/include/cobalt/uapi/ptrace.h
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) Siemens AG, 2015-2021
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA.
+ */
+#ifndef _COBALT_UAPI_PTRACE_H
+#define _COBALT_UAPI_PTRACE_H
+
+#define COBALT_PTRACE_EVENT_STOP       0x1
+#define COBALT_PTRACE_EVENT_RESUME     0x2
+
+#endif /* !_COBALT_UAPI_PTRACE_H */
diff --git a/include/cobalt/uapi/syscall.h b/include/cobalt/uapi/syscall.h
index a2795a3644..1fb4009d64 100644
--- a/include/cobalt/uapi/syscall.h
+++ b/include/cobalt/uapi/syscall.h
@@ -128,6 +128,8 @@
  #define sc_cobalt_clock_nanosleep64           105
  #define sc_cobalt_clock_getres64              106
  #define sc_cobalt_clock_adjtime64             107
+#define sc_cobalt_ptrace_helper_init           108
+#define sc_cobalt_ptrace_event_wait            109

Just a note that this affects the onoing Y2038 work. Song, we might have
to adjust the syscall numbers again (assuming that Jan is coming in earlier)


If you already know how many additional calls you need, I can move my
reservation up and keep you block together.

sc_cobalt_mutex_timedlock64
sc_cobalt_mq_timedsend64                
sc_cobalt_mq_timedreceive64             
sc_cobalt_sigtimedwait64                
sc_cobalt_thread_setschedparam_ex64
sc_cobalt_thread_getschedparam_ex64
cond_wait_prologue64
monitor_wait64
event_wait64
select64
recvmmsg64

those implementations are ongoing, please reserve, thanks.

@Florian, if you are available, please review mutex_timedlock64,mq_timedsend64 and mq_timedreceive64. thanks.

/Song


Jan


Reply via email to