Path: blob/main/sys/tools/syscalls/scripts/syscall_json.lua
289279 views
#!/usr/libexec/flua1--2-- SPDX-License-Identifier: BSD-2-Clause3--4-- Copyright (c) 2026 Warner Losh <[email protected]>5--67-- Setup to be a module, or ran as its own script.8local syscall_json = {}9local script = not pcall(debug.getlocal, 4, 1) -- TRUE if script.10if script then11-- Add library root to the package path.12local path = arg[0]:gsub("/[^/]+.lua$", "")13package.path = package.path .. ";" .. path .. "/../?.lua"14end1516local FreeBSDSyscall = require("core.freebsd-syscall")17local ucl = require("ucl")1819-- Convert the type flags set (table with flag=true entries) to a sorted list.20local function flagsToList(typetbl)21local flags = {}22for k, _ in pairs(typetbl) do23table.insert(flags, k)24end25table.sort(flags)26return flags27end2829-- Convert a single syscall object to a plain table suitable for JSON export.30-- Much of the data is available only as a method call.31local function syscallToTable(v)32local entry = {33num = v.num,34name = v.name or "",35alias = v.alias or "",36audit = v.audit or "",37flags = flagsToList(v.type),38compat_level = v:compatLevel(),39compat_prefix = v:compatPrefix(),40symbol = v:symbol(),41rettype = v.rettype or "int",42cap = v.cap or "0",43thr = v.thr or "SY_THR_STATIC",44changes_abi = v.changes_abi or false,45noproto = v.noproto or false,46args_size = v.args_size or "0",47arg_alias = v.arg_alias or "",48}4950-- Export arguments with annotations.51local args = {}52if v.args ~= nil then53for _, a in ipairs(v.args) do54arg = {55type = a.type,56name = a.name,57}58if a.annotation ~= nil and a.annotation ~= "" then59arg.annotation = a.annotation60end61table.insert(args, arg)62end63end64entry.args = args6566-- Export altname/alttag/rettype if present (loadable syscalls).67if v.altname ~= nil then68entry.altname = v.altname69end70if v.alttag ~= nil then71entry.alttag = v.alttag72end7374return entry75end7677function syscall_json.generate(tbl, config)78-- Build the syscalls array.79local syscalls = {}80for _, v in pairs(tbl.syscalls) do81table.insert(syscalls, syscallToTable(v))82end8384-- Build the structs data into a nicer structure85local structs = {}86if tbl.structs ~= nil then87for k, _ in pairs(tbl.structs) do88table.insert(structs, k)89end90table.sort(structs)91end9293local root = {94syscalls = syscalls,95structs = structs,96}9798local json = ucl.to_json(root)99100-- Write to stdout.101io.write(json)102io.write("\n")103end104105-- Entry of script:106if script then107local config = require("config")108109if #arg < 1 or #arg > 2 then110error("usage: " .. arg[0] .. " syscall.master [config]")111end112113local sysfile, configfile = arg[1], arg[2]114115config.merge(configfile)116config.mergeCompat()117118-- The parsed system call table.119local tbl = FreeBSDSyscall:new{sysfile = sysfile, config = config}120121syscall_json.generate(tbl, config)122end123124-- Return the module.125return syscall_json126127128