xref: /src/sys/tools/syscalls/scripts/syscall_h.lua (revision e7e964cb2ebde11593786a28cea0238d9a6e24c3)
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 syscall_h = {}
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.
249ded074eSagge3syscall_h.file = "/dev/null"
259ded074eSagge3
269ded074eSagge3-- Libc has all the STD, NOSTD and SYSMUX system calls in it, as well as
279ded074eSagge3-- replaced system calls dating back to FreeBSD 7. We are lucky that the
289ded074eSagge3-- system call filename is just the base symbol name for it.
299ded074eSagge3function syscall_h.generate(tbl, config, fh)
309ded074eSagge3	-- Grab the master system calls table, and prepare bookkeeping for
319ded074eSagge3	-- the max system call number.
329ded074eSagge3	local s = tbl.syscalls
339ded074eSagge3	local max = 0
349ded074eSagge3
359ded074eSagge3	-- Bind the generator to the parameter file.
369ded074eSagge3	local gen = generator:new({}, fh)
379ded074eSagge3
389ded074eSagge3	-- Write the generated preamble.
399ded074eSagge3	gen:preamble("System call numbers.")
409ded074eSagge3
41e7e964cbSBrooks Davis	if config.syshdr_extra then
42e7e964cbSBrooks Davis		gen:write(string.format("%s\n\n", config.syshdr_extra))
43e7e964cbSBrooks Davis	end
44e7e964cbSBrooks Davis
459ded074eSagge3	for _, v in pairs(s) do
469ded074eSagge3		local c = v:compatLevel()
479ded074eSagge3		if v.num > max then
489ded074eSagge3			max = v.num
499ded074eSagge3		end
509ded074eSagge3		if v.type.UNIMPL then
519ded074eSagge3			goto skip
529ded074eSagge3		elseif v.type.RESERVED then
539ded074eSagge3			goto skip
549ded074eSagge3		elseif v.type.NODEF then
559ded074eSagge3			goto skip
569ded074eSagge3		elseif v.type.STD or v.type.NOSTD or v.type.SYSMUX or
579ded074eSagge3		    c >= 7 then
589ded074eSagge3			gen:write(string.format("#define\t%s%s%s\t%d\n",
599ded074eSagge3			    config.syscallprefix, v:compatPrefix(), v.name,
609ded074eSagge3			    v.num))
619ded074eSagge3		elseif c >= 0 then
629ded074eSagge3			local comment
639ded074eSagge3			if c == 0 then
649ded074eSagge3				comment = "obsolete"
659ded074eSagge3			elseif c == 3 then
669ded074eSagge3				comment = "old"
679ded074eSagge3			else
689ded074eSagge3				comment = "freebsd" .. c
699ded074eSagge3			end
709ded074eSagge3			gen:write(string.format("\t\t\t\t/* %d is %s %s */\n",
719ded074eSagge3			    v.num, comment, v.name))
729ded074eSagge3		end
739ded074eSagge3		::skip::
749ded074eSagge3	end
759ded074eSagge3	gen:write(string.format("#define\t%sMAXSYSCALL\t%d\n",
769ded074eSagge3	    config.syscallprefix, max + 1))
779ded074eSagge3end
789ded074eSagge3
799ded074eSagge3-- Entry of script:
809ded074eSagge3if script then
819ded074eSagge3	local config = require("config")
829ded074eSagge3
839ded074eSagge3	if #arg < 1 or #arg > 2 then
849ded074eSagge3		error("usage: " .. arg[0] .. " syscall.master")
859ded074eSagge3	end
869ded074eSagge3
879ded074eSagge3	local sysfile, configfile = arg[1], arg[2]
889ded074eSagge3
899ded074eSagge3	config.merge(configfile)
909ded074eSagge3	config.mergeCompat()
919ded074eSagge3
929ded074eSagge3	-- The parsed system call table.
939ded074eSagge3	local tbl = FreeBSDSyscall:new{sysfile = sysfile, config = config}
949ded074eSagge3
959ded074eSagge3	syscall_h.file = config.syshdr	-- change file here
969ded074eSagge3	syscall_h.generate(tbl, config, syscall_h.file)
979ded074eSagge3end
989ded074eSagge3
999ded074eSagge3-- Return the module.
1009ded074eSagge3return syscall_h
101