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)
uint32_t *p; uint32_t *p;


for (p = start; (void *)p < (start + len); 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) int fdt_nop_property(struct fdt_header *fdt, int nodeoffset, const char *name)

20
libfdt.h

@ -45,16 +45,16 @@


#define FDT_ERR_MAX 14 #define FDT_ERR_MAX 14


#define fdt_magic(fdt) (fdt32_to_cpu(fdt)->magic) #define fdt_magic(fdt) (fdt32_to_cpu(fdt->magic))
#define fdt_totalsize(fdt) (fdt32_to_cpu(fdt)->totalsize) #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_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_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_off_mem_rsvmap(fdt) (fdt32_to_cpu(fdt->off_mem_rsvmap))
#define fdt_version(fdt) (fdt32_to_cpu(fdt)->version) #define fdt_version(fdt) (fdt32_to_cpu(fdt->version))
#define fdt_last_comp_version(fdt) (fdt32_to_cpu(fdt)->last_comp_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_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_strings(fdt) (fdt32_to_cpu(fdt->size_dt_strings))
#define fdt_size_dt_struct(fdt) (fdt32_to_cpu(fdt)->size_dt_struct) #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); 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[])
if (! nh) if (! nh)
FAIL("NULL retrieving root node"); 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"); FAIL("Wrong tag on root node");


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

53
tests/trees.S

@ -1,32 +1,49 @@
#include <fdt.h> #include <fdt.h>
#include "testdata.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) \ #define TREE_HDR(tree) \
.globl _##tree ; \ .globl _##tree ; \
_##tree: \ _##tree: \
tree: \ tree: \
.long FDT_MAGIC ; \ FDTLONG(FDT_MAGIC) ; \
.long tree##_end - tree ; \ FDTLONG(tree##_end - tree) ; \
.long tree##_struct - tree ; \ FDTLONG(tree##_struct - tree) ; \
.long tree##_strings - tree ; \ FDTLONG(tree##_strings - tree) ; \
.long tree##_rsvmap - tree ; \ FDTLONG(tree##_rsvmap - tree) ; \
.long 0x11 ; \ FDTLONG(0x11) ; \
.long 0x10 ; \ FDTLONG(0x10) ; \
.long 0 ; \ FDTLONG(0) ; \
.long tree##_end - tree##_strings ; \ FDTLONG(tree##_end - tree##_strings) ; \
.long tree##_strings - tree##_struct ; FDTLONG(tree##_strings - tree##_struct) ;


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


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


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


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


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


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


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


END_NODE END_NODE
.long FDT_END FDTLONG(FDT_END)


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

Loading…
Cancel
Save