diff -X /home/yamahata/dontdiff -rup ./xen-ia64-old/xen/arch/ia64/xen/dom_fw_dom0.c ./xen-ia64-unstable.hg/xen/arch/ia64/xen/dom_fw_dom0.c --- ./xen-ia64-old/xen/arch/ia64/xen/dom_fw_dom0.c 2007-05-17 19:23:55.000000000 +0900 +++ ./xen-ia64-unstable.hg/xen/arch/ia64/xen/dom_fw_dom0.c 2007-05-23 20:46:16.000000000 +0900 @@ -172,12 +172,12 @@ setup_dom0_memmap_info(struct domain *d, size = sizeof(*memmap_info) + (tables->num_mds + 1) * sizeof(tables->efi_memmap[0]); - num_pages = (size + PAGE_SIZE - 1) / PAGE_SIZE; + num_pages = (size + PAGE_SIZE - 1) >> PAGE_SHIFT; for (i = tables->num_mds - 1; i >= 0; i--) { md = &tables->efi_memmap[i]; if (md->attribute == EFI_MEMORY_WB && md->type == EFI_CONVENTIONAL_MEMORY && - md->num_pages > (num_pages + 1) * (1UL << (PAGE_SHIFT - EFI_PAGE_SHIFT))) { + md->num_pages > ((num_pages + 1) << (PAGE_SHIFT - EFI_PAGE_SHIFT))) { last_mem_md = md; break; } @@ -192,8 +192,7 @@ setup_dom0_memmap_info(struct domain *d, paddr_end = last_mem_md->phys_addr + (last_mem_md->num_pages << EFI_PAGE_SHIFT); paddr_start = (paddr_end - (num_pages << PAGE_SHIFT)) & PAGE_MASK; - last_mem_md->num_pages -= - (paddr_end - paddr_start) / (1UL << EFI_PAGE_SHIFT); + last_mem_md->num_pages -= (paddr_end - paddr_start) >> EFI_PAGE_SHIFT; md = &tables->efi_memmap[tables->num_mds]; tables->num_mds++; @@ -203,21 +202,21 @@ setup_dom0_memmap_info(struct domain *d, md->num_pages = num_pages << (PAGE_SHIFT - EFI_PAGE_SHIFT); md->attribute = EFI_MEMORY_WB; - memmap_info = domain_mpa_to_imva(d, md->phys_addr); BUG_ON(tables->fw_tables_size < sizeof(*tables) + sizeof(tables->efi_memmap[0]) * tables->num_mds); + /* with this sort, md doesn't point memmap table */ + sort(tables->efi_memmap, tables->num_mds, sizeof(efi_memory_desc_t), + efi_mdt_cmp, NULL); + memmap_info = domain_mpa_to_imva(d, paddr_start); memmap_info->efi_memdesc_size = sizeof(md[0]); memmap_info->efi_memdesc_version = EFI_MEMORY_DESCRIPTOR_VERSION; memmap_info->efi_memmap_size = tables->num_mds * sizeof(md[0]); dom_fw_copy_to(d, - md->phys_addr + offsetof(xen_ia64_memmap_info_t, memdesc), + paddr_start + offsetof(xen_ia64_memmap_info_t, memdesc), &tables->efi_memmap[0], memmap_info->efi_memmap_size); d->shared_info->arch.memmap_info_num_pages = num_pages; - d->shared_info->arch.memmap_info_pfn = md->phys_addr >> PAGE_SHIFT; - - sort(tables->efi_memmap, tables->num_mds, sizeof(efi_memory_desc_t), - efi_mdt_cmp, NULL); + d->shared_info->arch.memmap_info_pfn = paddr_start >> PAGE_SHIFT; } /* Complete the dom0 memmap. */ diff -X /home/yamahata/dontdiff -rup ./xen-ia64-old/xen/arch/ia64/xen/dom_fw_utils.c ./xen-ia64-unstable.hg/xen/arch/ia64/xen/dom_fw_utils.c --- ./xen-ia64-old/xen/arch/ia64/xen/dom_fw_utils.c 2007-05-17 19:23:55.000000000 +0900 +++ ./xen-ia64-unstable.hg/xen/arch/ia64/xen/dom_fw_utils.c 2007-05-23 19:56:18.000000000 +0900 @@ -89,7 +89,7 @@ dom_fw_set_convmem_end(struct domain *d) gpaddr = d->shared_info->arch.memmap_info_pfn << PAGE_SHIFT; size = d->shared_info->arch.memmap_info_num_pages << PAGE_SHIFT; - memmap_info = xmalloc_bytes(size); + memmap_info = _xmalloc(size, __alignof__(*memmap_info)); if (memmap_info == NULL) return -ENOMEM; dom_fw_copy_from(memmap_info, d, gpaddr, size); @@ -242,13 +242,15 @@ dom_fw_setup(domain_t *d, unsigned long /* estimate necessary efi memmap size and allocate memory for it */ fw_tables_size = sizeof(*fw_tables) + - NUM_MEM_DESCS * sizeof(fw_tables->efi_memmap[0]) + - ia64_boot_param->efi_memdesc_size; + (ia64_boot_param->efi_memmap_size / + ia64_boot_param->efi_memdesc_size + NUM_MEM_DESCS) * + sizeof(fw_tables->efi_memmap[0]); if (fw_tables_size < FW_TABLES_END_PADDR_MIN - FW_TABLES_BASE_PADDR) fw_tables_size = FW_TABLES_END_PADDR_MIN - FW_TABLES_BASE_PADDR; fw_tables_size = (fw_tables_size + ((1UL << EFI_PAGE_SHIFT) - 1)) & ~((1UL << EFI_PAGE_SHIFT) - 1); - fw_tables = (struct fw_tables *)xmalloc_bytes(fw_tables_size); + fw_tables = (struct fw_tables *)_xmalloc(fw_tables_size, + __alignof__(*fw_tables)); if (fw_tables == NULL) { dprintk(XENLOG_INFO, "can't allocate fw_tables memory size = %d\n", @@ -280,6 +282,11 @@ dom_fw_setup(domain_t *d, unsigned long fw_tables_size = sizeof(*fw_tables) + fw_tables->num_mds * sizeof(fw_tables->efi_memmap[0]); + for (gpaddr = FW_TABLES_BASE_PADDR; + gpaddr < fw_tables->fw_end_paddr; + gpaddr += PAGE_SIZE) + assign_new_domain_page_if_dom0(d, gpaddr); + /* clear domain builder internal use member */ fw_tables->fw_tables_size = 0; fw_tables->fw_end_paddr = 0; @@ -287,11 +294,6 @@ dom_fw_setup(domain_t *d, unsigned long fw_tables->num_mds = 0; /* copy fw_tables into domain pseudo physical address space */ - for (gpaddr = FW_TABLES_BASE_PADDR; - gpaddr < fw_tables->fw_end_paddr; - gpaddr += PAGE_SIZE) - assign_new_domain_page_if_dom0(d, gpaddr); - dom_fw_copy_to(d, FW_TABLES_BASE_PADDR, fw_tables, fw_tables_size); xfree(fw_tables); }