kernel: allow system call with 64-bit return val
This is subject to the constraint that such system calls must have a
return value which is "u64_t" or "s64_t".
So far all the relevant kernel calls just have zero or one arguments,
we can later add more _syscall_ret64_invokeN() APIs as needed.
Signed-off-by: Andrew Boie <andrew.p.boie@intel.com>
diff --git a/scripts/gen_syscall_header.py b/scripts/gen_syscall_header.py
index bb374e4..ecde6b4 100755
--- a/scripts/gen_syscall_header.py
+++ b/scripts/gen_syscall_header.py
@@ -5,11 +5,23 @@
# SPDX-License-Identifier: Apache-2.0
import sys
+from enum import Enum
+
+class Retval(Enum):
+ VOID = 0
+ U32 = 1
+ U64 = 2
def gen_macro(ret, argc):
- sys.stdout.write("K_SYSCALL_DECLARE%d%s(id, name" % (argc,
- ("" if ret else "_VOID")))
- if (ret):
+ if ret == Retval.VOID:
+ suffix = "_VOID"
+ elif ret == Retval.U64:
+ suffix = "_RET64"
+ else:
+ suffix = ""
+
+ sys.stdout.write("K_SYSCALL_DECLARE%d%s(id, name" % (argc, suffix))
+ if (ret != Retval.VOID):
sys.stdout.write(", ret")
for i in range(argc):
sys.stdout.write(", t%d, p%d" % (i, i))
@@ -18,7 +30,7 @@
def gen_fn(ret, argc, name, extern=False):
sys.stdout.write("\t%s %s %s(" %
(("extern" if extern else "static inline"),
- ("ret" if ret else "void"), name))
+ ("ret" if ret != Retval.VOID else "void"), name))
if argc == 0:
sys.stdout.write("void");
else:
@@ -29,17 +41,18 @@
sys.stdout.write(")")
def gen_make_syscall(ret, argc):
- if (ret):
+ if (ret != Retval.VOID):
sys.stdout.write("return (ret)")
- if (argc <= 6):
+ if (argc <= 6 and ret != Retval.U64):
sys.stdout.write("_arch")
- sys.stdout.write("_syscall_invoke%d(" % (argc))
+ sys.stdout.write("_syscall%s_invoke%d(" %
+ (("_ret64" if ret == Retval.U64 else ""), argc))
for i in range(argc):
sys.stdout.write("(u32_t)p%d, " % (i))
sys.stdout.write("id); \\\n")
def gen_call_impl(ret, argc):
- if (ret):
+ if (ret != Retval.VOID):
sys.stdout.write("return ")
sys.stdout.write("_impl_##name(")
for i in range(argc):
@@ -89,9 +102,11 @@
sys.stdout.write("\t}\n\n")
+
def gen_defines(argc, kernel_only=False, user_only=False):
- gen_defines_inner(False, argc, kernel_only, user_only)
- gen_defines_inner(True, argc, kernel_only, user_only)
+ gen_defines_inner(Retval.VOID, argc, kernel_only, user_only)
+ gen_defines_inner(Retval.U32, argc, kernel_only, user_only)
+ gen_defines_inner(Retval.U64, argc, kernel_only, user_only)
sys.stdout.write("/* Auto-generated by gen_syscall_header.py, do not edit! */\n\n")