diff options
Diffstat (limited to 'qom')
| -rw-r--r-- | qom/cpu.c | 14 | ||||
| -rw-r--r-- | qom/object.c | 10 | ||||
| -rw-r--r-- | qom/object_interfaces.c | 78 |
3 files changed, 42 insertions, 60 deletions
diff --git a/qom/cpu.c b/qom/cpu.c index 03d9190f8c..7f575879f6 100644 --- a/qom/cpu.c +++ b/qom/cpu.c @@ -22,7 +22,7 @@ #include "qapi/error.h" #include "qemu-common.h" #include "qom/cpu.h" -#include "sysemu/kvm.h" +#include "sysemu/hw_accel.h" #include "qemu/notify.h" #include "qemu/log.h" #include "exec/log.h" @@ -270,8 +270,14 @@ static void cpu_common_reset(CPUState *cpu) cpu->exception_index = -1; cpu->crash_occurred = false; - for (i = 0; i < TB_JMP_CACHE_SIZE; ++i) { - atomic_set(&cpu->tb_jmp_cache[i], NULL); + if (tcg_enabled()) { + for (i = 0; i < TB_JMP_CACHE_SIZE; ++i) { + atomic_set(&cpu->tb_jmp_cache[i], NULL); + } + +#ifdef CONFIG_SOFTMMU + tlb_flush(cpu, 0); +#endif } } @@ -348,6 +354,8 @@ static void cpu_common_realizefn(DeviceState *dev, Error **errp) static void cpu_common_unrealizefn(DeviceState *dev, Error **errp) { CPUState *cpu = CPU(dev); + /* NOTE: latest generic point before the cpu is fully unrealized */ + trace_fini_vcpu(cpu); cpu_exec_unrealizefn(cpu); } diff --git a/qom/object.c b/qom/object.c index 7a05e35ed9..eb4bc924ff 100644 --- a/qom/object.c +++ b/qom/object.c @@ -272,6 +272,12 @@ static void type_initialize(TypeImpl *ti) ti->class_size = type_class_get_size(ti); ti->instance_size = type_object_get_size(ti); + /* Any type with zero instance_size is implicitly abstract. + * This means interface types are all abstract. + */ + if (ti->instance_size == 0) { + ti->abstract = true; + } ti->class = g_malloc0(ti->class_size); @@ -351,7 +357,7 @@ static void object_post_init_with_type(Object *obj, TypeImpl *ti) } } -void object_initialize_with_type(void *data, size_t size, TypeImpl *type) +static void object_initialize_with_type(void *data, size_t size, TypeImpl *type) { Object *obj = data; @@ -467,7 +473,7 @@ static void object_finalize(void *data) } } -Object *object_new_with_type(Type type) +static Object *object_new_with_type(Type type) { Object *obj; diff --git a/qom/object_interfaces.c b/qom/object_interfaces.c index ded4d84c85..03a95c3276 100644 --- a/qom/object_interfaces.c +++ b/qom/object_interfaces.c @@ -3,7 +3,6 @@ #include "qom/object_interfaces.h" #include "qemu/module.h" #include "qapi-visit.h" -#include "qapi/qobject-output-visitor.h" #include "qapi/opts-visitor.h" void user_creatable_complete(Object *obj, Error **errp) @@ -35,57 +34,6 @@ bool user_creatable_can_be_deleted(UserCreatable *uc, Error **errp) } } - -Object *user_creatable_add(const QDict *qdict, - Visitor *v, Error **errp) -{ - char *type = NULL; - char *id = NULL; - Object *obj = NULL; - Error *local_err = NULL; - QDict *pdict; - - pdict = qdict_clone_shallow(qdict); - - visit_start_struct(v, NULL, NULL, 0, &local_err); - if (local_err) { - goto out; - } - - qdict_del(pdict, "qom-type"); - visit_type_str(v, "qom-type", &type, &local_err); - if (local_err) { - goto out_visit; - } - - qdict_del(pdict, "id"); - visit_type_str(v, "id", &id, &local_err); - if (local_err) { - goto out_visit; - } - visit_check_struct(v, &local_err); - if (local_err) { - goto out_visit; - } - - obj = user_creatable_add_type(type, id, pdict, v, &local_err); - -out_visit: - visit_end_struct(v, NULL); - -out: - QDECREF(pdict); - g_free(id); - g_free(type); - if (local_err) { - error_propagate(errp, local_err); - object_unref(obj); - return NULL; - } - return obj; -} - - Object *user_creatable_add_type(const char *type, const char *id, const QDict *qdict, Visitor *v, Error **errp) @@ -114,6 +62,12 @@ Object *user_creatable_add_type(const char *type, const char *id, assert(qdict); obj = object_new(type); + if (object_property_find(obj, "id", NULL)) { + object_property_set_str(obj, id, "id", &local_err); + if (local_err) { + goto out; + } + } visit_start_struct(v, NULL, NULL, 0, &local_err); if (local_err) { goto out; @@ -158,13 +112,27 @@ Object *user_creatable_add_opts(QemuOpts *opts, Error **errp) { Visitor *v; QDict *pdict; - Object *obj = NULL; + Object *obj; + const char *id = qemu_opts_id(opts); + const char *type = qemu_opt_get(opts, "qom-type"); + + if (!type) { + error_setg(errp, QERR_MISSING_PARAMETER, "qom-type"); + return NULL; + } + if (!id) { + error_setg(errp, QERR_MISSING_PARAMETER, "id"); + return NULL; + } - v = opts_visitor_new(opts); pdict = qemu_opts_to_qdict(opts, NULL); + qdict_del(pdict, "qom-type"); + qdict_del(pdict, "id"); - obj = user_creatable_add(pdict, v, errp); + v = opts_visitor_new(opts); + obj = user_creatable_add_type(type, id, pdict, v, errp); visit_free(v); + QDECREF(pdict); return obj; } |