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_mk = {} 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_mk.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_mk.generate(tbl, config, fh) 309ded074eSagge3 -- Grab the master system calls table. 319ded074eSagge3 local s = tbl.syscalls 329ded074eSagge3 -- Bookkeeping for keeping track of when we're at the last system 339ded074eSagge3 -- call (no backslash). 349ded074eSagge3 local size = #s 359ded074eSagge3 local idx = 0 369ded074eSagge3 379ded074eSagge3 -- Bind the generator to the parameter file. 389ded074eSagge3 local gen = generator:new({}, fh) 399ded074eSagge3 409ded074eSagge3 -- Write the generated preamble. 419ded074eSagge3 gen:preamble("FreeBSD system call object files.", "#") 429ded074eSagge3 439ded074eSagge3 gen:write("MIASM = \\\n") -- preamble 449ded074eSagge3 for _, v in pairs(s) do 459ded074eSagge3 local c = v:compatLevel() 46*daca374bSBrooks Davis local bs = " \\" 479ded074eSagge3 idx = idx + 1 48*daca374bSBrooks Davis if (v:native() or c >= 7) and not v.type.NODEF and not v.type.NOLIB then 499ded074eSagge3 if idx >= size then 509ded074eSagge3 -- At last system call, no backslash. 51*daca374bSBrooks Davis bs = "" 529ded074eSagge3 end 53*daca374bSBrooks Davis gen:write(string.format("\t%s.o%s\n", v:symbol(), bs)) 549ded074eSagge3 end 559ded074eSagge3 end 569ded074eSagge3end 579ded074eSagge3 589ded074eSagge3-- Entry of script: 599ded074eSagge3if script then 609ded074eSagge3 local config = require("config") 619ded074eSagge3 629ded074eSagge3 if #arg < 1 or #arg > 2 then 639ded074eSagge3 error("usage: " .. arg[0] .. " syscall.master") 649ded074eSagge3 end 659ded074eSagge3 669ded074eSagge3 local sysfile, configfile = arg[1], arg[2] 679ded074eSagge3 689ded074eSagge3 config.merge(configfile) 699ded074eSagge3 config.mergeCompat() 709ded074eSagge3 719ded074eSagge3 -- The parsed syscall table. 729ded074eSagge3 local tbl = FreeBSDSyscall:new{sysfile = sysfile, config = config} 739ded074eSagge3 749ded074eSagge3 syscall_mk.file = config.sysmk -- change file here 759ded074eSagge3 syscall_mk.generate(tbl, config, syscall_mk.file) 769ded074eSagge3end 779ded074eSagge3 789ded074eSagge3-- Return the module. 799ded074eSagge3return syscall_mk 80