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