qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: qemu-devel@nongnu.org
Cc: Gerd Hoffmann <kraxel@redhat.com>, "Jose R . Ziviani" <jziviani@suse.de>
Subject: [PULL 07/48] modules: generate modinfo.c
Date: Thu,  8 Jul 2021 17:17:07 +0200	[thread overview]
Message-ID: <20210708151748.408754-8-pbonzini@redhat.com> (raw)
In-Reply-To: <20210708151748.408754-1-pbonzini@redhat.com>

From: Gerd Hoffmann <kraxel@redhat.com>

Add script to generate C source with a small
database containing the module meta-data.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Reviewed-by: Jose R. Ziviani <jziviani@suse.de>
Message-Id: <20210624103836.2382472-4-kraxel@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 include/qemu/module.h       | 17 ++++++++
 meson.build                 | 13 +++++-
 scripts/modinfo-generate.py | 84 +++++++++++++++++++++++++++++++++++++
 softmmu/vl.c                |  4 ++
 util/module.c               | 11 +++++
 5 files changed, 128 insertions(+), 1 deletion(-)
 create mode 100755 scripts/modinfo-generate.py

diff --git a/include/qemu/module.h b/include/qemu/module.h
index 81ef086da0..a98748d501 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/meson.build b/meson.build
index ff580f1f80..7b827f7caa 100644
--- a/meson.build
+++ b/meson.build
@@ -2242,6 +2242,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 = []
@@ -2267,7 +2268,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
@@ -2280,6 +2280,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',
diff --git a/scripts/modinfo-generate.py b/scripts/modinfo-generate.py
new file mode 100755
index 0000000000..a6d98a6bc4
--- /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/softmmu/vl.c b/softmmu/vl.c
index a50c8575a1..7cef3423a7 100644
--- a/softmmu/vl.c
+++ b/softmmu/vl.c
@@ -2755,6 +2755,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 eee8ff2de1..8d3e8275b9 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;
-- 
2.31.1




  parent reply	other threads:[~2021-07-08 15:21 UTC|newest]

