git: a6ad662abfd9 - stable/13 - libsysdecode: Decode linux_clone syscall flags

From: Dmitry Chagin <dchagin_at_FreeBSD.org>
Date: Thu, 29 Jun 2023 08:20:40 UTC
The branch stable/13 has been updated by dchagin:

URL: https://cgit.FreeBSD.org/src/commit/?id=a6ad662abfd92ee9eb6ce24b21192fef8cea5f70

commit a6ad662abfd92ee9eb6ce24b21192fef8cea5f70
Author:     Dmitry Chagin <dchagin@FreeBSD.org>
AuthorDate: 2023-05-26 16:32:20 +0000
Commit:     Dmitry Chagin <dchagin@FreeBSD.org>
CommitDate: 2023-06-29 08:16:00 +0000

    libsysdecode: Decode linux_clone syscall flags
    
    Reviewed by:            emaste
    Differential Revision:  https://reviews.freebsd.org/D40150
    MFC after:              1 week
    
    (cherry picked from commit bd35e83bcf03a3650b5574f81201e8e55af4cdd7)
---
 lib/libsysdecode/linux.c       | 18 ++++++++++++++++++
 lib/libsysdecode/mklinuxtables |  1 +
 lib/libsysdecode/sysdecode.h   |  1 +
 3 files changed, 20 insertions(+)

diff --git a/lib/libsysdecode/linux.c b/lib/libsysdecode/linux.c
index 4b6aab478a33..44de91ef66cb 100644
--- a/lib/libsysdecode/linux.c
+++ b/lib/libsysdecode/linux.c
@@ -52,6 +52,7 @@ __FBSDID("$FreeBSD$");
 
 #include <compat/linux/linux.h>
 #include <compat/linux/linux_file.h>
+#include <compat/linux/linux_fork.h>
 #include <compat/linux/linux_time.h>
 
 #define	X(a,b)	{ a, #b },
@@ -240,3 +241,20 @@ sysdecode_linux_open_flags(FILE *fp, int flags, int *rem)
 		*rem = val | mode;
 	return (printed);
 }
+
+bool
+sysdecode_linux_clone_flags(FILE *fp, int flags, int *rem)
+{
+	uintmax_t val;
+	bool printed;
+	int sig;
+
+	sig = flags & LINUX_CSIGNAL;
+	if (sig != 0)
+		fprintf(fp, "(%s)", sysdecode_linux_signal(sig));
+	val = (unsigned)flags & ~LINUX_CSIGNAL;
+	print_mask_part(fp, cloneflags, &val, &printed);
+	if (rem != NULL)
+		*rem = val;
+	return (printed);
+}
diff --git a/lib/libsysdecode/mklinuxtables b/lib/libsysdecode/mklinuxtables
index eebdadd03613..70490321cc68 100644
--- a/lib/libsysdecode/mklinuxtables
+++ b/lib/libsysdecode/mklinuxtables
@@ -94,6 +94,7 @@ gen_table "clockflags"  "LINUX_TIMER_[A-Z_]+[[:space:]]+0x[0-9]+"        "compat
 gen_table "clockcpuids" "LINUX_CPUCLOCK_[A-Z_]+[[:space:]]+[0-9]+"       "compat/linux/linux_time.h"	"_MASK|_MAX"
 gen_table "openflags"   "LINUX_O_[A-Z_]+[[:space:]]+[0-9]+"              "compat/linux/linux_file.h"	"O_RDONLY|O_RDWR|O_WRONLY|O_ACCMODE"
 gen_table "sigprocmaskhow" "LINUX_SIG_[A-Z]+[[:space:]]+[0-9]+"          "compat/linux/linux.h"
+gen_table "cloneflags"  "LINUX_CLONE_[A-Z_]+[[:space:]]+[[:alnum:]]+"    "compat/linux/linux_fork.h"	"LINUX_CLONE_LEGACY_FLAGS|LINUX_CLONE_CLEAR_SIGHAND|LINUX_CLONE_INTO_CGROUP|LINUX_CLONE_NEWTIME"
 
 # Generate a .depend file for our output file
 if [ -n "$output_file" ]; then
diff --git a/lib/libsysdecode/sysdecode.h b/lib/libsysdecode/sysdecode.h
index 4ea2989ca185..15bc404dc986 100644
--- a/lib/libsysdecode/sysdecode.h
+++ b/lib/libsysdecode/sysdecode.h
@@ -144,6 +144,7 @@ bool	sysdecode_shmflags(FILE *_fp, int _flags, int *_rem);
 bool	sysdecode_linux_atflags(FILE *_fp, int _flag, int *_rem);
 void	sysdecode_linux_clockid(FILE *_fp, clockid_t _which);
 bool	sysdecode_linux_clock_flags(FILE *_fp, int _flags, int *_rem);
+bool	sysdecode_linux_clone_flags(FILE *_fp, int _flags, int *_rem);
 bool	sysdecode_linux_open_flags(FILE *_fp, int _flags, int *_rem);
 const char *sysdecode_linux_signal(int _sig);
 const char *sysdecode_linux_sigprocmask_how(int _how);