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-ia64-devel

[Xen-ia64-devel] RFC: adding a dom0_firmware_setup hypercall

To: xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-ia64-devel] RFC: adding a dom0_firmware_setup hypercall
From: Tristan Gingold <Tristan.Gingold@xxxxxxxx>
Date: Tue, 23 May 2006 16:25:25 +0200
Delivery-date: Tue, 23 May 2006 07:21:19 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-ia64-devel-request@lists.xensource.com?subject=help>
List-id: Discussion of the ia64 port of Xen <xen-ia64-devel.lists.xensource.com>
List-post: <mailto:xen-ia64-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-ia64-devel>, <mailto:xen-ia64-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-ia64-devel>, <mailto:xen-ia64-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-ia64-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: KMail/1.5
Hi,

this a just for review and comments.  The purpose is not to use 
DOM0_SETVPUCONTEXT to initialiaze a domain.
This is the first step for save&restore.

[This patch also contains warning cleanup, it will be separated of course].

Tristan.
diff -r 303e1b6bf727 linux-2.6-xen-sparse/arch/ia64/xen/drivers/xenia64_init.c
--- a/linux-2.6-xen-sparse/arch/ia64/xen/drivers/xenia64_init.c Sun May 21 
07:49:46 2006 -0600
+++ b/linux-2.6-xen-sparse/arch/ia64/xen/drivers/xenia64_init.c Tue May 23 
14:44:22 2006 +0200
@@ -25,7 +25,6 @@ int xen_init(void)
                return -1;
 
        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);
diff -r 303e1b6bf727 tools/libxc/xc_linux_build.c
--- a/tools/libxc/xc_linux_build.c      Sun May 21 07:49:46 2006 -0600
+++ b/tools/libxc/xc_linux_build.c      Tue May 23 14:44:22 2006 +0200
@@ -2,6 +2,7 @@
  * xc_linux_build.c
  */
 
+#include <stddef.h>
 #include "xg_private.h"
 #include "xc_private.h"
 #include <xenctrl.h>
@@ -471,6 +472,9 @@ 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 ia64_boot_param *bp;
+    DECLARE_DOM0_OP;
     int rc;
 
     rc = probeimageformat(image, image_size, &load_funcs);
