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] Merged.

# HG changeset patch
# User emellor@xxxxxxxxxxxxxxxxxxxxxx
# Node ID 4146dbea47e1b093699fe45690832488742ec02d
# Parent  b20641d242723923de40030a63771770b04702d3
# Parent  8754277cec01d26b7174a3ef8644ef557f42ed26
Merged.

diff -r b20641d24272 -r 4146dbea47e1 
linux-2.6-xen-sparse/arch/ia64/xen-mkbuildtree-pre
--- a/linux-2.6-xen-sparse/arch/ia64/xen-mkbuildtree-pre        Sat Dec  3 
12:21:27 2005
+++ b/linux-2.6-xen-sparse/arch/ia64/xen-mkbuildtree-pre        Sat Dec  3 
12:21:52 2005
@@ -40,13 +40,6 @@
 cp arch/ia64/xen/drivers/xenia64_init.c drivers/xen/core
 cp arch/ia64/xen/drivers/evtchn_ia64.c drivers/xen/core
 
-#this is a one-line change to avoid a nasty kernel crash resulting
-#from a use of the FADT entry in the ACPI tree.  The fake ACPI
-#tree that Xen sets up for guests has a NULL FADT.  This is a bug
-#that needs to be fixed, at which point this can go away.  In the
-#meantime, this file needs to be updated if the real motherboard.c is
-cp arch/ia64/xen/drivers/motherboard.c drivers/acpi/motherboard.c
-
 #still a few x86-ism's in various drivers/xen files, patch them
 #cd drivers/xen
 #if [ ! -e ia64.patch.semaphore ]
diff -r b20641d24272 -r 4146dbea47e1 
linux-2.6-xen-sparse/arch/ia64/xen/drivers/coreMakefile
--- a/linux-2.6-xen-sparse/arch/ia64/xen/drivers/coreMakefile   Sat Dec  3 
12:21:27 2005
+++ b/linux-2.6-xen-sparse/arch/ia64/xen/drivers/coreMakefile   Sat Dec  3 
12:21:52 2005
@@ -10,7 +10,7 @@
        @ln -fsn $(srctree)/arch/$(XENARCH)/kernel/vmlinux.lds.S $@
 
 
-obj-y   := gnttab.o devmem.o
+obj-y   := gnttab.o
 obj-$(CONFIG_PROC_FS) += xen_proc.o
 
 ifeq ($(ARCH),ia64)
diff -r b20641d24272 -r 4146dbea47e1 
linux-2.6-xen-sparse/arch/xen/i386/kernel/time.c
--- a/linux-2.6-xen-sparse/arch/xen/i386/kernel/time.c  Sat Dec  3 12:21:27 2005
+++ b/linux-2.6-xen-sparse/arch/xen/i386/kernel/time.c  Sat Dec  3 12:21:52 2005
@@ -560,7 +560,8 @@
        }
        while (!time_values_up_to_date(cpu));
 
