From 8e276c64c9394d0964506bd6eaa7d4e0547d1ead Mon Sep 17 00:00:00 2001 From: dzwdz Date: Mon, 2 May 2022 21:47:11 +0200 Subject: meta: write a script to generate `src/init/syscalls.c` --- tools/syscall_wrappers.awk | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 tools/syscall_wrappers.awk (limited to 'tools') diff --git a/tools/syscall_wrappers.awk b/tools/syscall_wrappers.awk new file mode 100644 index 0000000..c1f980e --- /dev/null +++ b/tools/syscall_wrappers.awk @@ -0,0 +1,44 @@ +BEGIN { + print "\ +/* generated by tools/syscall_wrappers.awk\n\ + * don't modify manually, instead run:\n\ + * make src/init/syscalls.c\n\ + */\n\ +#include \n\ +\n"; +} + +/_syscall\(/ { next; } # skipping _syscall(), it's implemented elsewhere + +/\);/ { + sub(/;/, " {"); + print $0; + + name = substr($0, match($0, /_syscall_[^(]+/), RLENGTH); + params = substr($0, match($0, /\(.+\)/) + 1, RLENGTH - 2); + if (params == "void") params = "" + + split(params, p, /,/); + for (i = 0; i <= 4; i += 1) { + if (p[i]) { + # p[i] is a parameter, convert it into an expression to pass to _syscall() + sub(/^ */, "", p[i]); # strip + split(p[i], words, / /); + if (length(words) != 1) { + var = words[length(words)]; + sub(/\*/, "", var); + if (words[1] != "int") var = "(int)" var; + } + p[i] = var; + } else { + p[i] = 0; + } + } + + printf "\t"; + if (!index($0, "_Noreturn")) printf "return "; + printf "_syscall(%s, %s, %s, %s, %s);\n", toupper(name), p[1], p[2], p[3], p[4]; + if (index($0, "_Noreturn")) print "\t__builtin_unreachable();"; + + print "}\n"; +} -- cgit v1.2.3