All of lore.kernel.org
 help / color / mirror / Atom feed
From: Kieran Bingham <kieran.bingham@linaro.org>
To: jan.kiszka@siemens.com, linux-kernel@vger.kernel.org
Cc: lee.jones@linaro.org, peter.griffin@linaro.org,
	maxime.coquelin@st.com,
	Kieran Bingham <kieran.bingham@linaro.org>
Subject: [PATCHv3 12/13] scripts/gdb: Add interrupts command
Date: Thu,  3 Mar 2016 11:41:06 +0000	[thread overview]
Message-ID: <1457005267-843-13-git-send-email-kieran.bingham@linaro.org> (raw)
In-Reply-To: <1457005267-843-1-git-send-email-kieran.bingham@linaro.org>

Allow the debugger to present a list of all interrupts and their
associated counts. This will allow developers of drivers to identify
hardware interactions in the event of crashed kernels and core dumps.

Signed-off-by: Kieran Bingham <kieran.bingham@linaro.org>
---
 scripts/gdb/linux/constants.py.in |  1 +
 scripts/gdb/linux/proc.py         | 65 +++++++++++++++++++++++++++++++++++++++
 2 files changed, 66 insertions(+)

diff --git a/scripts/gdb/linux/constants.py.in b/scripts/gdb/linux/constants.py.in
index b38b9085c702..17b719ead54f 100644
--- a/scripts/gdb/linux/constants.py.in
+++ b/scripts/gdb/linux/constants.py.in
@@ -84,6 +84,7 @@ LX_CONFIG(CONFIG_TRANSPARENT_HUGEPAGE)
 LX_CONFIG(CONFIG_CMA)
 LX_CONFIG(CONFIG_MMU)
 LX_CONFIG(CONFIG_SWAP)
+LX_CONFIG(CONFIG_SPARSE_IRQ)
 
 #ifndef CONFIG_NR_QUICK
 #define CONFIG_NR_QUICK 0
diff --git a/scripts/gdb/linux/proc.py b/scripts/gdb/linux/proc.py
index e5a8dbe3aa3a..0676a14e8d48 100644
--- a/scripts/gdb/linux/proc.py
+++ b/scripts/gdb/linux/proc.py
@@ -16,6 +16,8 @@ from linux import constants
 from linux import utils
 from linux import tasks
 from linux import lists
+from linux import cpus
+from linux import radixtree
 
 
 class LxCmdLine(gdb.Command):
