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

# HG changeset patch
# User kaf24@xxxxxxxxxxxxxxxxxxxx
# Node ID f294acb258585f9f42e292cf37a3d3ddff578217
# Parent  63995acdd34a8fd4e6c7fc622642c90729b458c3
# Parent  04dfb5158f3aa8eaa1efd36b358a1f1722e9b801
MErge.

diff -r 63995acdd34a -r f294acb25858 xen/arch/ia64/Makefile
--- a/xen/arch/ia64/Makefile    Wed Aug  3 09:35:16 2005
+++ b/xen/arch/ia64/Makefile    Wed Aug  3 09:35:38 2005
@@ -34,8 +34,27 @@
                 > $(BASEDIR)/System.map
 
 
-asm-offsets.s: asm-offsets.c $(BASEDIR)/include/asm-ia64/.offsets.h.stamp
+asm-offsets.s: asm-offsets.c $(BASEDIR)/include/asm-ia64/.offsets.h.stamp 
$(BASEDIR)/include/asm-ia64/asm-xsi-offsets.h
        $(CC) $(CFLAGS) -S -o $@ $<
+
+asm-xsi-offsets.s: asm-xsi-offsets.c 
+       $(CC) $(CFLAGS) -S -o $@ $<
+       
+$(BASEDIR)/include/asm-ia64/asm-xsi-offsets.h: asm-xsi-offsets.s
+       @(set -e; \
+         echo "/*"; \
+         echo " * DO NOT MODIFY."; \
+         echo " *"; \
+         echo " * This file was auto-generated from $<"; \
+         echo " *"; \
+         echo " */"; \
+         echo ""; \
+         echo "#ifndef __ASM_XSI_OFFSETS_H__"; \
+         echo "#define __ASM_XSI_OFFSETS_H__"; \
+         echo ""; \
+         sed -ne "/^->/{s:^->\([^ ]*\) [\$$#]*\([^ ]*\) \(.*\):#define \1 \2 
/* \3 */:; s:->::; p;}"; \
+         echo ""; \
+         echo "#endif") <$< >$@
 
 $(BASEDIR)/include/asm-ia64/.offsets.h.stamp:
 # Need such symbol link to make linux headers available
@@ -60,6 +79,7 @@
 
 clean:
        rm -f *.o *~ core  xen.lds.s 
$(BASEDIR)/include/asm-ia64/.offsets.h.stamp asm-offsets.s
+       rm -f asm-xsi-offsets.s $(BASEDIR)/include/asm-ia64/asm-xsi-offsets.h
        rm -f lib/*.o
 
 .PHONY: default clean
diff -r 63995acdd34a -r f294acb25858 xen/arch/ia64/asm-offsets.c
--- a/xen/arch/ia64/asm-offsets.c       Wed Aug  3 09:35:16 2005
+++ b/xen/arch/ia64/asm-offsets.c       Wed Aug  3 09:35:38 2005
@@ -42,29 +42,34 @@
 
        BLANK();
 
-       DEFINE(XSI_PSR_IC_OFS, offsetof(vcpu_info_t, 
arch.interrupt_collection_enabled));
-       DEFINE(XSI_PSR_IC, (SHAREDINFO_ADDR+offsetof(vcpu_info_t, 
arch.interrupt_collection_enabled)));
-       DEFINE(XSI_PSR_I_OFS, offsetof(vcpu_info_t, 
arch.interrupt_delivery_enabled));
-       DEFINE(XSI_IIP_OFS, offsetof(vcpu_info_t, arch.iip));
-       DEFINE(XSI_IFA_OFS, offsetof(vcpu_info_t, arch.ifa));
-       DEFINE(XSI_ITIR_OFS, offsetof(vcpu_info_t, arch.itir));
-       DEFINE(XSI_IPSR, (SHAREDINFO_ADDR+offsetof(vcpu_info_t, arch.ipsr)));
-       DEFINE(XSI_IPSR_OFS, offsetof(vcpu_info_t, arch.ipsr));
-       DEFINE(XSI_IFS_OFS, offsetof(vcpu_info_t, arch.ifs));
-       DEFINE(XSI_ISR_OFS, offsetof(vcpu_info_t, arch.isr));
-       DEFINE(XSI_IIM_OFS, offsetof(vcpu_info_t, arch.iim));
-       DEFINE(XSI_BANKNUM_OFS, offsetof(vcpu_info_t, arch.banknum));
-       DEFINE(XSI_BANK0_OFS, offsetof(vcpu_info_t, arch.bank0_regs[0]));
-       DEFINE(XSI_BANK1_OFS, offsetof(vcpu_info_t, arch.bank1_regs[0]));
-       DEFINE(XSI_RR0_OFS, offsetof(vcpu_info_t, arch.rrs[0]));
-       DEFINE(XSI_METAPHYS_OFS, offsetof(vcpu_info_t, arch.metaphysical_mode));
-       DEFINE(XSI_PRECOVER_IFS_OFS, offsetof(vcpu_info_t, arch.precover_ifs));
-       DEFINE(XSI_INCOMPL_REG_OFS, offsetof(vcpu_info_t, 
arch.incomplete_regframe));
-       DEFINE(XSI_PEND_OFS, offsetof(vcpu_info_t, arch.pending_interruption));
-       DEFINE(XSI_RR0_OFS, offsetof(vcpu_info_t, arch.rrs[0]));
-       DEFINE(XSI_TPR_OFS, offsetof(vcpu_info_t, arch.tpr));
-       DEFINE(XSI_PTA_OFS, offsetof (vcpu_info_t, arch.pta));
-       DEFINE(XSI_ITV_OFS, offsetof(vcpu_info_t, arch.itv));
+       DEFINE(XSI_PSR_IC_OFS, offsetof(mapped_regs_t, 
interrupt_collection_enabled));
+       DEFINE(XSI_PSR_IC, (SHARED_ARCHINFO_ADDR+offsetof(mapped_regs_t, 
interrupt_collection_enabled)));
+       DEFINE(XSI_PSR_I_OFS, offsetof(mapped_regs_t, 
interrupt_delivery_enabled));
+       DEFINE(XSI_IIP_OFS, offsetof(mapped_regs_t, iip));
+       DEFINE(XSI_IIP, (SHARED_ARCHINFO_ADDR+offsetof(mapped_regs_t, iip)));
+       DEFINE(XSI_IFA_OFS, offsetof(mapped_regs_t, ifa));
+       DEFINE(XSI_IFA, (SHARED_ARCHINFO_ADDR+offsetof(mapped_regs_t, ifa)));
+       DEFINE(XSI_ITIR_OFS, offsetof(mapped_regs_t, itir));
+       DEFINE(XSI_ITIR, (SHARED_ARCHINFO_ADDR+offsetof(mapped_regs_t, itir)));
+
+       DEFINE(XSI_IPSR, (SHARED_ARCHINFO_ADDR+offsetof(mapped_regs_t, ipsr)));
+       DEFINE(XSI_IPSR_OFS, offsetof(mapped_regs_t, ipsr));
+       DEFINE(XSI_IFS_OFS, offsetof(mapped_regs_t, ifs));
+       DEFINE(XSI_IFS, (SHARED_ARCHINFO_ADDR+offsetof(mapped_regs_t, ifs)));
+       DEFINE(XSI_ISR_OFS, offsetof(mapped_regs_t, isr));
+       DEFINE(XSI_IIM_OFS, offsetof(mapped_regs_t, iim));
+       DEFINE(XSI_BANKNUM_OFS, offsetof(mapped_regs_t, banknum));
+       DEFINE(XSI_BANK0_OFS, offsetof(mapped_regs_t, bank0_regs[0]));
+       DEFINE(XSI_BANK1_OFS, offsetof(mapped_regs_t, bank1_regs[0]));
+       DEFINE(XSI_RR0_OFS, offsetof(mapped_regs_t, rrs[0]));
+       DEFINE(XSI_METAPHYS_OFS, offsetof(mapped_regs_t, metaphysical_mode));
+       DEFINE(XSI_PRECOVER_IFS_OFS, offsetof(mapped_regs_t, precover_ifs));
+       DEFINE(XSI_INCOMPL_REG_OFS, offsetof(mapped_regs_t, 
incomplete_regframe));
+       DEFINE(XSI_PEND_OFS, offsetof(mapped_regs_t, pending_interruption));
+       DEFINE(XSI_RR0_OFS, offsetof(mapped_regs_t, rrs[0]));
+       DEFINE(XSI_TPR_OFS, offsetof(mapped_regs_t, tpr));
+       DEFINE(XSI_PTA_OFS, offsetof(mapped_regs_t, pta));
+       DEFINE(XSI_ITV_OFS, offsetof(mapped_regs_t, itv));
        //DEFINE(IA64_TASK_BLOCKED_OFFSET,offsetof (struct task_struct, 
blocked));
        //DEFINE(IA64_TASK_CLEAR_CHILD_TID_OFFSET,offsetof (struct task_struct, 
clear_child_tid));
        //DEFINE(IA64_TASK_GROUP_LEADER_OFFSET, offsetof (struct task_struct, 
group_leader));
diff -r 63995acdd34a -r f294acb25858 xen/arch/ia64/dom_fw.c
--- a/xen/arch/ia64/dom_fw.c    Wed Aug  3 09:35:16 2005
+++ b/xen/arch/ia64/dom_fw.c    Wed Aug  3 09:35:38 2005
@@ -291,6 +291,10 @@
        long r11 = 0;
        long status = -1;
 
+#define USE_PAL_EMULATOR
+#ifdef USE_PAL_EMULATOR
+       return pal_emulator_static(index);
+#endif
        if (running_on_sim) return pal_emulator_static(index);
        if (index >= PAL_COPY_PAL) {
                printk("xen_pal_emulator: UNIMPLEMENTED PAL CALL %d!!!!\n",
@@ -314,12 +318,10 @@
                break;
            case PAL_PTCE_INFO:
                {
-                       ia64_ptce_info_t ptce;
-                       status = ia64_get_ptce(&ptce);
-                       if (status != 0) break;
-                       r9 = ptce.base;
-                       r10 = (ptce.count[0]<<32)|(ptce.count[1]&0xffffffffL);
-                       r11 = (ptce.stride[0]<<32)|(ptce.stride[1]&0xffffffffL);
+                       // return hard-coded xen-specific values because ptc.e
+                       // is emulated on xen to always flush everything
+                       // these values result in only one ptc.e instruction
+                       status = 0; r9 = 0; r10 = (1L << 32) | 1L; r11 = 0;
                }
                break;
            case PAL_VERSION:
@@ -335,7 +337,10 @@
                status = ia64_pal_cache_summary(&r9,&r10);
                break;
            case PAL_VM_SUMMARY:
-               status = ia64_pal_vm_summary(&r9,&r10);
+               // FIXME: what should xen return for these, figure out later
+               // For now, linux does the right thing if pal call fails
+               // In particular, rid_size must be set properly!
+               //status = ia64_pal_vm_summary(&r9,&r10);
                break;
            case PAL_RSE_INFO:
                status = ia64_pal_rse_info(&r9,&r10);
diff -r 63995acdd34a -r f294acb25858 xen/arch/ia64/domain.c
--- a/xen/arch/ia64/domain.c    Wed Aug  3 09:35:16 2005
+++ b/xen/arch/ia64/domain.c    Wed Aug  3 09:35:38 2005
@@ -212,6 +212,10 @@
         */
 
        memset(d->shared_info, 0, PAGE_SIZE);
+       d->shared_info->vcpu_data[v->vcpu_id].arch.privregs = 
+                       alloc_xenheap_pages(get_order(sizeof(mapped_regs_t)));
+       printf("arch_vcpu_info=%p\n", 
d->shared_info->vcpu_data[0].arch.privregs);
+       memset(d->shared_info->vcpu_data[v->vcpu_id].arch.privregs, 0, 
PAGE_SIZE);
        v->vcpu_info = &d->shared_info->vcpu_data[v->vcpu_id];
        /* Mask all events, and specific port will be unmasked
         * when customer subscribes to it.
@@ -232,8 +236,8 @@
        /* FIXME: This is identity mapped address for xenheap. 
         * Do we need it at all?
         */
-       d->xen_vastart = 0xf000000000000000;
-       d->xen_vaend = 0xf300000000000000;
+       d->xen_vastart = XEN_START_ADDR;
+       d->xen_vaend = XEN_END_ADDR;
        d->arch.breakimm = 0x1000;
 }
 #else // CONFIG_VTI
@@ -252,12 +256,16 @@
                while (1);
        }
        memset(d->shared_info, 0, PAGE_SIZE);
+       d->shared_info->vcpu_data[0].arch.privregs = 
+                       alloc_xenheap_pages(get_order(sizeof(mapped_regs_t)));
+       printf("arch_vcpu_info=%p\n", 
d->shared_info->vcpu_data[0].arch.privregs);
+       memset(d->shared_info->vcpu_data[0].arch.privregs, 0, PAGE_SIZE);
        v->vcpu_info = &(d->shared_info->vcpu_data[0]);
 
-       d->max_pages = (128*1024*1024)/PAGE_SIZE; // 128MB default // FIXME
+       d->max_pages = (128UL*1024*1024)/PAGE_SIZE; // 128MB default // FIXME
        if ((d->arch.metaphysical_rr0 = allocate_metaphysical_rr0()) == -1UL)
                BUG();
-       v->vcpu_info->arch.metaphysical_mode = 1;
+       VCPU(v, metaphysical_mode) = 1;
        v->arch.metaphysical_rr0 = d->arch.metaphysical_rr0;
        v->arch.metaphysical_saved_rr0 = d->arch.metaphysical_rr0;
 #define DOMAIN_RID_BITS_DEFAULT 18
@@ -266,9 +274,9 @@
        v->arch.starting_rid = d->arch.starting_rid;
        v->arch.ending_rid = d->arch.ending_rid;
        // the following will eventually need to be negotiated dynamically
-       d->xen_vastart = 0xf000000000000000;
-       d->xen_vaend = 0xf300000000000000;
-       d->shared_info_va = 0xf100000000000000;
+       d->xen_vastart = XEN_START_ADDR;
+       d->xen_vaend = XEN_END_ADDR;
+       d->shared_info_va = SHAREDINFO_ADDR;
        d->arch.breakimm = 0x1000;
        v->arch.breakimm = d->arch.breakimm;
 
@@ -292,7 +300,15 @@
 
        printf("arch_getdomaininfo_ctxt\n");
        c->regs = *regs;
-       c->vcpu = v->vcpu_info->arch;
+       c->vcpu.evtchn_vector = v->vcpu_info->arch.evtchn_vector;
+#if 0
+       if (c->vcpu.privregs && copy_to_user(c->vcpu.privregs,
+                       v->vcpu_info->arch.privregs, sizeof(mapped_regs_t))) {
+               printk("Bad ctxt address: 0x%lx\n", c->vcpu.privregs);
+               return -EFAULT;
+       }
+#endif
+
        c->shared = v->domain->shared_info->arch;
 }
 
@@ -307,13 +323,20 @@
        regs->cr_ipsr |= 2UL << IA64_PSR_CPL0_BIT;
        regs->ar_rsc |= (2 << 2); /* force PL2/3 */
 
-       v->vcpu_info->arch = c->vcpu;
+       v->vcpu_info->arch.evtchn_vector = c->vcpu.evtchn_vector;
+       if ( c->vcpu.privregs && copy_from_user(v->vcpu_info->arch.privregs,
+                          c->vcpu.privregs, sizeof(mapped_regs_t))) {
+           printk("Bad ctxt address in arch_set_info_guest: 0x%lx\n", 
c->vcpu.privregs);
+           return -EFAULT;
+       }
+
        init_all_rr(v);
 
        // this should be in userspace
