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