Thread overview: 54+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-07-08 15:17 [PULL 00/48] Misc patches for QEMU 6.1 soft freeze Paolo Bonzini
2021-07-08 15:17 ` [PULL 01/48] configure: fix libdaxctl options Paolo Bonzini
2021-07-08 15:17 ` [PULL 02/48] configure: fix libpmem configuration option Paolo Bonzini
2021-07-08 15:17 ` [PULL 03/48] meson: fix missing preprocessor symbols Paolo Bonzini
2021-07-08 15:17 ` [PULL 04/48] osdep: fix HAVE_BROKEN_SIZE_MAX case Paolo Bonzini
2021-07-08 15:17 ` [PULL 05/48] modules: add modinfo macros Paolo Bonzini
2021-07-08 15:17 ` [PULL 06/48] modules: collect module meta-data Paolo Bonzini
2021-07-08 15:17 ` Paolo Bonzini [this message]
2021-07-08 15:17 ` [PULL 08/48] modules: check if all dependencies can be satisfied Paolo Bonzini
2021-07-08 15:17 ` [PULL 09/48] modules: add qxl module annotations Paolo Bonzini
2021-07-08 15:17 ` [PULL 10/48] modules: add virtio-gpu " Paolo Bonzini
2021-07-08 15:17 ` [PULL 11/48] modules: add chardev " Paolo Bonzini
2021-07-08 15:17 ` [PULL 12/48] modules: add audio " Paolo Bonzini
2021-07-08 15:17 ` [PULL 13/48] modules: add usb-redir " Paolo Bonzini
2021-07-08 15:17 ` [PULL 14/48] modules: add ccid " Paolo Bonzini
2021-07-08 15:17 ` [PULL 15/48] modules: add ui " Paolo Bonzini
2021-07-08 15:17 ` [PULL 16/48] modules: add s390x " Paolo Bonzini
2021-07-08 15:17 ` [PULL 17/48] modules: add block " Paolo Bonzini
2021-07-08 15:17 ` [PULL 18/48] modules: use modinfo for dependencies Paolo Bonzini
2021-07-08 15:17 ` [PULL 19/48] modules: use modinfo for qom load Paolo Bonzini
2021-07-08 15:17 ` [PULL 20/48] modules: use modinfo for qemu opts load Paolo Bonzini
2021-07-08 15:17 ` [PULL 21/48] modules: add tracepoints Paolo Bonzini
2021-07-08 15:17 ` [PULL 22/48] modules: check arch and block load on mismatch Paolo Bonzini
2021-07-08 15:17 ` [PULL 23/48] modules: check arch on qom lookup Paolo Bonzini
2021-07-08 15:17 ` [PULL 24/48] modules: target-specific module build infrastructure Paolo Bonzini
2021-07-08 15:17 ` [PULL 25/48] modules: add documentation for module sourcesets Paolo Bonzini
2021-07-08 15:17 ` [PULL 26/48] modules: add module_obj() note to QOM docs Paolo Bonzini
2021-07-08 15:17 ` [PULL 27/48] modules: module.h kerneldoc annotations Paolo Bonzini
2021-07-08 15:17 ` [PULL 28/48] modules: hook up modules.h to docs build Paolo Bonzini
2021-07-08 15:17 ` [PULL 29/48] accel: autoload modules Paolo Bonzini
2021-07-08 15:17 ` [PULL 30/48] accel: add qtest module annotations Paolo Bonzini
2021-07-08 15:17 ` [PULL 31/48] accel: build qtest modular Paolo Bonzini
2021-07-08 15:17 ` [PULL 32/48] accel: add tcg module annotations Paolo Bonzini
2021-07-08 15:17 ` [PULL 33/48] accel: build tcg modular Paolo Bonzini
2021-07-08 15:17 ` [PULL 34/48] monitor: allow register hmp commands Paolo Bonzini
2021-07-08 15:17 ` [PULL 35/48] usb: drop usb_host_dev_is_scsi_storage hook Paolo Bonzini
2021-07-08 15:17 ` [PULL 36/48] monitor/usb: register 'info usbhost' dynamically Paolo Bonzini
2021-07-08 15:17 ` [PULL 37/48] usb: build usb-host as module Paolo Bonzini
2021-07-22 14:10   ` Peter Krempa
2021-07-23  6:18     ` Gerd Hoffmann
2021-07-08 15:17 ` [PULL 38/48] monitor/tcg: move tcg hmp commands to accel/tcg, register them dynamically Paolo Bonzini
2021-07-08 15:17 ` [PULL 39/48] target/i386: Added MSRPM and IOPM size check Paolo Bonzini
2021-07-08 15:17 ` [PULL 40/48] target/i386: Added DR6 and DR7 consistency checks Paolo Bonzini
2021-07-08 15:17 ` [PULL 41/48] target/i386: fix exceptions for MOV to DR Paolo Bonzini
2021-07-08 15:17 ` [PULL 42/48] vl: fix leak of qdict_crumple return value Paolo Bonzini
2021-07-08 15:17 ` [PULL 43/48] meson: switch function tests from compilation to linking Paolo Bonzini
2021-07-08 15:17 ` [PULL 44/48] meson: Introduce target-specific Kconfig Paolo Bonzini
2021-07-17 22:59   ` Peter Maydell
2021-07-19 19:15     ` Peter Maydell
2021-07-08 15:17 ` [PULL 45/48] hw/arm: add dependency on OR_IRQ for XLNX_VERSAL Paolo Bonzini
2021-07-08 15:17 ` [PULL 46/48] hw/arm: move CONFIG_V7M out of default-devices Paolo Bonzini
2021-07-08 15:17 ` [PULL 47/48] configs: rename default-configs to configs and reorganise Paolo Bonzini
2021-07-08 15:17 ` [PULL 48/48] configure: allow the selection of alternate config in the build Paolo Bonzini
2021-07-09 15:45 ` [PULL 00/48] Misc patches for QEMU 6.1 soft freeze Peter Maydell

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210708151748.408754-8-pbonzini@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=jziviani@suse.de \
    --cc=kraxel@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).