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] Implement and use DOM0_DOMAIN_STEU

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] [IA64] Implement and use DOM0_DOMAIN_STEUP.
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Fri, 28 Jul 2006 16:20:25 +0000
Delivery-date: Fri, 28 Jul 2006 09:24:12 -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 awilliam@xxxxxxxxxxx
# Node ID 8dc4af3f192c7c1ef3cd6921196997b903d25add
# Parent  f7132169c2bf453db85f40b4041380f387b74082
[IA64] Implement and use DOM0_DOMAIN_STEUP.

DOM0_GETMEMLIST now reads ptes and use gpfn.
Domain builder reworked: calls DOMAIN_SETUP, setup start_info page.
SAL data are now in domain memory.
is_vti field added in domain.arch.
Many cleanups (indentation, static, warnings).

Signed-off-by: Tristan Gingold <tristan.gingold@xxxxxxxx>
---
 linux-2.6-xen-sparse/arch/ia64/kernel/setup.c   |    5 
 linux-2.6-xen-sparse/arch/ia64/xen/hypervisor.c |    6 -
 tools/ioemu/vl.c                                |   13 +-
 tools/libxc/xc_ia64_stubs.c                     |   31 ++---
 tools/libxc/xc_linux_build.c                    |   63 +++++++----
 xen/arch/ia64/linux-xen/entry.S                 |   13 --
 xen/arch/ia64/vmx/mmio.c                        |    8 -
 xen/arch/ia64/vmx/vmmu.c                        |    4 
 xen/arch/ia64/vmx/vmx_init.c                    |   41 +++----
 xen/arch/ia64/xen/dom0_ops.c                    |   95 +++++++++--------
 xen/arch/ia64/xen/dom_fw.c                      |   87 +++++----------
 xen/arch/ia64/xen/domain.c                      |  134 ++++++++++--------------
 xen/arch/ia64/xen/fw_emul.c                     |   15 +-
 xen/arch/ia64/xen/hypercall.c                   |    4 
 xen/arch/ia64/xen/mm.c                          |    5 
 xen/arch/ia64/xen/vcpu.c                        |    2 
 xen/include/asm-ia64/dom_fw.h                   |    2 
 xen/include/asm-ia64/domain.h                   |   89 +++++++++------
 xen/include/asm-ia64/mm.h                       |    2 
 xen/include/asm-ia64/vmx.h                      |    3 
 xen/include/public/arch-ia64.h                  |   69 ++++--------
 21 files changed, 338 insertions(+), 353 deletions(-)

diff -r f7132169c2bf -r 8dc4af3f192c 
linux-2.6-xen-sparse/arch/ia64/kernel/setup.c
--- a/linux-2.6-xen-sparse/arch/ia64/kernel/setup.c     Mon Jul 03 09:11:49 
2006 -0600
+++ b/linux-2.6-xen-sparse/arch/ia64/kernel/setup.c     Wed Jul 05 09:28:32 
2006 -0600
@@ -523,15 +523,14 @@ setup_arch (char **cmdline_p)
                shared_info_t *s = HYPERVISOR_shared_info;
 
                xen_start_info = __va(s->arch.start_info_pfn << PAGE_SHIFT);
-               xen_start_info->flags = s->arch.flags;
 
                printk("Running on Xen! start_info_pfn=0x%lx nr_pages=%ld "
                       "flags=0x%x\n", s->arch.start_info_pfn,
                       xen_start_info->nr_pages, xen_start_info->flags);
 
                /* xen_start_info isn't setup yet, get the flags manually */
