[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-ia64-devel] [patch] calculate dom0 metaphysical load address correctly
Hi, This one is needed to handle system where metaphysical doesn't start at 0x4000000. Cheers, Jes # HG changeset patch # User jes@xxxxxxxxxxxxxxxx # Date 1179838406 -7200 # Node ID ce09d8e7f7334cda03f26e2493398f3cface8060 # Parent 44a59dc866263af3c33ade323d9fb5fb0451c8cd Calculate load address of dom0 image based on xen_pstart rather than address from ELF image as dom0 meta-physical memory must match real physical window. Signed-off-by: Jes Sorensen <jes@xxxxxxx> diff -r 44a59dc86626 -r ce09d8e7f733 xen/arch/ia64/xen/domain.c --- a/xen/arch/ia64/xen/domain.c Fri May 11 14:27:18 2007 +0200 +++ b/xen/arch/ia64/xen/domain.c Tue May 22 14:53:26 2007 +0200 @@ -1109,7 +1109,8 @@ int shadow_mode_control(struct domain *d #define privify_memory(x,y) do {} while(0) #endif -static void loaddomainelfimage(struct domain *d, struct elf_binary *elf) +static void loaddomainelfimage(struct domain *d, struct elf_binary *elf, + unsigned long phys_load_offset) { const elf_phdr *phdr; int phnum, h, filesz, memsz; @@ -1126,6 +1127,7 @@ static void loaddomainelfimage(struct do memsz = elf_uval(elf, phdr, p_memsz); elfaddr = (unsigned long) elf->image + elf_uval(elf, phdr, p_offset); dom_mpaddr = elf_uval(elf, phdr, p_paddr); + dom_mpaddr += phys_load_offset; while (memsz > 0) { p = assign_new_domain_page(d,dom_mpaddr); @@ -1216,6 +1218,7 @@ int construct_dom0(struct domain *d, unsigned long pkern_end; unsigned long pinitrd_start = 0; unsigned long pstart_info; + unsigned long phys_load_offset; struct page_info *start_info_page; unsigned long bp_mpa; struct ia64_boot_param *bp; @@ -1243,6 +1246,20 @@ int construct_dom0(struct domain *d, if (0 != (elf_xen_parse(&elf, &parms))) return rc; + /* + * We cannot rely on the load address in the ELF headers to + * determine the meta physical address the image is loaded + * at since meta physical memory needs to match physical + * memory of the system for NUMA awareness. Patch the address + * to match the real one, based on xen_pstart + */ + phys_load_offset = xen_pstart - elf.pstart; + elf.pstart += phys_load_offset; + elf.pend += phys_load_offset; + parms.virt_kstart += phys_load_offset; + parms.virt_kend += phys_load_offset; + parms.virt_entry += phys_load_offset; + printk(" Dom0 kernel: %s, %s, paddr 0x%" PRIx64 " -> 0x%" PRIx64 "\n", elf_64bit(&elf) ? "64-bit" : "32-bit", elf_msb(&elf) ? "msb" : "lsb", @@ -1273,8 +1290,10 @@ int construct_dom0(struct domain *d, /* The next page aligned boundary after the start info. Note: EFI_PAGE_SHIFT = 12 <= PAGE_SHIFT */ pinitrd_start = pstart_info + PAGE_SIZE; - if (pinitrd_start + initrd_len >= dom0_size) + + if ((pinitrd_start + initrd_len - phys_load_offset) >= dom0_size) panic("%s: not enough memory assigned to dom0", __func__); + for (offset = 0; offset < initrd_len; offset += PAGE_SIZE) { struct page_info *p; p = assign_new_domain_page(d, pinitrd_start + offset); @@ -1327,7 +1346,7 @@ int construct_dom0(struct domain *d, panic("Cannot allocate dom0 vcpu %d\n", i); /* Copy the OS image. */ - loaddomainelfimage(d,&elf); + loaddomainelfimage(d, &elf, phys_load_offset); BUILD_BUG_ON(sizeof(start_info_t) + sizeof(dom0_vga_console_info_t) + sizeof(struct ia64_boot_param) > PAGE_SIZE); _______________________________________________ Xen-ia64-devel mailing list Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-ia64-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |