From: Eduardo Habkost <ehabk...@redhat.com> Reviewed-by: Paolo Bonzini <pbonz...@redhat.com> Signed-off-by: Eduardo Habkost <ehabk...@redhat.com> Signed-off-by: Paolo Bonzini <pbonz...@redhat.com> --- Makefile.objs | 1 + accel.c | 113 +++++++++++++++++++++++++++++++++++++++++++++++++ include/sysemu/accel.h | 32 ++++++++++++++ vl.c | 81 +---------------------------------- 4 files changed, 147 insertions(+), 80 deletions(-) create mode 100644 accel.c create mode 100644 include/sysemu/accel.h
diff --git a/Makefile.objs b/Makefile.objs index 97db978..add8375 100644 --- a/Makefile.objs +++ b/Makefile.objs @@ -62,6 +62,7 @@ common-obj-$(CONFIG_SPICE) += spice-qemu-char.o common-obj-y += audio/ common-obj-y += hw/ +common-obj-y += accel.o common-obj-y += ui/ common-obj-y += bt-host.o bt-vhci.o diff --git a/accel.c b/accel.c new file mode 100644 index 0000000..9424796 --- /dev/null +++ b/accel.c @@ -0,0 +1,113 @@ +/* + * QEMU System Emulator, accelerator interfaces + * + * Copyright (c) 2003-2008 Fabrice Bellard + * Copyright (c) 2014 Red Hat Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "sysemu/accel.h" +#include "qemu-common.h" +#include "sysemu/arch_init.h" +#include "sysemu/sysemu.h" +#include "sysemu/kvm.h" +#include "sysemu/qtest.h" +#include "hw/xen/xen.h" + +int tcg_tb_size; +static bool tcg_allowed = true; + +static int tcg_init(MachineClass *mc) +{ + tcg_exec_init(tcg_tb_size * 1024 * 1024); + return 0; +} + +static struct { + const char *opt_name; + const char *name; + int (*available)(void); + int (*init)(MachineClass *mc); + bool *allowed; +} accel_list[] = { + { "tcg", "tcg", tcg_available, tcg_init, &tcg_allowed }, + { "xen", "Xen", xen_available, xen_init, &xen_allowed }, + { "kvm", "KVM", kvm_available, kvm_init, &kvm_allowed }, + { "qtest", "QTest", qtest_available, qtest_init_accel, &qtest_allowed }, +}; + +int configure_accelerator(MachineClass *mc) +{ + const char *p; + char buf[10]; + int i, ret; + bool accel_initialised = false; + bool init_failed = false; + + p = qemu_opt_get(qemu_get_machine_opts(), "accel"); + if (p == NULL) { + /* Use the default "accelerator", tcg */ + p = "tcg"; + } + + while (!accel_initialised && *p != '\0') { + if (*p == ':') { + p++; + } + p = get_opt_name(buf, sizeof(buf), p, ':'); + for (i = 0; i < ARRAY_SIZE(accel_list); i++) { + if (strcmp(accel_list[i].opt_name, buf) == 0) { + if (!accel_list[i].available()) { + printf("%s not supported for this target\n", + accel_list[i].name); + break; + } + *(accel_list[i].allowed) = true; + ret = accel_list[i].init(mc); + if (ret < 0) { + init_failed = true; + fprintf(stderr, "failed to initialize %s: %s\n", + accel_list[i].name, + strerror(-ret)); + *(accel_list[i].allowed) = false; + } else { + accel_initialised = true; + } + break; + } + } + if (i == ARRAY_SIZE(accel_list)) { + fprintf(stderr, "\"%s\" accelerator does not exist.\n", buf); + } + } + + if (!accel_initialised) { + if (!init_failed) { + fprintf(stderr, "No accelerator found!\n"); + } + exit(1); + } + + if (init_failed) { + fprintf(stderr, "Back to %s accelerator.\n", accel_list[i].name); + } + + return !accel_initialised; +} diff --git a/include/sysemu/accel.h b/include/sysemu/accel.h new file mode 100644 index 0000000..5537d74 --- /dev/null +++ b/include/sysemu/accel.h @@ -0,0 +1,32 @@ +/* QEMU accelerator interfaces + * + * Copyright (c) 2014 Red Hat Inc + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#ifndef HW_ACCEL_H +#define HW_ACCEL_H + +#include "qemu/typedefs.h" + +extern int tcg_tb_size; + +int configure_accelerator(MachineClass *mc); + +#endif diff --git a/vl.c b/vl.c index 72436cd..c3def21 100644 --- a/vl.c +++ b/vl.c @@ -61,6 +61,7 @@ int main(int argc, char **argv) #include "qemu/sockets.h" #include "hw/hw.h" #include "hw/boards.h" +#include "sysemu/accel.h" #include "hw/usb.h" #include "hw/pcmcia.h" #include "hw/i386/pc.h" @@ -213,11 +214,9 @@ static NotifierList exit_notifiers = static NotifierList machine_init_done_notifiers = NOTIFIER_LIST_INITIALIZER(machine_init_done_notifiers); -static bool tcg_allowed = true; bool xen_allowed; uint32_t xen_domid; enum xen_mode xen_mode = XEN_EMULATE; -static int tcg_tb_size; static int has_defaults = 1; static int default_serial = 1; @@ -2675,84 +2674,6 @@ static MachineClass *machine_parse(const char *name) exit(!name || !is_help_option(name)); } -static int tcg_init(MachineClass *mc) -{ - tcg_exec_init(tcg_tb_size * 1024 * 1024); - return 0; -} - -static struct { - const char *opt_name; - const char *name; - int (*available)(void); - int (*init)(MachineClass *mc); - bool *allowed; -} accel_list[] = { - { "tcg", "tcg", tcg_available, tcg_init, &tcg_allowed }, - { "xen", "Xen", xen_available, xen_init, &xen_allowed }, - { "kvm", "KVM", kvm_available, kvm_init, &kvm_allowed }, - { "qtest", "QTest", qtest_available, qtest_init_accel, &qtest_allowed }, -}; - -static int configure_accelerator(MachineClass *mc) -{ - const char *p; - char buf[10]; - int i, ret; - bool accel_initialised = false; - bool init_failed = false; - - p = qemu_opt_get(qemu_get_machine_opts(), "accel"); - if (p == NULL) { - /* Use the default "accelerator", tcg */ - p = "tcg"; - } - - while (!accel_initialised && *p != '\0') { - if (*p == ':') { - p++; - } - p = get_opt_name(buf, sizeof(buf), p, ':'); - for (i = 0; i < ARRAY_SIZE(accel_list); i++) { - if (strcmp(accel_list[i].opt_name, buf) == 0) { - if (!accel_list[i].available()) { - printf("%s not supported for this target\n", - accel_list[i].name); - break; - } - *(accel_list[i].allowed) = true; - ret = accel_list[i].init(mc); - if (ret < 0) { - init_failed = true; - fprintf(stderr, "failed to initialize %s: %s\n", - accel_list[i].name, - strerror(-ret)); - *(accel_list[i].allowed) = false; - } else { - accel_initialised = true; - } - break; - } - } - if (i == ARRAY_SIZE(accel_list)) { - fprintf(stderr, "\"%s\" accelerator does not exist.\n", buf); - } - } - - if (!accel_initialised) { - if (!init_failed) { - fprintf(stderr, "No accelerator found!\n"); - } - exit(1); - } - - if (init_failed) { - fprintf(stderr, "Back to %s accelerator.\n", accel_list[i].name); - } - - return !accel_initialised; -} - void qemu_add_exit_notifier(Notifier *notify) { notifier_list_add(&exit_notifiers, notify); -- 1.8.3.1