19ded074eSagge3#!/usr/libexec/flua 29ded074eSagge3-- 39ded074eSagge3-- SPDX-License-Identifier: BSD-2-Clause 49ded074eSagge3-- 59ded074eSagge3-- Copyright (c) 2024 SRI International 69ded074eSagge3-- Copyright (c) 2024 Tyler Baxter <agge@FreeBSD.org> 79ded074eSagge3-- Copyright (c) 2023 Warner Losh <imp@bsdimp.com> 89ded074eSagge3-- Copyright (c) 2019 Kyle Evans <kevans@FreeBSD.org> 99ded074eSagge3-- 109ded074eSagge3 119ded074eSagge3-- Setup to be a module, or ran as its own script. 129ded074eSagge3local libsys_h = {} 139ded074eSagge3local script = not pcall(debug.getlocal, 4, 1) -- TRUE if script. 149ded074eSagge3if script then 159ded074eSagge3 -- Add library root to the package path. 169ded074eSagge3 local path = arg[0]:gsub("/[^/]+.lua$", "") 179ded074eSagge3 package.path = package.path .. ";" .. path .. "/../?.lua" 189ded074eSagge3end 199ded074eSagge3 209ded074eSagge3local FreeBSDSyscall = require("core.freebsd-syscall") 219ded074eSagge3local generator = require("tools.generator") 229ded074eSagge3local util = require("tools.util") 239ded074eSagge3 249ded074eSagge3-- File has not been decided yet; config will decide file. Default defined as 259ded074eSagge3-- /dev/null. 269ded074eSagge3libsys_h.file = "/dev/null" 279ded074eSagge3 289ded074eSagge3function libsys_h.generate(tbl, config, fh) 299ded074eSagge3 -- Grab the master system calls table. 309ded074eSagge3 local s = tbl.syscalls 319ded074eSagge3 329ded074eSagge3 local print_decl = function (sc) 339ded074eSagge3 return sc:native() and not sc.type.NODEF and 34*bbc0f33bSBrooks Davis not sc.type.NOLIB and not sc.type.SYSMUX 359ded074eSagge3 end 369ded074eSagge3 379ded074eSagge3 -- Bind the generator to the parameter file. 389ded074eSagge3 local gen = generator:new({}, fh) 399ded074eSagge3 409ded074eSagge3 -- Write the generated preamble. 419ded074eSagge3 gen:preamble("Public system call stubs provided by libsys.\n" .. 429ded074eSagge3 "\n" .. 439ded074eSagge3 "Do not use directly, include <libsys.h> instead.") 449ded074eSagge3 459ded074eSagge3 gen:write(string.format([[ 469ded074eSagge3#ifndef __LIBSYS_H_ 479ded074eSagge3#define __LIBSYS_H_ 489ded074eSagge3 499ded074eSagge3#include <sys/_cpuset.h> 509ded074eSagge3#include <sys/_domainset.h> 519ded074eSagge3#include <sys/_ffcounter.h> 529ded074eSagge3#include <sys/_semaphore.h> 539ded074eSagge3#include <sys/_sigaltstack.h> 549ded074eSagge3#include <machine/ucontext.h> /* for mcontext_t */ 559ded074eSagge3#include <sys/_ucontext.h> 569ded074eSagge3#include <sys/wait.h> 579ded074eSagge3 589ded074eSagge3]])) 599ded074eSagge3 609ded074eSagge3 for name, _ in util.pairsByKeys(tbl.structs) do 619ded074eSagge3 gen:write(string.format("struct %s;\n", name)) 629ded074eSagge3 end 639ded074eSagge3 gen:write("union semun;\n") 649ded074eSagge3 659ded074eSagge3 gen:write("\n__BEGIN_DECLS\n") 669ded074eSagge3 679ded074eSagge3 for _, v in pairs(s) do 689ded074eSagge3 if print_decl(v) then 699ded074eSagge3 gen:write(string.format( 709ded074eSagge3 "typedef %s (__sys_%s_t)(%s);\n", 719ded074eSagge3 v.ret, v.name, v.argstr_type)) 729ded074eSagge3 end 739ded074eSagge3 end 749ded074eSagge3 759ded074eSagge3 gen:write("\n") 769ded074eSagge3 779ded074eSagge3 for _, v in pairs(s) do 789ded074eSagge3 if print_decl(v) then 799ded074eSagge3 gen:write(string.format("%s __sys_%s(%s);\n", 809ded074eSagge3 v.ret, v.name, v.argstr_type_var)) 819ded074eSagge3 end 829ded074eSagge3 end 839ded074eSagge3 849ded074eSagge3 gen:write("__END_DECLS\n") 859ded074eSagge3 -- End 869ded074eSagge3 gen:write("\n#endif /* __LIBSYS_H_ */\n") 879ded074eSagge3end 889ded074eSagge3 899ded074eSagge3-- Entry of script: 909ded074eSagge3if script then 919ded074eSagge3 local config = require("config") 929ded074eSagge3 939ded074eSagge3 if #arg < 1 or #arg > 2 then 949ded074eSagge3 error("usage: " .. arg[0] .. " syscall.master") 959ded074eSagge3 end 969ded074eSagge3 979ded074eSagge3 local sysfile, configfile = arg[1], arg[2] 989ded074eSagge3 999ded074eSagge3 config.merge(configfile) 1009ded074eSagge3 config.mergeCompat() 1019ded074eSagge3 1029ded074eSagge3 -- The parsed syscall table. 1039ded074eSagge3 local tbl = FreeBSDSyscall:new{sysfile = sysfile, config = config} 1049ded074eSagge3 1059ded074eSagge3 libsys_h.file = config.libsys_h -- change file here 1069ded074eSagge3 libsys_h.generate(tbl, config, libsys_h.file) 1079ded074eSagge3end 1089ded074eSagge3 1099ded074eSagge3-- Return the module. 1109ded074eSagge3return libsys_h 111