xref: /freebsd/sys/tools/syscalls/scripts/syscall_h.lua (revision ec86d763d1c94648419aeb931683dcb37bf72656)
1*9ded074eSagge3#!/usr/libexec/flua
2*9ded074eSagge3--
3*9ded074eSagge3-- SPDX-License-Identifier: BSD-2-Clause
4*9ded074eSagge3--
5*9ded074eSagge3-- Copyright (c) 2024 Tyler Baxter <agge@FreeBSD.org>
6*9ded074eSagge3-- Copyright (c) 2023 Warner Losh <imp@bsdimp.com>
7*9ded074eSagge3-- Copyright (c) 2019 Kyle Evans <kevans@FreeBSD.org>
8*9ded074eSagge3--
9*9ded074eSagge3
10*9ded074eSagge3-- Setup to be a module, or ran as its own script.
11*9ded074eSagge3local syscall_h = {}
12*9ded074eSagge3local script = not pcall(debug.getlocal, 4, 1)	-- TRUE if script.
13*9ded074eSagge3if script then
14*9ded074eSagge3	-- Add library root to the package path.
15*9ded074eSagge3	local path = arg[0]:gsub("/[^/]+.lua$", "")
16*9ded074eSagge3	package.path = package.path .. ";" .. path .. "/../?.lua"
17*9ded074eSagge3end
18*9ded074eSagge3
19*9ded074eSagge3local FreeBSDSyscall = require("core.freebsd-syscall")
20*9ded074eSagge3local generator = require("tools.generator")
21*9ded074eSagge3
22*9ded074eSagge3-- File has not been decided yet; config will decide file.  Default defined as
23*9ded074eSagge3-- /dev/null.
24*9ded074eSagge3syscall_h.file = "/dev/null"
25*9ded074eSagge3
26*9ded074eSagge3-- Libc has all the STD, NOSTD and SYSMUX system calls in it, as well as
27*9ded074eSagge3-- replaced system calls dating back to FreeBSD 7. We are lucky that the
28*9ded074eSagge3-- system call filename is just the base symbol name for it.
29*9ded074eSagge3function syscall_h.generate(tbl, config, fh)
30*9ded074eSagge3	-- Grab the master system calls table, and prepare bookkeeping for
31*9ded074eSagge3	-- the max system call number.
32*9ded074eSagge3	local s = tbl.syscalls
33*9ded074eSagge3	local max = 0
34*9ded074eSagge3
35*9ded074eSagge3	-- Bind the generator to the parameter file.
36*9ded074eSagge3	local gen = generator:new({}, fh)
37*9ded074eSagge3
38*9ded074eSagge3	-- Write the generated preamble.
39*9ded074eSagge3	gen:preamble("System call numbers.")
40*9ded074eSagge3
41*9ded074eSagge3	for _, v in pairs(s) do
42*9ded074eSagge3		local c = v:compatLevel()
43*9ded074eSagge3		if v.num > max then
44*9ded074eSagge3			max = v.num
45*9ded074eSagge3		end
46*9ded074eSagge3		if v.type.UNIMPL then
47*9ded074eSagge3			goto skip
48*9ded074eSagge3		elseif v.type.RESERVED then
49*9ded074eSagge3			goto skip
50*9ded074eSagge3		elseif v.type.NODEF then
51*9ded074eSagge3			goto skip
52*9ded074eSagge3		elseif v.type.STD or v.type.NOSTD or v.type.SYSMUX or
53*9ded074eSagge3		    c >= 7 then
54*9ded074eSagge3			gen:write(string.format("#define\t%s%s%s\t%d\n",
55*9ded074eSagge3			    config.syscallprefix, v:compatPrefix(), v.name,
56*9ded074eSagge3			    v.num))
57*9ded074eSagge3		elseif c >= 0 then
58*9ded074eSagge3			local comment
59*9ded074eSagge3			if c == 0 then
60*9ded074eSagge3				comment = "obsolete"
61*9ded074eSagge3			elseif c == 3 then
62*9ded074eSagge3				comment = "old"
63*9ded074eSagge3			else
64*9ded074eSagge3				comment = "freebsd" .. c
65*9ded074eSagge3			end
66*9ded074eSagge3			gen:write(string.format("\t\t\t\t/* %d is %s %s */\n",
67*9ded074eSagge3			    v.num, comment, v.name))
68*9ded074eSagge3		end
69*9ded074eSagge3		::skip::
70*9ded074eSagge3	end
71*9ded074eSagge3	gen:write(string.format("#define\t%sMAXSYSCALL\t%d\n",
72*9ded074eSagge3	    config.syscallprefix, max + 1))
73*9ded074eSagge3end
74*9ded074eSagge3
75*9ded074eSagge3-- Entry of script:
76*9ded074eSagge3if script then
77*9ded074eSagge3	local config = require("config")
78*9ded074eSagge3
79*9ded074eSagge3	if #arg < 1 or #arg > 2 then
80*9ded074eSagge3		error("usage: " .. arg[0] .. " syscall.master")
81*9ded074eSagge3	end
82*9ded074eSagge3
83*9ded074eSagge3	local sysfile, configfile = arg[1], arg[2]
84*9ded074eSagge3
85*9ded074eSagge3	config.merge(configfile)
86*9ded074eSagge3	config.mergeCompat()
87*9ded074eSagge3
88*9ded074eSagge3	-- The parsed system call table.
89*9ded074eSagge3	local tbl = FreeBSDSyscall:new{sysfile = sysfile, config = config}
90*9ded074eSagge3
91*9ded074eSagge3	syscall_h.file = config.syshdr	-- change file here
92*9ded074eSagge3	syscall_h.generate(tbl, config, syscall_h.file)
93*9ded074eSagge3end
94*9ded074eSagge3
95*9ded074eSagge3-- Return the module.
96*9ded074eSagge3return syscall_h
97