# HG changeset patch # User tristan.gingold@xxxxxxxx # Node ID 2ec7778154c691717fb3735863f6157e9acf6fb2 # Parent 45c4e735fc8c5dc39a19cb2e52a48585bbf96b02 Bug fix (?): protect dom0 image from allocator. Hack in efi.c commented out (this hack limited memory to 4GB) diff -r 45c4e735fc8c -r 2ec7778154c6 xen/arch/ia64/linux-xen/efi.c --- a/xen/arch/ia64/linux-xen/efi.c Sat Dec 31 05:40:13 2005 +++ b/xen/arch/ia64/linux-xen/efi.c Tue Jan 3 12:19:14 2006 @@ -328,8 +328,10 @@ if (running_on_sim && md->type != EFI_CONVENTIONAL_MEMORY) continue; } +#if 0 // this is a temporary hack to avoid CONFIG_VIRTUAL_MEM_MAP if (md->phys_addr >= 0x100000000) continue; +#endif #endif /* * granule_addr is the base of md's first granule. diff -r 45c4e735fc8c -r 2ec7778154c6 xen/arch/ia64/linux-xen/setup.c --- a/xen/arch/ia64/linux-xen/setup.c Sat Dec 31 05:40:13 2005 +++ b/xen/arch/ia64/linux-xen/setup.c Tue Jan 3 12:19:14 2006 @@ -219,12 +219,19 @@ rsvd_region[n].start = (unsigned long) ia64_imva((void *)KERNEL_START); #ifdef XEN - /* Reserve xen image/bitmap/xen-heap */ + /* Reserve xen image + xen-heap */ rsvd_region[n].end = rsvd_region[n].start + xenheap_size; #else rsvd_region[n].end = (unsigned long) ia64_imva(_end); #endif n++; + +#ifdef XEN + /* Reserve dom0 image. */ + rsvd_region[n].start = (unsigned long)__va(ia64_boot_param->domain_start); + rsvd_region[n].end = rsvd_region[n].start + ia64_boot_param->domain_size; + n++; +#endif #ifdef CONFIG_BLK_DEV_INITRD if (ia64_boot_param->initrd_start) { diff -r 45c4e735fc8c -r 2ec7778154c6 xen/arch/ia64/xen/xensetup.c --- a/xen/arch/ia64/xen/xensetup.c Sat Dec 31 05:40:13 2005 +++ b/xen/arch/ia64/xen/xensetup.c Tue Jan 3 12:19:14 2006 @@ -155,7 +155,8 @@ unsigned long max_mem, nr_pages, firsthole_start; unsigned long dom0_memory_start, dom0_memory_size; unsigned long dom0_initrd_start, dom0_initrd_size; - unsigned long initial_images_start, initial_images_end; + unsigned long initial_images_start, initial_initrd_start; + unsigned long initial_images_end; running_on_sim = is_platform_hp_ski(); /* Kernel may be relocated by EFI loader */ @@ -208,8 +209,10 @@ /* 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); + initial_initrd_start = initial_images_end + + PAGE_ALIGN(ia64_boot_param->initrd_size); else { + initial_initrd_start = 0; /* sanity cleanup */ ia64_boot_param->initrd_size = 0; ia64_boot_param->initrd_start = 0; @@ -235,10 +238,8 @@ // 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)), - + initial_initrd_start, ia64_boot_param->initrd_size); + memmove(__va(initial_initrd_start), __va(ia64_boot_param->initrd_start), ia64_boot_param->initrd_size); printk("Done\n"); @@ -257,6 +258,9 @@ printf("Before heap_start: 0x%lx\n", heap_start); heap_start = __va(init_boot_allocator(__pa(heap_start))); printf("After heap_start: 0x%lx\n", heap_start); + + /* Patch for reserve_memory. */ + ia64_boot_param->domain_start = initial_images_start; reserve_memory(); @@ -372,8 +376,7 @@ 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_start = __va(initial_initrd_start); dom0_initrd_size = ia64_boot_param->initrd_size; if ( construct_dom0(dom0, dom0_memory_start, dom0_memory_size, @@ -402,12 +405,10 @@ #endif /* The stash space for the initial kernel image can now be freed up. */ - init_domheap_pages(ia64_boot_param->domain_start, - ia64_boot_param->domain_size); + init_domheap_pages(initial_images_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); + init_domheap_pages(initial_initrd_start, ia64_boot_param->initrd_size); } if (!running_on_sim) // slow on ski and pages are pre-initialized to zero