1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| int unflatten_device_tree(const void *blob, struct device_node **mynodes) { unsigned long size; int start; void *mem;
if (fdt_check_header(blob)) { debug("Invalid device tree blob header\n"); return -EINVAL; }
start = 0; size = (unsigned long)unflatten_dt_node(blob, NULL, &start, NULL, NULL, 0, true);
mem = memalign(__alignof__(struct device_node), size + 4); memset(mem, '\0', size);
*(u32 *)mem = BAD_OF_ROOT;
*(__be32 *)(mem + size) = cpu_to_be32(0xdeadbeef);
debug(" unflattening %p...\n", mem);
start = 0; unflatten_dt_node(blob, mem, &start, NULL, mynodes, 0, false); if (be32_to_cpup(mem + size) != 0xdeadbeef) { debug("End of tree marker overwritten: %08x\n", be32_to_cpup(mem + size)); return -ENOSPC; }
debug(" <- unflatten_device_tree()\n");
return 0; }
|