Browse Source

Assorted cleanups and extensions for ftdump

This patch makes a number of minor changes to the ftdump debugging
tool.

 * There was an endian bug in one place, which this fixes.

 * We now use const qualifiers in a number of places where we can

 * ftdump can now be instructed to read from stdin by giving "-" as
   the filename.

 * The buffer into which the blob is read is increased from 16k to
   64k, and is now dynamically allocated.

 * ftdump now emits source in dts-v1 format

Since ftdump is little used these days, these fixes are arguably of
little use.  On the other hand, I already did the work of making the
changes some time back, so I guess we might as well fold these small
fixes and improvements in.

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
main
David Gibson 15 years ago committed by Jon Loeliger
parent
commit
0ef21055ee
  1. 41
      ftdump.c

41
ftdump.c

@ -4,15 +4,18 @@


#include <stdint.h> #include <stdint.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h>
#include <string.h> #include <string.h>
#include <ctype.h> #include <ctype.h>


#include <fdt.h> #include <fdt.h>
#include <libfdt_env.h> #include <libfdt_env.h>


#define FTDUMP_BUF_SIZE 65536

#define ALIGN(x, a) (((x) + ((a) - 1)) & ~((a) - 1)) #define ALIGN(x, a) (((x) + ((a) - 1)) & ~((a) - 1))
#define PALIGN(p, a) ((void *)(ALIGN((unsigned long)(p), (a)))) #define PALIGN(p, a) ((void *)(ALIGN((unsigned long)(p), (a))))
#define GET_CELL(p) (p += 4, *((uint32_t *)(p-4))) #define GET_CELL(p) (p += 4, *((const uint32_t *)(p-4)))


static int is_printable_string(const void *data, int len) static int is_printable_string(const void *data, int len)
{ {
@ -38,10 +41,10 @@ static int is_printable_string(const void *data, int len)
return 1; return 1;
} }


static void print_data(const void *data, int len) static void print_data(const char *data, int len)
{ {
int i; int i;
const uint8_t *s; const char *p = data;


/* no data, don't print */ /* no data, don't print */
if (len == 0) if (len == 0)
@ -52,13 +55,13 @@ static void print_data(const void *data, int len)
} else if ((len % 4) == 0) { } else if ((len % 4) == 0) {
printf(" = <"); printf(" = <");
for (i = 0; i < len; i += 4) for (i = 0; i < len; i += 4)
printf("%08x%s", *((const uint32_t *)data + i), printf("0x%08x%s", fdt32_to_cpu(GET_CELL(p)),
i < (len - 4) ? " " : ""); i < (len - 4) ? " " : "");
printf(">"); printf(">");
} else { } else {
printf(" = ["); printf(" = [");
for (i = 0, s = data; i < len; i++) for (i = 0; i < len; i++)
printf("%02x%s", s[i], i < len - 1 ? " " : ""); printf("%02x%s", *p++, i < len - 1 ? " " : "");
printf("]"); printf("]");
} }
} }
@ -71,13 +74,12 @@ static void dump_blob(void *blob)
uint32_t off_str = fdt32_to_cpu(bph->off_dt_strings); uint32_t off_str = fdt32_to_cpu(bph->off_dt_strings);
struct fdt_reserve_entry *p_rsvmap = struct fdt_reserve_entry *p_rsvmap =
(struct fdt_reserve_entry *)((char *)blob + off_mem_rsvmap); (struct fdt_reserve_entry *)((char *)blob + off_mem_rsvmap);
char *p_struct = (char *)blob + off_dt; const char *p_struct = (const char *)blob + off_dt;
char *p_strings = (char *)blob + off_str; const char *p_strings = (const char *)blob + off_str;
uint32_t version = fdt32_to_cpu(bph->version); uint32_t version = fdt32_to_cpu(bph->version);
uint32_t totalsize = fdt32_to_cpu(bph->totalsize); uint32_t totalsize = fdt32_to_cpu(bph->totalsize);
uint32_t tag; uint32_t tag;
char *p; const char *p, *s, *t;
char *s, *t;
int depth, sz, shift; int depth, sz, shift;
int i; int i;
uint64_t addr, size; uint64_t addr, size;
@ -85,6 +87,7 @@ static void dump_blob(void *blob)
depth = 0; depth = 0;
shift = 4; shift = 4;


printf("/dts-v1/;\n");
printf("// magic:\t\t0x%x\n", fdt32_to_cpu(bph->magic)); printf("// magic:\t\t0x%x\n", fdt32_to_cpu(bph->magic));
printf("// totalsize:\t\t0x%x (%d)\n", totalsize, totalsize); printf("// totalsize:\t\t0x%x (%d)\n", totalsize, totalsize);
printf("// off_dt_struct:\t0x%x\n", off_dt); printf("// off_dt_struct:\t0x%x\n", off_dt);
@ -167,7 +170,7 @@ static void dump_blob(void *blob)
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
FILE *fp; FILE *fp;
char buf[16384]; /* 16k max */ char *buf;
int size; int size;


if (argc < 2) { if (argc < 2) {
@ -175,15 +178,25 @@ int main(int argc, char *argv[])
return 5; return 5;
} }


if (strcmp(argv[1], "-") == 0) {
fp = stdin;
} else {
fp = fopen(argv[1], "rb"); fp = fopen(argv[1], "rb");
if (fp == NULL) { if (fp == NULL) {
fprintf(stderr, "unable to open %s\n", argv[1]); fprintf(stderr, "unable to open %s\n", argv[1]);
return 10; return 10;
} }
}

buf = malloc(FTDUMP_BUF_SIZE);
if (!buf) {
fprintf(stderr, "Couldn't allocate %d byte buffer\n", FTDUMP_BUF_SIZE);
return 10;
}


size = fread(buf, 1, sizeof(buf), fp); size = fread(buf, 1, FTDUMP_BUF_SIZE, fp);
if (size == sizeof(buf)) { /* too large */ if (size == FTDUMP_BUF_SIZE) {
fprintf(stderr, "file too large\n"); fprintf(stderr, "file too large (maximum is %d bytes)\n", FTDUMP_BUF_SIZE);
return 10; return 10;
} }



Loading…
Cancel
Save