-       regs->r28 = dom_fw_setup(v->domain,"nomca nosmp xencons=ttyS 
console=ttyS0",256L);  //FIXME
-       v->vcpu_info->arch.banknum = 1;
-       v->vcpu_info->arch.metaphysical_mode = 1;
+       regs->r28 = dom_fw_setup(v->domain,"nomca nosmp xencons=tty0 
console=tty0 root=/dev/hda1",256L);  //FIXME
+       v->arch.domain_itm_last = -1L;
+       VCPU(v, banknum) = 1;
+       VCPU(v, metaphysical_mode) = 1;
 
        v->domain->shared_info->arch = c->shared;
        return 0;
@@ -325,6 +348,7 @@
     struct domain *d = v->domain;
     int i, rc, ret;
     unsigned long progress = 0;
+    shared_iopage_t *sp;
 
     if ( test_bit(_VCPUF_initialised, &v->vcpu_flags) )
         return 0;
@@ -350,8 +374,17 @@
     /* FIXME: only support PMT table continuously by far */
     d->arch.pmt = __va(c->pt_base);
     d->arch.max_pfn = c->pt_max_pfn;
-    v->arch.arch_vmx.vmx_platform.shared_page_va = __va(c->share_io_pg);
-    memset((char *)__va(c->share_io_pg),0,PAGE_SIZE);
+    d->arch.vmx_platform.shared_page_va = __va(c->share_io_pg);
+    sp = get_sp(d);
+    memset((char *)sp,0,PAGE_SIZE);
+    /* FIXME: temp due to old CP */
+    sp->sp_global.eport = 2;
+#ifdef V_IOSAPIC_READY
+    sp->vcpu_number = 1;
+#endif
+    /* TEMP */
+    d->arch.vmx_platform.pib_base = 0xfee00000UL;
+    
 
     if (c->flags & VGCF_VMX_GUEST) {
        if (!vmx_enabled)
@@ -370,7 +403,7 @@
     if (v == d->vcpu[0]) {
        memset(&d->shared_info->evtchn_mask[0], 0xff,
                sizeof(d->shared_info->evtchn_mask));
-       clear_bit(IOPACKET_PORT, &d->shared_info->evtchn_mask[0]);
+       clear_bit(iopacket_port(d), &d->shared_info->evtchn_mask[0]);
     }
     /* Setup domain context. Actually IA-64 is a bit different with
      * x86, with almost all system resources better managed by HV
@@ -380,8 +413,8 @@
     new_thread(v, c->guest_iip, 0, 0);
 
 
-    d->xen_vastart = 0xf000000000000000;
-    d->xen_vaend = 0xf300000000000000;
+    d->xen_vastart = XEN_START_ADDR;
+    d->xen_vaend = XEN_END_ADDR;
     d->arch.breakimm = 0x1000 + d->domain_id;
     v->arch._thread.on_ustack = 0;
 
@@ -394,7 +427,13 @@
 
 void arch_do_boot_vcpu(struct vcpu *v)
 {
+       struct domain *d = v->domain;
        printf("arch_do_boot_vcpu: not implemented\n");
+
+       d->shared_info->vcpu_data[v->vcpu_id].arch.privregs = 
+                       alloc_xenheap_pages(get_order(sizeof(mapped_regs_t)));
+       printf("arch_vcpu_info=%p\n", 
d->shared_info->vcpu_data[v->vcpu_id].arch.privregs);
+       memset(d->shared_info->vcpu_data[v->vcpu_id].arch.privregs, 0, 
PAGE_SIZE);
        return;
 }
 
@@ -449,8 +488,8 @@
                VPD_CR(v, dcr) = 0;
        } else {
                regs->r28 = dom_fw_setup(d,saved_command_line,256L);
-               v->vcpu_info->arch.banknum = 1;
-               v->vcpu_info->arch.metaphysical_mode = 1;
+               VCPU(v, banknum) = 1;
+               VCPU(v, metaphysical_mode) = 1;
                d->shared_info->arch.flags = (d == dom0) ? 
(SIF_INITDOMAIN|SIF_PRIVILEGED|SIF_BLK_BE_DOMAIN|SIF_NET_BE_DOMAIN|SIF_USB_BE_DOMAIN)
 : 0;
        }
 }
@@ -482,8 +521,8 @@
        regs->ar_fpsr = FPSR_DEFAULT;
        init_all_rr(v);
        regs->r28 = dom_fw_setup(d,saved_command_line,256L);  //FIXME
-       v->vcpu_info->arch.banknum = 1;
-       v->vcpu_info->arch.metaphysical_mode = 1;
+       VCPU(v, banknum) = 1;
+       VCPU(v, metaphysical_mode) = 1;
        d->shared_info->arch.flags = (d == dom0) ? 
(SIF_INITDOMAIN|SIF_PRIVILEGED|SIF_BLK_BE_DOMAIN|SIF_NET_BE_DOMAIN|SIF_USB_BE_DOMAIN)
 : 0;
 }
 #endif // CONFIG_VTI
@@ -894,7 +933,6 @@
 
     /* Set up shared-info area. */
     update_dom_time(d);
-    d->shared_info->domain_time = 0;
 
     /* Mask all upcalls... */
     for ( i = 0; i < MAX_VIRT_CPUS; i++ )
@@ -1072,12 +1110,12 @@
 #endif
     serial_input_init();
     if (d == dom0) {
-       v->vcpu_info->arch.delivery_mask[0] = -1L;
-       v->vcpu_info->arch.delivery_mask[1] = -1L;
-       v->vcpu_info->arch.delivery_mask[2] = -1L;
-       v->vcpu_info->arch.delivery_mask[3] = -1L;
+       VCPU(v, delivery_mask[0]) = -1L;
+       VCPU(v, delivery_mask[1]) = -1L;
+       VCPU(v, delivery_mask[2]) = -1L;
+       VCPU(v, delivery_mask[3]) = -1L;
     }
-    else __set_bit(0x30,v->vcpu_info->arch.delivery_mask);
+    else __set_bit(0x30,VCPU(v, delivery_mask));
 
     return 0;
 }
@@ -1233,12 +1271,12 @@
 #endif
        serial_input_init();
        if (d == dom0) {
-               v->vcpu_info->arch.delivery_mask[0] = -1L;
-               v->vcpu_info->arch.delivery_mask[1] = -1L;
-               v->vcpu_info->arch.delivery_mask[2] = -1L;
-               v->vcpu_info->arch.delivery_mask[3] = -1L;
-       }
-       else __set_bit(0x30,v->vcpu_info->arch.delivery_mask);
+               VCPU(v, delivery_mask[0]) = -1L;
+               VCPU(v, delivery_mask[1]) = -1L;
+               VCPU(v, delivery_mask[2]) = -1L;
+               VCPU(v, delivery_mask[3]) = -1L;
+       }
+       else __set_bit(0x30, VCPU(v, delivery_mask));
 
        return 0;
 }
@@ -1285,7 +1323,7 @@
 #endif
        new_thread(v, pkern_entry, 0, 0);
        printk("new_thread returns\n");
-       __set_bit(0x30,v->vcpu_info->arch.delivery_mask);
+       __set_bit(0x30, VCPU(v, delivery_mask));
 
        return 0;
 }
diff -r 63995acdd34a -r f294acb25858 xen/arch/ia64/hypercall.c
--- a/xen/arch/ia64/hypercall.c Wed Aug  3 09:35:16 2005
+++ b/xen/arch/ia64/hypercall.c Wed Aug  3 09:35:38 2005
@@ -41,13 +41,13 @@
                // to a yet-to-be-found bug where pending_interruption
                // is zero when it shouldn't be. Since PAL is called
                // in the idle loop, this should resolve it