@@ -536,10 +540,11 @@ static int setup_guest(int xc_handle,
 
     *store_mfn = page_array[1];
     *console_mfn = page_array[2];
+    start_info_mpa = (nr_pages - 3) << PAGE_SHIFT;
     printf("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);
 
@@ -554,21 +559,31 @@ 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 ????
+
+    /* Build firmware.  */
+    op.u.firmware_setup.domain = (domid_t)dom;
+    op.u.firmware_setup.bp = start_info_mpa + sizeof (start_info_t);
+    op.u.firmware_setup.hypercall_imm = 0x1000;
+    op.u.firmware_setup.sys_pgnr = 3;
+    op.u.firmware_setup.start_info_pfn = nr_pages - 3; /* metaphysical */
+
+    op.cmd = DOM0_FIRMWARE_SETUP;
+    if ( xc_dom0_op(xc_handle, &op) )
+        goto error_out;
+    bp = (struct 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;
+        printf ("cmd_line=%s\n", cmdline);
+    }
     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->regs.r28 = start_info_mpa + sizeof (start_info_t);
     munmap(start_info, PAGE_SIZE);
 
     free(page_array);
@@ -1106,8 +1121,6 @@ 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->regs.cr_ipsr = 0; /* all necessary bits filled by hypervisor */
     ctxt->regs.cr_iip = vkern_entry;
     ctxt->regs.cr_ifs = 1UL << 63;
@@ -1115,7 +1128,6 @@ static int xc_linux_build_internal(int x
     /* 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 303e1b6bf727 xen/arch/ia64/Rules.mk
--- a/xen/arch/ia64/Rules.mk    Sun May 21 07:49:46 2006 -0600
+++ b/xen/arch/ia64/Rules.mk    Tue May 23 14:44:22 2006 +0200
@@ -40,7 +40,7 @@ CFLAGS        += -DCONFIG_XEN_IA64_DOM0_VP
 CFLAGS += -DCONFIG_XEN_IA64_DOM0_VP
 endif
 ifeq ($(no_warns),y)
-CFLAGS += -Wa,--fatal-warnings
+CFLAGS += -Wa,--fatal-warnings -Werror -Wno-uninitialized
 endif
 
 LDFLAGS := -g
diff -r 303e1b6bf727 xen/arch/ia64/linux-xen/iosapic.c
--- a/xen/arch/ia64/linux-xen/iosapic.c Sun May 21 07:49:46 2006 -0600
+++ b/xen/arch/ia64/linux-xen/iosapic.c Tue May 23 14:44:22 2006 +0200
@@ -1112,12 +1112,14 @@ map_iosapic_to_node(unsigned int gsi_bas
 }
 #endif
 
+#ifndef XEN
 static int __init iosapic_enable_kmalloc (void)
 {
        iosapic_kmalloc_ok = 1;
        return 0;
 }
 core_initcall (iosapic_enable_kmalloc);
+#endif
 
 #ifdef XEN
 /* nop for now */
diff -r 303e1b6bf727 xen/arch/ia64/linux-xen/irq_ia64.c
--- a/xen/arch/ia64/linux-xen/irq_ia64.c        Sun May 21 07:49:46 2006 -0600
+++ b/xen/arch/ia64/linux-xen/irq_ia64.c        Tue May 23 14:44:22 2006 +0200
@@ -225,7 +225,7 @@ extern irqreturn_t handle_IPI (int irq, 
 extern irqreturn_t handle_IPI (int irq, void *dev_id, struct pt_regs *regs);
 
 static struct irqaction ipi_irqaction = {
-       .handler =      handle_IPI,
+       .handler =      (void (*)(int,void*,struct cpu_user_regs*))handle_IPI,
 #ifndef XEN
        .flags =        SA_INTERRUPT,
 #endif
diff -r 303e1b6bf727 xen/arch/ia64/linux-xen/sal.c
--- a/xen/arch/ia64/linux-xen/sal.c     Sun May 21 07:49:46 2006 -0600
+++ b/xen/arch/ia64/linux-xen/sal.c     Tue May 23 14:44:22 2006 +0200
@@ -229,7 +229,7 @@ ia64_sal_init (struct ia64_sal_systab *s
                return;
        }
 
-       if (strncmp(systab->signature, "SST_", 4) != 0)
+       if (strncmp((char*)systab->signature, "SST_", 4) != 0)
                printk(KERN_ERR "bad signature in system table!");
 
        check_versions(systab);
diff -r 303e1b6bf727 xen/arch/ia64/linux-xen/smpboot.c
--- a/xen/arch/ia64/linux-xen/smpboot.c Sun May 21 07:49:46 2006 -0600
+++ b/xen/arch/ia64/linux-xen/smpboot.c Tue May 23 14:44:22 2006 +0200
@@ -197,7 +197,7 @@ sync_master (void *arg)
  * negative that it is behind.
  */
 static inline long
-get_delta (long *rt, long *master)
+get_delta (unsigned long *rt, unsigned long *master)
 {
        unsigned long best_t0 = 0, best_t1 = ~0UL, best_tm = 0;
        unsigned long tcenter, t0, t1, tm;
diff -r 303e1b6bf727 xen/arch/ia64/linux-xen/time.c
--- a/xen/arch/ia64/linux-xen/time.c    Sun May 21 07:49:46 2006 -0600
+++ b/xen/arch/ia64/linux-xen/time.c    Tue May 23 14:44:22 2006 +0200
@@ -158,7 +158,7 @@ ia64_init_itm (void)
 {
        unsigned long platform_base_freq, itc_freq;
        struct pal_freq_ratio itc_ratio, proc_ratio;
-       long status, platform_base_drift, itc_drift;
+       unsigned long status, platform_base_drift, itc_drift;
 
        /*
         * According to SAL v2.6, we need to use a SAL call to determine the 
platform base
@@ -197,7 +197,7 @@ ia64_init_itm (void)
        itc_freq = (platform_base_freq*itc_ratio.num)/itc_ratio.den;
 
        local_cpu_data->itm_delta = (itc_freq + HZ/2) / HZ;
-       printk(KERN_DEBUG "CPU %d: base freq=%lu.%03luMHz, ITC ratio=%lu/%lu, "
+       printk(KERN_DEBUG "CPU %d: base freq=%lu.%03luMHz, ITC ratio=%u/%u, "
               "ITC freq=%lu.%03luMHz", smp_processor_id(),
               platform_base_freq / 1000000, (platform_base_freq / 1000) % 1000,
               itc_ratio.num, itc_ratio.den, itc_freq / 1000000, (itc_freq / 
1000) % 1000);
diff -r 303e1b6bf727 xen/arch/ia64/vmx/pal_emul.c
--- a/xen/arch/ia64/vmx/pal_emul.c      Sun May 21 07:49:46 2006 -0600
+++ b/xen/arch/ia64/vmx/pal_emul.c      Tue May 23 14:44:22 2006 +0200
@@ -196,6 +196,10 @@ pal_debug_info(VCPU *vcpu){
 
 static struct ia64_pal_retval
 pal_fixed_addr(VCPU *vcpu){
+       struct ia64_pal_retval result;
+
+       result.status= -1; //unimplemented
+       return result;
 }
 
 static struct ia64_pal_retval
diff -r 303e1b6bf727 xen/arch/ia64/vmx/vmx_hypercall.c
--- a/xen/arch/ia64/vmx/vmx_hypercall.c Sun May 21 07:49:46 2006 -0600
+++ b/xen/arch/ia64/vmx/vmx_hypercall.c Tue May 23 14:44:22 2006 +0200
@@ -36,7 +36,6 @@
 #include <xen/domain.h>
 
 extern long do_sched_op_compat(int cmd, unsigned long arg);
-extern unsigned long domain_mpa_to_imva(struct domain *,unsigned long mpaddr);
 
 void hyper_not_support(void)
 {
diff -r 303e1b6bf727 xen/arch/ia64/vmx/vmx_process.c
--- a/xen/arch/ia64/vmx/vmx_process.c   Sun May 21 07:49:46 2006 -0600
+++ b/xen/arch/ia64/vmx/vmx_process.c   Tue May 23 14:44:22 2006 +0200
@@ -338,7 +338,7 @@ vmx_hpw_miss(u64 vadr , u64 vec, REGS* r
     }
     if(vec == 1) type = ISIDE_TLB;
     else if(vec == 2) type = DSIDE_TLB;
-    else panic_domain(regs,"wrong vec:%0xlx\n",vec);
+    else panic_domain(regs,"wrong vec:0x%lx\n",vec);
 
 //    prepare_if_physical_mode(v);
 
diff -r 303e1b6bf727 xen/arch/ia64/xen/dom0_ops.c
--- a/xen/arch/ia64/xen/dom0_ops.c      Sun May 21 07:49:46 2006 -0600
+++ b/xen/arch/ia64/xen/dom0_ops.c      Tue May 23 14:44:22 2006 +0200
@@ -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)
 {
@@ -225,6 +229,25 @@ long arch_do_dom0_op(dom0_op_t *op, XEN_
     }
     break;
 
+    case DOM0_FIRMWARE_SETUP:
+    {
+        dom0_firmware_setup_t *fs = &op->u.firmware_setup;
+        struct domain *d = find_domain_by_id(op->u.getmemlist.domain);
+
+        if ( d == NULL) {
+            ret = -EINVAL;
+            break;
+        }
+        if (!d->arch.physmap_built)
+            build_physmap_table(d);
+        d->arch.breakimm = fs->hypercall_imm;
+        d->arch.sys_pgnr = fs->sys_pgnr;
+        d->shared_info->arch.start_info_pfn = fs->start_info_pfn;
+        dom_fw_setup (d, fs->bp);
+        printf ("dom_firmware_setup: bp=%lx\n", fs->bp);
+    }
+    break;
+
     default:
         printf("arch_do_dom0_op: unrecognized dom0 op: %d!!!\n",op->cmd);
         ret = -ENOSYS;
diff -r 303e1b6bf727 xen/arch/ia64/xen/dom_fw.c
--- a/xen/arch/ia64/xen/dom_fw.c        Sun May 21 07:49:46 2006 -0600
+++ b/xen/arch/ia64/xen/dom_fw.c        Tue May 23 14:44:22 2006 +0200
@@ -21,16 +21,15 @@
 #include <asm/dom_fw.h>
 #include <public/sched.h>
 
-static struct ia64_boot_param *dom_fw_init(struct domain *, const char 
*,int,char *,int);
-extern unsigned long domain_mpa_to_imva(struct domain *,unsigned long mpaddr);
+static void dom_fw_init(struct domain *, struct ia64_boot_param *,char *,int);
 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;
+static unsigned long dom_fw_base_mpa = -1;
+static unsigned long imva_fw_base = -1;
 
 // return domain (meta)physical address for a given imva
 // this function is a call-back from dom_fw_init
@@ -92,22 +91,20 @@ static void dom_fw_pal_hypercall_patch(s
        build_pal_hypercall_bundles(imva, d->arch.breakimm, 
FW_HYPERCALL_PAL_CALL);
 }
 
-
-// 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)
 {
        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) bp_mpa += dom0_start;
 #endif
        ASSIGN_NEW_DOMAIN_PAGE_IF_DOM0(d, dom_fw_base_mpa);
-       imva_fw_base = 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);
+       imva_fw_base = (unsigned long) domain_mpa_to_imva(d, dom_fw_base_mpa);
+       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);
 }
 
 
@@ -762,8 +759,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)
 {
        efi_system_table_t *efi_systab;
        efi_runtime_services_t *efi_runtime;
@@ -772,10 +769,9 @@ dom_fw_init (struct domain *d, const cha
        struct ia64_sal_desc_entry_point *sal_ed;
        struct ia64_sal_desc_ap_wakeup *sal_wakeup;
        efi_memory_desc_t *efi_memmap, *md;
-       struct ia64_boot_param *bp;
        unsigned long *pfn;
        unsigned char checksum = 0;
-       char *cp, *cmd_line, *fw_vendor;
+       char *cp, *fw_vendor;
        int i = 0;
        unsigned long maxmem = (d->max_pages - d->arch.sys_pgnr) * PAGE_SIZE;
 #ifdef CONFIG_XEN_IA64_DOM0_VP
@@ -813,27 +809,16 @@ dom_fw_init (struct domain *d, const cha
        sal_ed      = (void *) cp; cp += sizeof(*sal_ed);
        sal_wakeup  = (void *) cp; cp += sizeof(*sal_wakeup);
        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;
 
        /* Initialise for EFI_SET_VIRTUAL_ADDRESS_MAP emulation */
        d->arch.efi_runtime = efi_runtime;
-
-       if (args) {
-               if (arglen >= 1024)
-                       arglen = 1023;
-               memcpy(cmd_line, args, arglen);
-       } else {
-               arglen = 0;
-       }
-       cmd_line[arglen] = '\0';
 
        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;
 #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"
        cp += sizeof(FW_VENDOR) + (8-((unsigned long)cp & 7)); // round to 
64-bit boundary
 
@@ -1032,12 +1017,13 @@ 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; // dom_pa((unsigned long) cmd_line);
        bp->console_info.num_cols = 80;
        bp->console_info.num_rows = 25;
        bp->console_info.orig_x = 0;
        bp->console_info.orig_y = 24;
        bp->fpswa = 0;
+#if 0
        if (d == dom0) {
                // XXX CONFIG_XEN_IA64_DOM0_VP
                // initrd_start address is hard coded in start_kernel()
@@ -1051,5 +1037,5 @@ dom_fw_init (struct domain *d, const cha
        }
        printf(" initrd start 0x%lx", bp->initrd_start);
        printf(" initrd size 0x%lx\n", bp->initrd_size);
-       return bp;
-}
+#endif
+}
diff -r 303e1b6bf727 xen/arch/ia64/xen/domain.c
--- a/xen/arch/ia64/xen/domain.c        Sun May 21 07:49:46 2006 -0600
+++ b/xen/arch/ia64/xen/domain.c        Tue May 23 14:44:22 2006 +0200
@@ -61,6 +61,8 @@ unsigned long dom0_size = 512*1024*1024;
 unsigned long dom0_size = 512*1024*1024;
 unsigned long dom0_align = 64*1024*1024;
 
+extern char dom0_command_line[];
+
 /* dom0_max_vcpus: maximum number of VCPUs to create for dom0.  */
 static unsigned int dom0_max_vcpus = 1;
 integer_param("dom0_max_vcpus", dom0_max_vcpus); 
@@ -260,7 +262,9 @@ void arch_getdomaininfo_ctxt(struct vcpu
 void arch_getdomaininfo_ctxt(struct vcpu *v, struct vcpu_guest_context *c)
 {
        c->regs = *vcpu_regs (v);
+#if 0
        c->shared = v->domain->shared_info->arch;
+#endif
 }
 
 int arch_set_info_guest(struct vcpu *v, struct vcpu_guest_context *c)
@@ -284,6 +288,7 @@ int arch_set_info_guest(struct vcpu *v, 
            build_physmap_table(d);
 
        *regs = c->regs;
+#if 0
        if (v == d->vcpu[0]) {
            /* Only for first vcpu.  */
            d->arch.sys_pgnr = c->sys_pgnr;
@@ -296,6 +301,7 @@ int arch_set_info_guest(struct vcpu *v, 
               during mmap/unmap operation.  However be conservative.  */
            domain_cache_flush (d, 1);
        }
+#endif
        new_thread(v, regs->cr_iip, 0, 0);
 
        if ( c->privregs && copy_from_user(v->arch.privregs,
@@ -499,12 +505,13 @@ void new_thread(struct vcpu *v,
                 unsigned long start_stack,
                 unsigned long start_info)
 {
+#if 0
        struct domain *d = v->domain;
+#endif
        struct pt_regs *regs;
-       extern char dom0_command_line[];
 
 #ifdef CONFIG_DOMAIN0_CONTIGUOUS
-       if (d == dom0 && v->vcpu_id == 0) start_pc += dom0_start;
+       if (v->domain == dom0 && v->vcpu_id == 0) start_pc += dom0_start;
 #endif
 
        regs = vcpu_regs (v);
@@ -524,14 +531,17 @@ void new_thread(struct vcpu *v,
 
        if (VMX_DOMAIN(v)) {
                vmx_init_all_rr(v);
+#if 0
                if (d == dom0)
                    regs->r28 = dom_fw_setup(d,dom0_command_line,
                                             COMMAND_LINE_SIZE);
+#endif
                /* Virtual processor context setup */
                VCPU(v, vpsr) = IA64_PSR_BN;
                VCPU(v, dcr) = 0;
        } else {
                init_all_rr(v);
+#if 0
                if (v->vcpu_id == 0) {
                        /* Build the firmware.  */
                        if (d == dom0) 
@@ -553,9 +563,8 @@ void new_thread(struct vcpu *v,
 
                                regs->r28 = dom_fw_setup (d, cmdline, len);
                        }
-                       d->shared_info->arch.flags = (d == dom0) ?
-                               (SIF_INITDOMAIN|SIF_PRIVILEGED) : 0;
                }
+#endif
                regs->ar_rsc |= (2 << 2); /* force PL2/3 */
                VCPU(v, banknum) = 1;
                VCPU(v, metaphysical_mode) = 1;
@@ -1421,7 +1430,7 @@ void domain_cache_flush (struct domain *
 
 // FIXME: ONLY USE FOR DOMAIN PAGE_SIZE == PAGE_SIZE
 #if 1
-unsigned long domain_mpa_to_imva(struct domain *d, unsigned long mpaddr)
+void * domain_mpa_to_imva(struct domain *d, unsigned long mpaddr)
 {
        unsigned long pte = lookup_domain_mpa(d,mpaddr);
        unsigned long imva;
@@ -1429,10 +1438,10 @@ unsigned long domain_mpa_to_imva(struct 
        pte &= _PAGE_PPN_MASK;
        imva = (unsigned long) __va(pte);
        imva |= mpaddr & ~PAGE_MASK;
-       return(imva);
+       return (void*)imva;
 }
 #else
-unsigned long domain_mpa_to_imva(struct domain *d, unsigned long mpaddr)
+void *domain_mpa_to_imva(struct domain *d, unsigned long mpaddr)
 {
     unsigned long imva = __gpa_to_mpa(d, mpaddr);
 
@@ -1615,6 +1624,8 @@ int construct_dom0(struct domain *d,
        unsigned long pkern_end;
        unsigned long pinitrd_start = 0;
        unsigned long pstart_info;
+       unsigned long bp_mpa;
+       struct ia64_boot_param *bp;
        struct page_info *start_info_page;
 
 #ifdef VALIDATE_VT
@@ -1774,6 +1785,8 @@ 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;
+       d->shared_info->arch.flags = si->flags;
 
        /* Give up the VGA console if DOM0 is configured to grab it. */
        if (cmdline != NULL)
@@ -1788,7 +1801,26 @@ int construct_dom0(struct domain *d,
 
        set_bit(_VCPUF_initialised, &v->vcpu_flags);
 
+       /* Build firmware.  */
+       bp_mpa = pstart_info + sizeof (struct start_info);
+       dom_fw_setup (d, bp_mpa);
+
+       /* 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);
+
+       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;
+
        new_thread(v, pkern_entry, 0, 0);
+
+       vcpu_regs(v)->r28 = bp_mpa;
+
        physdev_init_dom0(d);
 
        // dom0 doesn't need build_physmap_table()
diff -r 303e1b6bf727 xen/arch/ia64/xen/efi_emul.c
--- a/xen/arch/ia64/xen/efi_emul.c      Sun May 21 07:49:46 2006 -0600
+++ b/xen/arch/ia64/xen/efi_emul.c      Tue May 23 14:44:22 2006 +0200
@@ -24,7 +24,6 @@
 #include <public/sched.h>
 
 extern unsigned long translate_domain_mpaddr(unsigned long);
-extern unsigned long domain_mpa_to_imva(struct domain *,unsigned long mpaddr);
 
 // given a current domain (virtual or metaphysical) address, return the 
virtual address
 static unsigned long
diff -r 303e1b6bf727 xen/include/asm-ia64/dom_fw.h
--- a/xen/include/asm-ia64/dom_fw.h     Sun May 21 07:49:46 2006 -0600
+++ b/xen/include/asm-ia64/dom_fw.h     Tue May 23 14:44:22 2006 +0200
@@ -142,7 +142,7 @@ extern struct ia64_pal_retval xen_pal_em
 extern struct ia64_pal_retval xen_pal_emulator(UINT64, u64, u64, u64);
 extern struct sal_ret_values sal_emulator (long index, unsigned long in1, 
unsigned long in2, unsigned long in3, unsigned long in4, unsigned long in5, 
unsigned long in6, unsigned long in7);
 extern struct ia64_pal_retval pal_emulator_static (unsigned long);
-extern unsigned long dom_fw_setup (struct domain *, const char *, int);
+extern void dom_fw_setup (struct domain *, unsigned long bp_mpa);
 extern efi_status_t efi_emulator (struct pt_regs *regs, unsigned long *fault);
 
 extern void build_pal_hypercall_bundles(unsigned long *imva, unsigned long 
brkimm, unsigned long hypnum);
diff -r 303e1b6bf727 xen/include/asm-ia64/domain.h
--- a/xen/include/asm-ia64/domain.h     Sun May 21 07:49:46 2006 -0600
+++ b/xen/include/asm-ia64/domain.h     Tue May 23 14:44:22 2006 +0200
@@ -115,6 +115,9 @@ void __assign_domain_page(struct domain 
 void __assign_domain_page(struct domain *d, unsigned long mpaddr, unsigned 
long physaddr);
 void assign_domain_page(struct domain *d, unsigned long mpaddr, unsigned long 
physaddr);
 void assign_domain_io_page(struct domain *d, unsigned long mpaddr, unsigned 
long flags);
+
+extern void *domain_mpa_to_imva(struct domain *,unsigned long mpaddr);
+
 #ifdef CONFIG_XEN_IA64_DOM0_VP
 unsigned long assign_domain_mmio_page(struct domain *d, unsigned long mpaddr, 
unsigned long size);
 unsigned long assign_domain_mach_page(struct domain *d, unsigned long mpaddr, 
unsigned long size);
diff -r 303e1b6bf727 xen/include/asm-ia64/linux-xen/asm/system.h
--- a/xen/include/asm-ia64/linux-xen/asm/system.h       Sun May 21 07:49:46 
2006 -0600
+++ b/xen/include/asm-ia64/linux-xen/asm/system.h       Tue May 23 14:44:22 
2006 +0200
@@ -42,6 +42,7 @@ struct pci_vector_struct {
        __u32 irq;      /* IRQ assigned */
 };
 
+#ifndef XEN
 extern struct ia64_boot_param {
        __u64 command_line;             /* physical address of command line 
arguments */
        __u64 efi_systab;               /* physical address of EFI system table 
*/
@@ -63,6 +64,9 @@ extern struct ia64_boot_param {
        __u64 domain_size;      /* how big is the boot domain */
 
 } *ia64_boot_param;
+#else
+extern struct ia64_boot_param *ia64_boot_param;
+#endif
 
 /*
  * Macros to force memory ordering.  In these descriptions, "previous"
diff -r 303e1b6bf727 xen/include/public/arch-ia64.h
--- a/xen/include/public/arch-ia64.h    Sun May 21 07:49:46 2006 -0600
+++ b/xen/include/public/arch-ia64.h    Tue May 23 14:44:22 2006 +0200
@@ -298,17 +298,21 @@ typedef mapped_regs_t vpd_t;
 typedef mapped_regs_t vpd_t;
 
 typedef struct {
+#if 1
     unsigned int flags;
+#endif
     unsigned long start_info_pfn;
 
     /* Interrupt vector for event channel.  */
     int evtchn_vector;
 } arch_shared_info_t;
 
+#if 0
 typedef struct {
     unsigned long start;
     unsigned long size;
 } arch_initrd_info_t;
+#endif
 
 #define IA64_COMMAND_LINE_SIZE 512
 typedef struct vcpu_guest_context {
@@ -318,16 +322,40 @@ typedef struct vcpu_guest_context {
     unsigned long flags;       /* VGCF_* flags */
     unsigned long pt_base;     /* PMT table base */
     unsigned long share_io_pg; /* Shared page for I/O emulation */
+#if 0
     unsigned long sys_pgnr;    /* System pages out of domain memory */
+#endif
     unsigned long vm_assist;   /* VMASST_TYPE_* bitmap, now none on IPF */
 
     cpu_user_regs_t regs;
     mapped_regs_t *privregs;
+#if 0
     arch_shared_info_t shared;
     arch_initrd_info_t initrd;
     char cmdline[IA64_COMMAND_LINE_SIZE];
+#endif
 } vcpu_guest_context_t;
 DEFINE_XEN_GUEST_HANDLE(vcpu_guest_context_t);
+
+struct ia64_boot_param {
+       unsigned long command_line;             /* physical address of command 
line.  */
+       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;     /* virtual address where dom0 begins */
+    unsigned long domain_size;      /* how big is the boot domain */
+};
 
 // dom0 vp op
 #define __HYPERVISOR_ia64_dom0vp_op     __HYPERVISOR_arch_0
diff -r 303e1b6bf727 xen/include/public/dom0_ops.h
--- a/xen/include/public/dom0_ops.h     Sun May 21 07:49:46 2006 -0600
+++ b/xen/include/public/dom0_ops.h     Tue May 23 14:44:22 2006 +0200
@@ -473,6 +473,16 @@ typedef struct dom0_hypercall_init {
     unsigned long mfn;        /* machine frame to be initialised */
 } dom0_hypercall_init_t;
 DEFINE_XEN_GUEST_HANDLE(dom0_hypercall_init_t);
+
+#define DOM0_FIRMWARE_SETUP   49
+typedef struct dom0_firmware_setup {
+    domid_t  domain;          /* domain to be affected */
+    unsigned long bp;         /* mpaddr of boot param area */
+    unsigned long start_info_pfn; /* pfn of start_info  */
+    unsigned long sys_pgnr;   /* number of system page */
+    unsigned int hypercall_imm;        /* IIM for hypercall */
+} dom0_firmware_setup_t;
+DEFINE_XEN_GUEST_HANDLE(dom0_firmware_setup_t);
 
 typedef struct dom0_op {
     uint32_t cmd;
@@ -515,6 +525,7 @@ typedef struct dom0_op {
         struct dom0_irq_permission    irq_permission;
         struct dom0_iomem_permission  iomem_permission;
         struct dom0_hypercall_init    hypercall_init;
+        struct dom0_firmware_setup    firmware_setup;
         uint8_t                       pad[128];
     } u;
 } dom0_op_t;

_______________________________________________
Xen-ia64-devel mailing list
Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ia64-devel