diff --git a/sys/kern/syscalls.master b/sys/kern/syscalls.master --- a/sys/kern/syscalls.master +++ b/sys/kern/syscalls.master @@ -51,6 +51,7 @@ ; SYSMUX syscall multiplexer. No prototype, argument struct, or ; handler is declared or used. Handled in MD syscall code. ; CAPENABLED syscall is allowed in capability mode +; NORETURN the syscall does not return ; ; To support programmatic generation of both the default ABI and 32-bit compat ; (freebsd32) we impose a number of restrictions on the types of system calls. diff --git a/sys/tools/syscalls/core/syscall.lua b/sys/tools/syscalls/core/syscall.lua --- a/sys/tools/syscalls/core/syscall.lua +++ b/sys/tools/syscalls/core/syscall.lua @@ -28,6 +28,7 @@ -- flags beyond this point are modifiers "CAPENABLED", "NOLIB", + "NORETURN", "NOTSTATIC", "SYSMUX", } diff --git a/sys/tools/syscalls/scripts/libsys_h.lua b/sys/tools/syscalls/scripts/libsys_h.lua --- a/sys/tools/syscalls/scripts/libsys_h.lua +++ b/sys/tools/syscalls/scripts/libsys_h.lua @@ -76,8 +76,12 @@ for _, v in pairs(s) do if print_decl(v) then - gen:write(string.format("%s __sys_%s(%s);\n", - v.ret, v.name, v.argstr_type_var)) + local ret_attr = ""; + if v.type.NORETURN then + ret_attr = "_Noreturn " + end + gen:write(string.format("%s%s __sys_%s(%s);\n", + ret_attr, v.ret, v.name, v.argstr_type_var)) end end