diff options
author | Alex Bennée | 2019-11-04 14:18:36 +0100 |
---|---|---|
committer | Alex Bennée | 2019-11-12 15:32:55 +0100 |
commit | 3fb356cc86461a14450802e14fa79e8436dbbf31 (patch) | |
tree | 1fa66d329a0031fcdc7b7ac7117bdf921236a1d8 /plugins | |
parent | .travis.yml: don't run make check with multiple jobs (diff) | |
download | qemu-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.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 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; |