xref: /freebsd/sys/tools/syscalls/scripts/syscall_mk.lua (revision daca374bc48b5f6975563ae9ecc227868039e807)
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_mk = {}
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_mk.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_mk.generate(tbl, config, fh)
309ded074eSagge3	-- Grab the master system calls table.
319ded074eSagge3	local s = tbl.syscalls
329ded074eSagge3	-- Bookkeeping for keeping track of when we're at the last system
339ded074eSagge3	-- call (no backslash).
349ded074eSagge3	local size = #s
359ded074eSagge3	local idx = 0
369ded074eSagge3
379ded074eSagge3	-- Bind the generator to the parameter file.
389ded074eSagge3	local gen = generator:new({}, fh)
399ded074eSagge3
409ded074eSagge3	-- Write the generated preamble.
419ded074eSagge3	gen:preamble("FreeBSD system call object files.", "#")
429ded074eSagge3
439ded074eSagge3	gen:write("MIASM =  \\\n") -- preamble
449ded074eSagge3	for _, v in pairs(s) do
459ded074eSagge3		local c = v:compatLevel()
46*daca374bSBrooks Davis		local bs = " \\"
479ded074eSagge3		idx = idx + 1
48*daca374bSBrooks Davis		if (v:native() or c >= 7) and not v.type.NODEF and not v.type.NOLIB then
499ded074eSagge3			if idx >= size then
509ded074eSagge3				-- At last system call, no backslash.
51*daca374bSBrooks Davis				bs = ""
529ded074eSagge3			end
53*daca374bSBrooks Davis			gen:write(string.format("\t%s.o%s\n", v:symbol(), bs))
549ded074eSagge3		end
559ded074eSagge3	end
569ded074eSagge3end
579ded074eSagge3
589ded074eSagge3-- Entry of script:
599ded074eSagge3if script then
609ded074eSagge3	local config = require("config")
619ded074eSagge3
629ded074eSagge3	if #arg < 1 or #arg > 2 then
639ded074eSagge3		error("usage: " .. arg[0] .. " syscall.master")
649ded074eSagge3	end
659ded074eSagge3
669ded074eSagge3	local sysfile, configfile = arg[1], arg[2]
679ded074eSagge3
689ded074eSagge3	config.merge(configfile)
699ded074eSagge3	config.mergeCompat()
709ded074eSagge3
719ded074eSagge3	-- The parsed syscall table.
729ded074eSagge3	local tbl = FreeBSDSyscall:new{sysfile = sysfile, config = config}
739ded074eSagge3
749ded074eSagge3	syscall_mk.file = config.sysmk	-- change file here
759ded074eSagge3	syscall_mk.generate(tbl, config, syscall_mk.file)
769ded074eSagge3end
779ded074eSagge3
789ded074eSagge3-- Return the module.
799ded074eSagge3return syscall_mk
80