aboutsummaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorBrooks Davis <brooks@FreeBSD.org>2021-11-22 22:36:58 +0000
committerBrooks Davis <brooks@FreeBSD.org>2021-11-22 22:36:58 +0000
commit988e8db3c041e39db0da9fbb0edde9e0e3d53326 (patch)
tree1736098f4221f2901e4f4f9c8bc17864c8ffd78e /sys
parent804a84fbf26b7caf17713f811c7d2d06b43f29ff (diff)
downloadsrc-988e8db3c041e39db0da9fbb0edde9e0e3d53326.tar.gz
src-988e8db3c041e39db0da9fbb0edde9e0e3d53326.zip
makesyscalls: automate detection of ABI changes
Use pattern matching including matches of _Contains_*_ argument annotations to (mostly) determine which system calls require ABI-specific handling. Automatically treat syscalls as NOPROTO if no ABI changes are present. Reviewed by: kevans
Diffstat (limited to 'sys')
-rw-r--r--sys/tools/makesyscalls.lua33
1 files changed, 24 insertions, 9 deletions
diff --git a/sys/tools/makesyscalls.lua b/sys/tools/makesyscalls.lua
index e723346f1679..48ad05eb0469 100644
--- a/sys/tools/makesyscalls.lua
+++ b/sys/tools/makesyscalls.lua
@@ -638,9 +638,11 @@ end
local function process_args(args)
local funcargs = {}
+ local changes_abi = false
for arg in args:gmatch("([^,]+)") do
- local abi_change = not isptrtype(arg) or check_abi_changes(arg)
+ local arg_abi_change = check_abi_changes(arg)
+ changes_abi = changes_abi or arg_abi_change
arg = strip_arg_annotations(arg)
@@ -653,6 +655,10 @@ local function process_args(args)
goto out
end
+ -- is64bittype() needs a bare type so check it after argname
+ -- is removed
+ changes_abi = changes_abi or (abi_changes("pair_64bit") and is64bittype(argtype))
+
argtype = argtype:gsub("intptr_t", config["abi_intptr_t"])
argtype = argtype:gsub("semid_t", config["abi_semid_t"])
if isptrtype(argtype) then
@@ -671,7 +677,7 @@ local function process_args(args)
end
-- XX TODO: Forward declarations? See: sysstubfwd in CheriBSD
- if abi_change then
+ if arg_abi_change then
local abi_type_suffix = config["abi_type_suffix"]
argtype = argtype:gsub("(struct [^ ]*)", "%1" ..
abi_type_suffix)
@@ -703,7 +709,7 @@ local function process_args(args)
end
::out::
- return funcargs
+ return funcargs, changes_abi
end
local function handle_noncompat(sysnum, thr_flag, flags, sysflags, rettype,
@@ -1187,25 +1193,31 @@ process_syscall_def = function(line)
end
local funcargs = {}
+ local changes_abi = false
if args ~= nil then
- funcargs = process_args(args)
+ funcargs, changes_abi = process_args(args)
end
+ local noproto = config["abi_flags"] ~= "" and not changes_abi
local argprefix = ''
local funcprefix = ''
if abi_changes("pointer_args") then
for _, v in ipairs(funcargs) do
if isptrtype(v["type"]) then
- -- argalias should be:
- -- COMPAT_PREFIX + ABI Prefix + funcname
- argprefix = config['abi_func_prefix']
- funcprefix = config['abi_func_prefix']
- funcalias = funcprefix .. funcname
+ changes_abi = true
goto ptrfound
end
end
::ptrfound::
end
+ if changes_abi then
+ -- argalias should be:
+ -- COMPAT_PREFIX + ABI Prefix + funcname
+ argprefix = config['abi_func_prefix']
+ funcprefix = config['abi_func_prefix']
+ funcalias = funcprefix .. funcname
+ noproto = false
+ end
if funcname ~= nil then
funcname = funcprefix .. funcname
end
@@ -1232,6 +1244,9 @@ process_syscall_def = function(line)
local ncompatflags = get_mask({"STD", "NODEF", "NOARGS", "NOPROTO",
"NOSTD"})
local compatflags = get_mask_pat("COMPAT.*")
+ if noproto then
+ flags = flags | known_flags["NOPROTO"];
+ end
if flags & known_flags["OBSOL"] ~= 0 then
handle_obsol(sysnum, funcname, funcomment)
elseif flags & known_flags["RESERVED"] ~= 0 then