[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v4 03/34] modules: generate modinfo.c
From: |
Gerd Hoffmann |
Subject: |
[PATCH v4 03/34] modules: generate modinfo.c |
Date: |
Thu, 24 Jun 2021 12:38:05 +0200 |
Add script to generate C source with a small
database containing the module meta-data.
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
scripts/modinfo-generate.py | 84 +++++++++++++++++++++++++++++++++++++
include/qemu/module.h | 17 ++++++++
softmmu/vl.c | 4 ++
util/module.c | 11 +++++
meson.build | 13 +++++-
5 files changed, 128 insertions(+), 1 deletion(-)
create mode 100755 scripts/modinfo-generate.py
diff --git a/scripts/modinfo-generate.py b/scripts/modinfo-generate.py
new file mode 100755
index 000000000000..a6d98a6bc4cc
--- /dev/null
+++ b/scripts/modinfo-generate.py
@@ -0,0 +1,84 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+
+import os
+import sys
+
+def print_array(name, values):
+ if len(values) == 0:
+ return
+ list = ", ".join(values)
+ print(" .%s = ((const char*[]){ %s, NULL })," % (name, list))
+
+def parse_line(line):
+ kind = ""
+ data = ""
+ get_kind = False
+ get_data = False
+ for item in line.split():
+ if item == "MODINFO_START":
+ get_kind = True
+ continue
+ if item.startswith("MODINFO_END"):
+ get_data = False
+ continue
+ if get_kind:
+ kind = item
+ get_kind = False
+ get_data = True
+ continue
+ if get_data:
+ data += " " + item
+ continue
+ return (kind, data)
+
+def generate(name, lines):
+ arch = ""
+ objs = []
+ deps = []
+ opts = []
+ for line in lines:
+ if line.find("MODINFO_START") != -1:
+ (kind, data) = parse_line(line)
+ if kind == 'obj':
+ objs.append(data)
+ elif kind == 'dep':
+ deps.append(data)
+ elif kind == 'opts':
+ opts.append(data)
+ elif kind == 'arch':
+ arch = data;
+ else:
+ print("unknown:", kind)
+ exit(1)
+
+ print(" .name = \"%s\"," % name)
+ if arch != "":
+ print(" .arch = %s," % arch)
+ print_array("objs", objs)
+ print_array("deps", deps)
+ print_array("opts", opts)
+ print("},{");
+
+def print_pre():
+ print("/* generated by scripts/modinfo-generate.py */")
+ print("#include \"qemu/osdep.h\"")
+ print("#include \"qemu/module.h\"")
+ print("const QemuModinfo qemu_modinfo[] = {{")
+
+def print_post():
+ print(" /* end of list */")
+ print("}};")
+
+def main(args):
+ print_pre()
+ for modinfo in args:
+ with open(modinfo) as f:
+ lines = f.readlines()
+ print(" /* %s */" % modinfo)
+ (basename, ext) = os.path.splitext(modinfo)
+ generate(basename, lines)
+ print_post()
+
+if __name__ == "__main__":
+ main(sys.argv[1:])
diff --git a/include/qemu/module.h b/include/qemu/module.h
index 81ef086da023..a98748d501d3 100644
--- a/include/qemu/module.h
+++ b/include/qemu/module.h
@@ -98,4 +98,21 @@ void module_load_qom_all(void);
/* module registers QemuOpts <name> */
#define module_opts(name) modinfo(opts, name)
+/*
+ * module info database
+ *
+ * scripts/modinfo-generate.c will build this using the data collected
+ * by scripts/modinfo-collect.py
+ */
+typedef struct QemuModinfo QemuModinfo;
+struct QemuModinfo {
+ const char *name;
+ const char *arch;
+ const char **objs;
+ const char **deps;
+ const char **opts;
+};
+extern const QemuModinfo qemu_modinfo[];
+void module_init_info(const QemuModinfo *info);
+
#endif
diff --git a/softmmu/vl.c b/softmmu/vl.c
index feb4d201f30f..e001505d79f7 100644
--- a/softmmu/vl.c
+++ b/softmmu/vl.c
@@ -2740,6 +2740,10 @@ void qemu_init(int argc, char **argv, char **envp)
error_init(argv[0]);
qemu_init_exec_dir(argv[0]);
+#ifdef CONFIG_MODULES
+ module_init_info(qemu_modinfo);
+#endif
+
qemu_init_subsystems();
/* first pass of option parsing */
diff --git a/util/module.c b/util/module.c
index eee8ff2de136..8d3e8275b9f7 100644
--- a/util/module.c
+++ b/util/module.c
@@ -110,6 +110,17 @@ void module_call_init(module_init_type type)
}
#ifdef CONFIG_MODULES
+
+static const QemuModinfo module_info_stub[] = { {
+ /* end of list */
+} };
+static const QemuModinfo *module_info = module_info_stub;
+
+void module_init_info(const QemuModinfo *info)
+{
+ module_info = info;
+}
+
static int module_load_file(const char *fname, bool mayfail, bool
export_symbols)
{
GModule *g_module;
diff --git a/meson.build b/meson.build
index 30ca06c6c2d4..6ae2b9ab9443 100644
--- a/meson.build
+++ b/meson.build
@@ -2022,6 +2022,7 @@ subdir('tests/qtest/fuzz')
########################
modinfo_collect = find_program('scripts/modinfo-collect.py')
+modinfo_generate = find_program('scripts/modinfo-generate.py')
modinfo_files = []
block_mods = []
@@ -2047,7 +2048,6 @@ foreach d, list : modules
output: d + '-' + m + '.modinfo',
input: module_ss.sources(),
capture: true,
- build_by_default: true, # to be removed
when added to a target
command: [modinfo_collect, '@INPUT@'])
endif
else
@@ -2060,6 +2060,17 @@ foreach d, list : modules
endforeach
endforeach
+if enable_modules
+ modinfo_src = custom_target('modinfo.c',
+ output: 'modinfo.c',
+ input: modinfo_files,
+ command: [modinfo_generate, '@INPUT@'],
+ capture: true)
+ modinfo_lib = static_library('modinfo', modinfo_src)
+ modinfo_dep = declare_dependency(link_whole: modinfo_lib)
+ softmmu_ss.add(modinfo_dep)
+endif
+
nm = find_program('nm')
undefsym = find_program('scripts/undefsym.py')
block_syms = custom_target('block.syms', output: 'block.syms',
--
2.31.1
- [PATCH v4 00/34] modules: add meta-data database, Gerd Hoffmann, 2021/06/24
- [PATCH v4 01/34] modules: add modinfo macros, Gerd Hoffmann, 2021/06/24
- [PATCH v4 03/34] modules: generate modinfo.c,
Gerd Hoffmann <=
- [PATCH v4 04/34] modules: check if all dependencies can be satisfied, Gerd Hoffmann, 2021/06/24
- [PATCH v4 02/34] modules: collect module meta-data, Gerd Hoffmann, 2021/06/24
- [PATCH v4 05/34] modules: add qxl module annotations, Gerd Hoffmann, 2021/06/24
- [PATCH v4 07/34] modules: add chardev module annotations, Gerd Hoffmann, 2021/06/24
- [PATCH v4 06/34] modules: add virtio-gpu module annotations, Gerd Hoffmann, 2021/06/24
- [PATCH v4 09/34] modules: add usb-redir module annotations, Gerd Hoffmann, 2021/06/24
- [PATCH v4 08/34] modules: add audio module annotations, Gerd Hoffmann, 2021/06/24
- [PATCH v4 10/34] modules: add ccid module annotations, Gerd Hoffmann, 2021/06/24
- [PATCH v4 11/34] modules: add ui module annotations, Gerd Hoffmann, 2021/06/24
- [PATCH v4 12/34] modules: add s390x module annotations, Gerd Hoffmann, 2021/06/24