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

[Xen-changelog] Integration of the xen4xlilo patch. (by Tristan Gingold)



# HG changeset patch
# User djm@xxxxxxxxxxxxxxx
# Node ID d0a2b36f72f26c7ef4fb855215ede6aaa8ef8af3
# Parent  8c42a46de7f8b02d3516e6b8d83da5f74c37e44b
Integration of the xen4xlilo patch. (by Tristan Gingold)
It is now backward compatible: works with the old elilo.

diff -r 8c42a46de7f8 -r d0a2b36f72f2 xen/arch/ia64/xen/dom_fw.c
--- a/xen/arch/ia64/xen/dom_fw.c        Thu Nov 17 00:40:24 2005
+++ b/xen/arch/ia64/xen/dom_fw.c        Thu Nov 17 13:21:18 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 8c42a46de7f8 -r d0a2b36f72f2 xen/arch/ia64/xen/domain.c
--- a/xen/arch/ia64/xen/domain.c        Thu Nov 17 00:40:24 2005
+++ b/xen/arch/ia64/xen/domain.c        Thu Nov 17 13:21:18 2005
@@ -823,6 +823,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");
@@ -841,12 +842,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);
@@ -883,11 +878,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 8c42a46de7f8 -r d0a2b36f72f2 xen/arch/ia64/xen/xensetup.c
--- a/xen/arch/ia64/xen/xensetup.c      Thu Nov 17 00:40:24 2005
+++ b/xen/arch/ia64/xen/xensetup.c      Thu Nov 17 13:21:18 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();
@@ -190,8 +191,30 @@
     firsthole_start = 0;
     efi_memmap_walk(xen_find_first_hole, &firsthole_start);
 
+    if (ia64_boot_param->domain_start == 0
+       || ia64_boot_param->domain_size == 0) {
+           /* This is possible only with the old elilo, which does not support
+              a vmm.  Fix now, and continue without initrd.  */
+           printk ("Your elilo is not Xen-aware.  Bootparams fixed\n");
+           ia64_boot_param->domain_start = ia64_boot_param->initrd_start;
+           ia64_boot_param->domain_size = ia64_boot_param->initrd_size;
+           ia64_boot_param->initrd_start = 0;
+           ia64_boot_param->initrd_size = 0;
+    }
+
     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 +226,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 */
@@ -329,13 +362,16 @@
      * We're going to setup domain0 using the module(s) that we stashed safely
      * 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,
-                       0) != 0)
+    printk("About to call construct_dom0()\n");
+    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");
 
     /* PIN domain0 on CPU 0.  */
@@ -345,22 +381,28 @@
 #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,
-                       0) != 0)
+      printk("CONSTRUCTING DOMAIN0 CLONE #%d\n",i+1);
+      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);
     }
     }
 #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 8c42a46de7f8 -r d0a2b36f72f2 xen/include/asm-ia64/linux-xen/asm/system.h
--- a/xen/include/asm-ia64/linux-xen/asm/system.h       Thu Nov 17 00:40:24 2005
+++ b/xen/include/asm-ia64/linux-xen/asm/system.h       Thu Nov 17 13:21:18 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;
 
 /*

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


 


Rackspace

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