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

[Xen-changelog] [xen-unstable] [IA64] memmap: preliminary domain-builder clean up.



# HG changeset patch
# User Alex Williamson <alex.williamson@xxxxxx>
# Date 1179774896 21600
# Node ID 8fb8d50272d22a2a3944e1696149a1902393c836
# Parent  c2768258711da6dadd021a5aad883fff949e255d
[IA64] memmap: preliminary domain-builder clean up.

Signed-off-by: Isaku Yamahata <yamahata@xxxxxxxxxxxxx>
---
 xen/arch/ia64/xen/dom0_ops.c  |   15 +
 xen/arch/ia64/xen/dom_fw.c    |  333 ++++++++++++++++++++++++++++--------------
 xen/arch/ia64/xen/domain.c    |    4 
 xen/include/asm-ia64/dom_fw.h |    2 
 4 files changed, 236 insertions(+), 118 deletions(-)

diff -r c2768258711d -r 8fb8d50272d2 xen/arch/ia64/xen/dom0_ops.c
--- a/xen/arch/ia64/xen/dom0_ops.c      Mon May 21 10:10:31 2007 -0600
+++ b/xen/arch/ia64/xen/dom0_ops.c      Mon May 21 13:14:56 2007 -0600
@@ -101,21 +101,22 @@ long arch_do_domctl(xen_domctl_t *op, XE
                 if (!vmx_enabled) {
                     printk("No VMX hardware feature for vmx domain.\n");
                     ret = -EINVAL;
-                    break;
-                }
-                d->arch.is_vti = 1;
-                vmx_setup_platform(d);
+                } else {
+                    d->arch.is_vti = 1;
+                    vmx_setup_platform(d);
+                }
             }
             else {
-                dom_fw_setup(d, ds->bp, ds->maxmem);
-                if (ds->xsi_va)
-                    d->arch.shared_info_va = ds->xsi_va;
                 if (ds->hypercall_imm) {
+                    /* dom_fw_setup() reads d->arch.breakimm */
                     struct vcpu *v;
                     d->arch.breakimm = ds->hypercall_imm;
                     for_each_vcpu (d, v)
                         v->arch.breakimm = d->arch.breakimm;
                 }
+                if (ds->xsi_va)
+                    d->arch.shared_info_va = ds->xsi_va;
+                ret = dom_fw_setup(d, ds->bp, ds->maxmem);
                 {
                     /*
                      * XXX IA64_SHARED_INFO_PADDR
diff -r c2768258711d -r 8fb8d50272d2 xen/arch/ia64/xen/dom_fw.c
--- a/xen/arch/ia64/xen/dom_fw.c        Mon May 21 10:10:31 2007 -0600
+++ b/xen/arch/ia64/xen/dom_fw.c        Mon May 21 13:14:56 2007 -0600
@@ -3,7 +3,8 @@
  *  Copyright (C) 2004 Hewlett-Packard Co.
  *       Dan Magenheimer (dan.magenheimer@xxxxxx)
  *
- * Copyright (c) 2006 Isaku Yamahata <yamahata at valinux co jp>
+ * Copyright (c) 2006, 2007
+ *                    Isaku Yamahata <yamahata at valinux co jp>
  *                    VA Linux Systems Japan K.K.
  *                    dom0 vp model support
  */
@@ -45,7 +46,8 @@ extern unsigned long running_on_sim;
 
 #define EFI_HYPERCALL_PATCH(tgt, call)                                 \
        do {                                                            \
-               dom_efi_hypercall_patch(d, FW_HYPERCALL_##call##_PADDR, \
+               dom_efi_hypercall_patch(brkimm,                         \
+                                       FW_HYPERCALL_##call##_PADDR,    \
                                 FW_HYPERCALL_##call, hypercalls_imva); \
                /* Descriptor address.  */                              \
                tables->efi_runtime.tgt =                               \
@@ -146,7 +148,7 @@ build_pal_hypercall_bundles(u64 *imva, u
 
 // builds a hypercall bundle at domain physical address
 static void
-dom_fpswa_hypercall_patch(struct domain *d, unsigned long imva)
+dom_fpswa_hypercall_patch(u64 brkimm, unsigned long imva)
 {
        unsigned long *entry_imva, *patch_imva;
        const unsigned long entry_paddr = FW_HYPERCALL_FPSWA_ENTRY_PADDR;
@@ -161,36 +163,34 @@ dom_fpswa_hypercall_patch(struct domain 
        *entry_imva++ = patch_paddr;
        *entry_imva   = 0;
 
-       build_hypercall_bundle(patch_imva, d->arch.breakimm,
-                              FW_HYPERCALL_FPSWA, 1);
+       build_hypercall_bundle(patch_imva, brkimm, FW_HYPERCALL_FPSWA, 1);
 }
 
 // builds a hypercall bundle at domain physical address
 static void
-dom_efi_hypercall_patch(struct domain *d, unsigned long paddr,
+dom_efi_hypercall_patch(u64 brkimm, unsigned long paddr,
                         unsigned long hypercall, unsigned long imva)
 {
        build_hypercall_bundle((u64 *)(imva + paddr - FW_HYPERCALL_BASE_PADDR),
-                              d->arch.breakimm, hypercall, 1);
+                              brkimm, hypercall, 1);
 }
 
 // builds a hypercall bundle at domain physical address
 static void
-dom_fw_hypercall_patch(struct domain *d, unsigned long paddr,
-                       unsigned long hypercall,unsigned long ret,
+dom_fw_hypercall_patch(u64 brkimm, unsigned long paddr,
+                      unsigned long hypercall,unsigned long ret,
                        unsigned long imva)
 {
        build_hypercall_bundle((u64 *)(imva + paddr - FW_HYPERCALL_BASE_PADDR),
-                              d->arch.breakimm, hypercall, ret);
+                              brkimm, hypercall, ret);
 }
 
 static void
-dom_fw_pal_hypercall_patch(struct domain *d, unsigned long paddr,
-                           unsigned long imva)
+dom_fw_pal_hypercall_patch(u64 brkimm, unsigned long paddr, unsigned long imva)
 {
        build_pal_hypercall_bundles((u64*)(imva + paddr -
                                    FW_HYPERCALL_BASE_PADDR),
-                                   d->arch.breakimm, FW_HYPERCALL_PAL_CALL);
+                                   brkimm, FW_HYPERCALL_PAL_CALL);
 }
 
 static inline void
@@ -241,6 +241,17 @@ acpi_update_lsapic (acpi_table_entry_hea
        return 0;
 }
 
+static u8
+generate_acpi_checksum(void *tbl, unsigned long len)
+{
+       u8 *ptr, sum = 0;
+
+       for (ptr = tbl; len > 0 ; len--, ptr++)
+               sum += *ptr;
+
+       return 0 - sum;
+}
+
 static int __init
 acpi_patch_plat_int_src (
        acpi_table_entry_header *header, const unsigned long end)
@@ -256,17 +267,6 @@ acpi_patch_plat_int_src (
                plintsrc->type = -1;
        }
        return 0;
-}
-
-static u8
-generate_acpi_checksum(void *tbl, unsigned long len)
-{
-       u8 *ptr, sum = 0;
-
-       for (ptr = tbl; len > 0 ; len--, ptr++)
-               sum += *ptr;
-
-       return 0 - sum;
 }
 
 static int
@@ -454,6 +454,7 @@ dom_fw_fake_acpi(struct domain *d, struc
                lsapic[i].acpi_id = i;
                lsapic[i].id = i;
                lsapic[i].eid = 0;
+               //XXX replace d->vcpu[i] != NULL with XEN_DOMCTL_getvcpuinfo
                if (d->vcpu[i] != NULL) {
                        lsapic[i].flags.enabled = 1;
                        nbr_cpus++;
@@ -507,6 +508,49 @@ struct fw_tables {
 };
 #define FW_FIELD_MPA(field) \
    FW_TABLES_BASE_PADDR + offsetof(struct fw_tables, field)
+
+static void
+efi_systable_init_dom0(struct fw_tables *tables)
+{
+       int i = 1;
+       /* Write messages to the console.  */
+       touch_acpi_table();
+
+       printk("Domain0 EFI passthrough:");
+       if (efi.mps) {
+               tables->efi_tables[i].guid = MPS_TABLE_GUID;
+               tables->efi_tables[i].table = __pa(efi.mps);
+               printk(" MPS=0x%lx",tables->efi_tables[i].table);
+               i++;
+       }
+
+       if (efi.acpi20) {
+               tables->efi_tables[i].guid = ACPI_20_TABLE_GUID;
+               tables->efi_tables[i].table = __pa(efi.acpi20);
+               printk(" ACPI 2.0=0x%lx",tables->efi_tables[i].table);
+               i++;
+       }
+       if (efi.acpi) {
+               tables->efi_tables[i].guid = ACPI_TABLE_GUID;
+               tables->efi_tables[i].table = __pa(efi.acpi);
+               printk(" ACPI=0x%lx",tables->efi_tables[i].table);
+               i++;
+       }
+       if (efi.smbios) {
+               tables->efi_tables[i].guid = SMBIOS_TABLE_GUID;
+               tables->efi_tables[i].table = __pa(efi.smbios);
+               printk(" SMBIOS=0x%lx",tables->efi_tables[i].table);
+               i++;
+       }
+       if (efi.hcdp) {
+               tables->efi_tables[i].guid = HCDP_TABLE_GUID;
+               tables->efi_tables[i].table = __pa(efi.hcdp);
+               printk(" HCDP=0x%lx",tables->efi_tables[i].table);
+               i++;
+       }
+       printk("\n");
+       BUG_ON(i > NUM_EFI_SYS_TABLES);
+}
 
 static void
 setup_dom0_memmap_info(struct domain *d, struct fw_tables *tables,
@@ -665,7 +709,6 @@ complete_dom0_memmap(struct domain *d,
                        num_mds++;
 
                        dom_mem -= dom_md->num_pages << EFI_PAGE_SHIFT;
-                       d->arch.convmem_end = end;
                        break;
 
                case EFI_UNUSABLE_MEMORY:
@@ -733,13 +776,27 @@ complete_dom0_memmap(struct domain *d,
        return num_mds;
 }
        
+static void
+efi_systable_init_domu(struct fw_tables *tables)
+{
+       int i = 1;
+       printk(XENLOG_GUEST XENLOG_INFO "DomainU EFI build up:");
+
+       tables->efi_tables[i].guid = ACPI_20_TABLE_GUID;
+       tables->efi_tables[i].table = FW_ACPI_BASE_PADDR;
+       printk(" ACPI 2.0=0x%lx",tables->efi_tables[i].table);
+       i++;
+       printk("\n");
+       BUG_ON(i > NUM_EFI_SYS_TABLES);
+}
+
 static int
 complete_domu_memmap(struct domain *d,
                      struct fw_tables *tables,
                      unsigned long maxmem,
                      int num_mds,
                     unsigned long memmap_info_pfn,
-                    unsigned long memmap_size)
+                    unsigned long reserved_size)
 {
        efi_memory_desc_t *md;
        int i = num_mds; /* for MAKE_MD */
@@ -751,18 +808,18 @@ complete_domu_memmap(struct domain *d,
        void *memmap_start;
        void *memmap_end;
 
-       if (memmap_info_pfn == 0 || memmap_size == 0) {
+       if (memmap_info_pfn == 0 || reserved_size == 0) {
                /* old domain builder which doesn't setup
                 * memory map. create it for compatibility */
                memmap_info_pfn = (maxmem >> PAGE_SHIFT) - 1;
                /* 4 = memmap info page, start info page, xenstore page and
                   console page */
-               memmap_size = 4 << PAGE_SHIFT;
+               reserved_size = 4 << PAGE_SHIFT;
                create_memmap = 1;
        }
        paddr_start = memmap_info_pfn << PAGE_SHIFT;
-       paddr_end = paddr_start + memmap_size;
-       memmap_info = domain_mpa_to_imva(d, paddr_start);
+       paddr_end = paddr_start + reserved_size;
+       memmap_info = domain_mpa_to_imva(d, paddr_start);//XXX replace this 
with xc_map_foreign_map_range()
        if (memmap_info->efi_memmap_size == 0) {
                create_memmap = 1;
        } else if (memmap_info->efi_memdesc_size != sizeof(md[0]) ||
@@ -778,21 +835,28 @@ complete_domu_memmap(struct domain *d,
                       memmap_info->efi_memdesc_size,
                       memmap_info->efi_memdesc_version);
                create_memmap = 1;
-       } else if (max(memmap_size, memmap_info->efi_memmap_size) >
+       } else if (reserved_size < memmap_info->efi_memmap_size) {
+               printk(XENLOG_WARNING
+                      "%s: Warning: too short reserved size %"PRIu64"\n",
+                      __func__, reserved_size);
+               return -EINVAL;
+       } else if (memmap_info->efi_memmap_size >
                   PAGE_SIZE - sizeof(*memmap_info)) {
                /*
                 * curently memmap spanning more than single page isn't
                 * supported.
                 */
                printk(XENLOG_WARNING
-                      "%s: Warning: too large memmap_size %"PRIu64"\n",
-                      __func__, memmap_size);
+                      "%s: Warning: too large reserved_size %"PRIu64"\n",
+                      __func__, memmap_info->efi_memmap_size);
                return -ENOSYS;
        }
        
        if (create_memmap) {
-               /* old domain builder which doesn't setup
-                * memory map. create it for compatibility */
+               /*
+                * old domain builder which doesn't setup
+                * memory map. create it for compatibility
+                */
                memmap_info->efi_memdesc_size = sizeof(md[0]);
                memmap_info->efi_memdesc_version =
                        EFI_MEMORY_DESCRIPTOR_VERSION;
@@ -805,14 +869,6 @@ complete_domu_memmap(struct domain *d,
                md[num_mds].num_pages = maxmem >> EFI_PAGE_SHIFT;
                md[num_mds].attribute = EFI_MEMORY_WB;
        }
-       /*
-        * XXX kludge.
-        * when XEN_DOMCTL_arch_setup is called, shared_info can't
-        * be accessed by libxc so that memmap_info_pfn isn't initialized.
-        * But dom_fw_set_convmem_end() requires it, so here we initialize it.
-        */
-       d->shared_info->arch.memmap_info_num_pages = 1;
-       d->shared_info->arch.memmap_info_pfn = memmap_info_pfn;
 
        memmap_start = &memmap_info->memdesc;
        memmap_end = memmap_start + memmap_info->efi_memmap_size;
@@ -856,14 +912,11 @@ complete_domu_memmap(struct domain *d,
                        MAKE_MD(EFI_CONVENTIONAL_MEMORY, EFI_MEMORY_WB,
                                paddr_end, end);
                }
-               d->arch.convmem_end = end;
        }
 
        /* memmap info page. */
        MAKE_MD(EFI_RUNTIME_SERVICES_DATA, EFI_MEMORY_WB,
                paddr_start, paddr_end);
-       if (d->arch.convmem_end < paddr_end)
-               d->arch.convmem_end = paddr_end;
 
        /* Create an entry for IO ports.  */
        MAKE_MD(EFI_MEMORY_MAPPED_IO_PORT_SPACE, EFI_MEMORY_UC,
@@ -875,8 +928,9 @@ complete_domu_memmap(struct domain *d,
        return num_mds;
 }
 
-static void
+static int
 dom_fw_init(struct domain *d,
+           u64 brkimm,
             struct ia64_boot_param *bp,
             struct fw_tables *tables,
             unsigned long hypercalls_imva,
@@ -889,11 +943,6 @@ dom_fw_init(struct domain *d,
        int num_mds, i;
 
        memset(tables, 0, sizeof(struct fw_tables));
-
-       /* Initialise for EFI_SET_VIRTUAL_ADDRESS_MAP emulation */
-       d->arch.efi_runtime = &tables->efi_runtime;
-       d->arch.fpswa_inf   = &tables->fpswa_inf;
-       d->arch.sal_data    = &tables->sal_data;
 
        /* EFI systab.  */
        tables->efi_systab.hdr.signature = EFI_SYSTEM_TABLE_SIGNATURE;
@@ -933,52 +982,10 @@ dom_fw_init(struct domain *d,
                tables->efi_tables[i].guid = NULL_GUID;
                tables->efi_tables[i].table = 0;
        }
-       i = 1;
        if (d == dom0) {
-               /* Write messages to the console.  */
-               touch_acpi_table();
-
-               printk("Domain0 EFI passthrough:");
-               if (efi.mps) {
-                       tables->efi_tables[i].guid = MPS_TABLE_GUID;
-                       tables->efi_tables[i].table = __pa(efi.mps);
-                       printk(" MPS=0x%lx",tables->efi_tables[i].table);
-                       i++;
-               }
-
-               if (efi.acpi20) {
-                       tables->efi_tables[i].guid = ACPI_20_TABLE_GUID;
-                       tables->efi_tables[i].table = __pa(efi.acpi20);
-                       printk(" ACPI 2.0=0x%lx",tables->efi_tables[i].table);
-                       i++;
-               }
-               if (efi.acpi) {
-                       tables->efi_tables[i].guid = ACPI_TABLE_GUID;
-                       tables->efi_tables[i].table = __pa(efi.acpi);
-                       printk(" ACPI=0x%lx",tables->efi_tables[i].table);
-                       i++;
-               }
-               if (efi.smbios) {
-                       tables->efi_tables[i].guid = SMBIOS_TABLE_GUID;
-                       tables->efi_tables[i].table = __pa(efi.smbios);
-                       printk(" SMBIOS=0x%lx",tables->efi_tables[i].table);
-                       i++;
-               }
-               if (efi.hcdp) {
-                       tables->efi_tables[i].guid = HCDP_TABLE_GUID;
-                       tables->efi_tables[i].table = __pa(efi.hcdp);
-                       printk(" HCDP=0x%lx",tables->efi_tables[i].table);
-                       i++;
-               }
-               printk("\n");
+               efi_systable_init_dom0(tables);
        } else {
-               printk(XENLOG_GUEST XENLOG_INFO "DomainU EFI build up:");
-
-               tables->efi_tables[i].guid = ACPI_20_TABLE_GUID;
-               tables->efi_tables[i].table = FW_ACPI_BASE_PADDR;
-               printk(" ACPI 2.0=0x%lx", tables->efi_tables[i].table);
-               i++;
-               printk("\n");
+               efi_systable_init_domu(tables);
        }
 
        /* fill in the SAL system table: */
@@ -994,11 +1001,11 @@ dom_fw_init(struct domain *d,
        /* PAL entry point: */
        tables->sal_ed.type = SAL_DESC_ENTRY_POINT;
        tables->sal_ed.pal_proc = FW_HYPERCALL_PAL_CALL_PADDR;
-       dom_fw_pal_hypercall_patch(d, tables->sal_ed.pal_proc, 
-                                  hypercalls_imva);
+       dom_fw_pal_hypercall_patch(brkimm, tables->sal_ed.pal_proc,
+                                  hypercalls_imva);
        /* SAL entry point.  */
        tables->sal_ed.sal_proc = FW_HYPERCALL_SAL_CALL_PADDR;
-       dom_fw_hypercall_patch(d, tables->sal_ed.sal_proc,
+       dom_fw_hypercall_patch(brkimm, tables->sal_ed.sal_proc,
                               FW_HYPERCALL_SAL_CALL, 1, hypercalls_imva);
        tables->sal_ed.gp = 0;  /* will be ignored */
 
@@ -1016,13 +1023,13 @@ dom_fw_init(struct domain *d,
        tables->sal_systab.checksum = -checksum;
 
        /* SAL return point.  */
-       dom_fw_hypercall_patch(d, FW_HYPERCALL_SAL_RETURN_PADDR,
+       dom_fw_hypercall_patch(brkimm, FW_HYPERCALL_SAL_RETURN_PADDR,
                               FW_HYPERCALL_SAL_RETURN, 0, hypercalls_imva);
 
        /* Fill in the FPSWA interface: */
        if (fpswa_interface) {
                tables->fpswa_inf.revision = fpswa_interface->revision;
-               dom_fpswa_hypercall_patch(d, hypercalls_imva);
+               dom_fpswa_hypercall_patch(brkimm, hypercalls_imva);
                tables->fpswa_inf.fpswa = 
                                       (void *)FW_HYPERCALL_FPSWA_ENTRY_PADDR;
        }
@@ -1058,6 +1065,8 @@ dom_fw_init(struct domain *d,
                   as well as IO areas.  */
                num_mds = complete_dom0_memmap(d, tables, maxmem, i);
        }
+       if (num_mds < 0)
+               return num_mds;
 
        /* Display memmap.  */
        for (i = 0 ; i < num_mds; i++)
@@ -1076,10 +1085,74 @@ dom_fw_init(struct domain *d,
        bp->console_info.orig_y = 24;
        if (fpswa_interface)
                bp->fpswa = FW_FIELD_MPA(fpswa_inf);
-}
-
-void dom_fw_setup(struct domain *d, unsigned long bp_mpa, unsigned long maxmem)
-{
+       return 0;
+}
+
+static void
+dom_fw_domain_init(struct domain *d, struct fw_tables *tables)
+{
+       /* Initialise for EFI_SET_VIRTUAL_ADDRESS_MAP emulation */
+       d->arch.efi_runtime = &tables->efi_runtime;
+       d->arch.fpswa_inf   = &tables->fpswa_inf;
+       d->arch.sal_data    = &tables->sal_data;
+}
+
+static int
+dom_fw_set_convmem_end(struct domain *d)
+{
+       xen_ia64_memmap_info_t* memmap_info;
+       efi_memory_desc_t *md;
+       void *p;
+       void *memmap_start;
+       void *memmap_end;
+
+       if (d->shared_info->arch.memmap_info_pfn == 0)
+               return -EINVAL;
+
+       memmap_info = domain_mpa_to_imva(d, 
d->shared_info->arch.memmap_info_pfn << PAGE_SHIFT);
+       if (memmap_info->efi_memmap_size == 0 ||
+           memmap_info->efi_memdesc_size != sizeof(*md) ||
+           memmap_info->efi_memdesc_version !=
+           EFI_MEMORY_DESCRIPTOR_VERSION)
+               return -EINVAL;
+       /* only 1page case is supported */
+       if (d->shared_info->arch.memmap_info_num_pages != 1)
+               return -ENOSYS;
+
+       memmap_start = &memmap_info->memdesc;
+       memmap_end = memmap_start + memmap_info->efi_memmap_size;
+
+       /* XXX Currently the table must be in a single page. */
+       if ((unsigned long)memmap_end > (unsigned long)memmap_info + PAGE_SIZE)
+               return -EINVAL;
+
+       /* sort it bofore use
+        * XXX: this is created by user space domain builder so that
+        * we should check its integrity */
+       sort(&memmap_info->memdesc,
+            memmap_info->efi_memmap_size / memmap_info->efi_memdesc_size,
+            memmap_info->efi_memdesc_size,
+            efi_mdt_cmp, NULL);
+
+       if (d->arch.convmem_end == 0)
+               d->arch.convmem_end = d->max_pages << PAGE_SHIFT;
+       for (p = memmap_start; p < memmap_end; p += 
memmap_info->efi_memdesc_size) {
+               unsigned long end;
+               md = p;
+               end = md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT);
+               if (md->attribute == EFI_MEMORY_WB &&
+                   md->type == EFI_CONVENTIONAL_MEMORY &&
+                   md->num_pages > 0 &&
+                   d->arch.convmem_end < end)
+                       d->arch.convmem_end = end;
+       }
+       return 0;
+}
+
+int
+dom_fw_setup(struct domain *d, unsigned long bp_mpa, unsigned long maxmem)
+{
+       int ret = 0;
        struct ia64_boot_param *bp;
        unsigned long imva_tables_base;
        unsigned long imva_hypercall_base;
@@ -1112,7 +1185,49 @@ void dom_fw_setup(struct domain *d, unsi
        /* Create page for boot_param.  */
        assign_new_domain_page_if_dom0(d, bp_mpa);
        bp = domain_mpa_to_imva(d, bp_mpa);
-
-       dom_fw_init(d, bp, (struct fw_tables *)imva_tables_base,
-                   imva_hypercall_base, maxmem);
-}
+       if (d != dom0) {
+               /*
+                * XXX kludge.
+                * when XEN_DOMCTL_arch_setup is called, shared_info can't
+                * be accessed by libxc so that memmap_info_pfn isn't
+                * initialized. But dom_fw_set_convmem_end() requires it, 
+                * so here we initialize it.
+                * note:dom_fw_init() overwrites memmap_info_num_pages,
+                *      memmap_info_pfns.
+                */
+               if ((bp->efi_memmap_size & ~PAGE_MASK) != 0) {
+                       printk("%s:%d size 0x%lx 0x%lx 0x%lx\n",
+                              __func__, __LINE__,
+                              bp->efi_memmap_size,
+                              bp->efi_memmap_size & ~PAGE_SIZE,
+                              ~PAGE_SIZE);
+                       return -EINVAL;
+               }
+               if (bp->efi_memmap_size == 0) {
+                       /* old domain builder compatibility */
+                       d->shared_info->arch.memmap_info_num_pages = 1;
+                       d->shared_info->arch.memmap_info_pfn =
+                               (maxmem >> PAGE_SHIFT) - 1;
+               } else {
+                       /*
+                        * 3: start info page, xenstore page and console page
+                        */
+                       if (bp->efi_memmap_size < 4 * PAGE_SIZE)
+                               return -EINVAL;
+                       d->shared_info->arch.memmap_info_num_pages =
+                               (bp->efi_memmap_size >> PAGE_SHIFT) - 3;
+                       d->shared_info->arch.memmap_info_pfn = bp->efi_memmap;
+                       /* currently multi page memmap isn't supported */
+                       if (d->shared_info->arch.memmap_info_num_pages != 1)
+                               return -ENOSYS;
+               }
+       }
+       ret = dom_fw_init(d, d->arch.breakimm, bp,
+                           (struct fw_tables *)imva_tables_base,
+                           imva_hypercall_base, maxmem);
+       if (ret < 0)
+               return ret;
+
+       dom_fw_domain_init(d, (struct fw_tables *)imva_tables_base);
+       return dom_fw_set_convmem_end(d);
+}
diff -r c2768258711d -r 8fb8d50272d2 xen/arch/ia64/xen/domain.c
--- a/xen/arch/ia64/xen/domain.c        Mon May 21 10:10:31 2007 -0600
+++ b/xen/arch/ia64/xen/domain.c        Mon May 21 13:14:56 2007 -0600
@@ -1353,7 +1353,9 @@ int construct_dom0(struct domain *d,
           Note: Linux kernel reserve memory used by start_info, so there is
           no need to remove it from MDT.  */
        bp_mpa = pstart_info + sizeof(struct start_info);
-       dom_fw_setup(d, bp_mpa, max_pages * PAGE_SIZE);
+       rc = dom_fw_setup(d, bp_mpa, max_pages * PAGE_SIZE);
+       if (rc != 0)
+               return rc;
 
        /* Fill boot param.  */
        strlcpy((char *)si->cmd_line, dom0_command_line, sizeof(si->cmd_line));
diff -r c2768258711d -r 8fb8d50272d2 xen/include/asm-ia64/dom_fw.h
--- a/xen/include/asm-ia64/dom_fw.h     Mon May 21 10:10:31 2007 -0600
+++ b/xen/include/asm-ia64/dom_fw.h     Mon May 21 13:14:56 2007 -0600
@@ -188,4 +188,4 @@ extern struct ia64_pal_retval pal_emulat
 extern struct ia64_pal_retval pal_emulator_static (unsigned long);
 extern efi_status_t efi_emulator (struct pt_regs *regs, unsigned long *fault);
 
-extern void dom_fw_setup (struct domain *, unsigned long bp_mpa, unsigned long 
maxmem);
+extern int dom_fw_setup (struct domain *, unsigned long bp_mpa, unsigned long 
maxmem);

_______________________________________________
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®.