From 82fcd5710441815ef5ab1677db7f724b84f2ae45 Mon Sep 17 00:00:00 2001 From: Nathan Rossi Date: Tue, 10 Dec 2013 17:51:35 +1000 Subject: qemu: Add patch to resolve MicroBlaze ethernet issues * Add patch to resolve the QEMU segfault when a AXI Ethernet device attempts to transmit/recieve packets. * Patch is from mailing list, back-ported for 1.6.1. Signed-off-by: Nathan Rossi --- ...bject_c_Split_out_object_and_class_caches.patch | 101 +++++++++++++++++++++ recipes-devtools/qemu/qemu_1.6.1.bbappend | 1 + 2 files changed, 102 insertions(+) create mode 100644 recipes-devtools/qemu/files/qom_object_c_Split_out_object_and_class_caches.patch diff --git a/recipes-devtools/qemu/files/qom_object_c_Split_out_object_and_class_caches.patch b/recipes-devtools/qemu/files/qom_object_c_Split_out_object_and_class_caches.patch new file mode 100644 index 00000000..b64a8391 --- /dev/null +++ b/recipes-devtools/qemu/files/qom_object_c_Split_out_object_and_class_caches.patch @@ -0,0 +1,101 @@ +Subject: [qom,v1,1/1] qom/object.c: Split out object and class caches. +From: Peter Crosthwaite +Message-Id: <23ad4a5a9283ffcf4fc384832f369df46db18ef6.1385612379.git.peter.crosthwaite@xilinx.com> +To: qemu-devel@nongnu.org, + aliguori@us.ibm.com, + pbonzini@redhat.com +Cc: afaerber@suse.de +Date: Wed, 27 Nov 2013 20:27:33 -0800 + +The object-cast and class-cast caches cannot be shared because class +caching is conditional on the target type not being an interface and +object caching is unconditional. Leads to a bug when a class cast +to an interface follows an object cast to the same interface type: + +FooObject = FOO(obj); +FooClass = FOO_GET_CLASS(obj); + +Where TYPE_FOO is an interface. The first (object) cast will be +successful and cache the casting result (i.e. TYPE_FOO will be cached). +The second (class) cast will then check the shared cast cache +and register a hit. The issue is, when a class cast hits in the cache +it just returns a pointer cast of the input class (i.e. the concrete +class). + +When casting to an interface, the cast itself must return the +interface class, not the concrete class. The implementation of class +cast caching already ensures that the returned cast result is only +a pointer cast before caching. The object cast logic however does +not have this check. + +Resolve by just splitting the object and class caches. + +Signed-off-by: Peter Crosthwaite +Reviewed-by: Paolo Bonzini +Upstream-Status: Pending [Pulled from upstream mailing list] +--- +include/qom/object.h | 3 ++- + qom/object.c | 13 +++++++------ + 2 files changed, 9 insertions(+), 7 deletions(-) + +diff --git a/include/qom/object.h b/include/qom/object.h +index a275db2..5f78847 100644 +--- a/include/qom/object.h ++++ b/include/qom/object.h +@@ -358,7 +358,8 @@ struct ObjectClass + Type type; + GSList *interfaces; + +- const char *cast_cache[OBJECT_CLASS_CAST_CACHE]; ++ const char *object_cast_cache[OBJECT_CLASS_CAST_CACHE]; ++ const char *class_cast_cache[OBJECT_CLASS_CAST_CACHE]; + + ObjectUnparent *unparent; + }; +diff --git a/qom/object.c b/qom/object.c +index fc19cf6..21b5a0b 100644 +--- a/qom/object.c ++++ b/qom/object.c +@@ -458,7 +458,7 @@ Object *object_dynamic_cast_assert(Object *obj, const char *typename, + Object *inst; + + for (i = 0; obj && i < OBJECT_CLASS_CAST_CACHE; i++) { +- if (obj->class->cast_cache[i] == typename) { ++ if (obj->class->object_cast_cache[i] == typename) { + goto out; + } + } +@@ -475,9 +475,10 @@ Object *object_dynamic_cast_assert(Object *obj, const char *typename, + + if (obj && obj == inst) { + for (i = 1; i < OBJECT_CLASS_CAST_CACHE; i++) { +- obj->class->cast_cache[i - 1] = obj->class->cast_cache[i]; ++ obj->class->object_cast_cache[i - 1] = ++ obj->class->object_cast_cache[i]; + } +- obj->class->cast_cache[i - 1] = typename; ++ obj->class->object_cast_cache[i - 1] = typename; + } + + out: +@@ -547,7 +548,7 @@ ObjectClass *object_class_dynamic_cast_assert(ObjectClass *class, + int i; + + for (i = 0; class && i < OBJECT_CLASS_CAST_CACHE; i++) { +- if (class->cast_cache[i] == typename) { ++ if (class->class_cast_cache[i] == typename) { + ret = class; + goto out; + } +@@ -568,9 +569,9 @@ ObjectClass *object_class_dynamic_cast_assert(ObjectClass *class, + #ifdef CONFIG_QOM_CAST_DEBUG + if (class && ret == class) { + for (i = 1; i < OBJECT_CLASS_CAST_CACHE; i++) { +- class->cast_cache[i - 1] = class->cast_cache[i]; ++ class->class_cast_cache[i - 1] = class->class_cast_cache[i]; + } +- class->cast_cache[i - 1] = typename; ++ class->class_cast_cache[i - 1] = typename; + } + out: + #endif diff --git a/recipes-devtools/qemu/qemu_1.6.1.bbappend b/recipes-devtools/qemu/qemu_1.6.1.bbappend index 584c2540..46211271 100644 --- a/recipes-devtools/qemu/qemu_1.6.1.bbappend +++ b/recipes-devtools/qemu/qemu_1.6.1.bbappend @@ -5,4 +5,5 @@ SRC_URI_append += " \ file://microblaze-Add-support-for-loading-initrd-images.patch \ file://HACK_target-arm_Harcode_the_SCU_offset.patch \ file://HACK_zynq_slcr_Bring_SLCR_out_of_reset_in_kernel_state.patch \ + file://qom_object_c_Split_out_object_and_class_caches.patch \ " -- cgit v1.2.3-54-g00ecf