-               v->vcpu_info->arch.pending_interruption = 1;
+               VCPU(v,pending_interruption) = 1;
 #endif
                if (regs->r28 == PAL_HALT_LIGHT) {
 #define SPURIOUS_VECTOR 15
                        pi = vcpu_check_pending_interrupts(v);
                        if (pi != SPURIOUS_VECTOR) {
-                               if (!v->vcpu_info->arch.pending_interruption)
+                               if (!VCPU(v,pending_interruption))
                                        idle_when_pending++;
                                vcpu_pend_unspecified_interrupt(v);
 //printf("idle w/int#%d pending!\n",pi);
diff -r 63995acdd34a -r f294acb25858 xen/arch/ia64/hyperprivop.S
--- a/xen/arch/ia64/hyperprivop.S       Wed Aug  3 09:35:16 2005
+++ b/xen/arch/ia64/hyperprivop.S       Wed Aug  3 09:35:38 2005
@@ -18,11 +18,17 @@
 #define FAST_HYPERPRIVOPS
 #define FAST_HYPERPRIVOP_CNT
 #define FAST_REFLECT_CNT
-#define FAST_TICK
+//#define FAST_TICK
 #define FAST_BREAK
 #define FAST_ACCESS_REFLECT
+#define FAST_RFI
+#define FAST_SSM_I
+#define FAST_PTC_GA
 #undef RFI_TO_INTERRUPT // not working yet
 #endif
+
+// FIXME: turn off for now... but NaTs may crash Xen so re-enable soon!
+//#define HANDLE_AR_UNAT
 
 // FIXME: This is defined in include/asm-ia64/hw_irq.h but this
 // doesn't appear to be include'able from assembly?
@@ -183,6 +189,9 @@
 //     r19 == vpsr.ic (low 32 bits) | vpsr.i (high 32 bits)
 //     r31 == pr
 ENTRY(hyper_ssm_i)
+#ifndef FAST_SSM_I
+       br.spnt.few dispatch_break_fault ;;
+#endif
        // give up for now if: ipsr.be==1, ipsr.pp==1
        mov r30=cr.ipsr;;
        mov r29=cr.iip;;
@@ -259,7 +268,8 @@
        adds r2=XSI_BANK1_OFS-XSI_PSR_IC_OFS,r18;
        adds r3=(XSI_BANK1_OFS+8)-XSI_PSR_IC_OFS,r18;;
        bsw.1;;
-       // FIXME: need to handle ar.unat!
+       // FIXME?: ar.unat is not really handled correctly,
+       // but may not matter if the OS is NaT-clean
        .mem.offset 0,0; st8.spill [r2]=r16,16;
        .mem.offset 8,0; st8.spill [r3]=r17,16 ;;
        .mem.offset 0,0; st8.spill [r2]=r18,16;
@@ -425,10 +435,12 @@
        mov cr.iip=r24;;
        // OK, now all set to go except for switch to virtual bank0
        mov r30=r2; mov r29=r3;;
+#ifdef HANDLE_AR_UNAT
+       mov r28=ar.unat;
+#endif
        adds r2=XSI_BANK1_OFS-XSI_PSR_IC_OFS,r18;
        adds r3=(XSI_BANK1_OFS+8)-XSI_PSR_IC_OFS,r18;;
        bsw.1;;
-       // FIXME: need to handle ar.unat!
        .mem.offset 0,0; st8.spill [r2]=r16,16;
        .mem.offset 8,0; st8.spill [r3]=r17,16 ;;
        .mem.offset 0,0; st8.spill [r2]=r18,16;
@@ -445,9 +457,18 @@
        .mem.offset 8,0; st8.spill [r3]=r29,16 ;;
        .mem.offset 0,0; st8.spill [r2]=r30,16;
        .mem.offset 8,0; st8.spill [r3]=r31,16 ;;
-       movl r31=XSI_IPSR;;
+#ifdef HANDLE_AR_UNAT
+       // bank0 regs have no NaT bit, so ensure they are NaT clean
+       mov r16=r0; mov r17=r0; mov r18=r0; mov r19=r0;
+       mov r20=r0; mov r21=r0; mov r22=r0; mov r23=r0;
+       mov r24=r0; mov r25=r0; mov r26=r0; mov r27=r0;
+       mov r28=r0; mov r29=r0; mov r30=r0; movl r31=XSI_IPSR;;
+#endif
        bsw.0 ;;
        mov r2=r30; mov r3=r29;;
+#ifdef HANDLE_AR_UNAT
+       mov ar.unat=r28;
+#endif
        adds r20=XSI_BANKNUM_OFS-XSI_PSR_IC_OFS,r18 ;;
        st4 [r20]=r0 ;;
 fast_tick_reflect_done:
@@ -567,10 +588,12 @@
        mov cr.iip=r20;;
        // OK, now all set to go except for switch to virtual bank0
        mov r30=r2; mov r29=r3;;
+#ifdef HANDLE_AR_UNAT
+       mov r28=ar.unat;
+#endif
        adds r2=XSI_BANK1_OFS-XSI_PSR_IC_OFS,r18;
        adds r3=(XSI_BANK1_OFS+8)-XSI_PSR_IC_OFS,r18;;
        bsw.1;;
-       // FIXME: need to handle ar.unat!
        .mem.offset 0,0; st8.spill [r2]=r16,16;
        .mem.offset 8,0; st8.spill [r3]=r17,16 ;;
        .mem.offset 0,0; st8.spill [r2]=r18,16;
@@ -587,9 +610,19 @@
        .mem.offset 8,0; st8.spill [r3]=r29,16 ;;
        .mem.offset 0,0; st8.spill [r2]=r30,16;
        .mem.offset 8,0; st8.spill [r3]=r31,16 ;;
+#ifdef HANDLE_AR_UNAT
+       // bank0 regs have no NaT bit, so ensure they are NaT clean
+       mov r16=r0; mov r17=r0; mov r18=r0; mov r19=r0;
+       mov r20=r0; mov r21=r0; mov r22=r0; mov r23=r0;
+       mov r24=r0; mov r25=r0; mov r26=r0; mov r27=r0;
+       mov r28=r0; mov r29=r0; mov r30=r0; movl r31=XSI_IPSR;;
+#endif
        movl r31=XSI_IPSR;;
        bsw.0 ;;
        mov r2=r30; mov r3=r29;;
+#ifdef HANDLE_AR_UNAT
+       mov ar.unat=r28;
+#endif
        adds r20=XSI_BANKNUM_OFS-XSI_PSR_IC_OFS,r18 ;;
        st4 [r20]=r0 ;;
        mov pr=r31,-1 ;;
@@ -637,6 +670,9 @@
 
 // ensure that, if giving up, registers at entry to fast_hyperprivop unchanged
 ENTRY(hyper_rfi)
+#ifndef FAST_RFI
+       br.spnt.few dispatch_break_fault ;;
+#endif
        // if no interrupts pending, proceed
        mov r30=r0
        cmp.eq p7,p0=r20,r0
@@ -736,7 +772,8 @@
        adds r2=XSI_BANK1_OFS-XSI_PSR_IC_OFS,r18;
        adds r3=(XSI_BANK1_OFS+8)-XSI_PSR_IC_OFS,r18;;
        bsw.1;;
-       // FIXME: need to handle ar.unat!
+       // FIXME?: ar.unat is not really handled correctly,
+       // but may not matter if the OS is NaT-clean
        .mem.offset 0,0; ld8.fill r16=[r2],16 ;
        .mem.offset 8,0; ld8.fill r17=[r3],16 ;;
        .mem.offset 0,0; ld8.fill r18=[r2],16 ;
@@ -1461,6 +1498,9 @@
 #ifdef CONFIG_SMP
 FIXME: ptc.ga instruction requires spinlock for SMP
 #endif
+#ifndef FAST_PTC_GA
+       br.spnt.few dispatch_break_fault ;;
+#endif
        // FIXME: validate not flushing Xen addresses
 #ifdef FAST_HYPERPRIVOP_CNT
        movl r20=fast_hyperpriv_cnt+(8*XEN_HYPER_PTC_GA);;
diff -r 63995acdd34a -r f294acb25858 xen/arch/ia64/mmio.c
--- a/xen/arch/ia64/mmio.c      Wed Aug  3 09:35:16 2005
+++ b/xen/arch/ia64/mmio.c      Wed Aug  3 09:35:38 2005
@@ -66,7 +66,7 @@
     default:
         if ( PIB_LOW_HALF(pib_off) ) {   // lower half
             if ( s != 8 || ma != 0x4 /* UC */ ) {
-                panic("Undefined IPI-LHF write!\n");
+                panic("Undefined IPI-LHF write with s %d, ma %d!\n", s, ma);
             }
             else {
                 write_ipi(vcpu, pib_off, *(uint64_t *)src);
@@ -135,13 +135,13 @@
     ioreq_t *p;
     unsigned long addr;
 
-    vio = (vcpu_iodata_t *) v->arch.arch_vmx.vmx_platform.shared_page_va;
+    vio = get_vio(v->domain, v->vcpu_id);
     if (vio == 0) {
         panic("bad shared page: %lx", (unsigned long)vio);
     }
     p = &vio->vp_ioreq;
     p->addr = pa;
-    p->size = 1<<s;
+    p->size = s;
     p->count = 1;
     p->dir = dir;
     if(dir==IOREQ_WRITE)     //write;
@@ -152,9 +152,9 @@
 
     set_bit(ARCH_VMX_IO_WAIT, &v->arch.arch_vmx.flags);
     p->state = STATE_IOREQ_READY;
-    evtchn_send(IOPACKET_PORT);
+    evtchn_send(iopacket_port(v->domain));
     vmx_wait_io();
-    if(dir){ //read
+    if(dir==IOREQ_READ){ //read
         *val=p->u.data;
     }
     return;
@@ -168,13 +168,13 @@
     ioreq_t *p;
     unsigned long addr;
 
-    vio = (vcpu_iodata_t *) v->arch.arch_vmx.vmx_platform.shared_page_va;
+    vio = get_vio(v->domain, v->vcpu_id);
     if (vio == 0) {
         panic("bad shared page: %lx");
     }
     p = &vio->vp_ioreq;
     p->addr = TO_LEGACY_IO(pa&0x3ffffffUL);
-    p->size = 1<<s;
+    p->size = s;
     p->count = 1;
     p->dir = dir;
     if(dir==IOREQ_WRITE)     //write;
@@ -185,11 +185,20 @@
 
     set_bit(ARCH_VMX_IO_WAIT, &v->arch.arch_vmx.flags);
     p->state = STATE_IOREQ_READY;
-    evtchn_send(IOPACKET_PORT);
+    evtchn_send(iopacket_port(v->domain));
+
     vmx_wait_io();
-    if(dir){ //read
+    if(dir==IOREQ_READ){ //read
         *val=p->u.data;
     }
+#ifdef DEBUG_PCI
+    if(dir==IOREQ_WRITE)
+        if(p->addr == 0xcf8UL)
+            printk("Write 0xcf8, with val [0x%lx]\n", p->u.data);
+    else
+        if(p->addr == 0xcfcUL)
+            printk("Read 0xcfc, with val [0x%lx]\n", p->u.data);
+#endif //DEBUG_PCI
     return;
 }
 
@@ -204,12 +213,13 @@
     switch (iot) {
     case GPFN_PIB:
         if(!dir)
-            pib_write(vcpu, src_pa - v_plat->pib_base, dest, s, ma);
+            pib_write(vcpu, dest, src_pa - v_plat->pib_base, s, ma);
         else
             pib_read(vcpu, src_pa - v_plat->pib_base, dest, s, ma);
         break;
     case GPFN_GFW:
         break;
+    case GPFN_IOSAPIC:
     case GPFN_FRAME_BUFFER:
     case GPFN_LOW_MMIO:
         low_mmio_access(vcpu, src_pa, dest, s, dir);
@@ -217,7 +227,6 @@
     case GPFN_LEGACY_IO:
         legacy_io_access(vcpu, src_pa, dest, s, dir);
         break;
-    case GPFN_IOSAPIC:
     default:
         panic("Bad I/O access\n");
         break;
@@ -342,6 +351,8 @@
        LID       lid;
        for (i=0; i<MAX_VIRT_CPUS; i++) {
                vcpu = d->vcpu[i];
+               if (!vcpu)
+                       continue;
                lid.val = VPD_CR(vcpu, lid);
                if ( lid.id == id && lid.eid == eid ) {
                    return vcpu;
@@ -379,15 +390,16 @@
     inst_type 0:integer 1:floating point
  */
 extern IA64_BUNDLE __vmx_get_domain_bundle(u64 iip);
-
+#define SL_INTEGER  0        // store/load interger
+#define SL_FLOATING    1       // store/load floating
 
 void emulate_io_inst(VCPU *vcpu, u64 padr, u64 ma)
 {
     REGS *regs;
     IA64_BUNDLE bundle;
-    int slot, dir, inst_type=0;
+    int slot, dir, inst_type;
     size_t size;
-    u64 data, value, slot1a, slot1b;
+    u64 data, value,post_update, slot1a, slot1b, temp;
     INST64 inst;
     regs=vcpu_regs(vcpu);
     bundle = __vmx_get_domain_bundle(regs->cr_iip);
@@ -400,28 +412,70 @@
     }
     else if (slot == 2) inst.inst = bundle.slot2;
 
+
+    // Integer Load/Store
     if(inst.M1.major==4&&inst.M1.m==0&&inst.M1.x==0){
-        inst_type=0;  //fp
+        inst_type = SL_INTEGER;  //
         size=(inst.M1.x6&0x3);
         if((inst.M1.x6>>2)>0xb){      // write
+            dir=IOREQ_WRITE;     //write
             vmx_vcpu_get_gr(vcpu,inst.M4.r2,&data);
+        }else if((inst.M1.x6>>2)<0xb){   //  read
+            dir=IOREQ_READ;
+            vmx_vcpu_get_gr(vcpu,inst.M1.r1,&value);
+        }
+    }
+    // Integer Load + Reg update
+    else if(inst.M2.major==4&&inst.M2.m==1&&inst.M2.x==0){
+        inst_type = SL_INTEGER;
+        dir = IOREQ_READ;     //write
+        size = (inst.M2.x6&0x3);
+        vmx_vcpu_get_gr(vcpu,inst.M2.r1,&value);
+        vmx_vcpu_get_gr(vcpu,inst.M2.r3,&temp);
+        vmx_vcpu_get_gr(vcpu,inst.M2.r2,&post_update);
+        temp += post_update;
+        vmx_vcpu_set_gr(vcpu,inst.M2.r3,temp,0);
+    }
+    // Integer Load/Store + Imm update
+    else if(inst.M3.major==5){
+        inst_type = SL_INTEGER;  //
+        size=(inst.M3.x6&0x3);
+        if((inst.M5.x6>>2)>0xb){      // write
             dir=IOREQ_WRITE;     //write
-        }else if((inst.M1.x6>>2)<0xb){   //  read
-            vmx_vcpu_get_gr(vcpu,inst.M1.r1,&value);
+            vmx_vcpu_get_gr(vcpu,inst.M5.r2,&data);
+            vmx_vcpu_get_gr(vcpu,inst.M5.r3,&temp);
+            post_update = (inst.M5.i<<7)+inst.M5.imm7;
+            if(inst.M5.s)
+                temp -= post_update;
+            else
+                temp += post_update;
+            vmx_vcpu_set_gr(vcpu,inst.M5.r3,temp,0);
+
+        }else if((inst.M3.x6>>2)<0xb){   //  read
             dir=IOREQ_READ;
-        }else{
-            printf("This memory access instruction can't be emulated one : 
%lx\n",inst.inst);
-            while(1);
-        }
-    }else if(inst.M6.major==6&&inst.M6.m==0&&inst.M6.x==0&&inst.M6.x6==3){
-        inst_type=1;  //fp
-        dir=IOREQ_READ;
-        size=3;     //ldfd
-    }else{
+            vmx_vcpu_get_gr(vcpu,inst.M3.r1,&value);
+            vmx_vcpu_get_gr(vcpu,inst.M3.r3,&temp);
+            post_update = (inst.M3.i<<7)+inst.M3.imm7;
+            if(inst.M3.s)
+                temp -= post_update;
+            else
+                temp += post_update;
+            vmx_vcpu_set_gr(vcpu,inst.M3.r3,temp,0);
+
+        }
+    }
+    // Floating-point Load/Store
+//    else if(inst.M6.major==6&&inst.M6.m==0&&inst.M6.x==0&&inst.M6.x6==3){
+//        inst_type=SL_FLOATING;  //fp
+//        dir=IOREQ_READ;
+//        size=3;     //ldfd
+//    }
+    else{
         printf("This memory access instruction can't be emulated two: %lx\n 
",inst.inst);
         while(1);
     }
 
+    size = 1 << size;
     if(dir==IOREQ_WRITE){
         mmio_access(vcpu, padr, &data, size, ma, dir);
     }else{
@@ -433,7 +487,7 @@
         else if(size==2)
             data = (value & 0xffffffff00000000U) | (data & 0xffffffffU);
 
-        if(inst_type==0){       //gp
+        if(inst_type==SL_INTEGER){       //gp
             vmx_vcpu_set_gr(vcpu,inst.M1.r1,data,0);
         }else{
             panic("Don't support ldfd now !");
diff -r 63995acdd34a -r f294acb25858 xen/arch/ia64/pal_emul.c
--- a/xen/arch/ia64/pal_emul.c  Wed Aug  3 09:35:16 2005
+++ b/xen/arch/ia64/pal_emul.c  Wed Aug  3 09:35:38 2005
@@ -1,7 +1,21 @@
-/* PAL/SAL call delegation
+/*
+ * PAL/SAL call delegation
  *
  * Copyright (c) 2004 Li Susie <susie.li@xxxxxxxxx>
  * Copyright (c) 2005 Yu Ke <ke.yu@xxxxxxxxx>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
  */
 
 #include <asm/vmx_vcpu.h>
@@ -98,23 +112,6 @@
 
 static struct ia64_pal_retval
 pal_halt_light (VCPU *vcpu) {
-#if 0  
-       // GVMM will go back to HVMM and ask HVMM to call yield().
-       vmmdata.p_ctlblk->status = VM_OK;
-       vmmdata.p_ctlblk->ctlcode = ExitVM_YIELD;
-
-       vmm_transition((UINT64)&vmmdata.p_gsa->guest,
-                       (UINT64)&vmmdata.p_gsa->host,
-                       (UINT64) vmmdata.p_tramp,0,0);
-
-
-       result.status = 0;
-       result.pal_result[0]=0;
-       result.pal_result[1]=0;
-       result.pal_result[2]=0;
-
-       return result;
-#endif
        struct ia64_pal_retval result;
 
        result.status= -1; //unimplemented
diff -r 63995acdd34a -r f294acb25858 xen/arch/ia64/patch/linux-2.6.11/irq_ia64.c
--- a/xen/arch/ia64/patch/linux-2.6.11/irq_ia64.c       Wed Aug  3 09:35:16 2005
+++ b/xen/arch/ia64/patch/linux-2.6.11/irq_ia64.c       Wed Aug  3 09:35:38 2005
@@ -20,11 +20,19 @@
                        __do_IRQ(local_vector_to_irq(vector), regs);
  
                        /*
-@@ -167,6 +173,95 @@
+@@ -167,6 +173,103 @@
        irq_exit();
  }
  
 +#ifdef  CONFIG_VTI
++#define vmx_irq_enter()               \
++      add_preempt_count(HARDIRQ_OFFSET);
++
++/* Now softirq will be checked when leaving hypervisor, or else
++ * scheduler irq will be executed too early.
++ */
++#define vmx_irq_exit(void)    \
++      sub_preempt_count(HARDIRQ_OFFSET);
 +/*
 + * That's where the IVT branches when we get an external
 + * interrupt. This branches to the correct hardware IRQ handler via
@@ -72,7 +80,7 @@
 +       * 16 (without this, it would be ~240, which could easily lead
 +       * to kernel stack overflows).
 +       */
-+      irq_enter();
++      vmx_irq_enter();
 +      saved_tpr = ia64_getreg(_IA64_REG_CR_TPR);
 +      ia64_srlz_d();
 +      while (vector != IA64_SPURIOUS_INT_VECTOR) {
@@ -106,7 +114,7 @@
 +       * handler needs to be able to wait for further keyboard interrupts, 
which can't
 +       * come through until ia64_eoi() has been done.
 +       */
-+      irq_exit();
++      vmx_irq_exit();
 +      if ( wake_dom0 && current != dom0 ) 
 +              domain_wake(dom0->vcpu[0]);
 +}
diff -r 63995acdd34a -r f294acb25858 xen/arch/ia64/patch/linux-2.6.11/kregs.h
--- a/xen/arch/ia64/patch/linux-2.6.11/kregs.h  Wed Aug  3 09:35:16 2005
+++ b/xen/arch/ia64/patch/linux-2.6.11/kregs.h  Wed Aug  3 09:35:38 2005
@@ -1,6 +1,6 @@
 --- 
/home/adsharma/disk2/xen-ia64/xeno-unstable-rebase.bk/xen/../../linux-2.6.11/include/asm-ia64/kregs.h
      2005-03-01 23:37:49.000000000 -0800
 +++ 
/home/adsharma/disk2/xen-ia64/xeno-unstable-rebase.bk/xen/include/asm-ia64/kregs.h
 2005-05-18 12:40:50.000000000 -0700
-@@ -29,8 +29,20 @@
+@@ -29,8 +29,21 @@
   */
  #define IA64_TR_KERNEL                0       /* itr0, dtr0: maps kernel 
image (code & data) */
  #define IA64_TR_PALCODE               1       /* itr1: maps PALcode as 
required by EFI */
@@ -12,6 +12,7 @@
 +#ifdef XEN
 +#define IA64_TR_SHARED_INFO   3       /* dtr3: page shared with domain */
 +#define       IA64_TR_VHPT            4       /* dtr4: vhpt */
++#define IA64_TR_ARCH_INFO      5
 +#ifdef CONFIG_VTI
 +#define IA64_TR_VHPT_IN_DOM   5       /* dtr5: Double mapping for vhpt table 
in domain space */
 +#define IA64_TR_RR7_SWITCH_STUB       7       /* dtr7: mapping for rr7 switch 
stub */
diff -r 63995acdd34a -r f294acb25858 xen/arch/ia64/process.c
--- a/xen/arch/ia64/process.c   Wed Aug  3 09:35:16 2005
+++ b/xen/arch/ia64/process.c   Wed Aug  3 09:35:38 2005
@@ -50,7 +50,7 @@
                        IA64_PSR_ID | IA64_PSR_DA | IA64_PSR_DD | \
                        IA64_PSR_SS | IA64_PSR_RI | IA64_PSR_ED | IA64_PSR_IA)
 
-#define PSCB(x,y)      x->vcpu_info->arch.y
+#define PSCB(x,y)      VCPU(x,y)
 #define PSCBX(x,y)     x->arch.y
 
 extern unsigned long vcpu_verbose;
@@ -226,7 +226,7 @@
 #ifdef CONFIG_SMP
 #error "sharedinfo doesn't handle smp yet"
 #endif
-       regs->r31 = &((shared_info_t *)SHAREDINFO_ADDR)->vcpu_data[0].arch;
+       regs->r31 = &(((mapped_regs_t *)SHARED_ARCHINFO_ADDR)->ipsr);
 
        PSCB(v,interrupt_delivery_enabled) = 0;
        PSCB(v,interrupt_collection_enabled) = 0;
diff -r 63995acdd34a -r f294acb25858 xen/arch/ia64/regionreg.c
--- a/xen/arch/ia64/regionreg.c Wed Aug  3 09:35:16 2005
+++ b/xen/arch/ia64/regionreg.c Wed Aug  3 09:35:38 2005
@@ -14,6 +14,8 @@
 #include <asm/page.h>
 #include <asm/regionreg.h>
 #include <asm/vhpt.h>
+#include <asm/vcpu.h>
+extern void ia64_new_rr7(unsigned long rid,void *shared_info, void 
*shared_arch_info);
 
 
 #define        IA64_MIN_IMPL_RID_BITS  (IA64_MIN_IMPL_RID_MSB+1)
@@ -273,7 +275,8 @@
                newrrv.rid = newrid;
                newrrv.ve = VHPT_ENABLED_REGION_7;
                newrrv.ps = IA64_GRANULE_SHIFT;
-               ia64_new_rr7(vmMangleRID(newrrv.rrval),v->vcpu_info);
+               ia64_new_rr7(vmMangleRID(newrrv.rrval),v->vcpu_info,
+                               v->vcpu_info->arch.privregs);
        }
        else {
                newrrv.rid = newrid;
@@ -290,7 +293,8 @@
        newrrv.ve = 1;  // VHPT now enabled for region 7!!
        newrrv.ps = PAGE_SHIFT;
        if (rreg == 0) v->arch.metaphysical_saved_rr0 = newrrv.rrval;
-       if (rreg == 7) ia64_new_rr7(vmMangleRID(newrrv.rrval),v->vcpu_info);
+       if (rreg == 7) ia64_new_rr7(vmMangleRID(newrrv.rrval),v->vcpu_info,
+                               v->vcpu_info->arch.privregs);
        else set_rr(rr,newrrv.rrval);
 #endif
        return 1;
@@ -332,14 +336,14 @@
        rrv.ps = PAGE_SHIFT;
        rrv.ve = 1;
 if (!v->vcpu_info) { printf("Stopping in init_all_rr\n"); dummy(); }
-       v->vcpu_info->arch.rrs[0] = -1;
-       v->vcpu_info->arch.rrs[1] = rrv.rrval;
-       v->vcpu_info->arch.rrs[2] = rrv.rrval;
-       v->vcpu_info->arch.rrs[3] = rrv.rrval;
-       v->vcpu_info->arch.rrs[4] = rrv.rrval;
-       v->vcpu_info->arch.rrs[5] = rrv.rrval;
+       VCPU(v,rrs[0]) = -1;
+       VCPU(v,rrs[1]) = rrv.rrval;
+       VCPU(v,rrs[2]) = rrv.rrval;
+       VCPU(v,rrs[3]) = rrv.rrval;
+       VCPU(v,rrs[4]) = rrv.rrval;
+       VCPU(v,rrs[5]) = rrv.rrval;
        rrv.ve = 0; 
-       v->vcpu_info->arch.rrs[6] = rrv.rrval;
+       VCPU(v,rrs[6]) = rrv.rrval;
 //     v->shared_info->arch.rrs[7] = rrv.rrval;
 }
 
@@ -378,7 +382,7 @@
        // TODO: These probably should be validated
        unsigned long bad = 0;
 
-       if (v->vcpu_info->arch.metaphysical_mode) {
+       if (VCPU(v,metaphysical_mode)) {
                ia64_rr rrv;
 
                rrv.rrval = 0;
@@ -390,16 +394,16 @@
                ia64_srlz_d();
        }
        else {
-               rr0 =  v->vcpu_info->arch.rrs[0];
+               rr0 =  VCPU(v,rrs[0]);
                if (!set_one_rr(0x0000000000000000L, rr0)) bad |= 1;
        }
-       rr1 =  v->vcpu_info->arch.rrs[1];
-       rr2 =  v->vcpu_info->arch.rrs[2];
-       rr3 =  v->vcpu_info->arch.rrs[3];
-       rr4 =  v->vcpu_info->arch.rrs[4];
-       rr5 =  v->vcpu_info->arch.rrs[5];
-       rr6 =  v->vcpu_info->arch.rrs[6];
-       rr7 =  v->vcpu_info->arch.rrs[7];
+       rr1 =  VCPU(v,rrs[1]);
+       rr2 =  VCPU(v,rrs[2]);
+       rr3 =  VCPU(v,rrs[3]);
+       rr4 =  VCPU(v,rrs[4]);
+       rr5 =  VCPU(v,rrs[5]);
+       rr6 =  VCPU(v,rrs[6]);
+       rr7 =  VCPU(v,rrs[7]);
        if (!set_one_rr(0x2000000000000000L, rr1)) bad |= 2;
        if (!set_one_rr(0x4000000000000000L, rr2)) bad |= 4;
        if (!set_one_rr(0x6000000000000000L, rr3)) bad |= 8;
@@ -410,4 +414,5 @@
        if (bad) {
                panic_domain(0,"load_region_regs: can't set! bad=%lx\n",bad);
        }
-}
+       return 0;
+}
diff -r 63995acdd34a -r f294acb25858 xen/arch/ia64/vcpu.c
--- a/xen/arch/ia64/vcpu.c      Wed Aug  3 09:35:16 2005
+++ b/xen/arch/ia64/vcpu.c      Wed Aug  3 09:35:38 2005
@@ -28,7 +28,7 @@
 
 // this def for vcpu_regs won't work if kernel stack is present
 #define        vcpu_regs(vcpu) ((struct pt_regs *) vcpu->arch.regs)
-#define        PSCB(x,y)       x->vcpu_info->arch.y
+#define        PSCB(x,y)       VCPU(x,y)
 #define        PSCBX(x,y)      x->arch.y
 
 #define        TRUE    1
@@ -155,7 +155,7 @@
        // interrupt collection flag
        //if (imm.ic) PSCB(vcpu,interrupt_delivery_enabled) = 0;
        // just handle psr.up and psr.pp for now
-       if (imm24 & ~(IA64_PSR_PP | IA64_PSR_UP | IA64_PSR_SP
+       if (imm24 & ~(IA64_PSR_BE | IA64_PSR_PP | IA64_PSR_UP | IA64_PSR_SP
                | IA64_PSR_I | IA64_PSR_IC | IA64_PSR_DT
                | IA64_PSR_DFL | IA64_PSR_DFH))
                        return (IA64_ILLOP_FAULT);
@@ -164,6 +164,7 @@
        if (imm.pp) { ipsr->pp = 0; psr.pp = 0; }
        if (imm.up) { ipsr->up = 0; psr.up = 0; }
        if (imm.sp) { ipsr->sp = 0; psr.sp = 0; }
+       if (imm.be) ipsr->be = 0;
        if (imm.dt) vcpu_set_metaphysical_mode(vcpu,TRUE);
        __asm__ __volatile (";; mov psr.l=%0;; srlz.d"::"r"(psr):"memory");
        return IA64_NO_FAULT;
@@ -214,6 +215,7 @@
        if (imm.ic)  PSCB(vcpu,interrupt_collection_enabled) = 1;
        // TODO: do this faster
        if (imm.mfl) { ipsr->mfl = 1; psr.mfl = 1; }
+       if (imm.mfh) { ipsr->mfh = 1; psr.mfh = 1; }
        if (imm.ac) { ipsr->ac = 1; psr.ac = 1; }
        if (imm.up) { ipsr->up = 1; psr.up = 1; }
        if (imm.be) {
@@ -262,6 +264,7 @@
        }
        if (newpsr.ic)  PSCB(vcpu,interrupt_collection_enabled) = 1;
        if (newpsr.mfl) { ipsr->mfl = 1; psr.mfl = 1; }
+       if (newpsr.mfh) { ipsr->mfh = 1; psr.mfh = 1; }
        if (newpsr.ac) { ipsr->ac = 1; psr.ac = 1; }
        if (newpsr.up) { ipsr->up = 1; psr.up = 1; }
        if (newpsr.dt && newpsr.rt) vcpu_set_metaphysical_mode(vcpu,FALSE);
@@ -389,6 +392,21 @@
        return (IA64_NO_FAULT);
 }
 
+unsigned long vcpu_get_rr_ps(VCPU *vcpu,UINT64 vadr)
+{
+       ia64_rr rr;
+
+       rr.rrval = PSCB(vcpu,rrs)[vadr>>61];
+       return(rr.ps);
+}
+
+unsigned long vcpu_get_rr_rid(VCPU *vcpu,UINT64 vadr)
+{
+       ia64_rr rr;
+
+       rr.rrval = PSCB(vcpu,rrs)[vadr>>61];
+       return(rr.rid);
+}
 
 unsigned long vcpu_get_itir_on_fault(VCPU *vcpu, UINT64 ifa)
 {
@@ -881,6 +899,15 @@
        return (IA64_NO_FAULT);
 }
 
+// parameter is a time interval specified in cycles
+void vcpu_enable_timer(VCPU *vcpu,UINT64 cycles)
+{
+    PSCBX(vcpu,xen_timer_interval) = cycles;
+    vcpu_set_next_timer(vcpu);
+    printf("vcpu_enable_timer(%d): interval set to %d cycles\n",
+             PSCBX(vcpu,xen_timer_interval));
+    __set_bit(PSCB(vcpu,itv), PSCB(vcpu,delivery_mask));
+}
 
 IA64FAULT vcpu_set_itv(VCPU *vcpu, UINT64 val)
 {
@@ -1007,16 +1034,6 @@
                vcpu_safe_set_itm(s);
                //using_xen_as_itm++;
        }
-}
-
-// parameter is a time interval specified in cycles
-void vcpu_enable_timer(VCPU *vcpu,UINT64 cycles)
-{
-    PSCBX(vcpu,xen_timer_interval) = cycles;
-    vcpu_set_next_timer(vcpu);
-    printf("vcpu_enable_timer(%d): interval set to %d cycles\n",
-             PSCBX(vcpu,xen_timer_interval));
-    __set_bit(PSCB(vcpu,itv), PSCB(vcpu,delivery_mask));
 }
 
 IA64FAULT vcpu_set_itm(VCPU *vcpu, UINT64 val)
@@ -1182,12 +1199,6 @@
        //if ((ifs & regs->cr_ifs & 0x8000000000000000L) && ifs != 
regs->cr_ifs) {
        //if ((ifs & 0x8000000000000000L) && ifs != regs->cr_ifs) {
        if (ifs & regs->cr_ifs & 0x8000000000000000L) {
-#define SI_OFS(x)      ((char *)(&PSCB(vcpu,x)) - (char *)(vcpu->vcpu_info))
-if (SI_OFS(iip)!=0x10 || SI_OFS(ipsr)!=0x08 || SI_OFS(ifs)!=0x18) {
-printf("SI_CR_IIP/IPSR/IFS_OFFSET CHANGED, SEE dorfirfi\n");
-printf("SI_CR_IIP=0x%x,IPSR=0x%x,IFS_OFFSET=0x%x\n",SI_OFS(iip),SI_OFS(ipsr),SI_OFS(ifs));
-while(1);
-}
                // TODO: validate PSCB(vcpu,iip)
                // TODO: PSCB(vcpu,ipsr) = psr;
                PSCB(vcpu,ipsr) = psr.i64;
@@ -1222,7 +1233,6 @@
 
 IA64FAULT vcpu_thash(VCPU *vcpu, UINT64 vadr, UINT64 *pval)
 {
-       extern unsigned long vcpu_get_rr_ps(VCPU *vcpu,UINT64 vadr);
        UINT64 pta = PSCB(vcpu,pta);
        UINT64 pta_sz = (pta & IA64_PTA_SZ(0x3f)) >> IA64_PTA_SZ_BIT;
        UINT64 pta_base = pta & ~((1UL << IA64_PTA_BASE_BIT)-1);
@@ -1263,7 +1273,6 @@
 #define itir_mask(itir) (~((1UL << itir_ps(itir)) - 1))
 
 unsigned long vhpt_translate_count = 0;
-int in_vcpu_tpa = 0;
 
 IA64FAULT vcpu_translate(VCPU *vcpu, UINT64 address, BOOLEAN is_data, UINT64 
*pteval, UINT64 *itir)
 {
@@ -1278,12 +1287,6 @@
                        unsigned long vipsr = PSCB(vcpu,ipsr);
                        unsigned long iip = regs->cr_iip;
                        unsigned long ipsr = regs->cr_ipsr;
-#if 0
-                       printk("vcpu_translate: bad address %p, viip=%p, 
vipsr=%p, iip=%p, ipsr=%p\n", address, viip, vipsr, iip, ipsr);
-                       if (in_vcpu_tpa) printk("vcpu_translate called from 
vcpu_tpa\n");
-                       while(1);
-                       panic_domain(0,"vcpu_translate: bad address %p\n", 
address);
-#endif
                        printk("vcpu_translate: bad address %p, viip=%p, 
vipsr=%p, iip=%p, ipsr=%p continuing\n", address, viip, vipsr, iip, ipsr);
                }
 
@@ -1304,7 +1307,6 @@
        /* check 1-entry TLB */
        if ((trp = match_dtlb(vcpu,address))) {
                dtlb_translate_count++;
-if (!in_vcpu_tpa) printf("vcpu_translate: found in vdtlb\n");
                *pteval = trp->page_flags;
                *itir = trp->itir;
                return IA64_NO_FAULT;
@@ -1356,9 +1358,7 @@
        UINT64 pteval, itir, mask;
        IA64FAULT fault;
 
-in_vcpu_tpa=1;
        fault = vcpu_translate(vcpu, vadr, 1, &pteval, &itir);
-in_vcpu_tpa=0;
        if (fault == IA64_NO_FAULT)
        {
                mask = itir_mask(itir);
@@ -1534,28 +1534,8 @@
        return(rr.ve);
 }
 
-
-unsigned long vcpu_get_rr_ps(VCPU *vcpu,UINT64 vadr)
-{
-       ia64_rr rr;
-
-       rr.rrval = PSCB(vcpu,rrs)[vadr>>61];
-       return(rr.ps);
-}
-
-
-unsigned long vcpu_get_rr_rid(VCPU *vcpu,UINT64 vadr)
-{
-       ia64_rr rr;
-
-       rr.rrval = PSCB(vcpu,rrs)[vadr>>61];
-       return(rr.rid);
-}
-
-
 IA64FAULT vcpu_set_rr(VCPU *vcpu, UINT64 reg, UINT64 val)
 {
-       extern void set_one_rr(UINT64, UINT64);
        PSCB(vcpu,rrs)[reg>>61] = val;
        // warning: set_one_rr() does it "live"
        set_one_rr(reg,val);
@@ -1785,49 +1765,26 @@
 IA64FAULT vcpu_fc(VCPU *vcpu, UINT64 vadr)
 {
        // TODO: Only allowed for current vcpu
-       UINT64 mpaddr, ps;
+       UINT64 mpaddr, paddr;
        IA64FAULT fault;
-       TR_ENTRY *trp;
-       unsigned long lookup_domain_mpa(struct domain *,unsigned long);
-       unsigned long pteval, dom_imva;
-
-       if ((trp = match_dtlb(vcpu,vadr))) {
-               pteval = trp->page_flags;
-               dom_imva = __va(pteval & _PFN_MASK);
-               ia64_fc(dom_imva);
-               return IA64_NO_FAULT;
-       }
+       unsigned long translate_domain_mpaddr(unsigned long);
+       IA64FAULT vcpu_tpa(VCPU *, UINT64, UINT64 *);
+
        fault = vcpu_tpa(vcpu, vadr, &mpaddr);
        if (fault == IA64_NO_FAULT) {
-               struct domain *dom0;
-               unsigned long dom0_start, dom0_size;
-               if (vcpu == dom0) {
-                       if (mpaddr < dom0_start || mpaddr >= dom0_start + 
dom0_size) {
-                               printk("vcpu_fc: bad dom0 mpaddr %p!\n",mpaddr);
-                       }
-               }
-               pteval = lookup_domain_mpa(vcpu->domain,mpaddr);
-               if (pteval) {
-                       dom_imva = __va(pteval & _PFN_MASK);
-                       ia64_fc(dom_imva);
-               }
-               else {
-                       REGS *regs = vcpu_regs(vcpu);
-                       printk("vcpu_fc: can't flush vadr=%p, iip=%p\n",
-                                       vadr,regs->cr_iip);
-               }
+               paddr = translate_domain_mpaddr(mpaddr);
+               ia64_fc(__va(paddr));
        }
        return fault;
 }
 
+int ptce_count = 0;
 IA64FAULT vcpu_ptc_e(VCPU *vcpu, UINT64 vadr)
 {
-
        // Note that this only needs to be called once, i.e. the
        // architected loop to purge the entire TLB, should use
        //  base = stride1 = stride2 = 0, count0 = count 1 = 1
 
-       // FIXME: When VHPT is in place, flush that too!
 #ifdef VHPT_GLOBAL
        vhpt_flush();   // FIXME: This is overdoing it
 #endif
@@ -1850,6 +1807,7 @@
        // FIXME: validate not flushing Xen addresses
        // if (Xen address) return(IA64_ILLOP_FAULT);
        // FIXME: ??breaks if domain PAGE_SIZE < Xen PAGE_SIZE
+//printf("######## vcpu_ptc_ga(%p,%p) ##############\n",vadr,addr_range);
 #ifdef VHPT_GLOBAL
        vhpt_flush_address(vadr,addr_range);
 #endif
diff -r 63995acdd34a -r f294acb25858 xen/arch/ia64/vlsapic.c
--- a/xen/arch/ia64/vlsapic.c   Wed Aug  3 09:35:16 2005
+++ b/xen/arch/ia64/vlsapic.c   Wed Aug  3 09:35:38 2005
@@ -38,6 +38,14 @@
 #include <asm/vmx_pal_vsa.h>
 #include <asm/kregs.h>
 
+#define  SHARED_VLAPIC_INF
+#ifdef V_IOSAPIC_READY
+static inline vl_apic_info* get_psapic(VCPU *vcpu)
+{
+    shared_iopage_t  *sp = get_sp(vcpu->domain);
+    return &(sp->vcpu_iodata[vcpu->vcpu_id].apic_intr);
+}
+#endif
 //u64  fire_itc;
 //u64  fire_itc2;
 //u64  fire_itm;
@@ -216,7 +224,8 @@
  */
 void vtm_domain_out(VCPU *vcpu)
 {
-    rem_ac_timer(&vcpu->arch.arch_vmx.vtm.vtm_timer);
+    if(!is_idle_task(vcpu->domain))
+       rem_ac_timer(&vcpu->arch.arch_vmx.vtm.vtm_timer);
 }
 
 /*
@@ -226,9 +235,11 @@
 void vtm_domain_in(VCPU *vcpu)
 {
     vtime_t     *vtm;
-    
-    vtm=&(vcpu->arch.arch_vmx.vtm);
-    vtm_interruption_update(vcpu, vtm);
+
+    if(!is_idle_task(vcpu->domain)) {
+       vtm=&(vcpu->arch.arch_vmx.vtm);
+       vtm_interruption_update(vcpu, vtm);
+    }
 }
 
 /*
@@ -262,10 +273,50 @@
     }
 }
 
+#ifdef V_IOSAPIC_READY
+void vlapic_update_shared_info(VCPU *vcpu)
+{
+    //int      i;
+    
+    vl_apic_info *ps;
+
+    if (vcpu->domain == dom0)
+       return;
+
+    ps = get_psapic(vcpu);
+    ps->vl_lapic_id = ((VPD_CR(vcpu, lid) >> 16) & 0xffff) << 16; 
+    printf("vl_lapic_id = %x\n", ps->vl_lapic_id);
+    ps->vl_apr = 0;
+    // skip ps->vl_logical_dest && ps->vl_dest_format
+    // IPF support physical destination mode only
+    ps->vl_arb_id = 0;
+    /*
+    for ( i=0; i<4; i++ ) {
+       ps->tmr[i] = 0;         // edge trigger 
+    }
+    */
+}
+
+void vlapic_update_ext_irq(VCPU *vcpu)
+{
+    int  vec;
+    
+    vl_apic_info *ps = get_psapic(vcpu);
+    while ( (vec = highest_bits(ps->irr)) != NULL_VECTOR ) {
+       clear_bit (vec, ps->irr);
+        vmx_vcpu_pend_interrupt(vcpu, vec);
+    }
+}
+#endif
+
 void vlsapic_reset(VCPU *vcpu)
 {
     int     i;
-    VPD_CR(vcpu, lid) = 0;
+#ifdef V_IOSAPIC_READY
+    vl_apic_info  *psapic;     // shared lapic inf.
+#endif
+    
+    VPD_CR(vcpu, lid) = ia64_getreg(_IA64_REG_CR_LID);
     VPD_CR(vcpu, ivr) = 0;
     VPD_CR(vcpu,tpr) = 0x10000;
     VPD_CR(vcpu, eoi) = 0;
@@ -281,6 +332,10 @@
     for ( i=0; i<4; i++) {
         VLSAPIC_INSVC(vcpu,i) = 0;
     }
+#ifdef V_IOSAPIC_READY
+    vlapic_update_shared_info(vcpu);
+    //vlapic_update_shared_irr(vcpu);
+#endif
     DPRINTK("VLSAPIC inservice base=%lp\n", &VLSAPIC_INSVC(vcpu,0) );
 }
 
@@ -414,6 +469,7 @@
     }
     local_irq_save(spsr);
     VPD_CR(vcpu,irr[vector>>6]) |= 1UL<<(vector&63);
+    //vlapic_update_shared_irr(vcpu);
     local_irq_restore(spsr);
     vcpu->arch.irq_new_pending = 1;
 }
@@ -432,6 +488,7 @@
     for (i=0 ; i<4; i++ ) {
         VPD_CR(vcpu,irr[i]) |= pend_irr[i];
     }
+    //vlapic_update_shared_irr(vcpu);
     local_irq_restore(spsr);
     vcpu->arch.irq_new_pending = 1;
 }
@@ -518,6 +575,7 @@
     VLSAPIC_INSVC(vcpu,vec>>6) |= (1UL <<(vec&63));
     VPD_CR(vcpu, irr[vec>>6]) &= ~(1UL <<(vec&63));
     update_vhpi(vcpu, NULL_VECTOR);     // clear VHPI till EOI or IRR write
+    //vlapic_update_shared_irr(vcpu);
     local_irq_restore(spsr);
     return (uint64_t)vec;
 }
diff -r 63995acdd34a -r f294acb25858 xen/arch/ia64/vmmu.c
--- a/xen/arch/ia64/vmmu.c      Wed Aug  3 09:35:16 2005
+++ b/xen/arch/ia64/vmmu.c      Wed Aug  3 09:35:38 2005
@@ -145,7 +145,7 @@
     thash_cb_t  *vhpt;
     PTA pta_value;
     
-    page = alloc_domheap_pages (NULL, VCPU_TLB_ORDER);
+    page = alloc_domheap_pages (NULL, VCPU_TLB_ORDER, 0);
     if ( page == NULL ) {
         panic("No enough contiguous memory for init_domain_mm\n");
     }
@@ -187,7 +187,7 @@
     tlb_special_t  *ts;
     thash_cb_t  *tlb;
     
-    page = alloc_domheap_pages (NULL, VCPU_TLB_ORDER);
+    page = alloc_domheap_pages (NULL, VCPU_TLB_ORDER, 0);
     if ( page == NULL ) {
         panic("No enough contiguous memory for init_domain_mm\n");
     }
@@ -224,7 +224,7 @@
     /* Only called once */
     ASSERT(d->arch.pmt);
 
-    page = alloc_domheap_pages(NULL, get_order(d->max_pages));
+    page = alloc_domheap_pages(NULL, get_order(d->max_pages), 0);
     ASSERT(page);
 
     d->arch.pmt = page_to_virt(page);
diff -r 63995acdd34a -r f294acb25858 xen/arch/ia64/vmx_hypercall.c
--- a/xen/arch/ia64/vmx_hypercall.c     Wed Aug  3 09:35:16 2005
+++ b/xen/arch/ia64/vmx_hypercall.c     Wed Aug  3 09:35:38 2005
@@ -29,6 +29,7 @@
 #include <asm/regionreg.h>
 #include <asm/page.h>
 #include <xen/mm.h>
+#include <xen/multicall.h>
 
 
 void hyper_not_support(void)
@@ -49,6 +50,42 @@
     ret=do_mmu_update((mmu_update_t*)r32,r33,r34,r35);
     vmx_vcpu_set_gr(vcpu, 8, ret, 0);
     vmx_vcpu_increment_iip(vcpu);
+}
+
+unsigned long __hypercall_create_continuation(
+    unsigned int op, unsigned int nr_args, ...)
+{
+    struct mc_state *mcs = &mc_state[smp_processor_id()];
+    VCPU *vcpu = current;
+    struct cpu_user_regs *regs = vcpu_regs(vcpu);
+    unsigned int i;
+    va_list args;
+
+    va_start(args, nr_args);
+    if ( test_bit(_MCSF_in_multicall, &mcs->flags) ) {
+       panic("PREEMPT happen in multicall\n"); // Not support yet
+    } else {
+       vmx_vcpu_set_gr(vcpu, 15, op, 0);
+       for ( i = 0; i < nr_args; i++) {
+           switch (i) {
+           case 0: vmx_vcpu_set_gr(vcpu, 16, va_arg(args, unsigned long), 0);
+                   break;
+           case 1: vmx_vcpu_set_gr(vcpu, 17, va_arg(args, unsigned long), 0);
+                   break;
+           case 2: vmx_vcpu_set_gr(vcpu, 18, va_arg(args, unsigned long), 0);
+                   break;
+           case 3: vmx_vcpu_set_gr(vcpu, 19, va_arg(args, unsigned long), 0);
+                   break;
+           case 4: vmx_vcpu_set_gr(vcpu, 20, va_arg(args, unsigned long), 0);
+                   break;
+           default: panic("Too many args for hypercall continuation\n");
+                   break;
+           }
+       }
+    }
+    vcpu->arch.hypercall_continuation = 1;
+    va_end(args);
+    return op;
 }
 
 void hyper_dom_mem_op(void)
@@ -65,7 +102,13 @@
     printf("do_dom_mem return value: %lx\n", ret);
     vmx_vcpu_set_gr(vcpu, 8, ret, 0);
 
-    vmx_vcpu_increment_iip(vcpu);
+    /* Hard to define a special return value to indicate hypercall restart.
+     * So just add a new mark, which is SMP safe
+     */
+    if (vcpu->arch.hypercall_continuation == 1)
+       vcpu->arch.hypercall_continuation = 0;
+    else
+       vmx_vcpu_increment_iip(vcpu);
 }
 
 
diff -r 63995acdd34a -r f294acb25858 xen/arch/ia64/vmx_ivt.S
--- a/xen/arch/ia64/vmx_ivt.S   Wed Aug  3 09:35:16 2005
+++ b/xen/arch/ia64/vmx_ivt.S   Wed Aug  3 09:35:38 2005
@@ -560,6 +560,21 @@
        VMX_DBG_FAULT(19)
        VMX_FAULT(19)
 
+    .org vmx_ia64_ivt+0x5000
+/////////////////////////////////////////////////////////////////////////////////////////
+// 0x5000 Entry 20 (size 16 bundles) Page Not Present
+ENTRY(vmx_page_not_present)
+       VMX_REFLECT(20)
+END(vmx_page_not_present)
+
+    .org vmx_ia64_ivt+0x5100
+/////////////////////////////////////////////////////////////////////////////////////////
+// 0x5100 Entry 21 (size 16 bundles) Key Permission vector
+ENTRY(vmx_key_permission)
+       VMX_REFLECT(21)
+END(vmx_key_permission)
+
+    .org vmx_ia64_ivt+0x5200
 
/////////////////////////////////////////////////////////////////////////////////////////
 // 0x5200 Entry 22 (size 16 bundles) Instruction Access Rights (26)
 ENTRY(vmx_iaccess_rights)
diff -r 63995acdd34a -r f294acb25858 xen/arch/ia64/vmx_support.c
--- a/xen/arch/ia64/vmx_support.c       Wed Aug  3 09:35:16 2005
+++ b/xen/arch/ia64/vmx_support.c       Wed Aug  3 09:35:38 2005
@@ -37,18 +37,19 @@
     struct vcpu *v = current;
     struct domain *d = v->domain;
     extern void do_block();
+    int port = iopacket_port(d);
 
     do {
-       if (!test_bit(IOPACKET_PORT,
+       if (!test_bit(port,
                &d->shared_info->evtchn_pending[0]))
            do_block();
 
        /* Unblocked when some event is coming. Clear pending indication
         * immediately if deciding to go for io assist
          */
-       if (test_and_clear_bit(IOPACKET_PORT,
+       if (test_and_clear_bit(port,
                &d->shared_info->evtchn_pending[0])) {
-           clear_bit(IOPACKET_PORT>>5, &v->vcpu_info->evtchn_pending_sel);
+           clear_bit(port>>5, &v->vcpu_info->evtchn_pending_sel);
            clear_bit(0, &v->vcpu_info->evtchn_upcall_pending);
            vmx_io_assist(v);
        }
@@ -66,7 +67,7 @@
             * nothing losed. Next loop will check I/O channel to fix this
             * window.
             */
-           clear_bit(IOPACKET_PORT>>5, &v->vcpu_info->evtchn_pending_sel);
+           clear_bit(port>>5, &v->vcpu_info->evtchn_pending_sel);
        }
        else
            break;
@@ -88,7 +89,7 @@
      * This shared page contains I/O request between emulation code
      * and device model.
      */
-    vio = (vcpu_iodata_t *)v->arch.arch_vmx.vmx_platform.shared_page_va;
+    vio = get_vio(v->domain, v->vcpu_id);
     if (!vio)
        panic("Corruption: bad shared page: %lx\n", (unsigned long)vio);
 
@@ -127,6 +128,7 @@
     struct domain *d = v->domain;
     extern void vmx_vcpu_pend_batch_interrupt(VCPU *vcpu,
                                        unsigned long *pend_irr);
+    int port = iopacket_port(d);
 
     /* I/O emulation is atomic, so it's impossible to see execution flow
      * out of vmx_wait_io, when guest is still waiting for response.
@@ -135,10 +137,10 @@
        panic("!!!Bad resume to guest before I/O emulation is done.\n");
 
     /* Clear indicator specific to interrupt delivered from DM */
-    if (test_and_clear_bit(IOPACKET_PORT,
+    if (test_and_clear_bit(port,
                &d->shared_info->evtchn_pending[0])) {
-       if (!d->shared_info->evtchn_pending[IOPACKET_PORT >> 5])
-           clear_bit(IOPACKET_PORT>>5, &v->vcpu_info->evtchn_pending_sel);
+       if (!d->shared_info->evtchn_pending[port >> 5])
+           clear_bit(port>>5, &v->vcpu_info->evtchn_pending_sel);
 
        if (!v->vcpu_info->evtchn_pending_sel)
            clear_bit(0, &v->vcpu_info->evtchn_upcall_pending);
@@ -149,11 +151,14 @@
      * shares same event channel as I/O emulation, with corresponding
      * indicator possibly cleared when vmx_wait_io().
      */
-    vio = (vcpu_iodata_t *)v->arch.arch_vmx.vmx_platform.shared_page_va;
+    vio = get_vio(v->domain, v->vcpu_id);
     if (!vio)
        panic("Corruption: bad shared page: %lx\n", (unsigned long)vio);
 
-    vmx_vcpu_pend_batch_interrupt(v, &vio->vp_intr[0]); 
-    memset(&vio->vp_intr[0], 0, sizeof(vio->vp_intr));
+#ifdef V_IOSAPIC_READY
+    vlapic_update_ext_irq(v);
+#else
+    panic("IOSAPIC model is missed in qemu\n");
+#endif
     return;
 }
diff -r 63995acdd34a -r f294acb25858 xen/arch/ia64/vmx_vcpu.c
--- a/xen/arch/ia64/vmx_vcpu.c  Wed Aug  3 09:35:16 2005
+++ b/xen/arch/ia64/vmx_vcpu.c  Wed Aug  3 09:35:38 2005
@@ -23,7 +23,7 @@
  *  Xuefei Xu (Anthony Xu) (Anthony.xu@xxxxxxxxx)
  */
 
-#include <linux/sched.h>
+#include <xen/sched.h>
 #include <public/arch-ia64.h>
 #include <asm/ia64_int.h>
 #include <asm/vmx_vcpu.h>
@@ -201,7 +201,7 @@
 struct virutal_platform_def *
 vmx_vcpu_get_plat(VCPU *vcpu)
 {
-    return &(vcpu->arch.arch_vmx.vmx_platform);
+    return &(vcpu->domain->arch.vmx_platform);
 }
 
 
@@ -213,7 +213,6 @@
 
 IA64FAULT vmx_vcpu_set_rr(VCPU *vcpu, UINT64 reg, UINT64 val)
 {
-    extern void set_one_rr(UINT64, UINT64);
     ia64_rr oldrr,newrr;
     thash_cb_t *hcb;
     oldrr=vmx_vcpu_rr(vcpu,reg);
@@ -375,7 +374,7 @@
 vmx_vcpu_get_gr(VCPU *vcpu, unsigned reg, UINT64 * val)
 {
     REGS *regs=vcpu_regs(vcpu);
-    u64 nat;
+    int nat;
     //TODO, Eddie
     if (!regs) return 0;
     if (reg >= 16 && reg < 32) {
diff -r 63995acdd34a -r f294acb25858 xen/arch/ia64/vmx_virt.c
--- a/xen/arch/ia64/vmx_virt.c  Wed Aug  3 09:35:16 2005
+++ b/xen/arch/ia64/vmx_virt.c  Wed Aug  3 09:35:38 2005
@@ -1193,7 +1193,8 @@
         case 23:return vmx_vcpu_set_ifs(vcpu,r2);
         case 24:return vmx_vcpu_set_iim(vcpu,r2);
         case 25:return vmx_vcpu_set_iha(vcpu,r2);
-        case 64:return vmx_vcpu_set_lid(vcpu,r2);
+        case 64:printk("SET LID to 0x%lx\n", r2);
+               return vmx_vcpu_set_lid(vcpu,r2);
         case 65:return IA64_NO_FAULT;
         case 66:return vmx_vcpu_set_tpr(vcpu,r2);
         case 67:return vmx_vcpu_set_eoi(vcpu,r2);
@@ -1253,9 +1254,9 @@
         case 23:return cr_get(ifs);
         case 24:return cr_get(iim);
         case 25:return cr_get(iha);
-       case 64:val = ia64_getreg(_IA64_REG_CR_LID);
-            return vmx_vcpu_set_gr(vcpu,tgt,val,0);
-//        case 64:return cr_get(lid);
+//     case 64:val = ia64_getreg(_IA64_REG_CR_LID);
+//          return vmx_vcpu_set_gr(vcpu,tgt,val,0);
+        case 64:return cr_get(lid);
         case 65:
              vmx_vcpu_get_ivr(vcpu,&val);
              return vmx_vcpu_set_gr(vcpu,tgt,val,0);
diff -r 63995acdd34a -r f294acb25858 xen/arch/ia64/vtlb.c
--- a/xen/arch/ia64/vtlb.c      Wed Aug  3 09:35:16 2005
+++ b/xen/arch/ia64/vtlb.c      Wed Aug  3 09:35:38 2005
@@ -23,6 +23,7 @@
 
 #include <linux/sched.h>
 #include <asm/tlb.h>
+#include <asm/mm.h>
 #include <asm/vmx_mm_def.h>
 #include <asm/gcc_intrin.h>
 #include <xen/interrupt.h>
@@ -359,7 +360,10 @@
 void vtlb_insert(thash_cb_t *hcb, thash_data_t *entry, u64 va)
 {
     thash_data_t    *hash_table, *cch;
+    int flag;
     rr_t  vrr;
+    u64 gppn;
+    u64 ppns, ppne;
     
     hash_table = (hcb->hash_func)(hcb->pta,
                         va, entry->rid, entry->ps);
@@ -375,7 +379,18 @@
         *hash_table = *entry;
         hash_table->next = cch;
     }
-    thash_insert (hcb->ts->vhpt, entry, va);
+    if(hcb->vcpu->domain->domain_id==0){
+       thash_insert(hcb->ts->vhpt, entry, va);
+        return;
+    }
+    flag = 1;
+    gppn = 
(POFFSET(va,entry->ps)|PAGEALIGN((entry->ppn<<12),entry->ps))>>PAGE_SHIFT;
+    ppns = PAGEALIGN((entry->ppn<<12),entry->ps);
+    ppne = ppns + PSIZE(entry->ps);
+    if(((ppns<=0xa0000)&&(ppne>0xa0000))||((ppne>0xc0000)&&(ppns<=0xc0000)))
+        flag = 0;
+    if((__gpfn_is_mem(hcb->vcpu->domain, gppn)&&flag))
+       thash_insert(hcb->ts->vhpt, entry, va);
     return ;
 }
 
@@ -427,18 +442,22 @@
     thash_data_t    *hash_table, *p, *q;
     thash_internal_t *priv = &hcb->priv;
     int idx;
-    
+
     hash_table = priv->hash_base;
     if ( hash_table == entry ) {
-        __rem_hash_head (hcb, entry);
+//        if ( PURGABLE_ENTRY(hcb, entry) ) {
+            __rem_hash_head (hcb, entry);
+//        }
         return ;
     }
     // remove from collision chain
     p = hash_table;
     for ( q=p->next; q; q = p->next ) {
-        if ( q == entry ) {
-            p->next = q->next;
-            __rem_chain(hcb, entry);
+        if ( q == entry ){
+//            if ( PURGABLE_ENTRY(hcb,q ) ) {
+                p->next = q->next;
+                __rem_chain(hcb, entry);
+//            }
             return ;
         }
         p = q;
@@ -939,7 +958,7 @@
     if ( sanity_check == 0 ) return;
     sanity_check --;
     s_sect.v = 0;
-//    page = alloc_domheap_pages (NULL, VCPU_TLB_ORDER);
+//    page = alloc_domheap_pages (NULL, VCPU_TLB_ORDER, 0);
 //    if ( page == NULL ) {
 //        panic("No enough contiguous memory for init_domain_mm\n");
 //    };
diff -r 63995acdd34a -r f294acb25858 xen/arch/ia64/xenasm.S
--- a/xen/arch/ia64/xenasm.S    Wed Aug  3 09:35:16 2005
+++ b/xen/arch/ia64/xenasm.S    Wed Aug  3 09:35:38 2005
@@ -48,10 +48,11 @@
 // FIXME? Note that this turns off the DB bit (debug)
 #define PSR_BITS_TO_SET        IA64_PSR_BN
 
+//extern void ia64_new_rr7(unsigned long rid,void *shared_info, void 
*shared_arch_info);
 GLOBAL_ENTRY(ia64_new_rr7)
        // not sure this unwind statement is correct...
        .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(1)
-       alloc loc1 = ar.pfs, 2, 7, 0, 0
+       alloc loc1 = ar.pfs, 3, 8, 0, 0
 1:     {
          mov r28  = in0                // copy procedure index
          mov r8   = ip                 // save ip to compute branch
@@ -72,6 +73,10 @@
        ;;
        tpa loc5=loc5                   // grab this BEFORE changing rr7
        ;;
+       mov loc7=in2                    // arch_vcpu_info_t
+       ;;
+       tpa loc7=loc7                   // grab this BEFORE changing rr7
+       ;;
        mov loc3 = psr                  // save psr
        adds r8  = 1f-1b,r8             // calculate return address for call
        ;;
@@ -203,6 +208,25 @@
        mov cr.ifa=r22
        ;;
        mov r25=IA64_TR_SHARED_INFO
+       ;;
+       itr.d dtr[r25]=r23              // wire in new mapping...
+       ;;
+       // Map for arch_vcpu_info_t
+       movl r22=SHARED_ARCHINFO_ADDR
+       ;;
+       movl r25=__pgprot(__DIRTY_BITS | _PAGE_PL_2 | _PAGE_AR_RW)
+       ;;
+       mov r21=loc7                    // saved sharedinfo physical address
+       ;;
+       or r23=r25,r21                  // construct PA | page properties
+       mov r24=PAGE_SHIFT<<2
+       ;;
+       ptr.d   r22,r24
+       ;;
+       mov cr.itir=r24
+       mov cr.ifa=r22
+       ;;
+       mov r25=IA64_TR_ARCH_INFO
        ;;
        itr.d dtr[r25]=r23              // wire in new mapping...
        ;;
@@ -278,12 +302,9 @@
 END(__get_domain_bundle)
 
 GLOBAL_ENTRY(dorfirfi)
-#define SI_CR_IIP_OFFSET 0x10
-#define SI_CR_IPSR_OFFSET 0x08
-#define SI_CR_IFS_OFFSET 0x18
-        movl r16 = SHAREDINFO_ADDR+SI_CR_IIP_OFFSET
-        movl r17 = SHAREDINFO_ADDR+SI_CR_IPSR_OFFSET
-        movl r18 = SHAREDINFO_ADDR+SI_CR_IFS_OFFSET
+        movl r16 = XSI_IIP
+        movl r17 = XSI_IPSR
+        movl r18 = XSI_IFS
        ;;
        ld8 r16 = [r16]
        ld8 r17 = [r17]
diff -r 63995acdd34a -r f294acb25858 xen/arch/ia64/xenmem.c
--- a/xen/arch/ia64/xenmem.c    Wed Aug  3 09:35:16 2005
+++ b/xen/arch/ia64/xenmem.c    Wed Aug  3 09:35:38 2005
@@ -65,7 +65,7 @@
 #else // CONFIG_VTI
 
        /* Allocate and map the machine-to-phys table */
-       if ((pg = alloc_domheap_pages(NULL, 10)) == NULL)
+       if ((pg = alloc_domheap_pages(NULL, 10, 0)) == NULL)
                panic("Not enough memory to bootstrap Xen.\n");
        memset(page_to_virt(pg), 0x55, 16UL << 20);
 #endif // CONFIG_VTI
diff -r 63995acdd34a -r f294acb25858 xen/arch/ia64/xenmisc.c
--- a/xen/arch/ia64/xenmisc.c   Wed Aug  3 09:35:16 2005
+++ b/xen/arch/ia64/xenmisc.c   Wed Aug  3 09:35:38 2005
@@ -103,11 +103,13 @@
 }
 #endif
 
+#ifndef CONFIG_VTI
 unsigned long __hypercall_create_continuation(
        unsigned int op, unsigned int nr_args, ...)
 {
        printf("__hypercall_create_continuation: not implemented!!!\n");
 }
+#endif
 
 ///////////////////////////////
 
@@ -115,14 +117,17 @@
 // from arch/x86/apic.c
 ///////////////////////////////
 
+extern unsigned long domain0_ready;
+
 int reprogram_ac_timer(s_time_t timeout)
 {
        struct vcpu *v = current;
 
 #ifdef CONFIG_VTI
-       if(VMX_DOMAIN(v))
+//     if(VMX_DOMAIN(v))
                return 1;
 #endif // CONFIG_VTI
+       if (!domain0_ready) return 1;
        local_cpu_data->itm_next = timeout;
        if (is_idle_task(v->domain)) vcpu_safe_set_itm(timeout);
        else vcpu_set_next_timer(current);
@@ -175,6 +180,22 @@
 void show_registers(struct pt_regs *regs)
 {
        printf("*** ADD REGISTER DUMP HERE FOR DEBUGGING\n");
+}
+
+int is_kernel_text(unsigned long addr)
+{
+       extern char _stext[], _etext[];
+       if (addr >= (unsigned long) _stext &&
+           addr <= (unsigned long) _etext)
+           return 1;
+
+       return 0;
+}
+
+unsigned long kernel_text_end(void)
+{
+       extern char _etext[];
+       return (unsigned long) _etext;
 }
 
 ///////////////////////////////
@@ -291,8 +312,8 @@
 static long cnt[16] = { 50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50};
 static int i = 100;
 int id = ((struct vcpu *)current)->domain->domain_id & 0xf;
-if (!cnt[id]--) { printk("%x",id); cnt[id] = 500; }
-if (!i--) { printk("+",id); cnt[id] = 1000; }
+if (!cnt[id]--) { printk("%x",id); cnt[id] = 500000; }
+if (!i--) { printk("+",id); i = 1000000; }
 }
        clear_bit(_VCPUF_running, &prev->vcpu_flags);
        //if (!is_idle_task(next->domain) )
diff -r 63995acdd34a -r f294acb25858 xen/arch/ia64/xensetup.c
--- a/xen/arch/ia64/xensetup.c  Wed Aug  3 09:35:16 2005
+++ b/xen/arch/ia64/xensetup.c  Wed Aug  3 09:35:38 2005
@@ -136,6 +136,12 @@
     .stop_bits = 1
 };
 
+struct ns16550_defaults ns16550_com2 = {
+    .data_bits = 8,
+    .parity    = 'n',
+    .stop_bits = 1
+};
+
 void start_kernel(void)
 {
     unsigned char *cmdline;
@@ -158,7 +164,13 @@
 
     /* We initialise the serial devices very early so we can get debugging. */
     if (running_on_sim) hpsim_serial_init();
-    else ns16550_init(0, &ns16550_com1);
+    else {
+       ns16550_init(0, &ns16550_com1);
+       /* Also init com2 for Tiger4. */
+       ns16550_com2.io_base = 0x2f8;
+       ns16550_com2.irq     = 3;
+       ns16550_init(1, &ns16550_com2);
+    }
     serial_init_preirq();
 
     init_console();
diff -r 63995acdd34a -r f294acb25858 xen/arch/ia64/xentime.c
--- a/xen/arch/ia64/xentime.c   Wed Aug  3 09:35:16 2005
+++ b/xen/arch/ia64/xentime.c   Wed Aug  3 09:35:38 2005
@@ -27,6 +27,7 @@
 #include <asm/sections.h>
 #include <asm/system.h>
 #ifdef XEN
+#include <asm/vcpu.h>
 #include <linux/jiffies.h>     // not included by xen/sched.h
 #endif
 #include <xen/softirq.h>
@@ -143,8 +144,8 @@
        if (!(++count & ((HEARTBEAT_FREQ*1024)-1))) {
                printf("Heartbeat... iip=%p,psr.i=%d,pend=%d\n",
                        regs->cr_iip,
-                       current->vcpu_info->arch.interrupt_delivery_enabled,
-                       current->vcpu_info->arch.pending_interruption);
+                       VCPU(current,interrupt_delivery_enabled),
+                       VCPU(current,pending_interruption));
                count = 0;
        }
 #endif
@@ -159,7 +160,7 @@
                // We have to ensure that domain0 is launched before we
                // call vcpu_timer_expired on it
                //domain0_ready = 1; // moved to xensetup.c
-               current->vcpu_info->arch.pending_interruption = 1;
+               VCPU(current,pending_interruption) = 1;
        }
        if (domain0_ready && vcpu_timer_expired(dom0->vcpu[0])) {
                vcpu_pend_timer(dom0->vcpu[0]);
diff -r 63995acdd34a -r f294acb25858 xen/common/xmalloc.c
--- a/xen/common/xmalloc.c      Wed Aug  3 09:35:16 2005
+++ b/xen/common/xmalloc.c      Wed Aug  3 09:35:38 2005
@@ -111,7 +111,9 @@
     unsigned long flags;
 
     /* We currently always return cacheline aligned. */
+#ifndef __ia64__
     BUG_ON(align > SMP_CACHE_BYTES);
+#endif
 
     /* Add room for header, pad to align next header. */
     size += sizeof(struct xmalloc_hdr);
diff -r 63995acdd34a -r f294acb25858 xen/include/asm-ia64/config.h
--- a/xen/include/asm-ia64/config.h     Wed Aug  3 09:35:16 2005
+++ b/xen/include/asm-ia64/config.h     Wed Aug  3 09:35:38 2005
@@ -230,6 +230,7 @@
 
 #define FORCE_CRASH()  asm("break 0;;");
 
+void dummy_called(char *function);
 #define dummy()        dummy_called(__FUNCTION__)
 
 // these declarations got moved at some point, find a better place for them
diff -r 63995acdd34a -r f294acb25858 xen/include/asm-ia64/domain.h
--- a/xen/include/asm-ia64/domain.h     Wed Aug  3 09:35:16 2005
+++ b/xen/include/asm-ia64/domain.h     Wed Aug  3 09:35:38 2005
@@ -8,6 +8,7 @@
 #include <asm/vmmu.h>
 #include <asm/regionreg.h>
 #include <public/arch-ia64.h>
+#include <asm/vmx_platform.h>
 #endif // CONFIG_VTI
 #include <xen/list.h>
 
@@ -42,6 +43,7 @@
      * max_pages in domain struct, which indicates maximum memory size
      */
     unsigned long max_pfn;
+    struct virutal_platform_def     vmx_platform;
 #endif  //CONFIG_VTI
     u64 xen_vastart;
     u64 xen_vaend;
@@ -88,6 +90,7 @@
     thash_cb_t *vtlb;
     char irq_new_pending;
     char irq_new_condition;    // vpsr.i/vtpr change, check for pending VHPI
+    char hypercall_continuation;
     //for phycial  emulation
     unsigned long old_rsc;
     int mode_flags;
diff -r 63995acdd34a -r f294acb25858 xen/include/asm-ia64/event.h
--- a/xen/include/asm-ia64/event.h      Wed Aug  3 09:35:16 2005
+++ b/xen/include/asm-ia64/event.h      Wed Aug  3 09:35:38 2005
@@ -9,6 +9,9 @@
 #ifndef __ASM_EVENT_H__
 #define __ASM_EVENT_H__
 
+#include <public/arch-ia64.h>
+#include <asm/vcpu.h>
+
 static inline void evtchn_notify(struct vcpu *v)
 {
        vcpu_pend_interrupt(v, v->vcpu_info->arch.evtchn_vector);
diff -r 63995acdd34a -r f294acb25858 xen/include/asm-ia64/ia64_int.h
--- a/xen/include/asm-ia64/ia64_int.h   Wed Aug  3 09:35:16 2005
+++ b/xen/include/asm-ia64/ia64_int.h   Wed Aug  3 09:35:38 2005
@@ -37,7 +37,9 @@
 #define        IA64_RFI_IN_PROGRESS    0x0002
 #define IA64_RETRY              0x0003
 #ifdef  CONFIG_VTI
-#define IA64_FAULT             0x0002
+#undef  IA64_NO_FAULT
+#define        IA64_NO_FAULT           0x0000
+#define IA64_FAULT             0x0001
 #endif      //CONFIG_VTI
 #define IA64_FORCED_IFA         0x0004
 #define        IA64_ILLOP_FAULT        (IA64_GENEX_VECTOR | 0x00)
diff -r 63995acdd34a -r f294acb25858 xen/include/asm-ia64/privop.h
--- a/xen/include/asm-ia64/privop.h     Wed Aug  3 09:35:16 2005
+++ b/xen/include/asm-ia64/privop.h     Wed Aug  3 09:35:38 2005
@@ -138,14 +138,32 @@
     IA64_INST inst;
     struct { unsigned long qp:6, un14:14, r3:7, x6:6, x3:3, un1:1, major:4; };
 } INST64_M47;
+
 typedef union U_INST64_M1{
     IA64_INST inst;
     struct { unsigned long qp:6, r1:7, un7:7, r3:7, x:1, hint:2, x6:6, m:1, 
major:4; };
 } INST64_M1;
+
+typedef union U_INST64_M2{
+    IA64_INST inst;
+    struct { unsigned long qp:6, r1:7, r2:7, r3:7, x:1, hint:2, x6:6, m:1, 
major:4; };
+} INST64_M2;
+
+typedef union U_INST64_M3{
+    IA64_INST inst;
+    struct { unsigned long qp:6, r1:7, imm7:7, r3:7, i:1, hint:2, x6:6, s:1, 
major:4; };
+} INST64_M3;
+
 typedef union U_INST64_M4 {
     IA64_INST inst;
     struct { unsigned long qp:6, un7:7, r2:7, r3:7, x:1, hint:2, x6:6, m:1, 
major:4; };
 } INST64_M4;
+
+typedef union U_INST64_M5 {
+    IA64_INST inst;
+    struct { unsigned long qp:6, imm7:7, r2:7, r3:7, i:1, hint:2, x6:6, s:1, 
major:4; };
+} INST64_M5;
+
 typedef union U_INST64_M6 {
     IA64_INST inst;
     struct { unsigned long qp:6, f1:7, un7:7, r3:7, x:1, hint:2, x6:6, m:1, 
major:4; };
@@ -166,7 +184,10 @@
     INST64_I28 I28;    // mov from ar (I unit)
 #ifdef CONFIG_VTI
     INST64_M1  M1;  // ld integer
+    INST64_M2  M2;
+    INST64_M3  M3;
     INST64_M4  M4;  // st integer
+    INST64_M5  M5;
     INST64_M6  M6;  // ldfd floating pointer
 #endif // CONFIG_VTI
     INST64_M28 M28;    // purge translation cache entry
diff -r 63995acdd34a -r f294acb25858 xen/include/asm-ia64/regionreg.h
--- a/xen/include/asm-ia64/regionreg.h  Wed Aug  3 09:35:16 2005
+++ b/xen/include/asm-ia64/regionreg.h  Wed Aug  3 09:35:38 2005
@@ -39,4 +39,7 @@
 #define RR_RID(arg) (((arg) & 0x0000000000ffffff) << 8)
 #define RR_RID_MASK 0x00000000ffffff00L
 
+
+int set_one_rr(unsigned long rr, unsigned long val);
+
 #endif         /* !_REGIONREG_H_ */
diff -r 63995acdd34a -r f294acb25858 xen/include/asm-ia64/vcpu.h
--- a/xen/include/asm-ia64/vcpu.h       Wed Aug  3 09:35:16 2005
+++ b/xen/include/asm-ia64/vcpu.h       Wed Aug  3 09:35:38 2005
@@ -13,13 +13,9 @@
 struct vcpu;
 typedef        struct vcpu VCPU;
 
-// NOTE: The actual VCPU structure (struct virtualcpu) is defined in
-// thread.h.  Moving it to here caused a lot of files to change, so
-// for now, we'll leave well enough alone.
 typedef struct pt_regs REGS;
-//#define PSCB(vcpu)           (((struct spk_thread_t *)vcpu)->pscb)
-//#define vcpu_regs(vcpu)              &((struct spk_thread_t 
*)vcpu)->thread_regs
-//#define vcpu_thread(vcpu)    ((struct spk_thread_t *)vcpu)
+
+#define VCPU(_v,_x)    _v->vcpu_info->arch.privregs->_x
 
 #define PRIVOP_ADDR_COUNT
 #ifdef PRIVOP_ADDR_COUNT
diff -r 63995acdd34a -r f294acb25858 xen/include/asm-ia64/vmx.h
--- a/xen/include/asm-ia64/vmx.h        Wed Aug  3 09:35:16 2005
+++ b/xen/include/asm-ia64/vmx.h        Wed Aug  3 09:35:38 2005
@@ -23,6 +23,7 @@
 #define _ASM_IA64_VT_H
 
 #define RR7_SWITCH_SHIFT       12      /* 4k enough */
+#include <public/io/ioreq.h>
 
 extern void identify_vmx_feature(void);
 extern unsigned int vmx_enabled;
@@ -35,6 +36,22 @@
 extern void vmx_purge_double_mapping(u64, u64, u64);
 extern void vmx_change_double_mapping(struct vcpu *v, u64 oldrr7, u64 newrr7);
 
+
 extern void vmx_wait_io(void);
 extern void vmx_io_assist(struct vcpu *v);
+
+static inline vcpu_iodata_t *get_vio(struct domain *d, unsigned long cpu)
+{
+    return &((shared_iopage_t 
*)d->arch.vmx_platform.shared_page_va)->vcpu_iodata[cpu];
+}
+
+static inline int iopacket_port(struct domain *d)
+{
+    return ((shared_iopage_t 
*)d->arch.vmx_platform.shared_page_va)->sp_global.eport;
+}
+
+static inline shared_iopage_t *get_sp(struct domain *d)
+{
+    return (shared_iopage_t *)d->arch.vmx_platform.shared_page_va;
+}
 #endif /* _ASM_IA64_VT_H */
diff -r 63995acdd34a -r f294acb25858 xen/include/asm-ia64/vmx_uaccess.h
--- a/xen/include/asm-ia64/vmx_uaccess.h        Wed Aug  3 09:35:16 2005
+++ b/xen/include/asm-ia64/vmx_uaccess.h        Wed Aug  3 09:35:38 2005
@@ -40,6 +40,8 @@
  */
 asm (".section \"__ex_table\", \"a\"\n\t.previous");
 
+/* VT-i reserves bit 60 for the VMM; guest addresses have bit 60 = bit 59 */
+#define IS_VMM_ADDRESS(addr) ((((addr) >> 60) ^ ((addr) >> 59)) & 1)
 /* For back compatibility */
 #define __access_ok(addr, size, segment)       1
 #define access_ok(addr, size, segment) __access_ok((addr), (size), (segment))
diff -r 63995acdd34a -r f294acb25858 xen/include/asm-ia64/vmx_vcpu.h
--- a/xen/include/asm-ia64/vmx_vcpu.h   Wed Aug  3 09:35:16 2005
+++ b/xen/include/asm-ia64/vmx_vcpu.h   Wed Aug  3 09:35:38 2005
@@ -105,6 +105,10 @@
 extern void vtm_interruption_update(VCPU *vcpu, vtime_t* vtm);
 extern void vtm_domain_out(VCPU *vcpu);
 extern void vtm_domain_in(VCPU *vcpu);
+#ifdef V_IOSAPIC_READY
+extern void vlapic_update_ext_irq(VCPU *vcpu);
+extern void vlapic_update_shared_info(VCPU *vcpu);
+#endif
 extern void vlsapic_reset(VCPU *vcpu);
 extern int vmx_check_pending_irq(VCPU *vcpu);
 extern void guest_write_eoi(VCPU *vcpu);
@@ -399,6 +403,9 @@
 vmx_vcpu_set_lid(VCPU *vcpu, u64 val)
 {
     VPD_CR(vcpu,lid)=val;
+#ifdef V_IOSAPIC_READY
+    vlapic_update_shared_info(vcpu);
+#endif
     return IA64_NO_FAULT;
 }
 extern IA64FAULT vmx_vcpu_set_tpr(VCPU *vcpu, u64 val);
diff -r 63995acdd34a -r f294acb25858 xen/include/asm-ia64/vmx_vpd.h
--- a/xen/include/asm-ia64/vmx_vpd.h    Wed Aug  3 09:35:16 2005
+++ b/xen/include/asm-ia64/vmx_vpd.h    Wed Aug  3 09:35:38 2005
@@ -25,37 +25,10 @@
 #ifndef __ASSEMBLY__
 
 #include <asm/vtm.h>
-#include <asm/vmx_platform.h>
 #include <public/arch-ia64.h>
 
 #define VPD_SHIFT      17      /* 128K requirement */
 #define VPD_SIZE       (1 << VPD_SHIFT)
-typedef union {
-       unsigned long value;
-       struct {
-               int     a_int:1;
-               int     a_from_int_cr:1;
-               int     a_to_int_cr:1;
-               int     a_from_psr:1;
-               int     a_from_cpuid:1;
-               int     a_cover:1;
-               int     a_bsw:1;
-               long    reserved:57;
-       };
-} vac_t;
-
-typedef union {
-       unsigned long value;
-       struct {
-               int     d_vmsw:1;
-               int     d_extint:1;
-               int     d_ibr_dbr:1;
-               int     d_pmc:1;
-               int     d_to_pmd:1;
-               int     d_itm:1;
-               long    reserved:58;
-       };
-} vdc_t;
 
 typedef struct {
        unsigned long   dcr;            // CR0
@@ -89,29 +62,6 @@
        unsigned long   rsv6[46];
 } cr_t;
 
-typedef struct vpd {
-       vac_t                   vac;
-       vdc_t                   vdc;
-       unsigned long           virt_env_vaddr;
-       unsigned long           reserved1[29];
-       unsigned long           vhpi;
-       unsigned long           reserved2[95];
-       unsigned long           vgr[16];
-       unsigned long           vbgr[16];
-       unsigned long           vnat;
-       unsigned long           vbnat;
-       unsigned long           vcpuid[5];
-       unsigned long           reserved3[11];
-       unsigned long           vpsr;
-       unsigned long           vpr;
-       unsigned long           reserved4[76];
-       unsigned long           vcr[128];
-       unsigned long           reserved5[128];
-       unsigned long           reserved6[3456];
-       unsigned long           vmm_avail[128];
-       unsigned long           reserved7[4096];
-} vpd_t;
-
 void vmx_enter_scheduler(void);
 
 //FIXME: Map for LID to vcpu, Eddie
@@ -133,7 +83,6 @@
     unsigned long   rfi_ipsr;
     unsigned long   rfi_ifs;
        unsigned long   in_service[4];  // vLsapic inservice IRQ bits
-       struct virutal_platform_def     vmx_platform;
        unsigned long   flags;
 };
 
@@ -175,7 +124,6 @@
 
 #endif //__ASSEMBLY__
 
-
 // VPD field offset
 #define VPD_VAC_START_OFFSET           0
 #define VPD_VDC_START_OFFSET           8
diff -r 63995acdd34a -r f294acb25858 xen/include/asm-ia64/xensystem.h
--- a/xen/include/asm-ia64/xensystem.h  Wed Aug  3 09:35:16 2005
+++ b/xen/include/asm-ia64/xensystem.h  Wed Aug  3 09:35:38 2005
@@ -21,10 +21,13 @@
 #define XEN_RR7_SWITCH_STUB     0xb700000000000000
 #endif // CONFIG_VTI
 
+#define XEN_START_ADDR          0xf000000000000000
 #define KERNEL_START            0xf000000004000000
 #define PERCPU_ADDR             0xf100000000000000-PERCPU_PAGE_SIZE
 #define SHAREDINFO_ADDR                 0xf100000000000000
 #define VHPT_ADDR               0xf200000000000000
+#define SHARED_ARCHINFO_ADDR    0xf300000000000000
+#define XEN_END_ADDR            0xf400000000000000
 
 #ifndef __ASSEMBLY__
 
@@ -58,8 +61,9 @@
                ia64_save_extra(prev);                                          
                 \
        if (IA64_HAS_EXTRA_STATE(next))                                         
                 \
                ia64_load_extra(next);                                          
                 \
-       ia64_psr(ia64_task_regs(next))->dfh = !ia64_is_local_fpu_owner(next);   
                 \
+       /*ia64_psr(ia64_task_regs(next))->dfh = 
!ia64_is_local_fpu_owner(next);*/                        \
        (last) = ia64_switch_to((next));                                        
                 \
+       vcpu_set_next_timer(current);                                           
                \
 } while (0)
 #endif // CONFIG_VTI
 
diff -r 63995acdd34a -r f294acb25858 xen/include/public/arch-ia64.h
--- a/xen/include/public/arch-ia64.h    Wed Aug  3 09:35:16 2005
+++ b/xen/include/public/arch-ia64.h    Wed Aug  3 09:35:38 2005
@@ -140,38 +140,121 @@
        struct pt_fpreg f11;            /* scratch */
 };
 
-typedef struct {
-       unsigned long ipsr;
-       unsigned long iip;
-       unsigned long ifs;
-       unsigned long precover_ifs;
-       unsigned long isr;
-       unsigned long ifa;
-       unsigned long iipa;
-       unsigned long iim;
-       unsigned long unat;  // not sure if this is needed until NaT arch is 
done
-       unsigned long tpr;
-       unsigned long iha;
-       unsigned long itir;
-       unsigned long itv;
-       unsigned long pmv;
-       unsigned long cmcv;
-       unsigned long pta;
-       int interrupt_collection_enabled; // virtual psr.ic
-       int interrupt_delivery_enabled; // virtual psr.i
-       int pending_interruption;
-       int incomplete_regframe;        // see SDM vol2 6.8
-       unsigned long delivery_mask[4];
-       int metaphysical_mode;  // 1 = use metaphys mapping, 0 = use virtual
-       int banknum;    // 0 or 1, which virtual register bank is active
-       unsigned long bank0_regs[16]; // bank0 regs (r16-r31) when bank1 active
-       unsigned long bank1_regs[16]; // bank1 regs (r16-r31) when bank0 active
-       unsigned long rrs[8];   // region registers
-       unsigned long krs[8];   // kernel registers
-       unsigned long pkrs[8];  // protection key registers
-       unsigned long tmp[8];   // temp registers (e.g. for hyperprivops)
+typedef union {
+       unsigned long value;
+       struct {
+               int     a_int:1;
+               int     a_from_int_cr:1;
+               int     a_to_int_cr:1;
+               int     a_from_psr:1;
+               int     a_from_cpuid:1;
+               int     a_cover:1;
+               int     a_bsw:1;
+               long    reserved:57;
+       };
+} vac_t;
+
+typedef union {
+       unsigned long value;
+       struct {
+               int     d_vmsw:1;
+               int     d_extint:1;
+               int     d_ibr_dbr:1;
+               int     d_pmc:1;
+               int     d_to_pmd:1;
+               int     d_itm:1;
+               long    reserved:58;
+       };
+} vdc_t;
+
+typedef struct {
+       vac_t                   vac;
+       vdc_t                   vdc;
+       unsigned long           virt_env_vaddr;
+       unsigned long           reserved1[29];
+       unsigned long           vhpi;
+       unsigned long           reserved2[95];
+       union {
+         unsigned long         vgr[16];
+         unsigned long bank1_regs[16]; // bank1 regs (r16-r31) when bank0 
active
+       };
+       union {
+         unsigned long         vbgr[16];
+         unsigned long bank0_regs[16]; // bank0 regs (r16-r31) when bank1 
active
+       };
+       unsigned long           vnat;
+       unsigned long           vbnat;
+       unsigned long           vcpuid[5];
+       unsigned long           reserved3[11];
+       unsigned long           vpsr;
+       unsigned long           vpr;
+       unsigned long           reserved4[76];
+       union {
+         unsigned long         vcr[128];
+          struct {
+           unsigned long       dcr;            // CR0
+           unsigned long       itm;
+           unsigned long       iva;
+           unsigned long       rsv1[5];
+           unsigned long       pta;            // CR8
+           unsigned long       rsv2[7];
+           unsigned long       ipsr;           // CR16
+           unsigned long       isr;
+           unsigned long       rsv3;
+           unsigned long       iip;
+           unsigned long       ifa;
+           unsigned long       itir;
+           unsigned long       iipa;
+           unsigned long       ifs;
+           unsigned long       iim;            // CR24
+           unsigned long       iha;
+           unsigned long       rsv4[38];
+           unsigned long       lid;            // CR64
+           unsigned long       ivr;
+           unsigned long       tpr;
+           unsigned long       eoi;
+           unsigned long       irr[4];
+           unsigned long       itv;            // CR72
+           unsigned long       pmv;
+           unsigned long       cmcv;
+           unsigned long       rsv5[5];
+           unsigned long       lrr0;           // CR80
+           unsigned long       lrr1;
+           unsigned long       rsv6[46];
+          };
+       };
+       union {
+         unsigned long         reserved5[128];
+         struct {
+           unsigned long precover_ifs;
+           unsigned long unat;  // not sure if this is needed until NaT arch 
is done
+           int interrupt_collection_enabled; // virtual psr.ic
+           int interrupt_delivery_enabled; // virtual psr.i
+           int pending_interruption;
+           int incomplete_regframe;    // see SDM vol2 6.8
+           unsigned long delivery_mask[4];
+           int metaphysical_mode;      // 1 = use metaphys mapping, 0 = use 
virtual
+           int banknum;        // 0 or 1, which virtual register bank is active
+           unsigned long rrs[8];       // region registers
+           unsigned long krs[8];       // kernel registers
+           unsigned long pkrs[8];      // protection key registers
+           unsigned long tmp[8];       // temp registers (e.g. for 
hyperprivops)
+         };
+        };
+#ifdef CONFIG_VTI
+       unsigned long           reserved6[3456];
+       unsigned long           vmm_avail[128];
+       unsigned long           reserved7[4096];
+#endif
+} mapped_regs_t;
+
+typedef struct {
+       mapped_regs_t *privregs;
        int evtchn_vector;
 } arch_vcpu_info_t;
+
+typedef mapped_regs_t vpd_t;
+
 #define __ARCH_HAS_VCPU_INFO
 
 typedef struct {
diff -r 63995acdd34a -r f294acb25858 xen/arch/ia64/asm-xsi-offsets.c
--- /dev/null   Wed Aug  3 09:35:16 2005
+++ b/xen/arch/ia64/asm-xsi-offsets.c   Wed Aug  3 09:35:38 2005
@@ -0,0 +1,110 @@
+/* -*-  Mode:C; c-basic-offset:4; tab-width:4; indent-tabs-mode:nil -*- */
+/*
+ * asm-xsi-offsets.c_
+ * Copyright (c) 2005, Intel Corporation.
+ *      Kun Tian (Kevin Tian) <kevin.tian@xxxxxxxxx>
+ *      Eddie Dong  <eddie.dong@xxxxxxxxx>
+ *      Fred Yang <fred.yang@xxxxxxxxx>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ */
+
+/*
+ * Generate definitions needed by assembly language modules.
+ * This code generates raw asm output which is post-processed
+ * to extract and format the required data.
+ */
+
+#include <xen/config.h>
+#include <xen/sched.h>
+#include <asm/processor.h>
+#include <asm/ptrace.h>
+#include <public/xen.h>
+#ifdef CONFIG_VTI
+#include <asm/tlb.h>
+#include <asm/regs.h>
+#endif // CONFIG_VTI
+
+#define task_struct vcpu
+
+#define DEFINE(sym, val) \
+        asm volatile("\n->" #sym " %0 " #val : : "i" (val))
+
+#define BLANK() asm volatile("\n->" : : )
+
+#define OFFSET(_sym, _str, _mem) \
+    DEFINE(_sym, offsetof(_str, _mem));
+
+void foo(void)
+{
+
+       DEFINE(XSI_BASE, SHARED_ARCHINFO_ADDR);
+
+       DEFINE(XSI_PSR_I_OFS, offsetof(mapped_regs_t, 
interrupt_delivery_enabled));
+       DEFINE(XSI_PSR_I, (SHARED_ARCHINFO_ADDR+offsetof(mapped_regs_t, 
interrupt_delivery_enabled)));
+       DEFINE(XSI_IPSR, (SHARED_ARCHINFO_ADDR+offsetof(mapped_regs_t, ipsr)));
+       DEFINE(XSI_IPSR_OFS, offsetof(mapped_regs_t, ipsr));
+       DEFINE(XSI_IIP_OFS, offsetof(mapped_regs_t, iip));
+       DEFINE(XSI_IIP, (SHARED_ARCHINFO_ADDR+offsetof(mapped_regs_t, iip)));
+       DEFINE(XSI_IFS_OFS, offsetof(mapped_regs_t, ifs));
+       DEFINE(XSI_IFS, (SHARED_ARCHINFO_ADDR+offsetof(mapped_regs_t, ifs)));
+       DEFINE(XSI_PRECOVER_IFS_OFS, offsetof(mapped_regs_t, precover_ifs));
+       DEFINE(XSI_PRECOVER_IFS, (SHARED_ARCHINFO_ADDR+offsetof(mapped_regs_t, 
precover_ifs)));
+       DEFINE(XSI_ISR_OFS, offsetof(mapped_regs_t, isr));
+       DEFINE(XSI_ISR, (SHARED_ARCHINFO_ADDR+offsetof(mapped_regs_t, isr)));
+       DEFINE(XSI_IFA_OFS, offsetof(mapped_regs_t, ifa));
+       DEFINE(XSI_IFA, (SHARED_ARCHINFO_ADDR+offsetof(mapped_regs_t, ifa)));
+       DEFINE(XSI_IIPA_OFS, offsetof(mapped_regs_t, iipa));
+       DEFINE(XSI_IIPA, (SHARED_ARCHINFO_ADDR+offsetof(mapped_regs_t, iipa)));
+       DEFINE(XSI_IIM_OFS, offsetof(mapped_regs_t, iim));
+       DEFINE(XSI_IIM, (SHARED_ARCHINFO_ADDR+offsetof(mapped_regs_t, iim)));
+       DEFINE(XSI_TPR_OFS, offsetof(mapped_regs_t, tpr));
+       DEFINE(XSI_TPR, (SHARED_ARCHINFO_ADDR+offsetof(mapped_regs_t, tpr)));
+       DEFINE(XSI_IHA_OFS, offsetof(mapped_regs_t, iha));
+       DEFINE(XSI_IHA, (SHARED_ARCHINFO_ADDR+offsetof(mapped_regs_t, iha)));
+       DEFINE(XSI_ITIR_OFS, offsetof(mapped_regs_t, itir));
+       DEFINE(XSI_ITIR, (SHARED_ARCHINFO_ADDR+offsetof(mapped_regs_t, itir)));
+       DEFINE(XSI_ITV_OFS, offsetof(mapped_regs_t, itv));
+       DEFINE(XSI_ITV, (SHARED_ARCHINFO_ADDR+offsetof(mapped_regs_t, itv)));
+       DEFINE(XSI_PTA_OFS, offsetof(mapped_regs_t, pta));
+       DEFINE(XSI_PTA, (SHARED_ARCHINFO_ADDR+offsetof(mapped_regs_t, pta)));
+       DEFINE(XSI_PSR_IC_OFS, offsetof(mapped_regs_t, 
interrupt_collection_enabled));
+       DEFINE(XSI_PSR_IC, (SHARED_ARCHINFO_ADDR+offsetof(mapped_regs_t, 
interrupt_collection_enabled)));
+       DEFINE(XSI_PEND_OFS, offsetof(mapped_regs_t, pending_interruption));
+       DEFINE(XSI_PEND, (SHARED_ARCHINFO_ADDR+offsetof(mapped_regs_t, 
pending_interruption)));
+       DEFINE(XSI_INCOMPL_REGFR_OFS, offsetof(mapped_regs_t, 
incomplete_regframe));
+       DEFINE(XSI_INCOMPL_REGFR, (SHARED_ARCHINFO_ADDR+offsetof(mapped_regs_t, 
incomplete_regframe)));
+       DEFINE(XSI_DELIV_MASK0_OFS, offsetof(mapped_regs_t, delivery_mask[0]));
+       DEFINE(XSI_DELIV_MASK0, (SHARED_ARCHINFO_ADDR+offsetof(mapped_regs_t, 
delivery_mask[0])));
+       DEFINE(XSI_METAPHYS_OFS, offsetof(mapped_regs_t, metaphysical_mode));
+       DEFINE(XSI_METAPHYS, (SHARED_ARCHINFO_ADDR+offsetof(mapped_regs_t, 
metaphysical_mode)));
+
+       DEFINE(XSI_BANKNUM_OFS, offsetof(mapped_regs_t, banknum));
+       DEFINE(XSI_BANKNUM, (SHARED_ARCHINFO_ADDR+offsetof(mapped_regs_t, 
banknum)));
+
+       DEFINE(XSI_BANK0_R16_OFS, offsetof(mapped_regs_t, bank0_regs[0]));
+       DEFINE(XSI_BANK0_R16, (SHARED_ARCHINFO_ADDR+offsetof(mapped_regs_t, 
bank0_regs[0])));
+       DEFINE(XSI_BANK1_R16_OFS, offsetof(mapped_regs_t, bank1_regs[0]));
+       DEFINE(XSI_BANK1_R16, (SHARED_ARCHINFO_ADDR+offsetof(mapped_regs_t, 
bank1_regs[0])));
+       DEFINE(XSI_RR0_OFS, offsetof(mapped_regs_t, rrs[0]));
+       DEFINE(XSI_RR0, (SHARED_ARCHINFO_ADDR+offsetof(mapped_regs_t, rrs[0])));
+       DEFINE(XSI_KR0_OFS, offsetof(mapped_regs_t, krs[0]));
+       DEFINE(XSI_KR0, (SHARED_ARCHINFO_ADDR+offsetof(mapped_regs_t, krs[0])));
+       DEFINE(XSI_PKR0_OFS, offsetof(mapped_regs_t, pkrs[0]));
+       DEFINE(XSI_PKR0, (SHARED_ARCHINFO_ADDR+offsetof(mapped_regs_t, 
pkrs[0])));
+       DEFINE(XSI_TMP0_OFS, offsetof(mapped_regs_t, tmp[0]));
+       DEFINE(XSI_TMP0, (SHARED_ARCHINFO_ADDR+offsetof(mapped_regs_t, 
tmp[0])));
+       
+}

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

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