@samitouri / QOSamiQemu / commits / de81a8cec4

hw/arm/raspi: Initialize 64-bit CPU types during DeviceRealize()

bcm2836.c models 3 similar SoC: BCM2835, BCM2836 and BCM2837. The BCM2837 is a 64-bit only SoC (Cortex-A53), only available in the 64-bit binary. If we build this file as common object, all BCM SoCs become available in both 32 and 64-bit binaries; however when running the introspection test on the 32-bit binary, the BCM2837 init() method tries to init the Cortex-A53 type -- although not realizing it -- which is not available. This can be avoided by deferring the CPU type initialization to the SoC DeviceRealize step (this is safe because nothing uses the CPU type before, only the GIC access them, just after their realization). Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org> Reviewed-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com> Acked-by: Peter Maydell <peter.maydell@linaro.org> Message-Id: <20260526203722.79463-2-philmd@linaro.org>

Philippe Mathieu-Daudé committed May 13, 2026 at 14:07 UTC de81a8cec42a4dbad940f061fe96b3c3d87f5fcd
1 file changed +5 -5
hw/arm/bcm2836.c
+5 -5
@@ -25,12 +25,7 @@ static void bcm283x_base_init(Object *obj)
25 {
26 BCM283XBaseState *s = BCM283X_BASE(obj);
27 BCM283XBaseClass *bc = BCM283X_BASE_GET_CLASS(obj);
28 - int n;
28
30 - for (n = 0; n < bc->core_count; n++) {
31 - object_initialize_child(obj, "cpu[*]", &s->cpu[n].core,
32 - bc->cpu_type);
33 - }
29 if (bc->core_count > 1) {
30 qdev_property_add_static(DEVICE(obj), &bcm2836_enabled_cores_property);
31 qdev_prop_set_uint32(DEVICE(obj), "enabled-cpus", bc->core_count);
@@ -65,6 +60,11 @@ bool bcm283x_common_realize(DeviceState *dev, BCMSocPeripheralBaseState *ps,
60 BCM283XBaseClass *bc = BCM283X_BASE_GET_CLASS(dev);
61 Object *obj;
62
63 + for (int n = 0; n < bc->core_count; n++) {
64 + object_initialize_child(OBJECT(dev), "cpu[*]", &s->cpu[n].core,
65 + bc->cpu_type);
66 + }
67 +
68 /* common peripherals from bcm2835 */
69
70 obj = object_property_get_link(OBJECT(dev), "ram", &error_abort);