Browse Source

libfdt: Fix libfdt for little endian hosts

This patch fixes a number of embarrasing oversights which meant libfdt
did not work correctly on little endian machines.  With this patch the
testsuite now passes on x86.  Device trees are always created
big-endian.
main
David Gibson 19 years ago
parent
commit
e25487db34
  1. 2
      fdt_wip.c
  2. 20
      libfdt.h
  3. 2
      tests/root_node.c
  4. 53
      tests/trees.S

2
fdt_wip.c

@ -46,7 +46,7 @@ static void nop_region(void *start, int len) @@ -46,7 +46,7 @@ static void nop_region(void *start, int len)
uint32_t *p;

for (p = start; (void *)p < (start + len); p++)
*p = FDT_NOP;
*p = cpu_to_fdt32(FDT_NOP);
}

int fdt_nop_property(struct fdt_header *fdt, int nodeoffset, const char *name)

20
libfdt.h

@ -45,16 +45,16 @@ @@ -45,16 +45,16 @@

#define FDT_ERR_MAX 14

#define fdt_magic(fdt) (fdt32_to_cpu(fdt)->magic)
#define fdt_totalsize(fdt) (fdt32_to_cpu(fdt)->totalsize)
#define fdt_off_dt_struct(fdt) (fdt32_to_cpu(fdt)->off_dt_struct)
#define fdt_off_dt_strings(fdt) (fdt32_to_cpu(fdt)->off_dt_strings)
#define fdt_off_mem_rsvmap(fdt) (fdt32_to_cpu(fdt)->off_mem_rsvmap)
#define fdt_version(fdt) (fdt32_to_cpu(fdt)->version)
#define fdt_last_comp_version(fdt) (fdt32_to_cpu(fdt)->last_comp_version)
#define fdt_boot_cpuid_phys(fdt) (fdt32_to_cpu(fdt)->boot_cpuid_phys)
#define fdt_size_dt_strings(fdt) (fdt32_to_cpu(fdt)->size_dt_strings)
#define fdt_size_dt_struct(fdt) (fdt32_to_cpu(fdt)->size_dt_struct)
#define fdt_magic(fdt) (fdt32_to_cpu(fdt->magic))
#define fdt_totalsize(fdt) (fdt32_to_cpu(fdt->totalsize))
#define fdt_off_dt_struct(fdt) (fdt32_to_cpu(fdt->off_dt_struct))
#define fdt_off_dt_strings(fdt) (fdt32_to_cpu(fdt->off_dt_strings))
#define fdt_off_mem_rsvmap(fdt) (fdt32_to_cpu(fdt->off_mem_rsvmap))
#define fdt_version(fdt) (fdt32_to_cpu(fdt->version))
#define fdt_last_comp_version(fdt) (fdt32_to_cpu(fdt->last_comp_version))
#define fdt_boot_cpuid_phys(fdt) (fdt32_to_cpu(fdt->boot_cpuid_phys))
#define fdt_size_dt_strings(fdt) (fdt32_to_cpu(fdt->size_dt_strings))
#define fdt_size_dt_struct(fdt) (fdt32_to_cpu(fdt->size_dt_struct))

void *fdt_offset_ptr(const struct fdt_header *fdt, int offset, int checklen);


2
tests/root_node.c

@ -41,7 +41,7 @@ int main(int argc, char *argv[]) @@ -41,7 +41,7 @@ int main(int argc, char *argv[])
if (! nh)
FAIL("NULL retrieving root node");

if (nh->tag != FDT_BEGIN_NODE)
if (fdt32_to_cpu(nh->tag) != FDT_BEGIN_NODE)
FAIL("Wrong tag on root node");

if (strlen(nh->name) != 0)

53
tests/trees.S

@ -1,32 +1,49 @@ @@ -1,32 +1,49 @@
#include <fdt.h>
#include "testdata.h"

#define FDTLONG(val) \
.byte ((val) >> 24) & 0xff ; \
.byte ((val) >> 16) & 0xff ; \
.byte ((val) >> 8) & 0xff ; \
.byte (val) & 0xff

#define FDTQUAD(val) \
.byte ((val) >> 56) & 0xff ; \
.byte ((val) >> 48) & 0xff ; \
.byte ((val) >> 40) & 0xff ; \
.byte ((val) >> 32) & 0xff ; \
.byte ((val) >> 24) & 0xff ; \
.byte ((val) >> 16) & 0xff ; \
.byte ((val) >> 8) & 0xff ; \
.byte (val) & 0xff

#define TREE_HDR(tree) \
.globl _##tree ; \
_##tree: \
tree: \
.long FDT_MAGIC ; \
.long tree##_end - tree ; \
.long tree##_struct - tree ; \
.long tree##_strings - tree ; \
.long tree##_rsvmap - tree ; \
.long 0x11 ; \
.long 0x10 ; \
.long 0 ; \
.long tree##_end - tree##_strings ; \
.long tree##_strings - tree##_struct ;
FDTLONG(FDT_MAGIC) ; \
FDTLONG(tree##_end - tree) ; \
FDTLONG(tree##_struct - tree) ; \
FDTLONG(tree##_strings - tree) ; \
FDTLONG(tree##_rsvmap - tree) ; \
FDTLONG(0x11) ; \
FDTLONG(0x10) ; \
FDTLONG(0) ; \
FDTLONG(tree##_end - tree##_strings) ; \
FDTLONG(tree##_strings - tree##_struct) ;

#define RSVMAP_ENTRY(addr, len) \
.quad addr ; \
.quad len ;
FDTQUAD(addr) ; \
FDTQUAD(len) ;

#define PROPHDR(tree, name, len) \
.long FDT_PROP ; \
.long tree##_##name - tree##_strings ; \
.long len ;
FDTLONG(FDT_PROP) ; \
FDTLONG(tree##_##name - tree##_strings) ; \
FDTLONG(len) ;

#define PROP_INT(tree, name, val) \
PROPHDR(tree, name, 4) \
/* For ease of testing the property values go in native-endian */ \
.long val

#define PROP_STR(tree, name, str) \
@ -37,12 +54,12 @@ tree: \ @@ -37,12 +54,12 @@ tree: \
.balign 4

#define BEGIN_NODE(name) \
.long FDT_BEGIN_NODE ; \
FDTLONG(FDT_BEGIN_NODE) ; \
.string name ; \
.balign 4

#define END_NODE \
.long FDT_END_NODE ;
FDTLONG(FDT_END_NODE) ;

#define STRING(tree, name, str) \
tree##_##name: \
@ -77,7 +94,7 @@ test_tree1_struct: @@ -77,7 +94,7 @@ test_tree1_struct:
END_NODE

END_NODE
.long FDT_END
FDTLONG(FDT_END)

test_tree1_strings:
STRING(test_tree1, prop_int, "prop-int")

Loading…
Cancel
Save