xref: /freebsd/sys/tools/syscalls/scripts/libsys_h.lua (revision 9ded074e875c29cb92d5f643801990d7bb23cca4)
1*9ded074eSagge3#!/usr/libexec/flua
2*9ded074eSagge3--
3*9ded074eSagge3-- SPDX-License-Identifier: BSD-2-Clause
4*9ded074eSagge3--
5*9ded074eSagge3-- Copyright (c) 2024 SRI International
6*9ded074eSagge3-- Copyright (c) 2024 Tyler Baxter <agge@FreeBSD.org>
7*9ded074eSagge3-- Copyright (c) 2023 Warner Losh <imp@bsdimp.com>
8*9ded074eSagge3-- Copyright (c) 2019 Kyle Evans <kevans@FreeBSD.org>
9*9ded074eSagge3--
10*9ded074eSagge3
11*9ded074eSagge3-- Setup to be a module, or ran as its own script.
12*9ded074eSagge3local libsys_h = {}
13*9ded074eSagge3local script = not pcall(debug.getlocal, 4, 1)	-- TRUE if script.
14*9ded074eSagge3if script then
15*9ded074eSagge3	-- Add library root to the package path.
16*9ded074eSagge3	local path = arg[0]:gsub("/[^/]+.lua$", "")
17*9ded074eSagge3	package.path = package.path .. ";" .. path .. "/../?.lua"
18*9ded074eSagge3end
19*9ded074eSagge3
20*9ded074eSagge3local FreeBSDSyscall = require("core.freebsd-syscall")
21*9ded074eSagge3local generator = require("tools.generator")
22*9ded074eSagge3local util = require("tools.util")
23*9ded074eSagge3
24*9ded074eSagge3-- File has not been decided yet; config will decide file.  Default defined as
25*9ded074eSagge3-- /dev/null.
26*9ded074eSagge3libsys_h.file = "/dev/null"
27*9ded074eSagge3
28*9ded074eSagge3function libsys_h.generate(tbl, config, fh)
29*9ded074eSagge3	-- Grab the master system calls table.
30*9ded074eSagge3	local s = tbl.syscalls
31*9ded074eSagge3
32*9ded074eSagge3	local print_decl = function (sc)
33*9ded074eSagge3		return sc:native() and not sc.type.NODEF and
34*9ded074eSagge3		    not sc.type.SYSMUX and sc.name ~= "yield"
35*9ded074eSagge3	end
36*9ded074eSagge3
37*9ded074eSagge3	-- Bind the generator to the parameter file.
38*9ded074eSagge3	local gen = generator:new({}, fh)
39*9ded074eSagge3
40*9ded074eSagge3	-- Write the generated preamble.
41*9ded074eSagge3	gen:preamble("Public system call stubs provided by libsys.\n" ..
42*9ded074eSagge3	    "\n" ..
43*9ded074eSagge3	    "Do not use directly, include <libsys.h> instead.")
44*9ded074eSagge3
45*9ded074eSagge3	gen:write(string.format([[
46*9ded074eSagge3#ifndef __LIBSYS_H_
47*9ded074eSagge3#define __LIBSYS_H_
48*9ded074eSagge3
49*9ded074eSagge3#include <sys/_cpuset.h>
50*9ded074eSagge3#include <sys/_domainset.h>
51*9ded074eSagge3#include <sys/_ffcounter.h>
52*9ded074eSagge3#include <sys/_semaphore.h>
53*9ded074eSagge3#include <sys/_sigaltstack.h>
54*9ded074eSagge3#include <machine/ucontext.h>   /* for mcontext_t */
55*9ded074eSagge3#include <sys/_ucontext.h>
56*9ded074eSagge3#include <sys/wait.h>
57*9ded074eSagge3
58*9ded074eSagge3]]))
59*9ded074eSagge3
60*9ded074eSagge3	for name, _ in util.pairsByKeys(tbl.structs) do
61*9ded074eSagge3		gen:write(string.format("struct %s;\n", name))
62*9ded074eSagge3	end
63*9ded074eSagge3	gen:write("union semun;\n")
64*9ded074eSagge3
65*9ded074eSagge3	gen:write("\n__BEGIN_DECLS\n")
66*9ded074eSagge3
67*9ded074eSagge3	for _, v in pairs(s) do
68*9ded074eSagge3		if print_decl(v) then
69*9ded074eSagge3			gen:write(string.format(
70*9ded074eSagge3			    "typedef %s (__sys_%s_t)(%s);\n",
71*9ded074eSagge3			    v.ret, v.name, v.argstr_type))
72*9ded074eSagge3		end
73*9ded074eSagge3	end
74*9ded074eSagge3
75*9ded074eSagge3	gen:write("\n")
76*9ded074eSagge3
77*9ded074eSagge3	for _, v in pairs(s) do
78*9ded074eSagge3		if print_decl(v) then
79*9ded074eSagge3			gen:write(string.format("%s __sys_%s(%s);\n",
80*9ded074eSagge3			    v.ret, v.name, v.argstr_type_var))
81*9ded074eSagge3		end
82*9ded074eSagge3	end
83*9ded074eSagge3
84*9ded074eSagge3	gen:write("__END_DECLS\n")
85*9ded074eSagge3	-- End
86*9ded074eSagge3	gen:write("\n#endif /* __LIBSYS_H_ */\n")
87*9ded074eSagge3end
88*9ded074eSagge3
89*9ded074eSagge3-- Entry of script:
90*9ded074eSagge3if script then
91*9ded074eSagge3	local config = require("config")
92*9ded074eSagge3
93*9ded074eSagge3	if #arg < 1 or #arg > 2 then
94*9ded074eSagge3		error("usage: " .. arg[0] .. " syscall.master")
95*9ded074eSagge3	end
96*9ded074eSagge3
97*9ded074eSagge3	local sysfile, configfile = arg[1], arg[2]
98*9ded074eSagge3
99*9ded074eSagge3	config.merge(configfile)
100*9ded074eSagge3	config.mergeCompat()
101*9ded074eSagge3	config.mergeCapability()
102*9ded074eSagge3
103*9ded074eSagge3	-- The parsed syscall table.
104*9ded074eSagge3	local tbl = FreeBSDSyscall:new{sysfile = sysfile, config = config}
105*9ded074eSagge3
106*9ded074eSagge3	libsys_h.file = config.libsys_h	-- change file here
107*9ded074eSagge3	libsys_h.generate(tbl, config, libsys_h.file)
108*9ded074eSagge3end
109*9ded074eSagge3
110*9ded074eSagge3-- Return the module.
111*9ded074eSagge3return libsys_h
112