1*9ded074eSagge3#!/usr/libexec/flua 2*9ded074eSagge3-- 3*9ded074eSagge3-- SPDX-License-Identifier: BSD-2-Clause 4*9ded074eSagge3-- 5*9ded074eSagge3-- Copyright (c) 2024 SRI International 6*9ded074eSagge3-- Copyright (c) 2024 Tyler Baxter <agge@FreeBSD.org> 7*9ded074eSagge3-- Copyright (c) 2023 Warner Losh <imp@bsdimp.com> 8*9ded074eSagge3-- Copyright (c) 2019 Kyle Evans <kevans@FreeBSD.org> 9*9ded074eSagge3-- 10*9ded074eSagge3 11*9ded074eSagge3-- Setup to be a module, or ran as its own script. 12*9ded074eSagge3local syscalls_map = {} 13*9ded074eSagge3local script = not pcall(debug.getlocal, 4, 1) -- TRUE if script. 14*9ded074eSagge3if script then 15*9ded074eSagge3 -- Add library root to the package path. 16*9ded074eSagge3 local path = arg[0]:gsub("/[^/]+.lua$", "") 17*9ded074eSagge3 package.path = package.path .. ";" .. path .. "/../?.lua" 18*9ded074eSagge3end 19*9ded074eSagge3 20*9ded074eSagge3local FreeBSDSyscall = require("core.freebsd-syscall") 21*9ded074eSagge3local generator = require("tools.generator") 22*9ded074eSagge3 23*9ded074eSagge3-- File has not been decided yet; config will decide file. Default defined as 24*9ded074eSagge3-- /dev/null. 25*9ded074eSagge3syscalls_map.file = "/dev/null" 26*9ded074eSagge3 27*9ded074eSagge3function syscalls_map.generate(tbl, config, fh) 28*9ded074eSagge3 -- Grab the master system calls table. 29*9ded074eSagge3 local s = tbl.syscalls 30*9ded074eSagge3 31*9ded074eSagge3 -- Bind the generator to the parameter file. 32*9ded074eSagge3 local gen = generator:new({}, fh) 33*9ded074eSagge3 34*9ded074eSagge3 -- Write the generated preamble. 35*9ded074eSagge3 gen:preamble("FreeBSD system call symbols.") 36*9ded074eSagge3 37*9ded074eSagge3 gen:write(string.format("FBSDprivate_1.0 {\n")) 38*9ded074eSagge3 39*9ded074eSagge3 for _, v in pairs(s) do 40*9ded074eSagge3 --print("num " .. v.num .. " name " .. v.name) 41*9ded074eSagge3 if v:native() and not v.type.NODEF and v.name ~= "yield" then 42*9ded074eSagge3 if v.name ~= "exit" and v.name ~= "vfork" then 43*9ded074eSagge3 gen:write(string.format("\t_%s;\n", v.name)) 44*9ded074eSagge3 end 45*9ded074eSagge3 gen:write(string.format("\t__sys_%s;\n", v.name)) 46*9ded074eSagge3 end 47*9ded074eSagge3 end 48*9ded074eSagge3 -- End 49*9ded074eSagge3 gen:write("};\n") 50*9ded074eSagge3end 51*9ded074eSagge3 52*9ded074eSagge3-- Entry of script: 53*9ded074eSagge3if script then 54*9ded074eSagge3 local config = require("config") 55*9ded074eSagge3 56*9ded074eSagge3 if #arg < 1 or #arg > 2 then 57*9ded074eSagge3 error("usage: " .. arg[0] .. " syscall.master") 58*9ded074eSagge3 end 59*9ded074eSagge3 60*9ded074eSagge3 local sysfile, configfile = arg[1], arg[2] 61*9ded074eSagge3 62*9ded074eSagge3 config.merge(configfile) 63*9ded074eSagge3 config.mergeCompat() 64*9ded074eSagge3 config.mergeCapability() 65*9ded074eSagge3 66*9ded074eSagge3 -- The parsed syscall table. 67*9ded074eSagge3 local tbl = FreeBSDSyscall:new{sysfile = sysfile, config = config} 68*9ded074eSagge3 69*9ded074eSagge3 syscalls_map.file = config.libsysmap -- change file here 70*9ded074eSagge3 syscalls_map.generate(tbl, config, syscalls_map.file) 71*9ded074eSagge3end 72*9ded074eSagge3 73*9ded074eSagge3-- Return the module. 74*9ded074eSagge3return syscalls_map 75