From 4da22be31d5fc8df887b8c76c609b9844bebe9f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Poussineau?= Date: Sun, 5 May 2013 10:31:24 +0200 Subject: [PATCH] usb-ehci: add an empty interface to expose a problem in QOM Run with qemu-system-ppc (no arguments) qemu-system-ppc: qom/object.c:82: type_table_add: Assertion `!enumerating' failed. Program received signal SIGABRT, Aborted. 0xb7fe1430 in __kernel_vsyscall () (gdb) bt #0 0xb7fe1430 in __kernel_vsyscall () #1 0xb6f27941 in *__GI_raise (sig=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:64 #2 0xb6f2ad72 in *__GI_abort () at abort.c:92 #3 0xb6f20b58 in *__GI___assert_fail (assertion=assertion@entry=0x803809f8 "!enumerating", file=file@entry=0x80380adc "qom/object.c", line=line@entry=82, function=function@entry=0x80380c6c "type_table_add") at assert.c:81 #4 0x80197513 in type_table_add (ti=0x80b67bd0) at qom/object.c:82 #5 type_register_internal (info=0xbfffef0c) at qom/object.c:124 #6 0x8019764c in type_initialize_interface (parent=0x80b3ec18 "interface", ti=, ti=) at qom/object.c:218 #7 0x801978fe in type_initialize (ti=) at qom/object.c:271 #8 type_initialize (ti=0x80b3eb30) at qom/object.c:229 #9 0x80197dfa in object_class_foreach_tramp (key=0x80b3ebf0, value=0x80b3eb30, opaque=0xbffff03c) at qom/object.c:563 #10 0xb7ef35e2 in g_hash_table_foreach () from /lib/i386-linux-gnu/libglib-2.0.so.0 #11 0x801980b1 in object_class_foreach (fn=fn@entry=0x80197180 , implements_type=implements_type@entry=0x8039b834 "powerpc-cpu", include_abstract=include_abstract@entry=false, opaque=opaque@entry=0xbffff078) at qom/object.c:585 #12 0x801981ba in object_class_get_list (implements_type=implements_type@entry=0x8039b834 "powerpc-cpu", include_abstract=include_abstract@entry=false) at qom/object.c:618 #13 0x80328d4e in ppc_cpu_class_by_name (name=name@entry=0x8039dc69 "G3") at target-ppc/translate_init.c:8003 #14 0x80328f7a in cpu_ppc_init (cpu_model=cpu_model@entry=0x8039dc69 "G3") at target-ppc/translate_init.c:8020 #15 0x80216724 in ppc_heathrow_init (args=0xbffff2a8) at hw/ppc/mac_oldworld.c:109 #16 0x80040b81 in main (argc=1, argv=0xbffff4b4, envp=0xbffff4bc) at vl.c:4304 --- hw/usb/hcd-uhci.c | 4 ++++ qom/object.c | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/hw/usb/hcd-uhci.c b/hw/usb/hcd-uhci.c index f8c4286..a95ca30 100644 --- a/hw/usb/hcd-uhci.c +++ b/hw/usb/hcd-uhci.c @@ -1386,6 +1386,10 @@ static void uhci_register_types(void) .instance_size = sizeof(UHCIState), .class_size = sizeof(UHCIPCIDeviceClass), .class_init = uhci_class_init, + .interfaces = (InterfaceInfo[]) { + { TYPE_INTERFACE }, + { } + } }; int i; diff --git a/qom/object.c b/qom/object.c index 75e6aac..b8e9f4f 100644 --- a/qom/object.c +++ b/qom/object.c @@ -76,8 +76,10 @@ static GHashTable *type_table_get(void) return type_table; } +static bool enumerating = false; static void type_table_add(TypeImpl *ti) { + assert(!enumerating); g_hash_table_insert(type_table_get(), (void *)ti->name, ti); } @@ -579,7 +581,9 @@ void object_class_foreach(void (*fn)(ObjectClass *klass, void *opaque), { OCFData data = { fn, implements_type, include_abstract, opaque }; + enumerating = true; g_hash_table_foreach(type_table_get(), object_class_foreach_tramp, &data); + enumerating = false; } int object_child_foreach(Object *obj, int (*fn)(Object *child, void *opaque), -- 1.7.10.4