diff options
author | Alex Bennée <alex.bennee@linaro.org> | 2019-11-04 13:18:36 +0000 |
---|---|---|
committer | Alex Bennée <alex.bennee@linaro.org> | 2019-11-12 14:32:55 +0000 |
commit | 3fb356cc86461a14450802e14fa79e8436dbbf31 (patch) | |
tree | 1fa66d329a0031fcdc7b7ac7117bdf921236a1d8 /plugins | |
parent | 05273a43af5f9e71152ad1b877bc3a898857e989 (diff) | |
download | qemu-3fb356cc86461a14450802e14fa79e8436dbbf31.zip qemu-3fb356cc86461a14450802e14fa79e8436dbbf31.tar.gz qemu-3fb356cc86461a14450802e14fa79e8436dbbf31.tar.bz2 |
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.c | 21 | ||||
-rw-r--r-- | plugins/plugin.h | 2 |
2 files changed, 23 insertions, 0 deletions
diff --git a/plugins/loader.c b/plugins/loader.c index ce724ed..15fc7e5 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 5482168..1aa29dc 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; |