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