WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

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

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] [IA64] memmap: preliminary domain-builder clean up.
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Sat, 16 Jun 2007 05:31:32 -0700
Delivery-date: Sat, 16 Jun 2007 05:30:00 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# 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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [xen-unstable] [IA64] memmap: preliminary domain-builder clean up., Xen patchbot-unstable <=