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 syscalls = {} 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. 249ded074eSagge3syscalls.file = "/dev/null" 259ded074eSagge3 269ded074eSagge3function syscalls.generate(tbl, config, fh) 279ded074eSagge3 -- Grab the master system calls table. 289ded074eSagge3 local s = tbl.syscalls 299ded074eSagge3 309ded074eSagge3 -- Bind the generator to the parameter file. 319ded074eSagge3 local gen = generator:new({}, fh) 329ded074eSagge3 339ded074eSagge3 -- Write the generated preamble. 349ded074eSagge3 gen:preamble("System call names.") 359ded074eSagge3 369ded074eSagge3 gen:write(string.format("const char *%s[] = {\n", config.namesname)) 379ded074eSagge3 389ded074eSagge3 for _, v in pairs(s) do 399ded074eSagge3 --print("num " .. v.num .. " name " .. v.name) 409ded074eSagge3 local c = v:compatLevel() 41*42d075f4SBrooks Davis 42*42d075f4SBrooks Davis gen:write(v.prolog); 43*42d075f4SBrooks Davis 449ded074eSagge3 if v:native() then 459ded074eSagge3 gen:write(string.format([[ 469ded074eSagge3 "%s", /* %d = %s */ 479ded074eSagge3]], 489ded074eSagge3 v.name, v.num, v.name)) 499ded074eSagge3 elseif c >= 3 then 509ded074eSagge3 -- Lookup the info for this specific compat option. 519ded074eSagge3 local flag, descr 529ded074eSagge3 for _, opt in pairs(config.compat_options) do 539ded074eSagge3 if opt.compatlevel == c then 549ded074eSagge3 flag = opt.flag 559ded074eSagge3 flag = flag:lower() 569ded074eSagge3 descr = opt.descr 579ded074eSagge3 break 589ded074eSagge3 end 599ded074eSagge3 end 609ded074eSagge3 619ded074eSagge3 gen:write(string.format([[ 629ded074eSagge3 "%s.%s", /* %d = %s %s */ 639ded074eSagge3]], 649ded074eSagge3 flag, v.name, v.num, descr, v.name)) 659ded074eSagge3 669ded074eSagge3 elseif v.type.RESERVED then 679ded074eSagge3 gen:write(string.format([[ 689ded074eSagge3 "#%d", /* %d = reserved for local use */ 699ded074eSagge3]], 709ded074eSagge3 v.num, v.num)) 719ded074eSagge3 729ded074eSagge3 elseif v.type.UNIMPL then 739ded074eSagge3 gen:write(string.format([[ 749ded074eSagge3 "#%d", /* %d = %s */ 759ded074eSagge3]], 769ded074eSagge3 v.num, v.num, v.alias)) 779ded074eSagge3 789ded074eSagge3 elseif v.type.OBSOL then 799ded074eSagge3 gen:write(string.format([[ 809ded074eSagge3 "obs_%s", /* %d = obsolete %s */ 819ded074eSagge3]], 829ded074eSagge3 v.name, v.num, v.name)) 839ded074eSagge3 849ded074eSagge3 end 859ded074eSagge3 end 86*42d075f4SBrooks Davis gen:write(tbl.epilog) 879ded074eSagge3 -- End 889ded074eSagge3 gen:write("};\n") 899ded074eSagge3end 909ded074eSagge3 919ded074eSagge3-- Entry of script: 929ded074eSagge3if script then 939ded074eSagge3 local config = require("config") 949ded074eSagge3 959ded074eSagge3 if #arg < 1 or #arg > 2 then 969ded074eSagge3 error("usage: " .. arg[0] .. " syscall.master") 979ded074eSagge3 end 989ded074eSagge3 999ded074eSagge3 local sysfile, configfile = arg[1], arg[2] 1009ded074eSagge3 1019ded074eSagge3 config.merge(configfile) 1029ded074eSagge3 config.mergeCompat() 1039ded074eSagge3 1049ded074eSagge3 -- The parsed syscall table. 1059ded074eSagge3 local tbl = FreeBSDSyscall:new{sysfile = sysfile, config = config} 1069ded074eSagge3 1079ded074eSagge3 syscalls.file = config.sysnames -- change file here 1089ded074eSagge3 syscalls.generate(tbl, config, syscalls.file) 1099ded074eSagge3end 1109ded074eSagge3 1119ded074eSagge3-- Return the module. 1129ded074eSagge3return syscalls 113