diff mbox series

[01/23] armv7m: Don't assume the NVIC's CPU is CPU 0

Message ID 20190121185118.18550-2-peter.maydell@linaro.org
State Superseded
Headers show
Series arm: Implement MPS2 AN521 FPGA image | expand

Commit Message

Peter Maydell Jan. 21, 2019, 6:50 p.m. UTC
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(-)

-- 
2.20.1

Comments

Philippe Mathieu-Daudé Jan. 21, 2019, 8:26 p.m. UTC | #1
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>
Richard Henderson Jan. 23, 2019, 11:44 p.m. UTC | #2
On 1/21/19 10:50 AM, 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(-)


Reviewed-by: Richard Henderson <richard.henderson@linaro.org>



r~
diff mbox series

Patch

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;