xref: /freebsd/sys/tools/syscalls/scripts/libsys_h.lua (revision bbc0f33b1317bb922ff3d960216ce7b4af88b8af)
19ded074eSagge3#!/usr/libexec/flua
29ded074eSagge3--
39ded074eSagge3-- SPDX-License-Identifier: BSD-2-Clause
49ded074eSagge3--
59ded074eSagge3-- Copyright (c) 2024 SRI International
69ded074eSagge3-- Copyright (c) 2024 Tyler Baxter <agge@FreeBSD.org>
79ded074eSagge3-- Copyright (c) 2023 Warner Losh <imp@bsdimp.com>
89ded074eSagge3-- Copyright (c) 2019 Kyle Evans <kevans@FreeBSD.org>
99ded074eSagge3--
109ded074eSagge3
119ded074eSagge3-- Setup to be a module, or ran as its own script.
129ded074eSagge3local libsys_h = {}
139ded074eSagge3local script = not pcall(debug.getlocal, 4, 1)	-- TRUE if script.
149ded074eSagge3if script then
159ded074eSagge3	-- Add library root to the package path.
169ded074eSagge3	local path = arg[0]:gsub("/[^/]+.lua$", "")
179ded074eSagge3	package.path = package.path .. ";" .. path .. "/../?.lua"
189ded074eSagge3end
199ded074eSagge3
209ded074eSagge3local FreeBSDSyscall = require("core.freebsd-syscall")
219ded074eSagge3local generator = require("tools.generator")
229ded074eSagge3local util = require("tools.util")
239ded074eSagge3
249ded074eSagge3-- File has not been decided yet; config will decide file.  Default defined as
259ded074eSagge3-- /dev/null.
269ded074eSagge3libsys_h.file = "/dev/null"
279ded074eSagge3
289ded074eSagge3function libsys_h.generate(tbl, config, fh)
299ded074eSagge3	-- Grab the master system calls table.
309ded074eSagge3	local s = tbl.syscalls
319ded074eSagge3
329ded074eSagge3	local print_decl = function (sc)
339ded074eSagge3		return sc:native() and not sc.type.NODEF and
34*bbc0f33bSBrooks Davis		    not sc.type.NOLIB and not sc.type.SYSMUX
359ded074eSagge3	end
369ded074eSagge3
379ded074eSagge3	-- Bind the generator to the parameter file.
389ded074eSagge3	local gen = generator:new({}, fh)
399ded074eSagge3
409ded074eSagge3	-- Write the generated preamble.
419ded074eSagge3	gen:preamble("Public system call stubs provided by libsys.\n" ..
429ded074eSagge3	    "\n" ..
439ded074eSagge3	    "Do not use directly, include <libsys.h> instead.")
449ded074eSagge3
459ded074eSagge3	gen:write(string.format([[
469ded074eSagge3#ifndef __LIBSYS_H_
479ded074eSagge3#define __LIBSYS_H_
489ded074eSagge3
499ded074eSagge3#include <sys/_cpuset.h>
509ded074eSagge3#include <sys/_domainset.h>
519ded074eSagge3#include <sys/_ffcounter.h>
529ded074eSagge3#include <sys/_semaphore.h>
539ded074eSagge3#include <sys/_sigaltstack.h>
549ded074eSagge3#include <machine/ucontext.h>   /* for mcontext_t */
559ded074eSagge3#include <sys/_ucontext.h>
569ded074eSagge3#include <sys/wait.h>
579ded074eSagge3
589ded074eSagge3]]))
599ded074eSagge3
609ded074eSagge3	for name, _ in util.pairsByKeys(tbl.structs) do
619ded074eSagge3		gen:write(string.format("struct %s;\n", name))
629ded074eSagge3	end
639ded074eSagge3	gen:write("union semun;\n")
649ded074eSagge3
659ded074eSagge3	gen:write("\n__BEGIN_DECLS\n")
669ded074eSagge3
679ded074eSagge3	for _, v in pairs(s) do
689ded074eSagge3		if print_decl(v) then
699ded074eSagge3			gen:write(string.format(
709ded074eSagge3			    "typedef %s (__sys_%s_t)(%s);\n",
719ded074eSagge3			    v.ret, v.name, v.argstr_type))
729ded074eSagge3		end
739ded074eSagge3	end
749ded074eSagge3
759ded074eSagge3	gen:write("\n")
769ded074eSagge3
779ded074eSagge3	for _, v in pairs(s) do
789ded074eSagge3		if print_decl(v) then
799ded074eSagge3			gen:write(string.format("%s __sys_%s(%s);\n",
809ded074eSagge3			    v.ret, v.name, v.argstr_type_var))
819ded074eSagge3		end
829ded074eSagge3	end
839ded074eSagge3
849ded074eSagge3	gen:write("__END_DECLS\n")
859ded074eSagge3	-- End
869ded074eSagge3	gen:write("\n#endif /* __LIBSYS_H_ */\n")
879ded074eSagge3end
889ded074eSagge3
899ded074eSagge3-- Entry of script:
909ded074eSagge3if script then
919ded074eSagge3	local config = require("config")
929ded074eSagge3
939ded074eSagge3	if #arg < 1 or #arg > 2 then
949ded074eSagge3		error("usage: " .. arg[0] .. " syscall.master")
959ded074eSagge3	end
969ded074eSagge3
979ded074eSagge3	local sysfile, configfile = arg[1], arg[2]
989ded074eSagge3
999ded074eSagge3	config.merge(configfile)
1009ded074eSagge3	config.mergeCompat()
1019ded074eSagge3
1029ded074eSagge3	-- The parsed syscall table.
1039ded074eSagge3	local tbl = FreeBSDSyscall:new{sysfile = sysfile, config = config}
1049ded074eSagge3
1059ded074eSagge3	libsys_h.file = config.libsys_h	-- change file here
1069ded074eSagge3	libsys_h.generate(tbl, config, libsys_h.file)
1079ded074eSagge3end
1089ded074eSagge3
1099ded074eSagge3-- Return the module.
1109ded074eSagge3return libsys_h
111