@@ -423,3 +425,66 @@ Equivalent to cat /proc/meminfo on a running target """
             )
 
 LxMeminfo()
+
+irq_desc = None
+irq_desc_type = utils.CachedType("struct irq_desc")
+
+
+class LxInterrupts(gdb.Command):
+    """ Report the interrupt counters of each CPU.
+        Equivalent to cat /proc/interrupts on a running target """
+
+    def __init__(self):
+        super(LxInterrupts, self).__init__("lx-interrupts", gdb.COMMAND_DATA)
+
+    def irq_to_desc(self, irq):
+        if constants.LX_CONFIG_SPARSE_IRQ:
+            irq_desc_tree = gdb.parse_and_eval("irq_desc_tree")
+            irq_desc_addr = radixtree.lookup(irq_desc_tree, irq)
+
+            if irq_desc_addr is None:
+                return None
+
+            if irq_desc_addr.address:
+                return irq_desc_addr.cast(irq_desc_type.get_type())
+            return None
+        else:
+            irq_desc_array = "irq_desc[{}]".format(irq)
+            return gdb.parse_and_eval(irq_desc_array)
+
+    def kstat_irqs_cpu(self, irq_desc, cpu):
+        return int(cpus.per_cpu(irq_desc['kstat_irqs'], cpu))
+
+    def invoke(self, arg, from_tty):
+        nr_irqs = int(gdb.parse_and_eval("nr_irqs"))
+
+        # Calculate the width of the first column
+        prec = 3
+        j = nr_irqs
+        while (j <= nr_irqs):
+            j *= 10
+            prec += 1
+
+        title = "{:{}}".format(" ", prec+8)
+        for cpu in cpus.each_online_cpu():
+            title += "CPU{:<8d}".format(cpu)
+        gdb.write(title + "\n")
+
+        for irq in range(0, nr_irqs):
+            desc = self.irq_to_desc(irq)
+            if desc is None:
+                continue
+
+            anycount = 0
+            for cpu in cpus.each_online_cpu():
+                anycount += self.kstat_irqs_cpu(desc, cpu)
+            if (anycount == 0):
+                continue
+
+            irq_line = "{:{}d}: ".format(irq, prec)
+            for cpu in cpus.each_online_cpu():
+                count = self.kstat_irqs_cpu(desc, cpu)
+                irq_line += "{:10d} ".format(count)
+            gdb.write(irq_line + "\n")
+
+LxInterrupts()
-- 
2.5.0

  parent reply	other threads:[~2016-03-03 11:43 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-03-03 11:40 [PATCHv3 00/13] scripts/gdb: Linux awareness debug commands Kieran Bingham
2016-03-03 11:40 ` [PATCHv3 01/13] scripts/gdb: Provide linux constants Kieran Bingham
2016-03-03 11:40 ` [PATCHv3 02/13] scripts/gdb: Provide kernel list item generators Kieran Bingham
2016-03-08  3:47   ` Jeff Mahoney
2016-03-08  7:55     ` Kieran Bingham
2016-03-03 11:40 ` [PATCHv3 03/13] scripts/gdb: Convert modules usage to lists functions Kieran Bingham
2016-03-03 11:40 ` [PATCHv3 04/13] scripts/gdb: Provide exception catching parser Kieran Bingham
2016-03-03 11:40 ` [PATCHv3 05/13] scripts/gdb: Support !CONFIG_MODULES gracefully Kieran Bingham
2016-03-03 11:41 ` [PATCHv3 06/13] scripts/gdb: Provide a dentry_name VFS path helper Kieran Bingham
2016-03-03 11:41 ` [PATCHv3 07/13] scripts/gdb: Add io resource readers Kieran Bingham
2016-03-03 11:41 ` [PATCHv3 08/13] scripts/gdb: Add mount point list command Kieran Bingham
2016-03-13 16:34   ` Jan Kiszka
2016-03-14 14:39     ` Kieran Bingham
2016-03-14 15:05       ` Jan Kiszka
2016-03-15 10:46         ` Kieran Bingham
2016-03-03 11:41 ` [PATCHv3 09/13] scripts/gdb: Add meminfo command Kieran Bingham
2016-03-13 16:34   ` Jan Kiszka
2016-03-13 18:16     ` Kieran Bingham
2016-03-13 19:08       ` Jan Kiszka
2016-03-14 12:13         ` Kieran Bingham
2016-03-03 11:41 ` [PATCHv3 10/13] scripts/gdb: Add cpu iterators Kieran Bingham
2016-03-13 16:33   ` Jan Kiszka
2016-03-13 18:39     ` Kieran Bingham
2016-03-03 11:41 ` [PATCHv3 11/13] scripts/gdb: Add a Radix Tree Parser Kieran Bingham
2016-03-03 11:41 ` Kieran Bingham [this message]
2016-03-03 11:41 ` [PATCHv3 13/13] scripts/gdb: Add lx_thread_info_by_pid helper Kieran Bingham
2016-03-13 16:35 ` [PATCHv3 00/13] scripts/gdb: Linux awareness debug commands Jan Kiszka
2016-03-14 14:40   ` Kieran Bingham
2016-03-14 15:09     ` Jan Kiszka
2016-03-14 17:18       ` Kieran Bingham
2016-03-14 17:31         ` Jan Kiszka

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1457005267-843-13-git-send-email-kieran.bingham@linaro.org \
    --to=kieran.bingham@linaro.org \
    --cc=jan.kiszka@siemens.com \
    --cc=lee.jones@linaro.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=maxime.coquelin@st.com \
    --cc=peter.griffin@linaro.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.