[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[XenPPC] [pushed] [ppc] fix dom creation



changeset:   10269:d2680c1914f16f249a4d045dcf326dcb4e4dc158
user:        jimix@xxxxxxxxxxxxxxxxxxxxx
date:        Fri May 12 16:05:41 2006 -0400
files:       tools/domctrl/create.c
description:
[ppc] fix dom creation


diff -r e8877f530c35434e15137ba0ca6a94cd1290da24 -r 
d2680c1914f16f249a4d045dcf326dcb4e4dc158 tools/domctrl/create.c
--- a/tools/domctrl/create.c    Fri May 12 16:05:10 2006 -0400
+++ b/tools/domctrl/create.c    Fri May 12 16:05:41 2006 -0400
@@ -22,17 +22,9 @@
         (void) (&_x == &_y);            \
         _x > _y ? _x : _y; })
 
-const char firmware_path[] = "ofh_bin";
-const char devtree_path[] = "domU-devtree.bin";
-const char initrd_path[] = "initrd";
-
-const unsigned long FIRMWARE_ADDR = 16<<20;
-const unsigned long DEVTREE_ADDR = 20<<20;
-const unsigned long INITRD_ADDR = 24<<20;
-
-static uint8_t *load_file(const char *path, unsigned long *filesize)
-{
-       uint8_t *img;
+static void *load_file(const char *path, unsigned long *filesize)
+{
+       void *img;
        ssize_t size;
        int fd;
 
@@ -47,6 +39,7 @@ static uint8_t *load_file(const char *pa
        size = lseek(fd, 0, SEEK_END);
        if (size < 0) {
                perror(path);
+        close(fd);
                return NULL;
        }
        lseek(fd, 0, SEEK_SET);
@@ -54,22 +47,29 @@ static uint8_t *load_file(const char *pa
        img = malloc(size);
        if (img == NULL) {
                perror(path);
+        close(fd);
                return NULL;
        }
 
        size = read(fd, img, size);
        if (size <= 0) {
                perror(path);
+        close(fd);
                free(img);
                return NULL;
        }
 
        if (filesize)
                *filesize = size;
-
+    close(fd);
        return img;
 }
 
+static void free_file(void *img)
+{
+    if (img != NULL)
+        free(img);
+}
 static int create_domain(int *domid)
 {
        xen_domain_handle_t dummy = { 0 };
@@ -106,9 +106,11 @@ static int create_domain(int *domid)
        return 0;
 }
 
-static int init_boot_vcpu(int domid, struct domain_setup_info *dsi,
-                       unsigned long fwbase, unsigned long initrd_base,
-                       unsigned long initrd_len)
+static int init_boot_vcpu(
+    int domid,
+    struct domain_setup_info *dsi,
+    unsigned long dtb,
+    unsigned long kaddr)
 {
        vcpu_guest_context_t ctxt;
        int rc;
@@ -117,9 +119,9 @@ static int init_boot_vcpu(int domid, str
        ctxt.user_regs.pc = dsi->v_kernentry;
        ctxt.user_regs.msr = 0;
        ctxt.user_regs.gprs[1] = 32<<20; /* XXX arbitrary stack address */
-       ctxt.user_regs.gprs[3] = initrd_base;
-       ctxt.user_regs.gprs[4] = initrd_len;
-       ctxt.user_regs.gprs[5] = fwbase;
+       ctxt.user_regs.gprs[3] = dtb;
+       ctxt.user_regs.gprs[4] = kaddr;
+       ctxt.user_regs.gprs[5] = 0;
 
        DEBUG(printf("xc_vcpu_setvcpucontext\n"));
        rc = xc_vcpu_setcontext(xc_handle, domid, 0, &ctxt);
@@ -155,56 +157,27 @@ static int install_image(int domid, unsi
 }
 
 /* XXX be more flexible about placement in memory */
-static int load_firmware(int domid, const char *fwpath, const char *dtpath,
-                       struct domain_setup_info *dsi,
-                       unsigned long *page_array, unsigned long *fwbase)
-{
-       uint64_t *ofh_tree;
+static int load_dtb(
+    int domid,
+    const char *dtb_path,
+    unsigned long dtb_addr,
+    struct domain_setup_info *dsi,
+    unsigned long *page_array)
+{
        uint8_t *img;
-       unsigned long fwsize;
-       unsigned long dtsize;
+       unsigned long dtb_size;
        int rc = 0;
 
-       img = load_file(dtpath, &dtsize);
-       if (img == NULL) {
-               rc = -1;
-               goto out;
-       }
-
-       /* place the device tree at 20MB */
-       DEBUG(printf("copying device tree to 0x%lx - 0x%lx\n", DEVTREE_ADDR,
-                               DEVTREE_ADDR + dtsize));
-       if (install_image(domid, page_array, img, DEVTREE_ADDR, dtsize))
-               goto out;
-       free(img);
-
-       /* load firmware image */
-       img = load_file(fwpath, &fwsize);
-       if (img == NULL) {
-               rc = -1;
-               goto out;
-       }
-
-       /* inform firmware of the device tree location */
-       ofh_tree = (uint64_t *)(img + 0x10);
-       if (*ofh_tree != 0xdeadbeef00000000) {
-               fprintf(stderr, "error: misformatted firmware image\n");
-               rc = -1;
-               goto out;
-       }
-       *ofh_tree = DEVTREE_ADDR;
-
-       /* place the firmware image at 16MB */
-       DEBUG(printf("copying firmware to 0x%lx - 0x%lx\n", FIRMWARE_ADDR,
-                               FIRMWARE_ADDR + fwsize));
-       if (install_image(domid, page_array, img, FIRMWARE_ADDR, fwsize))
-               goto out;
-
-       dsi->v_end = max(DEVTREE_ADDR + dtsize, FIRMWARE_ADDR + fwsize);
-       *fwbase = FIRMWARE_ADDR;
-
-out:
-       free(img);
+       img = load_file(dtb_path, &dtb_size);
+    if (img != NULL) {
+        DEBUG(printf("copying device tree to 0x%lx[0x%lx]\n",
+                     dtb_addr, dtb_size));
+        if (install_image(domid, page_array, img, dtb_addr, dtb_size) != 0)
+            printf("%s: install_image(): failed\n", __func__);
+    } else
+        printf("%s: load_file(%s): fialed\n", __func__, dtb_path);
+
+       free_file(img);
        return rc;
 }
 
@@ -238,9 +211,11 @@ static void hack_kernel_img(uint8_t *img
        }
 }
 
-static int load_kernel(int domid, const char *kernel_path,
-                       struct domain_setup_info *dsi,
-                       unsigned long *page_array)
+static int load_kernel(
+    int domid,
+    const char *kernel_path,
+    struct domain_setup_info *dsi,
+    unsigned long *page_array)
 {
        struct load_funcs load_funcs;
        uint8_t *kernel_img;
@@ -259,6 +234,7 @@ static int load_kernel(int domid, const 
        DEBUG(printf("probe_elf\n"));
        rc = probe_elf(kernel_img, kernel_size, &load_funcs);
        if (rc < 0) {
+        rc = -1;
                printf("%s is not an ELF file\n", kernel_path);
                goto out;
        }
@@ -266,6 +242,7 @@ static int load_kernel(int domid, const 
        DEBUG(printf("parseimage\n"));
        rc = (load_funcs.parseimage)(kernel_img, kernel_size, dsi);
        if (rc < 0) {
+        rc = -1;
                goto out;
        }
 
@@ -280,12 +257,17 @@ static int load_kernel(int domid, const 
        DEBUG(printf("  v_kernentry %lx\n", dsi->v_kernentry));
 
 out:
-       free(kernel_img);
-       return rc;
-}
-
-static int load_initrd(int domid, unsigned long *page_array,
-               const char *initrd_path, unsigned long *base, unsigned long 
*len)
+       free_file(kernel_img);
+       return rc;
+}
+
+#ifdef INITRD
+static int load_initrd(
+    int domid,
+    unsigned long *page_array,
+    const char *initrd_path,
+    unsigned long *base,
+    unsigned long *len)
 {
        uint8_t *initrd_img;
 
@@ -302,36 +284,45 @@ static int load_initrd(int domid, unsign
        *base = INITRD_ADDR;
 
 out:
-       free(initrd_img);
+       free_file(initrd_img);
        return 0;
 }
+#endif
 
 /* place start_info in the uppermost page */
-static int load_start_info(int domid, unsigned long *page_array)
-{
-       start_info_t start_info;
-       start_info_t *si = &start_info;
-       int rc;
-
-       memset(si, 0, sizeof(start_info_t));
-       snprintf(si->magic, sizeof(si->magic), "xen-%d.%d-ppc", 3, 0);
-       /* these pages should have been pre-zeroed */
-       si->shared_info = SHARED_MFN;
-       si->console_mfn = CONSOLE_MFN;
-
-       DEBUG(printf("start_info (%lx):\n", START_MFN));
-       DEBUG(printf("    shared_info = %lx\n", si->shared_info));
-       DEBUG(printf("    console_mfn = %lx\n", si->console_mfn));
-
-       rc = domain_copy(domid, page_array, si, START_MFN << PAGE_SHIFT,
-                       sizeof(start_info_t), PUSH);
+static int load_start_info(
+    int domid,
+    start_info_t *si,
+    unsigned long si_addr,
+    unsigned long *page_array)
+{
+       int rc;
+
+       rc = domain_copy(domid, page_array, si,
+                     si_addr, sizeof(start_info_t), PUSH);
        if (rc) {
                perror("domain_copy");
-               goto out;
-       }
-
-out:
-       return rc;
+       }
+       return rc;
+}
+
+static unsigned long create_start_info(start_info_t *si)
+{
+    unsigned long eomem;
+    unsigned long si_addr;
+
+       memset(si, 0, sizeof(*si));
+       snprintf(si->magic, sizeof(si->magic), "xen-%d.%d-powerpc64HV", 3, 0);
+
+    eomem = (64 << 20);
+    si->nr_pages = eomem >> PAGE_SHIFT;
+    si->shared_info = eomem - (PAGE_SIZE * 1);
+    si->store_mfn = si->nr_pages - 2;
+    si->console_mfn = si->nr_pages - 3;
+    si->console_evtchn = 2;
+    si_addr = eomem - (PAGE_SIZE * 4);
+
+    return si_addr;
 }
 
 static int start_domain(int xc_handle, int domid)
@@ -350,14 +341,19 @@ int create(char *argv[], int argc)
 {
        struct domain_setup_info dsi;
        unsigned long *page_array;
-       unsigned long fwbase;
+    unsigned long kern_addr;
+    unsigned long dtb_addr;
+    unsigned long si_addr;
+    start_info_t si;
+       int domid = 0;
+       int rc = 0;
+#ifdef INITRD
        unsigned long initrd_base = 0;
        unsigned long initrd_len = 0;
-       int domid = 0;
-       int rc = 0;
-
-       if (argc < 2) {
-               printf("Usage: domctrl create <kernel>\n");
+#endif
+
+       if (argc < 3) {
+               printf("Usage: domctrl create <kernel> <dtb>\n");
                return -1;
        }
 
@@ -371,24 +367,28 @@ int create(char *argv[], int argc)
                goto out;
        }
 
-       if (-1 == load_kernel(domid, argv[1], &dsi, page_array)) {
-               rc = -1;
-               goto out;
-       }
-
-       if (-1 == load_firmware(domid, firmware_path, devtree_path, &dsi,
-                               page_array, &fwbase)) {
-               rc = -1;
-               goto out;
-       }
-
+       if (-1 ==  load_kernel(domid, argv[1], &dsi, page_array)) {
+               rc = -1;
+               goto out;
+       }
+    kern_addr = 0;
+
+    dtb_addr = (32 << 20);
+       if (-1 == load_dtb(domid, argv[2], dtb_addr, &dsi, page_array)) {
+               rc = -1;
+               goto out;
+       }
+
+#ifdef INITRD
        if (-1 == load_initrd(domid, page_array, initrd_path, &initrd_base,
                                &initrd_len)) {
                rc = -1;
                goto out;
        }
-
-       if (-1 == load_start_info(domid, page_array)) {
+#endif
+
+    si_addr = create_start_info(&si);
+       if (-1 == load_start_info(domid, &si, si_addr, page_array)) {
                rc = -1;
                goto out;
        }
@@ -399,7 +399,7 @@ int create(char *argv[], int argc)
         * store page
         */
 
-       if (0 > init_boot_vcpu(domid, &dsi, fwbase, initrd_base, initrd_len)) {
+       if (0 > init_boot_vcpu(domid, &dsi, dtb_addr, kern_addr)) {
                rc = -1;
                goto out;
        }



_______________________________________________
Xen-ppc-devel mailing list
Xen-ppc-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ppc-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.