
On 10/31/06, Jerry Van Baren gerald.vanbaren@smiths-aerospace.com wrote:
Add a oftdump (open firmware flattened tree dump) command.
Git repository: http://www.cideas.us/cgi-bin/gitweb.cgi?p=u-boot/u-boot-of-cmd.git;a=summary
Branch: of-cmd http://www.cideas.us/cgi-bin/gitweb.cgi?p=u-boot/u-boot-of-cmd.git;a=shortlog;h=of-cmd
Signed-off-by: Jerry Van Baren vanbaren@cideas.com
Not that I have any authority on this, but I'm going to NAK it (for right now). Others may disagree.
The global statics really bother me, and I'll take a look myself if there is a better way. Give me a few days.
Cheers, g.
From 20328071e132c40c662ffb2a07460144841b9e1a Mon Sep 17 00:00:00 2001
From: Jerry Van Baren vanbaren@cideas.com Date: Mon, 30 Oct 2006 21:47:02 -0500 Subject: [PATCH] Add a oftdump (open firmware flattened tree dump) command.
common/Makefile | 2 +- common/cmd_bootm.c | 2 -- common/cmd_oftdump.c | 58 +++++++++++++++++++++++++++++++++++++++++++++ common/ft_build.c | 65 ++++++++++++++++++++++++++++++++++++++++++-------- include/ft_build.h | 2 +- 5 files changed, 114 insertions(+), 15 deletions(-)
diff --git a/common/Makefile b/common/Makefile index 07ddc95..477aadb 100644 --- a/common/Makefile +++ b/common/Makefile @@ -37,7 +37,7 @@ COBJS = main.o ACEX1K.o altera.o bedbug. cmd_i2c.o cmd_ide.o cmd_immap.o cmd_itest.o cmd_jffs2.o \ cmd_load.o cmd_log.o \ cmd_mem.o cmd_mii.o cmd_misc.o cmd_mmc.o \
cmd_nand.o cmd_net.o cmd_nvedit.o \
cmd_nand.o cmd_net.o cmd_nvedit.o cmd_oftdump.o \ cmd_pci.o cmd_pcmcia.o cmd_portio.o \ cmd_reginfo.o cmd_reiser.o cmd_scsi.o cmd_spi.o cmd_universe.o \ cmd_usb.o cmd_vfd.o \
diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c index 3091a58..1797328 100644 --- a/common/cmd_bootm.c +++ b/common/cmd_bootm.c @@ -950,7 +950,6 @@ #else /* CONFIG_OF_FLAT_TREE */ }
ft_setup(of_flat_tree, kbd, initrd_start, initrd_end);
/* ft_dump_blob(of_flat_tree); */
#if defined(CFG_INIT_RAM_LOCK) && !defined(CONFIG_E500) unlock_ram_in_cache(); @@ -968,7 +967,6 @@ #endif cmd_start, cmd_end); else { ft_setup(of_flat_tree, kbd, initrd_start, initrd_end);
/* ft_dump_blob(of_flat_tree); */ (*kernel) ((bd_t *)of_flat_tree, (ulong)kernel, 0, 0, 0); }
#endif /* CONFIG_OF_FLAT_TREE */ diff --git a/common/cmd_oftdump.c b/common/cmd_oftdump.c new file mode 100644 index 0000000..5cc1995 --- /dev/null +++ b/common/cmd_oftdump.c @@ -0,0 +1,58 @@ +/*
- (C) Copyright 2006
- Gerald Van Baren, Custom IDEAS, vanbaren@cideas.com.
- See file CREDITS for list of people who contributed to this
- project.
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License as
- published by the Free Software Foundation; either version 2 of
- the License, or (at your option) any later version.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston,
- MA 02111-1307 USA
- */
+/*
- Misc functions
- */
+#include <common.h> +#include <command.h> +#include <ft_build.h>
+#ifdef CONFIG_OF_FLAT_TREE
+int do_oftdump (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) +{
void *p = (void *)simple_strtoul(argv[1], NULL, 16);
if (argc < 2) {
printf ("Usage:\n%s\n", cmdtp->usage);
return 1;
} else if (argc == 2) {
ft_dump_blob(p, "/");
} else {
ft_dump_blob(p, argv[2]);
}
return 0;
+}
+U_BOOT_CMD(
oftdump, 3, 0, do_oftdump,
"oftdump - Open Firmware flattened tree dump\n",
"oftdump <addr> - Dump the whole OF flattened tree\n"
"oftdump <addr> <prop> - Dump the given OF property\n"
+);
+#endif /* CONFIG_OF_FLAT_TREE */
diff --git a/common/ft_build.c b/common/ft_build.c index 980e40f..4fbe34c 100644 --- a/common/ft_build.c +++ b/common/ft_build.c @@ -233,10 +233,19 @@ static void print_data(const void *data, printf(" = <%04x>", be16_to_cpu(*(u16 *) data) & 0xffff); break; case 4: /* word */
printf(" = <%x>", be32_to_cpu(*(u32 *) data) & 0xffffffffU);
printf(" = <%08x>", be32_to_cpu(*(u32 *) data) & 0xffffffffU); break; case 8: /* double-word */
printf(" = <%qx>", be64_to_cpu(*(uint64_t *) data));
/*
* If 64 bit printing is supported, use it.
*/
+#ifdef CFG_64BIT_VSPRINTF
printf(" = <%016llx>", be64_to_cpu(*(uint64_t *) data));
+#else
printf(" = <%08x", be32_to_cpu(*(u32 *) data) & 0xffffffffU);
data += sizeof(u32);
printf(" %08x>", be32_to_cpu(*(u32 *) data) & 0xffffffffU);
+#endif break; default: /* anything else... hexdump */ printf(" = ["); @@ -248,7 +257,12 @@ static void print_data(const void *data, } }
-void ft_dump_blob(const void *bphp) +/*
- Used by ft_dump_blob() and ft_get_prop() to build up property names
- */
+static char path[256], prop[256];
+void ft_dump_blob(const void *bphp, const char *propname) { const struct boot_param_header *bph = bphp; const uint64_t *p_rsvmap = (const uint64_t *) @@ -260,17 +274,22 @@ void ft_dump_blob(const void *bphp) u32 tag; const u32 *p; const char *s, *t;
char *ss; int depth, sz, shift;
int found; int i; uint64_t addr, size; if (be32_to_cpu(bph->magic) != OF_DT_HEADER) { /* not valid tree */
printf("Not a valid tree.\n"); return; } depth = 0; shift = 4;
found = 0;
strcpy(path, "/"); for (i = 0;; i++) { addr = be64_to_cpu(p_rsvmap[i * 2]);
@@ -290,7 +309,17 @@ void ft_dump_blob(const void *bphp) s = (const char *)p; p = (u32 *) _ALIGN((unsigned long)p + strlen(s) + 1, 4);
printf("%*s%s {\n", depth * shift, "", s);
strcat(path, s);
if (found || (strcmp(path, propname) == 0)) {
found++;
if (depth == 0)
printf("/ {\n");
else
printf("%*s%s {\n", depth * shift, "", s);
}
/* The root path is already there as "/" */
if(depth != 0)
strcat(path, "/"); depth++; continue;
@@ -299,7 +328,16 @@ void ft_dump_blob(const void *bphp) if (tag == OF_DT_END_NODE) { depth--;
printf("%*s};\n", depth * shift, "");
path[strlen(path) - 1] = '\0';
ss = strrchr(path, '/');
if (ss != NULL)
ss[1] = '\0';
if(found) {
printf("%*s};\n", depth * shift, "");
if (found-- == 0)
return; /* request done */
} continue; }
@@ -317,9 +355,15 @@ void ft_dump_blob(const void *bphp) s = (const char *)p_strings + be32_to_cpu(*p++); t = (const char *)p; p = (const u32 *)_ALIGN((unsigned long)p + sz, 4);
printf("%*s%s", depth * shift, "", s);
print_data(t, sz);
printf(";\n");
strcpy(prop, path);
strcat(prop, s);
if(found || (strcmp(prop, propname) == 0)) {
printf("%*s%s", depth * shift, "", s);
print_data(t, sz);
printf(";\n");
} }
}
@@ -349,7 +393,6 @@ void *ft_get_prop(void *bphp, const char char *s, *t; char *ss; int sz;
static char path[256], prop[256]; path[0] = '\0';
@@ -478,7 +521,7 @@ #endif
#ifdef DEBUG printf ("recieved oftree\n");
ft_dump_blob(blob);
ft_dump_blob(blob, "/");
#endif
ft_init_cxt(&cxt, blob);
@@ -585,7 +628,7 @@ #endif
#ifdef DEBUG printf("final OF-tree\n");
ft_dump_blob(blob);
ft_dump_blob(blob, "/");
#endif } #endif diff --git a/include/ft_build.h b/include/ft_build.h index 89c689c..5530122 100644 --- a/include/ft_build.h +++ b/include/ft_build.h @@ -58,7 +58,7 @@ void ft_add_rsvmap(struct ft_cxt *cxt, u
void ft_setup(void *blob, bd_t * bd, ulong initrd_start, ulong initrd_end);
-void ft_dump_blob(const void *bphp); +void ft_dump_blob(const void *bphp, const char *propname); void ft_merge_blob(struct ft_cxt *cxt, void *blob); void *ft_get_prop(void *bphp, const char *propname, int *szp);
-- 1.4.1.1
Using Tomcat but need to do more? Need to support web services, security? Get stuff done quickly with pre-integrated technology to make your job easier Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&da...
U-Boot-Users mailing list U-Boot-Users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/u-boot-users