@@ -33,6 +33,9 @@ struct SplitAccelState {
AccelState *hw;
AccelState *sw;
+
+ char *hw_name;
+ char *sw_name;
};
#endif /* SPLIT_ACCEL_H */
@@ -8,13 +8,32 @@
#include "qemu/osdep.h"
#include "qemu/accel.h"
+#include "hw/boards.h"
+#include "accel/accel-internal.h"
#include "split-accel.h"
bool split_allowed;
static int split_accel_init_machine(MachineState *ms, AccelState *as)
{
- g_assert_not_reached();
+ SplitAccelState *sas = SPLIT_ACCEL(as);
+ AccelClass *hwc;
+ AccelClass *swc;
+
+ swc = accel_find(sas->sw_name);
+ accel_init_ops_interfaces(swc);
+ hwc = accel_find(sas->hw_name);
+ accel_init_ops_interfaces(hwc);
+
+ sas->sw = ACCEL(object_new_with_class(OBJECT_CLASS(swc)));
+ sas->hw = ACCEL(object_new_with_class(OBJECT_CLASS(hwc)));
+
+ accel_init_machine(sas->sw, ms);
+ accel_init_machine(sas->hw, ms);
+
+ ms->accelerator = as;
+
+ return 0;
}
static void split_setup_post(MachineState *ms, AccelState *accel)
@@ -59,6 +78,14 @@ static void split_get_stats(AccelState *as, GString *buf)
g_assert_not_reached();
}
+static void split_accel_instance_init(Object *obj)
+{
+ SplitAccelState *sas = SPLIT_ACCEL(obj);
+
+ sas->sw_name = g_strdup("tcg");
+ sas->hw_name = g_strdup("hvf");
+}
+
static void split_accel_class_init(ObjectClass *oc, const void *data)
{
AccelClass *ac = ACCEL_CLASS(oc);
@@ -79,6 +106,7 @@ static const TypeInfo split_accel_type = {
.name = TYPE_SPLIT_ACCEL,
.parent = TYPE_ACCEL,
.instance_size = sizeof(SplitAccelState),
+ .instance_init = split_accel_instance_init,
.class_size = sizeof(SplitAccelClass),
.class_init = split_accel_class_init,
};
Force to TCG + HVF for now. Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> --- accel/split/split-accel.h | 3 +++ accel/split/split-all.c | 30 +++++++++++++++++++++++++++++- 2 files changed, 32 insertions(+), 1 deletion(-)