summaryrefslogtreecommitdiffstats
path: root/plugins
diff options
context:
space:
mode:
authorAlex Bennée2019-11-04 14:18:36 +0100
committerAlex Bennée2019-11-12 15:32:55 +0100
commit3fb356cc86461a14450802e14fa79e8436dbbf31 (patch)
tree1fa66d329a0031fcdc7b7ac7117bdf921236a1d8 /plugins
parent.travis.yml: don't run make check with multiple jobs (diff)
downloadqemu-3fb356cc86461a14450802e14fa79e8436dbbf31.tar.gz
qemu-3fb356cc86461a14450802e14fa79e8436dbbf31.tar.xz
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')
-rw-r--r--plugins/loader.c21
-rw-r--r--plugins/plugin.h2
2 files changed, 23 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;
diff --git a/plugins/plugin.h b/plugins/plugin.h
index 5482168d79..1aa29dcadd 100644
--- a/plugins/plugin.h
+++ b/plugins/plugin.h
@@ -14,6 +14,8 @@
#include <gmodule.h>
+#define QEMU_PLUGIN_MIN_VERSION 0
+
/* global state */
struct qemu_plugin_state {
QTAILQ_HEAD(, qemu_plugin_ctx) ctxs;