xref: /freebsd/sys/tools/syscalls/scripts/syscalls_map.lua (revision 9355ad0b0bfaba9dc39972819185a7dc787a8950)
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 syscalls_map = {}
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")
229ded074eSagge3
239ded074eSagge3-- File has not been decided yet; config will decide file.  Default defined as
249ded074eSagge3-- /dev/null.
259ded074eSagge3syscalls_map.file = "/dev/null"
269ded074eSagge3
279ded074eSagge3function syscalls_map.generate(tbl, config, fh)
289ded074eSagge3	-- Grab the master system calls table.
299ded074eSagge3	local s = tbl.syscalls
309ded074eSagge3
319ded074eSagge3	-- Bind the generator to the parameter file.
329ded074eSagge3	local gen = generator:new({}, fh)
339ded074eSagge3
349ded074eSagge3	-- Write the generated preamble.
359ded074eSagge3	gen:preamble("FreeBSD system call symbols.")
369ded074eSagge3
379ded074eSagge3	gen:write(string.format("FBSDprivate_1.0 {\n"))
389ded074eSagge3
399ded074eSagge3	for _, v in pairs(s) do
40*9355ad0bSBrooks Davis		gen:write(v.prolog)
41bbc0f33bSBrooks Davis		if v:native() and not v.type.NODEF and not v.type.NOLIB then
429ded074eSagge3			if v.name ~= "exit" and v.name ~= "vfork" then
439ded074eSagge3				gen:write(string.format("\t_%s;\n", v.name))
449ded074eSagge3			end
459ded074eSagge3			gen:write(string.format("\t__sys_%s;\n", v.name))
469ded074eSagge3		end
479ded074eSagge3	end
48*9355ad0bSBrooks Davis	gen:write(tbl.epilog)
49*9355ad0bSBrooks Davis
509ded074eSagge3	-- End
519ded074eSagge3	gen:write("};\n")
529ded074eSagge3end
539ded074eSagge3
549ded074eSagge3-- Entry of script:
559ded074eSagge3if script then
569ded074eSagge3	local config = require("config")
579ded074eSagge3
589ded074eSagge3	if #arg < 1 or #arg > 2 then
599ded074eSagge3		error("usage: " .. arg[0] .. " syscall.master")
609ded074eSagge3	end
619ded074eSagge3
629ded074eSagge3	local sysfile, configfile = arg[1], arg[2]
639ded074eSagge3
649ded074eSagge3	config.merge(configfile)
659ded074eSagge3	config.mergeCompat()
669ded074eSagge3
679ded074eSagge3	-- The parsed syscall table.
689ded074eSagge3	local tbl = FreeBSDSyscall:new{sysfile = sysfile, config = config}
699ded074eSagge3
709ded074eSagge3	syscalls_map.file = config.libsysmap	-- change file here
719ded074eSagge3	syscalls_map.generate(tbl, config, syscalls_map.file)
729ded074eSagge3end
739ded074eSagge3
749ded074eSagge3-- Return the module.
759ded074eSagge3return syscalls_map
76