xref: /freebsd/sys/tools/syscalls/scripts/syscalls.lua (revision 42d075f4b7b74eb3c4f943d6bdcc2aeb56be6388)
19ded074eSagge3#!/usr/libexec/flua
29ded074eSagge3--
39ded074eSagge3-- SPDX-License-Identifier: BSD-2-Clause
49ded074eSagge3--
59ded074eSagge3-- Copyright (c) 2024 Tyler Baxter <agge@FreeBSD.org>
69ded074eSagge3-- Copyright (c) 2023 Warner Losh <imp@bsdimp.com>
79ded074eSagge3-- Copyright (c) 2019 Kyle Evans <kevans@FreeBSD.org>
89ded074eSagge3--
99ded074eSagge3
109ded074eSagge3-- Setup to be a module, or ran as its own script.
119ded074eSagge3local syscalls = {}
129ded074eSagge3local script = not pcall(debug.getlocal, 4, 1)	-- TRUE if script.
139ded074eSagge3if script then
149ded074eSagge3	-- Add library root to the package path.
159ded074eSagge3	local path = arg[0]:gsub("/[^/]+.lua$", "")
169ded074eSagge3	package.path = package.path .. ";" .. path .. "/../?.lua"
179ded074eSagge3end
189ded074eSagge3
199ded074eSagge3local FreeBSDSyscall = require("core.freebsd-syscall")
209ded074eSagge3local generator = require("tools.generator")
219ded074eSagge3
229ded074eSagge3-- File has not been decided yet; config will decide file.  Default defined as
239ded074eSagge3-- /dev/null.
249ded074eSagge3syscalls.file = "/dev/null"
259ded074eSagge3
269ded074eSagge3function syscalls.generate(tbl, config, fh)
279ded074eSagge3	-- Grab the master system calls table.
289ded074eSagge3	local s = tbl.syscalls
299ded074eSagge3
309ded074eSagge3	-- Bind the generator to the parameter file.
319ded074eSagge3	local gen = generator:new({}, fh)
329ded074eSagge3
339ded074eSagge3	-- Write the generated preamble.
349ded074eSagge3	gen:preamble("System call names.")
359ded074eSagge3
369ded074eSagge3	gen:write(string.format("const char *%s[] = {\n", config.namesname))
379ded074eSagge3
389ded074eSagge3	for _, v in pairs(s) do
399ded074eSagge3		--print("num " .. v.num .. " name " .. v.name)
409ded074eSagge3		local c = v:compatLevel()
41*42d075f4SBrooks Davis
42*42d075f4SBrooks Davis		gen:write(v.prolog);
43*42d075f4SBrooks Davis
449ded074eSagge3		if v:native() then
459ded074eSagge3			gen:write(string.format([[
469ded074eSagge3	"%s",			/* %d = %s */
479ded074eSagge3]],
489ded074eSagge3			    v.name, v.num, v.name))
499ded074eSagge3		elseif c >= 3 then
509ded074eSagge3			-- Lookup the info for this specific compat option.
519ded074eSagge3			local flag, descr
529ded074eSagge3			for _, opt in pairs(config.compat_options) do
539ded074eSagge3				if opt.compatlevel == c then
549ded074eSagge3					flag = opt.flag
559ded074eSagge3					flag = flag:lower()
569ded074eSagge3					descr = opt.descr
579ded074eSagge3					break
589ded074eSagge3				end
599ded074eSagge3			end
609ded074eSagge3
619ded074eSagge3			gen:write(string.format([[
629ded074eSagge3	"%s.%s",		/* %d = %s %s */
639ded074eSagge3]],
649ded074eSagge3			    flag, v.name, v.num, descr, v.name))
659ded074eSagge3
669ded074eSagge3		elseif v.type.RESERVED then
679ded074eSagge3			gen:write(string.format([[
689ded074eSagge3	"#%d",			/* %d = reserved for local use */
699ded074eSagge3]],
709ded074eSagge3			    v.num, v.num))
719ded074eSagge3
729ded074eSagge3		elseif v.type.UNIMPL then
739ded074eSagge3			gen:write(string.format([[
749ded074eSagge3	"#%d",			/* %d = %s */
759ded074eSagge3]],
769ded074eSagge3			    v.num, v.num, v.alias))
779ded074eSagge3
789ded074eSagge3		elseif v.type.OBSOL then
799ded074eSagge3			gen:write(string.format([[
809ded074eSagge3	"obs_%s",			/* %d = obsolete %s */
819ded074eSagge3]],
829ded074eSagge3			    v.name, v.num, v.name))
839ded074eSagge3
849ded074eSagge3		end
859ded074eSagge3	end
86*42d075f4SBrooks Davis	gen:write(tbl.epilog)
879ded074eSagge3	-- End
889ded074eSagge3	gen:write("};\n")
899ded074eSagge3end
909ded074eSagge3
919ded074eSagge3-- Entry of script:
929ded074eSagge3if script then
939ded074eSagge3	local config = require("config")
949ded074eSagge3
959ded074eSagge3	if #arg < 1 or #arg > 2 then
969ded074eSagge3		error("usage: " .. arg[0] .. " syscall.master")
979ded074eSagge3	end
989ded074eSagge3
999ded074eSagge3	local sysfile, configfile = arg[1], arg[2]
1009ded074eSagge3
1019ded074eSagge3	config.merge(configfile)
1029ded074eSagge3	config.mergeCompat()
1039ded074eSagge3
1049ded074eSagge3	-- The parsed syscall table.
1059ded074eSagge3	local tbl = FreeBSDSyscall:new{sysfile = sysfile, config = config}
1069ded074eSagge3
1079ded074eSagge3	syscalls.file = config.sysnames	-- change file here
1089ded074eSagge3	syscalls.generate(tbl, config, syscalls.file)
1099ded074eSagge3end
1109ded074eSagge3
1119ded074eSagge3-- Return the module.
1129ded074eSagge3return syscalls
113