summaryrefslogtreecommitdiffstats
path: root/linux
diff options
context:
space:
mode:
authorMattias Andrée <maandree@kth.se>2023-12-03 19:23:35 +0100
committerMattias Andrée <maandree@kth.se>2023-12-03 19:23:35 +0100
commitc131f122778c62f920a99bbf854ced4a37ee8b03 (patch)
tree14c933f98f4d64dffb0a594bc40dd5121c6c5a8e /linux
downloadlibsyscalls-c131f122778c62f920a99bbf854ced4a37ee8b03.tar.gz
libsyscalls-c131f122778c62f920a99bbf854ced4a37ee8b03.tar.bz2
libsyscalls-c131f122778c62f920a99bbf854ced4a37ee8b03.tar.xz
First commit
Signed-off-by: Mattias Andrée <maandree@kth.se>
Diffstat (limited to 'linux')
-rw-r--r--linux/download.mk33
-rw-r--r--linux/errors.c130
-rw-r--r--linux/errors.mk52
-rw-r--r--linux/linux-support.mk54
-rw-r--r--linux/no.mk0
-rw-r--r--linux/signals.c130
-rw-r--r--linux/signals.mk138
-rw-r--r--linux/symbols.c321
-rw-r--r--linux/symbols.mk73
-rw-r--r--linux/syscall-table.c58
-rw-r--r--linux/syscall-table.mk60
-rw-r--r--linux/syscalls.h988
-rw-r--r--linux/syscalls.mk450
-rw-r--r--linux/types.c54
-rw-r--r--linux/types.mk2
-rwxr-xr-xlinux/what-architecture-am-i-using26
l---------linux/yes.mk1
17 files changed, 2570 insertions, 0 deletions
diff --git a/linux/download.mk b/linux/download.mk
new file mode 100644
index 0000000..31da0b1
--- /dev/null
+++ b/linux/download.mk
@@ -0,0 +1,33 @@
+LINUX_MIRROR = https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/snapshot
+LINUX_TAREXT = tar.gz
+LINUX_TARBALL = $(LINUX_MIRROR)/linux-$(LINUX_VERSION).$(LINUX_TAREXT)
+LINUX_UNPACK = (gunzip | tar -x)
+
+LINUX_DIR = linux-src/linux-$(LINUX_VERSION)
+LINUX_SOURCE = $(LINUX_DIR)/README
+
+
+SILENCE_LINUX_SOURCE_IF_EXISTS != test ! -f "$(LINUX_SOURCE)" || printf '@'
+SILENCE_LINUX_TARBALL_IF_EXISTS != test ! -f "$(LINUX_DIR).$(LINUX_TAREXT)" || printf '@'
+
+$(LINUX_SOURCE): $(LINUX_DIR).$(LINUX_TAREXT)
+ $(SILENCE_LINUX_SOURCE_IF_EXISTS)if test ! -f "$@"; then \
+ (cd -- linux-src && $(LINUX_UNPACK)) < $(LINUX_DIR).$(LINUX_TAREXT) && \
+ (test -d $(LINUX_DIR) || \
+ mv -- linux-src/linux-v$(LINUX_VERSION) $(LINUX_DIR) || \
+ mv -- linux-src/$(LINUX_VERSION) $(LINUX_DIR) || \
+ mv -- linux-src/v$(LINUX_VERSION) $(LINUX_DIR) \
+ ) && \
+ touch -- "$@"; \
+ fi
+
+$(LINUX_DIR).$(LINUX_TAREXT):
+ $(SILENCE_LINUX_TARBALL_IF_EXISTS)mkdir -p -- linux-src
+ $(SILENCE_LINUX_TARBALL_IF_EXISTS)test -f "$@" || $(DOWNLOAD) $(LINUX_TARBALL) > "$@" || (rm -f -- "$@"; false)
+
+
+download-linux: $(LINUX_DIR).$(LINUX_TAREXT)
+download: download-linux
+
+
+.PHONY: download-linux
diff --git a/linux/errors.c b/linux/errors.c
new file mode 100644
index 0000000..d8a0e7f
--- /dev/null
+++ b/linux/errors.c
@@ -0,0 +1,130 @@
+/* See LICENSE file for copyright and license details. */
+
+/* This file is included from ../libsyscalls_get_syscall_errors.c */
+
+
+#include "../generated/linux-errors.h"
+
+static enum libsyscalls_error
+get_linux_syscall_errors(enum libsyscalls_arch arch, const struct libsyscalls_named_number **errs_out, size_t *nerrs_out)
+{
+#define CASE(ARCH)\
+ *errs_out = linux_errors_for_##ARCH;\
+ *nerrs_out = sizeof(linux_errors_for_##ARCH) / sizeof(*linux_errors_for_##ARCH);\
+ goto out
+
+ switch ((int)arch) {
+ case LIBSYSCALLS_ARCH_ALPHA:
+#ifdef LIST_LINUX_ERRORS_FOR_ALPHA
+ CASE(alpha);
+#else
+ break;
+#endif
+
+ case LIBSYSCALLS_ARCH_AMD64:
+ case LIBSYSCALLS_ARCH_AMD64_X32:
+ case LIBSYSCALLS_ARCH_I386:
+#ifdef LIST_LINUX_ERRORS_FOR_X86
+ CASE(x86);
+#else
+ break;
+#endif
+
+ case LIBSYSCALLS_ARCH_ARM_OABI:
+ case LIBSYSCALLS_ARCH_ARM_EABI:
+#ifdef LIST_LINUX_ERRORS_FOR_ARM
+ CASE(arm);
+#else
+ break;
+#endif
+
+ case LIBSYSCALLS_ARCH_IA64:
+#ifdef LIST_LINUX_ERRORS_FOR_IA64
+ CASE(ia64);
+#else
+ break;
+#endif
+
+ case LIBSYSCALLS_ARCH_M68K:
+#ifdef LIST_LINUX_ERRORS_FOR_M68K
+ CASE(m68k);
+#else
+ break;
+#endif
+
+ case LIBSYSCALLS_ARCH_MICROBLAZE:
+#ifdef LIST_LINUX_ERRORS_FOR_MICROBLAZE
+ CASE(microblaze);
+#else
+ break;
+#endif
+
+ case LIBSYSCALLS_ARCH_MIPS_O32:
+ case LIBSYSCALLS_ARCH_MIPS_N32:
+ case LIBSYSCALLS_ARCH_MIPS_N64:
+#ifdef LIST_LINUX_ERRORS_FOR_MIPS
+ CASE(mips);
+#else
+ break;
+#endif
+
+ case LIBSYSCALLS_ARCH_PARISC_32:
+ case LIBSYSCALLS_ARCH_PARISC_64:
+#ifdef LIST_LINUX_ERRORS_FOR_PARISC
+ CASE(parisc);
+#else
+ break;
+#endif
+
+ case LIBSYSCALLS_ARCH_POWERPC_32:
+ case LIBSYSCALLS_ARCH_POWERPC_64:
+ case LIBSYSCALLS_ARCH_POWERPC_NOSPU:
+ case LIBSYSCALLS_ARCH_POWERPC_SPU:
+#ifdef LIST_LINUX_ERRORS_FOR_POWERPC
+ CASE(powerpc);
+#else
+ break;
+#endif
+
+ case LIBSYSCALLS_ARCH_S390_32:
+ case LIBSYSCALLS_ARCH_S390_64:
+#ifdef LIST_LINUX_ERRORS_FOR_S390
+ CASE(s390);
+#else
+ break;
+#endif
+
+ case LIBSYSCALLS_ARCH_SH:
+#ifdef LIST_LINUX_ERRORS_FOR_SH
+ CASE(sh);
+#else
+ break;
+#endif
+
+ case LIBSYSCALLS_ARCH_SPARC_32:
+ case LIBSYSCALLS_ARCH_SPARC_64:
+#ifdef LIST_LINUX_ERRORS_FOR_SPARC
+ CASE(sparc);
+#else
+ break;
+#endif
+
+ case LIBSYSCALLS_ARCH_XTENSA:
+#ifdef LIST_LINUX_ERRORS_FOR_XTENSA
+ CASE(xtensa);
+#else
+ break;
+#endif
+
+ default:
+ return LIBSYSCALLS_E_ARCHNOSUP;
+ }
+
+ *errs_out = linux_errors_for_generic;
+ *nerrs_out = sizeof(linux_errors_for_generic) / sizeof(*linux_errors_for_generic);
+
+out:
+ return LIBSYSCALLS_E_OK;
+
+#undef CASE
+}
diff --git a/linux/errors.mk b/linux/errors.mk
new file mode 100644
index 0000000..b6b7197
--- /dev/null
+++ b/linux/errors.mk
@@ -0,0 +1,52 @@
+libsyscalls_get_syscall_errors.o: generated/linux-errors.h linux/errors.c
+libsyscalls_get_syscall_errors.lo: generated/linux-errors.h linux/errors.c
+
+generated/linux-errors.tbl: $(LINUX_SOURCE) linux/errors.mk
+ mkdir -p -- generated
+ set -e; ( \
+ get_gcc_or_clang () { \
+ ( \
+ ( \
+ IFS=:; \
+ for dir in $$PATH; do \
+ if test ! -d "$$dir"; then continue; fi; \
+ for file in "$$dir"/*; do \
+ if test ! -x "$$file"; then continue; fi; \
+ printf '%s\n' "$$file"; \
+ done \
+ done \
+ ) | grep '/\(gcc\|clang\)\(-[0-9.]\+\)\?$$'; \
+ printf '%s\n' gcc; \
+ ) | sed 1q; \
+ }; \
+ extract="$$(get_gcc_or_clang) -E -dM"; \
+ toolsdir="linux-src/linux-$(LINUX_VERSION)/tools"; \
+ process_arch() \
+ { \
+ ($$extract "-I$$toolsdir/include/uapi" "$$2" && \
+ cat -- "linux-src/linux-$(LINUX_VERSION)/include/linux/errno.h") \
+ | sed -n 's/^\s*\x23\s*define\s\+\(E[^\s]\+\)\s\+\([0-9]\+\)\s*\(\/.*\)\?$$/'"$$1"' \2 \1/p' \
+ | sort -k 2 -nu; \
+ }; \
+ for arch in $$(printf '%s\n' "$$toolsdir/arch"/*/ | sed 's:^.*/\([^/]*\)/$$:\1:'); do \
+ if test -f "$$toolsdir/arch/$$arch/include/uapi/asm/errno.h"; then \
+ process_arch "$$arch" "$$toolsdir/arch/$$arch/include/uapi/asm/errno.h"; \
+ fi; \
+ done; \
+ process_arch generic "$$toolsdir/include/uapi/asm-generic/errno.h"; \
+ ) > $@
+
+generated/linux-errors.h: generated/linux-errors.tbl linux/errors.mk
+ set -e; \
+ for arch in $$(cut -d ' ' -f 1 < generated/linux-errors.tbl | uniq); do \
+ ARCH="$$(printf '%s\n' "$$arch" | tr '[a-z]' '[A-Z]')"; \
+ printf '#define LIST_LINUX_ERRORS_FOR_%s(X, D)\\\n' "$$ARCH"; \
+ sed -n 's/^'"$$arch"' \([0-9]\+\) \(.*\)$$/\tX(\1, "\2") D\\/p' \
+ < generated/linux-errors.tbl \
+ | sed '$$s/ D\\//'; \
+ printf 'static struct libsyscalls_named_number linux_errors_for_%s[] = {\n' "$$arch"; \
+ printf '#define X(NR, NAME) {.number.s = NR, .name = NAME}\n'; \
+ printf '\tLIST_LINUX_ERRORS_FOR_%s(X, COMMA)\n' "$$ARCH"; \
+ printf '#undef X\n'; \
+ printf '};\n'; \
+ done > $@
diff --git a/linux/linux-support.mk b/linux/linux-support.mk
new file mode 100644
index 0000000..5efeafe
--- /dev/null
+++ b/linux/linux-support.mk
@@ -0,0 +1,54 @@
+LINUX_VERSION = 6.6
+# Changing this number can potentially break the build,
+# silently or violently, so make sure everything still
+# works afterwards
+
+SUPPORTED_LINUX_ARCHES =\
+ ALPHA\
+ AMD64\
+ AMD64_X32\
+ ARM_OABI\
+ ARM_EABI\
+ IA64\
+ M68K\
+ MICROBLAZE\
+ MIPS_O32\
+ MIPS_N32\
+ MIPS_N64\
+ PARISC_32\
+ PARISC_64\
+ POWERPC_32\
+ POWERPC_64\
+ POWERPC_NOSPU\
+ POWERPC_SPU\
+ S390_32\
+ S390_64\
+ SH\
+ SPARC_32\
+ SPARC_64\
+ I386\
+ XTENSA
+
+OPERATING_SYSTEMS += linux
+NPARAMS += 8
+
+
+SUPPORTED_LINUX_ARCHES != printf '%s\n' $(SUPPORTED_LINUX_ARCHES) $(SUPPORTED_ARCHES) | sort | uniq -d
+
+
+include linux/download.mk
+include linux/errors.mk
+include linux/signals.mk
+include linux/syscalls.mk
+include linux/syscall-table.mk
+include linux/symbols.mk
+include linux/types.mk
+
+
+HDR += generated/linux-arches.h
+
+generated/linux-arches.h: linux/linux-support.mk
+ mkdir -p -- generated
+ (printf '\43define LIST_LINUX_ARCHES(X, D)\\\n' && \
+ printf '\tX(%s) D\\\n' $(SUPPORTED_LINUX_ARCHES); \
+ ) | sed '$$s/ D\\//' > $@
diff --git a/linux/no.mk b/linux/no.mk
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/linux/no.mk
diff --git a/linux/signals.c b/linux/signals.c
new file mode 100644
index 0000000..7d7f868
--- /dev/null
+++ b/linux/signals.c
@@ -0,0 +1,130 @@
+/* See LICENSE file for copyright and license details. */
+
+/* This file is included from ../libsyscalls_get_signals.c */
+
+
+#include "../generated/linux-signals.h"
+
+static enum libsyscalls_error
+get_linux_signals(enum libsyscalls_arch arch, const struct libsyscalls_named_number **sigs_out, size_t *nsigs_out)
+{
+#define CASE(ARCH)\
+ *sigs_out = linux_signals_for_##ARCH;\
+ *nsigs_out = sizeof(linux_signals_for_##ARCH) / sizeof(*linux_signals_for_##ARCH);\
+ goto out
+
+ switch ((int)arch) {
+ case LIBSYSCALLS_ARCH_ALPHA:
+#ifdef LIST_LINUX_SIGNALS_FOR_ALPHA
+ CASE(alpha);
+#else
+ break;
+#endif
+
+ case LIBSYSCALLS_ARCH_AMD64:
+ case LIBSYSCALLS_ARCH_AMD64_X32:
+ case LIBSYSCALLS_ARCH_I386:
+#ifdef LIST_LINUX_SIGNALS_FOR_X86
+ CASE(x86);
+#else
+ break;
+#endif
+
+ case LIBSYSCALLS_ARCH_ARM_OABI:
+ case LIBSYSCALLS_ARCH_ARM_EABI:
+#ifdef LIST_LINUX_SIGNALS_FOR_ARM
+ CASE(arm);
+#else
+ break;
+#endif
+
+ case LIBSYSCALLS_ARCH_IA64:
+#ifdef LIST_LINUX_SIGNALS_FOR_IA64
+ CASE(ia64);
+#else
+ break;
+#endif
+
+ case LIBSYSCALLS_ARCH_M68K:
+#ifdef LIST_LINUX_SIGNALS_FOR_M68K
+ CASE(m68k);
+#else
+ break;
+#endif
+
+ case LIBSYSCALLS_ARCH_MICROBLAZE:
+#ifdef LIST_LINUX_SIGNALS_FOR_MICROBLAZE
+ CASE(microblaze);
+#else
+ break;
+#endif
+
+ case LIBSYSCALLS_ARCH_MIPS_O32:
+ case LIBSYSCALLS_ARCH_MIPS_N32:
+ case LIBSYSCALLS_ARCH_MIPS_N64:
+#ifdef LIST_LINUX_SIGNALS_FOR_MIPS
+ CASE(mips);
+#else
+ break;
+#endif
+
+ case LIBSYSCALLS_ARCH_PARISC_32:
+ case LIBSYSCALLS_ARCH_PARISC_64:
+#ifdef LIST_LINUX_SIGNALS_FOR_PARISC
+ CASE(parisc);
+#else
+ break;
+#endif
+
+ case LIBSYSCALLS_ARCH_POWERPC_32:
+ case LIBSYSCALLS_ARCH_POWERPC_64:
+ case LIBSYSCALLS_ARCH_POWERPC_NOSPU:
+ case LIBSYSCALLS_ARCH_POWERPC_SPU:
+#ifdef LIST_LINUX_SIGNALS_FOR_POWERPC
+ CASE(powerpc);
+#else
+ break;
+#endif
+
+ case LIBSYSCALLS_ARCH_S390_32:
+ case LIBSYSCALLS_ARCH_S390_64:
+#ifdef LIST_LINUX_SIGNALS_FOR_S390
+ CASE(s390);
+#else
+ break;
+#endif
+
+ case LIBSYSCALLS_ARCH_SH:
+#ifdef LIST_LINUX_SIGNALS_FOR_SH
+ CASE(sh);
+#else
+ break;
+#endif
+
+ case LIBSYSCALLS_ARCH_SPARC_32:
+ case LIBSYSCALLS_ARCH_SPARC_64:
+#ifdef LIST_LINUX_SIGNALS_FOR_SPARC
+ CASE(sparc);
+#else
+ break;
+#endif
+
+ case LIBSYSCALLS_ARCH_XTENSA:
+#ifdef LIST_LINUX_SIGNALS_FOR_XTENSA
+ CASE(xtensa);
+#else
+ break;
+#endif
+
+ default:
+ return LIBSYSCALLS_E_ARCHNOSUP;
+ }
+
+ *sigs_out = linux_signals_for_generic;
+ *nsigs_out = sizeof(linux_signals_for_generic) / sizeof(*linux_signals_for_generic);
+
+out:
+ return LIBSYSCALLS_E_OK;
+
+#undef CASE
+}
diff --git a/linux/signals.mk b/linux/signals.mk
new file mode 100644
index 0000000..f7a8a45
--- /dev/null
+++ b/linux/signals.mk
@@ -0,0 +1,138 @@
+libsyscalls_get_signals.o: generated/linux-signals.h linux/signals.c
+libsyscalls_get_signals.lo: generated/linux-signals.h linux/signals.c
+
+generated/linux-signals.tbl: $(LINUX_SOURCE) linux/signals.mk
+ mkdir -p -- generated
+ set -e; ( \
+ get_gcc_or_clang () { \
+ ( \
+ ( \
+ IFS=:; \
+ for dir in $$PATH; do \
+ if test ! -d "$$dir"; then continue; fi; \
+ for file in "$$dir"/*; do \
+ if test ! -x "$$file"; then continue; fi; \
+ printf '%s\n' "$$file"; \
+ done \
+ done \
+ ) | grep '/\(gcc\|clang\)\(-[0-9.]\+\)\?$$'; \
+ printf '%s\n' gcc; \
+ ) | sed 1q; \
+ }; \
+ if test -n "$(CC_DEF_EXTRACT)"; then \
+ c="$(CC_DEF_EXTRACT)"; \
+ else \
+ c="$(CC)"; \
+ fi; \
+ c="$$($$c --version 2>&1 | sed 1q | sed 's/^.*(\(.*\)).*$$/\1/' | tr '[A-Z]' '[a-z]' | cut -d ' ' -f 1)"; \
+ if test ! "$$c" = gcc && test ! "$$c" = clang; then \
+ c="$$(get_gcc_or_clang)"; \
+ fi; \
+ extract="$$c -E -dM -D__KERNEL__"; \
+ srcdir="linux-src/linux-$(LINUX_VERSION)"; \
+ mkdir -p -- "$$srcdir/tools/include/generated/"; \
+ touch -- "$$srcdir/tools/include/generated/bounds.h"; \
+ touch -- "$$srcdir/tools/include/generated/timeconst.h"; \
+ process_arch () \
+ { \
+ set -e; \
+ signals="$$( \
+ $$extract "-I$$srcdir/tools/include" $$fixes "$$2" \
+ | sed -n 's/^\s*\x23\s*define\s\+\(SIG[^\s]\+\)\s\+\([0-9]\+\)\s*\(\/.*\)\?$$/'"$$1"' \2 \1/p' \
+ | grep -v ' SIG_' \
+ | grep -v ' SIGSTKSZ' \
+ | sort -k 2 -nu; \
+ )"; \
+ if test "$$1" = arm; then \
+ signals="$$(printf "%s\n" "$$signals" | sed 's/\bSIGSWI\b/SIGRTMIN/')"; \
+ fi; \
+ printf "%s\n" "$$signals"; \
+ sigrtmin="$$(printf "%s\n" "$$signals" | sed -n 's/^.* \([0-9]\+\) SIGRTMIN$$/\1/p')"; \
+ maxnamed="$$(printf "%s\n" "$$signals" | sed -n '$$s/^.* \([0-9]\+\) .*$$/\1/p')"; \
+ test "$$sigrtmin" = "$$maxnamed"; \
+ maxsig=_NSIG; \
+ depth=0; \
+ while test -n "$$maxsig" && test -n "$$(printf '%s\n' "$$maxsig" | tr -d '[0-9]')" ; do \
+ printf '%s: looking for %s\n' "$$1" "$$maxsig" >&2; \
+ def="$$maxsig"; \
+ maxsig="$$($$extract "-I$$srcdir/tools/include" $$fixes "$$2" \
+ | sed -n 's/^\s*\x23\s*define\s\+'"$$def"'\s\+\([A-Z0-9_]\+\)\s*\(\/.*\)\?$$/\1/p')"; \
+ if test -z "$$maxsig"; then \
+ maxsig="$$($$extract "-I$$srcdir/tools/include" \
+ "-I$$srcdir/arch/$$1/include" \
+ "-I$$srcdir/include" \
+ "-I$$srcdir" \
+ $$fixes \
+ "$$(printf '%s\n' "$$2" | sed 's:/uapi/:/:')" \
+ | sed -n 's/^\s*\x23\s*define\s\+'"$$def"'\s\+\([A-Z0-9_]\+\)\s*\(\/.*\)\?$$/\1/p')"; \
+ fi; \
+ printf '%s: found %s\n' "$$1" "$$maxsig" >&2; \
+ : $$(( depth++ )); \
+ test $$(( depth )) -lt 1000; \
+ done; \
+ test -n "$$maxsig"; \
+ i=1; \
+ while (( sigrtmin + i <= maxsig )); do \
+ printf '%s %d SIGRTMIN+%d\n' "$$1" $$(( sigrtmin + i )) $$i; \
+ : $$(( i++ )); \
+ done; \
+ }; \
+ getsigs () { \
+ process_arch "$$@" | sed 's/\bSIGRTMIN\b/_&/'; \
+ }; \
+ for arch in $$(printf '%s\n' "$$srcdir/arch"/*/ | sed 's:^.*/\([^/]*\)/$$:\1:'); do \
+ if test ! "$$arch" = s390 && test -f "$$srcdir/arch/$$arch/include/uapi/asm/signal.h"; then \
+ getsigs "$$arch" "$$srcdir/arch/$$arch/include/uapi/asm/signal.h"; \
+ fi; \
+ done; \
+ getsigs generic "$$srcdir/include/uapi/asm-generic/signal.h"; \
+ ) > $@
+ @printf '\033[1;32m%s\033[m\n' \
+ 'Compiler warnings above are not of interest, they were generated during' \
+ 'extraction of the Linux source code and are not part of this library'
+ @grep '^generic.*SIGRTMIN+.*' >/dev/null 2>/dev/null < $@
+ grep '^generic ' < $@ | cut -d ' ' -f 2 > generated/linux-signals.generic.tbl
+ @# For most architectures the signal numbers are the same,
+ @# yet they have their own signal.h listing them, so to remove
+ @# duplication in the library, we removing duplicates after
+ @# validating that they have not diverged
+ grep '^arm ' < $@ | cut -d ' ' -f 2 | diff -u generated/linux-signals.generic.tbl -
+ sed '/^arm /d' < $@ > $@.tmp && mv -- $@.tmp $@
+ grep '^arm64 ' < $@ | cut -d ' ' -f 2 | diff -u generated/linux-signals.generic.tbl -
+ sed '/^arm64 /d' < $@ > $@.tmp && mv -- $@.tmp $@
+ grep '^hexagon ' < $@ | cut -d ' ' -f 2 | diff -u generated/linux-signals.generic.tbl -
+ sed '/^hexagon /d' < $@ > $@.tmp && mv -- $@.tmp $@
+ grep '^loongarch ' < $@ | cut -d ' ' -f 2 | diff -u generated/linux-signals.generic.tbl -
+ sed '/^loongarch /d' < $@ > $@.tmp && mv -- $@.tmp $@
+ grep '^arc ' < $@ | cut -d ' ' -f 2 | diff -u generated/linux-signals.generic.tbl -
+ sed '/^arc /d' < $@ > $@.tmp && mv -- $@.tmp $@
+ grep '^nios2 ' < $@ | cut -d ' ' -f 2 | diff -u generated/linux-signals.generic.tbl -
+ sed '/^nios2 /d' < $@ > $@.tmp && mv -- $@.tmp $@
+ grep '^ia64 ' < $@ | cut -d ' ' -f 2 | diff -u generated/linux-signals.generic.tbl -
+ sed '/^ia64 /d' < $@ > $@.tmp && mv -- $@.tmp $@
+ grep '^m68k ' < $@ | cut -d ' ' -f 2 | diff -u generated/linux-signals.generic.tbl -
+ sed '/^m68k /d' < $@ > $@.tmp && mv -- $@.tmp $@
+ grep '^powerpc ' < $@ | cut -d ' ' -f 2 | diff -u generated/linux-signals.generic.tbl -
+ sed '/^powerpc /d' < $@ > $@.tmp && mv -- $@.tmp $@
+ grep '^sh ' < $@ | cut -d ' ' -f 2 | diff -u generated/linux-signals.generic.tbl -
+ sed '/^sh /d' < $@ > $@.tmp && mv -- $@.tmp $@
+ grep '^x86 ' < $@ | cut -d ' ' -f 2 | diff -u generated/linux-signals.generic.tbl -
+ sed '/^x86 /d' < $@ > $@.tmp && mv -- $@.tmp $@
+ grep '^xtensa ' < $@ | cut -d ' ' -f 2 | diff -u generated/linux-signals.generic.tbl -
+ sed '/^xtensa /d' < $@ > $@.tmp && mv -- $@.tmp $@
+ rm -f -- generated/linux-signals.*.tbl
+
+generated/linux-signals.h: generated/linux-signals.tbl linux/signals.mk
+ set -e; \
+ for arch in $$(cut -d ' ' -f 1 < generated/linux-signals.tbl | uniq); do \
+ ARCH="$$(printf '%s\n' "$$arch" | tr '[a-z]' '[A-Z]')"; \
+ printf '#define LIST_LINUX_SIGNALS_FOR_%s(X, D)\\\n' "$$ARCH"; \
+ sed -n 's/^'"$$arch"' \([0-9]\+\) \(.*\)$$/\tX(\1, "\2") D\\/p' \
+ < generated/linux-signals.tbl \
+ | sed '$$s/ D\\//'; \
+ printf 'static struct libsyscalls_named_number linux_signals_for_%s[] = {\n' "$$arch"; \
+ printf '#define X(NR, NAME) {.number.s = NR, .name = NAME}\n'; \
+ printf '\tLIST_LINUX_SIGNALS_FOR_%s(X, COMMA)\n' "$$ARCH"; \
+ printf '#undef X\n'; \
+ printf '};\n'; \
+ done > $@
diff --git a/linux/symbols.c b/linux/symbols.c
new file mode 100644
index 0000000..d91880f
--- /dev/null
+++ b/linux/symbols.c
@@ -0,0 +1,321 @@
+/* See LICENSE file for copyright and license details. */
+
+/* This file is included from ../libsyscalls_get_syscall_display_info.c */
+
+/* TODO (see syscalls.h) */
+#define extract_linux_symbol_madvise extract_linux_symbol_noflags
+#define extract_linux_symbol_msync extract_linux_symbol_noflags
+#define extract_linux_symbol_mlock extract_linux_symbol_noflags
+#define extract_linux_symbol_mcl extract_linux_symbol_noflags
+#define extract_linux_symbol_epoll extract_linux_symbol_noflags
+#define extract_linux_symbol_sock_fd extract_linux_symbol_noflags
+#define extract_linux_symbol_dup3 extract_linux_symbol_noflags
+#define extract_linux_symbol_pipe extract_linux_symbol_noflags
+#define extract_linux_symbol_inotify_fd extract_linux_symbol_noflags
+#define extract_linux_symbol_fan_event_f extract_linux_symbol_noflags
+#define extract_linux_symbol_mq_open extract_linux_symbol_noflags
+#define extract_linux_symbol_swapon extract_linux_symbol_noflags
+#define extract_linux_symbol_inotify_mask extract_linux_symbol_noflags
+#define extract_linux_symbol_shmget extract_linux_symbol_noflags
+#define extract_linux_symbol_fan_class extract_linux_symbol_noflags
+#define extract_linux_symbol_fan_mark extract_linux_symbol_noflags
+#define extract_linux_symbol_fan extract_linux_symbol_noflags
+#define extract_linux_symbol_socket extract_linux_symbol_noflags
+#define extract_linux_symbol_reboot extract_linux_symbol_noflags
+
+
+static const char *
+extract_linux_symbol_signal(struct libsyscalls_symbol_printer_data *data, unsigned long long int *valuep, char *fallback_out)
+{
+ return extract_signal(LIBSYSCALLS_OS_LINUX, data->arch, valuep, fallback_out,
+ 0 /* doesn't matter, unsigned is probably faster */);
+}
+
+
+static const char *
+extract_linux_symbol_mode(struct libsyscalls_symbol_printer_data *data, unsigned long long int *valuep, char *fallback_out)
+{
+ unsigned long long int value;
+ size_t i;
+ *fallback_out = 'o';
+ *valuep ^= value = *valuep & 07777ULL;
+ i = 0;
+ data->buf[i++] = '0';
+ if (value & 07000) goto digits4;
+ if (value & 0700) goto digits3;
+ if (value & 070) goto digits2;
+ if (value & 07) goto digits1;
+ if (0) {
+ digits4:
+ data->buf[i++] = '0' | (value & 07000);
+ digits3:
+ data->buf[i++] = '0' | (value & 0700);
+ digits2:
+ data->buf[i++] = '0' | (value & 070);
+ digits1:
+ data->buf[i++] = '0' | (value & 07);
+ }
+ data->buf[i++] = ' ';
+ data->buf[i++] = '(';
+ data->buf[i++] = (value & 0400) ? 'r' : '-';
+ data->buf[i++] = (value & 0200) ? 'w' : '-';
+ if (value & 04000)
+ data->buf[i++] = (value & 0100) ? 's' : 'S';
+ else
+ data->buf[i++] = (value & 0100) ? 'x' : '-';
+ data->buf[i++] = (value & 040) ? 'r' : '-';
+ data->buf[i++] = (value & 020) ? 'w' : '-';
+ if (value & 02000)
+ data->buf[i++] = (value & 010) ? 's' : 'S';
+ else
+ data->buf[i++] = (value & 010) ? 'x' : '-';
+ data->buf[i++] = (value & 04) ? 'r' : '-';
+ data->buf[i++] = (value & 02) ? 'w' : '-';
+ if (value & 01000)
+ data->buf[i++] = (value & 01) ? 't' : 'T';
+ else
+ data->buf[i++] = (value & 01) ? 'x' : '-';
+ data->buf[i++] = ')';
+ data->buf[i] = '\0';
+ return data->buf;
+}
+
+
+static const char *
+extract_linux_symbol_umask(struct libsyscalls_symbol_printer_data *data, unsigned long long int *valuep, char *fallback_out)
+{
+ unsigned long long int value;
+ size_t i;
+ *fallback_out = 'o';
+ *valuep ^= value = *valuep & 0777ULL;
+ i = 0;
+ data->buf[i++] = '0';
+ if (value & 0700) goto digits3;
+ if (value & 070) goto digits2;
+ if (value & 07) goto digits1;
+ if (0) {
+ digits3:
+ data->buf[i++] = '0' | (value & 0700);
+ digits2:
+ data->buf[i++] = '0' | (value & 070);
+ digits1:
+ data->buf[i++] = '0' | (value & 07);
+ }
+ data->buf[i++] = ' ';
+ data->buf[i++] = '(';
+ data->buf[i++] = 'u';
+ data->buf[i++] = ':';
+ data->buf[i++] = ':';
+ data->buf[i++] = (value & 0400) ? '-' : 'r';
+ data->buf[i++] = (value & 0200) ? '-' : 'w';
+ data->buf[i++] = (value & 0100) ? '-' : 'x';
+ data->buf[i++] = ',';
+ data->buf[i++] = 'g';
+ data->buf[i++] = ':';
+ data->buf[i++] = ':';
+ data->buf[i++] = (value & 040) ? '-' : 'r';
+ data->buf[i++] = (value & 020) ? '-' : 'w';
+ data->buf[i++] = (value & 010) ? '-' : 'x';
+ data->buf[i++] = ',';
+ data->buf[i++] = 'o';
+ data->buf[i++] = ':';
+ data->buf[i++] = ':';
+ data->buf[i++] = (value & 04) ? '-' : 'r';
+ data->buf[i++] = (value & 02) ? '-' : 'w';
+ data->buf[i++] = (value & 01) ? '-' : 'x';
+ data->buf[i++] = ')';
+ data->buf[i] = '\0';
+ return data->buf;
+}
+
+
+static const char *
+extract_linux_symbol_dev(struct libsyscalls_symbol_printer_data *data, unsigned long long int *valuep, char *fallback_out)
+{
+ unsigned long long int value;
+ unsigned long long int major, major1, major2;
+ unsigned long long int minor, minor1, minor2;
+
+ *fallback_out = 'x';
+
+ major1 = 0xFFFFF00000000000ULL;
+ minor1 = 0x00000FFFFFF00000ULL;
+ major2 = 0x00000000000FFF00ULL;
+ minor2 = 0x00000000000000FFULL;
+
+ *valuep ^= value = *valuep & (major1 | minor1 | major2 | minor2);
+
+ major1 = (value & major1) / LOWEST_BIT(major1) * POST_HIGHEST_OF_CONSECUTIVELY_BITS(major2);
+ major2 = (value & major2) / LOWEST_BIT(major2);
+
+ minor1 = (value & minor1) / LOWEST_BIT(minor1) * POST_HIGHEST_OF_CONSECUTIVELY_BITS(minor2);
+ minor2 = (value & minor2) / LOWEST_BIT(minor2);
+
+ major = major1 | major2;
+ minor = minor1 | minor1;
+
+ sprintf(data->buf, "%llu (%llu:%llu)", value, major, minor);
+ return data->buf;
+}
+
+
+static const char *
+extract_linux_symbol_clockid_t(struct libsyscalls_symbol_printer_data *data, unsigned long long int *valuep, char *fallback_out)
+{
+ if (*valuep >= 0)
+ return NULL;
+ else if ((*valuep & 7) == 2)
+ sprintf(data->buf, "%lli (pid: %llu)", (long long int)*valuep, ~*valuep / 8);
+ else if ((*valuep & 7) == 3)
+ sprintf(data->buf, "%lli (fd: %llu)", (long long int)*valuep, ~*valuep / 8);
+ else if ((*valuep & 7) == 6)
+ sprintf(data->buf, "%lli (tid: %llu)", (long long int)*valuep, ~*valuep / 8);
+ else
+ sprintf(data->buf, "%lli (~%llu*8 + %u)", (long long int)*valuep, ~*valuep / 8, *valuep & 7);
+ *valuep = 0;
+ return data->buf;
+}
+
+
+#define SYMBOL_PRINTERS_ONLY
+#include "syscalls.h"
+#undef SYMBOL_PRINTERS_ONLY
+
+#include "../generated/linux-symbol-extractors.h"
+
+
+static int
+get_linux_symbol_extractor_by_sym_nr(LIBSYSCALLS_SYMBOL_PRINTER printer, libsyscalls_symbol_printer_function **function_out,
+ enum libsyscalls_arch arch, const struct libsyscalls_syscall_abi *syscall, int nr,
+ struct libsyscalls_symbol_printer_data *data_out)
+{
+ int ret;
+
+#define CASE(E, F, N)\
+ case E:\
+ *function_out = &F;\
+ ret = N;\
+ break
+
+ switch (printer) {
+ LIST_LINUX_EXTRACTORS(CASE, ;);
+
+ case LINUX_SYMBOL_PRINTER_SIGNAL:
+ *function_out = &extract_linux_symbol_signal;
+ ret = 1;
+ break;
+
+ default:
+ abort();
+ }
+
+#undef CASE
+
+ data_out->arch = arch;
+ data_out->nr = nr;
+
+ (void) syscall;
+ return ret;
+}
+
+
+static libsyscalls_symbol_printer_function *
+get_linux_symbol_extractor_by_arg_nr(enum libsyscalls_arch arch, const struct libsyscalls_syscall_abi *syscall,
+ int arg, struct libsyscalls_symbol_printer_data *data_out)
+{
+ int nr, n;
+ unsigned mask;
+ LIBSYSCALLS_SYMBOL_PRINTER first, second;
+ libsyscalls_symbol_printer_function *function;
+
+ if (!syscall->symbol_printer || arg >= NPARAMS) {
+ return NULL;
+ } else if (arg < 0) {
+ if (syscall->symbolic_return)
+ nr = 0;
+ else
+ return NULL;
+ } else if ((syscall->symbolic_mask >> arg) & 1) {
+ mask = (unsigned)syscall->symbolic_mask;
+ nr = (int)syscall->symbolic_return;
+ for (mask &= (1U << arg) - 1; mask; mask >>= 1)
+ nr += (int)mask & 1;
+ } else {
+ return NULL;
+ }
+
+ first = (syscall->symbol_printer & 0x00FF) >> 0;
+ second = (syscall->symbol_printer & 0xFF00) >> 8;
+ if (second && !first)
+ second = syscall->symbol_printer;
+
+ if (first) {
+ n = get_linux_symbol_extractor_by_sym_nr(first, &function, arch, syscall, nr, data_out);
+ if (nr < n)
+ goto have_fun;
+ nr -= n;
+ }
+
+ if (second) {
+ n = get_linux_symbol_extractor_by_sym_nr(second, &function, arch, syscall, nr, data_out);
+ if (nr < n)
+ goto have_fun;
+ }
+
+ abort();
+
+have_fun:
+ return function;
+}
+
+
+static struct libsyscalls_syscall_display_info *
+get_linux_syscall_display_info(enum libsyscalls_arch arch, const struct libsyscalls_syscall_abi *syscall,
+ long long int syscall_number, unsigned long long int *syscall_argument)
+{
+ LIBSYSCALLS_SYMBOL_PRINTER_DATA *data;
+ libsyscalls_symbol_printer_function **funcs;
+ int i, nargs, nsyms;
+ size_t data_size = offsetof(LIBSYSCALLS_SYMBOL_PRINTER_DATA, buf);
+ size_t data_align = alignof(*data);
+ size_t bufspace, bufspace1, bufspace2;
+ LIBSYSCALLS_SYMBOL_PRINTER first, second;
+
+ nargs = (int)syscall->max_argument_count;
+ nargs = nargs < 0 ? 0 : nargs;
+
+ first = (syscall->symbol_printer & 0x00FF) >> 0;
+ second = (syscall->symbol_printer & 0xFF00) >> 8;
+ if (second && !first)
+ second = syscall->symbol_printer;
+
+ bufspace1 = LINUX_REQUIRE_SYMBOL_BUFFER(first);
+ bufspace2 = LINUX_REQUIRE_SYMBOL_BUFFER(second);
+ bufspace = bufspace1 > bufspace2 ? bufspace1 : bufspace2;
+ data_size += bufspace;
+ if (bufspace & (data_align - 1)) {
+ data_size |= data_align - 1;
+ data_size += 1;
+ }
+
+ {
+ char data_vla_buf[(nargs + 1) * data_size + data_align];
+ libsyscalls_symbol_printer_function *funcs_vla[nargs + 1];
+
+ data = (void *)ALIGN_BUF(data_vla_buf, data_align);
+ funcs = funcs_vla;
+
+ nsyms = 0;
+ for (i = 0; i < nargs; i++) {
+ funcs[i] = get_linux_symbol_extractor_by_arg_nr(arch, syscall, i, &data[i]);
+ nsyms += !!funcs[i];
+ }
+ funcs[i] = get_linux_symbol_extractor_by_arg_nr(arch, syscall, -1, &data[i]);
+ nsyms += !!funcs[i];
+
+ (void) syscall_argument;
+ (void) syscall_number;
+
+ return build_syscall_display_info(data, data_size, data_align, funcs, syscall, nargs, nsyms);
+ }
+}
diff --git a/linux/symbols.mk b/linux/symbols.mk
new file mode 100644
index 0000000..f045222
--- /dev/null
+++ b/linux/symbols.mk
@@ -0,0 +1,73 @@
+LINUX_SYMBOL_TABLES != sed -n 's/^.*LINUX_SYMBOL_PRINTER_\([A-Z0-9_]\+\)\b.*\$$\$$\$$.*\$$\$$\$$.*$$/\1/p' < linux/syscalls.h
+
+LINUX_SYMBOL_TABLE_FILES != printf 'linux-src/symbols-$(LINUX_VERSION)/%s\n' $(LINUX_SYMBOL_TABLES)
+
+LINUX_SYMBOL_TABLE_DEPS =\
+ $(LINUX_SOURCE)\
+ linux/symbols.mk\
+ linux/syscalls.h\
+ util/getdefs\
+ util/getenum
+
+LINUX_SYMBOL_EXTRACTOR_DEPS =\
+ $(LINUX_SYMBOL_TABLE_FILES)\
+ linux/symbols.mk\
+ linux/syscalls.h\
+ util/make-enum\
+ util/make-mask\
+ util/make-multiextractor\
+ util/make-sym-extractor
+
+
+libsyscalls_get_syscall_display_info.o: generated/linux-symbol-extractors.h linux/symbols.c
+libsyscalls_get_syscall_display_info.lo: generated/linux-symbol-extractors.h linux/symbols.c
+
+
+$(LINUX_SYMBOL_TABLE_FILES): $(LINUX_SYMBOL_TABLE_DEPS)
+ mkdir -p -- linux-src/symbols-$(LINUX_VERSION)
+ table="$$(printf '%s\n' "$@" | tr / '\n' | sed -n '$$p')" && \
+ command="$$(sed -n 's/^.*LINUX_SYMBOL_PRINTER_'"$$table"'\b.*\$$\$$\$$\s*\(.*\)\s*\$$\$$\$$.*$$/\1/p' < linux/syscalls.h)" && \
+ test -n "$$command" && \
+ printf '%s\n' "$$command" && \
+ (cd -- linux-src/linux-$(LINUX_VERSION) && env PATH="../../util:$${PATH}" sh -e -c "$$command") > $@
+
+generated/linux-symbol-extractors.h: $(LINUX_SYMBOL_EXTRACTOR_DEPS)
+ mkdir -p -- generated
+ set -e; \
+ for tablefile in $(LINUX_SYMBOL_TABLE_FILES); do \
+ tablename="$$(printf '%s\n' "$$tablefile" | cut -d / -f 3)"; \
+ how="$$(sed -n < linux/syscalls.h \
+ 's/^.*LINUX_SYMBOL_PRINTER_'"$$tablename"'\b.*\/\*\s*\(.*\)\s*\$$\$$\$$.*\$$\$$\$$.*$$/\1/p')"; \
+ printf '\n'; \
+ util/make-sym-extractor "$$tablename" "$$how" < "$$tablefile"; \
+ done > $@.tmp
+ set -e; \
+ pattern='\s\+LINUX_SYMBOL_PRINTER_\([A-Z0-9_]\+\)\s*'; \
+ funcprefix='extract_linux_symbol_'; \
+ sed -n 's/^\s*\x23\s*define'"$$pattern$$pattern"'\(\/.*\)\?$$/\x23define '$$funcprefix'\1 '$$funcprefix'\2/p' \
+ < linux/syscalls.h | tr '[A-Z]' '[a-z]' > $@
+ storage_and_rettype="$$(sed '/^$$/d' < $@.tmp | sed 1q | sed 's/\*/\\\*/g' | sed 's/[^\*]$$/& /')"; \
+ sed -n 's/^extract_symbol_.*/'"$${storage_and_rettype}"'&;/p' < $@.tmp | cat - $@.tmp >> $@
+ -rm -f -- $@.tmp
+ set -e; \
+ sed 's/, */ /g' < linux/syscalls.h \
+ | sed -n 's/^.*LINUX_SYMBOL_PRINTER_\([A-Z0-9_]\+\)\b.*[^$$]\$$\$$\s*SYMBOLS(\(.*\))\s*\$$\$$[^$$].*$$/\1 \2/p' \
+ | while read line; do \
+ printf '\n'; \
+ util/make-multiextractor $$line; \
+ done >> $@
+ printf '\n\43define LIST_LINUX_EXTRACTORS(X, D)\\\n' >> $@
+ set -e; \
+ phonies="$$(sed -n '/\$$\$$\$$\s*BEGIN\s\+PHONIES\s*\$$\$$\$$/,/\$$\$$\$$\s*END\s\+PHONIES\s*\$$\$$\$$/p' < linux/syscalls.h \
+ | sed -n 's/^\s*LINUX_SYMBOL_PRINTER_\([A-Z0-9_]\+\)\b.*$$/\1/p')"; \
+ sed -n 's/^extract_symbol_\([^)]*\)(.*)\s*\/\*\s*\([0-9]\+\)\s*\*\/\s*$$/\1 \2/p' < $@ \
+ | while read name n; do \
+ if ! printf '%s\n' "$$phonies" | grep -i \^"$$name"\$$ > /dev/null; then \
+ printf '\tX(LINUX_SYMBOL_PRINTER_%s, extract_symbol_%s, %i) D\\\n' \
+ "$$(printf '%s\n' "$$name" | tr '[a-z]' '[A-Z]')" \
+ "$$name" \
+ "$$n"; \
+ fi; \
+ done \
+ | sed '$$s/ \D\\$$//' >> $@
+ sed 's/extract_symbol/extract_linux_symbol/g' < $@ > $@.tmp && mv -- $@.tmp $@
diff --git a/linux/syscall-table.c b/linux/syscall-table.c
new file mode 100644
index 0000000..6bcd480
--- /dev/null
+++ b/linux/syscall-table.c
@@ -0,0 +1,58 @@
+/* See LICENSE file for copyright and license details. */
+#define REQUIRE_FLEXABLE_OR_NPARAMS
+#include "../common.h"
+
+
+#include "../generated/linux-syscall-table.h"
+#include "../generated/linux-syscalls.h"
+#include "syscalls.h"
+
+
+/* generated/linux-syscall-dedup.h removes references to duplicate symbols, then compiler optimisation removes them */
+#if defined(__clang__)
+# pragma clang diagnostic ignored "-Wunused-const-variable"
+#elif defined(__GNUC__)
+# pragma GCC diagnostic ignored "-Wunused-const-variable"
+#endif
+
+
+#define MAKE_SYSCALL_WITHOUT_COMPAT(ARCH, NR, NAME, ACTUAL)\
+ static const struct libsyscalls_syscall linux_##ARCH##_syscall_##NAME = {\
+ .name = #NAME,\
+ .actual_syscall = &linux_syscall_##ACTUAL,\
+ .actual_compat_syscall = NULL\
+ }
+
+#define MAKE_SYSCALL_WITH_COMPAT(ARCH, NR, NAME, ACTUAL, COMPAT)\
+ static const struct libsyscalls_syscall linux_##ARCH##_syscall_##NAME = {\
+ .name = #NAME,\
+ .actual_syscall = &linux_syscall_##ACTUAL,\
+ .actual_compat_syscall = &linux_syscall_##COMPAT\
+ }
+
+
+#define X(ARCH)\
+ LIST_LINUX_SYSCALLS_FOR_##ARCH(MAKE_##ARCH##_SYSCALL_WITHOUT_COMPAT, MAKE_##ARCH##_SYSCALL_WITH_COMPAT, ;)
+LIST_LINUX_ARCHES(X, ;);
+#undef X
+
+#ifndef CREATING_DEDUP_TABLE
+# include "../generated/linux-syscall-dedup.h"
+#endif
+
+#define MAKE_SYSCALL_TABLE_ENTRY(ARCH, NR, NAME, ...)\
+ [NR] = &linux_##ARCH##_syscall_##NAME
+
+#define X(ARCH)\
+ static const struct libsyscalls_syscall *const linux_##ARCH##_syscalls_table[] = {\
+ LIST_LINUX_SYSCALLS_FOR_##ARCH(MAKE_##ARCH##_SYSCALL_TABLE_ENTRY, MAKE_##ARCH##_SYSCALL_TABLE_ENTRY, COMMA)\
+ }
+LIST_LINUX_ARCHES(X, ;);
+#undef X
+
+
+const struct libsyscalls_syscall *const *const libsyscalls_linux_syscalls_table_[] = {
+#define X(ARCH) [LIBSYSCALLS_ARCH_##ARCH] = linux_##ARCH##_syscalls_table
+ LIST_LINUX_ARCHES(X, COMMA)
+#undef X
+};
diff --git a/linux/syscall-table.mk b/linux/syscall-table.mk
new file mode 100644
index 0000000..3f0d944
--- /dev/null
+++ b/linux/syscall-table.mk
@@ -0,0 +1,60 @@
+OBJ += linux/syscall-table.o
+
+
+linux/syscall-table.o: generated/linux-syscall-table.h linux/syscalls.h $(LINUX_SYSCALLS_HDR) generated/linux-syscall-dedup.h
+linux/syscall-table.lo: generated/linux-syscall-table.h linux/syscalls.h $(LINUX_SYSCALLS_HDR) generated/linux-syscall-dedup.h
+
+libsyscalls_get_syscall_range.o: $(LINUX_SYSCALLS_HDR)
+libsyscalls_get_syscall_range.lo: $(LINUX_SYSCALLS_HDR)
+
+
+generated/linux-syscall-table.h: linux/syscall-table.c common.h linux/linux-support.mk
+ set -e; \
+ macros="$$(sed -n 's/^\s*\x23\s*define\s\+MAKE_\([^(]*\)(.*$$/\1/p' < linux/syscall-table.c)"; \
+ for arch in $(SUPPORTED_LINUX_ARCHES); do \
+ for macro in $$macros; do \
+ printf '\43define MAKE_%s_%s(...) MAKE_%s(%s, __VA_ARGS__)\n' \
+ "$$arch" "$$macro" "$$macro" "$$arch"; \
+ done; \
+ done > $@
+
+
+generated/linux-syscalls.h: linux/syscalls.mk
+ mkdir -p -- generated
+ printf '\43include "%s"\n' $(LINUX_SYSCALLS_HDR) \
+ | grep -v '"$@"' \
+ | sed 's:generated/::' > $@
+
+
+generated/linux-syscall-ranges.h: $(LINUX_SYSCALLS_ARCH_HDR)
+ printf '%s\n' 'This may take some time ...'; \
+ set -e; arch=; \
+ cat -- $(LINUX_SYSCALLS_ARCH_HDR) \
+ | sed 's/^\s*X[A-Z_]*(\([^,]*\).*$$/\1/' \
+ | sed 's/\x23\s*define\s\+LIST_LINUX_SYSCALLS_FOR_\(.*\)(.*/\1/' \
+ | sed '/^\s*$$/d' \
+ | (\
+ while read line; do \
+ if test -z "$$(printf '%s\n' "$$line" | sed 's/^[A-Z].*$$//')"; then \
+ if test -n "$$arch"; then \
+ printf '\43define %s_LINUX_SYSCALL_FOR_%s %i\n' \
+ MIN "$$arch" "$$min" \
+ MAX "$$arch" "$$max"; \
+ fi; \
+ arch="$$line"; \
+ min=; \
+ max=; \
+ else \
+ val=$$(( $$line )); \
+ if test -z "$$min" || test "$$val" -lt "$$min"; then \
+ min=$$val; \
+ fi; \
+ if test -z "$$max" || test "$$val" -gt "$$max"; then \
+ max=$$val; \
+ fi; \
+ fi; \
+ done; \
+ printf '\43define %s_LINUX_SYSCALL_FOR_%s %i\n' \
+ MIN "$$arch" "$$min" \
+ MAX "$$arch" "$$max"; \
+ ) > $@
diff --git a/linux/syscalls.h b/linux/syscalls.h
new file mode 100644
index 0000000..94d714e
--- /dev/null
+++ b/linux/syscalls.h
@@ -0,0 +1,988 @@
+/* See LICENSE file for copyright and license details. */
+
+/* This file is included from syscall-table.c or symbols.c */
+
+
+#define LINUX_MODE_BUFFER_SIZE sizeof("07777 (rwsrwsrwt)")
+#define LINUX_UMASK_BUFFER_SIZE sizeof("0777 (u::rwx,g::rwx,o::rwx)")
+#define LINUX_DEV_BUFFER_SIZE sizeof("18446744073709551615 (4294967295:4294967295)")
+#define LINUX_CLOCKID_T_BUFFER_SIZE (sizeof("- (~*8 + 7)") + 2 * 3 * sizeof(long long int))
+
+#define LINUX_REQUIRE_SYMBOL_BUFFER(PRINTER)\
+ ((PRINTER) == LINUX_SYMBOL_PRINTER_ATFD_MODE ? LINUX_MODE_BUFFER_SIZE :\
+ (PRINTER) == LINUX_SYMBOL_PRINTER_MODE ? LINUX_MODE_BUFFER_SIZE :\
+ (PRINTER) == LINUX_SYMBOL_PRINTER_UMASK ? LINUX_UMASK_BUFFER_SIZE :\
+ (PRINTER) == LINUX_SYMBOL_PRINTER_DEV ? LINUX_DEV_BUFFER_SIZE :\
+ (PRINTER) == LINUX_SYMBOL_PRINTER_CLOCKID ? LINUX_CLOCKID_T_BUFFER_SIZE : 0)
+
+enum { /* LIBSYSCALLS_SYMBOL_PRINTER */
+ NO_LINUX_SYMBOL_PRINTER = 0,
+
+ /* The comments after the enum constnts are used by linux/symbols.mk, do not break them */
+
+ LINUX_SYMBOL_PRINTER_CLOCKID, /* clockid_t,enum $$$ getdefs CLOCK < include/uapi/linux/time.h $$$ */
+ LINUX_SYMBOL_PRINTER_MODE, /* mode_t (e.g. "0666 (rw-rw-rw-)") */
+ LINUX_SYMBOL_PRINTER_UMASK, /* mode_t (e.g. "022 (u::rwx,g::r-x,o::r-x)") */
+ LINUX_SYMBOL_PRINTER_DEV, /* int (major:minor) */
+ LINUX_SYMBOL_PRINTER_SIGNAL,
+
+ LINUX_SYMBOL_PRINTER_2ATFD, /* $$ SYMBOLS(ATFD, ATFD) $$ */
+ LINUX_SYMBOL_PRINTER_ATFD_MODE, /* $$ SYMBOLS(ATFD, MODE) $$ */
+ LINUX_SYMBOL_PRINTER_FACCESSAT, /* $$ SYMBOLS(ATFD, ACCESS_OK) $$ */
+ LINUX_SYMBOL_PRINTER_FANOTIFY_MARK, /* $$ SYMBOLS(FAN_MARK, FAN) $$ */
+ LINUX_SYMBOL_PRINTER_3STATX, /* $$ SYMBOLS(ATFD, AT_STATX, STATX) $$ */
+
+ LINUX_SYMBOL_PRINTER_ITIMER, /* enum $$$ getdefs ITIMER < include/uapi/linux/time.h $$$ */
+ LINUX_SYMBOL_PRINTER_SEEK, /* enum $$$ getdefs SEEK < include/uapi/linux/fs.h $$$ */
+ LINUX_SYMBOL_PRINTER_EPOLL_CTL, /* enum $$$ getdefs EPOLL_CTL < include/uapi/linux/eventpoll.h $$$ */
+ LINUX_SYMBOL_PRINTER_SCHEDULER, /* enum $$$ grep -v '0x' < include/uapi/linux/sched.h | getdefs SCHED | grep -v '^SCHED_FLAG_' $$$ */
+ LINUX_SYMBOL_PRINTER_SHUT, /* enum $$$ getenum sock_shutdown_cmd < include/linux/net.h $$$ */
+ LINUX_SYMBOL_PRINTER_FADVISE, /* enum $$$ getdefs FADV POSIX_FADV < include/uapi/linux/fadvise.h $$$ */
+ LINUX_SYMBOL_PRINTER_ADJTIMEX, /* enum $$$ getdefs TIME < include/uapi/linux/timex.h $$$ */
+ LINUX_SYMBOL_PRINTER_IPC_KEY, /* enum $$$ grep IPC_PRIVATE < include/uapi/linux/ipc.h | sed 's/(\s*\(__kernel_\)\?key_t\s*)//g' | getdefs IPC $$$ */
+ LINUX_SYMBOL_PRINTER_ATFD, /* enum $$$ getdefs AT < tools/include/uapi/linux/fcntl.h | grep '^AT_FDCWD ' $$$ */
+ LINUX_SYMBOL_PRINTER_MSGCTL, /* IPCCTL,enum $$$ sed '1,/ctl commands/d;/ctl commands/d;/^\//q' < include/uapi/linux/msg.h | getdefs MSG $$$ */
+ LINUX_SYMBOL_PRINTER_SHMCTL, /* IPCCTL,enum $$$ sed '1,/ctl commands/d;/ctl commands/d;/^\//q' < include/uapi/linux/shm.h | getdefs SHM $$$ */
+ LINUX_SYMBOL_PRINTER_SEMCTL, /* IPCCTL,IPCCTL_SEM,enum $$$ sed '1,/[cC]ommand [dD]efinitions/d;/^\//q' < include/uapi/linux/sem.h | getdefs $$$ */
+ LINUX_SYMBOL_PRINTER_NOFLAGS, /* mask $$$ true $$$ */
+ LINUX_SYMBOL_PRINTER_ACCESS_OK, /* mask $$$ printf '%s_OK %i\n' X 1 W 2 R 4 F 0 $$$ */
+ LINUX_SYMBOL_PRINTER_SPLICE_F, /* mask $$$ getdefs SPLICE < include/linux/splice.h $$$ */
+ LINUX_SYMBOL_PRINTER_XATTR, /* mask $$$ getdefs XATTR < include/uapi/linux/xattr.h $$$ */
+ LINUX_SYMBOL_PRINTER_SYNC_FILE_RANGE, /* mask $$$ getdefs SYNC_FILE_RANGE < include/uapi/linux/fs.h $$$ */
+ LINUX_SYMBOL_PRINTER_RENAME, /* mask $$$ getdefs RENAME < include/uapi/linux/fs.h $$$ */
+ LINUX_SYMBOL_PRINTER_GRND, /* mask $$$ getdefs GRND < include/uapi/linux/random.h $$$ */
+ LINUX_SYMBOL_PRINTER_CLOSE_RANGE, /* mask $$$ getdefs CLOSE_RANGE < include/uapi/linux/close_range.h $$$ */
+ LINUX_SYMBOL_PRINTER_FSOPEN, /* mask $$$ getdefs FSOPEN < include/uapi/linux/mount.h $$$ */
+ LINUX_SYMBOL_PRINTER_LOCK, /* mask $$$ getdefs LOCK < include/uapi/asm-generic/fcntl.h | grep -v '^LOCK_RW '; ! cat arch'/'*\/include/uapi/asm/fcntl.h | grep \\sLOCK_ > /dev/null $$$ */
+ LINUX_SYMBOL_PRINTER_RWF, /* mask $$$ sed 's/(\s*__force\s\+__kernel_rwf_t\s*)//' < include/uapi/linux/fs.h | getdefs RWF $$$ */
+ LINUX_SYMBOL_PRINTER_STATX, /* mask $$$ getdefs STATX < include/uapi/linux/stat.h | grep -v '^STATX_\(BASIC_STATS \|ALL \|ATTR_\)' $$$ */
+ LINUX_SYMBOL_PRINTER_FALLOC, /* mask $$$ getdefs FALLOC_FL < include/uapi/linux/falloc.h $$$ */
+ LINUX_SYMBOL_PRINTER_AT, /* mask $$$ grep '\(AT_EMPTY_PATH\|AT_SYMLINK_NOFOLLOW\)' < include/uapi/linux/fcntl.h | getdefs AT $$$ */
+ LINUX_SYMBOL_PRINTER_TIMER, /* mask $$$ getdefs TIMER < include/uapi/linux/time.h $$$ */
+ LINUX_SYMBOL_PRINTER_UMOUNT, /* mask $$$ getdefs MNT UMOUNT < include/linux/fs.h $$$ */
+ LINUX_SYMBOL_PRINTER_RECV, /* mask $$$ grep -v 'sendpage()' < include/linux/socket.h | getdefs MSG | grep -v MSG_'\(WAITFORONE\|BATCH\|TRYHARD\)' | grep -v ' 0$' $$$ */ /* TODO MSG_TRYHARD should be used instead of MSG_DONTROUT for DECnet */
+ LINUX_SYMBOL_PRINTER_IPC_NOWAIT, /* mask $$$ grep IPC_NOWAIT < include/uapi/linux/ipc.h | getdefs IPC $$$ */
+ LINUX_SYMBOL_PRINTER_IPCGET, /* mask $$$ grep '\(IPC_CREAT\|IPC_EXCL\)' < include/uapi/linux/ipc.h | getdefs IPC $$$ */
+ LINUX_SYMBOL_PRINTER_UNLINK, /* mask $$$ getdefs AT < tools/include/uapi/linux/fcntl.h | grep '^AT_REMOVEDIR ' $$$ */
+ LINUX_SYMBOL_PRINTER_SHM, /* mask $$$ sed '1,/shmat()/d;/^\//q' < include/uapi/linux/shm.h | getdefs SHM $$$ */
+ LINUX_SYMBOL_PRINTER_FACCESSAT2, /* AT|mask $$$ grep AT_EACCESS < include/uapi/linux/fcntl.h | getdefs AT $$$ */
+ LINUX_SYMBOL_PRINTER_AT_AUTOMOUNT, /* AT|mask $$$ grep AT_NO_AUTOMOUNT < include/uapi/linux/fcntl.h | getdefs AT $$$ */
+ LINUX_SYMBOL_PRINTER_AT_STATX, /* AT_AUTOMOUNT|mask $$$ getdefs AT_STATX < include/uapi/linux/fcntl.h | grep -v '^AT_STATX_SYNC_TYPE ' $$$ */
+ LINUX_SYMBOL_PRINTER_RECVM, /* RECV|mask $$$ getdefs MSG < include/linux/socket.h | grep '^MSG_WAITFORONE ' $$$ */
+ LINUX_SYMBOL_PRINTER_SENDM, /* SEND|mask $$$ getdefs MSG < include/linux/socket.h | grep '^MSG_BATCH ' $$$ */
+ LINUX_SYMBOL_PRINTER_MSGRCV, /* IPC_NOWAIT|mask $$$ grep '^.*\s0[0-9a-fA-FxulUL]*\s*\(/.*\)\?$' < include/uapi/linux/msg.h | getdefs MSG $$$ */
+ LINUX_SYMBOL_PRINTER_SCHEDULER_SET, /* SCHEDULER|mask $$$ grep '0x' < include/uapi/linux/sched.h | getdefs SCHED | grep -v '^SCHED_FLAG_' $$$ */
+
+ /* arch dependent (TODO -- don't forget to remove #define from top of symbols.c) */
+ LINUX_SYMBOL_PRINTER_MADVISE, /* MADV_{NORMAL, RANDOM, SEQUENTIAL, WILLNEED, DONTNEED, REMOVE, ...} */
+ LINUX_SYMBOL_PRINTER_MSYNC, /* MS_{ASYNC, SYNC}|MS_INVALIDATE */
+ LINUX_SYMBOL_PRINTER_MLOCK, /* MLOCK_ONFAULT, 0 */
+ LINUX_SYMBOL_PRINTER_MCL, /* MCL_CURRENT|MCL_FUTURE|MCL_ONFAULT */
+ LINUX_SYMBOL_PRINTER_EPOLL, /* EPOLL_CLOEXEC|0 */
+ LINUX_SYMBOL_PRINTER_SOCK_FD, /* SOCK_NONBLOCK|SOCK_CLOEXEC */
+ LINUX_SYMBOL_PRINTER_DUP3, /* O_CLOEXEC|0 */
+ LINUX_SYMBOL_PRINTER_PIPE, /* O_CLOEXEC|O_DIRECT|O_NONBLOCK|O_NOTIFICATION_PIPE */
+ LINUX_SYMBOL_PRINTER_INOTIFY_FD, /* IN_NONBLOCK|IN_CLOEXEC */
+ LINUX_SYMBOL_PRINTER_FAN_EVENT_F, /* O_{RDONLY, WRONLY, RDWR}|O_{LARGEFILE|CLOEXEC|APPEND|DSYNC|NOATIME|NONBLOCK|SYNC} */
+ LINUX_SYMBOL_PRINTER_MQ_OPEN, /* {O_RDONLY, O_WRONLY, O_RDWR}|O_CLOEXEC|O_CREAT|O_EXCL|O_NONBLOCK */
+
+ /* TODO -- don't forget to remove #define from top of symbols.c */
+ LINUX_SYMBOL_PRINTER_SWAPON, /* swapon(2) flags */
+ LINUX_SYMBOL_PRINTER_INOTIFY_MASK, /* inotify(7) */
+ LINUX_SYMBOL_PRINTER_SHMGET, /* IPCGET|mask $ SHM_HUGETLB|... */
+ LINUX_SYMBOL_PRINTER_FAN_CLASS, /* FAN_CLASS_{PRE_CONTENT, CONTENT, NOTIF}|FAN_{CLOEXEC|NONBLOCK|...} */
+ LINUX_SYMBOL_PRINTER_FAN_MARK, /* FAN_MARK_{{ADD, REMOVE, FLUSH}|DONT_FOLLOW|ONLYDIR|MOUNT|...} */
+ LINUX_SYMBOL_PRINTER_FAN, /* FAN_{ACCESS,MODIFY|CLOSE_WRITE|CLOSE_NOWRITE|OPEN|...} */
+ LINUX_SYMBOL_PRINTER_SOCKET, /* all three parameters of socket(2) */
+ LINUX_SYMBOL_PRINTER_REBOOT, /* all parameters of reboot(2), and used to infer whether the fourth argument is included */
+
+#define LINUX_SYMBOL_PRINTER_SEMGET LINUX_SYMBOL_PRINTER_IPCGET
+#define LINUX_SYMBOL_PRINTER_MSGGET LINUX_SYMBOL_PRINTER_IPCGET
+#define LINUX_SYMBOL_PRINTER_SEND LINUX_SYMBOL_PRINTER_RECV /* TODO */
+#define LINUX_SYMBOL_PRINTER_MSGSND LINUX_SYMBOL_PRINTER_IPC_NOWAIT
+
+ END_OF_LINUX_SYMBOL_PRINTERS
+
+#if 0 /* $$$ BEGIN PHONIES $$$ */ /* These are just for the implementation */
+ LINUX_SYMBOL_PRINTER_IPCCTL /* enum $$$ sed '/IPC_RMID/p;1,/IPC_RMID/d;/^\//q' < include/uapi/linux/ipc.h | getdefs IPC $$$ */
+ LINUX_SYMBOL_PRINTER_IPCCTL_SEM /* enum $$$ sed '1,/ctl \(commands\|cmds\)/d;/ctl \(commands\|cmds\)/d;/^\//q' < include/uapi/linux/sem.h | getdefs SEM $$$ */
+#endif /* $$$ END PHONIES $$$ */
+};
+
+_Static_assert(END_OF_LINUX_SYMBOL_PRINTERS <= 0xFF, "LINUX_SYMBOL_PRINTER enums"); /* We only have 16 bits, and SYMBOLS can back in two values */
+
+
+#ifndef SYMBOL_PRINTERS_ONLY
+
+
+#if defined(__clang__)
+# pragma clang diagnostic push
+# pragma clang diagnostic ignored "-Wgnu-flexible-array-initializer"
+# pragma clang diagnostic ignored "-Wgnu-zero-variadic-macro-arguments" /* TODO how does that make sense in C23? */
+#elif defined(__GNUC__)
+# pragma GCC diagnostic push
+# pragma GCC diagnostic ignored "-Wpedantic"
+#endif
+
+#define SYS(...) SYSCALL_ABI(linux, __VA_ARGS__)
+
+#define SYMBOLS(A, ...) .symbol_printer = (LINUX_SYMBOL_PRINTER_##A __VA_OPT__(SYMBOLS_2(__VA_ARGS__)))
+#define SYMBOLS_2(A, ...) | (LINUX_SYMBOL_PRINTER_##A << 8) __VA_OPT__(SYMBOLS_3(__VA_ARGS__))
+
+
+#define linux_syscall_sys_exit linux_syscall_sys_exit_group
+#define linux_syscall_sys_fdatasync linux_syscall_sys_fsync
+#define linux_syscall_sys_syncfs linux_syscall_sys_fsync
+#define linux_syscall_sys_getpid linux_syscall_sys_gettid
+#define linux_syscall_sys_getpgrp linux_syscall_sys_gettid
+#define linux_syscall_sys_getgid linux_syscall_sys_getuid
+#define linux_syscall_sys_geteuid linux_syscall_sys_getuid
+#define linux_syscall_sys_getegid linux_syscall_sys_getuid
+#define linux_syscall_sys_geteuid16 linux_syscall_sys_getuid16
+#define linux_syscall_sys_getgid16 linux_syscall_sys_getuid16
+#define linux_syscall_sys_getegid16 linux_syscall_sys_getuid16
+#define linux_syscall_sys_setgid16 linux_syscall_sys_setuid16
+#define linux_syscall_sys_setfsuid16 linux_syscall_sys_setuid16
+#define linux_syscall_sys_setfsgid16 linux_syscall_sys_setuid16
+#define linux_syscall_sys_setregid16 linux_syscall_sys_setreuid16
+#define linux_syscall_sys_setresgid16 linux_syscall_sys_setresuid16
+#define linux_syscall_sys_getresgid16 linux_syscall_sys_getresuid16
+#define linux_syscall_sys_getxgid linux_syscall_sys_getxuid
+#define linux_syscall_sys_setfsgid linux_syscall_sys_setuid
+#define linux_syscall_sys_setgid linux_syscall_sys_setuid
+#define linux_syscall_sys_setregid linux_syscall_sys_setreuid
+#define linux_syscall_sys_setresgid linux_syscall_sys_setresuid
+#define linux_syscall_sys_getresgid linux_syscall_sys_getresuid
+#define linux_syscall_sys_getpgid linux_syscall_sys_getsid
+#define linux_syscall_sys_setfsuid linux_syscall_sys_setuid
+#define linux_syscall_sys_vfork linux_syscall_sys_fork
+#define linux_syscall_sys_symlink linux_syscall_sys_link
+#define linux_syscall_sys_rmdir linux_syscall_sys_unlink
+#define linux_syscall_sys_lsetxattr linux_syscall_sys_setxattr
+#define linux_syscall_sys_lgetxattr linux_syscall_sys_getxattr
+#define linux_syscall_sys_llistxattr linux_syscall_sys_listxattr
+#define linux_syscall_sys_lremovexattr linux_syscall_sys_removexattr
+#define linux_syscall_sys_lstat linux_syscall_sys_stat
+#define linux_syscall_sys_newlstat linux_syscall_sys_newstat
+#define linux_syscall_sys_lchown linux_syscall_sys_chown
+#define linux_syscall_sys_lchown16 linux_syscall_sys_chown16
+#define linux_syscall_sys_lstat64 linux_syscall_sys_stat64
+#define linux_syscall_sys_setdomainname linux_syscall_sys_sethostname
+#define linux_syscall_sys_old_shmctl linux_syscall_sys_shmctl
+#define linux_syscall_sys_old_semctl linux_syscall_sys_semctl
+#define linux_syscall_sys_old_msgctl linux_syscall_sys_msgctl
+#define linux_syscall_sys_sched_get_priority_max linux_syscall_sys_sched_get_priority_min
+#define linux_syscall_sys_tkill linux_syscall_sys_kill
+#define linux_syscall_alpha_clone linux_syscall_sys_clone
+#define linux_syscall_alpha_fork linux_syscall_sys_fork
+#define linux_syscall_alpha_vfork linux_syscall_sys_fork
+#define linux_syscall_sys_osf_brk linux_syscall_sys_brk
+#define linux_syscall_sys_ia64_pipe linux_syscall_sys_alpha_pipe
+#define linux_syscall_sys_sh_pipe linux_syscall_sys_alpha_pipe
+#define linux_syscall_compat_sys_sigreturn linux_syscall_sys_sigreturn
+#define linux_syscall_compat_sys_rt_sigreturn linux_syscall_sys_rt_sigreturn
+#define linux_syscall_compat_sys_x32_rt_sigreturn linux_syscall_sys_rt_sigreturn
+#define linux_syscall_compat_sys_arch_prctl linux_syscall_sys_arch_prctl
+
+SYS(sys_accept, NETWORK_ENABLED_IPC, ACCEPT, 3, INT_FD, PARAMS(_,INT_FD, OUT,STRUCT_SOCKADDR, OUT,UINT));
+SYS(sys_listen, NETWORK_ENABLED_IPC, LISTEN, 2, ZERO(INT), PARAMS(_,INT_FD, _,INT));
+SYS(sys_bind, NETWORK_ENABLED_IPC, BIND, 3, ZERO(INT), PARAMS(_,INT_FD, IN,STRUCT_SOCKADDR, _,INT));
+SYS(sys_connect, NETWORK_ENABLED_IPC, CONNECT, 3, ZERO(INT), PARAMS(_,INT_FD, IN,STRUCT_SOCKADDR, _,INT));
+SYS(sys_getsockname, NETWORK_ENABLED_IPC, STAT, 3, ZERO(INT), PARAMS(_,INT_FD, OUT,STRUCT_SOCKADDR, BI,INT));
+SYS(sys_getpeername, NETWORK_ENABLED_IPC, STAT, 3, ZERO(INT), PARAMS(_,INT_FD, OUT,STRUCT_SOCKADDR, BI,INT));
+SYS(sys_acct, LOGGING, PROCESSES, 1, ZERO(INT), PARAMS(_,STRING));
+SYS(sys_alarm, TIME, TIMER_RELATIVE, 1, UINT, PARAMS(_,UINT));
+SYS(sys_nanosleep, TIME, SLEEP_RELATIVE, 2, ZERO(INT), PARAMS(IN,STRUCT_TIMESPEC, OUT,STRUCT_TIMESPEC));
+SYS(sys_nanosleep_time32, TIME, SLEEP_RELATIVE, 2, ZERO(INT), PARAMS(IN,STRUCT_OLD_TIMESPEC32, OUT,STRUCT_OLD_TIMESPEC32));
+SYS(sys_close, FILE_DESCRIPTORS, DUP_OR_CLOSE, 1, ZERO(INT), PARAMS(_,INT_FD));
+SYS(sys_dup, FILE_DESCRIPTORS, DUP_OR_CLOSE, 1, INT, PARAMS(_,INT_FD));
+SYS(sys_dup2, FILE_DESCRIPTORS, DUP_OR_CLOSE, 2, INT, PARAMS(_,INT_FD, _,INT_FD));
+SYS(sys_exit, PROCESSES, EXIT, 1, ZERO(NO_RETURN), PARAMS(_,INT));
+SYS(sys_pause, SIGNALS, PAUSE, 0, ZERO(INT), PARAMS());
+SYS(sys_gettid, PROCESSES, STAT_SELF, 0, INT, PARAMS());
+SYS(sys_getppid, PROCESSES, STAT_PARENT, 0, INT, PARAMS());
+SYS(sys_getxpid, PROCESSES, STAT_PARENT, 0, 2_INTS, PARAMS());
+SYS(sys_getxuid, PROCESSES, STAT_SELF, 0, 2_UINT32S, PARAMS());
+SYS(sys_getuid, PROCESSES, STAT_SELF, 0, UINT32, PARAMS());
+SYS(sys_getuid16, PROCESSES, STAT_SELF, 0, USHORT, PARAMS());
+SYS(sys_getresuid, PROCESSES, STAT_SELF, 3, ZERO(INT), PARAMS(OUT,UINT32, OUT,UINT32, OUT,UINT32));
+SYS(sys_getresuid16, PROCESSES, STAT_SELF, 3, ZERO(INT), PARAMS(OUT,USHORT, OUT,USHORT, OUT,USHORT));
+SYS(sys_getsid, PROCESSES, STAT_SELF, 1, INT, PARAMS(_,INT));
+SYS(sys_setresuid, PROCESSES, CHANGE_PERMISSIONS, 3, ZERO(INT), PARAMS(_,UINT32, _,UINT32, _,UINT32));
+SYS(sys_setresuid16, PROCESSES, CHANGE_PERMISSIONS, 3, ZERO(INT), PARAMS(_,USHORT, _,USHORT, _,USHORT));
+SYS(sys_setreuid, PROCESSES, CHANGE_PERMISSIONS, 2, ZERO(INT), PARAMS(_,UINT32, _,UINT32));
+SYS(sys_setreuid16, PROCESSES, CHANGE_PERMISSIONS, 2, ZERO(INT), PARAMS(_,USHORT, _,USHORT));
+SYS(sys_setuid, PROCESSES, CHANGE_PERMISSIONS, 1, INT, PARAMS(_,UINT32));
+SYS(sys_setuid16, PROCESSES, CHANGE_PERMISSIONS, 1, ZERO(INT), PARAMS(_,USHORT));
+SYS(sys_sync, FILESYSTEM, SYNC, 0, ZERO(INT), PARAMS());
+SYS(sys_fsync, FILESYSTEM, SYNC, 1, ZERO(INT), PARAMS(_,INT_FD));
+SYS(sys_fork, PROCESSES, CLONE, 0, INT, PARAMS());
+SYS(sys_link, FILESYSTEM, LINK, 2, ZERO(INT), PARAMS(_,STRING, _,STRING));
+SYS(sys_unlink, FILESYSTEM, UNLINK, 1, ZERO(INT), PARAMS(_,STRING));
+SYS(sys_rename, FILESYSTEM, LINK_OR_UNLINK, 2, ZERO(INT), PARAMS(_,STRING, _,STRING));
+SYS(sys_read, FILE_DESCRIPTORS, READ, 3, SSIZE, PARAMS(_,INT_FD, OUT,BUFFER, _,SIZE));
+SYS(sys_write, FILE_DESCRIPTORS, WRITE, 3, SSIZE, PARAMS(_,INT_FD, IN,BUFFER, _,SIZE));
+SYS(sys_sendfile, FILE_DESCRIPTORS, READ_OR_PEEK_AND_WRITE, 4, SSIZE, PARAMS(_,INT_FD, _,INT_FD, BI,LONG, _,SIZE));
+SYS(sys_sendfile64, FILE_DESCRIPTORS, READ_OR_PEEK_AND_WRITE, 4, SSIZE, PARAMS(_,INT_FD, _,INT_FD, BI,LLONG, _,SIZE));
+SYS(sys_getxattr, FILESYSTEM, STAT, 4, SSIZE, PARAMS(_,STRING, _,STRING, OUT,BUFFER, _,SIZE));
+SYS(sys_fgetxattr, FILE_DESCRIPTORS, STAT, 4, SSIZE, PARAMS(_,INT_FD, _,STRING, OUT,BUFFER, _,SIZE));
+SYS(sys_listxattr, FILESYSTEM, STAT, 3, SSIZE, PARAMS(_,STRING, OUT,BUFFER, _,SIZE));
+SYS(sys_flistxattr, FILE_DESCRIPTORS, STAT, 3, SSIZE, PARAMS(,INT_FD, OUT,BUFFER, _,SIZE));
+SYS(sys_removexattr, FILESYSTEM, MODIFY, 2, ZERO(INT), PARAMS(_,STRING, _,STRING));
+SYS(sys_fremovexattr, FILE_DESCRIPTORS, MODIFY, 2, ZERO(INT), PARAMS(_,INT_FD, _,STRING));
+SYS(sys_chdir, PROCESSES, CHDIR, 1, ZERO(INT), PARAMS(_,STRING));
+SYS(sys_fchdir, PROCESSES, CHDIR, 1, ZERO(INT), PARAMS(_,INT_FD));
+SYS(sys_chroot, PROCESSES, CHROOT, 1, ZERO(INT), PARAMS(_,STRING));
+SYS(sys_pivot_root, PROCESSES, CHROOT, 2, ZERO(INT), PARAMS(_,STRING, _,STRING));
+SYS(sys_getcwd, PROCESSES, STAT_SELF, 2, LONG, PARAMS(OUT,BUFFER, _,ULONG));
+SYS(sys_readahead, FILE_DESCRIPTORS, ADVISE, 3, ZERO(INT), PARAMS(_,INT_FD, _,LLONG, _,SIZE));
+SYS(sys_chown, FILESYSTEM, MODIFY, 3, ZERO(INT), PARAMS(_,STRING, _,UINT32, _,UINT32));
+SYS(sys_chown16, FILESYSTEM, MODIFY, 3, ZERO(INT), PARAMS(_,STRING, _,USHORT, _,USHORT));
+SYS(sys_fchown, FILE_DESCRIPTORS, MODIFY, 3, ZERO(INT), PARAMS(_,INT_FD, _,UINT32, _,UINT32));
+SYS(sys_fchown16, FILE_DESCRIPTORS, MODIFY, 3, ZERO(INT), PARAMS(_,INT_FD, _,USHORT, _,USHORT));
+SYS(sys_truncate, FILESYSTEM, WRITE, 2, ZERO(INT), PARAMS(_,STRING, _,LONG));
+SYS(compat_sys_truncate, FILESYSTEM, WRITE, 2, ZERO(INT), PARAMS(_,STRING, _,INT32));
+SYS(sys_truncate64, FILESYSTEM, WRITE, 2, ZERO(INT), PARAMS(_,STRING, _,LLONG));
+SYS(sparc___compat_sys_truncate64, FILESYSTEM, WRITE, 3, ZERO(INT), PARAMS(_,STRING, _,UINT64_HIGH_32, _,UINT64_LOW_32));
+SYS(sys_ftruncate, FILE_DESCRIPTORS, WRITE, 2, ZERO(INT), PARAMS(_,INT_FD, _,ULONG));
+SYS(compat_sys_ftruncate, FILE_DESCRIPTORS, WRITE, 2, ZERO(INT), PARAMS(_,INT_FD, _,UINT32));
+SYS(sys_ftruncate64, FILE_DESCRIPTORS, WRITE, 2, ZERO(INT), PARAMS(_,INT_FD, _,LLONG));
+SYS(sparc___compat_sys_ftruncate64, FILE_DESCRIPTORS, WRITE, 3, ZERO(INT), PARAMS(_,INT_FD, _,UINT64_HIGH_32, _,UINT64_LOW_32));
+SYS(sys_brk, MEMORY, ALLOCATE, 1, MEMORY_ADDRESS, PARAMS(_,MEMORY_ADDRESS));
+SYS(sys_swapoff, SYSTEM, SWAP, 1, ZERO(INT), PARAMS(_,STRING));
+SYS(sys_oldumount, FILESYSTEM, MOUNTPOINT, 1, ZERO(INT), PARAMS(_,STRING));
+SYS(sys_execve, PROCESSES, EXEC, 3, ZERO(INT), PARAMS(_,STRING, _,STRINGS_THEN_NULL, _,STRINGS_THEN_NULL));
+SYS(sys_newstat, FILESYSTEM, STAT, 2, ZERO(INT), PARAMS(_,STRING, OUT,STRUCT_STAT));
+SYS(sys_stat64, FILESYSTEM, STAT, 2, ZERO(INT), PARAMS(_,STRING, OUT,STRUCT_STAT64));
+SYS(sys_stat, FILESYSTEM, STAT, 2, ZERO(INT), PARAMS(_,STRING, OUT,STRUCT_OLD_STAT));
+SYS(sys_newfstat, FILE_DESCRIPTORS, STAT, 2, ZERO(INT), PARAMS(_,INT_FD, OUT,STRUCT_STAT));
+SYS(sys_fstat64, FILE_DESCRIPTORS, STAT, 2, ZERO(INT), PARAMS(_,LONG_FD, OUT,STRUCT_STAT64));
+SYS(sys_fstat, FILE_DESCRIPTORS, STAT, 2, ZERO(INT), PARAMS(_,INT, OUT,STRUCT_OLD_STAT));
+SYS(sys_pipe, FILE_DESCRIPTORS, CREATE, 1, ZERO(INT), PARAMS(OUT,2_INTS_FD));
+SYS(sys_alpha_pipe, FILE_DESCRIPTORS, CREATE, 0, 2_INTS_FD, PARAMS());
+SYS(sys_readlink, FILESYSTEM, READLINK, 3, INT, PARAMS(_,STRING, OUT,BUFFER, _,INT));
+SYS(sys_munlockall, MEMORY, UNLOCK, 0, ZERO(INT), PARAMS());
+SYS(sys_munlock, MEMORY, UNLOCK, 2, ZERO(INT), PARAMS(_,MEMORY_ADDRESS, _,SIZE));
+SYS(sys_mlock, MEMORY, LOCK, 2, ZERO(INT), PARAMS(_,MEMORY_ADDRESS, _,SIZE));
+SYS(sys_epoll_create, FILE_DESCRIPTORS, CREATE_POLL, 1, INT_FD, PARAMS(_,INT));
+SYS(sys_pread64, FILE_DESCRIPTORS, PEEK, 4, SSIZE, PARAMS(_,INT_FD, OUT,BUFFER, _,SIZE, _,LLONG));
+SYS(sys_pwrite64, FILE_DESCRIPTORS, WRITE, 4, SSIZE, PARAMS(_,INT_FD, INT,BUFFER, _,SIZE, _,LLONG));
+SYS(sys_gethostname, SYSTEM, GET_NAME, 2, ZERO(INT), PARAMS(OUT,BUFFER, _,INT));
+SYS(sys_olduname, SYSTEM, GET_NAME, 1, ZERO(INT), PARAMS(OUT,STRUCT_OLDOLD_UTSNAME));
+SYS(sys_uname, SYSTEM, GET_NAME, 1, ZERO(INT), PARAMS(OUT,STRUCT_OLD_UTSNAME));
+SYS(sys_newuname, SYSTEM, GET_NAME, 1, ZERO(INT), PARAMS(OUT,STRUCT_NEW_UTSNAME));
+SYS(sys_sethostname, SYSTEM, SET_NAME, 2, ZERO(INT), PARAMS(IN,BUFFER, _,INT));
+SYS(sys_sysinfo, SYSTEM, STAT, 1, ZERO(INT), PARAMS(OUT,STRUCT_SYSINFO));
+SYS(sys_shmdt, IPC, DETACH, 1, ZERO(INT), PARAMS(_,MEMORY_ADDRESS));
+SYS(sys_mq_unlink, IPC, CONTROL, 1, ZERO(INT), PARAMS(_,STRING));
+SYS(sys_mq_notify, IPC, CONTROL, 2, ZERO(INT), PARAMS(_,INT_FD, IN,STRUCT_SIGEVENT));
+SYS(sys_mq_getsetattr, IPC, CONTROL, 3, ZERO(INT), PARAMS(_,INT_FD, IN,STRUCT_MQ_ATTR, OUT,STRUCT_MQ_ATTR));
+SYS(sys_mq_timedsend, IPC, COMMUNICATE_WITH_ABSOLUTE_TIMEOUT, 5, ZERO(INT), PARAMS(_,INT_FD, _,BUFFER, _,SIZE, _,UINT, IN,STRUCT_TIMESPEC));
+SYS(sys_mq_timedsend_time32, IPC, COMMUNICATE_WITH_ABSOLUTE_TIMEOUT, 5, ZERO(INT), PARAMS(_,INT_FD, _,BUFFER, _,UINT, _,UINT, IN,STRUCT_OLD_TIMESPEC32));
+SYS(sys_mq_timedreceive, IPC, COMMUNICATE_WITH_ABSOLUTE_TIMEOUT, 5, SSIZE, PARAMS(_,INT_FD, OUT,BUFFER, _,SIZE, OUT,UINT, IN,STRUCT_TIMESPEC));
+SYS(sys_mq_timedreceive_time32, IPC, COMMUNICATE_WITH_ABSOLUTE_TIMEOUT, 5, SSIZE, PARAMS(_,INT_FD, OUT,BUFFER, _,UINT, OUT,UINT, IN,STRUCT_OLD_TIMESPEC32));
+SYS(sys_vhangup, PROCESSES, SESSION, 0, ZERO(INT), PARAMS());
+SYS(sys_setsid, PROCESSES, SESSION, 0, INT, PARAMS());
+SYS(sys_setpgid, PROCESSES, SESSION, 2, INT, PARAMS(_,INT, _,INT));
+SYS(sys_sched_yield, SCHEDULING, YEILD, 0, ZERO(INT), PARAMS());
+SYS(sys_sched_setparam, SCHEDULING, SET, 2, ZERO(INT), PARAMS(_,INT, IN,STRUCT_SCHED_PARAM));
+SYS(sys_sched_getparam, SCHEDULING, GET, 2, ZERO(INT), PARAMS(_,INT, OUT,STRUCT_SCHED_PARAM));
+SYS(sys_sched_rr_get_interval, SCHEDULING, GET, 2, ZERO(INT), PARAMS(_,INT, OUT,STRUCT_TIMESPEC));
+SYS(sys_sched_rr_get_interval_time32, SCHEDULING, GET, 2, ZERO(INT), PARAMS(_,INT, OUT,STRUCT_OLD_TIMESPEC32));
+SYS(sys_inotify_init, FILESYSTEM, MONITOR, 0, INT_FD, PARAMS());
+SYS(sys_inotify_rm_watch, FILESYSTEM, MONITOR, 2, ZERO(INT), PARAMS(_,INT_FD, _,INT32));
+SYS(sys_getpagesize, SYSTEM, FUNDAMENTAL, 0, INT, PARAMS());
+SYS(sys_kill, SIGNALS, KILL, 2, ZERO(INT), PARAMS(_,INT, SYM,INT_SIGNAL), SYMBOLS(SIGNAL));
+SYS(sys_tgkill, SIGNALS, KILL, 3, ZERO(INT), PARAMS(_,INT, _,INT, SYM,INT_SIGNAL), SYMBOLS(SIGNAL));
+SYS(sys_symlinkat, FILESYSTEM, LINK, 3, ZERO(INT), PARAMS(_,STRING, SYM,INT_ATFD, _,STRING), SYMBOLS(ATFD));
+SYS(sys_renameat, FILESYSTEM, LINK_OR_UNLINK, 4, ZERO(INT), PARAMS(SYM,INT_ATFD, _,STRING, SYM,INT_ATFD, _,STRING), SYMBOLS(ATFD, ATFD));
+SYS(sys_readlinkat, FILESYSTEM, READLINK, 4, INT, PARAMS(SYM,INT_ATFD, _,STRING, OUT,BUFFER, _,INT), SYMBOLS(ATFD));
+SYS(sys_clock_getres, TIME, INTROSPECT, 2, ZERO(INT), PARAMS(SYM,INT, OUT,STRUCT_TIMESPEC), SYMBOLS(CLOCKID));
+SYS(sys_clock_getres_time32, TIME, INTROSPECT, 2, ZERO(INT), PARAMS(SYM,INT, OUT,STRUCT_OLD_TIMESPEC32), SYMBOLS(CLOCKID));
+SYS(sys_clock_gettime, TIME, GET, 2, ZERO(INT), PARAMS(SYM,INT, OUT,STRUCT_TIMESPEC), SYMBOLS(CLOCKID));
+SYS(sys_clock_gettime32, TIME, GET, 2, ZERO(INT), PARAMS(SYM,INT, OUT,STRUCT_OLD_TIMESPEC32), SYMBOLS(CLOCKID));
+SYS(sys_clock_settime, TIME, SET, 2, ZERO(INT), PARAMS(SYM,INT, IN,STRUCT_TIMESPEC), SYMBOLS(CLOCKID));
+SYS(sys_clock_settime32, TIME, SET, 2, ZERO(INT), PARAMS(SYM,INT, IN,STRUCT_OLD_TIMESPEC32), SYMBOLS(CLOCKID));
+SYS(sys_shutdown, FILE_DESCRIPTORS, DUP_OR_CLOSE, 2, ZERO(INT), PARAMS(_,INT_FD, SYM,UINT), SYMBOLS(SHUT));
+SYS(sys_close_range, FILE_DESCRIPTORS, CLOSE_OR_UNSHARE, 3, ZERO(INT), PARAMS(_,UINT, _,UINT, SYM,UINT), SYMBOLS(CLOSE_RANGE));
+SYS(sys_send, FILE_DESCRIPTORS, WRITE, 4, SSIZE, PARAMS(_,INT_FD, IN,BUFFER, _,SIZE, SYM,UINT), SYMBOLS(SEND));
+SYS(sys_sendto, FILE_DESCRIPTORS, WRITE, 6, SSIZE, PARAMS(_,INT_FD, IN,BUFFER, _,SIZE, SYM,UINT, IN,STRUCT_SOCKADDR, _,INT), SYMBOLS(SEND));
+SYS(sys_sendmsg, FILE_DESCRIPTORS, WRITE, 3, SSIZE, PARAMS(_,INT_FD, IN,STRUCT_MSGHDR, SYM,UINT), SYMBOLS(SEND));
+SYS(sys_sendmmsg, FILE_DESCRIPTORS, WRITE, 4, INT, PARAMS(_,INT_FD, BI,STRUCT_MMSGHDR, _,UINT, SYM,UINT), SYMBOLS(SENDM));
+SYS(sys_lseek, FILE_DESCRIPTORS, SEEK, 3, LONG, PARAMS(_,INT_FD, _,LONG, SYM,UINT), SYMBOLS(SEEK));
+SYS(sys_llseek, FILE_DESCRIPTORS, SEEK, 5, INT, PARAMS(_,INT_FD, _,INT64_HIGH_32, _,INT64_LOW_32, OUT,LLONG, SYM,UINT), SYMBOLS(SEEK));
+SYS(sys_sched_getscheduler, SCHEDULING, GET, 1, INT, PARAMS(_,INT), SYMBOLS(SCHEDULER));
+SYS(sys_sched_getattr, SCHEDULING, GET, 4, ZERO(INT), PARAMS(_,INT, OUT,STRUCT_SCHED_ATTR, _,UINT, SYM,UINT), SYMBOLS(NOFLAGS));
+SYS(sys_sched_setattr, SCHEDULING, SET, 3, INT, PARAMS(_,INT, IN,STRUCT_SCHED_ATTR, SYM,UINT), SYMBOLS(NOFLAGS));
+SYS(sys_recv, FILE_DESCRIPTORS, READ_OR_PEEK, 4, SSIZE, PARAMS(_,INT_FD, OUT,BUFFER, _,SIZE, SYM,UINT), SYMBOLS(RECV));
+SYS(sys_recvfrom, FILE_DESCRIPTORS, READ_OR_PEEK_AND_STAT, 6, SSIZE, PARAMS(_,INT_FD, OUT,BUFFER, _,SIZE, SYM,UINT, OUT,STRUCT_SOCKADDR, BI,INT), SYMBOLS(RECV));
+SYS(sys_recvmsg, FILE_DESCRIPTORS, READ_OR_PEEK_AND_STAT, 3, SSIZE, PARAMS(_,INT_FD, BI,STRUCT_MSGHDR, SYM,UINT), SYMBOLS(RECV));
+SYS(sys_recvmmsg, FILE_DESCRIPTORS, READ_OR_PEEK_AND_STAT, 5, INT, PARAMS(_,INT_FD, BI,STRUCT_MMSGHDR, _,UINT, SYM,UINT, BI,STRUCT_TIMESPEC), SYMBOLS(RECVM));
+SYS(sys_recvmmsg_time32, FILE_DESCRIPTORS, READ_OR_PEEK_AND_STAT, 5, INT, PARAMS(_,INT_FD, BI,STRUCT_MMSGHDR, _,UINT, SYM,UINT, BI,STRUCT_OLD_TIMESPEC32), SYMBOLS(RECVM));
+SYS(sys_splice, FILE_DESCRIPTORS, READ_OR_PEEK_AND_WRITE, 6, SSIZE, PARAMS(_,INT_FD, BI,LLONG, _,INT_FD, BI,LLONG, _,SIZE, SYM,UINT), SYMBOLS(SPLICE_F));
+SYS(sys_tee, FILE_DESCRIPTORS, PEEK_AND_WRITE, 4, SSIZE, PARAMS(_,INT_FD, _,INT_FD, _,SIZE, SYM,UINT), SYMBOLS(SPLICE_F));
+SYS(sys_setxattr, FILESYSTEM, MODIFY, 5, ZERO(INT), PARAMS(_,STRING, _,STRING, IN,BUFFER, _,SIZE, SYM,UINT), SYMBOLS(XATTR));
+SYS(sys_fsetxattr, FILE_DESCRIPTORS, MODIFY, 5, ZERO(INT), PARAMS(_,INT_FD, _,STRING, IN,BUFFER, _,SIZE, SYM,UINT), SYMBOLS(XATTR));
+SYS(sys_fadvise64, FILE_DESCRIPTORS, ADVISE, 4, ZERO(INT), PARAMS(_,INT_FD, _,LLONG, _,SIZE, SYM,INT), SYMBOLS(FADVISE));
+SYS(sys_fadvise64_64, FILE_DESCRIPTORS, ADVISE, 4, ZERO(INT), PARAMS(_,INT_FD, _,LLONG, _,LLONG, SYM,INT), SYMBOLS(FADVISE));
+SYS(sys_sched_get_priority_min, SCHEDULING, INTROSPECT, 1, INT, PARAMS(SYM,INT), SYMBOLS(SCHEDULER));
+SYS(sys_sched_setscheduler, SCHEDULING, SET, 3, ZERO(INT), PARAMS(_,INT, SYM,INT, OUT,STRUCT_SCHED_PARAM), SYMBOLS(SCHEDULER_SET));
+SYS(sys_adjtimex, TIME, GET_OR_SET, 1, SYMB(INT), PARAMS(BI,STRUCT_TIMEX), SYMBOLS(ADJTIMEX));
+SYS(sys_adjtimex_time32, TIME, GET_OR_SET, 1, SYMB(INT), PARAMS(BI,STRUCT_OLD_TIMEX32), SYMBOLS(ADJTIMEX));
+SYS(sys_access, FILESYSTEM, STAT, 2, ZERO(INT), PARAMS(_,STRING, SYM,UINT), SYMBOLS(ACCESS_OK));
+SYS(sys_faccessat, FILESYSTEM, STAT, 3, ZERO(INT), PARAMS(SYM,INT_ATFD, _,STRING, SYM,UINT), SYMBOLS(ATFD, ACCESS_OK));
+SYS(sys_clock_adjtime, TIME, GET_OR_SET, 2, SYMB(INT), PARAMS(SYMB,INT, BI,STRUCT_TIMEX), SYMBOLS(ADJTIMEX, CLOCKID));
+SYS(sys_clock_adjtime32, TIME, GET_OR_SET, 2, INT, PARAMS(SYM,INT, BI,STRUCT_OLD_TIMEX32), SYMBOLS(ADJTIMEX, CLOCKID));
+SYS(sys_getitimer, TIME, TIMER_RELATIVE_READ, 2, ZERO(INT), PARAMS(SYM,INT, OUT,STRUCT_OLD_ITIMERVAL), SYMBOLS(ITIMER));
+SYS(sys_setitimer, TIME, TIMER_RELATIVE_WITH_READ, 3, ZERO(INT), PARAMS(SYM,INT, INT,STRUCT_OLD_ITIMERVAL, OUT,STRUCT_OLD_ITIMERVAL), SYMBOLS(ITIMER));
+SYS(sys_umount, FILESYSTEM, MOUNTPOINT, 2, ZERO(INT), PARAMS(_,STRING, SYM,UINT), SYMBOLS(UMOUNT));
+SYS(sys_msync, FILESYSTEM, SYNC, 3, ZERO(INT), PARAMS(_,MEMORY_ADDRESS, _,SIZE, SYM,UINT), SYMBOLS(MSYNC));
+SYS(sys_madvise, MEMORY, WRITE_OR_ADVISE, 3, ZERO(INT), PARAMS(_,MEMORY_ADDRESS, _,SIZE, SYM,INT), SYMBOLS(MADVISE));
+SYS(sys_epoll_create1, FILE_DESCRIPTORS, CREATE_POLL, 1, INT_FD, PARAMS(SYM,UINT), SYMBOLS(EPOLL));
+SYS(sys_epoll_ctl, FILE_DESCRIPTORS, CREATE_POLL, 4, ZERO(INT), PARAMS(_,INT_FD, SYM,INT, _,INT, IN,STRUCT_EPOLL_EVENT), SYMBOLS(EPOLL_CTL));
+SYS(sys_accept4, NETWORK_ENABLED_IPC, ACCEPT, 4, INT_FD, PARAMS(_,INT_FD, OUT,STRUCT_SOCKADDR, OUT,INT, _,UINT), SYMBOLS(SOCK_FD));
+SYS(sys_clock_nanosleep, TIME, SLEEP, 4, ZERO(INT), PARAMS(SYM,INT, SYM,UINT, IN,STRUCT_TIMESPEC, OUT,STRUCT_TIMESPEC), SYMBOLS(CLOCKID, TIMER));
+SYS(sys_clock_nanosleep_time32, TIME, SLEEP, 4, ZERO(INT), PARAMS(SYM,INT, SYM,UINT, IN,STRUCT_OLD_TIMESPEC32, OUT,STRUCT_OLD_TIMESPEC32), SYMBOLS(CLOCKID, TIMER));
+SYS(sys_dup3, FILE_DESCRIPTORS, DUP_OR_CLOSE, 3, INT, PARAMS(_,INT_FD, _,INT_FD, SYM,UINT), SYMBOLS(DUP3));
+SYS(sys_sync_file_range, FILESYSTEM, SYNC, 4, ZERO(INT), PARAMS(_,INT_FD, _,LLONG, _,LLONG, SYM,UINT), SYMBOLS(SYNC_FILE_RANGE));
+SYS(sys_sync_file_range2, FILESYSTEM, SYNC, 4, ZERO(INT), PARAMS(_,INT_FD, SYM,UINT, _,LLONG, _,LLONG), SYMBOLS(SYNC_FILE_RANGE));
+SYS(sys_renameat2, FILESYSTEM, LINK_OR_UNLINK, 5, ZERO(INT), PARAMS(SYM,INT_ATFD, _,STRING, SYM,INT_ATFD, _,STRING, SYM,UINT), SYMBOLS(2ATFD, RENAME));
+SYS(sys_mknod, FILESYSTEM, LINK, 3, ZERO(INT), PARAMS(_,STRING, SYM,USHORT, SYM,UINT), SYMBOLS(MODE, DEV));
+SYS(sys_mknodat, FILESYSTEM, LINK, 4, ZERO(INT), PARAMS(SYM,INT_ATFD, _,STRING, SYM,USHORT, SYM,UINT), SYMBOLS(ATFD_MODE, DEV));
+SYS(sys_mkdir, FILESYSTEM, LINK, 2, ZERO(INT), PARAMS(_,STRING, SYM,USHORT), SYMBOLS(MODE));
+SYS(sys_mkdirat, FILESYSTEM, LINK, 3, ZERO(INT), PARAMS(SYM,INT_ATFD, _,STRING, SYM,USHORT), SYMBOLS(ATFD, MODE));
+SYS(sys_umask, FILESYSTEM, UMASK, 1, SYMB(UINT), PARAMS(SYM,UINT), SYMBOLS(UMASK, UMASK));
+SYS(sys_flock, IPC, FILE_LOCK, 2, ZERO(INT), PARAMS(_,INT_FD, SYM,UINT), SYMBOLS(LOCK));
+SYS(sys_fchmod, FILE_DESCRIPTORS, MODIFY, 2, ZERO(INT), PARAMS(_,INT_FD, SYM,USHORT), SYMBOLS(MODE));
+SYS(sys_chmod, FILESYSTEM, MODIFY, 2, ZERO(INT), PARAMS(_,STRING, SYM,USHORT), SYMBOLS(MODE));
+SYS(sys_fchmodat, FILESYSTEM, MODIFY, 3, ZERO(INT), PARAMS(SYM,INT_ATFD, _,STRING, SYM,USHORT), SYMBOLS(ATFD, MODE));
+SYS(sys_fchmodat2, FILESYSTEM, MODIFY, 4, ZERO(INT), PARAMS(SYM,INT_ATFD, _,STRING, SYM,USHORT, SYM,UINT), SYMBOLS(ATFD_MODE, AT));
+SYS(sys_fallocate, FILE_DESCRIPTORS, WRITE, 4, ZERO(INT), PARAMS(_,INT_FD, SYM,INT, _,LLONG, _,LLONG), SYMBOLS(FALLOC));
+SYS(sys_execveat, PROCESSES, EXEC, 5, ZERO(INT), PARAMS(SYM,INT_ATFD, _,STRING, IN,STRINGS_THEN_NULL, IN,STRINGS_THEN_NULL, SYM,UINT), SYMBOLS(ATFD, AT));
+SYS(sys_newfstatat, FILESYSTEM, STAT, 4, ZERO(INT), PARAMS(SYM,INT_ATFD, _,STRING, OUT,STRUCT_STAT, SYM,UINT), SYMBOLS(ATFD, AT_AUTOMOUNT));
+SYS(sys_fstatat64, FILESYSTEM, STAT, 4, ZERO(INT), PARAMS(SYM,INT_ATFD, _,STRING, OUT,STRUCT_STAT64, SYM,INT), SYMBOLS(ATFD, AT_AUTOMOUNT));
+SYS(sys_linkat, FILESYSTEM, LINK, 5, ZERO(INT), PARAMS(SYM,INT_ATFD, _,STRING, SYM,INT_ATFD, _,STRING, SYM,UINT), SYMBOLS(2ATFD, AT));
+SYS(sys_unlinkat, FILESYSTEM, UNLINK, 3, ZERO(INT), PARAMS(SYM,INT_ATFD, _,STRING, SYM,UINT), SYMBOLS(ATFD, UNLINK));
+SYS(sys_fchownat, FILESYSTEM, MODIFY, 5, ZERO(INT), PARAMS(SYM,INT_ATFD, _,STRING, _,UINT32, _,UINT32, SYM,UINT), SYMBOLS(ATFD, AT));
+SYS(sys_swapon, SYSTEM, SWAP, 2, ZERO(INT), PARAMS(_,STRING, SYM,INT), SYMBOLS(SWAPON));
+SYS(sys_shmctl, IPC, CONTROL, 2, INT, PARAMS(_,INT, SYM,INT, BI/* depends on command*/,DYNAMIC), SYMBOLS(SHMCTL));
+SYS(sys_msgctl, IPC, CONTROL, 2, INT, PARAMS(_,INT, SYM,INT, BI/* depends on command*/,DYNAMIC), SYMBOLS(MSGCTL));
+SYS(sys_semctl, IPC, CONTROL, 3, INT, PARAMS(_,INT, _,INT, SYM,INT, BI/* depends on command*/,DYNAMIC), SYMBOLS(SEMCTL));
+SYS(sys_mlock2, MEMORY, LOCK, 3, ZERO(INT), PARAMS(_,MEMORY_ADDRESS, _,SIZE, SYM,UINT), SYMBOLS(MLOCK));
+SYS(sys_mlockall, MEMORY, LOCK, 1, ZERO(INT), PARAMS(SYM,INT), SYMBOLS(MCL));
+SYS(sys_preadv2, FILE_DESCRIPTORS, READ_OR_PEEK, 6, SSIZE, PARAMS(_,LONG_FD, BI,STRUCT_IOVEC_ARRAY, _,ULONG, _,INT64_LOW_32, _,INT64_HIGH_32, SYM,UINT), SYMBOLS(RWF));
+SYS(sys_pwritev2, FILE_DESCRIPTORS, WRITE, 6, SSIZE, PARAMS(_,LONG_FD, IN,STRUCT_IOVEC_ARRAY, _,ULONG, _,INT64_LOW_32, _,INT64_HIGH_32, SYM,UINT), SYMBOLS(RWF));
+SYS(sys_shmat, IPC, ATTACH, 3, MEMORY_ADDRESS, PARAMS(_,INT, _,MEMORY_ADDRESS, SYM,UINT), SYMBOLS(SHM));
+SYS(sys_faccessat2, FILESYSTEM, STAT, 4, ZERO(INT), PARAMS(SYM,INT_ATFD, _,STRING,SYM,UINT, SYM,UINT), SYMBOLS(FACCESSAT, FACCESSAT2));
+SYS(sys_fsopen, FILESYSTEM, MOUNTPOINT, 2, INT_FD, PARAMS(_,STRING, SYM,UINT), SYMBOLS(FSOPEN));
+SYS(sys_statx, FILESYSTEM, STAT, 5, ZERO(INT), PARAMS(SYM,INT_ATFD, _,STRING, SYM,UINT, SYM,UINT, OUT,STRUCT_STATX), SYMBOLS(3STATX));
+SYS(sys_pipe2, FILE_DESCRIPTORS, CREATE, 2, ZERO(INT), PARAMS(OUT,2_INTS_FD, SYM,UINT), SYMBOLS(PIPE));
+SYS(sys_getrandom, SYSTEM, RANDOM, 3, SSIZE, PARAMS(OUT,BUFFER, _,SIZE, SYM,UINT), SYMBOLS(GRND));
+SYS(sys_inotify_init1, FILESYSTEM, MONITOR, 1, INT_FD, PARAMS(SYM,UINT), SYMBOLS(INOTIFY_FD));
+SYS(sys_inotify_add_watch, FILESYSTEM, MONITOR, 3, INT32, PARAMS(_,INT_FD, _,STRING, SYM,UINT32), SYMBOLS(INOTIFY_MASK));
+SYS(sys_shmget, IPC, CONTROL, 3, INT, PARAMS(SYM,INT, _,SIZE, SYM,UINT), SYMBOLS(IPC_KEY, SHMGET));
+SYS(sys_msgget, IPC, CONTROL, 2, INT, PARAMS(SYM,INT, SYM,UINT), SYMBOLS(IPC_KEY, MSGGET));
+SYS(sys_semget, IPC, CONTROL, 3, INT, PARAMS(SYM,INT, _,INT, SYM,UINT), SYMBOLS(IPC_KEY, SEMGET));
+SYS(sys_msgrcv, IPC, COMMUNICATE, 5, INT, PARAMS( _,INT_FD, IN,STRUCT_MSGBUF, _,SIZE, _,LONG, SYM,UINT), SYMBOLS(MSGRCV));
+SYS(sys_msgsnd, IPC, COMMUNICATE, 4, ZERO(SSIZE), PARAMS(_,INT, OUT,STRUCT_MSGBUF, _,SIZE, SYM,UINT), SYMBOLS(MSGSND));
+SYS(sys_fanotify_mark, FILESYSTEM, MONITOR, 5, ZERO(INT), PARAMS(_,INT_FD, SYM,UINT, SYM,UINT64, SYM,INT_ATFD, _,STRING), SYMBOLS(FANOTIFY_MARK, ATFD));
+SYS(sys_mq_open, IPC, CONTROL, 4, INT_FD, PARAMS(_,STRING, SYM,UINT, SYM,USHORT, IN,STRUCT_MQ_ATTR), SYMBOLS(MQ_OPEN, MODE));
+SYS(sys_fanotify_init, FILESYSTEM, MONITOR, 2, INT_FD, PARAMS(SYM,UINT, SYM,UINT), SYMBOLS(FAN_CLASS, FAN_EVENT_F));
+SYS(sys_socket, FILE_DESCRIPTORS, CREATE, 3, INT_FD, PARAMS(SYM,INT, SYM,UINT, SYM,UINT), SYMBOLS(SOCKET));
+SYS(sys_socketpair, FILE_DESCRIPTORS, CREATE, 4, ZERO(INT), PARAMS(SYM,INT, SYM,UINT, SYM,UINT, OUT,2_INTS_FD), SYMBOLS(SOCKET));
+SYS(sys_epoll_wait, FILE_DESCRIPTORS, POLL, 4, INT, PARAMS(_,INT_FD, OUT,STRUCT_EPOLL_EVENT_ARRAY, _,INT, _,INT));
+SYS(sys_epoll_pwait, FILE_DESCRIPTORS, POLL, 6, INT, PARAMS(_,INT_FD, OUT,STRUCT_EPOLL_EVENT_ARRAY, _,INT, _,INT, IN,ULONG_ARRAY, _,SIZE));
+SYS(sys_epoll_pwait2, FILE_DESCRIPTORS, POLL, 6, INT, PARAMS(_,INT_FD, OUT,STRUCT_EPOLL_EVENT_ARRAY, _,INT, IN,STRUCT_TIMESPEC, IN,ULONG_ARRAY, _,SIZE));
+SYS(sys_getgroups, PROCESSES, STAT_SELF, 2, INT, PARAMS(_,INT, OUT,UINT32_ARRAY));
+SYS(sys_getgroups16, PROCESSES, STAT_SELF, 2, INT, PARAMS(_,INT, OUT,USHORT_ARRAY));
+SYS(sys_setgroups, PROCESSES, CHANGE_PERMISSIONS, 2, ZERO(INT), PARAMS(_,INT, IN,UINT32_ARRAY));
+SYS(sys_setgroups16, PROCESSES, CHANGE_PERMISSIONS, 2, ZERO(INT), PARAMS(_,INT, IN,USHORT_ARRAY));
+SYS(sys_semop, IPC, COMMUNICATE, 3, ZERO(INT), PARAMS(_,INT, IN,STRUCT_SEMBUF_ARRAY, _,UINT));
+SYS(sys_semtimedop, IPC, COMMUNICATE_WITH_RELATIVE_TIMEOUT, 4, ZERO(INT), PARAMS(_,INT, IN,STRUCT_SEMBUF_ARRAY, _,UINT, IN,STRUCT_TIMESPEC));
+SYS(sys_semtimedop_time32, IPC, COMMUNICATE_WITH_RELATIVE_TIMEOUT, 4, ZERO(INT), PARAMS(_,INT, IN,STRUCT_SEMBUF_ARRAY, _,UINT, IN,STRUCT_OLD_TIMESPEC32));
+SYS(sys_mincore, MEMORY, STAT, 3, ZERO(INT), PARAMS(_,MEMORY_ADDRESS, _,SIZE, OUT,UCHAR_ARRAY_UNKNOWN_FILL /* entirely filled */));
+SYS(sys_reboot, SYSTEM, REBOOT, 3, ZERO(INT), PARAMS(SYM,UINT, SYM,UINT, SYM,UINT, _,STRING), SYMBOLS(REBOOT));
+
+#define TODO_SYS(...) SYS(__VA_ARGS__, .queer = 1)
+TODO_SYS(sys_poll, FILE_DESCRIPTORS, POLL, 3, INT, PARAMS(BI,STRUCT_POLLFD_ARRAY, _,UINT, _,INT));
+TODO_SYS(sys_ppoll, FILE_DESCRIPTORS, POLL, 5, INT, PARAMS(BI,STRUCT_POLLFD_ARRAY, _,UINT, IN,STRUCT_TIMESPEC, IN,ULONG_ARRAY, _,SIZE));
+TODO_SYS(sys_ppoll_time32, FILE_DESCRIPTORS, POLL, 5, INT, PARAMS(BI,STRUCT_POLLFD_ARRAY, _,UINT, IN,STRUCT_OLD_TIMESPEC32, IN,ULONG_ARRAY, _,SIZE));
+TODO_SYS(sys_old_select, FILE_DESCRIPTORS, POLL, 1, INT, PARAMS(BI,STRUCT_SEL_ARG_STRUCT));
+TODO_SYS(sys_select, FILE_DESCRIPTORS, POLL, 5, INT, PARAMS(_,INT, BI,FD_SET, BI,FD_SET, BI,FD_SET, BI,STRUCT_OLD_TIMEVAL)); /* unlike pselect6, select may update the timeout argument */
+TODO_SYS(sys_pselect6, FILE_DESCRIPTORS, POLL, 6, INT, PARAMS(_,INT, BI,FD_SET, BI,FD_SET, BI,FD_SET, OUT,STRUCT_TIMESPEC, IN,ULONG));
+TODO_SYS(sys_pselect6_time32, FILE_DESCRIPTORS, POLL, 6, INT, PARAMS(_,INT, BI,FD_SET, BI,FD_SET, BI,FD_SET, OUT,STRUCT_OLD_TIMESPEC32, IN,ULONG));
+TODO_SYS(sys_readv, FILE_DESCRIPTORS, READ, 3, SSIZE, PARAMS(_,LONG_FD, BI,STRUCT_IOVEC_ARRAY, _,ULONG));
+TODO_SYS(sys_writev, FILE_DESCRIPTORS, WRITE, 3, SSIZE, PARAMS(_,LONG_FD, IN,STRUCT_IOVEC_ARRAY, _,ULONG));
+TODO_SYS(sys_preadv, FILE_DESCRIPTORS, PEEK, 5, SSIZE, PARAMS(_,LONG_FD, BI,STRUCT_IOVEC_ARRAY, _,ULONG, _,INT64_LOW_32, _,INT64_HIGH_32));
+TODO_SYS(sys_pwritev, FILE_DESCRIPTORS, WRITE, 5, SSIZE, PARAMS(_,LONG_FD, IN,STRUCT_IOVEC_ARRAY, _,ULONG, _,INT64_LOW_32, _,INT64_HIGH_32));
+TODO_SYS(sys_sched_getaffinity, SCHEDULING, GET, 3, INT, PARAMS(_,INT, _,UINT, OUT,ULONG_ARRAY));
+TODO_SYS(sys_sched_setaffinity, SCHEDULING, SET, 3, ZERO(INT), PARAMS(_,INT, _,UINT, IN,ULONG_ARRAY));
+#undef TODO_SYS
+
+
+#define XXX TODO /* when none on the architectures is not support yet by libsyscalls's core */
+static struct libsyscalls_syscall_abi TODO =
+ {.category = LIBSYSCALLS_CAT_SUPPORT_PENDING,
+ .min_argument_count = -1,
+ .max_argument_count = -1};
+
+#define linux_syscall_sys_add_key TODO
+#define linux_syscall_sys_arch_prctl TODO
+#define linux_syscall_sys_bpf TODO
+#define linux_syscall_sys_cachestat TODO
+#define linux_syscall_sys_capget TODO
+#define linux_syscall_sys_capset TODO
+#define linux_syscall_sys_clone TODO
+#define linux_syscall_sys_clone3 TODO
+#define linux_syscall_sys_copy_file_range TODO
+#define linux_syscall_sys_creat TODO
+#define linux_syscall_sys_delete_module TODO
+#define linux_syscall_sys_eventfd TODO
+#define linux_syscall_sys_eventfd2 TODO
+#define linux_syscall_sys_fcntl TODO
+#define linux_syscall_sys_finit_module TODO
+#define linux_syscall_sys_fsconfig TODO
+#define linux_syscall_sys_fsmount TODO
+#define linux_syscall_sys_fspick TODO
+#define linux_syscall_sys_fstatfs TODO
+#define linux_syscall_sys_futex TODO
+#define linux_syscall_sys_futex_waitv TODO
+#define linux_syscall_sys_futimesat TODO
+#define linux_syscall_sys_getcpu TODO
+#define linux_syscall_sys_getdents TODO
+#define linux_syscall_sys_getdents64 TODO
+#define linux_syscall_sys_get_mempolicy TODO
+#define linux_syscall_sys_getpriority TODO
+#define linux_syscall_sys_getrlimit TODO
+#define linux_syscall_sys_get_robust_list TODO
+#define linux_syscall_sys_getrusage TODO
+#define linux_syscall_sys_getsockopt TODO
+#define linux_syscall_sys_gettimeofday TODO
+#define linux_syscall_sys_init_module TODO
+#define linux_syscall_sys_io_cancel TODO
+#define linux_syscall_sys_ioctl TODO
+#define linux_syscall_sys_io_destroy TODO
+#define linux_syscall_sys_io_getevents TODO
+#define linux_syscall_sys_ioperm TODO
+#define linux_syscall_sys_io_pgetevents TODO
+#define linux_syscall_sys_iopl TODO
+#define linux_syscall_sys_ioprio_get TODO
+#define linux_syscall_sys_ioprio_set TODO
+#define linux_syscall_sys_io_setup TODO
+#define linux_syscall_sys_io_submit TODO
+#define linux_syscall_sys_io_uring_enter TODO
+#define linux_syscall_sys_io_uring_register TODO
+#define linux_syscall_sys_io_uring_setup TODO
+#define linux_syscall_sys_kcmp TODO
+#define linux_syscall_sys_kexec_file_load TODO
+#define linux_syscall_sys_kexec_load TODO
+#define linux_syscall_sys_keyctl TODO
+#define linux_syscall_sys_landlock_add_rule TODO
+#define linux_syscall_sys_landlock_create_ruleset TODO
+#define linux_syscall_sys_landlock_restrict_self TODO
+#define linux_syscall_sys_lookup_dcookie TODO
+#define linux_syscall_sys_map_shadow_stack TODO
+#define linux_syscall_sys_mbind TODO
+#define linux_syscall_sys_membarrier TODO
+#define linux_syscall_sys_memfd_create TODO
+#define linux_syscall_sys_memfd_secret TODO
+#define linux_syscall_sys_migrate_pages TODO
+#define linux_syscall_sys_mmap TODO
+#define linux_syscall_sys_modify_ldt TODO
+#define linux_syscall_sys_mount TODO
+#define linux_syscall_sys_mount_setattr TODO
+#define linux_syscall_sys_move_mount TODO
+#define linux_syscall_sys_move_pages TODO
+#define linux_syscall_sys_mprotect TODO
+#define linux_syscall_sys_mremap TODO
+#define linux_syscall_sys_munmap TODO
+#define linux_syscall_sys_name_to_handle_at TODO
+#define linux_syscall_sys_ni_syscall TODO
+#define linux_syscall_sys_open TODO
+#define linux_syscall_sys_openat TODO
+#define linux_syscall_sys_openat2 TODO
+#define linux_syscall_sys_open_by_handle_at TODO
+#define linux_syscall_sys_open_tree TODO
+#define linux_syscall_sys_perf_event_open TODO
+#define linux_syscall_sys_personality TODO
+#define linux_syscall_sys_pidfd_getfd TODO
+#define linux_syscall_sys_pidfd_open TODO
+#define linux_syscall_sys_pidfd_send_signal TODO
+#define linux_syscall_sys_pkey_alloc TODO
+#define linux_syscall_sys_pkey_free TODO
+#define linux_syscall_sys_pkey_mprotect TODO
+#define linux_syscall_sys_prctl TODO
+#define linux_syscall_sys_prlimit64 TODO
+#define linux_syscall_sys_process_madvise TODO
+#define linux_syscall_sys_process_mrelease TODO
+#define linux_syscall_sys_process_vm_readv TODO
+#define linux_syscall_sys_process_vm_writev TODO
+#define linux_syscall_sys_ptrace TODO
+#define linux_syscall_sys_quotactl TODO
+#define linux_syscall_sys_quotactl_fd TODO
+#define linux_syscall_sys_remap_file_pages TODO
+#define linux_syscall_sys_request_key TODO
+#define linux_syscall_sys_restart_syscall TODO
+#define linux_syscall_sys_rseq TODO
+#define linux_syscall_sys_rt_sigaction TODO
+#define linux_syscall_sys_rt_sigpending TODO
+#define linux_syscall_sys_rt_sigprocmask TODO
+#define linux_syscall_sys_rt_sigqueueinfo TODO
+#define linux_syscall_sys_rt_sigreturn TODO
+#define linux_syscall_sys_rt_sigsuspend TODO
+#define linux_syscall_sys_rt_sigtimedwait TODO
+#define linux_syscall_sys_rt_tgsigqueueinfo TODO
+#define linux_syscall_sys_seccomp TODO
+#define linux_syscall_sys_set_mempolicy TODO
+#define linux_syscall_sys_set_mempolicy_home_node TODO
+#define linux_syscall_sys_setns TODO
+#define linux_syscall_sys_setpriority TODO
+#define linux_syscall_sys_setrlimit TODO
+#define linux_syscall_sys_set_robust_list TODO
+#define linux_syscall_sys_setsockopt TODO
+#define linux_syscall_sys_set_tid_address TODO
+#define linux_syscall_sys_settimeofday TODO
+#define linux_syscall_sys_sigaltstack TODO
+#define linux_syscall_sys_signalfd TODO
+#define linux_syscall_sys_signalfd4 TODO
+#define linux_syscall_sys_statfs TODO
+#define linux_syscall_sys_sysfs TODO
+#define linux_syscall_sys_syslog TODO
+#define linux_syscall_sys_time TODO
+#define linux_syscall_sys_timer_create TODO
+#define linux_syscall_sys_timer_delete TODO
+#define linux_syscall_sys_timerfd_create TODO
+#define linux_syscall_sys_timerfd_gettime TODO
+#define linux_syscall_sys_timerfd_settime TODO
+#define linux_syscall_sys_timer_getoverrun TODO
+#define linux_syscall_sys_timer_gettime TODO
+#define linux_syscall_sys_timer_settime TODO
+#define linux_syscall_sys_times TODO
+#define linux_syscall_sys_unshare TODO
+#define linux_syscall_sys_userfaultfd TODO
+#define linux_syscall_sys_ustat TODO
+#define linux_syscall_sys_utime TODO
+#define linux_syscall_sys_utimensat TODO
+#define linux_syscall_sys_utimes TODO
+#define linux_syscall_sys_vmsplice TODO
+#define linux_syscall_sys_wait4 TODO
+#define linux_syscall_sys_waitid TODO
+#define linux_syscall_sys_waitpid TODO
+#define linux_syscall_sys_create_module TODO
+#define linux_syscall_sys_epoll_ctl_old TODO
+#define linux_syscall_sys_epoll_wait_old TODO
+#define linux_syscall_sys_get_kernel_syms TODO
+#define linux_syscall_sys_get_thread_area TODO
+#define linux_syscall_sys_nfsservctl TODO
+#define linux_syscall_sys_query_module TODO
+#define linux_syscall_sys_set_thread_area TODO
+#define linux_syscall_sys_uselib TODO
+
+#define linux_syscall_compat_sys_recvfrom TODO /* i386 x32 mips powerpc s390 */
+#define linux_syscall_compat_sys_execve TODO /* i386 x32 mips powerpc s390 parisc */
+#define linux_syscall_compat_sys_execveat TODO /* i386 x32 mips powerpc s390 parisc */
+#define linux_syscall_compat_sys_fcntl64 TODO /* i386 x32 mips powerpc s390 parisc sparc */
+#define linux_syscall_compat_sys_get_robust_list TODO /* i386 x32 mips powerpc s390 parisc sparc */
+#define linux_syscall_compat_sys_io_setup TODO /* i386 x32 mips powerpc s390 parisc sparc */
+#define linux_syscall_compat_sys_io_submit TODO /* i386 x32 mips powerpc s390 parisc sparc */
+#define linux_syscall_compat_sys_ioctl TODO /* i386 x32 mips powerpc s390 parisc sparc */
+#define linux_syscall_compat_sys_kexec_load TODO /* i386 x32 mips powerpc s390 parisc sparc */
+#define linux_syscall_compat_sys_mq_notify TODO /* i386 x32 mips powerpc s390 parisc sparc */
+#define linux_syscall_compat_sys_ptrace TODO /* i386 x32 mips powerpc s390 parisc sparc */
+#define linux_syscall_compat_sys_recvmmsg_time64 TODO /* i386 x32 mips powerpc s390 parisc sparc */
+#define linux_syscall_compat_sys_recvmsg TODO /* i386 x32 mips powerpc s390 parisc sparc */
+#define linux_syscall_compat_sys_rt_sigaction TODO /* i386 x32 mips powerpc s390 parisc sparc */
+#define linux_syscall_compat_sys_rt_sigpending TODO /* i386 x32 mips powerpc s390 parisc sparc */
+#define linux_syscall_compat_sys_rt_sigqueueinfo TODO /* i386 x32 mips powerpc s390 parisc sparc */
+#define linux_syscall_compat_sys_rt_sigtimedwait_time64 TODO /* i386 x32 mips powerpc s390 parisc sparc */
+#define linux_syscall_compat_sys_rt_tgsigqueueinfo TODO /* i386 x32 mips powerpc s390 parisc sparc */
+#define linux_syscall_compat_sys_sendmmsg TODO /* i386 x32 mips powerpc s390 parisc sparc */
+#define linux_syscall_compat_sys_sendmsg TODO /* i386 x32 mips powerpc s390 parisc sparc */
+#define linux_syscall_compat_sys_set_robust_list TODO /* i386 x32 mips powerpc s390 parisc sparc */
+#define linux_syscall_compat_sys_sigaltstack TODO /* i386 x32 mips powerpc s390 parisc sparc */
+#define linux_syscall_compat_sys_timer_create TODO /* i386 x32 mips powerpc s390 parisc sparc */
+#define linux_syscall_compat_sys_waitid TODO /* i386 x32 mips powerpc s390 parisc sparc */
+
+#define linux_syscall_sys_io_pgetevents_time32 TODO /* i386 arm mips microblaze parisc powerpc sparc */
+#define linux_syscall_sys_fcntl64 TODO /* i386 arm mips m68k microblaze parisc powerpc sh sparc xtensa */
+#define linux_syscall_sys_rt_sigtimedwait_time32 TODO /* i386 arm mips m68k microblaze parisc powerpc sh sparc xtensa */
+#define linux_syscall_sys_futex_time32 TODO /* i386 arm mips m68k microblaze parisc powerpc sh sparc s390 xtensa */
+#define linux_syscall_sys_futimesat_time32 TODO /* i386 arm mips m68k microblaze parisc powerpc sh sparc s390 xtensa */
+#define linux_syscall_sys_io_getevents_time32 TODO /* i386 arm mips m68k microblaze parisc powerpc sh sparc s390 xtensa */
+#define linux_syscall_sys_timer_gettime32 TODO /* i386 arm mips m68k microblaze parisc powerpc sh sparc s390 xtensa */
+#define linux_syscall_sys_timer_settime32 TODO /* i386 arm mips m68k microblaze parisc powerpc sh sparc s390 xtensa */
+#define linux_syscall_sys_timerfd_gettime32 TODO /* i386 arm mips m68k microblaze parisc powerpc sh sparc s390 xtensa */
+#define linux_syscall_sys_timerfd_settime32 TODO /* i386 arm mips m68k microblaze parisc powerpc sh sparc s390 xtensa */
+#define linux_syscall_sys_utime32 TODO /* i386 arm mips m68k microblaze parisc powerpc sh sparc s390 xtensa */
+#define linux_syscall_sys_utimensat_time32 TODO /* i386 arm mips m68k microblaze parisc powerpc sh sparc s390 xtensa */
+#define linux_syscall_sys_utimes_time32 TODO /* i386 arm mips m68k microblaze parisc powerpc sh sparc s390 xtensa */
+#define linux_syscall_sys_sigpending TODO /* i386 arm mips m68k microblaze parisc powerpc sh sparc s390 alpha */
+#define linux_syscall_sys_nice TODO /* i386 arm mips m68k microblaze parisc powerpc sh sparc s390 */
+#define linux_syscall_sys_sigprocmask TODO /* i386 arm mips m68k microblaze parisc powerpc sh sparc s390 */
+#define linux_syscall_sys_socketcall TODO /* i386 arm mips m68k microblaze parisc powerpc sh sparc s390 */
+#define linux_syscall_sys_stime32 TODO /* i386 arm mips m68k microblaze parisc powerpc sh sparc s390 */
+#define linux_syscall_sys_time32 TODO /* i386 arm mips m68k microblaze parisc powerpc sh sparc s390 */
+#define linux_syscall_sys_sgetmask TODO /* i386 arm mips m68k microblaze parisc powerpc sh sparc */
+#define linux_syscall_sys_ssetmask TODO /* i386 arm mips m68k microblaze parisc powerpc sh sparc */
+#define linux_syscall_sys_sigaction TODO /* i386 arm mips m68k powerpc sh s390 */
+#define linux_syscall_sys_sigsuspend TODO /* i386 arm mips m68k powerpc sh sparc s390 alpha */
+#define linux_syscall_sys_ipc TODO /* i386 arm mips m68k powerpc sh sparc */
+#define linux_syscall_sys_old_readdir TODO /* i386 arm mips m68k powerpc sh sparc */
+#define linux_syscall_sys_signal TODO /* i386 arm m68k microblaze parisc powerpc sh sparc s390 */
+#define linux_syscall_sys_old_getrlimit TODO /* i386 arm m68k powerpc sh */
+#define linux_syscall_sys_old_mmap TODO /* i386 arm m68k s390 */
+#define linux_syscall_sys_vm86 TODO /* i386 arm */
+
+#define linux_syscall_sys_fstatfs64 TODO /* i386 mips m68k ia64 microblaze parisc powerpc sh sparc s390 alpha xtensa */
+#define linux_syscall_sys_statfs64 TODO /* i386 mips m68k ia64 microblaze parisc powerpc sh sparc s390 alpha xtensa */
+#define linux_syscall_sys_sigreturn TODO /* i386 mips m68k powerpc sh sparc s390 alpha */
+#define linux_syscall_compat_sys_getitimer TODO /* i386 mips parisc powerpc sparc s390 alpha */
+#define linux_syscall_compat_sys_setitimer TODO /* i386 mips parisc powerpc sparc s390 alpha */
+#define linux_syscall_compat_sys_epoll_pwait2 TODO /* i386 mips parisc powerpc sparc s390 */
+#define linux_syscall_compat_sys_fstatfs TODO /* i386 mips parisc powerpc sparc s390 */
+#define linux_syscall_compat_sys_fstatfs64 TODO /* i386 mips parisc powerpc sparc s390 */
+#define linux_syscall_compat_sys_getdents TODO /* i386 mips parisc powerpc sparc s390 */
+#define linux_syscall_compat_sys_getrlimit TODO /* i386 mips parisc powerpc sparc s390 */
+#define linux_syscall_compat_sys_getrusage TODO /* i386 mips parisc powerpc sparc s390 */
+#define linux_syscall_compat_sys_gettimeofday TODO /* i386 mips parisc powerpc sparc s390 */
+#define linux_syscall_compat_sys_io_pgetevents TODO /* i386 mips parisc powerpc sparc s390 */
+#define linux_syscall_compat_sys_keyctl TODO /* i386 mips parisc powerpc sparc s390 */
+#define linux_syscall_compat_sys_lookup_dcookie TODO /* i386 mips parisc powerpc sparc s390 */
+#define linux_syscall_compat_sys_mq_getsetattr TODO /* i386 mips parisc powerpc sparc s390 */
+#define linux_syscall_compat_sys_mq_open TODO /* i386 mips parisc powerpc sparc s390 */
+#define linux_syscall_compat_sys_msgctl TODO /* i386 mips parisc powerpc sparc s390 */
+#define linux_syscall_compat_sys_msgrcv TODO /* i386 mips parisc powerpc sparc s390 */
+#define linux_syscall_compat_sys_msgsnd TODO /* i386 mips parisc powerpc sparc s390 */
+#define linux_syscall_compat_sys_newfstat TODO /* i386 mips parisc powerpc sparc s390 */
+#define linux_syscall_compat_sys_newlstat TODO /* i386 mips parisc powerpc sparc s390 */
+#define linux_syscall_compat_sys_newstat TODO /* i386 mips parisc powerpc sparc s390 */
+#define linux_syscall_compat_sys_open TODO /* i386 mips parisc powerpc sparc s390 */
+#define linux_syscall_compat_sys_open_by_handle_at TODO /* i386 mips parisc powerpc sparc s390 */
+#define linux_syscall_compat_sys_openat TODO /* i386 mips parisc powerpc sparc s390 */
+#define linux_syscall_compat_sys_ppoll_time32 TODO /* i386 mips parisc powerpc sparc s390 */
+#define linux_syscall_compat_sys_ppoll_time64 TODO /* i386 mips parisc powerpc sparc s390 */
+#define linux_syscall_compat_sys_preadv TODO /* i386 mips parisc powerpc sparc s390 */
+#define linux_syscall_compat_sys_preadv2 TODO /* i386 mips parisc powerpc sparc s390 */
+#define linux_syscall_compat_sys_pselect6_time32 TODO /* i386 mips parisc powerpc sparc s390 */
+#define linux_syscall_compat_sys_pselect6_time64 TODO /* i386 mips parisc powerpc sparc s390 */
+#define linux_syscall_compat_sys_pwritev TODO /* i386 mips parisc powerpc sparc s390 */
+#define linux_syscall_compat_sys_pwritev2 TODO /* i386 mips parisc powerpc sparc s390 */
+#define linux_syscall_compat_sys_recvmmsg_time32 TODO /* i386 mips parisc powerpc sparc s390 */
+#define linux_syscall_compat_sys_rt_sigprocmask TODO /* i386 mips parisc powerpc sparc s390 */
+#define linux_syscall_compat_sys_rt_sigsuspend TODO /* i386 mips parisc powerpc sparc s390 */
+#define linux_syscall_compat_sys_rt_sigtimedwait_time32 TODO /* i386 mips parisc powerpc sparc s390 */
+#define linux_syscall_compat_sys_sched_getaffinity TODO /* i386 mips parisc powerpc sparc s390 */
+#define linux_syscall_compat_sys_sched_setaffinity TODO /* i386 mips parisc powerpc sparc s390 */
+#define linux_syscall_compat_sys_select TODO /* i386 mips parisc powerpc sparc s390 */
+#define linux_syscall_compat_sys_semctl TODO /* i386 mips parisc powerpc sparc s390 */
+#define linux_syscall_compat_sys_sendfile TODO /* i386 mips parisc powerpc sparc s390 */
+#define linux_syscall_compat_sys_setrlimit TODO /* i386 mips parisc powerpc sparc s390 */
+#define linux_syscall_compat_sys_settimeofday TODO /* i386 mips parisc powerpc sparc s390 */
+#define linux_syscall_compat_sys_shmat TODO /* i386 mips parisc powerpc sparc s390 */
+#define linux_syscall_compat_sys_shmctl TODO /* i386 mips parisc powerpc sparc s390 */
+#define linux_syscall_compat_sys_signalfd TODO /* i386 mips parisc powerpc sparc s390 */
+#define linux_syscall_compat_sys_sigpending TODO /* i386 mips parisc powerpc sparc s390 */
+#define linux_syscall_compat_sys_sigprocmask TODO /* i386 mips parisc powerpc sparc s390 */
+#define linux_syscall_compat_sys_statfs TODO /* i386 mips parisc powerpc sparc s390 */
+#define linux_syscall_compat_sys_statfs64 TODO /* i386 mips parisc powerpc sparc s390 */
+#define linux_syscall_compat_sys_sysinfo TODO /* i386 mips parisc powerpc sparc s390 */
+#define linux_syscall_compat_sys_times TODO /* i386 mips parisc powerpc sparc s390 */
+#define linux_syscall_compat_sys_ustat TODO /* i386 mips parisc powerpc sparc s390 */
+#define linux_syscall_compat_sys_wait4 TODO /* i386 mips parisc powerpc sparc s390 */
+#define linux_syscall_compat_sys_old_readdir TODO /* i386 mips powerpc sparc s390 */
+#define linux_syscall_compat_sys_signalfd4 TODO /* i386 mips powerpc sparc s390 */
+#define linux_syscall_compat_sys_ipc TODO /* i386 mips powerpc sparc */
+#define linux_syscall_compat_sys_socketcall TODO /* i386 mips powerpc s390 */
+#define linux_syscall_sys_setaltroot TODO /* i386 mips */
+
+#define linux_syscall_compat_sys_lseek TODO /* i386 powerpc s390 parisc sparc */
+#define linux_syscall_compat_sys_sigaction TODO /* i386 powerpc s390 */
+#define linux_syscall_compat_sys_old_getrlimit TODO /* i386 powerpc s390 */
+#define linux_syscall_compat_sys_old_select TODO /* i386 powerpc */
+#define linux_syscall_sys_set_zone_reclaim TODO /* i386 microblaze */
+#define linux_syscall_sys_mmap_pgoff TODO /* i386 xtensa */
+#define linux_syscall_sys_ia32_fadvise64 TODO /* i386 */
+#define linux_syscall_sys_ia32_fadvise64_64 TODO /* i386 */
+#define linux_syscall_sys_ia32_fallocate TODO /* i386 */
+#define linux_syscall_sys_ia32_ftruncate64 TODO /* i386 */
+#define linux_syscall_sys_ia32_pread64 TODO /* i386 */
+#define linux_syscall_sys_ia32_pwrite64 TODO /* i386 */
+#define linux_syscall_sys_ia32_readahead TODO /* i386 */
+#define linux_syscall_sys_ia32_sync_file_range TODO /* i386 */
+#define linux_syscall_sys_ia32_truncate64 TODO /* i386 */
+#define linux_syscall_sys_vm86old TODO /* i386 */
+#define linux_syscall_compat_sys_ia32_clone TODO /* i386 */
+#define linux_syscall_compat_sys_ia32_fstat64 TODO /* i386 */
+#define linux_syscall_compat_sys_ia32_fstatat64 TODO /* i386 */
+#define linux_syscall_compat_sys_ia32_lstat64 TODO /* i386 */
+#define linux_syscall_compat_sys_ia32_mmap TODO /* i386 */
+#define linux_syscall_compat_sys_ia32_stat64 TODO /* i386 */
+
+#define linux_syscall_compat_sys_preadv64 TODO /* x32 */
+#define linux_syscall_compat_sys_preadv64v2 TODO /* x32 */
+#define linux_syscall_compat_sys_pwritev64 TODO /* x32 */
+#define linux_syscall_compat_sys_pwritev64v2 TODO /* x32 */
+
+#define linux_syscall_sys_idle XXX /* arm alpha */
+#define linux_syscall_sys_pciconfig_iobase XXX /* arm alpha powerpc */
+#define linux_syscall_sys_pciconfig_read TODO /* arm alpha powerpc sparc ia64 */
+#define linux_syscall_sys_pciconfig_write TODO /* arm alpha powerpc sparc ia64 */
+#define linux_syscall_sys_syscall XXX /* arm mips */
+#define linux_syscall_sys_mmap2 TODO /* arm microblaze parisc powerpc sparc ia64 m64k sh */
+#define linux_syscall_sys_rt_sigreturn_wrapper TODO /* arm microblaze parisc */
+#define linux_syscall_sys_afs_syscall XXX /* arm */
+#define linux_syscall_sys_arm_fadvise64_64 XXX /* arm */
+#define linux_syscall_sys_break XXX /* arm */
+#define linux_syscall_sys_fstatfs64_wrapper XXX /* arm */
+#define linux_syscall_sys_ftime XXX /* arm */
+#define linux_syscall_sys_gtty XXX /* arm */
+#define linux_syscall_sys_lock XXX /* arm */
+#define linux_syscall_sys_mpx XXX /* arm */
+#define linux_syscall_sys_oabi_bind XXX /* arm */
+#define linux_syscall_sys_oabi_connect XXX /* arm */
+#define linux_syscall_sys_oabi_epoll_ctl XXX /* arm */
+#define linux_syscall_sys_oabi_fcntl64 XXX /* arm */
+#define linux_syscall_sys_oabi_fstat64 XXX /* arm */
+#define linux_syscall_sys_oabi_fstatat64 XXX /* arm */
+#define linux_syscall_sys_oabi_ftruncate64 XXX /* arm */
+#define linux_syscall_sys_oabi_ipc XXX /* arm */
+#define linux_syscall_sys_oabi_lstat64 XXX /* arm */
+#define linux_syscall_sys_oabi_pread64 XXX /* arm */
+#define linux_syscall_sys_oabi_pwrite64 XXX /* arm */
+#define linux_syscall_sys_oabi_readahead XXX /* arm */
+#define linux_syscall_sys_oabi_semop XXX /* arm */
+#define linux_syscall_sys_oabi_semtimedop XXX /* arm */
+#define linux_syscall_sys_oabi_sendmsg XXX /* arm */
+#define linux_syscall_sys_oabi_sendto XXX /* arm */
+#define linux_syscall_sys_oabi_socketcall XXX /* arm */
+#define linux_syscall_sys_oabi_stat64 XXX /* arm */
+#define linux_syscall_sys_oabi_truncate64 XXX /* arm */
+#define linux_syscall_sys_prof XXX /* arm */
+#define linux_syscall_sys_profil XXX /* arm */
+#define linux_syscall_sys_sigreturn_wrapper XXX /* arm */
+#define linux_syscall_sys_statfs64_wrapper XXX /* arm */
+#define linux_syscall_sys_stty XXX /* arm */
+#define linux_syscall_sys_ulimit XXX /* arm */
+
+#define linux_syscall_compat_sys_epoll_pwait TODO /* mips parisc powerpc sparc s390 */
+#define linux_syscall_compat_sys_fanotify_mark TODO /* mips parisc powerpc sparc s390 */
+#define linux_syscall_compat_sys_fcntl TODO /* mips parisc powerpc sparc s390 */
+#define linux_syscall_sys_cacheflush TODO /* mips parisc m68k sh */
+#define linux_syscall_sys32_rt_sigreturn TODO /* mips sparc */
+#define linux_syscall_sys32_sigreturn TODO /* mips sparc */
+#define linux_syscall_compat_sys_recv XXX /* mips powerpc */
+#define linux_syscall___sys_clone TODO /* mips m68k */
+#define linux_syscall___sys_clone3 TODO /* mips m68k */
+#define linux_syscall___sys_fork TODO /* mips m68k */
+#define linux_syscall___sys_sysmips XXX /* mips */
+#define linux_syscall_compat_sys_old_msgctl XXX /* mips */
+#define linux_syscall_compat_sys_old_semctl XXX /* mips */
+#define linux_syscall_compat_sys_old_shmctl XXX /* mips */
+#define linux_syscall_sys32_fadvise64_64 XXX /* mips */
+#define linux_syscall_sys32_fallocate XXX /* mips */
+#define linux_syscall_sys32_readahead XXX /* mips */
+#define linux_syscall_sys32_sigsuspend XXX /* mips */
+#define linux_syscall_sys32_sync_file_range XXX /* mips */
+#define linux_syscall_sys32_syscall XXX /* mips */
+#define linux_syscall_sys_32_ftruncate64 XXX /* mips */
+#define linux_syscall_sys_32_llseek XXX /* mips */
+#define linux_syscall_sys_32_personality XXX /* mips */
+#define linux_syscall_sys_32_pread XXX /* mips */
+#define linux_syscall_sys_32_pwrite XXX /* mips */
+#define linux_syscall_sys_32_sigaction XXX /* mips */
+#define linux_syscall_sys_32_truncate64 XXX /* mips */
+#define linux_syscall_sys_cachectl XXX /* mips */
+#define linux_syscall_sys_mips_mmap XXX /* mips */
+#define linux_syscall_sys_mips_mmap2 XXX /* mips */
+#define linux_syscall_sysm_pipe XXX /* mips */
+#define linux_syscall_sysn32_rt_sigreturn XXX /* mips */
+
+#define linux_syscall_sys_stime TODO /* powerpc parisc sparc */
+#define linux_syscall_compat_sys_sendfile64 TODO /* powerpc parisc s390 */
+#define linux_syscall_compat_sys_fallocate TODO /* powerpc sparc */
+
+#define linux_syscall_alpha_syscall_zero XXX /* alpha */
+#define linux_syscall_sys_getdtablesize XXX /* alpha */
+#define linux_syscall_sys_old_adjtimex XXX /* alpha */
+#define linux_syscall_sys_osf_fstat XXX /* alpha */
+#define linux_syscall_sys_osf_fstatfs XXX /* alpha */
+#define linux_syscall_sys_osf_fstatfs64 XXX /* alpha */
+#define linux_syscall_sys_osf_getdirentries XXX /* alpha */
+#define linux_syscall_sys_osf_getdomainname XXX /* alpha */
+#define linux_syscall_sys_osf_getpriority XXX /* alpha */
+#define linux_syscall_sys_osf_getrusage XXX /* alpha */
+#define linux_syscall_sys_osf_getsysinfo XXX /* alpha */
+#define linux_syscall_sys_osf_gettimeofday XXX /* alpha */
+#define linux_syscall_sys_osf_lstat XXX /* alpha */
+#define linux_syscall_sys_osf_mmap XXX /* alpha */
+#define linux_syscall_sys_osf_mount XXX /* alpha */
+#define linux_syscall_sys_osf_proplist_syscall XXX /* alpha */
+#define linux_syscall_sys_osf_select XXX /* alpha */
+#define linux_syscall_sys_osf_set_program_attributes XXX /* alpha */
+#define linux_syscall_sys_osf_setsysinfo XXX /* alpha */
+#define linux_syscall_sys_osf_settimeofday XXX /* alpha */
+#define linux_syscall_sys_osf_sigaction XXX /* alpha */
+#define linux_syscall_sys_osf_sigprocmask XXX /* alpha */
+#define linux_syscall_sys_osf_sigstack XXX /* alpha */
+#define linux_syscall_sys_osf_stat XXX /* alpha */
+#define linux_syscall_sys_osf_statfs XXX /* alpha */
+#define linux_syscall_sys_osf_statfs64 XXX /* alpha */
+#define linux_syscall_sys_osf_sysinfo XXX /* alpha */
+#define linux_syscall_sys_osf_usleep_thread XXX /* alpha */
+#define linux_syscall_sys_osf_utimes XXX /* alpha */
+#define linux_syscall_sys_osf_utsname XXX /* alpha */
+#define linux_syscall_sys_osf_wait4 XXX /* alpha */
+#define linux_syscall_sys_sethae XXX /* alpha */ /* return 0; see syscalls(2) */
+
+#define linux_syscall_xtensa_fadvise64_64 XXX /* xtensa */
+#define linux_syscall_xtensa_rt_sigreturn XXX /* xtensa */
+#define linux_syscall_xtensa_shmat XXX /* xtensa */
+
+#define linux_syscall_ia64_brk XXX /* ia64 */
+#define linux_syscall_ia64_clock_getres XXX /* ia64 */
+#define linux_syscall_ia64_execve XXX /* ia64 */
+#define linux_syscall_ia64_getpriority XXX /* ia64 */
+#define linux_syscall_ia64_mremap XXX /* ia64 */
+#define linux_syscall_sys_clone2 XXX /* ia64 */
+#define linux_syscall_sys_getunwind XXX /* ia64 */
+
+#define linux_syscall_old_mmap XXX /* sh */
+#define linux_syscall_sys_fadvise64_64_wrapper XXX /* sh */
+#define linux_syscall_sys_pread_wrapper XXX /* sh */
+#define linux_syscall_sys_pwrite_wrapper XXX /* sh */
+
+#define linux_syscall___sys_vfork TODO /* m68k */
+#define linux_syscall_sys_atomic_barrier TODO /* m68k */
+#define linux_syscall_sys_atomic_cmpxchg_32 TODO /* m68k */
+
+#define linux_syscall_compat_sys_io_pgetevents_time64 TODO /* parisc */
+#define linux_syscall_parisc_compat_signalfd4 TODO /* parisc */
+#define linux_syscall_parisc_eventfd2 TODO /* parisc */
+#define linux_syscall_parisc_fadvise64_64 TODO /* parisc */
+#define linux_syscall_parisc_fallocate TODO /* parisc */
+#define linux_syscall_parisc_ftruncate64 TODO /* parisc */
+#define linux_syscall_parisc_inotify_init1 TODO /* parisc */
+#define linux_syscall_parisc_madvise TODO /* parisc */
+#define linux_syscall_parisc_personality TODO /* parisc */
+#define linux_syscall_parisc_pipe2 TODO /* parisc */
+#define linux_syscall_parisc_pread64 TODO /* parisc */
+#define linux_syscall_parisc_pwrite64 TODO /* parisc */
+#define linux_syscall_parisc_readahead TODO /* parisc */
+#define linux_syscall_parisc_signalfd4 TODO /* parisc */
+#define linux_syscall_parisc_sync_file_range TODO /* parisc */
+#define linux_syscall_parisc_timerfd_create TODO /* parisc */
+#define linux_syscall_parisc_truncate64 TODO /* parisc */
+#define linux_syscall_parisc_userfaultfd TODO /* parisc */
+#define linux_syscall_sys32_fanotify_mark TODO /* parisc */
+#define linux_syscall_sys32_unimplemented TODO /* parisc */
+#define linux_syscall_sys_acl_get TODO /* parisc */
+#define linux_syscall_sys_acl_set TODO /* parisc */
+#define linux_syscall_sys_alloc_hugepages TODO /* parisc */
+#define linux_syscall_sys_attrctl TODO /* parisc */
+#define linux_syscall_sys_clone3_wrapper TODO /* parisc */
+#define linux_syscall_sys_clone_wrapper TODO /* parisc */
+#define linux_syscall_sys_fork_wrapper TODO /* parisc */
+#define linux_syscall_sys_free_hugepages TODO /* parisc */
+#define linux_syscall_sys_timerfd TODO /* parisc */
+#define linux_syscall_sys_vfork_wrapper TODO /* parisc */
+
+#define linux_syscall_compat_sys_fadvise64 TODO /* sparc */
+#define linux_syscall_compat_sys_fadvise64_64 TODO /* sparc */
+#define linux_syscall_compat_sys_fstat64 TODO /* sparc */
+#define linux_syscall_compat_sys_fstatat64 TODO /* sparc */
+#define linux_syscall_compat_sys_lstat64 TODO /* sparc */
+#define linux_syscall_compat_sys_pread64 TODO /* sparc */
+#define linux_syscall_compat_sys_pwrite64 TODO /* sparc */
+#define linux_syscall_compat_sys_readahead TODO /* sparc */
+#define linux_syscall_compat_sys_sparc_sigaction TODO /* sparc */
+#define linux_syscall_compat_sys_stat64 TODO /* sparc */
+#define linux_syscall_compat_sys_sync_file_range TODO /* sparc */
+#define linux_syscall_sparc_exit TODO /* sparc */
+#define linux_syscall_sparc_exit_group TODO /* sparc */
+#define linux_syscall_sunos_execv TODO /* sparc */
+#define linux_syscall_sys32_execve TODO /* sparc */
+#define linux_syscall_sys32_execveat TODO /* sparc */
+#define linux_syscall_sys32_mmap2 TODO /* sparc */
+#define linux_syscall_sys32_socketcall TODO /* sparc */
+#define linux_syscall_sys64_execve TODO /* sparc */
+#define linux_syscall_sys64_execveat TODO /* sparc */
+#define linux_syscall_sys_64_mremap TODO /* sparc */
+#define linux_syscall_sys_64_munmap TODO /* sparc */
+#define linux_syscall_sys_getdomainname TODO /* sparc */
+#define linux_syscall_sys_kern_features TODO /* sparc */
+#define linux_syscall_sys_memory_ordering TODO /* sparc */
+#define linux_syscall_sys_nis_syscall TODO /* sparc */
+#define linux_syscall_sys_sparc64_personality TODO /* sparc */
+#define linux_syscall_sys_sparc_adjtimex TODO /* sparc */
+#define linux_syscall_sys_sparc_clock_adjtime TODO /* sparc */
+#define linux_syscall_sys_sparc_ipc TODO /* sparc */
+#define linux_syscall_sys_sparc_pipe TODO /* sparc */
+#define linux_syscall_sys_sparc_remap_file_pages TODO /* sparc */
+#define linux_syscall_sys_sparc_sigaction TODO /* sparc */
+#define linux_syscall_sys_utrap_install TODO /* sparc */
+
+#define linux_syscall_compat_sys_mmap2 XXX /* powerpc */
+#define linux_syscall_compat_sys_ppc32_fadvise64 XXX /* powerpc */
+#define linux_syscall_compat_sys_ppc64_personality XXX /* powerpc */
+#define linux_syscall_compat_sys_ppc_ftruncate64 XXX /* powerpc */
+#define linux_syscall_compat_sys_ppc_pread64 XXX /* powerpc */
+#define linux_syscall_compat_sys_ppc_pwrite64 XXX /* powerpc */
+#define linux_syscall_compat_sys_ppc_readahead XXX /* powerpc */
+#define linux_syscall_compat_sys_ppc_sync_file_range2 XXX /* powerpc */
+#define linux_syscall_compat_sys_ppc_truncate64 XXX /* powerpc */
+#define linux_syscall_compat_sys_swapcontext XXX /* powerpc */
+#define linux_syscall_sys_debug_setcontext XXX /* powerpc */
+#define linux_syscall_sys_ppc32_fadvise64 XXX /* powerpc */
+#define linux_syscall_sys_ppc64_personality XXX /* powerpc */
+#define linux_syscall_sys_ppc_fadvise64_64 XXX /* powerpc */
+#define linux_syscall_sys_ppc_fallocate XXX /* powerpc */
+#define linux_syscall_sys_ppc_ftruncate64 XXX /* powerpc */
+#define linux_syscall_sys_ppc_pread64 XXX /* powerpc */
+#define linux_syscall_sys_ppc_pwrite64 XXX /* powerpc */
+#define linux_syscall_sys_ppc_readahead XXX /* powerpc */
+#define linux_syscall_sys_ppc_sync_file_range2 XXX /* powerpc */
+#define linux_syscall_sys_ppc_truncate64 XXX /* powerpc */
+#define linux_syscall_sys_rtas XXX /* powerpc */
+#define linux_syscall_sys_spu_create XXX /* powerpc */
+#define linux_syscall_sys_spu_run XXX /* powerpc */
+#define linux_syscall_sys_subpage_prot XXX /* powerpc */
+#define linux_syscall_sys_swapcontext XXX /* powerpc */
+#define linux_syscall_sys_switch_endian XXX /* powerpc */
+
+#define linux_syscall_compat_sys_s390_fadvise64 XXX /* s390 */
+#define linux_syscall_compat_sys_s390_fadvise64_64 XXX /* s390 */
+#define linux_syscall_compat_sys_s390_fallocate XXX /* s390 */
+#define linux_syscall_compat_sys_s390_fstat64 XXX /* s390 */
+#define linux_syscall_compat_sys_s390_fstatat64 XXX /* s390 */
+#define linux_syscall_compat_sys_s390_ftruncate64 XXX /* s390 */
+#define linux_syscall_compat_sys_s390_ipc XXX /* s390 */
+#define linux_syscall_compat_sys_s390_lstat64 XXX /* s390 */
+#define linux_syscall_compat_sys_s390_mmap2 XXX /* s390 */
+#define linux_syscall_compat_sys_s390_old_mmap XXX /* s390 */
+#define linux_syscall_compat_sys_s390_pread64 XXX /* s390 */
+#define linux_syscall_compat_sys_s390_pwrite64 XXX /* s390 */
+#define linux_syscall_compat_sys_s390_read XXX /* s390 */
+#define linux_syscall_compat_sys_s390_readahead XXX /* s390 */
+#define linux_syscall_compat_sys_s390_stat64 XXX /* s390 */
+#define linux_syscall_compat_sys_s390_sync_file_range XXX /* s390 */
+#define linux_syscall_compat_sys_s390_truncate64 XXX /* s390 */
+#define linux_syscall_compat_sys_s390_write XXX /* s390 */
+#define linux_syscall_sys__sysctl XXX /* s390 */
+#define linux_syscall_sys_getpmsg XXX /* s390 */
+#define linux_syscall_sys_putpmsg XXX /* s390 */
+#define linux_syscall_sys_s390_guarded_storage XXX /* s390 */
+#define linux_syscall_sys_s390_ipc XXX /* s390 */
+#define linux_syscall_sys_s390_pci_mmio_read XXX /* s390 */
+#define linux_syscall_sys_s390_pci_mmio_write XXX /* s390 */
+#define linux_syscall_sys_s390_personality XXX /* s390 */
+#define linux_syscall_sys_s390_runtime_instr XXX /* s390 */
+#define linux_syscall_sys_s390_sthyi XXX /* s390 */
+
+#if defined(__clang__)
+# pragma clang diagnostic pop
+#else
+# pragma GCC diagnostic pop
+#endif
+
+
+#endif /* !SYMBOL_PRINTERS_ONLY */
diff --git a/linux/syscalls.mk b/linux/syscalls.mk
new file mode 100644
index 0000000..7c13441
--- /dev/null
+++ b/linux/syscalls.mk
@@ -0,0 +1,450 @@
+LINUX_SYSCALL_DIR = linux-src/syscalls-$(LINUX_VERSION)
+
+LINUX_SYSCALLS_ARCH_TBL_SPLIT_X64 != printf '$(LINUX_SYSCALL_DIR)/%s.tbl\n' amd64 x86
+LINUX_SYSCALLS_ARCH_TBL_SPLIT_MIPS != printf '$(LINUX_SYSCALL_DIR)/%s.tbl\n' mips-n32 mips-o32 mips-n64
+
+LINUX_SYSCALLS_ARCHES_SPLIT != grep '^LINUX_SYSCALLS_ARCH_TBL_SPLIT_' < linux/syscalls.mk | cut -d \% -f 2 | cut -d ' ' -f 2-
+LINUX_SYSCALLS_ARCHES_SIMPLE != (sed -n 's/^generated\/linux-syscalls-\([a-zA-Z0-9_-]\+\)\.h\s*:.*$$/\1/p' && \
+ printf '%s\n' $(LINUX_SYSCALLS_ARCHES_SPLIT)) < linux/syscalls.mk | sort | uniq -u
+LINUX_SYSCALLS_ARCHES = $(LINUX_SYSCALLS_ARCHES_SIMPLE) $(LINUX_SYSCALLS_ARCHES_SPLIT)
+LINUX_SYSCALLS_ARCH_HDR != printf 'generated/linux-syscalls-%s.h\n' $(LINUX_SYSCALLS_ARCHES)
+LINUX_SYSCALLS_ARCH_TBL_SIMPLE != printf '$(LINUX_SYSCALL_DIR)/%s.tbl\n' $(LINUX_SYSCALLS_ARCHES_SIMPLE)
+LINUX_SYSCALLS_ARCH_TBL_SPLIT != printf '$(LINUX_SYSCALL_DIR)/%s.tbl\n' $(LINUX_SYSCALLS_ARCHES_SPLIT)
+LINUX_SYSCALLS_ARCH_TBL = $(LINUX_SYSCALLS_ARCH_TBL_SIMPLE) $(LINUX_SYSCALLS_ARCH_TBL_SPLIT)
+
+LINUX_SYSCALLS_HDR =\
+ generated/linux-syscalls.h\
+ generated/linux-syscall-ranges.h\
+ $(LINUX_SYSCALLS_ARCH_HDR)
+
+
+generated/linux-syscalls-alpha.h: $(LINUX_SYSCALL_DIR)/alpha.tbl linux/syscalls.mk
+ mkdir -p -- generated
+ printf '\43define LIST_LINUX_SYSCALLS_FOR_ALPHA(X, _X_COMPAT, D)\\\n' > $@
+ printf '%i common %s %s\n' \
+ 320 idle sys_idle \
+ | cat -- $(LINUX_SYSCALL_DIR)/alpha.tbl - \
+ | sed '/^\s*\(\x23.*\)\?$$/d' \
+ | awk '{ print "\tX(" $$1 ", " $$3 ", " $$4 ") D\\"}' \
+ | sed '$$s/ D\\$$//' >> $@
+ test "$$(sed '/^\s*\(\x23.*\)\?$$/d' < $(LINUX_SYSCALL_DIR)/alpha.tbl | awk '{ print $$2 }')" = \
+ "$$(sed '/^\s*\(\x23.*\)\?$$/d' < $(LINUX_SYSCALL_DIR)/alpha.tbl | awk '{ print $$2 }' | grep '^common$$')"
+
+
+$(LINUX_SYSCALL_DIR)/amd64.tbl.fixed: $(LINUX_SYSCALL_DIR)/amd64.tbl linux/syscalls.mk
+ cat -- $(LINUX_SYSCALL_DIR)/amd64.tbl \
+ | sed 's/\s\+\(getpmsg\|putpmsg\|afs_syscall\|tuxcall\|security\|vserver\)\s*$$/& sys_ni_syscall/' \
+ | sed 's/^\s*[0-9]\+\s\+[a-z0-9]\+\s\+\([A-Za-z0-9_]\+\)\s*$$/& sys_\1/' \
+ > $@
+
+generated/linux-syscalls-amd64.h: $(LINUX_SYSCALL_DIR)/amd64.tbl.fixed linux/syscalls.mk
+ mkdir -p -- generated
+ printf '\43define LIST_LINUX_SYSCALLS_FOR_AMD64(X, _X_COMPAT, D)\\\n' > $@
+ cat -- $(LINUX_SYSCALL_DIR)/amd64.tbl.fixed \
+ | sed '/^\s*\(\x23.*\)\?$$/d' \
+ | awk '{ print "\tX(" $$1 ", " $$3 ", " $$4 ") D\\" $$2}' \
+ | sed -n 's/\\\(common\|64\)$$/\\/p' \
+ | sed '$$s/ D\\$$//' >> $@
+ printf '\n\43define LIST_LINUX_SYSCALLS_FOR_AMD64_X32(X, _X_COMPAT, D)\\\n' >> $@
+ cat -- $(LINUX_SYSCALL_DIR)/amd64.tbl.fixed \
+ | sed '/^\s*\(\x23.*\)\?$$/d' \
+ | awk '{ print "\tX(" $$1 ", " $$3 ", " $$4 ") D\\" $$2}' \
+ | sed -n 's/\\\(common\|x32\)$$/\\/p' \
+ | sed '$$s/ D\\$$//' >> $@
+ test "$$(sed '/^\s*\(\x23.*\)\?$$/d' < $(LINUX_SYSCALL_DIR)/amd64.tbl.fixed | awk '{ print $$2 }')" = \
+ "$$(sed '/^\s*\(\x23.*\)\?$$/d' < $(LINUX_SYSCALL_DIR)/amd64.tbl.fixed | awk '{ print $$2 }' | \
+ grep '^\(common\|64\|x32\)$$')"
+
+
+$(LINUX_SYSCALL_DIR)/arm.tbl.fixed: $(LINUX_SYSCALL_DIR)/arm.tbl linux/syscalls.mk
+ printf '%i common %s %s\n' \
+ 7 waitpid sys_waitpid \
+ 17 break sys_break \
+ 18 old_stat sys_stat \
+ 28 old_fstat sys_fstat \
+ 31 stty sys_stty \
+ 32 gtty sys_gtty \
+ 35 ftime sys_ftime \
+ 44 prof sys_prof \
+ 48 signal sys_signal \
+ 53 lock sys_lock \
+ 56 mpx sys_mpx \
+ 58 ulimit sys_ulimit \
+ 59 oldolduname sys_olduname \
+ 68 sgetmask sys_sgetmask \
+ 69 ssetmask sys_ssetmask \
+ 84 old_lstat sys_lstat \
+ 98 profil sys_profil \
+ 101 ioperm sys_ioperm \
+ 109 olduname sys_uname \
+ 110 iopl sys_iopl \
+ 112 idle sys_idle \
+ 123 modify_ldt sys_modify_ldt \
+ 127 create_module sys_create_module \
+ 130 get_kernel_syms sys_get_kernel_syms \
+ 137 afs_syscall sys_afs_syscall \
+ 166 vm86 sys_vm86 \
+ 167 query_module sys_query_module \
+ | cat -- $(LINUX_SYSCALL_DIR)/arm.tbl - \
+ | sed 's/\svserver\s*$$/& sys_ni_syscall/' \
+ | sed 's/\snfsservctl\s*$$/& sys_nfsservctl/' \
+ > $@
+
+generated/linux-syscalls-arm.h: $(LINUX_SYSCALL_DIR)/arm.tbl.fixed linux/syscalls.mk
+ mkdir -p -- generated
+ printf '\43define LIST_LINUX_SYSCALLS_FOR_ARM_EABI(X, _X_COMPAT, D)\\\n' > $@
+ cat -- $(LINUX_SYSCALL_DIR)/arm.tbl.fixed \
+ | sed '/^\s*\(\x23.*\)\?$$/d' \
+ | awk '{ print "\tX(" $$1 ", " $$3 ", " $$4 ") D\\" $$2}' \
+ | sed -n 's/\\\(common\|eabi\)$$/\\/p' \
+ | sed '$$s/ D\\$$//' >> $@
+ printf '\n\43define LIST_LINUX_SYSCALLS_FOR_ARM_OABI(X, X_COMPAT, D)\\\n' >> $@
+ cat -- $(LINUX_SYSCALL_DIR)/arm.tbl.fixed \
+ | sed '/^\s*\(\x23.*\)\?$$/d' \
+ | awk '{ print "\tX_COMPAT(" $$1 ", " $$3 ", " $$4 ", " $$5 ") D\\" $$2}' \
+ | sed -n 's/\\\(common\|oabi\)$$/\\/p' \
+ | sed 's/X_COMPAT(\(.*\), ) D\\$$/X(\1) D\\/' \
+ | sed '$$s/ D\\$$//' >> $@
+ test "$$(sed '/^\s*\(\x23.*\)\?$$/d' < $(LINUX_SYSCALL_DIR)/arm.tbl.fixed | awk '{ print $$2 }')" = \
+ "$$(sed '/^\s*\(\x23.*\)\?$$/d' < $(LINUX_SYSCALL_DIR)/arm.tbl.fixed | awk '{ print $$2 }' | \
+ grep '^\(common\|oabi\|eabi\)$$')"
+
+
+generated/linux-syscalls-ia64.h: $(LINUX_SYSCALL_DIR)/ia64.tbl linux/syscalls.mk
+ mkdir -p -- generated
+ printf '\43define LIST_LINUX_SYSCALLS_FOR_IA64(X, _X_COMPAT, D)\\\n' > $@
+ printf '%i common %s %s\n' \
+ $$(( 1120 - 1024 )) old_stat sys_stat \
+ $$(( 1121 - 1024 )) old_lstat sys_lstat \
+ $$(( 1122 - 1024 )) old_fstat sys_fstat \
+ $$(( 1132 - 1024 )) create_module sys_create_module \
+ $$(( 1135 - 1024 )) get_kernel_syms sys_get_kernel_syms \
+ $$(( 1136 - 1024 )) query_module sys_query_module \
+ | cat -- $(LINUX_SYSCALL_DIR)/ia64.tbl - \
+ | sed '/^\s*\(\x23.*\)\?$$/d' \
+ | awk '{ print "\tX((" $$1 " + 1024), " $$3 ", " $$4 ") D\\"}' \
+ | sed '$$s/ D\\$$//' >> $@
+ test "$$(sed '/^\s*\(\x23.*\)\?$$/d' < $(LINUX_SYSCALL_DIR)/ia64.tbl | awk '{ print $$2 }')" = \
+ "$$(sed '/^\s*\(\x23.*\)\?$$/d' < $(LINUX_SYSCALL_DIR)/ia64.tbl | awk '{ print $$2 }' | grep '^common$$')"
+
+
+generated/linux-syscalls-m68k.h: $(LINUX_SYSCALL_DIR)/m68k.tbl linux/syscalls.mk
+ mkdir -p -- generated
+ printf '\43define LIST_LINUX_SYSCALLS_FOR_M68K(X, _X_COMPAT, D)\\\n' > $@
+ printf '%i common %s %s\n' \
+ 17 break sys_ni_syscall \
+ 31 stty sys_ni_syscall \
+ 32 gtty sys_ni_syscall \
+ 35 ftime sys_ni_syscall \
+ 44 prof sys_ni_syscall \
+ 53 lock sys_ni_syscall \
+ 56 mpx sys_ni_syscall \
+ 58 ulimit sys_ni_syscall \
+ 59 oldolduname sys_olduname \
+ 98 profil sys_ni_syscall \
+ 101 ioperm sys_ioperm \
+ 109 olduname sys_uname \
+ 110 iopl sys_iopl \
+ 112 idle sys_idle \
+ 113 vm86 sys_vm86 \
+ 137 afs_syscall sys_ni_syscall \
+ 278 vserver sys_ni_syscall \
+ | cat -- $(LINUX_SYSCALL_DIR)/m68k.tbl - \
+ | sed '/^\s*\(\x23.*\)\?$$/d' \
+ | awk '{ print "\tX(" $$1 ", " $$3 ", " $$4 ") D\\"}' \
+ | sed '$$s/ D\\$$//' >> $@
+ test "$$(sed '/^\s*\(\x23.*\)\?$$/d' < $(LINUX_SYSCALL_DIR)/m68k.tbl | awk '{ print $$2 }')" = \
+ "$$(sed '/^\s*\(\x23.*\)\?$$/d' < $(LINUX_SYSCALL_DIR)/m68k.tbl | awk '{ print $$2 }' | grep '^common$$')"
+
+
+generated/linux-syscalls-microblaze.h: $(LINUX_SYSCALL_DIR)/microblaze.tbl linux/syscalls.mk
+ mkdir -p -- generated
+ printf '\43define LIST_LINUX_SYSCALLS_FOR_MICROBLAZE(X, _X_COMPAT, D)\\\n' > $@
+ printf '%i common %s %s\n' \
+ 251 set_zone_reclaim sys_set_zone_reclaim \
+ 285 setaltroot sys_setaltroot \
+ | cat -- $(LINUX_SYSCALL_DIR)/microblaze.tbl - \
+ | sed '/^\s*\(\x23.*\)\?$$/d' \
+ | awk '{ print "\tX(" $$1 ", " $$3 ", " $$4 ") D\\"}' \
+ | sed '$$s/ D\\$$//' >> $@
+ test "$$(sed '/^\s*\(\x23.*\)\?$$/d' < $(LINUX_SYSCALL_DIR)/microblaze.tbl | awk '{ print $$2 }')" = \
+ "$$(sed '/^\s*\(\x23.*\)\?$$/d' < $(LINUX_SYSCALL_DIR)/microblaze.tbl | awk '{ print $$2 }' | grep '^common$$')"
+
+
+generated/linux-syscalls-mips-n32.h: $(LINUX_SYSCALL_DIR)/mips-n32.tbl linux/syscalls.mk
+ mkdir -p -- generated
+ printf '\43define LIST_LINUX_SYSCALLS_FOR_MIPS_N32(X, _X_COMPAT, D)\\\n' > $@
+ printf '%i common %s %s\n' \
+ 242 setaltroot sys_setaltroot \
+ | cat -- $(LINUX_SYSCALL_DIR)/mips-n32.tbl - \
+ | sed '/^\s*\(\x23.*\)\?$$/d' \
+ | awk '{ print "\tX(" $$1 ", " $$3 ", " $$4 ") D\\"}' \
+ | sed '$$s/ D\\$$//' >> $@
+ test "$$(sed '/^\s*\(\x23.*\)\?$$/d' < $(LINUX_SYSCALL_DIR)/mips-n32.tbl | awk '{ print $$2 }')" = \
+ "$$(sed '/^\s*\(\x23.*\)\?$$/d' < $(LINUX_SYSCALL_DIR)/mips-n32.tbl | awk '{ print $$2 }' | grep '^n32$$')"
+
+
+generated/linux-syscalls-mips-n64.h: $(LINUX_SYSCALL_DIR)/mips-n64.tbl linux/syscalls.mk
+ mkdir -p -- generated
+ printf '\43define LIST_LINUX_SYSCALLS_FOR_MIPS_N64(X, _X_COMPAT, D)\\\n' > $@
+ printf '%i common %s %s\n' \
+ 238 setaltroot sys_setaltroot \
+ | cat -- $(LINUX_SYSCALL_DIR)/mips-n64.tbl - \
+ | sed '/^\s*\(\x23.*\)\?$$/d' \
+ | awk '{ print "\tX(" $$1 ", " $$3 ", " $$4 ") D\\"}' \
+ | sed '$$s/ D\\$$//' >> $@
+ test "$$(sed '/^\s*\(\x23.*\)\?$$/d' < $(LINUX_SYSCALL_DIR)/mips-n64.tbl | awk '{ print $$2 }')" = \
+ "$$(sed '/^\s*\(\x23.*\)\?$$/d' < $(LINUX_SYSCALL_DIR)/mips-n64.tbl | awk '{ print $$2 }' | \
+ grep '^\(n64\|common\)$$')"
+
+
+generated/linux-syscalls-mips-o32.h: $(LINUX_SYSCALL_DIR)/mips-o32.tbl linux/syscalls.mk
+ mkdir -p -- generated
+ printf '\43define LIST_LINUX_SYSCALLS_FOR_MIPS_O32(X, X_COMPAT, D)\\\n' > $@
+ printf '%i common %s %s\n' \
+ 18 old_stat sys_stat \
+ 28 old_fstat sys_fstat \
+ 82 select sys_old_select \
+ 84 old_lstat sys_lstat \
+ 279 setaltroot sys_setaltroot \
+ | cat -- $(LINUX_SYSCALL_DIR)/mips-o32.tbl - \
+ | sed '/^\s*\(18\|28\|82\|84\)\s\+o32.*$$/d' \
+ | sed '/^\s*\(\x23.*\)\?$$/d' \
+ | awk '{ print "\tX_COMPAT(" $$1 ", " $$3 ", " $$4 ", " $$5 ") D\\"}' \
+ | sed 's/X_COMPAT(\(.*\), ) D\\$$/X(\1) D\\/' \
+ | sed '$$s/ D\\$$//' >> $@
+ test "$$(sed '/^\s*\(\x23.*\)\?$$/d' < $(LINUX_SYSCALL_DIR)/mips-o32.tbl | awk '{ print $$2 }')" = \
+ "$$(sed '/^\s*\(\x23.*\)\?$$/d' < $(LINUX_SYSCALL_DIR)/mips-o32.tbl | awk '{ print $$2 }' | grep '^o32$$')"
+
+
+$(LINUX_SYSCALL_DIR)/parisc.tbl.fixed: $(LINUX_SYSCALL_DIR)/parisc.tbl linux/syscalls.mk
+ printf '%i common %s %s\n' \
+ 102 socketcall sys_socketcall \
+ 127 create_module sys_create_module \
+ 130 get_kernel_syms sys_get_kernel_syms \
+ 137 afs_syscall sys_ni_syscall \
+ 167 query_module sys_query_module \
+ 169 nfsservctl sys_nfsservctl \
+ 196 getpmsg sys_ni_syscall \
+ 197 putpmsg sys_ni_syscall \
+ 203 attrctl sys_attrctl \
+ 204 acl_get sys_acl_get \
+ 205 acl_set sys_acl_set \
+ 213 set_thread_area sys_set_thread_area \
+ 214 get_thread_area sys_get_thread_area \
+ 220 alloc_hugepages sys_alloc_hugepages \
+ 221 free_hugepages sys_free_hugepages \
+ 263 vserver sys_ni_syscall \
+ 303 timerfd sys_timerfd \
+ | cat -- $(LINUX_SYSCALL_DIR)/parisc.tbl - > $@
+
+generated/linux-syscalls-parisc.h: $(LINUX_SYSCALL_DIR)/parisc.tbl.fixed linux/syscalls.mk
+ mkdir -p -- generated
+ printf '\43define LIST_LINUX_SYSCALLS_FOR_PARISC_64(X, _X_COMPAT, D)\\\n' > $@
+ cat -- $(LINUX_SYSCALL_DIR)/parisc.tbl.fixed \
+ | sed '/^\s*\(\x23.*\)\?$$/d' \
+ | awk '{ print "\tX(" $$1 ", " $$3 ", " $$4 ") D\\" $$2}' \
+ | sed -n 's/\\\(common\|64\)$$/\\/p' \
+ | sed '$$s/ D\\$$//' >> $@
+ printf '\n\43define LIST_LINUX_SYSCALLS_FOR_PARISC_32(X, X_COMPAT, D)\\\n' >> $@
+ cat -- $(LINUX_SYSCALL_DIR)/parisc.tbl.fixed \
+ | sed '/^\s*\(\x23.*\)\?$$/d' \
+ | awk '{ print "\tX_COMPAT(" $$1 ", " $$3 ", " $$4 ", " $$5 ") D\\" $$2}' \
+ | sed -n 's/\\\(common\|32\)$$/\\/p' \
+ | sed 's/X_COMPAT(\(.*\), ) D\\$$/X(\1) D\\/' \
+ | sed '$$s/ D\\$$//' >> $@
+ test "$$(sed '/^\s*\(\x23.*\)\?$$/d' < $(LINUX_SYSCALL_DIR)/parisc.tbl.fixed | awk '{ print $$2 }')" = \
+ "$$(sed '/^\s*\(\x23.*\)\?$$/d' < $(LINUX_SYSCALL_DIR)/parisc.tbl.fixed | awk '{ print $$2 }' | \
+ grep '^\(common\|64\|32\)$$')"
+
+
+generated/linux-syscalls-powerpc.h: $(LINUX_SYSCALL_DIR)/powerpc.tbl linux/syscalls.mk
+ mkdir -p -- generated
+ printf '\43define LIST_LINUX_SYSCALLS_FOR_POWERPC_32(X, X_COMPAT, D)\\\n' > $@
+ cat -- $(LINUX_SYSCALL_DIR)/powerpc.tbl \
+ | sed '/^\s*\(\x23.*\)\?$$/d' \
+ | awk '{ print "\tX_COMPAT(" $$1 ", " $$3 ", " $$4 ", " $$5 ") D\\" $$2}' \
+ | sed -n 's/\\\(common\|32\)$$/\\/p' \
+ | sed 's/X_COMPAT(\(.*\), ) D\\$$/X(\1) D\\/' \
+ | sed '$$s/ D\\$$//' >> $@
+ printf '\n\43define LIST_LINUX_SYSCALLS_FOR_POWERPC_NOSPU(X, X_COMPAT, D)\\\n' >> $@
+ cat -- $(LINUX_SYSCALL_DIR)/powerpc.tbl \
+ | sed '/^\s*\(\x23.*\)\?$$/d' \
+ | awk '{ print "\tX_COMPAT(" $$1 ", " $$3 ", " $$4 ", " $$5 ") D\\" $$2}' \
+ | sed -n 's/\\\(common\|nospu\)$$/\\/p' \
+ | sed 's/X_COMPAT(\(.*\), ) D\\$$/X(\1) D\\/' \
+ | sed '$$s/ D\\$$//' >> $@
+ printf '\n\43define LIST_LINUX_SYSCALLS_FOR_POWERPC_64(X, _X_COMPAT, D)\\\n' >> $@
+ cat -- $(LINUX_SYSCALL_DIR)/powerpc.tbl \
+ | sed '/^\s*\(\x23.*\)\?$$/d' \
+ | awk '{ print "\tX(" $$1 ", " $$3 ", " $$4 ") D\\" $$2}' \
+ | sed -n 's/\\\(common\|64\)$$/\\/p' \
+ | sed '$$s/ D\\$$//' >> $@
+ printf '\n\43define LIST_LINUX_SYSCALLS_FOR_POWERPC_SPU(X, _X_COMPAT, D)\\\n' >> $@
+ cat -- $(LINUX_SYSCALL_DIR)/powerpc.tbl \
+ | sed '/^\s*\(\x23.*\)\?$$/d' \
+ | awk '{ print "\tX(" $$1 ", " $$3 ", " $$4 ") D\\" $$2}' \
+ | sed -n 's/\\\(common\|spu\)$$/\\/p' \
+ | sed '$$s/ D\\$$//' >> $@
+ test "$$(sed '/^\s*\(\x23.*\)\?$$/d' < $(LINUX_SYSCALL_DIR)/powerpc.tbl | awk '{ print $$2 }')" = \
+ "$$(sed '/^\s*\(\x23.*\)\?$$/d' < $(LINUX_SYSCALL_DIR)/powerpc.tbl | awk '{ print $$2 }' | \
+ grep '^\(common\|spu\|nospu\|64\|32\)$$')"
+
+
+generated/linux-syscalls-s390.h: $(LINUX_SYSCALL_DIR)/s390.tbl linux/syscalls.mk
+ mkdir -p -- generated
+ printf '\43define LIST_LINUX_SYSCALLS_FOR_S390_32(X, _X_COMPAT, D)\\\n' > $@
+ cat -- $(LINUX_SYSCALL_DIR)/s390.tbl \
+ | sed '/^\s*\(\x23.*\)\?$$/d' \
+ | sed 's/^\s*\([0-9]\+\)\s\+\([A-Za-z0-9_]\+\)\s\+\([A-Za-z0-9_]\+\)\s\+-\s\+-\s*$$/\1 \2 \3 sys_\3 sys_\3/' \
+ | awk '{ print "\tX(" $$1 ", " $$3 ", " $$5 ") D\\" $$2}' \
+ | sed -n 's/\\\(common\|32\)$$/\\/p' \
+ | sed '$$s/ D\\$$//' >> $@
+ printf '\n\43define LIST_LINUX_SYSCALLS_FOR_S390_64(X, _X_COMPAT, D)\\\n' >> $@
+ cat -- $(LINUX_SYSCALL_DIR)/s390.tbl \
+ | sed '/^\s*\(\x23.*\)\?$$/d' \
+ | sed 's/^\s*\([0-9]\+\)\s\+\([A-Za-z0-9_]\+\)\s\+\([A-Za-z0-9_]\+\)\s\+-\s\+-\s*$$/\1 \2 \3 sys_\3 sys_\3/' \
+ | sed 's/^\s*\(89\)\s\+\(common\)\s\+\(readdir\)\s\+-\s\+/\1 \2 \3 sys_old_readdir /' \
+ | awk '{ print "\tX(" $$1 ", " $$3 ", " $$4 ") D\\" $$2}' \
+ | sed -n 's/\\\(common\|64\)$$/\\/p' \
+ | sed '$$s/ D\\$$//' >> $@
+ test "$$(sed '/^\s*\(\x23.*\)\?$$/d' < $(LINUX_SYSCALL_DIR)/s390.tbl | awk '{ print $$2 }')" = \
+ "$$(sed '/^\s*\(\x23.*\)\?$$/d' < $(LINUX_SYSCALL_DIR)/s390.tbl | awk '{ print $$2 }' | \
+ grep '^\(common\|32\|64\)$$')"
+
+
+generated/linux-syscalls-sh.h: $(LINUX_SYSCALL_DIR)/sh.tbl linux/syscalls.mk
+ mkdir -p -- generated
+ printf '\43define LIST_LINUX_SYSCALLS_FOR_SH(X, _X_COMPAT, D)\\\n' > $@
+ printf '%i common %s %s\n' \
+ 17 break sys_ni_syscall \
+ 31 stty sys_ni_syscall \
+ 32 gtty sys_ni_syscall \
+ 35 ftime sys_ni_syscall \
+ 44 prof sys_ni_syscall \
+ 53 lock sys_ni_syscall \
+ 56 mpx sys_ni_syscall \
+ 58 ulimit sys_ni_syscall \
+ 59 oldolduname sys_olduname \
+ 82 select sys_old_select \
+ 98 profil sys_ni_syscall \
+ 101 ioperm sys_ioperm \
+ 110 iopl sys_iopl \
+ 112 idle sys_idle \
+ 113 vm86old sys_vm86old \
+ 127 create_module sys_create_module \
+ 130 get_kernel_syms sys_get_kernel_syms \
+ 137 afs_syscall sys_ni_syscall \
+ 166 vm86 sys_vm86 \
+ 167 query_module sys_query_module \
+ | cat -- $(LINUX_SYSCALL_DIR)/sh.tbl - \
+ | sed '/^\s*\(\x23.*\)\?$$/d' \
+ | awk '{ print "\tX(" $$1 ", " $$3 ", " $$4 ") D\\"}' \
+ | sed '$$s/ D\\$$//' >> $@
+ test "$$(sed '/^\s*\(\x23.*\)\?$$/d' < $(LINUX_SYSCALL_DIR)/sh.tbl | awk '{ print $$2 }')" = \
+ "$$(sed '/^\s*\(\x23.*\)\?$$/d' < $(LINUX_SYSCALL_DIR)/sh.tbl | awk '{ print $$2 }' | grep '^common$$')"
+
+
+generated/linux-syscalls-sparc.h: $(LINUX_SYSCALL_DIR)/sparc.tbl linux/syscalls.mk
+ mkdir -p -- generated
+ printf '\43define LIST_LINUX_SYSCALLS_FOR_SPARC_32(X, X_COMPAT, D)\\\n' > $@
+ printf '%i common %s %s\n' \
+ 267 vserver sys_vserver \
+ | cat -- $(LINUX_SYSCALL_DIR)/sparc.tbl - \
+ | sed 's/compat_sys_\(truncate64\|ftruncate64\)/sparc___&/g' \
+ | sed '/^\s*267\s\+common\s\+vserver\s\+.*$$/d' \
+ | sed '/^\s*\(\x23.*\)\?$$/d' \
+ | awk '{ print "\tX_COMPAT(" $$1 ", " $$3 ", " $$4 ", " $$5 ") D\\" $$2}' \
+ | sed -n 's/\\\(common\|32\)$$/\\/p' \
+ | sed 's/X_COMPAT(\(.*\), ) D\\$$/X(\1) D\\/' \
+ | sed '$$s/ D\\$$//' >> $@
+ printf '\n\43define LIST_LINUX_SYSCALLS_FOR_SPARC_64(X, _X_COMPAT, D)\\\n' >> $@
+ printf '%i common %s %s\n' \
+ 267 vserver sys_vserver \
+ | cat -- $(LINUX_SYSCALL_DIR)/sparc.tbl - \
+ | sed '/^\s*267\s\+common\s\+vserver\s\+.*$$/d' \
+ | sed '/^\s*\(\x23.*\)\?$$/d' \
+ | awk '{ print "\tX(" $$1 ", " $$3 ", " $$4 ") D\\" $$2}' \
+ | sed -n 's/\\\(common\|64\)$$/\\/p' \
+ | sed '$$s/ D\\$$//' >> $@
+ test "$$(sed '/^\s*\(\x23.*\)\?$$/d' < $(LINUX_SYSCALL_DIR)/sparc.tbl | awk '{ print $$2 }')" = \
+ "$$(sed '/^\s*\(\x23.*\)\?$$/d' < $(LINUX_SYSCALL_DIR)/sparc.tbl | awk '{ print $$2 }' | \
+ grep '^\(common\|32\|64\)$$')"
+
+
+generated/linux-syscalls-x86.h: $(LINUX_SYSCALL_DIR)/x86.tbl linux/syscalls.mk
+ mkdir -p -- generated
+ printf '\43define LIST_LINUX_SYSCALLS_FOR_I386(X, X_COMPAT, D)\\\n' > $@
+ printf '%i common %s %s\n' \
+ 251 set_zone_reclaim sys_set_zone_reclaim \
+ 285 setaltroot sys_setaltroot \
+ | cat -- $(LINUX_SYSCALL_DIR)/x86.tbl - \
+ | sed 's/\s\+\(break\|stty\|gtty\|ftime\|prof\|lock\|mpx\|ulimit\|profil\|idle\|afs_syscall\|getpmsg\|putpmsg\|vserver\)\s*$$/& sys_ni_syscall/' \
+ | sed 's/^\s*[0-9]\+\s\+[a-z0-9]\+\s\+\([A-Za-z0-9_]\+\)\s*$$/& sys_\1/' \
+ | sed '/^\s*\(\x23.*\)\?$$/d' \
+ | awk '{ print "\tX_COMPAT(" $$1 ", " $$3 ", " $$4 ", " $$5 ") D\\"}' \
+ | sed 's/X_COMPAT(\(.*\), ) D\\$$/X(\1) D\\/' \
+ | sed '$$s/ D\\$$//' >> $@
+ test "$$(sed '/^\s*\(\x23.*\)\?$$/d' < $(LINUX_SYSCALL_DIR)/x86.tbl | awk '{ print $$2 }')" = \
+ "$$(sed '/^\s*\(\x23.*\)\?$$/d' < $(LINUX_SYSCALL_DIR)/x86.tbl | awk '{ print $$2 }' | grep '^i386$$')"
+
+
+generated/linux-syscalls-xtensa.h: $(LINUX_SYSCALL_DIR)/xtensa.tbl linux/syscalls.mk
+ mkdir -p -- generated
+ printf '\43define LIST_LINUX_SYSCALLS_FOR_XTENSA(X, _X_COMPAT, D)\\\n' > $@
+ printf '%i common %s %s\n' \
+ 305 timerfd sys_timerfd \
+ | cat -- $(LINUX_SYSCALL_DIR)/xtensa.tbl - \
+ | sed 's/reserved152\s\+sys_ni_syscall/set_thread_area sys_set_thread_area/' \
+ | sed 's/reserved153\s\+sys_ni_syscall/get_thread_area sys_get_thread_area/' \
+ | sed 's/nfsservctl\s\+sys_ni_syscall/nfsservctl sys_nfsservctl/' \
+ | sed '/^\s*\(\x23.*\)\?$$/d' \
+ | awk '{ print "\tX(" $$1 ", " $$3 ", " $$4 ") D\\"}' \
+ | sed '$$s/ D\\$$//' >> $@
+ test "$$(sed '/^\s*\(\x23.*\)\?$$/d' < $(LINUX_SYSCALL_DIR)/xtensa.tbl | awk '{ print $$2 }')" = \
+ "$$(sed '/^\s*\(\x23.*\)\?$$/d' < $(LINUX_SYSCALL_DIR)/xtensa.tbl | awk '{ print $$2 }' | grep '^common$$')"
+
+
+$(LINUX_SYSCALLS_ARCH_TBL_SIMPLE): $(LINUX_SOURCE) linux/syscalls.mk
+ mkdir -p -- $(LINUX_SYSCALL_DIR)
+ arch="$$(printf '%s\n' "$(@F)" | cut -d . -f 1)"; \
+ if test "$$arch" = arm; then \
+ printf '%s\n' "ln -sf -- ../tools $(LINUX_DIR)/arch/$$arch/kernel/syscalls" && \
+ ln -sf -- ../tools $(LINUX_DIR)/arch/$$arch/kernel/syscalls || exit 1; \
+ fi && \
+ printf '%s\n' "cp -- $(LINUX_DIR)/arch/$$arch/kernel/syscalls/syscall.tbl $@" && \
+ cp -- $(LINUX_DIR)/arch/$$arch/kernel/syscalls/syscall.tbl $@
+
+$(LINUX_SYSCALLS_ARCH_TBL_SPLIT_X64): $(LINUX_SOURCE) linux/syscalls.mk
+ mkdir -p -- $(LINUX_SYSCALL_DIR)
+ test -e $(LINUX_DIR)/arch/x86/kernel/syscalls || \
+ ln -sf -- ../entry/syscalls $(LINUX_DIR)/arch/x86/kernel/syscalls
+ cp -- $(LINUX_DIR)/arch/x86/kernel/syscalls/syscall_32.tbl $(LINUX_SYSCALL_DIR)/x86.tbl
+ cp -- $(LINUX_DIR)/arch/x86/kernel/syscalls/syscall_64.tbl $(LINUX_SYSCALL_DIR)/amd64.tbl
+
+$(LINUX_SYSCALLS_ARCH_TBL_SPLIT_MIPS): $(LINUX_SOURCE) linux/syscalls.mk
+ mkdir -p -- $(LINUX_SYSCALL_DIR)
+ cp -- $(LINUX_DIR)/arch/mips/kernel/syscalls/syscall_n32.tbl $(LINUX_SYSCALL_DIR)/mips-n32.tbl
+ cp -- $(LINUX_DIR)/arch/mips/kernel/syscalls/syscall_o32.tbl $(LINUX_SYSCALL_DIR)/mips-o32.tbl
+ cp -- $(LINUX_DIR)/arch/mips/kernel/syscalls/syscall_n64.tbl $(LINUX_SYSCALL_DIR)/mips-n64.tbl
+
+
+generated/linux-syscall-dedup.h: $(HDR) $(LINUX_SYSCALLS_HDR) linux/syscalls.h linux/syscall-table.c linux/syscalls.mk
+ mkdir -p -- generated
+ cpp -DCREATING_DEDUP_TABLE linux/syscall-table.c \
+ | grep -v '^#' \
+ | tr '\n;\t' ' \n ' \
+ | sed -n 's/^.* libsyscalls_syscall \+\(linux_[A-Z0-9a-z_]\+_syscall_[A-Z0-9a-z_]\+.*\)$$/\1/p' \
+ | tr -d ' ' \
+ | sed 's/=/ /' \
+ | sort -k 2 \
+ | (set -e; master=; mastertext=; \
+ while read slave slavetext; do \
+ if test "$$slavetext" = "$$mastertext"; then \
+ printf '#define %s %s\n' "$$slave" "$$master"; \
+ else \
+ master="$$slave"; \
+ mastertext="$$slavetext"; \
+ fi; \
+ done \
+ ) > $@
diff --git a/linux/types.c b/linux/types.c
new file mode 100644
index 0000000..fee69fe
--- /dev/null
+++ b/linux/types.c
@@ -0,0 +1,54 @@
+/* See LICENSE file for copyright and license details. */
+
+/* This file is included from ../libsyscalls_get_datatype_description.c */
+
+
+/* If new architectures are added, the table at the top of
+ * ../libsyscalls_get_datatype_description.c must be updated */
+
+
+static enum libsyscalls_error
+get_linux_datatype_description(enum libsyscalls_arch arch, enum libsyscalls_datatype *datatype,
+ struct libsyscalls_datatype_description *description_out,
+ int *divide_array_size_with_type_size_out)
+{
+ /*
+ * Generally Linux has char as 8 bit, short int as 16, int as 32 bit,
+ * and long long int as 64 bit (it's code even make such assumptions),
+ * however that's is not necessarily the case for more exotic
+ * architectures, for example, some specialised processors have 16 bit
+ * chars and run Linux (although not mainline). Linux also used
+ * long int for addresses (intptr_t), which is normally how it should
+ * be done but Windows always set long int to 32 bit (at least on x86/amd64)
+ * for backwards compatibility, and of course it cannot be assumed that
+ * Linux does something similar this for some architecture in the future
+ * (although that looks very unlikely, at least 32+-bit architecture,
+ * it is of course possible that if Linux is ported to a 16-bit architecture,
+ * intptr_t would be 16 bits, and thus long int must be something else
+ * as it must be at least 32 bits). It's probably safe to assume,
+ * system calls use intptr_t/uintptr_t.
+ */
+
+ switch ((int)*datatype) {
+ case LIBSYSCALLS_TYPE_SCHAR: description_out->width_in_bits = 8; break;
+ case LIBSYSCALLS_TYPE_SHORT: description_out->width_in_bits = 16; break;
+ case LIBSYSCALLS_TYPE_INT: description_out->width_in_bits = 32; break;
+ case LIBSYSCALLS_TYPE_LLONG: description_out->width_in_bits = 64; break;
+
+ case LIBSYSCALLS_TYPE_LONG:
+ case LIBSYSCALLS_TYPE_DYNAMIC: /* syscall */
+ *datatype = LIBSYSCALLS_TYPE_INTPTR;
+ break;
+
+ case LIBSYSCALLS_TYPE_FD_SET:
+ *datatype = LIBSYSCALLS_TYPE_INTPTR;
+ description_out->array_size = 1024;
+ *divide_array_size_with_type_size_out = 1;
+ break;
+
+ default:
+ /* something only defined on some other operating system */
+ return LIBSYSCALLS_E_NOSUCHTYPE;
+ }
+ return LIBSYSCALLS_E_OK;
+}
diff --git a/linux/types.mk b/linux/types.mk
new file mode 100644
index 0000000..0e27c13
--- /dev/null
+++ b/linux/types.mk
@@ -0,0 +1,2 @@
+libsyscalls_get_datatype_description.o: linux/types.c
+libsyscalls_get_datatype_description.lo: linux/types.c
diff --git a/linux/what-architecture-am-i-using b/linux/what-architecture-am-i-using
new file mode 100755
index 0000000..1c7a9ba
--- /dev/null
+++ b/linux/what-architecture-am-i-using
@@ -0,0 +1,26 @@
+#!/bin/sh
+
+set -e
+
+# TODO complete this list
+
+if uname -s | grep -i linux > /dev/null; then
+ arch="$(uname -m)"
+ if test "$arch" = x86_64; then
+ printf '%s\n' AMD64
+ if test $# = 0 || "$@"; then
+ if test $# = 0 || gunzip < /proc/config.gz | grep '^CONFIG_X86_X32_ABI=y$' > /dev/null; then
+ printf '%s\n' AMD64_X32
+ fi
+ if test $# = 0 || gunzip < /proc/config.gz | grep '^CONFIG_X86=y$' > /dev/null; then
+ printf '%s\n' I386
+ fi
+ fi
+ elif test "$arch" = i686 || test "$arch" = i386; then
+ printf '%s\n' I386
+ else
+ exit 1
+ fi
+else
+ exit 2
+fi
diff --git a/linux/yes.mk b/linux/yes.mk
new file mode 120000
index 0000000..7b78b0b
--- /dev/null
+++ b/linux/yes.mk
@@ -0,0 +1 @@
+linux-support.mk \ No newline at end of file