diff mbox

[v4,12/20] ppc/xics: Add xics to the monitor "info pic" command

Message ID 1475479496-16158-13-git-send-email-clg@kaod.org
State New
Headers show

Commit Message

Cédric Le Goater Oct. 3, 2016, 7:24 a.m. UTC
From: Benjamin Herrenschmidt <benh@kernel.crashing.org>

Useful to debug interrupt problems.

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
[clg: - updated for qemu-2.7
      - added a test on ->irqs as it is not necessarily allocated
        (PHB3_MSI)
      - removed static variable g_xics and replace with a loop on all
        children to find the xics objects. ]
Signed-off-by: Cédric Le Goater <clg@kaod.org>
---
 hmp-commands-info.hx  |  2 ++
 hw/intc/xics.c        | 52 +++++++++++++++++++++++++++++++++++++++++++++++++++
 hw/ppc/ppc.c          | 14 ++++++++++++++
 include/hw/ppc/ppc.h  |  2 ++
 include/hw/ppc/xics.h |  2 ++
 monitor.c             |  4 ++++
 6 files changed, 76 insertions(+)

Comments

David Gibson Oct. 14, 2016, 5:30 a.m. UTC | #1
On Mon, Oct 03, 2016 at 09:24:48AM +0200, Cédric Le Goater wrote:
> From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
> 
> Useful to debug interrupt problems.
> 
> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
> [clg: - updated for qemu-2.7
>       - added a test on ->irqs as it is not necessarily allocated
>         (PHB3_MSI)
>       - removed static variable g_xics and replace with a loop on all
>         children to find the xics objects. ]
> Signed-off-by: Cédric Le Goater <clg@kaod.org>

So, this is fine in principle.  However info pic has recently been
reworked to better allow different PICs to add stuff in there.  Your
patches will need to be reworked on top of that.

See 61b97833 and surrounding commits.

