mirror of
https://gitlab.com/qemu-project/qemu
synced 2024-11-05 20:35:44 +00:00
modules: misc fixes & tweaks.
modules: build spice chardevs as module. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iQIcBAABCgAGBQJfiEYvAAoJEEy22O7T6HE4i7MP/j1wCGxhNIR6GnKqLZf7Gvka Sx6rQDoKGh+OSVA5PRsc3pxCIt0taXjU9zkEbr+mDixoCfReUFLfjUncD0YHYc1o p430QpnJJwnt1Ked5OYrspY+vJTEEwVEP6TqMVLH9tEKbBwrSSgZyy40zWtUZVe4 Xjx2Z1HmjQ0vQXKwOE3GxSw/7xUgwh/NTSy2UKTACE35MXxBb9AqY4gCnoFjEdok vdbuHxcEdQZq0XU6bTAPBaTtBAMwdcGsc3gXyjOGwnpqL7FLO+AX2iNIpZ18efg2 u9qIEdFSpd9NcinamXaNSTqLMCNMR5il35aS1moHJsbP57/SX8iV0D+Zlnqqvgfn U5ulYddUVpJnbeoZnrWmt9B5urTaD3KXtYTgapnVaFeBsENPZXnFwZ8iY+Ko405A DfM345i/h2/0kiSaOYYaC1zXZUWwoGju7BM5+HzuD9uD7ET4IAiCGXWJP1c6C0G5 cxwP/PHgEOOleAmdptDFycQbtiszqcQBf7sXs6qmC4P56AaNJ9zrh4xAsm8zfFVq DF4aesPh71qZmkGVSycx+e1+kJO+ffeFbQjNkWDCnRuwC5w4KZEQQv3KByShESaB lsMVfnh6LeUw47aOom0cDt1WfIjaFG2MzIWvs3MIWZNPWelUn496LVkHbT9+KMX5 9cRNesEm1NyMFqIVLRi5 =UuQI -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/kraxel/tags/modules-20201015-pull-request' into staging modules: misc fixes & tweaks. modules: build spice chardevs as module. # gpg: Signature made Thu 15 Oct 2020 13:53:03 BST # gpg: using RSA key 4CB6D8EED3E87138 # gpg: Good signature from "Gerd Hoffmann (work) <kraxel@redhat.com>" [full] # gpg: aka "Gerd Hoffmann <gerd@kraxel.org>" [full] # gpg: aka "Gerd Hoffmann (private) <kraxel@gmail.com>" [full] # Primary key fingerprint: A032 8CFF B93A 17A7 9901 FE7D 4CB6 D8EE D3E8 7138 * remotes/kraxel/tags/modules-20201015-pull-request: chardev/spice: build spice chardevs as module meson: add spice dependency to core spice source files. meson: add spice_headers dependency. chardev/spice: simplify chardev setup chardev/spice: make qemu_chr_open_spice_port static ui/spice-app: don't use qemu_chr_open_spice_port directly modules: update qom object module comment module: silence errors for module_load_qom_all(). Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
6214addcc6
14 changed files with 68 additions and 70 deletions
|
@ -1,5 +1,5 @@
|
|||
softmmu_ss.add([spice_headers, files('audio.c')])
|
||||
softmmu_ss.add(files(
|
||||
'audio.c',
|
||||
'audio_legacy.c',
|
||||
'mixeng.c',
|
||||
'noaudio.c',
|
||||
|
|
|
@ -26,7 +26,6 @@ chardev_ss.add(when: 'CONFIG_WIN32', if_true: files(
|
|||
chardev_ss = chardev_ss.apply(config_host, strict: false)
|
||||
|
||||
softmmu_ss.add(files('chardev-sysemu.c', 'msmouse.c', 'wctablet.c', 'testdev.c'))
|
||||
softmmu_ss.add(when: ['CONFIG_SPICE', spice], if_true: files('spice.c'))
|
||||
|
||||
chardev_modules = {}
|
||||
|
||||
|
@ -36,4 +35,10 @@ if config_host.has_key('CONFIG_BRLAPI')
|
|||
chardev_modules += { 'baum': module_ss }
|
||||
endif
|
||||
|
||||
if config_host.has_key('CONFIG_SPICE')
|
||||
module_ss = ss.source_set()
|
||||
module_ss.add(when: [spice], if_true: files('spice.c'))
|
||||
chardev_modules += { 'spice': module_ss }
|
||||
endif
|
||||
|
||||
modules += { 'chardev': chardev_modules }
|
||||
|
|
|
@ -14,9 +14,6 @@ typedef struct SpiceCharSource {
|
|||
SpiceChardev *scd;
|
||||
} SpiceCharSource;
|
||||
|
||||
static QLIST_HEAD(, SpiceChardev) spice_chars =
|
||||
QLIST_HEAD_INITIALIZER(spice_chars);
|
||||
|
||||
static int vmc_write(SpiceCharDeviceInstance *sin, const uint8_t *buf, int len)
|
||||
{
|
||||
SpiceChardev *scd = container_of(sin, SpiceChardev, sin);
|
||||
|
@ -216,8 +213,6 @@ static void char_spice_finalize(Object *obj)
|
|||
|
||||
vmc_unregister_interface(s);
|
||||
|
||||
QLIST_SAFE_REMOVE(s, next);
|
||||
|
||||
g_free((char *)s->sin.subtype);
|
||||
g_free((char *)s->sin.portname);
|
||||
}
|
||||
|
@ -256,8 +251,6 @@ static void chr_open(Chardev *chr, const char *subtype)
|
|||
|
||||
s->active = false;
|
||||
s->sin.subtype = g_strdup(subtype);
|
||||
|
||||
QLIST_INSERT_HEAD(&spice_chars, s, next);
|
||||
}
|
||||
|
||||
static void qemu_chr_open_spice_vmc(Chardev *chr,
|
||||
|
@ -296,10 +289,10 @@ static void qemu_chr_open_spice_vmc(Chardev *chr,
|
|||
chr_open(chr, type);
|
||||
}
|
||||
|
||||
void qemu_chr_open_spice_port(Chardev *chr,
|
||||
ChardevBackend *backend,
|
||||
bool *be_opened,
|
||||
Error **errp)
|
||||
static void qemu_chr_open_spice_port(Chardev *chr,
|
||||
ChardevBackend *backend,
|
||||
bool *be_opened,
|
||||
Error **errp)
|
||||
{
|
||||
ChardevSpicePort *spiceport = backend->u.spiceport.data;
|
||||
const char *name = spiceport->fqdn;
|
||||
|
@ -310,28 +303,18 @@ void qemu_chr_open_spice_port(Chardev *chr,
|
|||
return;
|
||||
}
|
||||
|
||||
if (!using_spice) {
|
||||
error_setg(errp, "spice not enabled");
|
||||
return;
|
||||
}
|
||||
|
||||
chr_open(chr, "port");
|
||||
|
||||
*be_opened = false;
|
||||
s = SPICE_CHARDEV(chr);
|
||||
s->sin.portname = g_strdup(name);
|
||||
|
||||
if (using_spice) {
|
||||
/* spice server already created */
|
||||
vmc_register_interface(s);
|
||||
}
|
||||
}
|
||||
|
||||
void qemu_spice_register_ports(void)
|
||||
{
|
||||
SpiceChardev *s;
|
||||
|
||||
QLIST_FOREACH(s, &spice_chars, next) {
|
||||
if (s->sin.portname == NULL) {
|
||||
continue;
|
||||
}
|
||||
vmc_register_interface(s);
|
||||
}
|
||||
vmc_register_interface(s);
|
||||
}
|
||||
|
||||
static void qemu_chr_parse_spice_vmc(QemuOpts *opts, ChardevBackend *backend,
|
||||
|
|
|
@ -13,7 +13,6 @@ struct SpiceChardev {
|
|||
bool blocked;
|
||||
const uint8_t *datapos;
|
||||
int datalen;
|
||||
QLIST_ENTRY(SpiceChardev) next;
|
||||
};
|
||||
typedef struct SpiceChardev SpiceChardev;
|
||||
|
||||
|
@ -24,7 +23,4 @@ typedef struct SpiceChardev SpiceChardev;
|
|||
DECLARE_INSTANCE_CHECKER(SpiceChardev, SPICE_CHARDEV,
|
||||
TYPE_CHARDEV_SPICE)
|
||||
|
||||
void qemu_chr_open_spice_port(Chardev *chr, ChardevBackend *backend,
|
||||
bool *be_opened, Error **errp);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -61,15 +61,15 @@ typedef enum {
|
|||
#define fuzz_target_init(function) module_init(function, \
|
||||
MODULE_INIT_FUZZ_TARGET)
|
||||
#define migration_init(function) module_init(function, MODULE_INIT_MIGRATION)
|
||||
#define block_module_load_one(lib) module_load_one("block-", lib)
|
||||
#define ui_module_load_one(lib) module_load_one("ui-", lib)
|
||||
#define audio_module_load_one(lib) module_load_one("audio-", lib)
|
||||
#define block_module_load_one(lib) module_load_one("block-", lib, false)
|
||||
#define ui_module_load_one(lib) module_load_one("ui-", lib, false)
|
||||
#define audio_module_load_one(lib) module_load_one("audio-", lib, false)
|
||||
|
||||
void register_module_init(void (*fn)(void), module_init_type type);
|
||||
void register_dso_module_init(void (*fn)(void), module_init_type type);
|
||||
|
||||
void module_call_init(module_init_type type);
|
||||
bool module_load_one(const char *prefix, const char *lib_name);
|
||||
bool module_load_one(const char *prefix, const char *lib_name, bool mayfail);
|
||||
void module_load_qom_one(const char *type);
|
||||
void module_load_qom_all(void);
|
||||
|
||||
|
|
|
@ -45,7 +45,6 @@ int qemu_spice_migrate_info(const char *hostname, int port, int tls_port,
|
|||
#else
|
||||
#define SPICE_NEEDS_SET_MM_TIME 0
|
||||
#endif
|
||||
void qemu_spice_register_ports(void);
|
||||
|
||||
#else /* CONFIG_SPICE */
|
||||
|
||||
|
|
|
@ -321,9 +321,11 @@ if 'CONFIG_LIBJACK' in config_host
|
|||
jack = declare_dependency(link_args: config_host['JACK_LIBS'].split())
|
||||
endif
|
||||
spice = not_found
|
||||
spice_headers = not_found
|
||||
if 'CONFIG_SPICE' in config_host
|
||||
spice = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split(),
|
||||
link_args: config_host['SPICE_LIBS'].split())
|
||||
spice_headers = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split())
|
||||
endif
|
||||
rt = cc.find_library('rt', required: false)
|
||||
libdl = not_found
|
||||
|
|
|
@ -3,7 +3,7 @@ qmp_ss.add(files('monitor.c', 'qmp.c', 'qmp-cmds-control.c'))
|
|||
softmmu_ss.add(files(
|
||||
'hmp-cmds.c',
|
||||
'hmp.c',
|
||||
'qmp-cmds.c',
|
||||
))
|
||||
softmmu_ss.add([spice_headers, files('qmp-cmds.c')])
|
||||
|
||||
specific_ss.add(when: 'CONFIG_SOFTMMU', if_true: [files('misc.c'), spice])
|
||||
|
|
|
@ -757,7 +757,7 @@ static void qtest_process_command(CharBackend *chr, gchar **words)
|
|||
g_assert(words[1] && words[2]);
|
||||
|
||||
qtest_send_prefix(chr);
|
||||
if (module_load_one(words[1], words[2])) {
|
||||
if (module_load_one(words[1], words[2], false)) {
|
||||
qtest_sendf(chr, "OK\n");
|
||||
} else {
|
||||
qtest_sendf(chr, "FAIL\n");
|
||||
|
|
|
@ -4148,6 +4148,11 @@ void qemu_init(int argc, char **argv, char **envp)
|
|||
user_creatable_add_opts_foreach,
|
||||
object_create_initial, &error_fatal);
|
||||
|
||||
/* spice needs the timers to be initialized by this point */
|
||||
/* spice must initialize before audio as it changes the default auiodev */
|
||||
/* spice must initialize before chardevs (for spicevmc and spiceport) */
|
||||
qemu_spice_init();
|
||||
|
||||
qemu_opts_foreach(qemu_find_opts("chardev"),
|
||||
chardev_init_func, NULL, &error_fatal);
|
||||
|
||||
|
@ -4156,10 +4161,6 @@ void qemu_init(int argc, char **argv, char **envp)
|
|||
fsdev_init_func, NULL, &error_fatal);
|
||||
#endif
|
||||
|
||||
/* spice needs the timers to be initialized by this point */
|
||||
/* spice must initialize before audio as it changes the default auiodev */
|
||||
qemu_spice_init();
|
||||
|
||||
/*
|
||||
* Note: we need to create audio and block backends before
|
||||
* machine_set_property(), so machine properties can refer to
|
||||
|
|
|
@ -14,7 +14,7 @@ softmmu_ss.add(files(
|
|||
))
|
||||
|
||||
softmmu_ss.add(when: 'CONFIG_LINUX', if_true: files('input-linux.c'))
|
||||
softmmu_ss.add(when: 'CONFIG_SPICE', if_true: files('spice-core.c', 'spice-input.c', 'spice-display.c'))
|
||||
softmmu_ss.add(when: [spice, 'CONFIG_SPICE'], if_true: files('spice-core.c', 'spice-input.c', 'spice-display.c'))
|
||||
softmmu_ss.add(when: cocoa, if_true: files('cocoa.m'))
|
||||
|
||||
vnc_ss = ss.source_set()
|
||||
|
|
|
@ -44,11 +44,15 @@ static char *sock_path;
|
|||
struct VCChardev {
|
||||
SpiceChardev parent;
|
||||
};
|
||||
typedef struct VCChardev VCChardev;
|
||||
|
||||
struct VCChardevClass {
|
||||
ChardevClass parent;
|
||||
void (*parent_open)(Chardev *chr, ChardevBackend *backend,
|
||||
bool *be_opened, Error **errp);
|
||||
};
|
||||
|
||||
#define TYPE_CHARDEV_VC "chardev-vc"
|
||||
DECLARE_INSTANCE_CHECKER(VCChardev, VC_CHARDEV,
|
||||
TYPE_CHARDEV_VC)
|
||||
OBJECT_DECLARE_TYPE(VCChardev, VCChardevClass, CHARDEV_VC)
|
||||
|
||||
static ChardevBackend *
|
||||
chr_spice_backend_new(void)
|
||||
|
@ -66,6 +70,7 @@ static void vc_chr_open(Chardev *chr,
|
|||
bool *be_opened,
|
||||
Error **errp)
|
||||
{
|
||||
VCChardevClass *vc = CHARDEV_VC_GET_CLASS(chr);
|
||||
ChardevBackend *be;
|
||||
const char *fqdn = NULL;
|
||||
|
||||
|
@ -80,7 +85,7 @@ static void vc_chr_open(Chardev *chr,
|
|||
be = chr_spice_backend_new();
|
||||
be->u.spiceport.data->fqdn = fqdn ?
|
||||
g_strdup(fqdn) : g_strdup_printf("org.qemu.console.%s", chr->label);
|
||||
qemu_chr_open_spice_port(chr, be, be_opened, errp);
|
||||
vc->parent_open(chr, be, be_opened, errp);
|
||||
qapi_free_ChardevBackend(be);
|
||||
}
|
||||
|
||||
|
@ -91,8 +96,11 @@ static void vc_chr_set_echo(Chardev *chr, bool echo)
|
|||
|
||||
static void char_vc_class_init(ObjectClass *oc, void *data)
|
||||
{
|
||||
VCChardevClass *vc = CHARDEV_VC_CLASS(oc);
|
||||
ChardevClass *cc = CHARDEV_CLASS(oc);
|
||||
|
||||
vc->parent_open = cc->open;
|
||||
|
||||
cc->parse = qemu_chr_parse_vc;
|
||||
cc->open = vc_chr_open;
|
||||
cc->chr_set_echo = vc_chr_set_echo;
|
||||
|
@ -103,6 +111,7 @@ static const TypeInfo char_vc_type_info = {
|
|||
.parent = TYPE_CHARDEV_SPICEPORT,
|
||||
.instance_size = sizeof(VCChardev),
|
||||
.class_init = char_vc_class_init,
|
||||
.class_size = sizeof(VCChardevClass),
|
||||
};
|
||||
|
||||
static void spice_app_atexit(void)
|
||||
|
@ -120,7 +129,6 @@ static void spice_app_atexit(void)
|
|||
static void spice_app_display_early_init(DisplayOptions *opts)
|
||||
{
|
||||
QemuOpts *qopts;
|
||||
ChardevBackend *be = chr_spice_backend_new();
|
||||
GError *err = NULL;
|
||||
|
||||
if (opts->has_full_screen) {
|
||||
|
@ -165,6 +173,15 @@ static void spice_app_display_early_init(DisplayOptions *opts)
|
|||
qemu_opt_set(qopts, "gl", opts->has_gl ? "on" : "off", &error_abort);
|
||||
display_opengl = opts->has_gl;
|
||||
#endif
|
||||
}
|
||||
|
||||
static void spice_app_display_init(DisplayState *ds, DisplayOptions *opts)
|
||||
{
|
||||
ChardevBackend *be = chr_spice_backend_new();
|
||||
QemuOpts *qopts;
|
||||
GError *err = NULL;
|
||||
gchar *uri;
|
||||
|
||||
be->u.spiceport.data->fqdn = g_strdup("org.qemu.monitor.qmp.0");
|
||||
qemu_chardev_new("org.qemu.monitor.qmp", TYPE_CHARDEV_SPICEPORT,
|
||||
be, NULL, &error_abort);
|
||||
|
@ -174,13 +191,6 @@ static void spice_app_display_early_init(DisplayOptions *opts)
|
|||
qemu_opt_set(qopts, "mode", "control", &error_abort);
|
||||
|
||||
qapi_free_ChardevBackend(be);
|
||||
}
|
||||
|
||||
static void spice_app_display_init(DisplayState *ds, DisplayOptions *opts)
|
||||
{
|
||||
GError *err = NULL;
|
||||
gchar *uri;
|
||||
|
||||
uri = g_strjoin("", "spice+unix://", app_dir, "/", "spice.sock", NULL);
|
||||
info_report("Launching display with URI: %s", uri);
|
||||
g_app_info_launch_default_for_uri(uri, NULL, &err);
|
||||
|
|
|
@ -812,8 +812,6 @@ void qemu_spice_init(void)
|
|||
g_free(x509_cert_file);
|
||||
g_free(x509_cacert_file);
|
||||
|
||||
qemu_spice_register_ports();
|
||||
|
||||
#ifdef HAVE_SPICE_GL
|
||||
if (qemu_opt_get_bool(opts, "gl", 0)) {
|
||||
if ((port != 0) || (tls_port != 0)) {
|
||||
|
|
|
@ -110,7 +110,7 @@ void module_call_init(module_init_type type)
|
|||
}
|
||||
|
||||
#ifdef CONFIG_MODULES
|
||||
static int module_load_file(const char *fname)
|
||||
static int module_load_file(const char *fname, bool mayfail)
|
||||
{
|
||||
GModule *g_module;
|
||||
void (*sym)(void);
|
||||
|
@ -134,8 +134,10 @@ static int module_load_file(const char *fname)
|
|||
|
||||
g_module = g_module_open(fname, G_MODULE_BIND_LAZY | G_MODULE_BIND_LOCAL);
|
||||
if (!g_module) {
|
||||
fprintf(stderr, "Failed to open module: %s\n",
|
||||
g_module_error());
|
||||
if (!mayfail) {
|
||||
fprintf(stderr, "Failed to open module: %s\n",
|
||||
g_module_error());
|
||||
}
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
@ -167,7 +169,7 @@ out:
|
|||
}
|
||||
#endif
|
||||
|
||||
bool module_load_one(const char *prefix, const char *lib_name)
|
||||
bool module_load_one(const char *prefix, const char *lib_name, bool mayfail)
|
||||
{
|
||||
bool success = false;
|
||||
|
||||
|
@ -218,7 +220,7 @@ bool module_load_one(const char *prefix, const char *lib_name)
|
|||
for (i = 0; i < n_dirs; i++) {
|
||||
fname = g_strdup_printf("%s/%s%s",
|
||||
dirs[i], module_name, CONFIG_HOST_DSOSUF);
|
||||
ret = module_load_file(fname);
|
||||
ret = module_load_file(fname, mayfail);
|
||||
g_free(fname);
|
||||
fname = NULL;
|
||||
/* Try loading until loaded a module file */
|
||||
|
@ -248,8 +250,10 @@ bool module_load_one(const char *prefix, const char *lib_name)
|
|||
* only a very few devices & objects.
|
||||
*
|
||||
* So with the expectation that this will be rather the exception than
|
||||
* to rule and the list will not gain that many entries go with a
|
||||
* the rule and the list will not gain that many entries, go with a
|
||||
* simple manually maintained list for now.
|
||||
*
|
||||
* The list must be sorted by module (module_load_qom_all() needs this).
|
||||
*/
|
||||
static struct {
|
||||
const char *type;
|
||||
|
@ -264,6 +268,8 @@ static struct {
|
|||
{ "virtio-gpu-device", "hw-", "display-virtio-gpu" },
|
||||
{ "vhost-user-gpu", "hw-", "display-virtio-gpu" },
|
||||
{ "chardev-braille", "chardev-", "baum" },
|
||||
{ "chardev-spicevmc", "chardev-", "spice" },
|
||||
{ "chardev-spiceport", "chardev-", "spice" },
|
||||
};
|
||||
|
||||
static bool module_loaded_qom_all;
|
||||
|
@ -275,13 +281,11 @@ void module_load_qom_one(const char *type)
|
|||
if (!type) {
|
||||
return;
|
||||
}
|
||||
if (module_loaded_qom_all) {
|
||||
return;
|
||||
}
|
||||
for (i = 0; i < ARRAY_SIZE(qom_modules); i++) {
|
||||
if (strcmp(qom_modules[i].type, type) == 0) {
|
||||
module_load_one(qom_modules[i].prefix,
|
||||
qom_modules[i].module);
|
||||
qom_modules[i].module,
|
||||
false);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -302,7 +306,7 @@ void module_load_qom_all(void)
|
|||
/* one module implementing multiple types -> load only once */
|
||||
continue;
|
||||
}
|
||||
module_load_one(qom_modules[i].prefix, qom_modules[i].module);
|
||||
module_load_one(qom_modules[i].prefix, qom_modules[i].module, true);
|
||||
}
|
||||
module_loaded_qom_all = true;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue