On 1/21/19 7:50 PM, Peter Maydell wrote:
> Currently the ARMv7M NVIC object's realize method assumes that the
> CPU the NVIC is attached to is CPU 0, because it thinks there can
> only ever be one CPU in the system. To allow a dual-Cortex-M33
> setup we need to remove this assumption; instead the armv7m
> wrapper object tells the NVIC its CPU, in the same way that it
> already tells the CPU what the NVIC is.
>
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
> ---
> hw/arm/armv7m.c | 6 ++++--
> hw/intc/armv7m_nvic.c | 3 +--
> 2 files changed, 5 insertions(+), 4 deletions(-)
>
> diff --git a/hw/arm/armv7m.c b/hw/arm/armv7m.c
> index f4446528307..f9aa83d20ef 100644
> --- a/hw/arm/armv7m.c
> +++ b/hw/arm/armv7m.c
> @@ -178,10 +178,12 @@ static void armv7m_realize(DeviceState *dev, Error **errp)
> }
> }
>
> - /* Tell the CPU where the NVIC is; it will fail realize if it doesn't
> - * have one.
> + /*
> + * Tell the CPU where the NVIC is; it will fail realize if it doesn't
> + * have one. Similarly, tell the NVIC where its CPU is.
> */
> s->cpu->env.nvic = &s->nvic;
> + s->nvic.cpu = s->cpu;
>
> object_property_set_bool(OBJECT(s->cpu), true, "realized", &err);
> if (err != NULL) {
> diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
> index 0beefb05d44..790a3d95849 100644
> --- a/hw/intc/armv7m_nvic.c
> +++ b/hw/intc/armv7m_nvic.c
> @@ -2274,8 +2274,7 @@ static void armv7m_nvic_realize(DeviceState *dev, Error **errp)
> Error *err = NULL;
> int regionlen;
>
> - s->cpu = ARM_CPU(qemu_get_cpu(0));
> -
> + /* The armv7m container object will have set our CPU pointer */
> if (!s->cpu || !arm_feature(&s->cpu->env, ARM_FEATURE_M)) {
> error_setg(errp, "The NVIC can only be used with a Cortex-M CPU");
> return;
>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>