Index: fdt_common.c =================================================================== --- fdt_common.c (revision 239938) +++ fdt_common.c (working copy) @@ -70,6 +70,10 @@ pcell_t addr_cells, size_cells, par_addr_cells; int len, tuple_size, tuples; + /* Set defaults */ + *base = 0; + *size = ULONG_MAX; + if ((fdt_addrsize_cells(node, &addr_cells, &size_cells)) != 0) return (ENXIO); /* @@ -83,8 +87,6 @@ if (len > sizeof(ranges)) return (ENOMEM); if (len == 0) { - *base = 0; - *size = ULONG_MAX; return (0); } @@ -102,7 +104,6 @@ addr_cells, size_cells)) { return (ERANGE); } - *base = 0; *size = 0; rangesptr = &ranges[range_id]; @@ -269,10 +270,13 @@ /* Find out #address-cells of the superior bus. */ if (OF_searchprop(OF_parent(node), "#address-cells", &addr_cells, - sizeof(addr_cells)) <= 0) + sizeof(addr_cells)) <= 0) { addr_cells = 2; + } else { + addr_cells = fdt32_to_cpu(addr_cells); + } - return ((int)fdt32_to_cpu(addr_cells)); + return ((int)addr_cells); } int @@ -322,16 +326,22 @@ * Retrieve #{address,size}-cells. */ cell_size = sizeof(cell); - if (OF_getprop(node, "#address-cells", &cell, cell_size) < cell_size) - cell = 2; - *addr_cells = fdt32_to_cpu((int)cell); + if (OF_getprop(node, "#address-cells", &cell, cell_size) < cell_size) { + *addr_cells = 2; + } else { + *addr_cells = fdt32_to_cpu((int)cell); + if (*addr_cells > 3) + return (ERANGE); + } - if (OF_getprop(node, "#size-cells", &cell, cell_size) < cell_size) - cell = 1; - *size_cells = fdt32_to_cpu((int)cell); + if (OF_getprop(node, "#size-cells", &cell, cell_size) < cell_size) { + *size_cells = 1; + } else { + *size_cells = fdt32_to_cpu((int)cell); + if (*size_cells > 2) + return (ERANGE); + } - if (*addr_cells > 3 || *size_cells > 2) - return (ERANGE); return (0); } @@ -523,8 +533,7 @@ sizeof(intr_cells)) <= 0) { debugf("no intr-cells defined, defaulting to 1\n"); intr_cells = 1; - } - else + } else intr_cells = fdt32_to_cpu(intr_cells); intr_num = OF_getprop_alloc(node, "interrupts",