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

RE: [Xen-ia64-devel][Patch]Add two PAL calls which fix SMPwindowsinstallation crashing bug



Hi Alex, Wing,

I revised my patch(return to SAL). What do you think?
This is still dirty since it uses the rest area of HOB.
Is there any other good place for SAL_RETURN_STUB_PADDR?

Thanks,
Kouya

Alex Williamson writes:
 >    Can this be combined with Tristan's approach for HVM vCPU hotplug
 > that he's implemented in his GFW?  Tristan allows hotplugged vCPUs to
 > return online, which it appears this one does not.  It might take
 > changes to both the Intel GFW and to Xen to make this work.  Thanks,
 > 
 >      Alex
 > 
 > -- 
 > Alex Williamson                             HP Open Source & Linux Org.

diff -r fc9e2f7920c9 tools/libxc/ia64/xc_ia64_hvm_build.c
--- a/tools/libxc/ia64/xc_ia64_hvm_build.c      Fri Mar 30 17:18:42 2007 -0600
+++ b/tools/libxc/ia64/xc_ia64_hvm_build.c      Wed Apr 04 21:17:34 2007 +0900
@@ -73,8 +73,6 @@ xc_get_hvm_param(int handle, domid_t dom
 }
 
 #define HOB_SIGNATURE         0x3436474953424f48        // "HOBSIG64"
-#define GFW_HOB_START         ((4UL<<30)-(14UL<<20))    // 4G - 14M
-#define GFW_HOB_SIZE          (1UL<<20)                 // 1M
 
 typedef struct {
     unsigned long signature;
@@ -280,6 +278,7 @@ load_hob(int xc_handle, uint32_t dom, vo
     // hob_buf should be page aligned
     int hob_size;
     int nr_pages;
+    unsigned long *code;
 
     hob_size = get_hob_size(hob_buf);
     if (hob_size < 0) {
@@ -287,12 +286,31 @@ load_hob(int xc_handle, uint32_t dom, vo
         return -1;
     }
 
-    if (hob_size > GFW_HOB_SIZE) {
+    if (hob_size > GFW_HOB_SIZE - 0x10) {
         PERROR("No enough memory for hob data");
         return -1;
     }
 
+    /*
+     * inject a emulation code for SAL Return state from OS_BOOT_RENDEZ
+     *
+     * 1: mov r28=0x28   // PAL_HALT
+     *    break 0x110000 // DOMN_PAL_REQUEST
+     *    br.many.sptk.few 1
+     */
+    code = hob_buf + GFW_HOB_SIZE - 0x10;
+    code[0] = 0x000024000070e011;
+    code[1] = 0x4000000000040010;
+
     nr_pages = (hob_size + PAGE_SIZE -1) >> PAGE_SHIFT;
+
+    if (nr_pages < (GFW_HOB_SIZE >> PAGE_SHIFT)) {
+        // copy the emulation code
+        if (xc_ia64_copy_to_domain_pages(xc_handle, dom, 
+                hob_buf + GFW_HOB_SIZE - PAGE_SIZE, 
+                (GFW_HOB_START + GFW_HOB_SIZE - PAGE_SIZE) >> PAGE_SHIFT, 1))
+            return -1;
+    }
 
     return xc_ia64_copy_to_domain_pages(xc_handle, dom, hob_buf,
                                         GFW_HOB_START >> PAGE_SHIFT, nr_pages);
diff -r fc9e2f7920c9 xen/arch/ia64/vmx/vlsapic.c
--- a/xen/arch/ia64/vmx/vlsapic.c       Fri Mar 30 17:18:42 2007 -0600
+++ b/xen/arch/ia64/vmx/vlsapic.c       Wed Apr 04 21:17:34 2007 +0900
@@ -708,6 +708,7 @@ static void vlsapic_write_ipi(VCPU *vcpu
         vcpu_init_regs(targ);
         targ_regs->cr_iip = d->arch.sal_data->boot_rdv_ip;
         targ_regs->r1 = d->arch.sal_data->boot_rdv_r1;
+        targ_regs->b0 = SAL_RETURN_STUB_PADDR;
 
         if (test_and_clear_bit(_VPF_down,&targ->pause_flags)) {
             vcpu_wake(targ);
diff -r fc9e2f7920c9 xen/arch/ia64/xen/fw_emul.c
--- a/xen/arch/ia64/xen/fw_emul.c       Fri Mar 30 17:18:42 2007 -0600
+++ b/xen/arch/ia64/xen/fw_emul.c       Wed Apr 04 21:17:34 2007 +0900
@@ -725,6 +725,8 @@ xen_pal_emulator(unsigned long index, u6
                        console_start_sync();
                        (*efi.reset_system)(EFI_RESET_SHUTDOWN,0,0,NULL);
                } else {
+                       printk (XENLOG_DEBUG "dom%d/vcpu%d: going offline\n",
+                               current->domain->domain_id, current->vcpu_id);
                        set_bit(_VPF_down, &current->pause_flags);
                        vcpu_sleep_nosync(current);
                        status = PAL_STATUS_SUCCESS;
diff -r fc9e2f7920c9 xen/arch/ia64/xen/vcpu.c
--- a/xen/arch/ia64/xen/vcpu.c  Fri Mar 30 17:18:42 2007 -0600
+++ b/xen/arch/ia64/xen/vcpu.c  Wed Apr 04 21:17:34 2007 +0900
@@ -174,6 +174,9 @@ void vcpu_init_regs(struct vcpu *v)
                    INT_ENABLE_OFFSET(v);
                VCPU(v, itv) = (1 << 16);       /* timer vector masked */
        }
+
+       /* to prevent a Reserved Field fault */
+       VCPU(v, pta) = 0x3c;
 
        v->arch.domain_itm_last = -1L;
 }
diff -r fc9e2f7920c9 xen/include/public/arch-ia64.h
--- a/xen/include/public/arch-ia64.h    Fri Mar 30 17:18:42 2007 -0600
+++ b/xen/include/public/arch-ia64.h    Wed Apr 04 21:17:34 2007 +0900
@@ -107,6 +107,11 @@ typedef unsigned long xen_ulong_t;
 
 #define GFW_START        (4*MEM_G -16*MEM_M)
 #define GFW_SIZE         (16*MEM_M)
+
+#define GFW_HOB_START    (4*MEM_G-14*MEM_M)
+#define GFW_HOB_SIZE     (1*MEM_M)
+
+#define SAL_RETURN_STUB_PADDR (GFW_HOB_START+GFW_HOB_SIZE-0x10)
 
 struct pt_fpreg {
     union {
_______________________________________________
Xen-ia64-devel mailing list
Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ia64-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.