Merge branch 'master' of /home/nchip/public_html/qemu into garage-push
[qemu] / device_tree.c
index 2238682..cc91606 100644 (file)
 
 #include <libfdt.h>
 
-void *load_device_tree(const char *filename_path, void *load_addr)
+void *load_device_tree(const char *filename_path, int *sizep)
 {
-    int dt_file_size;
+    int dt_size;
     int dt_file_load_size;
-    int new_dt_size;
     int ret;
-    void *dt_file = NULL;
-    void *fdt;
+    void *fdt = NULL;
 
-    dt_file_size = get_image_size(filename_path);
-    if (dt_file_size < 0) {
+    *sizep = 0;
+    dt_size = get_image_size(filename_path);
+    if (dt_size < 0) {
         printf("Unable to get size of device tree file '%s'\n",
             filename_path);
         goto fail;
     }
 
+    /* Expand to 2x size to give enough room for manipulation.  */
+    dt_size *= 2;
     /* First allocate space in qemu for device tree */
-    dt_file = qemu_mallocz(dt_file_size);
-    if (dt_file == NULL) {
-        printf("Unable to allocate memory in qemu for device tree\n");
+    fdt = qemu_mallocz(dt_size);
+
+    dt_file_load_size = load_image(filename_path, fdt);
+    if (dt_file_load_size < 0) {
+        printf("Unable to open device tree file '%s'\n",
+               filename_path);
         goto fail;
     }
 
-    dt_file_load_size = load_image(filename_path, dt_file);
-
-    /* Second we place new copy of 2x size in guest memory
-     * This give us enough room for manipulation.
-     */
-    new_dt_size = dt_file_size * 2;
-
-    fdt = load_addr;
-    ret = fdt_open_into(dt_file, fdt, new_dt_size);
+    ret = fdt_open_into(fdt, fdt, dt_size);
     if (ret) {
         printf("Unable to copy device tree in memory\n");
         goto fail;
@@ -68,12 +64,11 @@ void *load_device_tree(const char *filename_path, void *load_addr)
             filename_path);
         goto fail;
     }
-    /* free qemu memory with old device tree */
-    qemu_free(dt_file);
+    *sizep = dt_size;
     return fdt;
 
 fail:
-    qemu_free(dt_file);
+    qemu_free(fdt);
     return NULL;
 }