-               if (s->arch.flags & SIF_INITDOMAIN) {
-                       if (!(s->arch.flags & SIF_PRIVILEGED))
+               if (xen_start_info->flags & SIF_INITDOMAIN) {
+                       if (!(xen_start_info->flags & SIF_PRIVILEGED))
                                panic("Xen granted us console access "
                                      "but not privileged status");
                } else {
diff -r f7132169c2bf -r 8dc4af3f192c 
linux-2.6-xen-sparse/arch/ia64/xen/hypervisor.c
--- a/linux-2.6-xen-sparse/arch/ia64/xen/hypervisor.c   Mon Jul 03 09:11:49 
2006 -0600
+++ b/linux-2.6-xen-sparse/arch/ia64/xen/hypervisor.c   Wed Jul 05 09:28:32 
2006 -0600
@@ -547,8 +547,10 @@ xen_ia64_privcmd_entry_mmap(struct vm_ar
        unsigned long gpfn;
        unsigned long flags;
 
-       BUG_ON((addr & ~PAGE_MASK) != 0);
-       BUG_ON(mfn == INVALID_MFN);
+       if ((addr & ~PAGE_MASK) != 0 || mfn == INVALID_MFN) {
+               error = -EINVAL;
+               goto out;
+       }
 
        if (entry->gpfn != INVALID_GPFN) {
                error = -EBUSY;
diff -r f7132169c2bf -r 8dc4af3f192c tools/ioemu/vl.c
--- a/tools/ioemu/vl.c  Mon Jul 03 09:11:49 2006 -0600
+++ b/tools/ioemu/vl.c  Wed Jul 05 09:28:32 2006 -0600
@@ -3198,6 +3198,9 @@ int main(int argc, char **argv)
                                        PROT_READ|PROT_WRITE,
                                        page_array[nr_pages - 1]);
 
+    fprintf(logfile, "shared page at pfn:%lx, mfn: %"PRIx64"\n", (nr_pages-1),
+           (uint64_t)(page_array[nr_pages - 1]));
+
 #elif defined(__ia64__)
     if ( xc_ia64_get_pfn_list(xc_handle, domid, page_array, 0, nr_pages)
          != nr_pages)
@@ -3217,7 +3220,7 @@ int main(int argc, char **argv)
 
     if ( xc_ia64_get_pfn_list(xc_handle, domid,
                               page_array,
-                              nr_pages + (GFW_SIZE >> PAGE_SHIFT), 1) != 1 )
+                              IO_PAGE_START >> PAGE_SHIFT, 1) != 1 )
     {
         fprintf(logfile, "xc_ia64_get_pfn_list returned error %d\n", errno);
         exit(-1);
@@ -3226,10 +3229,10 @@ int main(int argc, char **argv)
     shared_page = xc_map_foreign_range(xc_handle, domid, PAGE_SIZE,
                                        PROT_READ|PROT_WRITE,
                                        page_array[0]);
-#endif
-
-    fprintf(logfile, "shared page at pfn:%lx, mfn: %"PRIx64"\n", (nr_pages-1),
-           (uint64_t)(page_array[nr_pages - 1]));
+
+    fprintf(logfile, "shared page at pfn:%lx, mfn: %l016x\n",
+           IO_PAGE_START >> PAGE_SHIFT, page_array[0]);
+#endif
 
     /* we always create the cdrom drive, even if no disk is there */
     bdrv_init();
diff -r f7132169c2bf -r 8dc4af3f192c tools/libxc/xc_ia64_stubs.c
--- a/tools/libxc/xc_ia64_stubs.c       Mon Jul 03 09:11:49 2006 -0600
+++ b/tools/libxc/xc_ia64_stubs.c       Wed Jul 05 09:28:32 2006 -0600
@@ -141,15 +141,6 @@ error_out:
 #define HOB_SIGNATURE         0x3436474953424f48        // "HOBSIG64"
 #define GFW_HOB_START         ((4UL<<30)-(14UL<<20))    // 4G - 14M
 #define GFW_HOB_SIZE          (1UL<<20)                 // 1M
-#define RAW_GFW_START_NR(s)   ((s) >> PAGE_SHIFT)
-#define RAW_GFW_HOB_START_NR(s)                \
-        (RAW_GFW_START_NR(s) + ((GFW_HOB_START - GFW_START) >> PAGE_SHIFT))
-#define RAW_GFW_IMAGE_START_NR(s,i)            \
-        (RAW_GFW_START_NR(s) + (((GFW_SIZE - (i))) >> PAGE_SHIFT))
-#define RAW_IO_PAGE_START_NR(s)                \
-        (RAW_GFW_START_NR(s) + (GFW_SIZE >> PAGE_SHIFT))
-#define RAW_STORE_PAGE_START_NR(s)             \
-        (RAW_IO_PAGE_START_NR(s) + (IO_PAGE_SIZE >> PAGE_SHFIT))
 
 typedef struct {
     unsigned long signature;
@@ -371,7 +362,7 @@ load_hob(int xc_handle, uint32_t dom, vo
     nr_pages = (hob_size + PAGE_SIZE -1) >> PAGE_SHIFT;
 
     return xc_ia64_copy_to_domain_pages(xc_handle, dom,
-            hob_buf, RAW_GFW_HOB_START_NR(dom_mem_size), nr_pages );
+            hob_buf, GFW_HOB_START>>PAGE_SHIFT, nr_pages );
 }
 
 #define MIN(x, y) ((x) < (y)) ? (x) : (y)
@@ -618,16 +609,26 @@ static int setup_guest(  int xc_handle,
     shared_iopage_t *sp;
     int i;
     unsigned long dom_memsize = (memsize << 20);
+    DECLARE_DOM0_OP;
 
     if ((image_size > 12 * MEM_M) || (image_size & (PAGE_SIZE - 1))) {
         PERROR("Guest firmware size is incorrect [%ld]?", image_size);
         return -1;
     }
 
+    /* This will creates the physmap.  */
+    op.u.domain_setup.flags = XEN_DOMAINSETUP_hvm_guest;
+    op.u.domain_setup.domain = (domid_t)dom;
+    op.u.domain_setup.bp = 0;
+    op.u.domain_setup.maxmem = 0;
+    
+    op.cmd = DOM0_DOMAIN_SETUP;
+    if ( xc_dom0_op(xc_handle, &op) )
+        goto error_out;
+
     /* Load guest firmware */
-    if( xc_ia64_copy_to_domain_pages( xc_handle, dom,
-            image, RAW_GFW_IMAGE_START_NR(dom_memsize, image_size),
-            image_size>>PAGE_SHIFT)) {
+    if( xc_ia64_copy_to_domain_pages(xc_handle, dom, image,
+        (GFW_START+GFW_SIZE-image_size)>>PAGE_SHIFT, image_size>>PAGE_SHIFT)) {
         PERROR("Could not load guest firmware into domain");
         goto error_out;
     }
@@ -640,7 +641,7 @@ static int setup_guest(  int xc_handle,
 
     /* Retrieve special pages like io, xenstore, etc. */
     if ( xc_ia64_get_pfn_list(xc_handle, dom, page_array,
-                              RAW_IO_PAGE_START_NR(dom_memsize), 2) != 2 )
+                              IO_PAGE_START>>PAGE_SHIFT, 2) != 2 )
     {
         PERROR("Could not get the page frame list");
         goto error_out;
@@ -726,9 +727,7 @@ int xc_hvm_build(int xc_handle,
 
     free(image);
 
-    ctxt->flags = VGCF_VMX_GUEST;
     ctxt->user_regs.cr_iip = 0x80000000ffffffb0UL;
-    ctxt->privregs = 0;
 
     memset( &launch_op, 0, sizeof(launch_op) );
 
diff -r f7132169c2bf -r 8dc4af3f192c tools/libxc/xc_linux_build.c
--- a/tools/libxc/xc_linux_build.c      Mon Jul 03 09:11:49 2006 -0600
+++ b/tools/libxc/xc_linux_build.c      Wed Jul 05 09:28:32 2006 -0600
@@ -2,6 +2,7 @@
  * xc_linux_build.c
  */
 
+#include <stddef.h>
 #include "xg_private.h"
 #include "xc_private.h"
 #include <xenctrl.h>
@@ -470,6 +471,11 @@ static int setup_guest(int xc_handle,
     unsigned long v_end;
     unsigned long start_page, pgnr;
     start_info_t *start_info;
+    unsigned long start_info_mpa;
+    struct xen_ia64_boot_param *bp;
+    shared_info_t *shared_info;
+    int i;
+    DECLARE_DOM0_OP;
     int rc;
 
     rc = probeimageformat(image, image_size, &load_funcs);
@@ -486,6 +492,17 @@ static int setup_guest(int xc_handle,
     vinitrd_start    = round_pgup(dsi.v_end);
     vinitrd_end      = vinitrd_start + initrd->len;
     v_end            = round_pgup(vinitrd_end);
+    start_info_mpa = (nr_pages - 3) << PAGE_SHIFT;
+
+    /* Build firmware.  */
+    op.u.domain_setup.flags = 0;
+    op.u.domain_setup.domain = (domid_t)dom;
+    op.u.domain_setup.bp = start_info_mpa + sizeof (start_info_t);
+    op.u.domain_setup.maxmem = (nr_pages - 3) << PAGE_SHIFT;
+    
+    op.cmd = DOM0_DOMAIN_SETUP;
+    if ( xc_dom0_op(xc_handle, &op) )
+        goto error_out;
 
     start_page = dsi.v_start >> PAGE_SHIFT;
     pgnr = (v_end - dsi.v_start) >> PAGE_SHIFT;
@@ -538,7 +555,7 @@ static int setup_guest(int xc_handle,
     IPRINTF("start_info: 0x%lx at 0x%lx, "
            "store_mfn: 0x%lx at 0x%lx, "
            "console_mfn: 0x%lx at 0x%lx\n",
-           page_array[0], nr_pages,
+           page_array[0], nr_pages - 3,
            *store_mfn,    nr_pages - 2,
            *console_mfn,  nr_pages - 1);
 
@@ -553,22 +570,34 @@ static int setup_guest(int xc_handle,
     start_info->console_mfn   = nr_pages - 1;
     start_info->console_evtchn = console_evtchn;
     start_info->nr_pages       = nr_pages; // FIXME?: nr_pages - 2 ????
+
+    bp = (struct xen_ia64_boot_param *)(start_info + 1);
+    bp->command_line = start_info_mpa + offsetof(start_info_t, cmd_line);
+    if ( cmdline != NULL )
+    {
+        strncpy((char *)start_info->cmd_line, cmdline, MAX_GUEST_CMDLINE);
+        start_info->cmd_line[MAX_GUEST_CMDLINE - 1] = 0;
+    }
     if ( initrd->len != 0 )
     {
-        ctxt->initrd.start    = vinitrd_start;
-        ctxt->initrd.size     = initrd->len;
-    }
-    else
-    {
-        ctxt->initrd.start    = 0;
-        ctxt->initrd.size     = 0;
-    }
-    if ( cmdline != NULL )
-    {
-        strncpy((char *)ctxt->cmdline, cmdline, IA64_COMMAND_LINE_SIZE);
-        ctxt->cmdline[IA64_COMMAND_LINE_SIZE-1] = '\0';
-    }
+        bp->initrd_start    = vinitrd_start;
+        bp->initrd_size     = initrd->len;
+    }
+    ctxt->user_regs.r28 = start_info_mpa + sizeof (start_info_t);
     munmap(start_info, PAGE_SIZE);
+
+    /* shared_info page starts its life empty. */
+    shared_info = xc_map_foreign_range(
+        xc_handle, dom, PAGE_SIZE, PROT_READ|PROT_WRITE, shared_info_frame);
+    printf("shared_info = %p, err=%s frame=%lx\n",
+           shared_info, strerror (errno), shared_info_frame);
+    //memset(shared_info, 0, sizeof(shared_info_t));
+    /* Mask all upcalls... */
+    for ( i = 0; i < MAX_VIRT_CPUS; i++ )
+        shared_info->vcpu_info[i].evtchn_upcall_mask = 1;
+    shared_info->arch.start_info_pfn = nr_pages - 3;
+
+    munmap(shared_info, PAGE_SIZE);
 
     free(page_array);
     return 0;
@@ -1150,16 +1179,10 @@ static int xc_linux_build_internal(int x
 #ifdef __ia64__
     /* based on new_thread in xen/arch/ia64/domain.c */
     ctxt->flags = 0;
-    ctxt->shared.flags = flags;
-    ctxt->shared.start_info_pfn = nr_pages - 3; /* metaphysical */
     ctxt->user_regs.cr_ipsr = 0; /* all necessary bits filled by hypervisor */
     ctxt->user_regs.cr_iip = vkern_entry;
     ctxt->user_regs.cr_ifs = 1UL << 63;
     ctxt->user_regs.ar_fpsr = xc_ia64_fpsr_default();
-    /* currently done by hypervisor, should move here */
-    /* ctxt->regs.r28 = dom_fw_setup(); */
-    ctxt->privregs = 0;
-    ctxt->sys_pgnr = 3;
     i = 0; /* silence unused variable warning */
 #else /* x86 */
     /*
diff -r f7132169c2bf -r 8dc4af3f192c xen/arch/ia64/linux-xen/entry.S
--- a/xen/arch/ia64/linux-xen/entry.S   Mon Jul 03 09:11:49 2006 -0600
+++ b/xen/arch/ia64/linux-xen/entry.S   Wed Jul 05 09:28:32 2006 -0600
@@ -652,17 +652,8 @@ GLOBAL_ENTRY(ia64_ret_from_clone)
     ld8 r16 = [r16]
     ;;
     cmp.ne p6,p7 = r16, r0
- (p6) br.cond.spnt ia64_leave_hypervisor
- (p7) br.cond.spnt ia64_leave_kernel
-    ;;
-//    adds r16 = IA64_VCPU_FLAGS_OFFSET, r13
-//    ;;
-//    ld8 r16 = [r16]
-//    ;;
-//    cmp.ne p6,p7 = r16, r0
-//     (p6) br.cond.spnt ia64_leave_hypervisor
-//     (p7) br.cond.spnt ia64_leave_kernel
-//    ;;
+ (p6) br.cond.spnt ia64_leave_hypervisor       /* VTi */
+ (p7) br.cond.spnt ia64_leave_kernel           /* !VTi */
 #else
 .ret8:
        adds r2=TI_FLAGS+IA64_TASK_SIZE,r13
diff -r f7132169c2bf -r 8dc4af3f192c xen/arch/ia64/vmx/mmio.c
--- a/xen/arch/ia64/vmx/mmio.c  Mon Jul 03 09:11:49 2006 -0600
+++ b/xen/arch/ia64/vmx/mmio.c  Wed Jul 05 09:28:32 2006 -0600
@@ -386,20 +386,16 @@ static void write_ipi (VCPU *vcpu, uint6
         struct pt_regs *targ_regs = vcpu_regs (targ);
         struct vcpu_guest_context c;
 
-        printf ("arch_boot_vcpu: %p %p\n",
-                (void *)d->arch.boot_rdv_ip,
-                (void *)d->arch.boot_rdv_r1);
         memset (&c, 0, sizeof (c));
 
-        c.flags = VGCF_VMX_GUEST;
         if (arch_set_info_guest (targ, &c) != 0) {
             printf ("arch_boot_vcpu: failure\n");
             return;
         }
         /* First or next rendez-vous: set registers.  */
         vcpu_init_regs (targ);
-        targ_regs->cr_iip = d->arch.boot_rdv_ip;
-        targ_regs->r1 = d->arch.boot_rdv_r1;
+        targ_regs->cr_iip = d->arch.sal_data->boot_rdv_ip;
+        targ_regs->r1 = d->arch.sal_data->boot_rdv_r1;
 
         if (test_and_clear_bit(_VCPUF_down,&targ->vcpu_flags)) {
             vcpu_wake(targ);
diff -r f7132169c2bf -r 8dc4af3f192c xen/arch/ia64/vmx/vmmu.c
--- a/xen/arch/ia64/vmx/vmmu.c  Mon Jul 03 09:11:49 2006 -0600
+++ b/xen/arch/ia64/vmx/vmmu.c  Wed Jul 05 09:28:32 2006 -0600
@@ -290,6 +290,7 @@ int vhpt_enabled(VCPU *vcpu, uint64_t va
 
 int unimplemented_gva(VCPU *vcpu,u64 vadr)
 {
+#if 0
     int bit=vcpu->domain->arch.imp_va_msb;
     u64 ladr =(vadr<<3)>>(3+bit);
     if(!ladr||ladr==(1U<<(61-bit))-1){
@@ -297,6 +298,9 @@ int unimplemented_gva(VCPU *vcpu,u64 vad
     }else{
         return 1;
     }
+#else
+    return 0;
+#endif
 }
 
 
diff -r f7132169c2bf -r 8dc4af3f192c xen/arch/ia64/vmx/vmx_init.c
--- a/xen/arch/ia64/vmx/vmx_init.c      Mon Jul 03 09:11:49 2006 -0600
+++ b/xen/arch/ia64/vmx/vmx_init.c      Wed Jul 05 09:28:32 2006 -0600
@@ -271,8 +271,6 @@ vmx_final_setup_guest(struct vcpu *v)
 {
        vpd_t *vpd;
 
-       free_xenheap_pages(v->arch.privregs, get_order(sizeof(mapped_regs_t)));
-
        vpd = alloc_vpd();
        ASSERT(vpd);
 
@@ -317,7 +315,7 @@ typedef struct io_range {
        unsigned long type;
 } io_range_t;
 
-io_range_t io_ranges[] = {
+static const io_range_t io_ranges[] = {
        {VGA_IO_START, VGA_IO_SIZE, GPFN_FRAME_BUFFER},
        {MMIO_START, MMIO_SIZE, GPFN_LOW_MMIO},
        {LEGACY_IO_START, LEGACY_IO_SIZE, GPFN_LEGACY_IO},
@@ -325,24 +323,24 @@ io_range_t io_ranges[] = {
        {PIB_START, PIB_SIZE, GPFN_PIB},
 };
 
+/* Reseve 1 page for shared I/O and 1 page for xenstore.  */
 #define VMX_SYS_PAGES  (2 + (GFW_SIZE >> PAGE_SHIFT))
 #define VMX_CONFIG_PAGES(d) ((d)->max_pages - VMX_SYS_PAGES)
 
-int vmx_build_physmap_table(struct domain *d)
+static void vmx_build_physmap_table(struct domain *d)
 {
        unsigned long i, j, start, tmp, end, mfn;
        struct vcpu *v = d->vcpu[0];
        struct list_head *list_ent = d->page_list.next;
 
-       ASSERT(!d->arch.physmap_built);
        ASSERT(!test_bit(ARCH_VMX_CONTIG_MEM, &v->arch.arch_vmx.flags));
        ASSERT(d->max_pages == d->tot_pages);
 
        /* Mark I/O ranges */
        for (i = 0; i < (sizeof(io_ranges) / sizeof(io_range_t)); i++) {
            for (j = io_ranges[i].start;
-                j < io_ranges[i].start + io_ranges[i].size;
-                j += PAGE_SIZE)
+               j < io_ranges[i].start + io_ranges[i].size;
+               j += PAGE_SIZE)
                __assign_domain_page(d, j, io_ranges[i].type, ASSIGN_writable);
        }
 
@@ -362,21 +360,19 @@ int vmx_build_physmap_table(struct domai
        if (unlikely(end > MMIO_START)) {
            start = 4 * MEM_G;
            end = start + (end - 3 * MEM_G);
-           for (i = start; (i < end) &&
-                (list_ent != &d->page_list); i += PAGE_SIZE) {
-               mfn = page_to_mfn(list_entry(
-                   list_ent, struct page_info, list));
+           for (i = start;
+                (i < end) && (list_ent != &d->page_list); i += PAGE_SIZE) {
+               mfn = page_to_mfn(list_entry(list_ent, struct page_info, list));
                assign_domain_page(d, i, mfn << PAGE_SHIFT);
                list_ent = mfn_to_page(mfn)->list.next;
            }
            ASSERT(list_ent != &d->page_list);
-        }
+       }
         
        /* Map guest firmware */
        for (i = GFW_START; (i < GFW_START + GFW_SIZE) &&
                (list_ent != &d->page_list); i += PAGE_SIZE) {
-           mfn = page_to_mfn(list_entry(
-               list_ent, struct page_info, list));
+           mfn = page_to_mfn(list_entry(list_ent, struct page_info, list));
            assign_domain_page(d, i, mfn << PAGE_SHIFT);
            list_ent = mfn_to_page(mfn)->list.next;
        }
@@ -393,24 +389,22 @@ int vmx_build_physmap_table(struct domai
        list_ent = mfn_to_page(mfn)->list.next;
        ASSERT(list_ent == &d->page_list);
 
-       d->arch.max_pfn = end >> PAGE_SHIFT;
-       d->arch.physmap_built = 1;
        set_bit(ARCH_VMX_CONTIG_MEM, &v->arch.arch_vmx.flags);
-       return 0;
-}
-
-void vmx_setup_platform(struct domain *d, struct vcpu_guest_context *c)
+}
+
+void vmx_setup_platform(struct domain *d)
 {
        ASSERT(d != dom0); /* only for non-privileged vti domain */
 
-       if (!d->arch.physmap_built)
-           vmx_build_physmap_table(d);
+       vmx_build_physmap_table(d);
 
        d->arch.vmx_platform.shared_page_va =
                (unsigned long)__va(__gpa_to_mpa(d, IO_PAGE_START));
        /* TEMP */
        d->arch.vmx_platform.pib_base = 0xfee00000UL;
 
+       d->arch.sal_data = xmalloc(struct xen_sal_data);
+
        /* Only open one port for I/O and interrupt emulation */
        memset(&d->shared_info->evtchn_mask[0], 0xff,
            sizeof(d->shared_info->evtchn_mask));
@@ -430,8 +424,7 @@ void vmx_do_launch(struct vcpu *v)
            domain_crash_synchronous();
        }
 
-       clear_bit(iopacket_port(v),
-               &v->domain->shared_info->evtchn_mask[0]);
+       clear_bit(iopacket_port(v), &v->domain->shared_info->evtchn_mask[0]);
 
        vmx_load_all_rr(v);
 }
diff -r f7132169c2bf -r 8dc4af3f192c xen/arch/ia64/xen/dom0_ops.c
--- a/xen/arch/ia64/xen/dom0_ops.c      Mon Jul 03 09:11:49 2006 -0600
+++ b/xen/arch/ia64/xen/dom0_ops.c      Wed Jul 05 09:28:32 2006 -0600
@@ -19,6 +19,10 @@
 #include <xen/guest_access.h>
 #include <public/sched_ctl.h>
 #include <asm/vmx.h>
+#include <asm/dom_fw.h>
+
+void build_physmap_table(struct domain *d);
+
 extern unsigned long total_pages;
 long arch_do_dom0_op(dom0_op_t *op, XEN_GUEST_HANDLE(dom0_op_t) u_dom0_op)
 {
@@ -154,52 +158,36 @@ long arch_do_dom0_op(dom0_op_t *op, XEN_
 
     case DOM0_GETMEMLIST:
     {
-        unsigned long i = 0;
+        unsigned long i;
         struct domain *d = find_domain_by_id(op->u.getmemlist.domain);
         unsigned long start_page = op->u.getmemlist.max_pfns >> 32;
         unsigned long nr_pages = op->u.getmemlist.max_pfns & 0xffffffff;
         unsigned long mfn;
-        struct list_head *list_ent;
 
         ret = -EINVAL;
-        if ( d != NULL )
-        {
-            ret = 0;
-
-            list_ent = d->page_list.next;
-            while ( (i != start_page) && (list_ent != &d->page_list)) {
-                mfn = page_to_mfn(list_entry(
-                    list_ent, struct page_info, list));
-                i++;
-                list_ent = mfn_to_page(mfn)->list.next;
-            }
-
-            if (i == start_page)
-            {
-                while((i < (start_page + nr_pages)) &&
-                      (list_ent != &d->page_list))
-                {
-                    mfn = page_to_mfn(list_entry(
-                        list_ent, struct page_info, list));
-
-                    if ( copy_to_guest_offset(op->u.getmemlist.buffer,
-                                          i - start_page, &mfn, 1) )
-                    {
-                        ret = -EFAULT;
-                        break;
-                    }
-                    i++;
-                    list_ent = mfn_to_page(mfn)->list.next;
-                }
-            } else
-                ret = -ENOMEM;
-
-            op->u.getmemlist.num_pfns = i - start_page;
-            if (copy_to_guest(u_dom0_op, op, 1))
-                ret = -EFAULT;
-            
-            put_domain(d);
-        }
+        if ( d == NULL )
+            break;
+        for (i = 0 ; i < nr_pages ; i++) {
+            pte_t *pte;
+
+            pte = (pte_t *)lookup_noalloc_domain_pte(d,
+                                               (start_page + i) << PAGE_SHIFT);
+            if (pte && pte_present(*pte))
+                mfn = pte_pfn(*pte);
+            else
+                mfn = INVALID_MFN;
+
+            if ( copy_to_guest_offset(op->u.getmemlist.buffer, i, &mfn, 1) ) {
+                    ret = -EFAULT;
+                    break;
+            }
+        }
+
+        op->u.getmemlist.num_pfns = i;
+        if (copy_to_guest(u_dom0_op, op, 1))
+            ret = -EFAULT;
+
+        put_domain(d);
     }
     break;
 
@@ -225,6 +213,33 @@ long arch_do_dom0_op(dom0_op_t *op, XEN_
     }
     break;
 
+    case DOM0_DOMAIN_SETUP:
+    {
+        dom0_domain_setup_t *ds = &op->u.domain_setup;
+        struct domain *d = find_domain_by_id(ds->domain);
+
+        if ( d == NULL) {
+            ret = -EINVAL;
+            break;
+        }
+
+        if (ds->flags & XEN_DOMAINSETUP_hvm_guest) {
+            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 {
+            build_physmap_table(d);
+            dom_fw_setup(d, ds->bp, ds->maxmem);
+        }
+        put_domain(d);
+    }
+    break;
+
     default:
         printf("arch_do_dom0_op: unrecognized dom0 op: %d!!!\n",op->cmd);
         ret = -ENOSYS;
diff -r f7132169c2bf -r 8dc4af3f192c xen/arch/ia64/xen/dom_fw.c
--- a/xen/arch/ia64/xen/dom_fw.c        Mon Jul 03 09:11:49 2006 -0600
+++ b/xen/arch/ia64/xen/dom_fw.c        Wed Jul 05 09:28:32 2006 -0600
@@ -25,14 +25,16 @@
 #include <asm/dom_fw.h>
 #include <asm/bundle.h>
 
-static struct ia64_boot_param *dom_fw_init(struct domain *, const char 
*,int,char *,int);
+static void dom_fw_init (struct domain *d, struct ia64_boot_param *bp, char 
*fw_mem, int fw_mem_size, unsigned long maxmem);
+
 extern struct domain *dom0;
 extern unsigned long dom0_start;
 
 extern unsigned long running_on_sim;
 
-unsigned long dom_fw_base_mpa = -1;
-unsigned long imva_fw_base = -1;
+/* Note: two domains cannot be created simulteanously!  */
+static unsigned long dom_fw_base_mpa = -1;
+static unsigned long imva_fw_base = -1;
 
 #define FW_VENDOR 
"X\0e\0n\0/\0i\0a\0\066\0\064\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
 
@@ -216,21 +218,22 @@ static void dom_fw_pal_hypercall_patch(s
 }
 
 
-// FIXME: This is really a hack: Forcing the boot parameter block
-// at domain mpaddr 0 page, then grabbing only the low bits of the
-// Xen imva, which is the offset into the page
-unsigned long dom_fw_setup(struct domain *d, const char *args, int arglen)
+void dom_fw_setup(struct domain *d, unsigned long bp_mpa, unsigned long maxmem)
 {
        struct ia64_boot_param *bp;
 
        dom_fw_base_mpa = 0;
 #ifndef CONFIG_XEN_IA64_DOM0_VP
-       if (d == dom0) dom_fw_base_mpa += dom0_start;
+       if (d == dom0) {
+               dom_fw_base_mpa += dom0_start;
+               bp_mpa += dom0_start;
+       }
 #endif
        ASSIGN_NEW_DOMAIN_PAGE_IF_DOM0(d, dom_fw_base_mpa);
        imva_fw_base = (unsigned long) domain_mpa_to_imva(d, dom_fw_base_mpa);
-       bp = dom_fw_init(d, args, arglen, (char *) imva_fw_base, PAGE_SIZE);
-       return dom_pa((unsigned long) bp);
+       ASSIGN_NEW_DOMAIN_PAGE_IF_DOM0(d, bp_mpa);
+       bp = domain_mpa_to_imva(d, bp_mpa);
+       dom_fw_init(d, bp, (char *) imva_fw_base, PAGE_SIZE, maxmem);
 }
 
 
@@ -603,8 +606,8 @@ efi_mdt_cmp(const void *a, const void *b
        return 0;
 }
 
-static struct ia64_boot_param *
-dom_fw_init (struct domain *d, const char *args, int arglen, char *fw_mem, int 
fw_mem_size)
+static void
+dom_fw_init (struct domain *d, struct ia64_boot_param *bp, char *fw_mem, int 
fw_mem_size, unsigned long maxmem)
 {
        efi_system_table_t *efi_systab;
        efi_runtime_services_t *efi_runtime;
@@ -614,12 +617,11 @@ dom_fw_init (struct domain *d, const cha
        struct ia64_sal_desc_ap_wakeup *sal_wakeup;
        fpswa_interface_t *fpswa_inf;
        efi_memory_desc_t *efi_memmap, *md;
-       struct ia64_boot_param *bp;
+       struct xen_sal_data *sal_data;
        unsigned long *pfn;
        unsigned char checksum = 0;
-       char *cp, *cmd_line, *fw_vendor;
+       char *cp, *fw_vendor;
        int num_mds, j, i = 0;
-       unsigned long maxmem = (d->max_pages - d->arch.sys_pgnr) * PAGE_SIZE;
 #ifdef CONFIG_XEN_IA64_DOM0_VP
        const unsigned long start_mpaddr = 0;
 #else
@@ -644,33 +646,23 @@ dom_fw_init (struct domain *d, const cha
        sal_wakeup  = (void *) cp; cp += sizeof(*sal_wakeup);
        fpswa_inf   = (void *) cp; cp += sizeof(*fpswa_inf);
        efi_memmap  = (void *) cp; cp += NUM_MEM_DESCS*sizeof(*efi_memmap);
-       bp          = (void *) cp; cp += sizeof(*bp);
        pfn         = (void *) cp; cp += NFUNCPTRS * 2 * sizeof(pfn);
-       cmd_line    = (void *) cp;
+       sal_data    = (void *) cp; cp += sizeof(*sal_data);
 
        /* Initialise for EFI_SET_VIRTUAL_ADDRESS_MAP emulation */
        d->arch.efi_runtime = efi_runtime;
        d->arch.fpswa_inf   = fpswa_inf;
-
-       if (args) {
-               if (arglen >= 1024)
-                       arglen = 1023;
-               memcpy(cmd_line, args, arglen);
-       } else {
-               arglen = 0;
-       }
-       cmd_line[arglen] = '\0';
+       d->arch.sal_data    = sal_data;
 
        memset(efi_systab, 0, sizeof(efi_systab));
        efi_systab->hdr.signature = EFI_SYSTEM_TABLE_SIGNATURE;
        efi_systab->hdr.revision  = EFI_SYSTEM_TABLE_REVISION;
        efi_systab->hdr.headersize = sizeof(efi_systab->hdr);
-       cp = fw_vendor = &cmd_line[arglen] + (2-(arglen&1)); // round to 16-bit 
boundary
+       fw_vendor = cp;
        cp += sizeof(FW_VENDOR) + (8-((unsigned long)cp & 7)); // round to 
64-bit boundary
 
        memcpy(fw_vendor,FW_VENDOR,sizeof(FW_VENDOR));
        efi_systab->fw_vendor = dom_pa((unsigned long) fw_vendor);
-       
        efi_systab->fw_revision = 1;
        efi_systab->runtime = (void *) dom_pa((unsigned long) efi_runtime);
        efi_systab->nr_tables = NUM_EFI_SYS_TABLES;
@@ -772,20 +764,20 @@ dom_fw_init (struct domain *d, const cha
        dom_fw_hypercall_patch (d, sal_ed->sal_proc, FW_HYPERCALL_SAL_CALL, 1);
        sal_ed->gp = 0;  // will be ignored
 
+       /* Fill an AP wakeup descriptor.  */
+       sal_wakeup->type = SAL_DESC_AP_WAKEUP;
+       sal_wakeup->mechanism = IA64_SAL_AP_EXTERNAL_INT;
+       sal_wakeup->vector = XEN_SAL_BOOT_RENDEZ_VEC;
+
+       /* Compute checksum.  */
+       for (cp = (char *) sal_systab; cp < (char *) efi_memmap; ++cp)
+               checksum += *cp;
+       sal_systab->checksum = -checksum;
+
        /* SAL return point.  */
        d->arch.sal_return_addr = FW_HYPERCALL_SAL_RETURN_PADDR + start_mpaddr;
        dom_fw_hypercall_patch (d, d->arch.sal_return_addr,
                                FW_HYPERCALL_SAL_RETURN, 0);
-
-       /* Fill an AP wakeup descriptor.  */
-       sal_wakeup->type = SAL_DESC_AP_WAKEUP;
-       sal_wakeup->mechanism = IA64_SAL_AP_EXTERNAL_INT;
-       sal_wakeup->vector = XEN_SAL_BOOT_RENDEZ_VEC;
-
-       for (cp = (char *) sal_systab; cp < (char *) efi_memmap; ++cp)
-               checksum += *cp;
-
-       sal_systab->checksum = -checksum;
 
        /* Fill in the FPSWA interface: */
        fpswa_inf->revision = fpswa_interface->revision;
@@ -862,6 +854,7 @@ dom_fw_init (struct domain *d, const cha
                else MAKE_MD(EFI_RESERVED_TYPE,0,0,0,0);
        } else {
 #ifndef CONFIG_XEN_IA64_DOM0_VP
+               /* Dom0 maps legacy mmio in first MB.  */
                MAKE_MD(EFI_LOADER_DATA,EFI_MEMORY_WB,0*MB,1*MB, 1);
                
MAKE_MD(EFI_CONVENTIONAL_MEMORY,EFI_MEMORY_WB,HYPERCALL_END,maxmem, 1);
 #endif
@@ -926,7 +919,7 @@ dom_fw_init (struct domain *d, const cha
        bp->efi_memmap_size = i * sizeof(efi_memory_desc_t);
        bp->efi_memdesc_size = sizeof(efi_memory_desc_t);
        bp->efi_memdesc_version = EFI_MEMDESC_VERSION;
-       bp->command_line = dom_pa((unsigned long) cmd_line);
+       bp->command_line = 0;
        bp->console_info.num_cols = 80;
        bp->console_info.num_rows = 25;
        bp->console_info.orig_x = 0;
@@ -936,12 +929,6 @@ dom_fw_init (struct domain *d, const cha
                int j;
                u64 addr;
 
-               // XXX CONFIG_XEN_IA64_DOM0_VP
-               // initrd_start address is hard coded in construct_dom0()
-               bp->initrd_start = (dom0_start+dom0_size) -
-                 (PAGE_ALIGN(ia64_boot_param->initrd_size) + 4*1024*1024);
-               bp->initrd_size = ia64_boot_param->initrd_size;
-
                // dom0 doesn't need build_physmap_table()
                // see arch_set_info_guest()
                // instead we allocate pages manually.
@@ -977,17 +964,9 @@ dom_fw_init (struct domain *d, const cha
                        if (efi_mmio(addr, PAGE_SIZE))
                                assign_domain_mmio_page(d, addr, PAGE_SIZE);
                }
-               d->arch.physmap_built = 1;
-       }
-       else {
-               bp->initrd_start = d->arch.initrd_start;
-               bp->initrd_size  = d->arch.initrd_len;
        }
        for (i = 0 ; i < bp->efi_memmap_size/sizeof(efi_memory_desc_t) ; i++) {
                md = efi_memmap + i;
                print_md(md);
        }
-       printf(" initrd start 0x%lx", bp->initrd_start);
-       printf(" initrd size 0x%lx\n", bp->initrd_size);
-       return bp;
-}
+}
diff -r f7132169c2bf -r 8dc4af3f192c xen/arch/ia64/xen/domain.c
--- a/xen/arch/ia64/xen/domain.c        Mon Jul 03 09:11:49 2006 -0600
+++ b/xen/arch/ia64/xen/domain.c        Wed Jul 05 09:28:32 2006 -0600
@@ -80,7 +80,6 @@ extern void serial_input_init(void);
 extern void serial_input_init(void);
 static void init_switch_stack(struct vcpu *v);
 extern void vmx_do_launch(struct vcpu *);
-void build_physmap_table(struct domain *d);
 
 /* this belongs in include/asm, but there doesn't seem to be a suitable place 
*/
 extern struct vcpu *ia64_switch_to (struct vcpu *next_task);
@@ -270,14 +269,15 @@ struct vcpu *alloc_vcpu_struct(struct do
        }
 
        if (!is_idle_domain(d)) {
-           v->arch.privregs = 
-               alloc_xenheap_pages(get_order(sizeof(mapped_regs_t)));
-           BUG_ON(v->arch.privregs == NULL);
-           memset(v->arch.privregs, 0, PAGE_SIZE);
-
-           if (!vcpu_id)
-               memset(&d->shared_info->evtchn_mask[0], 0xff,
-                   sizeof(d->shared_info->evtchn_mask));
+           if (!d->arch.is_vti) {
+               /* Create privregs page only if not VTi.  */
+               v->arch.privregs = 
+                   alloc_xenheap_pages(get_order(sizeof(mapped_regs_t)));
+               BUG_ON(v->arch.privregs == NULL);
+               memset(v->arch.privregs, 0, PAGE_SIZE);
+               share_xen_page_with_guest(virt_to_page(v->arch.privregs),
+                                         d, XENSHARE_writable);
+           }
 
            v->arch.metaphysical_rr0 = d->arch.metaphysical_rr0;
            v->arch.metaphysical_rr4 = d->arch.metaphysical_rr4;
@@ -349,6 +349,8 @@ int arch_domain_create(struct domain *d)
        if ((d->shared_info = (void *)alloc_xenheap_page()) == NULL)
            goto fail_nomem;
        memset(d->shared_info, 0, PAGE_SIZE);
+       share_xen_page_with_guest(virt_to_page(d->shared_info),
+                                 d, XENSHARE_writable);
 
        d->max_pages = (128UL*1024*1024)/PAGE_SIZE; // 128MB default // FIXME
        /* We may also need emulation rid for region4, though it's unlikely
@@ -357,11 +359,9 @@ int arch_domain_create(struct domain *d)
         */
        if (!allocate_rid_range(d,0))
                goto fail_nomem;
-       d->arch.sys_pgnr = 0;
 
        memset(&d->arch.mm, 0, sizeof(d->arch.mm));
 
-       d->arch.physmap_built = 0;
        if ((d->arch.mm.pgd = pgd_alloc(&d->arch.mm)) == NULL)
            goto fail_nomem;
 
@@ -390,70 +390,30 @@ void arch_getdomaininfo_ctxt(struct vcpu
 void arch_getdomaininfo_ctxt(struct vcpu *v, struct vcpu_guest_context *c)
 {
        c->user_regs = *vcpu_regs (v);
-       c->shared = v->domain->shared_info->arch;
+       c->privregs_pfn = virt_to_maddr(v->arch.privregs) >> PAGE_SHIFT;
 }
 
 int arch_set_info_guest(struct vcpu *v, struct vcpu_guest_context *c)
 {
        struct pt_regs *regs = vcpu_regs (v);
        struct domain *d = v->domain;
-       unsigned long cmdline_addr;
-
-       if ( test_bit(_VCPUF_initialised, &v->vcpu_flags) )
-            return 0;
-       if (c->flags & VGCF_VMX_GUEST) {
-           if (!vmx_enabled) {
-               printk("No VMX hardware feature for vmx domain.\n");
-               return -EINVAL;
-           }
-
-           if (v == d->vcpu[0])
-               vmx_setup_platform(d, c);
-
-           vmx_final_setup_guest(v);
-       } else if (!d->arch.physmap_built)
-           build_physmap_table(d);
-
+       
        *regs = c->user_regs;
-       cmdline_addr = 0;
-       if (v == d->vcpu[0]) {
-           /* Only for first vcpu.  */
-           d->arch.sys_pgnr = c->sys_pgnr;
-           d->arch.initrd_start = c->initrd.start;
-           d->arch.initrd_len   = c->initrd.size;
-           d->arch.cmdline      = c->cmdline;
-           d->shared_info->arch = c->shared;
-
-           if (!VMX_DOMAIN(v)) {
-                   const char *cmdline = d->arch.cmdline;
-                   int len;
-
-                   if (*cmdline == 0) {
-#define DEFAULT_CMDLINE "nomca nosmp xencons=tty0 console=tty0 root=/dev/hda1"
-                           cmdline = DEFAULT_CMDLINE;
-                           len = sizeof (DEFAULT_CMDLINE);
-                           printf("domU command line defaulted to"
-                                  DEFAULT_CMDLINE "\n");
-                   }
-                   else
-                           len = IA64_COMMAND_LINE_SIZE;
-                   cmdline_addr = dom_fw_setup (d, cmdline, len);
-           }
-
-           /* Cache synchronization seems to be done by the linux kernel
-              during mmap/unmap operation.  However be conservative.  */
-           domain_cache_flush (d, 1);
-       }
-       vcpu_init_regs (v);
-       regs->r28 = cmdline_addr;
-
-       if ( c->privregs && copy_from_user(v->arch.privregs,
-                          c->privregs, sizeof(mapped_regs_t))) {
-           printk("Bad ctxt address in arch_set_info_guest: %p\n",
-                  c->privregs);
-           return -EFAULT;
-       }
-
+       
+       if (!d->arch.is_vti) {
+               /* domain runs at PL2/3 */
+               regs->cr_ipsr |= 2UL << IA64_PSR_CPL0_BIT;
+               regs->ar_rsc |= (2 << 2); /* force PL2/3 */
+       }
+       
+       if ( test_bit(_VCPUF_initialised, &v->vcpu_flags) )
+               return 0;
+       if (d->arch.is_vti)
+               vmx_final_setup_guest(v);
+       
+       /* This overrides some registers.  */
+       vcpu_init_regs(v);
+  
        /* Don't redo final setup */
        set_bit(_VCPUF_initialised, &v->vcpu_flags);
        return 0;
@@ -531,6 +491,9 @@ void domain_relinquish_resources(struct 
 
     relinquish_memory(d, &d->xenpage_list);
     relinquish_memory(d, &d->page_list);
+
+    if (d->arch.is_vti && d->arch.sal_data)
+           xfree(d->arch.sal_data);
 }
 
 void build_physmap_table(struct domain *d)
@@ -538,7 +501,6 @@ void build_physmap_table(struct domain *
        struct list_head *list_ent = d->page_list.next;
        unsigned long mfn, i = 0;
 
-       ASSERT(!d->arch.physmap_built);
        while(list_ent != &d->page_list) {
            mfn = page_to_mfn(list_entry(
                list_ent, struct page_info, list));
@@ -547,7 +509,6 @@ void build_physmap_table(struct domain *
            i++;
            list_ent = mfn_to_page(mfn)->list.next;
        }
-       d->arch.physmap_built = 1;
 }
 
 unsigned long
@@ -762,8 +723,9 @@ int construct_dom0(struct domain *d,
        unsigned long pkern_end;
        unsigned long pinitrd_start = 0;
        unsigned long pstart_info;
-       unsigned long cmdline_addr;
        struct page_info *start_info_page;
+       unsigned long bp_mpa;
+       struct ia64_boot_param *bp;
 
 #ifdef VALIDATE_VT
        unsigned int vmx_dom0 = 0;
@@ -913,8 +875,6 @@ int construct_dom0(struct domain *d,
        //if ( initrd_len != 0 )
        //    memcpy((void *)vinitrd_start, initrd_start, initrd_len);
 
-       d->shared_info->arch.flags = SIF_INITDOMAIN|SIF_PRIVILEGED;
-
        /* Set up start info area. */
        d->shared_info->arch.start_info_pfn = pstart_info >> PAGE_SHIFT;
        start_info_page = assign_new_domain_page(d, pstart_info);
@@ -924,6 +884,7 @@ int construct_dom0(struct domain *d,
        memset(si, 0, PAGE_SIZE);
        sprintf(si->magic, "xen-%i.%i-ia64", XEN_VERSION, XEN_SUBVERSION);
        si->nr_pages     = max_pages;
+       si->flags = SIF_INITDOMAIN|SIF_PRIVILEGED;
 
        console_endboot();
 
@@ -939,15 +900,38 @@ int construct_dom0(struct domain *d,
 
        set_bit(_VCPUF_initialised, &v->vcpu_flags);
 
-       cmdline_addr = dom_fw_setup(d, dom0_command_line, COMMAND_LINE_SIZE);
+       /* Build firmware.
+          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);
+
+       /* Fill boot param.  */
+       strncpy((char *)si->cmd_line, dom0_command_line, sizeof(si->cmd_line));
+       si->cmd_line[sizeof(si->cmd_line)-1] = 0;
+
+       bp = (struct ia64_boot_param *)(si + 1);
+       bp->command_line = pstart_info + offsetof (start_info_t, cmd_line);
+
+       /* We assume console has reached the last line!  */
+       bp->console_info.num_cols = ia64_boot_param->console_info.num_cols;
+       bp->console_info.num_rows = ia64_boot_param->console_info.num_rows;
+       bp->console_info.orig_x = 0;
+       bp->console_info.orig_y = bp->console_info.num_rows == 0 ?
+                                 0 : bp->console_info.num_rows - 1;
+
+       bp->initrd_start = (dom0_start+dom0_size) -
+         (PAGE_ALIGN(ia64_boot_param->initrd_size) + 4*1024*1024);
+       bp->initrd_size = ia64_boot_param->initrd_size;
 
        vcpu_init_regs (v);
+
+       vcpu_regs(v)->r28 = bp_mpa;
 
 #ifdef CONFIG_DOMAIN0_CONTIGUOUS
        pkern_entry += dom0_start;
 #endif
        vcpu_regs (v)->cr_iip = pkern_entry;
-       vcpu_regs (v)->r28 = cmdline_addr;
 
        physdev_init_dom0(d);
 
diff -r f7132169c2bf -r 8dc4af3f192c xen/arch/ia64/xen/fw_emul.c
--- a/xen/arch/ia64/xen/fw_emul.c       Mon Jul 03 09:11:49 2006 -0600
+++ b/xen/arch/ia64/xen/fw_emul.c       Wed Jul 05 09:28:32 2006 -0600
@@ -96,8 +96,8 @@ sal_emulator (long index, unsigned long 
                        }
                        else {
                                struct domain *d = current->domain;
-                               d->arch.boot_rdv_ip = in2;
-                               d->arch.boot_rdv_r1 = in3;
+                               d->arch.sal_data->boot_rdv_ip = in2;
+                               d->arch.sal_data->boot_rdv_r1 = in3;
                        }
                }
                else
@@ -370,7 +370,7 @@ efi_translate_domain_addr(unsigned long 
        *fault = IA64_NO_FAULT;
 
 again:
-       if (v->domain->arch.efi_virt_mode) {
+       if (v->domain->arch.sal_data->efi_virt_mode) {
                *fault = vcpu_tpa(v, domain_addr, &mpaddr);
                if (*fault != IA64_NO_FAULT) return 0;
        }
@@ -434,7 +434,9 @@ efi_emulate_set_virtual_address_map(
        fpswa_interface_t *fpswa_inf = d->arch.fpswa_inf;
 
        if (descriptor_version != EFI_MEMDESC_VERSION) {
-               printf ("efi_emulate_set_virtual_address_map: memory descriptor 
version unmatched\n");
+               printf ("efi_emulate_set_virtual_address_map: memory "
+                       "descriptor version unmatched (%d vs %d)\n",
+                       (int)descriptor_version, EFI_MEMDESC_VERSION);
                return EFI_INVALID_PARAMETER;
        }
 
@@ -443,7 +445,8 @@ efi_emulate_set_virtual_address_map(
                return EFI_INVALID_PARAMETER;
        }
 
-       if (d->arch.efi_virt_mode) return EFI_UNSUPPORTED;
+       if (d->arch.sal_data->efi_virt_mode)
+               return EFI_UNSUPPORTED;
 
        efi_map_start = virtual_map;
        efi_map_end   = efi_map_start + memory_map_size;
@@ -485,7 +488,7 @@ efi_emulate_set_virtual_address_map(
        }
 
        /* The virtual address map has been applied. */
-       d->arch.efi_virt_mode = 1;
+       d->arch.sal_data->efi_virt_mode = 1;
 
        return EFI_SUCCESS;
 }
diff -r f7132169c2bf -r 8dc4af3f192c xen/arch/ia64/xen/hypercall.c
--- a/xen/arch/ia64/xen/hypercall.c     Mon Jul 03 09:11:49 2006 -0600
+++ b/xen/arch/ia64/xen/hypercall.c     Wed Jul 05 09:28:32 2006 -0600
@@ -154,8 +154,8 @@ fw_hypercall_ipi (struct pt_regs *regs)
                        
                /* First or next rendez-vous: set registers.  */
                vcpu_init_regs (targ);
-               vcpu_regs (targ)->cr_iip = d->arch.boot_rdv_ip;
-               vcpu_regs (targ)->r1 = d->arch.boot_rdv_r1;
+               vcpu_regs (targ)->cr_iip = d->arch.sal_data->boot_rdv_ip;
+               vcpu_regs (targ)->r1 = d->arch.sal_data->boot_rdv_r1;
                vcpu_regs (targ)->b0 = d->arch.sal_return_addr;
 
                if (test_and_clear_bit(_VCPUF_down,
diff -r f7132169c2bf -r 8dc4af3f192c xen/arch/ia64/xen/mm.c
--- a/xen/arch/ia64/xen/mm.c    Mon Jul 03 09:11:49 2006 -0600
+++ b/xen/arch/ia64/xen/mm.c    Wed Jul 05 09:28:32 2006 -0600
@@ -583,7 +583,7 @@ lookup_alloc_domain_pte(struct domain* d
 }
 
 //XXX xxx_none() should be used instread of !xxx_present()?
-static volatile pte_t*
+volatile pte_t*
 lookup_noalloc_domain_pte(struct domain* d, unsigned long mpaddr)
 {
     struct mm_struct *mm = &d->arch.mm;
@@ -1155,11 +1155,10 @@ dom0vp_add_physmap(struct domain* d, uns
         get_knownalive_domain(rd);
     }
 
-    if (unlikely(rd == d)) {
+    if (unlikely(rd == d || !mfn_valid(mfn))) {
         error = -EINVAL;
         goto out1;
     }
-    BUG_ON(!mfn_valid(mfn));
     if (unlikely(get_page(mfn_to_page(mfn), rd) == 0)) {
         error = -EINVAL;
         goto out1;
diff -r f7132169c2bf -r 8dc4af3f192c xen/arch/ia64/xen/vcpu.c
--- a/xen/arch/ia64/xen/vcpu.c  Mon Jul 03 09:11:49 2006 -0600
+++ b/xen/arch/ia64/xen/vcpu.c  Wed Jul 05 09:28:32 2006 -0600
@@ -1355,7 +1355,7 @@ static TR_ENTRY*
 static TR_ENTRY*
 vcpu_tr_lookup(VCPU* vcpu, unsigned long va, UINT64 rid, BOOLEAN is_data)
 {
-       unsigned int* regions;
+       unsigned char* regions;
        TR_ENTRY *trp;
        int tr_max;
        int i;
diff -r f7132169c2bf -r 8dc4af3f192c xen/include/asm-ia64/dom_fw.h
--- a/xen/include/asm-ia64/dom_fw.h     Mon Jul 03 09:11:49 2006 -0600
+++ b/xen/include/asm-ia64/dom_fw.h     Wed Jul 05 09:28:32 2006 -0600
@@ -168,4 +168,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 unsigned long dom_fw_setup (struct domain *, const char *, int);
+extern void dom_fw_setup (struct domain *, unsigned long bp_mpa, unsigned long 
maxmem);
diff -r f7132169c2bf -r 8dc4af3f192c xen/include/asm-ia64/domain.h
--- a/xen/include/asm-ia64/domain.h     Mon Jul 03 09:11:49 2006 -0600
+++ b/xen/include/asm-ia64/domain.h     Wed Jul 05 09:28:32 2006 -0600
@@ -63,10 +63,26 @@ struct last_vcpu {
     int vcpu_id;
 } ____cacheline_aligned_in_smp;
 
+/* These are data in domain memory for SAL emulator.  */
+struct xen_sal_data {
+    /* OS boot rendez vous.  */
+    unsigned long boot_rdv_ip;
+    unsigned long boot_rdv_r1;
+
+    /* There are these for EFI_SET_VIRTUAL_ADDRESS_MAP emulation. */
+    int efi_virt_mode;         /* phys : 0 , virt : 1 */
+};
+
 struct arch_domain {
     struct mm_struct mm;
-    unsigned long metaphysical_rr0;
-    unsigned long metaphysical_rr4;
+
+    /* Flags.  */
+    union {
+        unsigned long flags;
+        struct {
+            unsigned int is_vti : 1;
+        };
+    };
 
     /* There are two ranges of RID for a domain:
        one big range, used to virtualize domain RID,
@@ -74,37 +90,31 @@ struct arch_domain {
     /* Big range.  */
     int starting_rid;          /* first RID assigned to domain */
     int ending_rid;            /* one beyond highest RID assigned to domain */
-    int rid_bits;              /* number of virtual rid bits (default: 18) */
     /* Metaphysical range.  */
     int starting_mp_rid;
     int ending_mp_rid;
-
+    /* RID for metaphysical mode.  */
+    unsigned long metaphysical_rr0;
+    unsigned long metaphysical_rr4;
+    
+    int rid_bits;              /* number of virtual rid bits (default: 18) */
     int breakimm;     /* The imm value for hypercalls.  */
 
-    int physmap_built;         /* Whether is physmap built or not */
-    int imp_va_msb;
-    /* System pages out of guest memory, like for xenstore/console */
-    unsigned long sys_pgnr;
-    unsigned long max_pfn; /* Max pfn including I/O holes */
     struct virtual_platform_def     vmx_platform;
 #define        hvm_domain vmx_platform /* platform defs are not vmx specific */
 
-    /* OS boot rendez vous.  */
-    unsigned long boot_rdv_ip;
-    unsigned long boot_rdv_r1;
-
+    u64 xen_vastart;
+    u64 xen_vaend;
+    u64 shared_info_va;
+ 
+    /* Address of SAL emulator data  */
+    struct xen_sal_data *sal_data;
     /* SAL return point.  */
     unsigned long sal_return_addr;
 
-    u64 shared_info_va;
-    unsigned long initrd_start;
-    unsigned long initrd_len;
-    char *cmdline;
-    /* There are these for EFI_SET_VIRTUAL_ADDRESS_MAP emulation. */
-    int efi_virt_mode;         /* phys : 0 , virt : 1 */
-    /* Metaphysical address to efi_runtime_services_t in domain firmware 
memory is set. */
+    /* Address of efi_runtime_services_t (placed in domain memory)  */
     void *efi_runtime;
-    /* Metaphysical address to fpswa_interface_t in domain firmware memory is 
set. */
+    /* Address of fpswa_interface_t (placed in domain memory)  */
     void *fpswa_inf;
 
     struct last_vcpu last_vcpu[NR_CPUS];
@@ -114,23 +124,28 @@ struct arch_domain {
     offsetof(vcpu_info_t, evtchn_upcall_mask))
 
 struct arch_vcpu {
-       TR_ENTRY itrs[NITRS];
-       TR_ENTRY dtrs[NDTRS];
-       TR_ENTRY itlb;
-       TR_ENTRY dtlb;
-       unsigned int itr_regions;
-       unsigned int dtr_regions;
-       unsigned long irr[4];
-       unsigned long insvc[4];
-       unsigned long tc_regions;
-       unsigned long iva;
-       unsigned long dcr;
-       unsigned long itc;
-       unsigned long domain_itm;
-       unsigned long domain_itm_last;
-       unsigned long xen_itm;
+    /* Save the state of vcpu.
+       This is the first entry to speed up accesses.  */
+    mapped_regs_t *privregs;
 
-    mapped_regs_t *privregs; /* save the state of vcpu */
+    /* TR and TC.  */
+    TR_ENTRY itrs[NITRS];
+    TR_ENTRY dtrs[NDTRS];
+    TR_ENTRY itlb;
+    TR_ENTRY dtlb;
+
+    /* Bit is set if there is a tr/tc for the region.  */
+    unsigned char itr_regions;
+    unsigned char dtr_regions;
+    unsigned char tc_regions;
+
+    unsigned long irr[4];          /* Interrupt request register.  */
+    unsigned long insvc[4];            /* Interrupt in service.  */
+    unsigned long iva;
+    unsigned long dcr;
+    unsigned long domain_itm;
+    unsigned long domain_itm_last;
+
     unsigned long event_callback_ip;           // event callback handler
     unsigned long failsafe_callback_ip;        // Do we need it?
 
diff -r f7132169c2bf -r 8dc4af3f192c xen/include/asm-ia64/mm.h
--- a/xen/include/asm-ia64/mm.h Mon Jul 03 09:11:49 2006 -0600
+++ b/xen/include/asm-ia64/mm.h Wed Jul 05 09:28:32 2006 -0600
@@ -429,7 +429,7 @@ struct p2m_entry;
 struct p2m_entry;
 extern unsigned long lookup_domain_mpa(struct domain *d, unsigned long mpaddr, 
struct p2m_entry* entry);
 extern void *domain_mpa_to_imva(struct domain *d, unsigned long mpaddr);
-
+extern volatile pte_t *lookup_noalloc_domain_pte(struct domain* d, unsigned 
long mpaddr);
 #ifdef CONFIG_XEN_IA64_DOM0_VP
 extern unsigned long assign_domain_mmio_page(struct domain *d, unsigned long 
mpaddr, unsigned long size);
 extern unsigned long assign_domain_mach_page(struct domain *d, unsigned long 
mpaddr, unsigned long size, unsigned long flags);
diff -r f7132169c2bf -r 8dc4af3f192c xen/include/asm-ia64/vmx.h
--- a/xen/include/asm-ia64/vmx.h        Mon Jul 03 09:11:49 2006 -0600
+++ b/xen/include/asm-ia64/vmx.h        Wed Jul 05 09:28:32 2006 -0600
@@ -34,7 +34,7 @@ extern void vmx_final_setup_guest(struct
 extern void vmx_final_setup_guest(struct vcpu *v);
 extern void vmx_save_state(struct vcpu *v);
 extern void vmx_load_state(struct vcpu *v);
-extern void vmx_setup_platform(struct domain *d, struct vcpu_guest_context *c);
+extern void vmx_setup_platform(struct domain *d);
 extern void vmx_wait_io(void);
 extern void vmx_io_assist(struct vcpu *v);
 extern void panic_domain(struct pt_regs *regs, const char *fmt, ...);
@@ -43,7 +43,6 @@ extern void vmx_load_state(struct vcpu *
 extern void vmx_load_state(struct vcpu *v);
 extern void show_registers(struct pt_regs *regs);
 #define show_execution_state show_registers
-extern int vmx_build_physmap_table(struct domain *d);
 extern unsigned long __gpfn_to_mfn_foreign(struct domain *d, unsigned long 
gpfn);
 extern void sync_split_caches(void);
 extern void vmx_virq_line_assist(struct vcpu *v);
diff -r f7132169c2bf -r 8dc4af3f192c xen/include/public/arch-ia64.h
--- a/xen/include/public/arch-ia64.h    Mon Jul 03 09:11:49 2006 -0600
+++ b/xen/include/public/arch-ia64.h    Wed Jul 05 09:28:32 2006 -0600
@@ -40,19 +40,6 @@ DEFINE_XEN_GUEST_HANDLE(xen_pfn_t);
 
 #ifndef __ASSEMBLY__
 
-#define MAX_NR_SECTION  32  /* at most 32 memory holes */
-struct mm_section {
-    unsigned long start;  /* start of memory hole */
-    unsigned long end;    /* end of memory hole */
-};
-typedef struct mm_section mm_section_t;
-
-struct pmt_entry {
-    unsigned long mfn : 56;
-    unsigned long type: 8;
-};
-typedef struct pmt_entry pmt_entry_t;
-
 #define GPFN_MEM          (0UL << 56) /* Guest pfn is normal mem */
 #define GPFN_FRAME_BUFFER (1UL << 56) /* VGA framebuffer */
 #define GPFN_LOW_MMIO     (2UL << 56) /* Low MMIO range */
@@ -93,16 +80,6 @@ typedef struct pmt_entry pmt_entry_t;
 
 #define GFW_START        (4*MEM_G -16*MEM_M)
 #define GFW_SIZE         (16*MEM_M)
-
-/*
- * NB. This may become a 64-bit count with no shift. If this happens then the 
- * structure size will still be 8 bytes, so no other alignments will change.
- */
-struct tsc_timestamp {
-    unsigned int  tsc_bits;      /* 0: 32 bits read from the CPU's TSC. */
-    unsigned int  tsc_bitshift;  /* 4: 'tsc_bits' uses N:N+31 of TSC.   */
-}; /* 8 bytes */
-typedef struct tsc_timestamp tsc_timestamp_t;
 
 struct pt_fpreg {
     union {
@@ -302,15 +279,14 @@ struct mapped_regs {
     unsigned long  reserved7[4096];
 };
 typedef struct mapped_regs mapped_regs_t;
+typedef mapped_regs_t vpd_t;
 
 struct arch_vcpu_info {
 };
 typedef struct arch_vcpu_info arch_vcpu_info_t;
 
-typedef mapped_regs_t vpd_t;
-
 struct arch_shared_info {
-    unsigned int flags;
+    /* PFN of the start_info page.  */
     unsigned long start_info_pfn;
 
     /* Interrupt vector for event channel.  */
@@ -318,30 +294,13 @@ struct arch_shared_info {
 };
 typedef struct arch_shared_info arch_shared_info_t;
 
-struct arch_initrd_info {
-    unsigned long start;
-    unsigned long size;
-};
-typedef struct arch_initrd_info arch_initrd_info_t;
-
 typedef unsigned long xen_callback_t;
 
-#define IA64_COMMAND_LINE_SIZE 512
 struct vcpu_guest_context {
-#define VGCF_FPU_VALID (1<<0)
-#define VGCF_VMX_GUEST (1<<1)
-#define VGCF_IN_KERNEL (1<<2)
     unsigned long flags;       /* VGCF_* flags */
-    unsigned long pt_base;     /* PMT table base */
-    unsigned long share_io_pg; /* Shared page for I/O emulation */
-    unsigned long sys_pgnr;    /* System pages out of domain memory */
-    unsigned long vm_assist;   /* VMASST_TYPE_* bitmap, now none on IPF */
 
     struct cpu_user_regs user_regs;
-    struct mapped_regs *privregs;
-    struct arch_shared_info shared;
-    struct arch_initrd_info initrd;
-    char cmdline[IA64_COMMAND_LINE_SIZE];
+    unsigned long privregs_pfn;
 };
 typedef struct vcpu_guest_context vcpu_guest_context_t;
 DEFINE_XEN_GUEST_HANDLE(vcpu_guest_context_t);
@@ -378,6 +337,28 @@ DEFINE_XEN_GUEST_HANDLE(vcpu_guest_conte
 #define ASSIGN_readonly                 (1UL << _ASSIGN_readonly)
 #define ASSIGN_writable                 (0UL << _ASSIGN_readonly) // dummy flag
 
+/* This structure has the same layout of struct ia64_boot_param, defined in
+   <asm/system.h>.  It is redefined here to ease use.  */
+struct xen_ia64_boot_param {
+       unsigned long command_line;     /* physical address of cmd line args */
+       unsigned long efi_systab;       /* physical address of EFI system table 
*/
+       unsigned long efi_memmap;       /* physical address of EFI memory map */
+       unsigned long efi_memmap_size;  /* size of EFI memory map */
+       unsigned long efi_memdesc_size; /* size of an EFI memory map descriptor 
*/
+       unsigned int  efi_memdesc_version;      /* memory descriptor version */
+       struct {
+               unsigned short num_cols;        /* number of columns on 
console.  */
+               unsigned short num_rows;        /* number of rows on console.  
*/
+               unsigned short orig_x;  /* cursor's x position */
+               unsigned short orig_y;  /* cursor's y position */
+       } console_info;
+       unsigned long fpswa;            /* physical address of the fpswa 
interface */
+       unsigned long initrd_start;
+       unsigned long initrd_size;
+       unsigned long domain_start;     /* va where the boot time domain begins 
*/
+       unsigned long domain_size;      /* how big is the boot domain */
+};
+
 #endif /* !__ASSEMBLY__ */
 
 /* Address of shared_info in domain virtual space.

_______________________________________________
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] Implement and use DOM0_DOMAIN_STEUP., Xen patchbot-unstable <=