> ---
>  hmp-commands-info.hx  |  2 ++
>  hw/intc/xics.c        | 52 +++++++++++++++++++++++++++++++++++++++++++++++++++
>  hw/ppc/ppc.c          | 14 ++++++++++++++
>  include/hw/ppc/ppc.h  |  2 ++
>  include/hw/ppc/xics.h |  2 ++
>  monitor.c             |  4 ++++
>  6 files changed, 76 insertions(+)
> 
> diff --git a/hmp-commands-info.hx b/hmp-commands-info.hx
> index 19729e55aea2..ab11eaf54348 100644
> --- a/hmp-commands-info.hx
> +++ b/hmp-commands-info.hx
> @@ -203,6 +203,8 @@ ETEXI
>          .cmd        = sun4m_hmp_info_pic,
>  #elif defined(TARGET_LM32)
>          .cmd        = lm32_hmp_info_pic,
> +#elif defined(TARGET_PPC)
> +        .cmd        = ppc_hmp_info_pic,
>  #else
>          .cmd        = hmp_info_pic,
>  #endif
> diff --git a/hw/intc/xics.c b/hw/intc/xics.c
> index f40b00003a45..3bbbcc847791 100644
> --- a/hw/intc/xics.c
> +++ b/hw/intc/xics.c
> @@ -35,6 +35,7 @@
>  #include "hw/ppc/xics.h"
>  #include "qemu/error-report.h"
>  #include "qapi/visitor.h"
> +#include "monitor/monitor.h"
>  
>  int xics_get_cpu_index_by_dt_id(int cpu_dt_id)
>  {
> @@ -633,6 +634,57 @@ static int ics_simple_dispatch_post_load(void *opaque, int version_id)
>      return 0;
>  }
>  
> +static int xics_hmp_info_pic_child(Object *child, void *opaque)
> +{
> +    Monitor *mon = opaque;
> +
> +    if (object_dynamic_cast(child, TYPE_XICS_COMMON)) {
> +        XICSState *xics = XICS_COMMON(child);
> +        ICSState *ics;
> +        uint32_t i;
> +
> +        for (i = 0; i < xics->nr_servers; i++) {
> +            ICPState *icp = &xics->ss[i];
> +
> +            if (!icp->output) {
> +                continue;
> +            }
> +            monitor_printf(mon, "CPU %d XIRR=%08x (%p) PP=%02x MFRR=%02x\n",
> +                           i, icp->xirr, icp->xirr_owner,
> +                           icp->pending_priority, icp->mfrr);
> +        }
> +
> +        QLIST_FOREACH(ics, &xics->ics, list) {
> +            monitor_printf(mon, "ICS %4x..%4x %p\n",
> +                           ics->offset, ics->offset + ics->nr_irqs - 1, ics);
> +
> +            if (!ics->irqs) {
> +                continue;
> +            }
> +
> +            for (i = 0; i < ics->nr_irqs; i++) {
> +                ICSIRQState *irq = ics->irqs + i;
> +
> +                if (!(irq->flags & XICS_FLAGS_IRQ_MASK)) {
> +                    continue;
> +                }
> +                monitor_printf(mon, "  %4x %s %02x %02x\n",
> +                               ics->offset + i,
> +                               (irq->flags & XICS_FLAGS_IRQ_LSI) ?
> +                               "LSI" : "MSI",
> +                               irq->priority, irq->status);
> +            }
> +        }
> +    }
> +    return 0;
> +}
> +
> +void xics_hmp_info_pic(Monitor *mon, const QDict *qdict)
> +{
> +    object_child_foreach_recursive(OBJECT(qdev_get_machine()),
> +                                   xics_hmp_info_pic_child, mon);
> +}
> +
>  static const VMStateDescription vmstate_ics_simple_irq = {
>      .name = "ics/irq",
>      .version_id = 2,
> diff --git a/hw/ppc/ppc.c b/hw/ppc/ppc.c
> index 89458690097f..bc734281f509 100644
> --- a/hw/ppc/ppc.c
> +++ b/hw/ppc/ppc.c
> @@ -27,6 +27,7 @@
>  #include "hw/hw.h"
>  #include "hw/ppc/ppc.h"
>  #include "hw/ppc/ppc_e500.h"
> +#include "hw/i386/pc.h"
>  #include "qemu/timer.h"
>  #include "sysemu/sysemu.h"
>  #include "sysemu/cpus.h"
> @@ -39,6 +40,10 @@
>  #include "kvm_ppc.h"
>  #include "trace.h"
>  
> +#if defined(TARGET_PPC64)
> +#include "hw/ppc/xics.h"
> +#endif
> +
>  //#define PPC_DEBUG_IRQ
>  //#define PPC_DEBUG_TB
>  
> @@ -1376,3 +1381,12 @@ void ppc_cpu_parse_features(const char *cpu_model)
>      cc->parse_features(typename, model_pieces[1], &error_fatal);
>      g_strfreev(model_pieces);
>  }
> +
> +void ppc_hmp_info_pic(Monitor *mon, const QDict *qdict)
> +{
> +    /* Call in turn every PIC around. OpenPIC doesn't have one yet */
> +#ifdef TARGET_PPC64
> +    xics_hmp_info_pic(mon, qdict);
> +#endif
> +    hmp_info_pic(mon, qdict);
> +}
> diff --git a/include/hw/ppc/ppc.h b/include/hw/ppc/ppc.h
> index 00c1fb1e720a..b36024a1213c 100644
> --- a/include/hw/ppc/ppc.h
> +++ b/include/hw/ppc/ppc.h
> @@ -3,6 +3,8 @@
>  
>  #include "target-ppc/cpu-qom.h"
>  
> +void ppc_hmp_info_pic(Monitor *mon, const QDict *qdict);
> +
>  void ppc_set_irq(PowerPCCPU *cpu, int n_IRQ, int level);
>  
>  /* PowerPC hardware exceptions management helpers */
> diff --git a/include/hw/ppc/xics.h b/include/hw/ppc/xics.h
> index 66ae55ded387..ca9f8da542e0 100644
> --- a/include/hw/ppc/xics.h
> +++ b/include/hw/ppc/xics.h
> @@ -205,4 +205,6 @@ void ics_set_irq_type(ICSState *ics, int srcno, bool lsi);
>  
>  ICSState *xics_find_source(XICSState *icp, int irq);
>  
> +void xics_hmp_info_pic(Monitor *mon, const QDict *qdict);
> +
>  #endif /* XICS_H */
> diff --git a/monitor.c b/monitor.c
> index 83c4edfce08e..70e17fa9f1fd 100644
> --- a/monitor.c
> +++ b/monitor.c
> @@ -91,6 +91,10 @@
>  #include "hw/s390x/storage-keys.h"
>  #endif
>  
> +#if defined(TARGET_PPC)
> +#include "hw/ppc/ppc.h"
> +#endif
> +
>  /*
>   * Supported types:
>   *
Cédric Le Goater Oct. 14, 2016, 7:39 a.m. UTC | #2
On 10/14/2016 07:30 AM, David Gibson wrote:
> On Mon, Oct 03, 2016 at 09:24:48AM +0200, Cédric Le Goater wrote:
>> From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
>>
>> Useful to debug interrupt problems.
>>
>> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
>> [clg: - updated for qemu-2.7
>>       - added a test on ->irqs as it is not necessarily allocated
>>         (PHB3_MSI)
>>       - removed static variable g_xics and replace with a loop on all
>>         children to find the xics objects. ]
>> Signed-off-by: Cédric Le Goater <clg@kaod.org>
> 
> So, this is fine in principle.  However info pic has recently been
> reworked to better allow different PICs to add stuff in there.  Your
> patches will need to be reworked on top of that.
> 
> See 61b97833 and surrounding commits.

Missed that. It seems I can get rid of the loop I introduced. I will 
rework.

Thanks,

C.

>> ---
>>  hmp-commands-info.hx  |  2 ++
>>  hw/intc/xics.c        | 52 +++++++++++++++++++++++++++++++++++++++++++++++++++
>>  hw/ppc/ppc.c          | 14 ++++++++++++++
>>  include/hw/ppc/ppc.h  |  2 ++
>>  include/hw/ppc/xics.h |  2 ++
>>  monitor.c             |  4 ++++
>>  6 files changed, 76 insertions(+)
>>
>> diff --git a/hmp-commands-info.hx b/hmp-commands-info.hx
>> index 19729e55aea2..ab11eaf54348 100644
>> --- a/hmp-commands-info.hx
>> +++ b/hmp-commands-info.hx
>> @@ -203,6 +203,8 @@ ETEXI
>>          .cmd        = sun4m_hmp_info_pic,
>>  #elif defined(TARGET_LM32)
>>          .cmd        = lm32_hmp_info_pic,
>> +#elif defined(TARGET_PPC)
>> +        .cmd        = ppc_hmp_info_pic,
>>  #else
>>          .cmd        = hmp_info_pic,
>>  #endif
>> diff --git a/hw/intc/xics.c b/hw/intc/xics.c
>> index f40b00003a45..3bbbcc847791 100644
>> --- a/hw/intc/xics.c
>> +++ b/hw/intc/xics.c
>> @@ -35,6 +35,7 @@
>>  #include "hw/ppc/xics.h"
>>  #include "qemu/error-report.h"
>>  #include "qapi/visitor.h"
>> +#include "monitor/monitor.h"
>>  
>>  int xics_get_cpu_index_by_dt_id(int cpu_dt_id)
>>  {
>> @@ -633,6 +634,57 @@ static int ics_simple_dispatch_post_load(void *opaque, int version_id)
>>      return 0;
>>  }
>>  
>> +static int xics_hmp_info_pic_child(Object *child, void *opaque)
>> +{
>> +    Monitor *mon = opaque;
>> +
>> +    if (object_dynamic_cast(child, TYPE_XICS_COMMON)) {
>> +        XICSState *xics = XICS_COMMON(child);
>> +        ICSState *ics;
>> +        uint32_t i;
>> +
>> +        for (i = 0; i < xics->nr_servers; i++) {
>> +            ICPState *icp = &xics->ss[i];
>> +
>> +            if (!icp->output) {
>> +                continue;
>> +            }
>> +            monitor_printf(mon, "CPU %d XIRR=%08x (%p) PP=%02x MFRR=%02x\n",
>> +                           i, icp->xirr, icp->xirr_owner,
>> +                           icp->pending_priority, icp->mfrr);
>> +        }
>> +
>> +        QLIST_FOREACH(ics, &xics->ics, list) {
>> +            monitor_printf(mon, "ICS %4x..%4x %p\n",
>> +                           ics->offset, ics->offset + ics->nr_irqs - 1, ics);
>> +
>> +            if (!ics->irqs) {
>> +                continue;
>> +            }
>> +
>> +            for (i = 0; i < ics->nr_irqs; i++) {
>> +                ICSIRQState *irq = ics->irqs + i;
>> +
>> +                if (!(irq->flags & XICS_FLAGS_IRQ_MASK)) {
>> +                    continue;
>> +                }
>> +                monitor_printf(mon, "  %4x %s %02x %02x\n",
>> +                               ics->offset + i,
>> +                               (irq->flags & XICS_FLAGS_IRQ_LSI) ?
>> +                               "LSI" : "MSI",
>> +                               irq->priority, irq->status);
>> +            }
>> +        }
>> +    }
>> +    return 0;
>> +}
>> +
>> +void xics_hmp_info_pic(Monitor *mon, const QDict *qdict)
>> +{
>> +    object_child_foreach_recursive(OBJECT(qdev_get_machine()),
>> +                                   xics_hmp_info_pic_child, mon);
>> +}
>> +
>>  static const VMStateDescription vmstate_ics_simple_irq = {
>>      .name = "ics/irq",
>>      .version_id = 2,
>> diff --git a/hw/ppc/ppc.c b/hw/ppc/ppc.c
>> index 89458690097f..bc734281f509 100644
>> --- a/hw/ppc/ppc.c
>> +++ b/hw/ppc/ppc.c
>> @@ -27,6 +27,7 @@
>>  #include "hw/hw.h"
>>  #include "hw/ppc/ppc.h"
>>  #include "hw/ppc/ppc_e500.h"
>> +#include "hw/i386/pc.h"
>>  #include "qemu/timer.h"
>>  #include "sysemu/sysemu.h"
>>  #include "sysemu/cpus.h"
>> @@ -39,6 +40,10 @@
>>  #include "kvm_ppc.h"
>>  #include "trace.h"
>>  
>> +#if defined(TARGET_PPC64)
>> +#include "hw/ppc/xics.h"
>> +#endif
>> +
>>  //#define PPC_DEBUG_IRQ
>>  //#define PPC_DEBUG_TB
>>  
>> @@ -1376,3 +1381,12 @@ void ppc_cpu_parse_features(const char *cpu_model)
>>      cc->parse_features(typename, model_pieces[1], &error_fatal);
>>      g_strfreev(model_pieces);
>>  }
>> +
>> +void ppc_hmp_info_pic(Monitor *mon, const QDict *qdict)
>> +{
>> +    /* Call in turn every PIC around. OpenPIC doesn't have one yet */
>> +#ifdef TARGET_PPC64
>> +    xics_hmp_info_pic(mon, qdict);
>> +#endif
>> +    hmp_info_pic(mon, qdict);
>> +}
>> diff --git a/include/hw/ppc/ppc.h b/include/hw/ppc/ppc.h
>> index 00c1fb1e720a..b36024a1213c 100644
>> --- a/include/hw/ppc/ppc.h
>> +++ b/include/hw/ppc/ppc.h
>> @@ -3,6 +3,8 @@
>>  
>>  #include "target-ppc/cpu-qom.h"
>>  
>> +void ppc_hmp_info_pic(Monitor *mon, const QDict *qdict);
>> +
>>  void ppc_set_irq(PowerPCCPU *cpu, int n_IRQ, int level);
>>  
>>  /* PowerPC hardware exceptions management helpers */
>> diff --git a/include/hw/ppc/xics.h b/include/hw/ppc/xics.h
>> index 66ae55ded387..ca9f8da542e0 100644
>> --- a/include/hw/ppc/xics.h
>> +++ b/include/hw/ppc/xics.h
>> @@ -205,4 +205,6 @@ void ics_set_irq_type(ICSState *ics, int srcno, bool lsi);
>>  
>>  ICSState *xics_find_source(XICSState *icp, int irq);
>>  
>> +void xics_hmp_info_pic(Monitor *mon, const QDict *qdict);
>> +
>>  #endif /* XICS_H */
>> diff --git a/monitor.c b/monitor.c
>> index 83c4edfce08e..70e17fa9f1fd 100644
>> --- a/monitor.c
>> +++ b/monitor.c
>> @@ -91,6 +91,10 @@
>>  #include "hw/s390x/storage-keys.h"
>>  #endif
>>  
>> +#if defined(TARGET_PPC)
>> +#include "hw/ppc/ppc.h"
>> +#endif
>> +
>>  /*
>>   * Supported types:
>>   *
>
diff mbox

Patch

diff --git a/hmp-commands-info.hx b/hmp-commands-info.hx
index 19729e55aea2..ab11eaf54348 100644
--- a/hmp-commands-info.hx
+++ b/hmp-commands-info.hx
@@ -203,6 +203,8 @@  ETEXI
         .cmd        = sun4m_hmp_info_pic,
 #elif defined(TARGET_LM32)
         .cmd        = lm32_hmp_info_pic,
+#elif defined(TARGET_PPC)
+        .cmd        = ppc_hmp_info_pic,
 #else
         .cmd        = hmp_info_pic,
 #endif
diff --git a/hw/intc/xics.c b/hw/intc/xics.c
index f40b00003a45..3bbbcc847791 100644
--- a/hw/intc/xics.c
+++ b/hw/intc/xics.c
@@ -35,6 +35,7 @@ 
 #include "hw/ppc/xics.h"
 #include "qemu/error-report.h"
 #include "qapi/visitor.h"
+#include "monitor/monitor.h"
 
 int xics_get_cpu_index_by_dt_id(int cpu_dt_id)
 {
@@ -633,6 +634,57 @@  static int ics_simple_dispatch_post_load(void *opaque, int version_id)
     return 0;
 }
 
+static int xics_hmp_info_pic_child(Object *child, void *opaque)
+{
+    Monitor *mon = opaque;
+
+    if (object_dynamic_cast(child, TYPE_XICS_COMMON)) {
+        XICSState *xics = XICS_COMMON(child);
+        ICSState *ics;
+        uint32_t i;
+
+        for (i = 0; i < xics->nr_servers; i++) {
+            ICPState *icp = &xics->ss[i];
+
+            if (!icp->output) {
+                continue;
+            }
+            monitor_printf(mon, "CPU %d XIRR=%08x (%p) PP=%02x MFRR=%02x\n",
+                           i, icp->xirr, icp->xirr_owner,
+                           icp->pending_priority, icp->mfrr);
+        }
+
+        QLIST_FOREACH(ics, &xics->ics, list) {
+            monitor_printf(mon, "ICS %4x..%4x %p\n",
+                           ics->offset, ics->offset + ics->nr_irqs - 1, ics);
+
+            if (!ics->irqs) {
+                continue;
+            }
+
+            for (i = 0; i < ics->nr_irqs; i++) {
+                ICSIRQState *irq = ics->irqs + i;
+
+                if (!(irq->flags & XICS_FLAGS_IRQ_MASK)) {
+                    continue;
+                }
+                monitor_printf(mon, "  %4x %s %02x %02x\n",
+                               ics->offset + i,
+                               (irq->flags & XICS_FLAGS_IRQ_LSI) ?
+                               "LSI" : "MSI",
+                               irq->priority, irq->status);
+            }
+        }
+    }
+    return 0;
+}
+
+void xics_hmp_info_pic(Monitor *mon, const QDict *qdict)
+{
+    object_child_foreach_recursive(OBJECT(qdev_get_machine()),
+                                   xics_hmp_info_pic_child, mon);
+}
+
 static const VMStateDescription vmstate_ics_simple_irq = {
     .name = "ics/irq",
     .version_id = 2,
diff --git a/hw/ppc/ppc.c b/hw/ppc/ppc.c
index 89458690097f..bc734281f509 100644
--- a/hw/ppc/ppc.c
+++ b/hw/ppc/ppc.c
@@ -27,6 +27,7 @@ 
 #include "hw/hw.h"
 #include "hw/ppc/ppc.h"
 #include "hw/ppc/ppc_e500.h"
+#include "hw/i386/pc.h"
 #include "qemu/timer.h"
 #include "sysemu/sysemu.h"
 #include "sysemu/cpus.h"
@@ -39,6 +40,10 @@ 
 #include "kvm_ppc.h"
 #include "trace.h"
 
+#if defined(TARGET_PPC64)
+#include "hw/ppc/xics.h"
+#endif
+
 //#define PPC_DEBUG_IRQ
 //#define PPC_DEBUG_TB
 
@@ -1376,3 +1381,12 @@  void ppc_cpu_parse_features(const char *cpu_model)
     cc->parse_features(typename, model_pieces[1], &error_fatal);
     g_strfreev(model_pieces);
 }
+
+void ppc_hmp_info_pic(Monitor *mon, const QDict *qdict)
+{
+    /* Call in turn every PIC around. OpenPIC doesn't have one yet */
+#ifdef TARGET_PPC64
+    xics_hmp_info_pic(mon, qdict);
+#endif
+    hmp_info_pic(mon, qdict);
+}
diff --git a/include/hw/ppc/ppc.h b/include/hw/ppc/ppc.h
index 00c1fb1e720a..b36024a1213c 100644
--- a/include/hw/ppc/ppc.h
+++ b/include/hw/ppc/ppc.h
@@ -3,6 +3,8 @@ 
 
 #include "target-ppc/cpu-qom.h"
 
+void ppc_hmp_info_pic(Monitor *mon, const QDict *qdict);
+
 void ppc_set_irq(PowerPCCPU *cpu, int n_IRQ, int level);
 
 /* PowerPC hardware exceptions management helpers */
diff --git a/include/hw/ppc/xics.h b/include/hw/ppc/xics.h
index 66ae55ded387..ca9f8da542e0 100644
--- a/include/hw/ppc/xics.h
+++ b/include/hw/ppc/xics.h
@@ -205,4 +205,6 @@  void ics_set_irq_type(ICSState *ics, int srcno, bool lsi);
 
 ICSState *xics_find_source(XICSState *icp, int irq);
 
+void xics_hmp_info_pic(Monitor *mon, const QDict *qdict);
+
 #endif /* XICS_H */
diff --git a/monitor.c b/monitor.c
index 83c4edfce08e..70e17fa9f1fd 100644
--- a/monitor.c
+++ b/monitor.c
@@ -91,6 +91,10 @@ 
 #include "hw/s390x/storage-keys.h"
 #endif
 
+#if defined(TARGET_PPC)
+#include "hw/ppc/ppc.h"
+#endif
+
 /*
  * Supported types:
  *