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_mk = {} 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_mk.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_mk.generate(tbl, config, fh) 30*9ded074eSagge3 -- Grab the master system calls table. 31*9ded074eSagge3 local s = tbl.syscalls 32*9ded074eSagge3 -- Bookkeeping for keeping track of when we're at the last system 33*9ded074eSagge3 -- call (no backslash). 34*9ded074eSagge3 local size = #s 35*9ded074eSagge3 local idx = 0 36*9ded074eSagge3 37*9ded074eSagge3 -- Bind the generator to the parameter file. 38*9ded074eSagge3 local gen = generator:new({}, fh) 39*9ded074eSagge3 40*9ded074eSagge3 -- Write the generated preamble. 41*9ded074eSagge3 gen:preamble("FreeBSD system call object files.", "#") 42*9ded074eSagge3 43*9ded074eSagge3 gen:write("MIASM = \\\n") -- preamble 44*9ded074eSagge3 for _, v in pairs(s) do 45*9ded074eSagge3 local c = v:compatLevel() 46*9ded074eSagge3 idx = idx + 1 47*9ded074eSagge3 if v:native() and not v.type.NODEF then 48*9ded074eSagge3 if idx >= size then 49*9ded074eSagge3 -- At last system call, no backslash. 50*9ded074eSagge3 gen:write(string.format("\t%s.o\n", v:symbol())) 51*9ded074eSagge3 else 52*9ded074eSagge3 -- Normal behavior. 53*9ded074eSagge3 gen:write(string.format("\t%s.o \\\n", v:symbol())) 54*9ded074eSagge3 end 55*9ded074eSagge3 -- Handle compat (everything >= FREEBSD3): 56*9ded074eSagge3 elseif c >= 7 and not v.type.NODEF then 57*9ded074eSagge3 if idx >= size then 58*9ded074eSagge3 -- At last system call, no backslash. 59*9ded074eSagge3 gen:write(string.format("\t%s.o\n", v:symbol())) 60*9ded074eSagge3 else 61*9ded074eSagge3 -- Normal behavior. 62*9ded074eSagge3 gen:write(string.format("\t%s.o \\\n", v:symbol())) 63*9ded074eSagge3 end 64*9ded074eSagge3 end 65*9ded074eSagge3 end 66*9ded074eSagge3end 67*9ded074eSagge3 68*9ded074eSagge3-- Entry of script: 69*9ded074eSagge3if script then 70*9ded074eSagge3 local config = require("config") 71*9ded074eSagge3 72*9ded074eSagge3 if #arg < 1 or #arg > 2 then 73*9ded074eSagge3 error("usage: " .. arg[0] .. " syscall.master") 74*9ded074eSagge3 end 75*9ded074eSagge3 76*9ded074eSagge3 local sysfile, configfile = arg[1], arg[2] 77*9ded074eSagge3 78*9ded074eSagge3 config.merge(configfile) 79*9ded074eSagge3 config.mergeCompat() 80*9ded074eSagge3 config.mergeCapability() 81*9ded074eSagge3 82*9ded074eSagge3 -- The parsed syscall table. 83*9ded074eSagge3 local tbl = FreeBSDSyscall:new{sysfile = sysfile, config = config} 84*9ded074eSagge3 85*9ded074eSagge3 syscall_mk.file = config.sysmk -- change file here 86*9ded074eSagge3 syscall_mk.generate(tbl, config, syscall_mk.file) 87*9ded074eSagge3end 88*9ded074eSagge3 89*9ded074eSagge3-- Return the module. 90*9ded074eSagge3return syscall_mk 91