[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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |