Re: [PATCH 1/2] scripts/gdb: add lx-fdtdump command
Hi Kieran, Thanks for reviewing. On Tue, 18 Oct 2016, Kieran Bingham wrote: > Hi Pete, > > Thanks for your patch. > > On 18/10/16 16:07, Peter Griffin wrote: > > lx-fdtdump dumps the flatenned device tree passed to the kernel > > s/flatenned/flattened/ > > > 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: > > > > Excellent - I've been looking forward to this > > General comment: It would be good to see the output filename > configurable as a parameter, defaulting to fdtdump.dtb if none provided. > > Is this something you have time to add? Have added this in v2 :) > > > (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 > > > >> 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 > > --- > > 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 > > #include > > +#include > > > > /* 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 = ">III" > > +fdt_header_le = " > + > > +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" > > + > > You could parse the arguments here to allow users to write to their own > file / path ... arg is just a string, so you can either parse it as such > or convert to argv with > argv = gdb.string_to_argv(arg) > > > Aha - I see Jan beat me to it :) > > > > +py_fdt_header_ptr = gdb.parse_and_eval( > > +"(const struct fdt_header *) initial_boot_params") > > +py_fdt_header = py_fdt_header_ptr.dereference() > > + > > +fdt_header = self.fdthdr_to_cpu(py_fdt_header) > > + > > +if fdt_header[0] != constants.LX_OF_DT_HEADER: > > +raise gdb.GdbError("No flattened device tree magic > > found\n") > > + > > +gdb.write("fdt_magic: > > 0x{:02X}\n".format(fdt_header[0])) > > +gdb.write("fdt_totalsize: > > 0x{:02X}\n".format(fdt_header[1])) > > +gdb.write("off_dt_struct: > > 0x{:02X}\n".format(fdt_header[2])) > > +gdb.write("o
Re: [PATCH 1/2] scripts/gdb: add lx-fdtdump command
Hi Jan, On Tue, 18 Oct 2016, Jan Kiszka wrote: > On 2016-10-18 18:06, Peter Griffin wrote: > > Hi Jan, > > > > On Tue, 18 Oct 2016, Jan Kiszka wrote: > > > >> On 2016-10-18 17:07, Peter Griffin wrote: > >>> 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 > >>> > 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 > >>> --- > >>> 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 > >>> #include > >>> +#include > >>> > >>> /* 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 = ">III" > >>> +fdt_header_le = " >>> + > >>> +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. > > > > Also check gdb.COMPLETE_FILENAME [1] at that chance. :) > > Jan > > [1] > https://sourceware.org/gdb/onlinedocs/gdb/Commands-In-Python.html#Commands-In-Python > Thanks for the tip, that is very cool! Will add gdb.COMPLETE_FILENAME in V2. regads, Peter.
Re: [PATCH 1/2] scripts/gdb: add lx-fdtdump command
On 2016-10-18 18:06, Peter Griffin wrote: > Hi Jan, > > On Tue, 18 Oct 2016, Jan Kiszka wrote: > >> On 2016-10-18 17:07, Peter Griffin wrote: >>> 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 >>> 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 >>> --- >>> 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 >>> #include >>> +#include >>> >>> /* 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 = ">III" >>> +fdt_header_le = ">> + >>> +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. > Also check gdb.COMPLETE_FILENAME [1] at that chance. :) Jan [1] https://sourceware.org/gdb/onlinedocs/gdb/Commands-In-Python.html#Commands-In-Python -- Siemens AG, Corporate Technology, CT RDA ITP SES-DE Corporate Competence Center Embedded Linux
Re: [PATCH 1/2] scripts/gdb: add lx-fdtdump command
Hi Jan, On Tue, 18 Oct 2016, Jan Kiszka wrote: > On 2016-10-18 17:07, Peter Griffin wrote: > > 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 > > > >> 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 > > --- > > 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 > > #include > > +#include > > > > /* 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 = ">III" > > +fdt_header_le = " > + > > +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
Re: [PATCH 1/2] scripts/gdb: add lx-fdtdump command
Hi Pete, Thanks for your patch. On 18/10/16 16:07, Peter Griffin wrote: > lx-fdtdump dumps the flatenned device tree passed to the kernel s/flatenned/flattened/ > 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: > Excellent - I've been looking forward to this General comment: It would be good to see the output filename configurable as a parameter, defaulting to fdtdump.dtb if none provided. Is this something you have time to add? > (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 > >> 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 > --- > 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 > #include > +#include > > /* 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 = ">III" > +fdt_header_le = " + > +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" > + You could parse the arguments here to allow users to write to their own file / path ... arg is just a string, so you can either parse it as such or convert to argv with argv = gdb.string_to_argv(arg) Aha - I see Jan beat me to it :) > +py_fdt_header_ptr = gdb.parse_and_eval( > +"(const struct fdt_header *) initial_boot_params") > +py_fdt_header = py_fdt_header_ptr.dereference() > + > +fdt_header = self.fdthdr_to_cpu(py_fdt_header) > + > +if fdt_header[0] != constants.LX_OF_DT_HEADER: > +raise gdb.GdbError("No flattened device tree magic found\n") > + > +gdb.write("fdt_magic: 0x{:02X}\n".format(fdt_header[0])) > +gdb.write("fdt_totalsize: 0x{:02X}\n".format(fdt_header[1])) > +gdb.write("off_dt_struct: 0x{:02X}\n".format(fdt_header[2])) > +gdb.write("off_dt_strings:0x{:02X}\n".format(fdt_header[3])) > +gdb.write("off_mem_rsvmap:0x{:02X}\n".format(fdt_header[4])) > +gdb.write("version: {}\n".format(fdt_header[5])) > +gdb.write("last_comp_version: {}\n".format(fdt_header[6])) > + > +inf = gdb.inferiors()[0] > +fdt_buf = utils.read_memoryview(inf, py_fdt_header_ptr, > +
Re: [PATCH 1/2] scripts/gdb: add lx-fdtdump command
On 2016-10-18 17:07, Peter Griffin wrote: > 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 > >> 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 > --- > 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 > #include > +#include > > /* 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 = ">III" > +fdt_header_le = " + > +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. > + > +py_fdt_header_ptr = gdb.parse_and_eval( > +"(const struct fdt_header *) initial_boot_params") > +py_fdt_header = py_fdt_header_ptr.dereference() > + > +fdt_header = self.fdthdr_to_cpu(py_fdt_header) > + > +if fdt_header[0] != constants.LX_OF_DT_HEADER: > +raise gdb.GdbError("No flattened device tree magic found\n") > + > +gdb.write("fdt_magic: 0x{:02X}\n".format(fdt_header[0])) > +gdb.write("fdt_totalsize: 0x{:02X}\n".format(fdt_header[1])) > +gdb.write("off_dt_struct: 0x{:02X}\n".format(fdt_header[2])) > +gdb.write("off_dt_strings:0x{:02X}\n".format(fdt_header[3])) > +gdb.write("off_mem_rsvmap:0x{:02X}\n".format(fdt_header[4])) > +gdb.write("version: {}\n".format(fdt_header[5])) > +gdb.write("last_comp_version: {}\n".format(fdt_header[6])) > + > +inf = gdb.inferiors()[0] > +fdt_buf = utils.read_memoryview(inf, py_fdt_header_ptr, > +fdt_header[1]).tobytes() > + > +try: > +f = open(filename, 'wb') > +except: > +raise gdb.GdbError("Could not open file to dump fdt") > + > +f.write(fdt_buf) > +f.close() > + > +gdb.write("Dumped fdt to " + filename + "