X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=accel.c;h=664bb88422a4babeaaa47416d64e8bba6f143172;hb=a2f80fdfc683019901cdf4c0863a5920c0ca7245;hp=85177f1b52dc4a457a634c7fdd65948eecf640a5;hpb=f6dfb83547d0cf5aa938cce391ba33c32a97bed9;p=mirror_qemu.git diff --git a/accel.c b/accel.c index 85177f1b52..664bb88422 100644 --- a/accel.c +++ b/accel.c @@ -23,7 +23,9 @@ * THE SOFTWARE. */ +#include "qemu/osdep.h" #include "sysemu/accel.h" +#include "hw/boards.h" #include "qemu-common.h" #include "sysemu/arch_init.h" #include "sysemu/sysemu.h" @@ -35,7 +37,7 @@ int tcg_tb_size; static bool tcg_allowed = true; -static int tcg_init(MachineClass *mc) +static int tcg_init(MachineState *ms) { tcg_exec_init(tcg_tb_size * 1024 * 1024); return 0; @@ -57,7 +59,24 @@ static AccelClass *accel_find(const char *opt_name) return ac; } -int configure_accelerator(MachineClass *mc) +static int accel_init_machine(AccelClass *acc, MachineState *ms) +{ + ObjectClass *oc = OBJECT_CLASS(acc); + const char *cname = object_class_get_name(oc); + AccelState *accel = ACCEL(object_new(cname)); + int ret; + ms->accelerator = accel; + *(acc->allowed) = true; + ret = acc->init_machine(ms); + if (ret < 0) { + ms->accelerator = NULL; + *(acc->allowed) = false; + object_unref(OBJECT(accel)); + } + return ret; +} + +void configure_accelerator(MachineState *ms) { const char *p; char buf[10]; @@ -79,7 +98,7 @@ int configure_accelerator(MachineClass *mc) p = get_opt_name(buf, sizeof(buf), p, ':'); acc = accel_find(buf); if (!acc) { - fprintf(stderr, "\"%s\" accelerator does not exist.\n", buf); + fprintf(stderr, "\"%s\" accelerator not found.\n", buf); continue; } if (acc->available && !acc->available()) { @@ -87,14 +106,12 @@ int configure_accelerator(MachineClass *mc) acc->name); continue; } - *(acc->allowed) = true; - ret = acc->init(mc); + ret = accel_init_machine(acc, ms); if (ret < 0) { init_failed = true; fprintf(stderr, "failed to initialize %s: %s\n", acc->name, strerror(-ret)); - *(acc->allowed) = false; } else { accel_initialised = true; } @@ -110,8 +127,6 @@ int configure_accelerator(MachineClass *mc) if (init_failed) { fprintf(stderr, "Back to %s accelerator.\n", acc->name); } - - return !accel_initialised; } @@ -119,8 +134,7 @@ static void tcg_accel_class_init(ObjectClass *oc, void *data) { AccelClass *ac = ACCEL_CLASS(oc); ac->name = "tcg"; - ac->available = tcg_available; - ac->init = tcg_init; + ac->init_machine = tcg_init; ac->allowed = &tcg_allowed; } @@ -132,64 +146,10 @@ static const TypeInfo tcg_accel_type = { .class_init = tcg_accel_class_init, }; -static void xen_accel_class_init(ObjectClass *oc, void *data) -{ - AccelClass *ac = ACCEL_CLASS(oc); - ac->name = "Xen"; - ac->available = xen_available; - ac->init = xen_init; - ac->allowed = &xen_allowed; -} - -#define TYPE_XEN_ACCEL ACCEL_CLASS_NAME("xen") - -static const TypeInfo xen_accel_type = { - .name = TYPE_XEN_ACCEL, - .parent = TYPE_ACCEL, - .class_init = xen_accel_class_init, -}; - -static void kvm_accel_class_init(ObjectClass *oc, void *data) -{ - AccelClass *ac = ACCEL_CLASS(oc); - ac->name = "KVM"; - ac->available = kvm_available; - ac->init = kvm_init; - ac->allowed = &kvm_allowed; -} - -#define TYPE_KVM_ACCEL ACCEL_CLASS_NAME("kvm") - -static const TypeInfo kvm_accel_type = { - .name = TYPE_KVM_ACCEL, - .parent = TYPE_ACCEL, - .class_init = kvm_accel_class_init, -}; - -static void qtest_accel_class_init(ObjectClass *oc, void *data) -{ - AccelClass *ac = ACCEL_CLASS(oc); - ac->name = "QTest"; - ac->available = qtest_available; - ac->init = qtest_init_accel; - ac->allowed = &qtest_allowed; -} - -#define TYPE_QTEST_ACCEL ACCEL_CLASS_NAME("qtest") - -static const TypeInfo qtest_accel_type = { - .name = TYPE_QTEST_ACCEL, - .parent = TYPE_ACCEL, - .class_init = qtest_accel_class_init, -}; - static void register_accel_types(void) { type_register_static(&accel_type); type_register_static(&tcg_accel_type); - type_register_static(&xen_accel_type); - type_register_static(&kvm_accel_type); - type_register_static(&qtest_accel_type); } type_init(register_accel_types);