-       if (unlikely(delta < -1000000LL) || unlikely(delta_cpu < 0)) {
+       if ((unlikely(delta < -1000000LL) || unlikely(delta_cpu < 0))
+           && printk_ratelimit()) {
                printk("Timer ISR/%d: Time went backwards: "
                       "delta=%lld cpu_delta=%lld shadow=%lld "
                       "off=%lld processed=%lld cpu_processed=%lld\n",
diff -r b20641d24272 -r 4146dbea47e1 
linux-2.6-xen-sparse/drivers/xen/blkback/blkback.c
--- a/linux-2.6-xen-sparse/drivers/xen/blkback/blkback.c        Sat Dec  3 
12:21:27 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/blkback/blkback.c        Sat Dec  3 
12:21:52 2005
@@ -296,22 +296,23 @@
 {
        blkif_back_ring_t *blk_ring = &blkif->blk_ring;
        blkif_request_t *req;
-       RING_IDX i, rp;
+       RING_IDX rc, rp;
        int more_to_do = 0;
 
+       rc = blk_ring->req_cons;
        rp = blk_ring->sring->req_prod;
        rmb(); /* Ensure we see queued requests up to 'rp'. */
 
-       for (i = blk_ring->req_cons; 
-            (i != rp) && !RING_REQUEST_CONS_OVERFLOW(blk_ring, i);
-            i++) {
+       while ((rc != rp) && !RING_REQUEST_CONS_OVERFLOW(blk_ring, rc)) {
                if ((max_to_do-- == 0) ||
                    (NR_PENDING_REQS == MAX_PENDING_REQS)) {
                        more_to_do = 1;
                        break;
                }
-        
-               req = RING_GET_REQUEST(blk_ring, i);
+
+               req = RING_GET_REQUEST(blk_ring, rc);
+               blk_ring->req_cons = ++rc; /* before make_response() */
+
                switch (req->operation) {
                case BLKIF_OP_READ:
                case BLKIF_OP_WRITE:
@@ -327,7 +328,6 @@
                }
        }
 
-       blk_ring->req_cons = i;
        return more_to_do;
 }
 
diff -r b20641d24272 -r 4146dbea47e1 xen/arch/ia64/Makefile
--- a/xen/arch/ia64/Makefile    Sat Dec  3 12:21:27 2005
+++ b/xen/arch/ia64/Makefile    Sat Dec  3 12:21:52 2005
@@ -69,6 +69,8 @@
        [ -e $(BASEDIR)/include/asm-ia64/xen ] \
         || ln -s $(BASEDIR)/include/asm-ia64/linux 
$(BASEDIR)/include/asm-ia64/xen
 # Link to DM file in Xen for ia64/vti
+       [ -e $(BASEDIR)/include/asm-ia64/vmx_vpic.h ] \
+        || ln -s ../../include/asm-x86/vmx_vpic.h 
$(BASEDIR)/include/asm-ia64/vmx_vpic.h
        [ -e $(BASEDIR)/include/asm-ia64/vmx_vioapic.h ] \
         || ln -s ../../include/asm-x86/vmx_vioapic.h 
$(BASEDIR)/include/asm-ia64/vmx_vioapic.h
        [ -e $(BASEDIR)/arch/ia64/vmx/vmx_vioapic.c ] \
diff -r b20641d24272 -r 4146dbea47e1 xen/arch/ia64/linux-xen/smp.c
--- a/xen/arch/ia64/linux-xen/smp.c     Sat Dec  3 12:21:27 2005
+++ b/xen/arch/ia64/linux-xen/smp.c     Sat Dec  3 12:21:52 2005
@@ -56,7 +56,10 @@
 //Huh? This seems to be used on ia64 even if !CONFIG_SMP
 void flush_tlb_mask(cpumask_t mask)
 {
+#ifdef CONFIG_SMP
+    printf("flush_tlb_mask called, not implemented for SMP\n");
        dummy();
+#endif
 }
 //#if CONFIG_SMP || IA64
 #if CONFIG_SMP
diff -r b20641d24272 -r 4146dbea47e1 xen/arch/ia64/linux-xen/unaligned.c
--- a/xen/arch/ia64/linux-xen/unaligned.c       Sat Dec  3 12:21:27 2005
+++ b/xen/arch/ia64/linux-xen/unaligned.c       Sat Dec  3 12:21:52 2005
@@ -378,7 +378,7 @@
     if (ridx >= sof) {
         /* read of out-of-frame register returns an undefined value; 0 in our 
case.  */
         DPRINT("ignoring read from r%lu; only %lu registers are allocated!\n", 
r1, sof);
-        panic("wrong stack register number");
+        panic("wrong stack register number (iip=%p)\n", regs->cr_iip);
     }
 
     if (ridx < sor)
diff -r b20641d24272 -r 4146dbea47e1 xen/arch/ia64/tools/xelilo/elilo.README
--- a/xen/arch/ia64/tools/xelilo/elilo.README   Sat Dec  3 12:21:27 2005
+++ b/xen/arch/ia64/tools/xelilo/elilo.README   Sat Dec  3 12:21:52 2005
@@ -1,35 +1,20 @@
-Elilo update for Xen/ia64 HowTo   9/20/2005
+Elilo update for Xen/ia64 HowTo   2005/12/01
+
+   Xen support is committed to ELILO CVS as of Dec 1, 2005.  This support
+   should be in version 3.5pre2 when it is made available.  To build from
+   source:
 
 1. Build the new elilo
-       a. Get the elilo RPM
-       
http://fedora.mirrors.pair.com/linux/core/development/SRPMS/elilo-3.4-11.src.rpm
-
-       b. Get the elilo-3.4.11.xen.patch
-
-       c. Create elilo development tree
-               > mkdir elilo
-               > cd elilo
-               > rpm2cpio ../elilo-3.4-11.src.rpm | cpio -div
-               > tar xvfz elilo-3.4.tar.gz
-               > cd elilo-3.4
-               > // read elilo.spc for deatiled patch steps
-               > patch -p1 < ../elilo-3.3a-makefile.patch
-               > patch -p1 < ../elilo-3.4-debug.patch
-               > patch -p2 < ../elilo-initrd-size-fix.patch
-               > patch -p1 < ../elilo-argv-fix.patch
-               > patch -p1 < ../elilo-kill-warnings.patch
-               > patch -p1 < ../../elilo-3.4.11.xen.patch
-               > make          <=== get the elilo.efi
+       a. Get current elilo CVS from http://sourceforge.net/projects/elilo
+       b. make (Note that gnu-efi is a build dependency)
 
 2. How to run with the new elilo.efi?
        a. Example to run
                modify elilo.conf with following entry
 
-               image=XenoLinux.uncompressed
+               image=XenoLinux.gz
                        label=xen
                        vmm=xen.gz
                        initrd=initrd-2.6.9-5.7.EL.img
                        read-only
-                       append="com2=57600,8n1 console=com2 sched=bvt -- nomca 
console=ttyS1,576 00 console=tty0 root=/dev/sda3"
-
-
+                       append="com2=57600,8n1 console=com2 sched=bvt -- nomca 
console=ttyS1,57600 console=tty0 root=/dev/sda3"
diff -r b20641d24272 -r 4146dbea47e1 xen/arch/ia64/tools/xelilo/xlilo.efi
Binary file xen/arch/ia64/tools/xelilo/xlilo.efi has changed
diff -r b20641d24272 -r 4146dbea47e1 xen/arch/ia64/vmx/vlsapic.c
--- a/xen/arch/ia64/vmx/vlsapic.c       Sat Dec  3 12:21:27 2005
+++ b/xen/arch/ia64/vmx/vlsapic.c       Sat Dec  3 12:21:52 2005
@@ -529,7 +529,7 @@
     int injected=0;
     uint64_t    isr;
     IA64_PSR    vpsr;
-
+    REGS *regs=vcpu_regs(vcpu);
     local_irq_save(spsr);
     h_pending = highest_pending_irq(vcpu);
     if ( h_pending == NULL_VECTOR ) goto chk_irq_exit;
@@ -541,7 +541,7 @@
         isr = vpsr.val & IA64_PSR_RI;
         if ( !vpsr.ic )
             panic("Interrupt when IC=0\n");
-        vmx_reflect_interruption(0,isr,0, 12 ); // EXT IRQ
+        vmx_reflect_interruption(0,isr,0, 12, regs ); // EXT IRQ
         injected = 1;
     }
     else if ( mask == IRQ_MASKED_BY_INSVC ) {
@@ -601,13 +601,13 @@
 {
     IA64_PSR    vpsr;
     uint64_t    isr;
-    
+    REGS *regs=vcpu_regs(vcpu);
     vpsr.val = vmx_vcpu_get_psr(vcpu);
     update_vhpi(vcpu, NULL_VECTOR);
     isr = vpsr.val & IA64_PSR_RI;
     if ( !vpsr.ic )
         panic("Interrupt when IC=0\n");
-    vmx_reflect_interruption(0,isr,0, 12 ); // EXT IRQ
+    vmx_reflect_interruption(0,isr,0, 12, regs); // EXT IRQ
 }
 
 vhpi_detection(VCPU *vcpu)
diff -r b20641d24272 -r 4146dbea47e1 xen/arch/ia64/vmx/vmmu.c
--- a/xen/arch/ia64/vmx/vmmu.c  Sat Dec  3 12:21:27 2005
+++ b/xen/arch/ia64/vmx/vmmu.c  Sat Dec  3 12:21:52 2005
@@ -162,7 +162,7 @@
     vhpt->ht = THASH_VHPT;
     vhpt->vcpu = d;
     vhpt->hash_func = machine_thash;
-    vs -= sizeof (vhpt_special);
+    vcur -= sizeof (vhpt_special);
     vs = vcur;
 
     /* Setup guest pta */
@@ -438,20 +438,23 @@
     thash_data_t    *tlb;
     ia64_rr vrr;
     u64     mfn;
-    
+
     if ( !(VCPU(vcpu, vpsr) & IA64_PSR_IT) ) {   // I-side physical mode
         gpip = gip;
     }
     else {
         vmx_vcpu_get_rr(vcpu, gip, &vrr.rrval);
-        tlb = vtlb_lookup_ex (vmx_vcpu_get_vtlb(vcpu), 
+        tlb = vtlb_lookup_ex (vmx_vcpu_get_vtlb(vcpu),
                 vrr.rid, gip, ISIDE_TLB );
-        if ( tlb == NULL ) panic("No entry found in ITLB\n");
+        if( tlb == NULL )
+             tlb = vtlb_lookup_ex (vmx_vcpu_get_vtlb(vcpu),
+                vrr.rid, gip, DSIDE_TLB );
+        if ( tlb == NULL ) panic("No entry found in ITLB and DTLB\n");
         gpip = (tlb->ppn << 12) | ( gip & (PSIZE(tlb->ps)-1) );
     }
     mfn = __gpfn_to_mfn(vcpu->domain, gpip >>PAGE_SHIFT);
     if ( mfn == INVALID_MFN ) return 0;
-    
+ 
     mpa = (gpip & (PAGE_SIZE-1)) | (mfn<<PAGE_SHIFT);
     *code = *(u64*)__va(mpa);
     return 1;
diff -r b20641d24272 -r 4146dbea47e1 xen/arch/ia64/vmx/vmx_process.c
--- a/xen/arch/ia64/vmx/vmx_process.c   Sat Dec  3 12:21:27 2005
+++ b/xen/arch/ia64/vmx/vmx_process.c   Sat Dec  3 12:21:52 2005
@@ -47,13 +47,12 @@
 #include <asm/kregs.h>
 #include <asm/vmx.h>
 #include <asm/vmx_mm_def.h>
+#include <asm/vmx_phy_mode.h>
 #include <xen/mm.h>
 /* reset all PSR field to 0, except up,mfl,mfh,pk,dt,rt,mc,it */
 #define INITIAL_PSR_VALUE_AT_INTERRUPTION 0x0000001808028034
 
 
-extern struct ia64_sal_retval pal_emulator_static(UINT64);
-extern struct ia64_sal_retval 
sal_emulator(UINT64,UINT64,UINT64,UINT64,UINT64,UINT64,UINT64,UINT64);
 extern void rnat_consumption (VCPU *vcpu);
 #define DOMN_PAL_REQUEST    0x110000
 
@@ -109,14 +108,15 @@
        }
 #endif
        if (iim == d->arch.breakimm) {
-               struct ia64_sal_retval x;
+               struct ia64_pal_retval y;
+               struct sal_ret_values x;
                switch (regs->r2) {
                    case FW_HYPERCALL_PAL_CALL:
                        //printf("*** PAL hypercall: index=%d\n",regs->r28);
                        //FIXME: This should call a C routine
-                       x = pal_emulator_static(VCPU(v, vgr[12]));
-                       regs->r8 = x.status; regs->r9 = x.v0;
-                       regs->r10 = x.v1; regs->r11 = x.v2;
+                       y = pal_emulator_static(VCPU(v, vgr[12]));
+                       regs->r8 = y.status; regs->r9 = y.v0;
+                       regs->r10 = y.v1; regs->r11 = y.v2;
 #if 0
                        if (regs->r8)
                                printk("Failed vpal emulation, with 
index:0x%lx\n",
@@ -130,8 +130,8 @@
                                         sal_param[2], sal_param[3],
                                         sal_param[4], sal_param[5],
                                         sal_param[6], sal_param[7]);
-                       regs->r8 = x.status; regs->r9 = x.v0;
-                       regs->r10 = x.v1; regs->r11 = x.v2;
+                       regs->r8 = x.r8; regs->r9 = x.r9;
+                       regs->r10 = x.r10; regs->r11 = x.r11;
 #if 0
                        if (regs->r8)
                                printk("Failed vsal emulation, with 
index:0x%lx\n",
@@ -267,6 +267,12 @@
 
 extern ia64_rr vmx_vcpu_rr(VCPU *vcpu,UINT64 vadr);
 
+static int vmx_handle_lds(REGS* regs)
+{
+    regs->cr_ipsr |=IA64_PSR_ED;
+    return IA64_FAULT;
+}
+
 /* We came here because the H/W VHPT walker failed to find an entry */
 void vmx_hpw_miss(u64 vadr , u64 vec, REGS* regs)
 {
@@ -294,18 +300,19 @@
         return;
     }
 */
-
-    if((vec==1)&&(!vpsr.it)){
-        physical_itlb_miss(v, vadr);
-        return;
-    }
-    if((vec==2)&&(!vpsr.dt)){
-        if(v->domain!=dom0&&__gpfn_is_io(v->domain,(vadr<<1)>>(PAGE_SHIFT+1))){
-            emulate_io_inst(v,((vadr<<1)>>1),4);   //  UC
-        }else{
-            physical_dtlb_miss(v, vadr);
+    if(is_physical_mode(v)&&(!(vadr<<1>>62))){
+        if(vec==1){
+            physical_itlb_miss(v, vadr);
+            return;
         }
-        return;
+        if(vec==2){
+            
if(v->domain!=dom0&&__gpfn_is_io(v->domain,(vadr<<1)>>(PAGE_SHIFT+1))){
+                emulate_io_inst(v,((vadr<<1)>>1),4);   //  UC
+            }else{
+                physical_dtlb_miss(v, vadr);
+            }
+            return;
+        }
     }
     vrr = vmx_vcpu_rr(v, vadr);
     if(vec == 1) type = ISIDE_TLB;
@@ -336,7 +343,8 @@
             } else{
                 if(misr.sp){
                     //TODO  lds emulation
-                    panic("Don't support speculation load");
+                    //panic("Don't support speculation load");
+                    return vmx_handle_lds(regs);
                 }else{
                     nested_dtlb(v);
                     return IA64_FAULT;
@@ -353,8 +361,9 @@
                     return IA64_FAULT;
                 }else{
                     if(misr.sp){
-                        //TODO  lds emulation
-                        panic("Don't support speculation load");
+                    //TODO  lds emulation
+                    //panic("Don't support speculation load");
+                    return vmx_handle_lds(regs);
                     }else{
                         nested_dtlb(v);
                         return IA64_FAULT;
@@ -367,8 +376,9 @@
                     return IA64_FAULT;
                 }else{
                     if(misr.sp){
-                        //TODO  lds emulation
-                        panic("Don't support speculation load");
+                    //TODO  lds emulation
+                    //panic("Don't support speculation load");
+                    return vmx_handle_lds(regs);
                     }else{
                         nested_dtlb(v);
                         return IA64_FAULT;
diff -r b20641d24272 -r 4146dbea47e1 xen/arch/ia64/vmx/vmx_virt.c
--- a/xen/arch/ia64/vmx/vmx_virt.c      Sat Dec  3 12:21:27 2005
+++ b/xen/arch/ia64/vmx/vmx_virt.c      Sat Dec  3 12:21:52 2005
@@ -835,6 +835,7 @@
 
 IA64FAULT vmx_emul_mov_to_dbr(VCPU *vcpu, INST64 inst)
 {
+    return IA64_NO_FAULT;
     u64 r3,r2;
 #ifdef  CHECK_FAULT
     IA64_PSR vpsr;
@@ -858,6 +859,7 @@
 
 IA64FAULT vmx_emul_mov_to_ibr(VCPU *vcpu, INST64 inst)
 {
+    return IA64_NO_FAULT;
     u64 r3,r2;
 #ifdef  CHECK_FAULT
     IA64_PSR vpsr;
@@ -1272,8 +1274,7 @@
         case 74:return vmx_cr_get(cmcv);
         case 80:return vmx_cr_get(lrr0);
         case 81:return vmx_cr_get(lrr1);
-        default:
-            panic("Read reserved cr register");
+        default: return IA64_NO_FAULT;
     }
 }
 
diff -r b20641d24272 -r 4146dbea47e1 xen/arch/ia64/vmx/vtlb.c
--- a/xen/arch/ia64/vmx/vtlb.c  Sat Dec  3 12:21:27 2005
+++ b/xen/arch/ia64/vmx/vtlb.c  Sat Dec  3 12:21:52 2005
@@ -391,6 +391,7 @@
 #if 1
     vrr=vmx_vcpu_rr(current, va);
     if (vrr.ps != entry->ps) {
+        machine_tlb_insert(hcb->vcpu, entry);
        printk("not preferred ps with va: 0x%lx\n", va);
        return;
     }
diff -r b20641d24272 -r 4146dbea47e1 xen/arch/ia64/xen/dom0_ops.c
--- a/xen/arch/ia64/xen/dom0_ops.c      Sat Dec  3 12:21:27 2005
+++ b/xen/arch/ia64/xen/dom0_ops.c      Sat Dec  3 12:21:52 2005
@@ -194,7 +194,29 @@
         }
     }
     break;
+
+    case DOM0_PHYSINFO:
+    {
+        dom0_physinfo_t *pi = &op->u.physinfo;
+
+        pi->threads_per_core = smp_num_siblings;
+        pi->cores_per_socket = 1; // FIXME
+        pi->sockets_per_node = 
+            num_online_cpus() / (pi->threads_per_core * pi->cores_per_socket);
+        pi->nr_nodes         = 1;
+        pi->total_pages      = 99;  // FIXME
+        pi->free_pages       = avail_domheap_pages();
+        pi->cpu_khz          = 100;  // FIXME cpu_khz;
+        memset(pi->hw_cap, 0, sizeof(pi->hw_cap));
+        //memcpy(pi->hw_cap, boot_cpu_data.x86_capability, NCAPINTS*4);
+        ret = 0;
+        if ( copy_to_user(u_dom0_op, op, sizeof(*op)) )
+           ret = -EFAULT;
+    }
+    break;
+
     default:
+printf("arch_do_dom0_op: unrecognized dom0 op: %d!!!\n",op->cmd);
         ret = -ENOSYS;
 
     }
diff -r b20641d24272 -r 4146dbea47e1 xen/arch/ia64/xen/dom_fw.c
--- a/xen/arch/ia64/xen/dom_fw.c        Sat Dec  3 12:21:27 2005
+++ b/xen/arch/ia64/xen/dom_fw.c        Sat Dec  3 12:21:52 2005
@@ -13,11 +13,12 @@
 #include <asm/io.h>
 #include <asm/pal.h>
 #include <asm/sal.h>
+#include <xen/compile.h>
 #include <xen/acpi.h>
 
 #include <asm/dom_fw.h>
 
-struct ia64_boot_param *dom_fw_init(struct domain *, char *,int,char *,int);
+static struct ia64_boot_param *dom_fw_init(struct domain *, char *,int,char 
*,int);
 extern unsigned long domain_mpa_to_imva(struct domain *,unsigned long mpaddr);
 extern struct domain *dom0;
 extern unsigned long dom0_start;
@@ -55,13 +56,22 @@
 
 
 // builds a hypercall bundle at domain physical address
-void dom_fw_hypercall_patch(struct domain *d, unsigned long paddr, unsigned 
long hypercall,unsigned long ret)
+static void dom_fw_hypercall_patch(struct domain *d, unsigned long paddr, 
unsigned long hypercall,unsigned long ret)
 {
        unsigned long imva;
 
-       if (d == dom0) paddr += dom0_start;
        imva = domain_mpa_to_imva(d,paddr);
        build_hypercall_bundle(imva,d->arch.breakimm,hypercall,ret);
+}
+
+static void dom_fw_pal_hypercall_patch(struct domain *d, unsigned long paddr)
+{
+       unsigned long *imva;
+
+       imva = (unsigned long *)domain_mpa_to_imva(d,paddr);
+
+       build_pal_hypercall_bundles (imva, d->arch.breakimm,
+                                     FW_HYPERCALL_PAL_CALL);
 }
 
 
@@ -153,8 +163,6 @@
        tp->day = days + 1;
        return 1;
 }
-
-extern struct ia64_pal_retval pal_emulator_static (unsigned long);
 
 /* Macro to emulate SAL call using legacy IN and OUT calls to CF8, CFC etc.. */
 
@@ -292,11 +300,6 @@
        long status = -1;
 
        if (running_on_sim) return pal_emulator_static(index);
-       if (index >= PAL_COPY_PAL) {
-               // build_hypercall_bundle needs to be modified to generate
-               // a second bundle that conditionally does a br.ret
-               panic("xen_pal_emulator: stacked calls not supported!!\n");
-       }
        printk("xen_pal_emulator: index=%d\n",index);
        // pal code must be mapped by a TR when pal is called, however
        // calls are rare enough that we will map it lazily rather than
@@ -389,9 +392,26 @@
            case PAL_VM_TR_READ:        /* FIXME: vcpu_get_tr?? */
                printk("PAL_VM_TR_READ NOT IMPLEMENTED, IGNORED!\n");
                break;
-           case PAL_HALT_INFO:         /* inappropriate info for guest? */
-               printk("PAL_HALT_INFO NOT IMPLEMENTED, IGNORED!\n");
-               break;
+           case PAL_HALT_INFO:
+               {
+                   /* 1000 cycles to enter/leave low power state,
+                      consumes 10 mW, implemented and cache/TLB coherent.  */
+                   unsigned long res = 1000UL | (1000UL << 16) | (10UL << 32)
+                           | (1UL << 61) | (1UL << 60);
+                   if (copy_to_user ((void *)in1, &res, sizeof (res)))
+                           status = PAL_STATUS_EINVAL;    
+                   else
+                           status = PAL_STATUS_SUCCESS;
+               }
+               break;
+           case PAL_HALT:
+                   if (current->domain == dom0) {
+                           printf ("Domain0 halts the machine\n");
+                           (*efi.reset_system)(EFI_RESET_SHUTDOWN,0,0,NULL);
+                   }
+                   else
+                           domain_shutdown (current->domain, 0);
+                   break;
            default:
                printk("xen_pal_emulator: UNIMPLEMENTED PAL CALL %d!!!!\n",
                                index);
@@ -399,6 +419,7 @@
        }
        return ((struct ia64_pal_retval) {status, r9, r10, r11});
 }
+
 
 #define NFUNCPTRS 20
 
@@ -437,29 +458,29 @@
        return 0;
 }
 
+static u8
+generate_acpi_checksum(void *tbl, unsigned long len)
+{
+       u8 *ptr, sum = 0;
+
+       for (ptr = tbl; len > 0 ; len--, ptr++)
+               sum += *ptr;
+
+       return 0 - sum;
+}
+
 static int
 acpi_update_madt_checksum (unsigned long phys_addr, unsigned long size)
 {
-       u8 checksum=0;
-       u8* ptr;
-       int len;
        struct acpi_table_madt* acpi_madt;
 
        if (!phys_addr || !size)
                return -EINVAL;
 
        acpi_madt = (struct acpi_table_madt *) __va(phys_addr);
-       acpi_madt->header.checksum=0;
-
-       /* re-calculate MADT checksum */
-       ptr = (u8*)acpi_madt;
-       len = acpi_madt->header.length;
-       while (len>0){
-               checksum = (u8)( checksum + (*ptr++) );
-               len--;
-       }
-       acpi_madt->header.checksum = 0x0 - checksum;    
-       
+       acpi_madt->header.checksum = 0;
+       acpi_madt->header.checksum = generate_acpi_checksum(acpi_madt, size);
+
        return 0;
 }
 
@@ -473,8 +494,140 @@
        return;
 }
 
-
-struct ia64_boot_param *
+struct fake_acpi_tables {
+       struct acpi20_table_rsdp rsdp;
+       struct xsdt_descriptor_rev2 xsdt;
+       u64 madt_ptr;
+       struct fadt_descriptor_rev2 fadt;
+       struct facs_descriptor_rev2 facs;
+       struct acpi_table_header dsdt;
+       u8 aml[16];
+       struct acpi_table_madt madt;
+       struct acpi_table_lsapic lsapic;
+       u8 pm1a_evt_blk[4];
+       u8 pm1a_cnt_blk[1];
+       u8 pm_tmr_blk[4];
+};
+
+/* Create enough of an ACPI structure to make the guest OS ACPI happy. */
+void
+dom_fw_fake_acpi(struct fake_acpi_tables *tables)
+{
+       struct acpi20_table_rsdp *rsdp = &tables->rsdp;
+       struct xsdt_descriptor_rev2 *xsdt = &tables->xsdt;
+       struct fadt_descriptor_rev2 *fadt = &tables->fadt;
+       struct facs_descriptor_rev2 *facs = &tables->facs;
+       struct acpi_table_header *dsdt = &tables->dsdt;
+       struct acpi_table_madt *madt = &tables->madt;
+       struct acpi_table_lsapic *lsapic = &tables->lsapic;
+
+       memset(tables, 0, sizeof(struct fake_acpi_tables));
+
+       /* setup XSDT (64bit version of RSDT) */
+       strncpy(xsdt->signature, XSDT_SIG, 4);
+       /* XSDT points to both the FADT and the MADT, so add one entry */
+       xsdt->length = sizeof(struct xsdt_descriptor_rev2) + sizeof(u64);
+       xsdt->revision = 1;
+       strcpy(xsdt->oem_id, "XEN");
+       strcpy(xsdt->oem_table_id, "Xen/ia64");
+       strcpy(xsdt->asl_compiler_id, "XEN");
+       xsdt->asl_compiler_revision = (XEN_VERSION<<16)|(XEN_SUBVERSION);
+
+       xsdt->table_offset_entry[0] = dom_pa(fadt);
+       tables->madt_ptr = dom_pa(madt);
+
+       xsdt->checksum = generate_acpi_checksum(xsdt, xsdt->length);
+
+       /* setup FADT */
+       strncpy(fadt->signature, FADT_SIG, 4);
+       fadt->length = sizeof(struct fadt_descriptor_rev2);
+       fadt->revision = FADT2_REVISION_ID;
+       strcpy(fadt->oem_id, "XEN");
+       strcpy(fadt->oem_table_id, "Xen/ia64");
+       strcpy(fadt->asl_compiler_id, "XEN");
+       fadt->asl_compiler_revision = (XEN_VERSION<<16)|(XEN_SUBVERSION);
+
+       strncpy(facs->signature, FACS_SIG, 4);
+       facs->version = 1;
+       facs->length = sizeof(struct facs_descriptor_rev2);
+
+       fadt->xfirmware_ctrl = dom_pa(facs);
+       fadt->Xdsdt = dom_pa(dsdt);
+
+       /*
+        * All of the below FADT entries are filled it to prevent warnings
+        * from sanity checks in the ACPI CA.  Emulate required ACPI hardware
+        * registers in system memory.
+        */
+       fadt->pm1_evt_len = 4;
+       fadt->xpm1a_evt_blk.address_space_id = ACPI_ADR_SPACE_SYSTEM_MEMORY;
+       fadt->xpm1a_evt_blk.register_bit_width = 8;
+       fadt->xpm1a_evt_blk.address = dom_pa(&tables->pm1a_evt_blk);
+       fadt->pm1_cnt_len = 1;
+       fadt->xpm1a_cnt_blk.address_space_id = ACPI_ADR_SPACE_SYSTEM_MEMORY;
+       fadt->xpm1a_cnt_blk.register_bit_width = 8;
+       fadt->xpm1a_cnt_blk.address = dom_pa(&tables->pm1a_cnt_blk);
+       fadt->pm_tm_len = 4;
+       fadt->xpm_tmr_blk.address_space_id = ACPI_ADR_SPACE_SYSTEM_MEMORY;
+       fadt->xpm_tmr_blk.register_bit_width = 8;
+       fadt->xpm_tmr_blk.address = dom_pa(&tables->pm_tmr_blk);
+
+       fadt->checksum = generate_acpi_checksum(fadt, fadt->length);
+
+       /* setup RSDP */
+       strncpy(rsdp->signature, RSDP_SIG, 8);
+       strcpy(rsdp->oem_id, "XEN");
+       rsdp->revision = 2; /* ACPI 2.0 includes XSDT */
+       rsdp->length = sizeof(struct acpi20_table_rsdp);
+       rsdp->xsdt_address = dom_pa(xsdt);
+
+       rsdp->checksum = generate_acpi_checksum(rsdp,
+                                               ACPI_RSDP_CHECKSUM_LENGTH);
+       rsdp->ext_checksum = generate_acpi_checksum(rsdp, rsdp->length);
+
+       /* setup DSDT with trivial namespace. */ 
+       strncpy(dsdt->signature, DSDT_SIG, 4);
+       dsdt->revision = 1;
+       dsdt->length = sizeof(struct acpi_table_header) + sizeof(tables->aml);
+       strcpy(dsdt->oem_id, "XEN");
+       strcpy(dsdt->oem_table_id, "Xen/ia64");
+       strcpy(dsdt->asl_compiler_id, "XEN");
+       dsdt->asl_compiler_revision = (XEN_VERSION<<16)|(XEN_SUBVERSION);
+
+       /* Trivial namespace, avoids ACPI CA complaints */
+       tables->aml[0] = 0x10; /* Scope */
+       tables->aml[1] = 0x12; /* length/offset to next object */
+       strncpy(&tables->aml[2], "_SB_", 4);
+
+       /* The processor object isn't absolutely necessary, revist for SMP */
+       tables->aml[6] = 0x5b; /* processor object */
+       tables->aml[7] = 0x83;
+       tables->aml[8] = 0x0b; /* next */
+       strncpy(&tables->aml[9], "CPU0", 4);
+
+       dsdt->checksum = generate_acpi_checksum(dsdt, dsdt->length);
+
+       /* setup MADT */
+       strncpy(madt->header.signature, APIC_SIG, 4);
+       madt->header.revision = 2;
+       madt->header.length = sizeof(struct acpi_table_madt) +
+                             sizeof(struct acpi_table_lsapic);
+       strcpy(madt->header.oem_id, "XEN");
+       strcpy(madt->header.oem_table_id, "Xen/ia64");
+       strcpy(madt->header.asl_compiler_id, "XEN");
+       madt->header.asl_compiler_revision = (XEN_VERSION<<16)|(XEN_SUBVERSION);
+
+       /* A single LSAPIC entry describes the CPU.  Revisit for SMP guests */
+       lsapic->header.type = ACPI_MADT_LSAPIC;
+       lsapic->header.length = sizeof(struct acpi_table_lsapic);
+       lsapic->flags.enabled = 1;
+
+       madt->header.checksum = generate_acpi_checksum(madt,
+                                                      madt->header.length);
+       return;
+}
+
+static struct ia64_boot_param *
 dom_fw_init (struct domain *d, char *args, int arglen, char *fw_mem, int 
fw_mem_size)
 {
        efi_system_table_t *efi_systab;
@@ -482,7 +635,6 @@
        efi_config_table_t *efi_tables;
        struct ia64_sal_systab *sal_systab;
        efi_memory_desc_t *efi_memmap, *md;
-       unsigned long *pal_desc, *sal_desc;
        struct ia64_sal_desc_entry_point *sal_ed;
        struct ia64_boot_param *bp;
        unsigned long *pfn;
@@ -490,7 +642,7 @@
        char *cp, *cmd_line, *fw_vendor;
        int i = 0;
        unsigned long maxmem = (d->max_pages - d->arch.sys_pgnr) * PAGE_SIZE;
-       unsigned long start_mpaddr = ((d==dom0)?dom0_start:0);
+       const unsigned long start_mpaddr = ((d==dom0)?dom0_start:0);
 
 #      define MAKE_MD(typ, attr, start, end, abs)      \       
        do {                                            \
@@ -513,13 +665,6 @@
 */
        memset(fw_mem, 0, fw_mem_size);
 
-#ifdef USE_PAL_EMULATOR
-       pal_desc = (unsigned long *) &pal_emulator_static;
-#else
-       pal_desc = (unsigned long *) &xen_pal_emulator;
-#endif
-       sal_desc = (unsigned long *) &sal_emulator;
-
        cp = fw_mem;
        efi_systab  = (void *) cp; cp += sizeof(*efi_systab);
        efi_runtime = (void *) cp; cp += sizeof(*efi_runtime);
@@ -562,7 +707,7 @@
 #define EFI_HYPERCALL_PATCH(tgt,call) do { \
     
dom_efi_hypercall_patch(d,FW_HYPERCALL_##call##_PADDR,FW_HYPERCALL_##call); \
     tgt = dom_pa(pfn); \
-    *pfn++ = FW_HYPERCALL_##call##_PADDR + ((d==dom0)?dom0_start:0); \
+    *pfn++ = FW_HYPERCALL_##call##_PADDR + start_mpaddr; \
     *pfn++ = 0; \
     } while (0)
 
@@ -620,6 +765,22 @@
                        i++;
                }
                printf("\n");
+       } else {
+               i = 1;
+
+               if ((unsigned long)fw_mem + fw_mem_size - (unsigned long)cp >=
+                   sizeof(struct fake_acpi_tables)) {
+                       struct fake_acpi_tables *acpi_tables;
+
+                       acpi_tables = (void *)cp;
+                       cp += sizeof(struct fake_acpi_tables);
+                       dom_fw_fake_acpi(acpi_tables);
+
+                       efi_tables[i].guid = ACPI_20_TABLE_GUID;
+                       efi_tables[i].table = dom_pa(acpi_tables);
+                       printf(" ACPI 2.0=%0xlx",efi_tables[i].table);
+                       i++;
+               }
        }
 
        /* fill in the SAL system table: */
@@ -634,12 +795,10 @@
 
        /* fill in an entry point: */
        sal_ed->type = SAL_DESC_ENTRY_POINT;
-#define FW_HYPERCALL_PATCH(tgt,call,ret) do { \
-    
dom_fw_hypercall_patch(d,FW_HYPERCALL_##call##_PADDR,FW_HYPERCALL_##call,ret); \
-    tgt = FW_HYPERCALL_##call##_PADDR + ((d==dom0)?dom0_start:0); \
-    } while (0)
-       FW_HYPERCALL_PATCH(sal_ed->pal_proc,PAL_CALL,0);
-       FW_HYPERCALL_PATCH(sal_ed->sal_proc,SAL_CALL,1);
+       sal_ed->pal_proc = FW_HYPERCALL_PAL_CALL_PADDR + start_mpaddr;
+       dom_fw_pal_hypercall_patch (d, sal_ed->pal_proc);
+       sal_ed->sal_proc = FW_HYPERCALL_SAL_CALL_PADDR + start_mpaddr;
+       dom_fw_hypercall_patch (d, sal_ed->sal_proc, FW_HYPERCALL_SAL_CALL, 1);
        sal_ed->gp = 0;  // will be ignored
 
        for (cp = (char *) sal_systab; cp < (char *) efi_memmap; ++cp)
diff -r b20641d24272 -r 4146dbea47e1 xen/arch/ia64/xen/domain.c
--- a/xen/arch/ia64/xen/domain.c        Sat Dec  3 12:21:27 2005
+++ b/xen/arch/ia64/xen/domain.c        Sat Dec  3 12:21:52 2005
@@ -165,7 +165,7 @@
 
 static void init_switch_stack(struct vcpu *v)
 {
-       struct pt_regs *regs = (struct pt_regs *) ((unsigned long) v + 
IA64_STK_OFFSET) - 1;
+       struct pt_regs *regs = vcpu_regs (v);
        struct switch_stack *sw = (struct switch_stack *) regs - 1;
        extern void ia64_ret_from_clone;
 
@@ -253,7 +253,7 @@
 
 void arch_getdomaininfo_ctxt(struct vcpu *v, struct vcpu_guest_context *c)
 {
-       struct pt_regs *regs = (struct pt_regs *) ((unsigned long) v + 
IA64_STK_OFFSET) - 1;
+       struct pt_regs *regs = vcpu_regs (v);
 
        printf("arch_getdomaininfo_ctxt\n");
        c->regs = *regs;
@@ -264,7 +264,7 @@
 
 int arch_set_info_guest(struct vcpu *v, struct vcpu_guest_context *c)
 {
-       struct pt_regs *regs = (struct pt_regs *) ((unsigned long) v + 
IA64_STK_OFFSET) - 1;
+       struct pt_regs *regs = vcpu_regs (v);
        struct domain *d = v->domain;
        int i, rc, ret;
        unsigned long progress = 0;
@@ -335,7 +335,7 @@
        if (d == dom0) start_pc += dom0_start;
 #endif
 
-       regs = (struct pt_regs *) ((unsigned long) v + IA64_STK_OFFSET) - 1;
+       regs = vcpu_regs (v);
        if (VMX_DOMAIN(v)) {
                /* dt/rt/it:1;i/ic:1, si:1, vm/bn:1, ac:1 */
                regs->cr_ipsr = 0x501008826008; /* Need to be expanded as macro 
*/
diff -r b20641d24272 -r 4146dbea47e1 xen/arch/ia64/xen/hypercall.c
--- a/xen/arch/ia64/xen/hypercall.c     Sat Dec  3 12:21:27 2005
+++ b/xen/arch/ia64/xen/hypercall.c     Sat Dec  3 12:21:52 2005
@@ -18,8 +18,6 @@
 #include <public/sched.h>
 
 extern unsigned long translate_domain_mpaddr(unsigned long);
-extern struct ia64_pal_retval xen_pal_emulator(UINT64,UINT64,UINT64,UINT64);
-extern struct ia64_sal_retval 
sal_emulator(UINT64,UINT64,UINT64,UINT64,UINT64,UINT64,UINT64,UINT64);
 
 unsigned long idle_when_pending = 0;
 unsigned long pal_halt_light_count = 0;
@@ -28,8 +26,7 @@
 ia64_hypercall (struct pt_regs *regs)
 {
        struct vcpu *v = (struct domain *) current;
-       struct ia64_sal_retval x;
-       struct ia64_pal_retval y;
+       struct sal_ret_values x;
        unsigned long *tv, *tc;
        int pi;
 
@@ -62,25 +59,33 @@
                                pal_halt_light_count++;
                                do_sched_op(SCHEDOP_yield);
                        }
-                       //break;
+                       regs->r8 = 0;
+                       regs->r9 = 0;
+                       regs->r10 = 0;
+                       regs->r11 = 0;
                }
-               else if (regs->r28 >= PAL_COPY_PAL) {   /* FIXME */
-                       printf("stacked PAL hypercalls not supported\n");
-                       regs->r8 = -1;
-                       break;
+               else {
+                       struct ia64_pal_retval y;
+
+                       if (regs->r28 >= PAL_COPY_PAL)
+                               y = xen_pal_emulator
+                                       (regs->r28, vcpu_get_gr (v, 33),
+                                        vcpu_get_gr (v, 34),
+                                        vcpu_get_gr (v, 35));
+                       else
+                               y = xen_pal_emulator(regs->r28,regs->r29,
+                                                    regs->r30,regs->r31);
+                       regs->r8 = y.status; regs->r9 = y.v0;
+                       regs->r10 = y.v1; regs->r11 = y.v2;
                }
-               else y = xen_pal_emulator(regs->r28,regs->r29,
-                                               regs->r30,regs->r31);
-               regs->r8 = y.status; regs->r9 = y.v0;
-               regs->r10 = y.v1; regs->r11 = y.v2;
                break;
            case FW_HYPERCALL_SAL_CALL:
                x = sal_emulator(vcpu_get_gr(v,32),vcpu_get_gr(v,33),
                        vcpu_get_gr(v,34),vcpu_get_gr(v,35),
                        vcpu_get_gr(v,36),vcpu_get_gr(v,37),
                        vcpu_get_gr(v,38),vcpu_get_gr(v,39));
-               regs->r8 = x.status; regs->r9 = x.v0;
-               regs->r10 = x.v1; regs->r11 = x.v2;
+               regs->r8 = x.r8; regs->r9 = x.r9;
+               regs->r10 = x.r10; regs->r11 = x.r11;
                break;
            case FW_HYPERCALL_EFI_RESET_SYSTEM:
                printf("efi.reset_system called ");
diff -r b20641d24272 -r 4146dbea47e1 xen/arch/ia64/xen/privop.c
--- a/xen/arch/ia64/xen/privop.c        Sat Dec  3 12:21:27 2005
+++ b/xen/arch/ia64/xen/privop.c        Sat Dec  3 12:21:52 2005
@@ -10,6 +10,7 @@
 #include <asm/vcpu.h>
 #include <asm/processor.h>
 #include <asm/delay.h> // Debug only
+#include <asm/dom_fw.h>
 //#include <debug.h>
 
 long priv_verbose=0;
@@ -53,6 +54,39 @@
        
        *imva++ = bundle.i64[0]; *imva = bundle.i64[1];
 }
+
+void build_pal_hypercall_bundles(UINT64 *imva, UINT64 brkimm, UINT64 hypnum)
+{
+       extern unsigned long pal_call_stub[];
+       IA64_BUNDLE bundle;
+       INST64_A5 slot_a5;
+       INST64_M37 slot_m37;
+
+       /* The source of the hypercall stub is the pal_call_stub function
+          defined in xenasm.S.  */
+
+       /* Copy the first bundle and patch the hypercall number.  */
+       bundle.i64[0] = pal_call_stub[0];
+       bundle.i64[1] = pal_call_stub[1];
+       slot_a5.inst = bundle.slot0;
+       slot_a5.imm7b = hypnum;
+       slot_a5.imm9d = hypnum >> 7;
+       slot_a5.imm5c = hypnum >> 16;
+       bundle.slot0 = slot_a5.inst;
+       imva[0] = bundle.i64[0];
+       imva[1] = bundle.i64[1];
+       
+       /* Copy the second bundle and patch the hypercall vector.  */
+       bundle.i64[0] = pal_call_stub[2];
+       bundle.i64[1] = pal_call_stub[3];
+       slot_m37.inst = bundle.slot0;
+       slot_m37.imm20a = brkimm;
+       slot_m37.i = brkimm >> 20;
+       bundle.slot0 = slot_m37.inst;
+       imva[2] = bundle.i64[0];
+       imva[3] = bundle.i64[1];
+}
+
 
 /**************************************************************************
 Privileged operation emulation routines
diff -r b20641d24272 -r 4146dbea47e1 xen/arch/ia64/xen/process.c
--- a/xen/arch/ia64/xen/process.c       Sat Dec  3 12:21:27 2005
+++ b/xen/arch/ia64/xen/process.c       Sat Dec  3 12:21:52 2005
@@ -33,8 +33,6 @@
 #include <xen/multicall.h>
 
 extern unsigned long vcpu_get_itir_on_fault(struct vcpu *, UINT64);
-extern struct ia64_sal_retval pal_emulator_static(UINT64);
-extern struct ia64_sal_retval 
sal_emulator(UINT64,UINT64,UINT64,UINT64,UINT64,UINT64,UINT64,UINT64);
 
 extern unsigned long dom0_start, dom0_size;
 
diff -r b20641d24272 -r 4146dbea47e1 xen/arch/ia64/xen/vcpu.c
--- a/xen/arch/ia64/xen/vcpu.c  Sat Dec  3 12:21:27 2005
+++ b/xen/arch/ia64/xen/vcpu.c  Sat Dec  3 12:21:52 2005
@@ -33,7 +33,6 @@
 
 // this def for vcpu_regs won't work if kernel stack is present
 //#define      vcpu_regs(vcpu) ((struct pt_regs *) vcpu->arch.regs
-#define vcpu_regs(vcpu) (((struct pt_regs *) ((char *) (vcpu) + 
IA64_STK_OFFSET)) - 1)
 #define        PSCB(x,y)       VCPU(x,y)
 #define        PSCBX(x,y)      x->arch.y
 
diff -r b20641d24272 -r 4146dbea47e1 xen/arch/ia64/xen/xenasm.S
--- a/xen/arch/ia64/xen/xenasm.S        Sat Dec  3 12:21:27 2005
+++ b/xen/arch/ia64/xen/xenasm.S        Sat Dec  3 12:21:52 2005
@@ -516,3 +516,27 @@
        br.ret.sptk.few rp
        ;;
 END(vhpt_insert)
+
+//  These instructions are copied in the domains.
+//  This is the virtual PAL, which simply does an hypercall.
+//  The size is 2 bunldes (32 Bytes).  It handles both static and stacked
+//    convention.
+//  If you modify this code, you have to modify dom_fw.h (for the size) and
+//   dom_fw_pal_hypercall_patch.
+GLOBAL_ENTRY(pal_call_stub)
+       {
+        .mii
+       addl r2=0x1000,r0       //  Hypercall number (Value is patched).
+       mov r9=256
+       ;; 
+       cmp.gtu p7,p8=r9,r28            /* r32 <= 255? */
+       }
+       {
+        .mbb
+       break 0x1000    //  Hypercall vector (Value is patched).
+(p7)   br.cond.sptk.few rp
+(p8)   br.ret.sptk.few rp
+       }
+END(pal_call_stub)
+
+
diff -r b20641d24272 -r 4146dbea47e1 xen/arch/ia64/xen/xenmisc.c
--- a/xen/arch/ia64/xen/xenmisc.c       Sat Dec  3 12:21:27 2005
+++ b/xen/arch/ia64/xen/xenmisc.c       Sat Dec  3 12:21:52 2005
@@ -72,7 +72,7 @@
 void grant_table_destroy(struct domain *d) { return; }
 #endif
 
-struct pt_regs *guest_cpu_user_regs(void) { return ia64_task_regs(current); }
+struct pt_regs *guest_cpu_user_regs(void) { return vcpu_regs(current); }
 
 void raise_actimer_softirq(void)
 {
@@ -141,10 +141,12 @@
     //memset(percpu_info, 0, sizeof(percpu_info));
 }
 
+#if 0
 void free_page_type(struct pfn_info *page, unsigned int type)
 {
        dummy();
 }
+#endif
 
 ///////////////////////////////
 //// misc memory stuff
diff -r b20641d24272 -r 4146dbea47e1 xen/arch/ia64/xen/xensetup.c
--- a/xen/arch/ia64/xen/xensetup.c      Sat Dec  3 12:21:27 2005
+++ b/xen/arch/ia64/xen/xensetup.c      Sat Dec  3 12:21:52 2005
@@ -289,6 +289,11 @@
 printk("About to call ac_timer_init()\n");
     ac_timer_init();
 
+#ifdef CONFIG_XEN_CONSOLE_INPUT        /* CONFIG_SERIAL_8250_CONSOLE=n in 
dom0! */
+    initialize_keytable();
+    serial_init_postirq();
+#endif
+
 #ifdef CONFIG_SMP
     if ( opt_nosmp )
     {
@@ -407,7 +412,7 @@
     init_trace_bufs();
 
     /* Give up the VGA console if DOM0 is configured to grab it. */
-#ifndef IA64
+#ifdef CONFIG_XEN_CONSOLE_INPUT        /* CONFIG_SERIAL_8250_CONSOLE=n in 
dom0! */
     console_endboot(cmdline && strstr(cmdline, "tty0"));
 #endif
 
diff -r b20641d24272 -r 4146dbea47e1 xen/include/asm-ia64/dom_fw.h
--- a/xen/include/asm-ia64/dom_fw.h     Sat Dec  3 12:21:27 2005
+++ b/xen/include/asm-ia64/dom_fw.h     Sat Dec  3 12:21:52 2005
@@ -35,6 +35,7 @@
  * rp=b0 indicates the return point.
  *
  * A single hypercall is used for all PAL calls.
+ * The hypercall stub is pal_call_stub (xenasm.S).  Its size is 2 bundles.
  */
 
 #define FW_HYPERCALL_PAL_CALL_INDEX    0x80UL
@@ -53,7 +54,7 @@
  * A single hypercall is used for all SAL calls.
  */
 
-#define FW_HYPERCALL_SAL_CALL_INDEX    0x81UL
+#define FW_HYPERCALL_SAL_CALL_INDEX    0x82UL
 #define FW_HYPERCALL_SAL_CALL_PADDR    
FW_HYPERCALL_PADDR(FW_HYPERCALL_SAL_CALL_INDEX)
 #define FW_HYPERCALL_SAL_CALL          0x1001UL
 
@@ -117,3 +118,12 @@
 #define FW_HYPERCALL_EFI_SET_VARIABLE_PADDR            
FW_HYPERCALL_PADDR(FW_HYPERCALL_EFI_SET_VARIABLE_INDEX)
 #define FW_HYPERCALL_EFI_GET_NEXT_HIGH_MONO_COUNT_PADDR        
FW_HYPERCALL_PADDR(FW_HYPERCALL_EFI_GET_NEXT_HIGH_MONO_COUNT_INDEX)
 #define FW_HYPERCALL_EFI_RESET_SYSTEM_PADDR            
FW_HYPERCALL_PADDR(FW_HYPERCALL_EFI_RESET_SYSTEM_INDEX)
+
+extern struct ia64_pal_retval xen_pal_emulator(UINT64,UINT64,UINT64,UINT64);
+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 void build_pal_hypercall_bundles(unsigned long *imva, unsigned long 
brkimm, unsigned long hypnum);
+extern void build_hypercall_bundle(UINT64 *imva, UINT64 brkimm, UINT64 hypnum, 
UINT64 ret);
+
+
diff -r b20641d24272 -r 4146dbea47e1 xen/include/asm-ia64/linux-xen/asm/ptrace.h
--- a/xen/include/asm-ia64/linux-xen/asm/ptrace.h       Sat Dec  3 12:21:27 2005
+++ b/xen/include/asm-ia64/linux-xen/asm/ptrace.h       Sat Dec  3 12:21:52 2005
@@ -98,6 +98,19 @@
 #ifdef XEN
 #include <public/arch-ia64.h>
 #define pt_regs cpu_user_regs
+
+/*  User regs at placed at the end of the vcpu area.
+    Convert a vcpu pointer to a regs pointer.
+    Note: this is the same as ia64_task_regs, but it uses a Xen-friendly name.
+*/
+struct vcpu;
+static inline struct cpu_user_regs *
+vcpu_regs (struct vcpu *v)
+{
+  return (struct cpu_user_regs *) ((unsigned long) v + IA64_STK_OFFSET) - 1;
+}
+
+
 #else
 struct pt_regs {
        /* The following registers are saved by SAVE_MIN: */
diff -r b20641d24272 -r 4146dbea47e1 xen/include/asm-ia64/privop.h
--- a/xen/include/asm-ia64/privop.h     Sat Dec  3 12:21:27 2005
+++ b/xen/include/asm-ia64/privop.h     Sat Dec  3 12:21:52 2005
@@ -99,6 +99,11 @@
     IA64_INST inst;
     struct { unsigned long qp:6, r1:7, :14, x6:6, x3:3, :1, major:4; }; 
 } INST64_M36;
+
+typedef union U_INST64_M37 {
+    IA64_INST inst;
+    struct { unsigned long qp:6, imm20a:20,:1, x4:4,x2:2,x3:3, i:1, major:4; };
+} INST64_M37;
 
 typedef union U_INST64_M41 {
     IA64_INST inst;
@@ -190,6 +195,7 @@
     INST64_M33 M33;    // mov from cr
     INST64_M35 M35;    // mov to psr
     INST64_M36 M36;    // mov from psr
+    INST64_M37 M37;    // break.m
     INST64_M41 M41;    // translation cache insert
     INST64_M42 M42;    // mov to indirect reg/translation reg insert
     INST64_M43 M43;    // mov from indirect reg
diff -r b20641d24272 -r 4146dbea47e1 xen/include/asm-ia64/vmx_vcpu.h
--- a/xen/include/asm-ia64/vmx_vcpu.h   Sat Dec  3 12:21:27 2005
+++ b/xen/include/asm-ia64/vmx_vcpu.h   Sat Dec  3 12:21:52 2005
@@ -44,8 +44,6 @@
 #define VRN7    0x7UL
 // for vlsapic
 #define  VLSAPIC_INSVC(vcpu, i) ((vcpu)->arch.insvc[i])
-// this def for vcpu_regs won't work if kernel stack is present
-#define        vcpu_regs(vcpu) (((struct pt_regs *) ((char *) (vcpu) + 
IA64_STK_OFFSET)) - 1)
 //#define      VMX_VPD(x,y)    ((x)->arch.arch_vmx.vpd->y)
 
 #define VMX(x,y)  ((x)->arch.arch_vmx.y)
diff -r b20641d24272 -r 4146dbea47e1 xen/include/asm-ia64/xenpage.h
--- a/xen/include/asm-ia64/xenpage.h    Sat Dec  3 12:21:27 2005
+++ b/xen/include/asm-ia64/xenpage.h    Sat Dec  3 12:21:52 2005
@@ -8,7 +8,7 @@
 #undef pfn_valid
 #undef page_to_pfn
 #undef pfn_to_page
-# define pfn_valid(_pfn)               ((_pfn) > max_page)
+# define pfn_valid(_pfn)       ((_pfn) < max_page)
 # define page_to_pfn(_page)    ((unsigned long) ((_page) - frame_table))
 # define pfn_to_page(_pfn)     (frame_table + (_pfn))
 
diff -r b20641d24272 -r 4146dbea47e1 xen/include/public/io/blkif.h
--- a/xen/include/public/io/blkif.h     Sat Dec  3 12:21:27 2005
+++ b/xen/include/public/io/blkif.h     Sat Dec  3 12:21:52 2005
@@ -10,6 +10,7 @@
 #define __XEN_PUBLIC_IO_BLKIF_H__
 
 #include "ring.h"
+#include "../grant_table.h"
 
 /*
  * Front->back notifications: When enqueuing a new request, sending a
diff -r b20641d24272 -r 4146dbea47e1 xen/include/public/io/netif.h
--- a/xen/include/public/io/netif.h     Sat Dec  3 12:21:27 2005
+++ b/xen/include/public/io/netif.h     Sat Dec  3 12:21:52 2005
@@ -10,6 +10,7 @@
 #define __XEN_PUBLIC_IO_NETIF_H__
 
 #include "ring.h"
+#include "../grant_table.h"
 
 /*
  * Note that there is *never* any need to notify the backend when enqueuing
diff -r b20641d24272 -r 4146dbea47e1 xen/include/public/io/tpmif.h
--- a/xen/include/public/io/tpmif.h     Sat Dec  3 12:21:27 2005
+++ b/xen/include/public/io/tpmif.h     Sat Dec  3 12:21:52 2005
@@ -15,6 +15,8 @@
 
 #ifndef __XEN_PUBLIC_IO_TPMIF_H__
 #define __XEN_PUBLIC_IO_TPMIF_H__
+
+#include "../grant_table.h"
 
 typedef struct {
     unsigned long addr;   /* Machine address of packet.   */
diff -r b20641d24272 -r 4146dbea47e1 xen/include/asm-ia64/linux-xen/asm/cache.h
--- /dev/null   Sat Dec  3 12:21:27 2005
+++ b/xen/include/asm-ia64/linux-xen/asm/cache.h        Sat Dec  3 12:21:52 2005
@@ -0,0 +1,35 @@
+#ifndef _ASM_IA64_CACHE_H
+#define _ASM_IA64_CACHE_H
+
+#include <linux/config.h>
+
+/*
+ * Copyright (C) 1998-2000 Hewlett-Packard Co
+ *     David Mosberger-Tang <davidm@xxxxxxxxxx>
+ */
+
+/* Bytes per L1 (data) cache line.  */
+#define L1_CACHE_SHIFT         CONFIG_IA64_L1_CACHE_SHIFT
+#define L1_CACHE_BYTES         (1 << L1_CACHE_SHIFT)
+
+#define L1_CACHE_SHIFT_MAX 7   /* largest L1 which this arch supports */
+
+#ifdef XEN
+# define SMP_CACHE_SHIFT       L1_CACHE_SHIFT
+# define SMP_CACHE_BYTES       L1_CACHE_BYTES
+#else
+#ifdef CONFIG_SMP
+# define SMP_CACHE_SHIFT       L1_CACHE_SHIFT
+# define SMP_CACHE_BYTES       L1_CACHE_BYTES
+#else
+  /*
+   * The "aligned" directive can only _increase_ alignment, so this is
+   * safe and provides an easy way to avoid wasting space on a
+   * uni-processor:
+   */
+# define SMP_CACHE_SHIFT       3
+# define SMP_CACHE_BYTES       (1 << 3)
+#endif
+#endif
+
+#endif /* _ASM_IA64_CACHE_H */
diff -r b20641d24272 -r 4146dbea47e1 
linux-2.6-xen-sparse/arch/ia64/xen/drivers/motherboard.c
--- a/linux-2.6-xen-sparse/arch/ia64/xen/drivers/motherboard.c  Sat Dec  3 
12:21:27 2005
+++ /dev/null   Sat Dec  3 12:21:52 2005
@@ -1,178 +0,0 @@
-/* 
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or (at
- *  your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License along
- *  with this program; if not, write to the Free Software Foundation, Inc.,
- *  59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
- *
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- */
-
-/* Purpose: Prevent PCMCIA cards from using motherboard resources. */
-
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/types.h>
-#include <linux/pci.h>
-#include <linux/ioport.h>
-#include <asm/io.h>
-
-#include <acpi/acpi_bus.h>
-#include <acpi/acpi_drivers.h>
-
-#define _COMPONENT             ACPI_SYSTEM_COMPONENT
-ACPI_MODULE_NAME               ("acpi_motherboard")
-
-/* Dell use PNP0C01 instead of PNP0C02 */
-#define ACPI_MB_HID1                   "PNP0C01"
-#define ACPI_MB_HID2                   "PNP0C02"
-
-/**
- * Doesn't care about legacy IO ports, only IO ports beyond 0x1000 are reserved
- * Doesn't care about the failure of 'request_region', since other may reserve 
- * the io ports as well
- */
-#define IS_RESERVED_ADDR(base, len) \
-       (((len) > 0) && ((base) > 0) && ((base) + (len) < IO_SPACE_LIMIT) \
-       && ((base) + (len) > PCIBIOS_MIN_IO))
-
-/*
- * Clearing the flag (IORESOURCE_BUSY) allows drivers to use
- * the io ports if they really know they can use it, while
- * still preventing hotplug PCI devices from using it. 
- */
-
-static acpi_status
-acpi_reserve_io_ranges (struct acpi_resource *res, void *data)
-{
-       struct resource *requested_res = NULL;
-
-       ACPI_FUNCTION_TRACE("acpi_reserve_io_ranges");
-
-       if (res->id == ACPI_RSTYPE_IO) {
-               struct acpi_resource_io *io_res = &res->data.io;
-
-               if (io_res->min_base_address != io_res->max_base_address)
-                       return_VALUE(AE_OK);
-               if (IS_RESERVED_ADDR(io_res->min_base_address, 
io_res->range_length)) {
-                       ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Motherboard resources 
0x%08x - 0x%08x\n",
-                               io_res->min_base_address, 
-                               io_res->min_base_address + 
io_res->range_length));
-                       requested_res = 
request_region(io_res->min_base_address, 
-                               io_res->range_length, "motherboard");
-               }
-       } else if (res->id == ACPI_RSTYPE_FIXED_IO) {
-               struct acpi_resource_fixed_io *fixed_io_res = 
&res->data.fixed_io;
-
-               if (IS_RESERVED_ADDR(fixed_io_res->base_address, 
fixed_io_res->range_length)) {
-                       ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Motherboard resources 
0x%08x - 0x%08x\n",
-                               fixed_io_res->base_address, 
-                               fixed_io_res->base_address + 
fixed_io_res->range_length));
-                       requested_res = 
request_region(fixed_io_res->base_address, 
-                               fixed_io_res->range_length, "motherboard");
-               }
-       } else {
-               /* Memory mapped IO? */
-       }
-
-       if (requested_res)
-               requested_res->flags &= ~IORESOURCE_BUSY;
-       return_VALUE(AE_OK);
-}
-
-static int acpi_motherboard_add (struct acpi_device *device)
-{
-       if (!device)
-               return -EINVAL;
-       acpi_walk_resources(device->handle, METHOD_NAME__CRS, 
-               acpi_reserve_io_ranges, NULL);
-
-       return 0;
-}
-
-static struct acpi_driver acpi_motherboard_driver1 = {
-       .name =         "motherboard",
-       .class =        "",
-       .ids =          ACPI_MB_HID1,
-       .ops =  {
-               .add =          acpi_motherboard_add,
-       },
-};
-
-static struct acpi_driver acpi_motherboard_driver2 = {
-       .name =         "motherboard",
-       .class =        "",
-       .ids =          ACPI_MB_HID2,
-       .ops =  {
-               .add =          acpi_motherboard_add,
-       },
-};
-
-static void __init
-acpi_reserve_resources (void)
-{
-       if (!acpi_gbl_FADT) return;
-       if (acpi_gbl_FADT->xpm1a_evt_blk.address && acpi_gbl_FADT->pm1_evt_len)
-               request_region(acpi_gbl_FADT->xpm1a_evt_blk.address, 
-                       acpi_gbl_FADT->pm1_evt_len, "PM1a_EVT_BLK");
-
-       if (acpi_gbl_FADT->xpm1b_evt_blk.address && acpi_gbl_FADT->pm1_evt_len)
-               request_region(acpi_gbl_FADT->xpm1b_evt_blk.address,
-                       acpi_gbl_FADT->pm1_evt_len, "PM1b_EVT_BLK");
-
-       if (acpi_gbl_FADT->xpm1a_cnt_blk.address && acpi_gbl_FADT->pm1_cnt_len)
-               request_region(acpi_gbl_FADT->xpm1a_cnt_blk.address, 
-                       acpi_gbl_FADT->pm1_cnt_len, "PM1a_CNT_BLK");
-
-       if (acpi_gbl_FADT->xpm1b_cnt_blk.address && acpi_gbl_FADT->pm1_cnt_len)
-               request_region(acpi_gbl_FADT->xpm1b_cnt_blk.address, 
-                       acpi_gbl_FADT->pm1_cnt_len, "PM1b_CNT_BLK");
-
-       if (acpi_gbl_FADT->xpm_tmr_blk.address && acpi_gbl_FADT->pm_tm_len == 4)
-               request_region(acpi_gbl_FADT->xpm_tmr_blk.address,
-                       4, "PM_TMR");
-
-       if (acpi_gbl_FADT->xpm2_cnt_blk.address && acpi_gbl_FADT->pm2_cnt_len)
-               request_region(acpi_gbl_FADT->xpm2_cnt_blk.address,
-                       acpi_gbl_FADT->pm2_cnt_len, "PM2_CNT_BLK");
-
-       /* Length of GPE blocks must be a non-negative multiple of 2 */
-
-       if (acpi_gbl_FADT->xgpe0_blk.address && acpi_gbl_FADT->gpe0_blk_len &&
-                       !(acpi_gbl_FADT->gpe0_blk_len & 0x1))
-               request_region(acpi_gbl_FADT->xgpe0_blk.address,
-                       acpi_gbl_FADT->gpe0_blk_len, "GPE0_BLK");
-
-       if (acpi_gbl_FADT->xgpe1_blk.address && acpi_gbl_FADT->gpe1_blk_len &&
-                       !(acpi_gbl_FADT->gpe1_blk_len & 0x1))
-               request_region(acpi_gbl_FADT->xgpe1_blk.address,
-                       acpi_gbl_FADT->gpe1_blk_len, "GPE1_BLK");
-}
-
-static int __init acpi_motherboard_init(void)
-{
-       acpi_bus_register_driver(&acpi_motherboard_driver1);
-       acpi_bus_register_driver(&acpi_motherboard_driver2);
-       /* 
-        * Guarantee motherboard IO reservation first
-        * This module must run after scan.c
-        */
-       if (!acpi_disabled)
-               acpi_reserve_resources ();
-       return 0;
-}
-
-/**
- * Reserve motherboard resources after PCI claim BARs,
- * but before PCI assign resources for uninitialized PCI devices
- */
-fs_initcall(acpi_motherboard_init);
diff -r b20641d24272 -r 4146dbea47e1 
xen/arch/ia64/tools/xelilo/elilo-3.4.11.xen.patch
--- a/xen/arch/ia64/tools/xelilo/elilo-3.4.11.xen.patch Sat Dec  3 12:21:27 2005
+++ /dev/null   Sat Dec  3 12:21:52 2005
@@ -1,402 +0,0 @@
-<Sign-off: fred.yang@xxxxxxxxx>
-diff -Naur base/bootparams.c elilo/bootparams.c
---- base/bootparams.c  2005-09-20 19:51:07.000000000 -0700
-+++ elilo/bootparams.c 2005-09-20 19:33:00.000000000 -0700
-@@ -38,7 +38,7 @@
-  *    bp  : the address of the bootparams otherwise (opaque type)
-  */
- VOID *
--create_boot_params(CHAR16 *args, memdesc_t *initrd, UINTN *cookie)
-+create_boot_params(CHAR16 *args, memdesc_t *initrd, memdesc_t *vmcode, UINTN 
*cookie)
- {
- /* 
-  * XXX: need cleanup
-@@ -95,7 +95,7 @@
-        */
-       Memset(bp, 0, BOOT_PARAM_MEMSIZE);
- 
--      if (sysdeps_create_boot_params(bp, cp, initrd, cookie) == -1) return 0;
-+      if (sysdeps_create_boot_params(bp, cp, initrd, vmcode, cookie) == -1) 
return 0;
- 
-       /*
-        * Convert kernel command line args from UNICODE to ASCII and put them 
where
-diff -Naur base/choosers/simple.c elilo/choosers/simple.c
---- base/choosers/simple.c     2005-09-20 19:51:07.000000000 -0700
-+++ elilo/choosers/simple.c    2005-09-20 19:28:15.000000000 -0700
-@@ -37,6 +37,7 @@
- {
-       CHAR16 *desc;
-       CHAR16 initrd_name[CMDLINE_MAXLEN];
-+      CHAR16 vmcode_name[CMDLINE_MAXLEN];
-       CHAR16 options_tmp[CMDLINE_MAXLEN];
-       CHAR16 options[CMDLINE_MAXLEN];
-       CHAR16 kname[FILENAME_MAXLEN];
-@@ -46,9 +47,9 @@
-               Print(L"desc   : %s\n", desc);
-       }
- 
--      initrd_name[0] = options_tmp[0] = kname[0] = CHAR_NULL;
-+      initrd_name[0] = vmcode_name[0] = options_tmp[0] = kname[0] = CHAR_NULL;
- 
--      if (find_label(name, kname, options_tmp, initrd_name) == -1) {
-+      if (find_label(name, kname, options_tmp, initrd_name, vmcode_name) == 
-1) {
-               StrCpy(kname, name);
-               Print(L"\n");
-       }
-@@ -56,6 +57,7 @@
- 
-       Print(L"cmdline: %s %s\n", kname, options);
-       if (initrd_name[0]) Print(L"initrd : %s\n", initrd_name);
-+      if (vmcode_name[0]) Print(L"vmcode : %s\n", vmcode_name);
- }
- 
- static VOID
-@@ -247,6 +249,7 @@
-       CHAR16 buffer[CMDLINE_MAXLEN];
-       CHAR16 alt_buffer[CMDLINE_MAXLEN];
-       CHAR16 initrd_name[CMDLINE_MAXLEN];
-+      CHAR16 vmcode_name[CMDLINE_MAXLEN];
-       CHAR16 args[CMDLINE_MAXLEN];
-       CHAR16 devname[CMDLINE_MAXLEN];
-       CHAR16 dpath[FILENAME_MAXLEN];
-@@ -259,7 +262,7 @@
-       display_message();
- 
- restart:
--      initrd_name[0] = kname[0] = cmdline[0] = args[0] = CHAR_NULL;
-+      initrd_name[0] = vmcode_name[0] = kname[0] = cmdline[0] = args[0] = 
CHAR_NULL;
- 
-       /* reset per image loader options */
-       Memset(&elilo_opt.img_opt, 0, sizeof(elilo_opt.img_opt));
-@@ -303,7 +306,7 @@
-        * if no match is found, the args and initrd arguments may
-        * still be modified by global options in the config file.
-        */
--      ret = find_label((index < argc) ? argv[index] : NULL, kname, args, 
initrd_name);
-+      ret = find_label((index < argc) ? argv[index] : NULL, kname, args, 
initrd_name, vmcode_name);
- 
-       /*
-        * not found, so assume first argument is kernel name and
-@@ -335,6 +338,10 @@
-               StrCpy(elilo_opt.initrd, initrd_name);
-       }
- 
-+      if (elilo_opt.vmcode[0] == CHAR_NULL && vmcode_name[0] != CHAR_NULL) {
-+              StrCpy(elilo_opt.vmcode, vmcode_name);
-+      }
-+
-       VERB_PRT(1,  { Print(L"kernel     is  '%s'\n", kname);
-                      Print(L"arguments  are '%s'\n", args);
-                       if (elilo_opt.initrd[0]) Print(L"initrd      is 
'%s'\n", elilo_opt.initrd);
-diff -Naur base/choosers/textmenu.c elilo/choosers/textmenu.c
---- base/choosers/textmenu.c   2005-09-20 19:51:07.000000000 -0700
-+++ elilo/choosers/textmenu.c  2005-09-20 19:28:29.000000000 -0700
-@@ -358,6 +358,7 @@
- #     define BOOT_IMG_STR     L"BOOT_IMAGE="
-       CHAR16 label[CMDLINE_MAXLEN];
-       CHAR16 initrd_name[CMDLINE_MAXLEN];
-+      CHAR16 vmcode_name[CMDLINE_MAXLEN];
-       CHAR16 args[CMDLINE_MAXLEN];
-       CHAR16 devname[CMDLINE_MAXLEN];
-       CHAR16 dpath[FILENAME_MAXLEN];
-@@ -412,9 +413,9 @@
-        * still be modified by global options in the config file.
-        */
-       if (label[0])
--              ret = find_label(label, kname, args, initrd_name);
-+              ret = find_label(label, kname, args, initrd_name, vmcode_name);
-       else
--              ret = find_label(argv[index], kname, args, initrd_name);
-+              ret = find_label(argv[index], kname, args, initrd_name, 
vmcode_name);
- 
-       /*
-        * not found, so assume first argument is kernel name and
-@@ -448,6 +449,10 @@
-               StrCpy(elilo_opt.initrd, initrd_name);
-       }
- 
-+      if (elilo_opt.vmcode[0] == CHAR_NULL && vmcode_name[0] != CHAR_NULL) {
-+              StrCpy(elilo_opt.vmcode, vmcode_name);
-+      }
-+
-       VERB_PRT(1,  { Print(L"kernel     is  '%s'\n", kname);
-                      Print(L"arguments  are '%s'\n", args);
-                       if (elilo_opt.initrd[0]) Print(L"initrd      is 
'%s'\n", elilo_opt.initrd);
-diff -Naur base/config.c elilo/config.c
---- base/config.c      2005-09-20 19:51:07.000000000 -0700
-+++ elilo/config.c     2005-09-20 19:33:26.000000000 -0700
-@@ -68,6 +68,7 @@
-       CHAR16  kname[FILENAME_MAXLEN];
-       CHAR16  options[MAX_STRING];
-       CHAR16  initrd[FILENAME_MAXLEN];
-+      CHAR16  vmcode[FILENAME_MAXLEN];
-       CHAR16  root[FILENAME_MAXLEN];
-       CHAR16  fallback[MAX_STRING];
-       CHAR16  description[MAX_STRING];
-@@ -93,6 +94,7 @@
- typedef struct {
-       CHAR16          root[FILENAME_MAXLEN];  /* globally defined root fs */
-       CHAR16          initrd[FILENAME_MAXLEN];/* globally defined initrd  */
-+      CHAR16          vmcode[FILENAME_MAXLEN];/* globally defined boot-time 
module  */
-       CHAR16          options[MAX_STRING];
-       CHAR16          default_image_name[MAX_STRING];
-       CHAR16          message_file[MAX_MESSAGES][FILENAME_MAXLEN]; 
-@@ -144,6 +146,7 @@
- {OPT_BOOL,    OPT_GLOBAL,     L"noedd30",     NULL,           NULL,           
        &global_config.edd30_no_force},
- {OPT_CMD,     OPT_GLOBAL,     L"append",      NULL,           NULL,           
        global_config.options},
- {OPT_FILE,    OPT_GLOBAL,     L"initrd",      NULL,           NULL,           
        global_config.initrd},
-+{OPT_FILE,    OPT_GLOBAL,     L"vmm",         NULL,           NULL,           
        global_config.vmcode},
- {OPT_FILE,    OPT_GLOBAL,     L"image",       do_image,       NULL,           
        opt_offsetof(kname)},
- {OPT_BOOL,    OPT_GLOBAL,     L"checkalt",    NULL,           NULL,           
        &global_config.alt_check},
- {OPT_STR,     OPT_GLOBAL,     L"chooser",     NULL,           check_chooser,  
        global_config.chooser},
-@@ -168,6 +171,7 @@
-     {OPT_CMD, OPT_IMAGE,      L"append",      do_options,     NULL,   
opt_offsetof(options)},
-     {OPT_CMD, OPT_IMAGE,      L"literal",     do_literal,     NULL,   NULL},
-     {OPT_FILE,        OPT_IMAGE,      L"initrd",      NULL,           NULL,   
opt_offsetof(initrd)},
-+    {OPT_FILE,        OPT_IMAGE,      L"vmm",         NULL,           NULL,   
opt_offsetof(vmcode)},
-     {OPT_STR, OPT_IMAGE,      L"label",       NULL,           NULL,   
opt_offsetof(label)},
-     {OPT_FILE,        OPT_IMAGE,      L"image",       do_image,       NULL,   
opt_offsetof(kname)},
-     {OPT_STR, OPT_IMAGE,      L"description", NULL,           NULL,   
opt_offsetof(description)},
-@@ -974,7 +978,7 @@
- }
- 
- INTN
--find_label(CHAR16 *label, CHAR16 *kname, CHAR16 *options, CHAR16 *initrd)
-+find_label(CHAR16 *label, CHAR16 *kname, CHAR16 *options, CHAR16 *initrd, 
CHAR16 *vmcode)
- {
-       boot_image_t *img;
- 
-@@ -1007,6 +1011,7 @@
-       if (global_config.readonly) StrCat(options, L" ro");
- 
-       if (global_config.initrd[0]) StrCpy(initrd, global_config.initrd);
-+      if (global_config.vmcode[0]) StrCpy(vmcode, global_config.vmcode);
- 
-       /* make sure we don't get garbage here */
-       elilo_opt.sys_img_opts = NULL;
-@@ -1044,12 +1049,17 @@
-       else if (global_config.initrd[0])
-               StrCpy(initrd, global_config.initrd);
- 
-+      if (img->vmcode[0]) 
-+              StrCpy(vmcode, img->vmcode);
-+      else if (global_config.vmcode[0])
-+              StrCpy(vmcode, global_config.vmcode);
-+
-       /*
-        * point to architecture dependent options for this image
-        */
-       elilo_opt.sys_img_opts = &img->sys_img_opts;
- 
--      DBG_PRT((L"label %s: kname=%s options=%s initrd=%s", img->label, kname, 
options, initrd));
-+      DBG_PRT((L"label %s: kname=%s options=%s initrd=%s vmcode=%s", 
img->label, kname, options, initrd, vmcode));
- 
-       return 0;
- }
-diff -Naur base/elilo.c elilo/elilo.c
---- base/elilo.c       2005-09-20 19:51:07.000000000 -0700
-+++ elilo/elilo.c      2005-09-20 19:33:41.000000000 -0700
-@@ -84,10 +84,23 @@
- }
- 
- INTN
--kernel_load(EFI_HANDLE image, CHAR16 *kname, kdesc_t *kd, memdesc_t *imem)
-+kernel_load(EFI_HANDLE image, CHAR16 *kname, kdesc_t *kd, memdesc_t *imem, 
memdesc_t *mmem)
- {
- 
-       /*
-+       * Do the vm image switch here
-+       * if there is "vmm=" then elilo should load image specified
-+       *    in "vmm=" and then give the "image" to vmm as target kernel image
-+       */
-+      if (elilo_opt.vmcode[0]) {
-+              CHAR16 buffer[CMDLINE_MAXLEN];
-+      VERB_PRT(1,Print(L"swapping vmm=%s with image=%s\n", elilo_opt.vmcode,
-+                      kname));
-+              StrCpy(buffer, kname);
-+              StrCpy(kname, elilo_opt.vmcode);
-+              StrCpy(elilo_opt.vmcode, buffer);
-+      }
-+      /*
-        * Now let's try to load the kernel !
-        */
-       switch(do_kernel_load(kname, kd)) {
-@@ -134,10 +147,32 @@
-                               return ELILO_LOAD_RETRY;
-               }
-       }
-+
-+      if (elilo_opt.vmcode[0]) {
-+
-+              mmem->start_addr = 0; /* let the allocator decide */
-+
-+              switch(load_initrd(elilo_opt.vmcode, mmem)) {
-+                      case ELILO_LOAD_SUCCESS:
-+                              break;
-+                      case ELILO_LOAD_ERROR:
-+                              goto exit_error;
-+                      case ELILO_LOAD_ABORTED:
-+                              free_kmem();
-+                              /* we drop initrd in case we aborted the load */
-+                              elilo_opt.vmcode[0] = CHAR_NULL;
-+                              elilo_opt.prompt    = 1; 
-+                              elilo_opt.timeout   = ELILO_DEFAULT_TIMEOUT;
-+                              elilo_opt.delay     = 0;
-+
-+                              return ELILO_LOAD_RETRY;
-+              }
-+      }
-       return ELILO_LOAD_SUCCESS;
- exit_error:
-       free_kmem();
-       if (imem->start_addr) free(imem->start_addr);
-+      if (mmem->start_addr) free(mmem->start_addr);
- 
-       return ELILO_LOAD_ERROR;
- }
-@@ -152,7 +187,7 @@
-       UINTN cookie;
-       EFI_STATUS status = EFI_SUCCESS;
-       kdesc_t kd;
--      memdesc_t imem;
-+      memdesc_t imem, mmem;
-       INTN r;
- 
-       /*
-@@ -169,7 +204,7 @@
- 
-               if (kernel_chooser(argv, argc, index, kname, cmdline_tmp) == 
-1) goto exit_error;
- 
--              switch (kernel_load(image, kname, &kd, &imem)) {
-+              switch (kernel_load(image, kname, &kd, &imem, &mmem)) {
-                       case ELILO_LOAD_SUCCESS: 
-                               goto do_launch;
-                       case ELILO_LOAD_ERROR:
-@@ -187,7 +222,7 @@
-       close_devices();
- 
-       /* No console output permitted after create_boot_params()! */
--      if ((bp=create_boot_params(cmdline, &imem, &cookie)) == 0) goto error;
-+      if ((bp=create_boot_params(cmdline, &imem, &mmem, &cookie)) == 0) goto 
error;
- 
-       /* terminate bootservices */
-       status = BS->ExitBootServices(image, cookie);
-@@ -221,6 +256,7 @@
-       Print(L"-v        verbose level(can appear multiple times)\n");
-       Print(L"-a        always check for alternate kernel image\n");
-       Print(L"-i file   load file as the initial ramdisk\n");
-+      Print(L"-m file   load file as additional boot time vmm module\n");
-       Print(L"-C file   indicate the config file to use\n");
-       Print(L"-P        parse config file only (verify syntax)\n");
-       Print(L"-D        enable debug prints\n");
-@@ -491,6 +527,13 @@
-                               }
-                               StrCpy(elilo_opt.initrd, Optarg);
-                               break;
-+                      case 'm':
-+                              if (StrLen(Optarg) >= FILENAME_MAXLEN-1) {
-+                                      Print(L"vmm module filename is limited 
to %d characters\n", FILENAME_MAXLEN);
-+                                      goto do_exit;
-+                              }
-+                              StrCpy(elilo_opt.vmcode, Optarg);
-+                              break;
-                       case 'C':
-                               if (StrLen(Optarg) >= FILENAME_MAXLEN-1) {
-                                       Print(L"config filename is limited to 
%d characters\n", FILENAME_MAXLEN);
-diff -Naur base/elilo.h elilo/elilo.h
---- base/elilo.h       2005-09-20 19:51:07.000000000 -0700
-+++ elilo/elilo.h      2005-09-20 19:32:19.000000000 -0700
-@@ -75,6 +75,7 @@
-       UINTN delay;            /* delay before booting the image */
-       UINTN verbose;          /* verbosity level [1-5] */
-       CHAR16 initrd[FILENAME_MAXLEN];         /* name of file for initial 
ramdisk */
-+      CHAR16 vmcode[FILENAME_MAXLEN]; /* name of file for boot time module*/
-       UINT8 delay_set;        /* mark whether or not delay was specified on 
cmdline */
-       UINT8 edd30_on;         /* true is EDD30 variable is TRUE */
-       UINT8 edd30_no_force;   /* don't force EDD30 variable to true */
-@@ -131,7 +132,7 @@
- #endif
- 
- #define VERB_PRT(n,cmd) \
--      { if (elilo_opt.verbose >= (n)) { cmd; } }
-+  { if (elilo_opt.verbose >= (n)) { cmd; } }
- 
- 
- /* from alloc.c */
-@@ -163,7 +164,7 @@
- /* from config.c (more in config.h) */
- extern EFI_STATUS read_config(CHAR16 *, INTN retry);
- extern VOID print_config_options(VOID);
--extern INTN find_label(CHAR16 *, CHAR16 *, CHAR16 *, CHAR16 *);
-+extern INTN find_label(CHAR16 *, CHAR16 *, CHAR16 *, CHAR16 *, CHAR16 *);
- extern VOID print_label_list(VOID);
- extern INTN config_init(VOID);
- extern CHAR16 *get_message_filename(INTN which);
-@@ -178,7 +179,7 @@
- extern INTN alternate_kernel(CHAR16 *, INTN);
- 
- /* from bootparams.c */
--extern VOID *create_boot_params (CHAR16 *, memdesc_t *, UINTN *);
-+extern VOID *create_boot_params (CHAR16 *, memdesc_t *, memdesc_t *, UINTN *);
- extern VOID free_boot_params(VOID *bp);
- 
- /*
-@@ -186,7 +187,7 @@
-  */
- 
- 
--extern INTN sysdeps_create_boot_params(boot_params_t *, CHAR8 *, memdesc_t *, 
UINTN *);
-+extern INTN sysdeps_create_boot_params(boot_params_t *, CHAR8 *, memdesc_t *, 
memdesc_t *, UINTN *);
- extern VOID sysdeps_free_boot_params(boot_params_t *);
- extern INTN sysdeps_init(EFI_HANDLE dev);
- extern INTN sysdeps_initrd_get_addr(kdesc_t *, memdesc_t *);
-diff -Naur base/ia32/system.c elilo/ia32/system.c
---- base/ia32/system.c 2005-09-20 19:51:07.000000000 -0700
-+++ elilo/ia32/system.c        2005-09-20 19:30:10.000000000 -0700
-@@ -408,6 +408,7 @@
-       boot_params_t *bp,
-       CHAR8 *cmdline,
-       memdesc_t *initrd,
-+      memdesc_t *vmcode, /* no use for ia32 now*/
-       UINTN *cookie)
- {
-       mmap_desc_t mdesc;
-diff -Naur base/ia64/sysdeps.h elilo/ia64/sysdeps.h
---- base/ia64/sysdeps.h        2005-09-20 19:51:07.000000000 -0700
-+++ elilo/ia64/sysdeps.h       2005-09-20 19:29:07.000000000 -0700
-@@ -65,8 +65,11 @@
-       UINTN initrd_start;             /* virtual address where the initial 
ramdisk begins */
-       UINTN initrd_size;              /* how big is the initial ramdisk */
- 
-+      UINTN vmcode_start;             /* virtual address where the boot time 
vmcode begins */
-+      UINTN vmcode_size;              /* how big is the boot module */
-       UINTN loader_addr;              /* start address of boot loader */
-       UINTN loader_size;              /* size of loader code & data */
-+
- } boot_params_t;
- 
- typedef struct sys_img_options {
-diff -Naur base/ia64/system.c elilo/ia64/system.c
---- base/ia64/system.c 2005-09-20 19:51:07.000000000 -0700
-+++ elilo/ia64/system.c        2005-09-20 19:29:28.000000000 -0700
-@@ -39,7 +39,7 @@
-  * IA-64 specific boot paramters initialization routine
-  */
- INTN
--sysdeps_create_boot_params(boot_params_t *bp, CHAR8 *cmdline, memdesc_t 
*initrd, UINTN *cookie)
-+sysdeps_create_boot_params(boot_params_t *bp, CHAR8 *cmdline, memdesc_t 
*initrd, memdesc_t *vmcode, UINTN *cookie)
- {
-       UINTN cols, rows;
-       SIMPLE_TEXT_OUTPUT_INTERFACE *conout;
-@@ -65,6 +65,11 @@
-       bp->command_line        = (UINTN)cmdline;
-       bp->initrd_start        = (UINTN) initrd->start_addr;
-       bp->initrd_size         = initrd->size;
-+      DBG_PRT((L"Got initrd @ 0x%lx (%d bytes)", initrd->start_addr, 
initrd->size));
-+
-+      bp->vmcode_start        = (UINTN) vmcode->start_addr;
-+      bp->vmcode_size         = vmcode->size;
-+      DBG_PRT((L"Got vmcode @ 0x%lx (%d bytes)", vmcode->start_addr, 
vmcode->size));
- 
-       /* fetch console parameters: */
-       conout = systab->ConOut;
diff -r b20641d24272 -r 4146dbea47e1 xen/include/asm-ia64/linux/asm/cache.h
--- a/xen/include/asm-ia64/linux/asm/cache.h    Sat Dec  3 12:21:27 2005
+++ /dev/null   Sat Dec  3 12:21:52 2005
@@ -1,30 +0,0 @@
-#ifndef _ASM_IA64_CACHE_H
-#define _ASM_IA64_CACHE_H
-
-#include <linux/config.h>
-
-/*
- * Copyright (C) 1998-2000 Hewlett-Packard Co
- *     David Mosberger-Tang <davidm@xxxxxxxxxx>
- */
-
-/* Bytes per L1 (data) cache line.  */
-#define L1_CACHE_SHIFT         CONFIG_IA64_L1_CACHE_SHIFT
-#define L1_CACHE_BYTES         (1 << L1_CACHE_SHIFT)
-
-#define L1_CACHE_SHIFT_MAX 7   /* largest L1 which this arch supports */
-
-#ifdef CONFIG_SMP
-# define SMP_CACHE_SHIFT       L1_CACHE_SHIFT
-# define SMP_CACHE_BYTES       L1_CACHE_BYTES
-#else
-  /*
-   * The "aligned" directive can only _increase_ alignment, so this is
-   * safe and provides an easy way to avoid wasting space on a
-   * uni-processor:
-   */
-# define SMP_CACHE_SHIFT       3
-# define SMP_CACHE_BYTES       (1 << 3)
-#endif
-
-#endif /* _ASM_IA64_CACHE_H */

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

<Prev in Thread] Current Thread [Next in Thread>