Skip to content

Commit

Permalink
accel: Use QOM classes for accel types
Browse files Browse the repository at this point in the history
Instead of having a static AccelType array, register a class for each
accelerator type, and use class name lookup to find accelerator
information.

Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
  • Loading branch information
ehabkost authored and bonzini committed Oct 4, 2014
1 parent a224655 commit b14a0b7
Show file tree
Hide file tree
Showing 2 changed files with 123 additions and 24 deletions.
117 changes: 93 additions & 24 deletions accel.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
#include "sysemu/kvm.h"
#include "sysemu/qtest.h"
#include "hw/xen/xen.h"
#include "qom/object.h"

int tcg_tb_size;
static bool tcg_allowed = true;
Expand All @@ -40,32 +41,20 @@ static int tcg_init(MachineClass *mc)
return 0;
}

typedef struct AccelType {
const char *opt_name;
const char *name;
int (*available)(void);
int (*init)(MachineClass *mc);
bool *allowed;
} AccelType;

static AccelType 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 const TypeInfo accel_type = {
.name = TYPE_ACCEL,
.parent = TYPE_OBJECT,
.class_size = sizeof(AccelClass),
.instance_size = sizeof(AccelState),
};

/* Lookup AccelType from opt_name. Returns NULL if not found */
static AccelType *accel_find(const char *opt_name)
/* Lookup AccelClass from opt_name. Returns NULL if not found */
static AccelClass *accel_find(const char *opt_name)
{
int i;
for (i = 0; i < ARRAY_SIZE(accel_list); i++) {
AccelType *acc = &accel_list[i];
if (acc->opt_name && strcmp(acc->opt_name, opt_name) == 0) {
return acc;
}
}
return NULL;
char *class_name = g_strdup_printf(ACCEL_CLASS_NAME("%s"), opt_name);
AccelClass *ac = ACCEL_CLASS(object_class_by_name(class_name));
g_free(class_name);
return ac;
}

int configure_accelerator(MachineClass *mc)
Expand All @@ -75,7 +64,7 @@ int configure_accelerator(MachineClass *mc)
int ret;
bool accel_initialised = false;
bool init_failed = false;
AccelType *acc = NULL;
AccelClass *acc = NULL;

p = qemu_opt_get(qemu_get_machine_opts(), "accel");
if (p == NULL) {
Expand Down Expand Up @@ -124,3 +113,83 @@ int configure_accelerator(MachineClass *mc)

return !accel_initialised;
}


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->allowed = &tcg_allowed;
}

#define TYPE_TCG_ACCEL ACCEL_CLASS_NAME("tcg")

static const TypeInfo tcg_accel_type = {
.name = TYPE_TCG_ACCEL,
.parent = TYPE_ACCEL,
.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);
30 changes: 30 additions & 0 deletions include/sysemu/accel.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,36 @@
#define HW_ACCEL_H

#include "qemu/typedefs.h"
#include "qom/object.h"

typedef struct AccelState {
/*< private >*/
Object parent_obj;
} AccelState;

typedef struct AccelClass {
/*< private >*/
ObjectClass parent_class;
/*< public >*/

const char *opt_name;
const char *name;
int (*available)(void);
int (*init)(MachineClass *mc);
bool *allowed;
} AccelClass;

#define TYPE_ACCEL "accel"

#define ACCEL_CLASS_SUFFIX "-" TYPE_ACCEL
#define ACCEL_CLASS_NAME(a) (a ACCEL_CLASS_SUFFIX)

#define ACCEL_CLASS(klass) \
OBJECT_CLASS_CHECK(AccelClass, (klass), TYPE_ACCEL)
#define ACCEL(obj) \
OBJECT_CHECK(AccelState, (obj), TYPE_ACCEL)
#define ACCEL_GET_CLASS(obj) \
OBJECT_GET_CLASS(AccelClass, (obj), TYPE_ACCEL)

extern int tcg_tb_size;

Expand Down

0 comments on commit b14a0b7

Please sign in to comment.