* 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"
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;
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];
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;
}
if (init_failed) {
fprintf(stderr, "Back to %s accelerator.\n", acc->name);
}
-
- return !accel_initialised;
}
{
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;
}
.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 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(&qtest_accel_type);
}
type_init(register_accel_types);