Thread (10 messages) 10 messages, 3 authors, 2016-10-18

[PATCH 1/2] scripts/gdb: add lx-fdtdump command

From: peter.griffin@linaro.org (Peter Griffin)
Date: 2016-10-18 16:07:07
Also in: linux-devicetree, lkml

Hi Jan,

On Tue, 18 Oct 2016, Jan Kiszka wrote:
On 2016-10-18 17:07, Peter Griffin wrote:
quoted
lx-fdtdump dumps the flatenned device tree passed to the kernel
from the bootloader to a file called fdtdump.dtb to allow further
post processing on the machine running GDB. The fdt header is also
also printed in the GDB console. For example:

(gdb) lx-fdtdump
fdt_magic:         0xD00DFEED
fdt_totalsize:     0xC108
off_dt_struct:     0x38
off_dt_strings:    0x3804
off_mem_rsvmap:    0x28
version:           17
last_comp_version: 16
Dumped fdt to fdtdump.dtb
quoted
fdtdump fdtdump.dtb | less
This command is useful as the bootloader can often re-write parts
of the device tree, and this can sometimes cause the kernel to not
boot.

Signed-off-by: Peter Griffin <peter.griffin@linaro.org>
---
 scripts/gdb/linux/constants.py.in |  8 +++++
 scripts/gdb/linux/proc.py         | 70 ++++++++++++++++++++++++++++++++++++++-
 2 files changed, 77 insertions(+), 1 deletion(-)
diff --git a/scripts/gdb/linux/constants.py.in b/scripts/gdb/linux/constants.py.in
index 7986f4e..43c6241 100644
--- a/scripts/gdb/linux/constants.py.in
+++ b/scripts/gdb/linux/constants.py.in
@@ -14,6 +14,7 @@
 
 #include <linux/fs.h>
 #include <linux/mount.h>
+#include <linux/of_fdt.h>
 
 /* We need to stringify expanded macros so that they can be parsed */
 
@@ -50,3 +51,10 @@ LX_VALUE(MNT_NOEXEC)
 LX_VALUE(MNT_NOATIME)
 LX_VALUE(MNT_NODIRATIME)
 LX_VALUE(MNT_RELATIME)
+
+/* linux/of_fdt.h> */
+LX_VALUE(OF_DT_HEADER)
+
+/* Kernel Configs */
+LX_CONFIG(CONFIG_OF)
+
diff --git a/scripts/gdb/linux/proc.py b/scripts/gdb/linux/proc.py
index 38b1f09..f20fcfa 100644
--- a/scripts/gdb/linux/proc.py
+++ b/scripts/gdb/linux/proc.py
@@ -16,7 +16,7 @@ from linux import constants
 from linux import utils
 from linux import tasks
 from linux import lists
-
+from struct import *
 
 class LxCmdLine(gdb.Command):
     """ Report the Linux Commandline used in the current kernel.
@@ -195,3 +195,71 @@ values of that process namespace"""
                         info_opts(MNT_INFO, m_flags)))
 
 LxMounts()
+
+class LxFdtDump(gdb.Command):
+    """Output Flattened Device Tree header and dump FDT blob to a file
+       Equivalent to 'cat /proc/fdt > fdtdump.dtb' on a running target"""
+
+    def __init__(self):
+        super(LxFdtDump, self).__init__("lx-fdtdump", gdb.COMMAND_DATA)
+
+    def fdthdr_to_cpu(self, fdt_header):
+
+            fdt_header_be = ">IIIIIII"
+            fdt_header_le = "<IIIIIII"
+
+            if utils.get_target_endianness() == 1:
+                output_fmt = fdt_header_le
+            else:
+                output_fmt = fdt_header_be
+
+            return unpack(output_fmt, pack(fdt_header_be,
+                                           fdt_header['magic'],
+                                           fdt_header['totalsize'],
+                                           fdt_header['off_dt_struct'],
+                                           fdt_header['off_dt_strings'],
+                                           fdt_header['off_mem_rsvmap'],
+                                           fdt_header['version'],
+                                           fdt_header['last_comp_version']))
+
+    def invoke(self, arg, from_tty):
+
+        if constants.LX_CONFIG_OF:
+
+            filename = "fdtdump.dtb"
Why not specifying the file name as argument? Safer than silently
overwriting potentially pre-existing files or failing without
alternatives if the current directory is not writable.
Good idea, I will update to have the filename as the command argument in v2.

regards,

Peter
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help