[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] Patches and recipe to build an elilo.efi that will boot domain0 with initrd
# HG changeset patch # User djm@xxxxxxxxxxxxxxx # Node ID 97dbd9524a7e918f2ffb2d5155a7e32c48f7f355 # Parent babbdd896024460e365332c0656706283a26f75a Patches and recipe to build an elilo.efi that will boot domain0 with initrd and pre-built "xlilo.efi". Courtesy of Anthony Xu and Fred Yang. diff -r babbdd896024 -r 97dbd9524a7e xen/arch/ia64/tools/xelilo/elilo-3.4.11.xen.patch --- /dev/null Thu Sep 22 12:59:57 2005 +++ b/xen/arch/ia64/tools/xelilo/elilo-3.4.11.xen.patch Thu Sep 22 17:34:14 2005 @@ -0,0 +1,402 @@ +<Sign-off: fred.yang@xxxxxxxxx> +diff -Naur base/bootparams.c elilo/bootparams.c +--- base/bootparams.c 2005-09-20 19:51:07.000000000 -0700 ++++ elilo/bootparams.c 2005-09-20 19:33:00.000000000 -0700 +@@ -38,7 +38,7 @@ + * bp : the address of the bootparams otherwise (opaque type) + */ + VOID * +-create_boot_params(CHAR16 *args, memdesc_t *initrd, UINTN *cookie) ++create_boot_params(CHAR16 *args, memdesc_t *initrd, memdesc_t *vmcode, UINTN *cookie) + { + /* + * XXX: need cleanup +@@ -95,7 +95,7 @@ + */ + Memset(bp, 0, BOOT_PARAM_MEMSIZE); + +- if (sysdeps_create_boot_params(bp, cp, initrd, cookie) == -1) return 0; ++ if (sysdeps_create_boot_params(bp, cp, initrd, vmcode, cookie) == -1) return 0; + + /* + * Convert kernel command line args from UNICODE to ASCII and put them where +diff -Naur base/choosers/simple.c elilo/choosers/simple.c +--- base/choosers/simple.c 2005-09-20 19:51:07.000000000 -0700 ++++ elilo/choosers/simple.c 2005-09-20 19:28:15.000000000 -0700 +@@ -37,6 +37,7 @@ + { + CHAR16 *desc; + CHAR16 initrd_name[CMDLINE_MAXLEN]; ++ CHAR16 vmcode_name[CMDLINE_MAXLEN]; + CHAR16 options_tmp[CMDLINE_MAXLEN]; + CHAR16 options[CMDLINE_MAXLEN]; + CHAR16 kname[FILENAME_MAXLEN]; +@@ -46,9 +47,9 @@ + Print(L"desc : %s\n", desc); + } + +- initrd_name[0] = options_tmp[0] = kname[0] = CHAR_NULL; ++ initrd_name[0] = vmcode_name[0] = options_tmp[0] = kname[0] = CHAR_NULL; + +- if (find_label(name, kname, options_tmp, initrd_name) == -1) { ++ if (find_label(name, kname, options_tmp, initrd_name, vmcode_name) == -1) { + StrCpy(kname, name); + Print(L"\n"); + } +@@ -56,6 +57,7 @@ + + Print(L"cmdline: %s %s\n", kname, options); + if (initrd_name[0]) Print(L"initrd : %s\n", initrd_name); ++ if (vmcode_name[0]) Print(L"vmcode : %s\n", vmcode_name); + } + + static VOID +@@ -247,6 +249,7 @@ + CHAR16 buffer[CMDLINE_MAXLEN]; + CHAR16 alt_buffer[CMDLINE_MAXLEN]; + CHAR16 initrd_name[CMDLINE_MAXLEN]; ++ CHAR16 vmcode_name[CMDLINE_MAXLEN]; + CHAR16 args[CMDLINE_MAXLEN]; + CHAR16 devname[CMDLINE_MAXLEN]; + CHAR16 dpath[FILENAME_MAXLEN]; +@@ -259,7 +262,7 @@ + display_message(); + + restart: +- initrd_name[0] = kname[0] = cmdline[0] = args[0] = CHAR_NULL; ++ initrd_name[0] = vmcode_name[0] = kname[0] = cmdline[0] = args[0] = CHAR_NULL; + + /* reset per image loader options */ + Memset(&elilo_opt.img_opt, 0, sizeof(elilo_opt.img_opt)); +@@ -303,7 +306,7 @@ + * if no match is found, the args and initrd arguments may + * still be modified by global options in the config file. + */ +- ret = find_label((index < argc) ? argv[index] : NULL, kname, args, initrd_name); ++ ret = find_label((index < argc) ? argv[index] : NULL, kname, args, initrd_name, vmcode_name); + + /* + * not found, so assume first argument is kernel name and +@@ -335,6 +338,10 @@ + StrCpy(elilo_opt.initrd, initrd_name); + } + ++ if (elilo_opt.vmcode[0] == CHAR_NULL && vmcode_name[0] != CHAR_NULL) { ++ StrCpy(elilo_opt.vmcode, vmcode_name); ++ } ++ + VERB_PRT(1, { Print(L"kernel is '%s'\n", kname); + Print(L"arguments are '%s'\n", args); + if (elilo_opt.initrd[0]) Print(L"initrd is '%s'\n", elilo_opt.initrd); +diff -Naur base/choosers/textmenu.c elilo/choosers/textmenu.c +--- base/choosers/textmenu.c 2005-09-20 19:51:07.000000000 -0700 ++++ elilo/choosers/textmenu.c 2005-09-20 19:28:29.000000000 -0700 +@@ -358,6 +358,7 @@ + # define BOOT_IMG_STR L"BOOT_IMAGE=" + CHAR16 label[CMDLINE_MAXLEN]; + CHAR16 initrd_name[CMDLINE_MAXLEN]; ++ CHAR16 vmcode_name[CMDLINE_MAXLEN]; + CHAR16 args[CMDLINE_MAXLEN]; + CHAR16 devname[CMDLINE_MAXLEN]; + CHAR16 dpath[FILENAME_MAXLEN]; +@@ -412,9 +413,9 @@ + * still be modified by global options in the config file. + */ + if (label[0]) +- ret = find_label(label, kname, args, initrd_name); ++ ret = find_label(label, kname, args, initrd_name, vmcode_name); + else +- ret = find_label(argv[index], kname, args, initrd_name); ++ ret = find_label(argv[index], kname, args, initrd_name, vmcode_name); + + /* + * not found, so assume first argument is kernel name and +@@ -448,6 +449,10 @@ + StrCpy(elilo_opt.initrd, initrd_name); + } + ++ if (elilo_opt.vmcode[0] == CHAR_NULL && vmcode_name[0] != CHAR_NULL) { ++ StrCpy(elilo_opt.vmcode, vmcode_name); ++ } ++ + VERB_PRT(1, { Print(L"kernel is '%s'\n", kname); + Print(L"arguments are '%s'\n", args); + if (elilo_opt.initrd[0]) Print(L"initrd is '%s'\n", elilo_opt.initrd); +diff -Naur base/config.c elilo/config.c +--- base/config.c 2005-09-20 19:51:07.000000000 -0700 ++++ elilo/config.c 2005-09-20 19:33:26.000000000 -0700 +@@ -68,6 +68,7 @@ + CHAR16 kname[FILENAME_MAXLEN]; + CHAR16 options[MAX_STRING]; + CHAR16 initrd[FILENAME_MAXLEN]; ++ CHAR16 vmcode[FILENAME_MAXLEN]; + CHAR16 root[FILENAME_MAXLEN]; + CHAR16 fallback[MAX_STRING]; + CHAR16 description[MAX_STRING]; +@@ -93,6 +94,7 @@ + typedef struct { + CHAR16 root[FILENAME_MAXLEN]; /* globally defined root fs */ + CHAR16 initrd[FILENAME_MAXLEN];/* globally defined initrd */ ++ CHAR16 vmcode[FILENAME_MAXLEN];/* globally defined boot-time module */ + CHAR16 options[MAX_STRING]; + CHAR16 default_image_name[MAX_STRING]; + CHAR16 message_file[MAX_MESSAGES][FILENAME_MAXLEN]; +@@ -144,6 +146,7 @@ + {OPT_BOOL, OPT_GLOBAL, L"noedd30", NULL, NULL, &global_config.edd30_no_force}, + {OPT_CMD, OPT_GLOBAL, L"append", NULL, NULL, global_config.options}, + {OPT_FILE, OPT_GLOBAL, L"initrd", NULL, NULL, global_config.initrd}, ++{OPT_FILE, OPT_GLOBAL, L"vmm", NULL, NULL, global_config.vmcode}, + {OPT_FILE, OPT_GLOBAL, L"image", do_image, NULL, opt_offsetof(kname)}, + {OPT_BOOL, OPT_GLOBAL, L"checkalt", NULL, NULL, &global_config.alt_check}, + {OPT_STR, OPT_GLOBAL, L"chooser", NULL, check_chooser, global_config.chooser}, +@@ -168,6 +171,7 @@ + {OPT_CMD, OPT_IMAGE, L"append", do_options, NULL, opt_offsetof(options)}, + {OPT_CMD, OPT_IMAGE, L"literal", do_literal, NULL, NULL}, + {OPT_FILE, OPT_IMAGE, L"initrd", NULL, NULL, opt_offsetof(initrd)}, ++ {OPT_FILE, OPT_IMAGE, L"vmm", NULL, NULL, opt_offsetof(vmcode)}, + {OPT_STR, OPT_IMAGE, L"label", NULL, NULL, opt_offsetof(label)}, + {OPT_FILE, OPT_IMAGE, L"image", do_image, NULL, opt_offsetof(kname)}, + {OPT_STR, OPT_IMAGE, L"description", NULL, NULL, opt_offsetof(description)}, +@@ -974,7 +978,7 @@ + } + + INTN +-find_label(CHAR16 *label, CHAR16 *kname, CHAR16 *options, CHAR16 *initrd) ++find_label(CHAR16 *label, CHAR16 *kname, CHAR16 *options, CHAR16 *initrd, CHAR16 *vmcode) + { + boot_image_t *img; + +@@ -1007,6 +1011,7 @@ + if (global_config.readonly) StrCat(options, L" ro"); + + if (global_config.initrd[0]) StrCpy(initrd, global_config.initrd); ++ if (global_config.vmcode[0]) StrCpy(vmcode, global_config.vmcode); + + /* make sure we don't get garbage here */ + elilo_opt.sys_img_opts = NULL; +@@ -1044,12 +1049,17 @@ + else if (global_config.initrd[0]) + StrCpy(initrd, global_config.initrd); + ++ if (img->vmcode[0]) ++ StrCpy(vmcode, img->vmcode); ++ else if (global_config.vmcode[0]) ++ StrCpy(vmcode, global_config.vmcode); ++ + /* + * point to architecture dependent options for this image + */ + elilo_opt.sys_img_opts = &img->sys_img_opts; + +- DBG_PRT((L"label %s: kname=%s options=%s initrd=%s", img->label, kname, options, initrd)); ++ DBG_PRT((L"label %s: kname=%s options=%s initrd=%s vmcode=%s", img->label, kname, options, initrd, vmcode)); + + return 0; + } +diff -Naur base/elilo.c elilo/elilo.c +--- base/elilo.c 2005-09-20 19:51:07.000000000 -0700 ++++ elilo/elilo.c 2005-09-20 19:33:41.000000000 -0700 +@@ -84,10 +84,23 @@ + } + + INTN +-kernel_load(EFI_HANDLE image, CHAR16 *kname, kdesc_t *kd, memdesc_t *imem) ++kernel_load(EFI_HANDLE image, CHAR16 *kname, kdesc_t *kd, memdesc_t *imem, memdesc_t *mmem) + { + + /* ++ * Do the vm image switch here ++ * if there is "vmm=" then elilo should load image specified ++ * in "vmm=" and then give the "image" to vmm as target kernel image ++ */ ++ if (elilo_opt.vmcode[0]) { ++ CHAR16 buffer[CMDLINE_MAXLEN]; ++ VERB_PRT(1,Print(L"swapping vmm=%s with image=%s\n", elilo_opt.vmcode, ++ kname)); ++ StrCpy(buffer, kname); ++ StrCpy(kname, elilo_opt.vmcode); ++ StrCpy(elilo_opt.vmcode, buffer); ++ } ++ /* + * Now let's try to load the kernel ! + */ + switch(do_kernel_load(kname, kd)) { +@@ -134,10 +147,32 @@ + return ELILO_LOAD_RETRY; + } + } ++ ++ if (elilo_opt.vmcode[0]) { ++ ++ mmem->start_addr = 0; /* let the allocator decide */ ++ ++ switch(load_initrd(elilo_opt.vmcode, mmem)) { ++ case ELILO_LOAD_SUCCESS: ++ break; ++ case ELILO_LOAD_ERROR: ++ goto exit_error; ++ case ELILO_LOAD_ABORTED: ++ free_kmem(); ++ /* we drop initrd in case we aborted the load */ ++ elilo_opt.vmcode[0] = CHAR_NULL; ++ elilo_opt.prompt = 1; ++ elilo_opt.timeout = ELILO_DEFAULT_TIMEOUT; ++ elilo_opt.delay = 0; ++ ++ return ELILO_LOAD_RETRY; ++ } ++ } + return ELILO_LOAD_SUCCESS; + exit_error: + free_kmem(); + if (imem->start_addr) free(imem->start_addr); ++ if (mmem->start_addr) free(mmem->start_addr); + + return ELILO_LOAD_ERROR; + } +@@ -152,7 +187,7 @@ + UINTN cookie; + EFI_STATUS status = EFI_SUCCESS; + kdesc_t kd; +- memdesc_t imem; ++ memdesc_t imem, mmem; + INTN r; + + /* +@@ -169,7 +204,7 @@ + + if (kernel_chooser(argv, argc, index, kname, cmdline_tmp) == -1) goto exit_error; + +- switch (kernel_load(image, kname, &kd, &imem)) { ++ switch (kernel_load(image, kname, &kd, &imem, &mmem)) { + case ELILO_LOAD_SUCCESS: + goto do_launch; + case ELILO_LOAD_ERROR: +@@ -187,7 +222,7 @@ + close_devices(); + + /* No console output permitted after create_boot_params()! */ +- if ((bp=create_boot_params(cmdline, &imem, &cookie)) == 0) goto error; ++ if ((bp=create_boot_params(cmdline, &imem, &mmem, &cookie)) == 0) goto error; + + /* terminate bootservices */ + status = BS->ExitBootServices(image, cookie); +@@ -221,6 +256,7 @@ + Print(L"-v verbose level(can appear multiple times)\n"); + Print(L"-a always check for alternate kernel image\n"); + Print(L"-i file load file as the initial ramdisk\n"); ++ Print(L"-m file load file as additional boot time vmm module\n"); + Print(L"-C file indicate the config file to use\n"); + Print(L"-P parse config file only (verify syntax)\n"); + Print(L"-D enable debug prints\n"); +@@ -491,6 +527,13 @@ + } + StrCpy(elilo_opt.initrd, Optarg); + break; ++ case 'm': ++ if (StrLen(Optarg) >= FILENAME_MAXLEN-1) { ++ Print(L"vmm module filename is limited to %d characters\n", FILENAME_MAXLEN); ++ goto do_exit; ++ } ++ StrCpy(elilo_opt.vmcode, Optarg); ++ break; + case 'C': + if (StrLen(Optarg) >= FILENAME_MAXLEN-1) { + Print(L"config filename is limited to %d characters\n", FILENAME_MAXLEN); +diff -Naur base/elilo.h elilo/elilo.h +--- base/elilo.h 2005-09-20 19:51:07.000000000 -0700 ++++ elilo/elilo.h 2005-09-20 19:32:19.000000000 -0700 +@@ -75,6 +75,7 @@ + UINTN delay; /* delay before booting the image */ + UINTN verbose; /* verbosity level [1-5] */ + CHAR16 initrd[FILENAME_MAXLEN]; /* name of file for initial ramdisk */ ++ CHAR16 vmcode[FILENAME_MAXLEN]; /* name of file for boot time module*/ + UINT8 delay_set; /* mark whether or not delay was specified on cmdline */ + UINT8 edd30_on; /* true is EDD30 variable is TRUE */ + UINT8 edd30_no_force; /* don't force EDD30 variable to true */ +@@ -131,7 +132,7 @@ + #endif + + #define VERB_PRT(n,cmd) \ +- { if (elilo_opt.verbose >= (n)) { cmd; } } ++ { if (elilo_opt.verbose >= (n)) { cmd; } } + + + /* from alloc.c */ +@@ -163,7 +164,7 @@ + /* from config.c (more in config.h) */ + extern EFI_STATUS read_config(CHAR16 *, INTN retry); + extern VOID print_config_options(VOID); +-extern INTN find_label(CHAR16 *, CHAR16 *, CHAR16 *, CHAR16 *); ++extern INTN find_label(CHAR16 *, CHAR16 *, CHAR16 *, CHAR16 *, CHAR16 *); + extern VOID print_label_list(VOID); + extern INTN config_init(VOID); + extern CHAR16 *get_message_filename(INTN which); +@@ -178,7 +179,7 @@ + extern INTN alternate_kernel(CHAR16 *, INTN); + + /* from bootparams.c */ +-extern VOID *create_boot_params (CHAR16 *, memdesc_t *, UINTN *); ++extern VOID *create_boot_params (CHAR16 *, memdesc_t *, memdesc_t *, UINTN *); + extern VOID free_boot_params(VOID *bp); + + /* +@@ -186,7 +187,7 @@ + */ + + +-extern INTN sysdeps_create_boot_params(boot_params_t *, CHAR8 *, memdesc_t *, UINTN *); ++extern INTN sysdeps_create_boot_params(boot_params_t *, CHAR8 *, memdesc_t *, memdesc_t *, UINTN *); + extern VOID sysdeps_free_boot_params(boot_params_t *); + extern INTN sysdeps_init(EFI_HANDLE dev); + extern INTN sysdeps_initrd_get_addr(kdesc_t *, memdesc_t *); +diff -Naur base/ia32/system.c elilo/ia32/system.c +--- base/ia32/system.c 2005-09-20 19:51:07.000000000 -0700 ++++ elilo/ia32/system.c 2005-09-20 19:30:10.000000000 -0700 +@@ -408,6 +408,7 @@ + boot_params_t *bp, + CHAR8 *cmdline, + memdesc_t *initrd, ++ memdesc_t *vmcode, /* no use for ia32 now*/ + UINTN *cookie) + { + mmap_desc_t mdesc; +diff -Naur base/ia64/sysdeps.h elilo/ia64/sysdeps.h +--- base/ia64/sysdeps.h 2005-09-20 19:51:07.000000000 -0700 ++++ elilo/ia64/sysdeps.h 2005-09-20 19:29:07.000000000 -0700 +@@ -65,8 +65,11 @@ + UINTN initrd_start; /* virtual address where the initial ramdisk begins */ + UINTN initrd_size; /* how big is the initial ramdisk */ + ++ UINTN vmcode_start; /* virtual address where the boot time vmcode begins */ ++ UINTN vmcode_size; /* how big is the boot module */ + UINTN loader_addr; /* start address of boot loader */ + UINTN loader_size; /* size of loader code & data */ ++ + } boot_params_t; + + typedef struct sys_img_options { +diff -Naur base/ia64/system.c elilo/ia64/system.c +--- base/ia64/system.c 2005-09-20 19:51:07.000000000 -0700 ++++ elilo/ia64/system.c 2005-09-20 19:29:28.000000000 -0700 +@@ -39,7 +39,7 @@ + * IA-64 specific boot paramters initialization routine + */ + INTN +-sysdeps_create_boot_params(boot_params_t *bp, CHAR8 *cmdline, memdesc_t *initrd, UINTN *cookie) ++sysdeps_create_boot_params(boot_params_t *bp, CHAR8 *cmdline, memdesc_t *initrd, memdesc_t *vmcode, UINTN *cookie) + { + UINTN cols, rows; + SIMPLE_TEXT_OUTPUT_INTERFACE *conout; +@@ -65,6 +65,11 @@ + bp->command_line = (UINTN)cmdline; + bp->initrd_start = (UINTN) initrd->start_addr; + bp->initrd_size = initrd->size; ++ DBG_PRT((L"Got initrd @ 0x%lx (%d bytes)", initrd->start_addr, initrd->size)); ++ ++ bp->vmcode_start = (UINTN) vmcode->start_addr; ++ bp->vmcode_size = vmcode->size; ++ DBG_PRT((L"Got vmcode @ 0x%lx (%d bytes)", vmcode->start_addr, vmcode->size)); + + /* fetch console parameters: */ + conout = systab->ConOut; diff -r babbdd896024 -r 97dbd9524a7e xen/arch/ia64/tools/xelilo/elilo.README --- /dev/null Thu Sep 22 12:59:57 2005 +++ b/xen/arch/ia64/tools/xelilo/elilo.README Thu Sep 22 17:34:14 2005 @@ -0,0 +1,35 @@ +Elilo update for Xen/ia64 HowTo 9/20/2005 + +1. Build the new elilo + a. Get the elilo RPM + http://fedora.mirrors.pair.com/linux/core/development/SRPMS/elilo-3.4-11.src.rpm + + b. Get the elilo-3.4.11.xen.patch + + c. Create elilo development tree + > mkdir elilo + > cd elilo + > rpm2cpio ../elilo-3.4-11.src.rpm | cpio -div + > tar xvfz elilo-3.4.tar.gz + > cd elilo-3.4 + > // read elilo.spc for deatiled patch steps + > patch -p1 < ../elilo-3.3a-makefile.patch + > patch -p1 < ../elilo-3.4-debug.patch + > patch -p2 < ../elilo-initrd-size-fix.patch + > patch -p1 < ../elilo-argv-fix.patch + > patch -p1 < ../elilo-kill-warnings.patch + > patch -p1 < ../../elilo-3.4.11.xen.patch + > make <=== get the elilo.efi + +2. How to run with the new elilo.efi? + a. Example to run + modify elilo.conf with following entry + + image=XenoLinux.uncompressed + label=xen + vmm=xen.gz + initrd=initrd-2.6.9-5.7.EL.img + read-only + append="com2=57600,8n1 console=com2 sched=bvt -- nomca console=ttyS1,576 00 console=tty0 root=/dev/sda3" + + diff -r babbdd896024 -r 97dbd9524a7e xen/arch/ia64/tools/xelilo/xen4elilo.patch --- /dev/null Thu Sep 22 12:59:57 2005 +++ b/xen/arch/ia64/tools/xelilo/xen4elilo.patch Thu Sep 22 17:34:14 2005 @@ -0,0 +1,187 @@ +<Sign-Off: Fred.Yang@xxxxxxxxx> +diff -r f2309ac2648a xen/arch/ia64/xen/dom_fw.c +--- a/xen/arch/ia64/xen/dom_fw.c Tue Sep 20 19:03:25 2005 ++++ b/xen/arch/ia64/xen/dom_fw.c Tue Sep 20 20:10:36 2005 +@@ -686,6 +686,12 @@ + bp->console_info.orig_x = 0; + bp->console_info.orig_y = 24; + bp->fpswa = 0; ++ bp->initrd_start = (dom0_start+dom0_size) - ++ (PAGE_ALIGN(ia64_boot_param->initrd_size) + 4*1024*1024); ++ bp->initrd_size = ia64_boot_param->initrd_size; ++ printf(" initrd start %0xlx", bp->initrd_start); ++ printf(" initrd size %0xlx", bp->initrd_size); ++ + + return bp; + } +diff -r f2309ac2648a xen/arch/ia64/xen/domain.c +--- a/xen/arch/ia64/xen/domain.c Tue Sep 20 19:03:25 2005 ++++ b/xen/arch/ia64/xen/domain.c Tue Sep 20 20:10:36 2005 +@@ -830,6 +830,7 @@ + unsigned long pkern_start; + unsigned long pkern_entry; + unsigned long pkern_end; ++ unsigned long pinitrd_start = 0; + unsigned long ret, progress = 0; + + //printf("construct_dom0: starting\n"); +@@ -848,12 +849,6 @@ + alloc_start = dom0_start; + alloc_end = dom0_start + dom0_size; + d->tot_pages = d->max_pages = dom0_size/PAGE_SIZE; +- image_start = __va(ia64_boot_param->initrd_start); +- image_len = ia64_boot_param->initrd_size; +-//printk("image_start=%lx, image_len=%lx\n",image_start,image_len); +-//printk("First word of image: %lx\n",*(unsigned long *)image_start); +- +-//printf("construct_dom0: about to call parseelfimage\n"); + dsi.image_addr = (unsigned long)image_start; + dsi.image_len = image_len; + rc = parseelfimage(&dsi); +@@ -890,11 +885,18 @@ + return -EINVAL; + } + ++ if(initrd_start&&initrd_len){ ++ pinitrd_start=(dom0_start+dom0_size) - ++ (PAGE_ALIGN(initrd_len) + 4*1024*1024); ++ ++ memcpy(__va(pinitrd_start),initrd_start,initrd_len); ++ } ++ + printk("METAPHYSICAL MEMORY ARRANGEMENT:\n" + " Kernel image: %lx->%lx\n" + " Entry address: %lx\n" +- " Init. ramdisk: (NOT IMPLEMENTED YET)\n", +- pkern_start, pkern_end, pkern_entry); ++ " Init. ramdisk: %lx len %lx\n", ++ pkern_start, pkern_end, pkern_entry, pinitrd_start, initrd_len); + + if ( (pkern_end - pkern_start) > (d->max_pages * PAGE_SIZE) ) + { +diff -r f2309ac2648a xen/arch/ia64/xen/xensetup.c +--- a/xen/arch/ia64/xen/xensetup.c Tue Sep 20 19:03:25 2005 ++++ b/xen/arch/ia64/xen/xensetup.c Tue Sep 20 20:10:36 2005 +@@ -153,7 +153,8 @@ + void *heap_start; + int i; + unsigned long max_mem, nr_pages, firsthole_start; +- unsigned long dom0_memory_start, dom0_memory_end; ++ unsigned long dom0_memory_start, dom0_memory_size; ++ unsigned long dom0_initrd_start, dom0_initrd_size; + unsigned long initial_images_start, initial_images_end; + + running_on_sim = is_platform_hp_ski(); +@@ -191,7 +192,18 @@ + efi_memmap_walk(xen_find_first_hole, &firsthole_start); + + initial_images_start = xenheap_phys_end; +- initial_images_end = initial_images_start + ia64_boot_param->initrd_size; ++ initial_images_end = initial_images_start + ++ PAGE_ALIGN(ia64_boot_param->domain_size); ++ ++ /* also reserve space for initrd */ ++ if (ia64_boot_param->initrd_start && ia64_boot_param->initrd_size) ++ initial_images_end += PAGE_ALIGN(ia64_boot_param->initrd_size); ++ else { ++ /* sanity cleanup */ ++ ia64_boot_param->initrd_size = 0; ++ ia64_boot_param->initrd_start = 0; ++ } ++ + + /* Later may find another memory trunk, even away from xen image... */ + if (initial_images_end > firsthole_start) { +@@ -203,11 +215,21 @@ + + /* This copy is time consuming, but elilo may load Dom0 image + * within xenheap range */ +- printk("ready to move Dom0 to 0x%lx...", initial_images_start); ++ printk("ready to move Dom0 to 0x%lx with len %lx...", initial_images_start, ++ ia64_boot_param->domain_size); ++ + memmove(__va(initial_images_start), ++ __va(ia64_boot_param->domain_start), ++ ia64_boot_param->domain_size); ++// ia64_boot_param->domain_start = initial_images_start; ++ ++ printk("ready to move initrd to 0x%lx with len %lx...", ++ initial_images_start+PAGE_ALIGN(ia64_boot_param->domain_size), ++ ia64_boot_param->initrd_size); ++ memmove(__va(initial_images_start+PAGE_ALIGN(ia64_boot_param->domain_size)), ++ + __va(ia64_boot_param->initrd_start), + ia64_boot_param->initrd_size); +- ia64_boot_param->initrd_start = initial_images_start; + printk("Done\n"); + + /* first find highest page frame number */ +@@ -335,23 +357,26 @@ + * above our heap. The second module, if present, is an initrd ramdisk. + */ + printk("About to call construct_dom0()\n"); +- dom0_memory_start = __va(ia64_boot_param->initrd_start); +- dom0_memory_end = ia64_boot_param->initrd_size; +- if ( construct_dom0(dom0, dom0_memory_start, dom0_memory_end, +- 0, +- 0, ++ dom0_memory_start = __va(initial_images_start); ++ dom0_memory_size = ia64_boot_param->domain_size; ++ dom0_initrd_start = __va(initial_images_start + ++ PAGE_ALIGN(ia64_boot_param->domain_size)); ++ dom0_initrd_size = ia64_boot_param->initrd_size; ++ ++ if ( construct_dom0(dom0, dom0_memory_start, dom0_memory_size, ++ dom0_initrd_start,dom0_initrd_size, + 0) != 0) + panic("Could not set up DOM0 guest OS\n"); + #ifdef CLONE_DOMAIN0 + { + int i; +- dom0_memory_start = __va(ia64_boot_param->initrd_start); +- dom0_memory_end = ia64_boot_param->initrd_size; ++ dom0_memory_start = __va(ia64_boot_param->domain_start); ++ dom0_memory_size = ia64_boot_param->domain_size; ++ + for (i = 0; i < CLONE_DOMAIN0; i++) { + printk("CONSTRUCTING DOMAIN0 CLONE #%d\n",i+1); +- if ( construct_domU(clones[i], dom0_memory_start, dom0_memory_end, +- 0, +- 0, ++ if ( construct_domU(clones[i], dom0_memory_start, dom0_memory_size, ++ dom0_initrd_start,dom0_initrd_size, + 0) != 0) + panic("Could not set up DOM0 clone %d\n",i); + } +@@ -359,8 +384,14 @@ + #endif + + /* The stash space for the initial kernel image can now be freed up. */ +- init_domheap_pages(ia64_boot_param->initrd_start, +- ia64_boot_param->initrd_start + ia64_boot_param->initrd_size); ++ init_domheap_pages(ia64_boot_param->domain_start, ++ ia64_boot_param->domain_size); ++ /* throw away initrd area passed from elilo */ ++ if (ia64_boot_param->initrd_size) { ++ init_domheap_pages(ia64_boot_param->initrd_start, ++ ia64_boot_param->initrd_size); ++ } ++ + if (!running_on_sim) // slow on ski and pages are pre-initialized to zero + scrub_heap_pages(); + +diff -r f2309ac2648a xen/include/asm-ia64/linux-xen/asm/system.h +--- a/xen/include/asm-ia64/linux-xen/asm/system.h Tue Sep 20 19:03:25 2005 ++++ b/xen/include/asm-ia64/linux-xen/asm/system.h Tue Sep 20 20:10:36 2005 +@@ -56,6 +56,10 @@ + __u64 fpswa; /* physical address of the fpswa interface */ + __u64 initrd_start; + __u64 initrd_size; ++//for loading initrd for dom0 ++ __u64 domain_start; /* virtual address where the boot time domain begins */ ++ __u64 domain_size; /* how big is the boot domain */ ++ + } *ia64_boot_param; + + /* diff -r babbdd896024 -r 97dbd9524a7e xen/arch/ia64/tools/xelilo/xlilo.efi --- /dev/null Thu Sep 22 12:59:57 2005 +++ b/xen/arch/ia64/tools/xelilo/xlilo.efi Thu Sep 22 17:34:14 2005 @@ -0,0 +1,1629 @@ +MZ? ÿÿ |