X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=accel.c;h=664bb88422a4babeaaa47416d64e8bba6f143172;hb=f9e46d37bd19b4f3faaedb78a48c53d02ee4197e;hp=0f3fceeb7c9d7666afa890881bd9ead8be854376;hpb=32592e112fc9da1e4f6b48896e6473c49043d5dd;p=mirror_qemu.git diff --git a/accel.c b/accel.c index 0f3fceeb7c..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]; @@ -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,7 +134,7 @@ static void tcg_accel_class_init(ObjectClass *oc, void *data) { AccelClass *ac = ACCEL_CLASS(oc); ac->name = "tcg"; - ac->init = tcg_init; + ac->init_machine = tcg_init; ac->allowed = &tcg_allowed; }