summary refs log tree commit diff stats
path: root/plugins/loader.c
diff options
context:
space:
mode:
authorAlex Bennée <alex.bennee@linaro.org>2019-11-04 13:18:36 +0000
committerAlex Bennée <alex.bennee@linaro.org>2019-11-12 14:32:55 +0000
commit3fb356cc86461a14450802e14fa79e8436dbbf31 (patch)
tree1fa66d329a0031fcdc7b7ac7117bdf921236a1d8 /plugins/loader.c
parent05273a43af5f9e71152ad1b877bc3a898857e989 (diff)
downloadfocaccia-qemu-3fb356cc86461a14450802e14fa79e8436dbbf31.tar.gz
focaccia-qemu-3fb356cc86461a14450802e14fa79e8436dbbf31.zip
tcg plugins: expose an API version concept
This is a very simple versioning API which allows the plugin
infrastructure to check the API a plugin was built against. We also
expose a min/cur API version to the plugin via the info block in case
it wants to avoid using old deprecated APIs in the future.

Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Robert Foley <robert.foley@linaro.org>
Diffstat (limited to 'plugins/loader.c')
-rw-r--r--plugins/loader.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/plugins/loader.c b/plugins/loader.c
index ce724ed583..15fc7e5515 100644
--- a/plugins/loader.c
+++ b/plugins/loader.c
@@ -178,6 +178,25 @@ static int plugin_load(struct qemu_plugin_desc *desc, const qemu_info_t *info)
         goto err_symbol;
     }
 
+    if (!g_module_symbol(ctx->handle, "qemu_plugin_version", &sym)) {
+        error_report("TCG plugin %s does not declare API version %s",
+                     desc->path, g_module_error());
+        goto err_symbol;
+    } else {
+        int version = *(int *)sym;
+        if (version < QEMU_PLUGIN_MIN_VERSION) {
+            error_report("TCG plugin %s requires API version %d, but "
+                         "this QEMU supports only a minimum version of %d",
+                         desc->path, version, QEMU_PLUGIN_MIN_VERSION);
+            goto err_symbol;
+        } else if (version > QEMU_PLUGIN_VERSION) {
+            error_report("TCG plugin %s requires API version %d, but "
+                         "this QEMU supports only up to version %d",
+                         desc->path, version, QEMU_PLUGIN_VERSION);
+            goto err_symbol;
+        }
+    }
+
     qemu_rec_mutex_lock(&plugin.lock);
 
     /* find an unused random id with &ctx as the seed */
@@ -248,6 +267,8 @@ int qemu_plugin_load_list(QemuPluginList *head)
     g_autofree qemu_info_t *info = g_new0(qemu_info_t, 1);
 
     info->target_name = TARGET_NAME;
+    info->version.min = QEMU_PLUGIN_MIN_VERSION;
+    info->version.cur = QEMU_PLUGIN_VERSION;
 #ifndef CONFIG_USER_ONLY
     MachineState *ms = MACHINE(qdev_get_machine());
     info->system_emulation = true;