@@ -196,16 +196,16 @@ const void *qemu_devtree_getprop(void *fdt, const char *node_path,
}
uint32_t qemu_devtree_getprop_cell(void *fdt, const char *node_path,
- const char *property)
+ const char *property, int offset)
{
int len;
const uint32_t *p = qemu_devtree_getprop(fdt, node_path, property, &len);
- if (len != 4) {
- fprintf(stderr, "%s: %s/%s not 4 bytes long (not a cell?)\n",
- __func__, node_path, property);
+ if (len < (offset+1)*4) {
+ fprintf(stderr, "%s: %s/%s not long enough to hold %d properties\n",
+ __func__, node_path, property, offset+1);
exit(1);
}
- return be32_to_cpu(*p);
+ return be32_to_cpu(p[offset]);
}
uint32_t qemu_devtree_get_phandle(void *fdt, const char *path)
@@ -31,7 +31,7 @@ int qemu_devtree_setprop_phandle(void *fdt, const char *node_path,
const void *qemu_devtree_getprop(void *fdt, const char *node_path,
const char *property, int *lenp);
uint32_t qemu_devtree_getprop_cell(void *fdt, const char *node_path,
- const char *property);
+ const char *property, int offset);
uint32_t qemu_devtree_get_phandle(void *fdt, const char *path);
uint32_t qemu_devtree_alloc_phandle(void *fdt);
int qemu_devtree_nop_node(void *fdt, const char *node_path);
@@ -237,8 +237,8 @@ static int load_dtb(target_phys_addr_t addr, const struct arm_boot_info *binfo)
}
g_free(filename);
- acells = qemu_devtree_getprop_cell(fdt, "/", "#address-cells");
- scells = qemu_devtree_getprop_cell(fdt, "/", "#size-cells");
+ acells = qemu_devtree_getprop_cell(fdt, "/", "#address-cells", 0);
+ scells = qemu_devtree_getprop_cell(fdt, "/", "#size-cells", 0);
if (acells == 0 || scells == 0) {
fprintf(stderr, "dtb file invalid (#address-cells or #size-cells 0)\n");
return -1;
Signed-off-by: Peter A. G. Crosthwaite <peter.crosthwaite@petalogix.com> --- device_tree.c | 10 +++++----- device_tree.h | 2 +- hw/arm_boot.c | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-)