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 libsys_h = {} 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*9ded074eSagge3local util = require("tools.util") 23*9ded074eSagge3 24*9ded074eSagge3-- File has not been decided yet; config will decide file. Default defined as 25*9ded074eSagge3-- /dev/null. 26*9ded074eSagge3libsys_h.file = "/dev/null" 27*9ded074eSagge3 28*9ded074eSagge3function libsys_h.generate(tbl, config, fh) 29*9ded074eSagge3 -- Grab the master system calls table. 30*9ded074eSagge3 local s = tbl.syscalls 31*9ded074eSagge3 32*9ded074eSagge3 local print_decl = function (sc) 33*9ded074eSagge3 return sc:native() and not sc.type.NODEF and 34*9ded074eSagge3 not sc.type.SYSMUX and sc.name ~= "yield" 35*9ded074eSagge3 end 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("Public system call stubs provided by libsys.\n" .. 42*9ded074eSagge3 "\n" .. 43*9ded074eSagge3 "Do not use directly, include <libsys.h> instead.") 44*9ded074eSagge3 45*9ded074eSagge3 gen:write(string.format([[ 46*9ded074eSagge3#ifndef __LIBSYS_H_ 47*9ded074eSagge3#define __LIBSYS_H_ 48*9ded074eSagge3 49*9ded074eSagge3#include <sys/_cpuset.h> 50*9ded074eSagge3#include <sys/_domainset.h> 51*9ded074eSagge3#include <sys/_ffcounter.h> 52*9ded074eSagge3#include <sys/_semaphore.h> 53*9ded074eSagge3#include <sys/_sigaltstack.h> 54*9ded074eSagge3#include <machine/ucontext.h> /* for mcontext_t */ 55*9ded074eSagge3#include <sys/_ucontext.h> 56*9ded074eSagge3#include <sys/wait.h> 57*9ded074eSagge3 58*9ded074eSagge3]])) 59*9ded074eSagge3 60*9ded074eSagge3 for name, _ in util.pairsByKeys(tbl.structs) do 61*9ded074eSagge3 gen:write(string.format("struct %s;\n", name)) 62*9ded074eSagge3 end 63*9ded074eSagge3 gen:write("union semun;\n") 64*9ded074eSagge3 65*9ded074eSagge3 gen:write("\n__BEGIN_DECLS\n") 66*9ded074eSagge3 67*9ded074eSagge3 for _, v in pairs(s) do 68*9ded074eSagge3 if print_decl(v) then 69*9ded074eSagge3 gen:write(string.format( 70*9ded074eSagge3 "typedef %s (__sys_%s_t)(%s);\n", 71*9ded074eSagge3 v.ret, v.name, v.argstr_type)) 72*9ded074eSagge3 end 73*9ded074eSagge3 end 74*9ded074eSagge3 75*9ded074eSagge3 gen:write("\n") 76*9ded074eSagge3 77*9ded074eSagge3 for _, v in pairs(s) do 78*9ded074eSagge3 if print_decl(v) then 79*9ded074eSagge3 gen:write(string.format("%s __sys_%s(%s);\n", 80*9ded074eSagge3 v.ret, v.name, v.argstr_type_var)) 81*9ded074eSagge3 end 82*9ded074eSagge3 end 83*9ded074eSagge3 84*9ded074eSagge3 gen:write("__END_DECLS\n") 85*9ded074eSagge3 -- End 86*9ded074eSagge3 gen:write("\n#endif /* __LIBSYS_H_ */\n") 87*9ded074eSagge3end 88*9ded074eSagge3 89*9ded074eSagge3-- Entry of script: 90*9ded074eSagge3if script then 91*9ded074eSagge3 local config = require("config") 92*9ded074eSagge3 93*9ded074eSagge3 if #arg < 1 or #arg > 2 then 94*9ded074eSagge3 error("usage: " .. arg[0] .. " syscall.master") 95*9ded074eSagge3 end 96*9ded074eSagge3 97*9ded074eSagge3 local sysfile, configfile = arg[1], arg[2] 98*9ded074eSagge3 99*9ded074eSagge3 config.merge(configfile) 100*9ded074eSagge3 config.mergeCompat() 101*9ded074eSagge3 config.mergeCapability() 102*9ded074eSagge3 103*9ded074eSagge3 -- The parsed syscall table. 104*9ded074eSagge3 local tbl = FreeBSDSyscall:new{sysfile = sysfile, config = config} 105*9ded074eSagge3 106*9ded074eSagge3 libsys_h.file = config.libsys_h -- change file here 107*9ded074eSagge3 libsys_h.generate(tbl, config, libsys_h.file) 108*9ded074eSagge3end 109*9ded074eSagge3 110*9ded074eSagge3-- Return the module. 111*9ded074eSagge3return libsys_h 112