From: Bhupesh Sharma <bhsharma@redhat.com>
To: kexec@lists.infradead.org
Cc: dyoung@redhat.com, takahiro.akashi@linaro.org,
bhsharma@redhat.com, bhupesh.linux@gmail.com,
james.morse@arm.com
Subject: [RESEND PATCH 1/2] dt-ops: Add helper API to dump fdt blob
Date: Mon, 19 Mar 2018 16:05:38 +0530 [thread overview]
Message-ID: <1521455739-8022-1-git-send-email-bhsharma@redhat.com> (raw)
At several occasions it would be useful to dump the fdt
blob being passed to the second (kexec/kdump) kernel
when '-d' flag is specified while invoking kexec/kdump.
This allows one to look at the device-tree fields that
is being passed to the secondary kernel and accordingly
debug issues.
This can be specially useful for the arm64 case, where
kexec_load() or kdump passes important information like
'linux,usable-memory' ranges to the second kernel, and
the correctness of the ranges can be verified by
looking at the device-tree dump with '-d' flag specified.
Signed-off-by: Bhupesh Sharma <bhsharma@redhat.com>
---
kexec/dt-ops.c | 133 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
kexec/dt-ops.h | 1 +
2 files changed, 134 insertions(+)
diff --git a/kexec/dt-ops.c b/kexec/dt-ops.c
index 915dbf55afd2..caf6f8df6e6b 100644
--- a/kexec/dt-ops.c
+++ b/kexec/dt-ops.c
@@ -8,6 +8,10 @@
#include "kexec.h"
#include "dt-ops.h"
+#define ALIGN(x, a) (((x) + ((a) - 1)) & ~((a) - 1))
+#define PALIGN(p, a) ((void *)(ALIGN((unsigned long)(p), (a))))
+#define GET_CELL(p) (p += 4, *((const uint32_t *)(p-4)))
+
static const char n_chosen[] = "/chosen";
static const char p_bootargs[] = "bootargs";
@@ -143,3 +147,132 @@ int dtb_delete_property(char *dtb, const char *node, const char *prop)
return result;
}
+
+static uint64_t is_printable_string(const void* data, uint64_t len)
+{
+ const char *s = data;
+ const char *ss;
+
+ /* Check for zero length strings */
+ if (len == 0) {
+ return 0;
+ }
+
+ /* String must be terminated with a '\0' */
+ if (s[len - 1] != '\0') {
+ return 0;
+ }
+
+ ss = s;
+ while (*s) {
+ s++;
+ }
+
+ /* Traverse till we hit a '\0' or reach 'len' */
+ if (*s != '\0' || (s + 1 - ss) < len) {
+ return 0;
+ }
+
+ return 1;
+}
+
+static void print_data(const char* data, uint64_t len)
+{
+ uint64_t i;
+ const char *p = data;
+
+ /* Check for non-zero length */
+ if (len == 0)
+ return;
+
+ if (is_printable_string(data, len)) {
+ dbgprintf(" = \"%s\"", (const char *)data);
+ } else if ((len % 4) == 0) {
+ dbgprintf(" = <");
+ for (i = 0; i < len; i += 4) {
+ dbgprintf("0x%08x%s",
+ fdt32_to_cpu(GET_CELL(p)),
+ i < (len - 4) ? " " : "");
+ }
+ dbgprintf(">");
+ } else {
+ dbgprintf(" = [");
+ for (i = 0; i < len; i++)
+ dbgprintf("%02x%s", *p++,
+ i < len - 1 ? " " : "");
+ dbgprintf("]");
+ }
+}
+
+void dump_fdt(void* fdt)
+{
+ struct fdt_header *bph;
+ const char* p_struct;
+ const char* p_strings;
+ const char* p;
+ const char* s;
+ const char* t;
+ uint32_t off_dt;
+ uint32_t off_str;
+ uint32_t tag;
+ uint64_t sz;
+ uint64_t depth;
+ uint64_t shift;
+ uint32_t version;
+
+ depth = 0;
+ shift = 4;
+
+ bph = fdt;
+ off_dt = fdt32_to_cpu(bph->off_dt_struct);
+ off_str = fdt32_to_cpu(bph->off_dt_strings);
+ p_struct = (const char*)fdt + off_dt;
+ p_strings = (const char*)fdt + off_str;
+ version = fdt32_to_cpu(bph->version);
+
+ p = p_struct;
+ while ((tag = fdt32_to_cpu(GET_CELL(p))) != FDT_END) {
+
+ if (tag == FDT_BEGIN_NODE) {
+ s = p;
+ p = PALIGN(p + strlen(s) + 1, 4);
+
+ if (*s == '\0')
+ s = "/";
+
+ dbgprintf("%*s%s {\n", (int)(depth * shift), " ", s);
+
+ depth++;
+ continue;
+ }
+
+ if (tag == FDT_END_NODE) {
+ depth--;
+
+ dbgprintf("%*s};\n", (int)(depth * shift), " ");
+ continue;
+ }
+
+ if (tag == FDT_NOP) {
+ dbgprintf("%*s// [NOP]\n", (int)(depth * shift), " ");
+ continue;
+ }
+
+ if (tag != FDT_PROP) {
+ dbgprintf("%*s ** Unknown tag 0x%08x\n",
+ (int)(depth * shift), " ", tag);
+ break;
+ }
+ sz = fdt32_to_cpu(GET_CELL(p));
+ s = p_strings + fdt32_to_cpu(GET_CELL(p));
+ if (version < 16 && sz >= 8)
+ p = PALIGN(p, 8);
+ t = p;
+
+ p = PALIGN(p + sz, 4);
+
+ dbgprintf("%*s%s", (int)(depth * shift), " ", s);
+ print_data(t, sz);
+ dbgprintf(";\n");
+ }
+}
diff --git a/kexec/dt-ops.h b/kexec/dt-ops.h
index e70d15d8ffbf..25b9b569f2b7 100644
--- a/kexec/dt-ops.h
+++ b/kexec/dt-ops.h
@@ -9,5 +9,6 @@ int dtb_set_property(char **dtb, off_t *dtb_size, const char *node,
const char *prop, const void *value, int value_len);
int dtb_delete_property(char *dtb, const char *node, const char *prop);
+void dump_fdt(void *fdt) ;
#endif
--
2.7.4
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
next reply other threads:[~2018-03-19 10:35 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-03-19 10:35 Bhupesh Sharma [this message]
2018-03-19 10:35 ` [RESEND PATCH 2/2] kexec-arm64: Add functionality to dump 2nd dtb Bhupesh Sharma
2018-03-19 14:45 ` [RESEND PATCH 1/2] dt-ops: Add helper API to dump fdt blob AKASHI Takahiro
2018-03-19 19:06 ` Bhupesh Sharma
2018-03-26 8:59 ` Bhupesh Sharma
2018-03-27 9:04 ` AKASHI Takahiro
2018-03-27 13:31 ` James Morse
2018-04-03 13:58 ` Bhupesh Sharma
2018-04-15 19:47 ` Bhupesh Sharma
2018-04-16 8:13 ` Dave Young
2018-04-16 15:09 ` Bhupesh Sharma
2018-04-17 5:17 ` Dave Young
2018-04-23 10:38 ` Bhupesh Sharma
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=1521455739-8022-1-git-send-email-bhsharma@redhat.com \
--to=bhsharma@redhat.com \
--cc=bhupesh.linux@gmail.com \
--cc=dyoung@redhat.com \
--cc=james.morse@arm.com \
--cc=kexec@lists.infradead.org \
--cc=takahiro.akashi@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).