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