diff --git a/include/syscall_handler.h b/include/syscall_handler.h
index 60b14f8894179..682c5b1c42540 100644
--- a/include/syscall_handler.h
+++ b/include/syscall_handler.h
@@ -459,7 +459,7 @@ static inline int z_obj_validation_check(struct z_object *ko,
#define Z_SYSCALL_SPECIFIC_DRIVER(_device, _dtype, _init_fn) \
({ \
struct device *_dev = (struct device *)_device; \
- Z_SYSCALL_OBJ(_dev, _dtype) || \
+ Z_SYSCALL_OBJ(_dev, _dtype) && \
Z_SYSCALL_VERIFY_MSG(_dev->config->init == _init_fn, \
"init function mismatch"); \
})
diff --git a/scripts/gen_kobject_list.py b/scripts/gen_kobject_list.py
index 94fe665282d84..24562ba9ae139 100755
--- a/scripts/gen_kobject_list.py
+++ b/scripts/gen_kobject_list.py
@@ -106,16 +106,18 @@ def kobject_to_enum(kobj):
return "K_OBJ_%s" % name.upper()
-subsystems = [
+subsystems = {
# Editing the list is deprecated, add the __subsystem sentinal to your driver
# api declaration instead. e.x.
#
# __subsystem struct my_driver_api {
# ....
#};
-]
+}
def subsystem_to_enum(subsys):
+ # Map from extended subsystem to base subsystem if different
+ subsys = subsystems[subsys]
return "K_OBJ_DRIVER_" + subsys[:-11].upper()
# --- debug stuff ---
@@ -839,7 +841,7 @@ def write_validation_output(fp):
Z_SYSCALL_DRIVER_OP(ptr, driver_lower_case##_driver_api, op))
""")
- for subsystem in subsystems:
+ for subsystem in set(subsystems.values()):
subsystem = subsystem.replace("_driver_api", "")
fp.write(driver_macro_tpl % {
@@ -866,7 +868,7 @@ def write_kobj_types_output(fp):
fp.write("#endif\n")
fp.write("/* Driver subsystems */\n")
- for subsystem in subsystems:
+ for subsystem in set(subsystems.values()):
subsystem = subsystem.replace("_driver_api", "").upper()
fp.write("K_OBJ_DRIVER_%s,\n" % subsystem)
@@ -887,7 +889,7 @@ def write_kobj_otype_output(fp):
fp.write("#endif\n")
fp.write("/* Driver subsystems */\n")
- for subsystem in subsystems:
+ for subsystem in set(subsystems.values()):
subsystem = subsystem.replace("_driver_api", "")
fp.write('case K_OBJ_DRIVER_%s: ret = "%s driver"; break;\n' % (
subsystem.upper(),
@@ -916,7 +918,7 @@ def write_kobj_size_output(fp):
def parse_subsystems_list_file(path):
with open(path, "r") as fp:
subsys_list = json.load(fp)
- subsystems.extend(subsys_list)
+ subsystems.update(subsys_list)
def parse_args():
global args
diff --git a/scripts/parse_syscalls.py b/scripts/parse_syscalls.py
index 25c56223da84e..86908dbd511c8 100644
--- a/scripts/parse_syscalls.py
+++ b/scripts/parse_syscalls.py
@@ -35,15 +35,16 @@
''', re.MULTILINE | re.VERBOSE)
subsys_regex = re.compile(r'''
-__subsystem\s+ # __subsystem attribute, must be first
-struct\s+ # struct keyword is next
-([^{]+) # name of subsystem
+__subsystem # __subsystem attribute, must be first
+(/\*(?P\w+)\*/)? # optional base subsystem for extensions
+\s+struct\s+ # struct keyword is next
+(?P[^{]+) # name of subsystem
[{] # Open curly bracket
''', re.MULTILINE | re.VERBOSE)
def analyze_headers(multiple_directories):
syscall_ret = []
- subsys_ret = []
+ subsys_ret = {}
for base_path in multiple_directories:
for root, dirs, files in os.walk(base_path, topdown=True):
@@ -63,14 +64,16 @@ def analyze_headers(multiple_directories):
try:
syscall_result = [(mo.groups(), fn)
for mo in syscall_regex.finditer(contents)]
- subsys_result = [mo.groups()[0].strip()
- for mo in subsys_regex.finditer(contents)]
+ subsys_result = {}
+ for mo in subsys_regex.finditer(contents):
+ subsys_name = mo.group('name').strip()
+ subsys_result[subsys_name] = mo.group('base') or subsys_name
except Exception:
sys.stderr.write("While parsing %s\n" % fn)
raise
syscall_ret.extend(syscall_result)
- subsys_ret.extend(subsys_result)
+ subsys_ret.update(subsys_result)
return syscall_ret, subsys_ret