| Message ID | 20250924142059.527768-12-benjamin@sipsolutions.net |
|---|---|
| State | Changes Requested |
| Headers | show |
| Series | Start porting UML to nolibc | expand |
On 2025-09-24 16:20:58+0200, Benjamin Berg wrote: > From: Benjamin Berg <benjamin.berg@intel.com> > > Add ptrace support, as it will be useful in UML. > > Signed-off-by: Benjamin Berg <benjamin.berg@intel.com> > > --- > v3: > - Only use variardic for ptrace and not for sys_ptrace > --- > tools/include/nolibc/Makefile | 1 + > tools/include/nolibc/nolibc.h | 1 + > tools/include/nolibc/sys/ptrace.h | 44 ++++++++++++++++++++ > tools/testing/selftests/nolibc/nolibc-test.c | 2 + > 4 files changed, 48 insertions(+) > create mode 100644 tools/include/nolibc/sys/ptrace.h (...) > diff --git a/tools/include/nolibc/sys/ptrace.h b/tools/include/nolibc/sys/ptrace.h > new file mode 100644 > index 000000000000..5d1e52965878 > --- /dev/null > +++ b/tools/include/nolibc/sys/ptrace.h > @@ -0,0 +1,44 @@ > +/* SPDX-License-Identifier: LGPL-2.1 OR MIT */ > +/* > + * ptrace for NOLIBC > + * Copyright (C) 2017-2021 Willy Tarreau <w@1wt.eu> > + * Copyright (C) 2025 Intel Corporation > + */ > + > +/* make sure to include all global symbols */ > +#include "../nolibc.h" > + > +#ifndef _NOLIBC_SYS_PTRACE_H > +#define _NOLIBC_SYS_PTRACE_H > + > +#include "../sys.h" > +#include "uio.h" > + > + > +#include <linux/ptrace.h> > + > +/* > + * long ptrace(int op, pid_t pid, void *addr, void *data); > + */ > +static __attribute__((unused)) > +long sys_ptrace(int op, pid_t pid, void *addr, void *data) > +{ > + return my_syscall4(__NR_ptrace, op, pid, addr, data); > +} > + > +static __attribute__((unused)) > +ssize_t ptrace(int op, pid_t pid, ...) > +{ > + ssize_t ret; > + va_list args; > + > + va_start(args, pid); > + ret = __sysret(sys_ptrace(op, pid, > + va_arg(args, void *), > + va_arg(args, void *))); > + va_end(args); My understanding of the last discussion was not to use varargs here either. Instead I wanted to stick to the prototype from the manpage. > + > + return ret; > +} > + > +#endif /* _NOLIBC_SYS_PTRACE_H */ (...)
diff --git a/tools/include/nolibc/Makefile b/tools/include/nolibc/Makefile index 9bbbba32dac6..8e0cac3ac522 100644 --- a/tools/include/nolibc/Makefile +++ b/tools/include/nolibc/Makefile @@ -53,6 +53,7 @@ all_files := \ sys/mman.h \ sys/mount.h \ sys/prctl.h \ + sys/ptrace.h \ sys/random.h \ sys/reboot.h \ sys/resource.h \ diff --git a/tools/include/nolibc/nolibc.h b/tools/include/nolibc/nolibc.h index b4bc1c9b883d..590eef545ca6 100644 --- a/tools/include/nolibc/nolibc.h +++ b/tools/include/nolibc/nolibc.h @@ -101,6 +101,7 @@ #include "sys/mman.h" #include "sys/mount.h" #include "sys/prctl.h" +#include "sys/ptrace.h" #include "sys/random.h" #include "sys/reboot.h" #include "sys/resource.h" diff --git a/tools/include/nolibc/sys/ptrace.h b/tools/include/nolibc/sys/ptrace.h new file mode 100644 index 000000000000..5d1e52965878 --- /dev/null +++ b/tools/include/nolibc/sys/ptrace.h @@ -0,0 +1,44 @@ +/* SPDX-License-Identifier: LGPL-2.1 OR MIT */ +/* + * ptrace for NOLIBC + * Copyright (C) 2017-2021 Willy Tarreau <w@1wt.eu> + * Copyright (C) 2025 Intel Corporation + */ + +/* make sure to include all global symbols */ +#include "../nolibc.h" + +#ifndef _NOLIBC_SYS_PTRACE_H +#define _NOLIBC_SYS_PTRACE_H + +#include "../sys.h" +#include "uio.h" + + +#include <linux/ptrace.h> + +/* + * long ptrace(int op, pid_t pid, void *addr, void *data); + */ +static __attribute__((unused)) +long sys_ptrace(int op, pid_t pid, void *addr, void *data) +{ + return my_syscall4(__NR_ptrace, op, pid, addr, data); +} + +static __attribute__((unused)) +ssize_t ptrace(int op, pid_t pid, ...) +{ + ssize_t ret; + va_list args; + + va_start(args, pid); + ret = __sysret(sys_ptrace(op, pid, + va_arg(args, void *), + va_arg(args, void *))); + va_end(args); + + return ret; +} + +#endif /* _NOLIBC_SYS_PTRACE_H */ diff --git a/tools/testing/selftests/nolibc/nolibc-test.c b/tools/testing/selftests/nolibc/nolibc-test.c index 1907128bc3f6..4c1b9ee32b7d 100644 --- a/tools/testing/selftests/nolibc/nolibc-test.c +++ b/tools/testing/selftests/nolibc/nolibc-test.c @@ -17,6 +17,7 @@ #include <sys/mman.h> #include <sys/mount.h> #include <sys/prctl.h> +#include <sys/ptrace.h> #include <sys/random.h> #include <sys/reboot.h> #include <sys/resource.h> @@ -1404,6 +1405,7 @@ int run_syscall(int min, int max) CASE_TEST(readv_zero); EXPECT_SYSZR(1, readv(1, NULL, 0)); break; CASE_TEST(writev_badf); EXPECT_SYSER(1, writev(-1, &iov_one, 1), -1, EBADF); break; CASE_TEST(writev_zero); EXPECT_SYSZR(1, writev(1, NULL, 0)); break; + CASE_TEST(ptrace); EXPECT_SYSER(1, ptrace(PTRACE_CONT, getpid(), NULL, NULL), -1, ESRCH); break; CASE_TEST(syscall_noargs); EXPECT_SYSEQ(1, syscall(__NR_getpid), getpid()); break; CASE_TEST(syscall_args); EXPECT_SYSER(1, syscall(__NR_statx, 0, NULL, 0, 0, NULL), -1, EFAULT); break; CASE_TEST(namespace); EXPECT_SYSZR(euid0 && proc, test_namespace()); break;