Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 16 Apr 2024 16:48:20 GMT
From:      Brooks Davis <brooks@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: 79b758e32775 - main - makesyscalls: generate core libsys header
Message-ID:  <202404161648.43GGmKYG079932@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by brooks:

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

commit 79b758e327757dc015fb26a122fdc9608c405e9e
Author:     Brooks Davis <brooks@FreeBSD.org>
AuthorDate: 2024-04-16 16:48:07 +0000
Commit:     Brooks Davis <brooks@FreeBSD.org>
CommitDate: 2024-04-16 16:48:07 +0000

    makesyscalls: generate core libsys header
    
    Create a header covering most of the "stable" libsys interfaces.
    Specifically __sys_<foo> syscall stubs and __sys_<foo>_t typedefs for
    those interfaces.
    
    Reviewed by:    kib
    Differential Revision:  https://reviews.freebsd.org/D44386
---
 sys/tools/makesyscalls.lua | 91 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 91 insertions(+)

diff --git a/sys/tools/makesyscalls.lua b/sys/tools/makesyscalls.lua
index 624b84a32eb1..a87c8c421313 100644
--- a/sys/tools/makesyscalls.lua
+++ b/sys/tools/makesyscalls.lua
@@ -35,6 +35,7 @@ local unistd = require("posix.unistd")
 
 local savesyscall = -1
 local maxsyscall = -1
+local structs = {}
 local generated_tag = "@" .. "generated"
 
 -- Default configuration; any of these may get replaced by a configuration file
@@ -43,6 +44,7 @@ local config = {
 	os_id_keyword = "FreeBSD",		-- obsolete, ignored on input, not generated
 	abi_func_prefix = "",
 	libsysmap = "/dev/null",
+	libsys_h = "/dev/null",
 	sysnames = "syscalls.c",
 	sysproto = "../sys/sysproto.h",
 	sysproto_h = "_SYS_SYSPROTO_H_",
@@ -87,6 +89,7 @@ local output_files = {
 	"syshdr",
 	"sysmk",
 	"libsysmap",
+	"libsys_h",
 	"syssw",
 	"systrace",
 	"sysproto",
@@ -94,6 +97,8 @@ local output_files = {
 
 -- These ones we'll create temporary files for; generation purposes.
 local temp_files = {
+	"libsys_h_type",
+	"libsys_h_func",
 	"sysaue",
 	"sysdcl",
 	"syscompat",
@@ -934,6 +939,47 @@ local function handle_noncompat(sysnum, thr_flag, flags, sysflags, rettype,
 		end
 		write_line("libsysmap", string.format("\t__sys_%s;\n",
 		    funcalias))
+
+		if flags & known_flags.SYSMUX == 0 then
+			local argstr_type = ""
+			local argstr_var = ""
+			local comma = ""
+			if #funcargs == 0 then
+				argstr_type = "void"
+				argstr_var = "void"
+			end
+			for _, v in ipairs(funcargs) do
+				local argname, argtype = v.name, v.type
+				argstr_type = argstr_type .. comma .. argtype
+				argstr_var = argstr_var .. comma .. argtype .. " " .. argname
+				comma = ", "
+
+				-- Accumulate a list of struct types for
+				-- forward decls.  We can't do this in
+				-- process_args because we don't want compat
+				-- types in userspace even as no-op.
+				if isptrtype(argtype) then
+					local is_struct = false
+					for word in argtype:gmatch("[^ *]+") do
+						if is_struct then
+							structs[word] = word
+							break
+						end
+						if word == "struct" then
+							is_struct = true
+							-- next word is the name
+						end
+					end
+				end
+			end
+			write_line("libsys_h_type",
+			    string.format("typedef %s (__sys_%s_t)(%s);\n",
+			    syscallret, funcalias, argstr_type))
+			write_line("libsys_h_func",
+			    string.format("%s __sys_%s(%s);\n",
+			    syscallret, funcalias, argstr_var))
+
+		end
 	end
 end
 
@@ -1330,6 +1376,20 @@ process_syscall_def = function(line)
 	end
 end
 
+local function pairsByKeys (t, f)
+	local a = {}
+	for n in pairs(t) do table.insert(a, n) end
+	table.sort(a, f)
+	local i = 0      -- iterator variable
+	local iter = function ()   -- iterator function
+		i = i + 1
+		if a[i] == nil then return nil
+		else return a[i], t[a[i]]
+		end
+	end
+	return iter
+end
+
 -- Entry point
 
 if #arg < 1 or #arg > 2 then
@@ -1504,6 +1564,27 @@ write_line("libsysmap", string.format([[/*
 FBSDprivate_1.0 {
 ]], generated_tag))
 
+write_line("libsys_h", string.format([[/*
+ * Public system call stubs provided by libsys.
+ *
+ * Do not use directly, include <libsys.h> instead.
+ *
+ *  DO NOT EDIT-- this file is automatically %s.
+ */
+#ifndef __LIBSYS_H_
+#define __LIBSYS_H_
+
+#include <sys/_cpuset.h>
+#include <sys/_domainset.h>
+#include <sys/_ffcounter.h>
+#include <sys/_semaphore.h>
+#include <sys/_sigaltstack.h>
+#include <machine/ucontext.h>   /* for mcontext_t */
+#include <sys/_ucontext.h>
+#include <sys/wait.h>
+
+]], generated_tag))
+
 write_line("systrace", string.format([[/*
  * System call argument to DTrace register array converstion.
  *
@@ -1600,6 +1681,16 @@ write_line("systraceret", [[
 ]])
 
 -- Finish up; output
+table.sort(structs)
+for name,_ in pairsByKeys(structs) do
+	write_line("libsys_h", string.format("struct %s;\n", name))
+end
+write_line("libsys_h", "union semun;\n\n__BEGIN_DECLS\n")
+write_line("libsys_h", read_file("libsys_h_type"))
+write_line("libsys_h", "\n")
+write_line("libsys_h", read_file("libsys_h_func"))
+write_line("libsys_h", "__END_DECLS\n\n#endif /* __LIBSYS_H_ */\n")
+
 write_line("syssw", read_file("sysinc"))
 write_line("syssw", read_file("sysent"))
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202404161648.43GGmKYG079932>