Revision 9bfa659e

b/hw/arm_boot.c
216 216
static int load_dtb(target_phys_addr_t addr, const struct arm_boot_info *binfo)
217 217
{
218 218
#ifdef CONFIG_FDT
219
    uint32_t mem_reg_property[] = { cpu_to_be32(binfo->loader_start),
220
                                    cpu_to_be32(binfo->ram_size) };
219
    uint32_t *mem_reg_property;
220
    uint32_t mem_reg_propsize;
221 221
    void *fdt = NULL;
222 222
    char *filename;
223 223
    int size, rc;
224
    uint32_t acells, scells, hival;
224 225

  
225 226
    filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, binfo->dtb_filename);
226 227
    if (!filename) {
......
236 237
    }
237 238
    g_free(filename);
238 239

  
240
    acells = qemu_devtree_getprop_cell(fdt, "/", "#address-cells");
241
    scells = qemu_devtree_getprop_cell(fdt, "/", "#size-cells");
242
    if (acells == 0 || scells == 0) {
243
        fprintf(stderr, "dtb file invalid (#address-cells or #size-cells 0)\n");
244
        return -1;
245
    }
246

  
247
    mem_reg_propsize = acells + scells;
248
    mem_reg_property = g_new0(uint32_t, mem_reg_propsize);
249
    mem_reg_property[acells - 1] = cpu_to_be32(binfo->loader_start);
250
    hival = cpu_to_be32(binfo->loader_start >> 32);
251
    if (acells > 1) {
252
        mem_reg_property[acells - 2] = hival;
253
    } else if (hival != 0) {
254
        fprintf(stderr, "qemu: dtb file not compatible with "
255
                "RAM start address > 4GB\n");
256
        exit(1);
257
    }
258
    mem_reg_property[acells + scells - 1] = cpu_to_be32(binfo->ram_size);
259
    hival = cpu_to_be32(binfo->ram_size >> 32);
260
    if (scells > 1) {
261
        mem_reg_property[acells + scells - 2] = hival;
262
    } else if (hival != 0) {
263
        fprintf(stderr, "qemu: dtb file not compatible with "
264
                "RAM size > 4GB\n");
265
        exit(1);
266
    }
267

  
239 268
    rc = qemu_devtree_setprop(fdt, "/memory", "reg", mem_reg_property,
240
                               sizeof(mem_reg_property));
269
                              mem_reg_propsize * sizeof(uint32_t));
241 270
    if (rc < 0) {
242 271
        fprintf(stderr, "couldn't set /memory/reg\n");
243 272
    }

Also available in: Unified diff