Booting the linux-ppc64 kernel & flattened device tree v0.4
Jon Loeliger
jdl at freescale.com
Thu Jun 2 02:58:51 EST 2005
On Wed, 2005-06-01 at 03:26, Benjamin Herrenschmidt wrote:
> Here's the fourth version of my document along with new kernel patches
> for the new improved flattened format, and the first release of the
> device-tree "compiler" tool. The patches will be posted as a reply to
> this email. The compiler, dtc, can be downloaded, the URL is in the
> document.
Ben,
Does it make sense to do this as well?
Thanks,
jdl
diff -Nur dtc.orig/lsprop.c dtc/lsprop.c
--- dtc.orig/lsprop.c 1969-12-31 18:00:00.000000000 -0600
+++ dtc/lsprop.c 2005-06-01 11:43:01.000002000 -0500
@@ -0,0 +1,221 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <dirent.h>
+
+int recurse;
+int maxbytes = 128;
+int words_per_line = 0;
+char *buf;
+
+void lsprop(FILE *f, char *name);
+void lsdir(char *name);
+
+main(int ac, char **av)
+{
+ FILE *f;
+ int i;
+ struct stat sb;
+ char *endp;
+
+ while ((i = getopt(ac, av, "Rm:w:")) != EOF) {
+ switch (i) {
+ case 'R':
+ recurse = 1;
+ break;
+ case 'm':
+ maxbytes = strtol(optarg, &endp, 0);
+ if (endp == optarg) {
+ fprintf(stderr, "%s: bad argument (%s) to -m option\n", av[0],
+ optarg);
+ exit(1);
+ }
+ maxbytes = (maxbytes + 15) & -16;
+ break;
+ case 'w':
+ words_per_line = strtol(optarg, &endp, 0);
+ if (endp == optarg) {
+ fprintf(stderr, "%s: bad argument (%s) to -w option\n",
+ av[0], optarg);
+ exit(1);
+ }
+ break;
+ }
+ }
+
+ buf = malloc(maxbytes);
+ if (buf == 0) {
+ fprintf(stderr, "%s: virtual memory exhausted\n", av[0]);
+ exit(1);
+ }
+
+ if (optind == ac)
+ lsdir(".");
+ else
+ for (i = optind; i < ac; ++i) {
+ if (stat(av[i], &sb) < 0) {
+ perror(av[i]);
+ continue;
+ }
+ if (S_ISREG(sb.st_mode)) {
+ f = fopen(av[i], "r");
+ if (f == NULL) {
+ perror(av[i]);
+ continue;
+ }
+ lsprop(f, av[i]);
+ fclose(f);
+ } else if (S_ISDIR(sb.st_mode)) {
+ lsdir(av[i]);
+ }
+ }
+ exit(0);
+}
+
+void lsdir(char *name)
+{
+ DIR *d;
+ struct dirent *de;
+ char *p, *q;
+ struct stat sb;
+ FILE *f;
+ int np = 0;
+
+ d = opendir(name);
+ if (d == NULL) {
+ perror(name);
+ return;
+ }
+
+ p = malloc(strlen(name) + 520);
+ if (p == 0) {
+ fprintf(stderr, "%s: virtual memory exhausted\n", name);
+ closedir(d);
+ return;
+ }
+ strcpy(p, name);
+ q = p + strlen(p);
+ while (q > p && q[-1] == '/')
+ --q;
+ if (q == p + 1 && p[0] == '.')
+ q = p;
+ else
+ *q++ = '/';
+
+ while ((de = readdir(d)) != NULL) {
+ if (strcmp(de->d_name, ".") == 0 || strcmp(de->d_name, "..") == 0)
+ continue;
+ strcpy(q, de->d_name);
+ if (stat(p, &sb) < 0) {
+ perror(p);
+ continue;
+ }
+ if (S_ISREG(sb.st_mode)) {
+ f = fopen(p, "r");
+ if (f == NULL) {
+ perror(p);
+ } else {
+ lsprop(f, de->d_name);
+ fclose(f);
+ ++np;
+ }
+ }
+ }
+ rewinddir(d);
+ while ((de = readdir(d)) != NULL) {
+ if (strcmp(de->d_name, ".") == 0 || strcmp(de->d_name, "..") == 0)
+ continue;
+ strcpy(q, de->d_name);
+ if (lstat(p, &sb) < 0) {
+ perror(p);
+ continue;
+ }
+ if (S_ISDIR(sb.st_mode)) {
+ if (np)
+ printf("\n");
+ printf("%s:\n", p);
+ lsdir(p);
+ ++np;
+ }
+ }
+ free(p);
+ closedir(d);
+}
+
+void lsprop(FILE *f, char *name)
+{
+ int n, nw, npl, i, j;
+
+ n = fread(buf, 1, maxbytes, f);
+ if (n < 0) {
+ printf("%s: read error\n", name);
+ return;
+ }
+ printf("%-16s", name);
+ if (strlen(name) > 16)
+ printf("\n\t\t");
+ for (i = 0; i < n; ++i)
+ if (buf[i] >= 0x7f ||
+ (buf[i] < 0x20 && buf[i] != '\r' && buf[i] != '\n'
+ && buf[i] != '\t' && buf[i] != 0))
+ break;
+ if (i == n && n != 0 && (n == 1 || buf[0] != 0) && buf[n-1] == 0) {
+ printf(" \"");
+ for (i = 0; i < n - 1; ++i)
+ if (buf[i] == 0)
+ printf("\"\n\t\t \"");
+ else if (buf[i] == '\r' || buf[i] == '\n')
+ printf("\n\t\t ");
+ else
+ putchar(buf[i]);
+ putchar('"');
+ } else if ((n & 3) == 0) {
+ nw = n >> 2;
+ if (nw == 1) {
+ i = *(int *)buf;
+ printf(" %.8x", i);
+ if (i > -0x10000 && !(i >= 0 && i <= 9))
+ printf(" (%d)", i);
+ } else {
+ npl = words_per_line;
+ if (npl <= 0) {
+ if ((nw % 6) == 0)
+ npl = 6;
+ else if ((nw % 5) == 0)
+ npl = 5;
+ else
+ npl = 4;
+ }
+ for (i = 0; i < nw; i += npl) {
+ if (i != 0)
+ printf("\n\t\t");
+ for (j = 0; j < npl && i + j < nw; ++j)
+ printf(" %.8x", ((unsigned int *)buf)[i+j]);
+ }
+ }
+ } else {
+ for (i = 0; i < n; i += 16) {
+ if (i != 0)
+ printf("\n\t\t");
+ for (j = 0; j < 16 && i + j < n; ++j)
+ printf(" %.2x", buf[i+j]);
+ for (; j < 16; ++j)
+ printf(" ");
+ for (j = 0; j < 16 && i + j < n; ++j)
+ if (buf[i+j] > 0x20 && buf[i+j] <= 0x7e)
+ putchar(buf[i+j]);
+ else
+ putchar('.');
+ }
+ }
+ printf("\n");
+ if (n == maxbytes) {
+ while ((i = fread(buf, 1, maxbytes, f)) > 0)
+ n += i;
+ if (n > maxbytes)
+ printf("\t\t [%d bytes total]\n", n);
+ }
+}
+
diff -Nur dtc.orig/Makefile dtc/Makefile
--- dtc.orig/Makefile 2005-06-01 11:44:29.000002000 -0500
+++ dtc/Makefile 2005-06-01 11:46:26.000002000 -0500
@@ -1,15 +1,21 @@
-TARGETS = dtc
+TARGETS = dtc lsprop
CFLAGS = -Wall -g
-OBJS = dtc.o livetree.o flattree.o data.o treesource.o fstree.o \
+OBJS-dtc = dtc.o livetree.o flattree.o data.o treesource.o fstree.o \
y.tab.o lex.yy.o
+OBJS-lsprop = lsprop.o
+
+
default: $(TARGETS)
-dtc: $(OBJS)
+dtc: $(OBJS-dtc)
+ $(LINK.c) -o $@ $^
+
+lsprop: $(OBJS-lsprop)
$(LINK.c) -o $@ $^
-$(OBJS): dtc.h
+$(OBJS-dtc): dtc.h
y.tab.c y.tab.h: dtc-parser.y
$(YACC) -d $<
More information about the Linuxppc-embedded
mailing list