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

[Xen-changelog] [xen-unstable] [IA64] remove the requirement (vpsr.ic==0) from hyperprivop



# HG changeset patch
# User awilliam@xxxxxxxxxxxx
# Date 1167780470 25200
# Node ID 99ff540b0efefad4c2402b9f93a59c2d597d824c
# Parent  a50fd1fed61ecb4909899010c0f44ac90d75f7aa
[IA64] remove the requirement (vpsr.ic==0) from hyperprivop

remove the requirement (vpsr.ic==0) from hyperprivop

There two reasons for this.
1. make xen-parse code more readable.
2. a little bit performance improvement

Signed-off-by: Anthony Xu <anthony.xu@xxxxxxxxx>
---
 linux-2.6-xen-sparse/arch/ia64/kernel/gate.S       |   24 +---
 linux-2.6-xen-sparse/arch/ia64/kernel/gate.lds.S   |    8 -
 linux-2.6-xen-sparse/arch/ia64/kernel/patch.c      |    4 
 linux-2.6-xen-sparse/arch/ia64/xen/hypercall.S     |  103 ---------------------
 linux-2.6-xen-sparse/arch/ia64/xen/xenentry.S      |   31 ++----
 linux-2.6-xen-sparse/arch/ia64/xen/xenivt.S        |   54 ++++-------
 linux-2.6-xen-sparse/arch/ia64/xen/xenpal.S        |   14 +-
 linux-2.6-xen-sparse/include/asm-ia64/xen/privop.h |   10 +-
 xen/arch/ia64/xen/faults.c                         |    3 
 xen/arch/ia64/xen/ivt.S                            |   25 +++--
 xen/include/public/arch-ia64.h                     |   53 +++++-----
 11 files changed, 102 insertions(+), 227 deletions(-)

diff -r a50fd1fed61e -r 99ff540b0efe 
linux-2.6-xen-sparse/arch/ia64/kernel/gate.S
--- a/linux-2.6-xen-sparse/arch/ia64/kernel/gate.S      Tue Jan 02 15:19:44 
2007 -0700
+++ b/linux-2.6-xen-sparse/arch/ia64/kernel/gate.S      Tue Jan 02 16:27:50 
2007 -0700
@@ -56,18 +56,6 @@
 #define LOAD_RUNNING_ON_XEN(reg)                       \
 [1:]   movl reg=0;                                     \
        .xdata4 ".data.patch.running_on_xen", 1b-.
-
-       .section ".data.patch.brl_xen_rsm_be_i", "a"
-       .previous
-#define BRL_COND_XEN_RSM_BE_I(pr)                      \
-[1:](pr)brl.cond.sptk 0;                               \
-       .xdata4 ".data.patch.brl_xen_rsm_be_i", 1b-.
-
-       .section ".data.patch.brl_xen_get_psr", "a"
-       .previous
-#define BRL_COND_XEN_GET_PSR(pr)                       \
-[1:](pr)brl.cond.sptk 0;                               \
-       .xdata4 ".data.patch.brl_xen_get_psr", 1b-.
 
        .section ".data.patch.brl_xen_ssm_i_0", "a"
        .previous
@@ -156,9 +144,9 @@ GLOBAL_ENTRY(__kernel_syscall_via_epc)
        cmp.ne isXen,isRaw=r0,r30
        ;;
 (isRaw)        rsm psr.be | psr.i
-       BRL_COND_XEN_RSM_BE_I(isXen)
-       .global .vdso_rsm_be_i_ret
-.vdso_rsm_be_i_ret:
+(isXen)        st1 [r22]=r20
+(isXen)        XEN_HYPER_RSM_BE
+       ;;
 #else
        rsm psr.be | psr.i                      // M2 (5 cyc to srlz.d)
 #endif
@@ -171,9 +159,9 @@ GLOBAL_ENTRY(__kernel_syscall_via_epc)
        lfetch [r18]                            // M0|1
 #ifdef CONFIG_XEN_IA64_VDSO_PARAVIRT
 (isRaw)        mov r29=psr
-       BRL_COND_XEN_GET_PSR(isXen)
-       .global .vdso_get_psr_ret
-.vdso_get_psr_ret:
+(isXen)        XEN_HYPER_GET_PSR
+       ;;
+(isXen)        mov r29=r8
 #else
        mov r29=psr                             // M2 (12 cyc)
 #endif
diff -r a50fd1fed61e -r 99ff540b0efe 
linux-2.6-xen-sparse/arch/ia64/kernel/gate.lds.S
--- a/linux-2.6-xen-sparse/arch/ia64/kernel/gate.lds.S  Tue Jan 02 15:19:44 
2007 -0700
+++ b/linux-2.6-xen-sparse/arch/ia64/kernel/gate.lds.S  Tue Jan 02 16:27:50 
2007 -0700
@@ -49,14 +49,6 @@ SECTIONS
                                    __start_gate_running_on_xen_patchlist = .;
                                    *(.data.patch.running_on_xen)
                                    __end_gate_running_on_xen_patchlist = .;
-
-                                   __start_gate_brl_xen_rsm_be_i_patchlist = .;
-                                   *(.data.patch.brl_xen_rsm_be_i)
-                                   __end_gate_brl_xen_rsm_be_i_patchlist = .;
-
-                                   __start_gate_brl_xen_get_psr_patchlist = .;
-                                   *(.data.patch.brl_xen_get_psr)
-                                   __end_gate_brl_xen_get_psr_patchlist = .;
 
                                    __start_gate_brl_xen_ssm_i_0_patchlist = .;
                                    *(.data.patch.brl_xen_ssm_i_0)
diff -r a50fd1fed61e -r 99ff540b0efe 
linux-2.6-xen-sparse/arch/ia64/kernel/patch.c
--- a/linux-2.6-xen-sparse/arch/ia64/kernel/patch.c     Tue Jan 02 15:19:44 
2007 -0700
+++ b/linux-2.6-xen-sparse/arch/ia64/kernel/patch.c     Tue Jan 02 16:27:50 
2007 -0700
@@ -236,13 +236,9 @@ static void
 static void
 patch_brl_in_vdso(void)
 {
-       EXTERN_PATCHLIST(xen_rsm_be_i);
-       EXTERN_PATCHLIST(xen_get_psr);
        EXTERN_PATCHLIST(xen_ssm_i_0);
        EXTERN_PATCHLIST(xen_ssm_i_1);
 
-       PATCH_BRL_SYMADDR(xen_rsm_be_i);
-       PATCH_BRL_SYMADDR(xen_get_psr);
        PATCH_BRL_SYMADDR(xen_ssm_i_0);
        PATCH_BRL_SYMADDR(xen_ssm_i_1);
 }
diff -r a50fd1fed61e -r 99ff540b0efe 
linux-2.6-xen-sparse/arch/ia64/xen/hypercall.S
--- a/linux-2.6-xen-sparse/arch/ia64/xen/hypercall.S    Tue Jan 02 15:19:44 
2007 -0700
+++ b/linux-2.6-xen-sparse/arch/ia64/xen/hypercall.S    Tue Jan 02 16:27:50 
2007 -0700
@@ -8,27 +8,6 @@
 #include <asm/processor.h>
 #include <asm/asmmacro.h>
 
-/* To clear vpsr.ic, vpsr.i needs to be cleared first */
-#define XEN_CLEAR_PSR_IC                               \
-       mov r14=1;                                      \
-       movl r15=XSI_PSR_I_ADDR;                        \
-       movl r2=XSI_PSR_IC;                             \
-       ;;                                              \
-       ld8 r15=[r15];                                  \
-       ld4 r3=[r2];                                    \
-       ;;                                              \
-       ld1 r16=[r15];                                  \
-       ;;                                              \
-       st1 [r15]=r14;                                  \
-       st4 [r2]=r0;                                    \
-       ;;
-
-/* First restore vpsr.ic, and then vpsr.i */
-#define XEN_RESTORE_PSR_IC                             \
-       st4 [r2]=r3;                                    \
-       st1 [r15]=r16;                                  \
-       ;;
-
 GLOBAL_ENTRY(xen_get_ivr)
        movl r8=running_on_xen;;
        ld4 r8=[r8];;
@@ -36,12 +15,8 @@ GLOBAL_ENTRY(xen_get_ivr)
 (p7)   mov r8=cr.ivr;;
 (p7)   br.ret.sptk.many rp
        ;;
-       XEN_CLEAR_PSR_IC
-       ;;
        XEN_HYPER_GET_IVR
        ;;
-       XEN_RESTORE_PSR_IC
-       ;;
        br.ret.sptk.many rp
        ;;
 END(xen_get_ivr)
@@ -53,12 +28,8 @@ GLOBAL_ENTRY(xen_get_tpr)
 (p7)   mov r8=cr.tpr;;
 (p7)   br.ret.sptk.many rp
        ;;
-       XEN_CLEAR_PSR_IC
-       ;;
        XEN_HYPER_GET_TPR
        ;;
-       XEN_RESTORE_PSR_IC
-       ;;
        br.ret.sptk.many rp
        ;;
 END(xen_get_tpr)
@@ -72,12 +43,8 @@ GLOBAL_ENTRY(xen_set_tpr)
        ;;
        mov r8=r32
        ;;
-       XEN_CLEAR_PSR_IC
-       ;;
        XEN_HYPER_SET_TPR
        ;;
-       XEN_RESTORE_PSR_IC
-       ;;
        br.ret.sptk.many rp
        ;;
 END(xen_set_tpr)
@@ -91,12 +58,8 @@ GLOBAL_ENTRY(xen_eoi)
        ;;
        mov r8=r32
        ;;
-       XEN_CLEAR_PSR_IC
-       ;;
        XEN_HYPER_EOI
        ;;
-       XEN_RESTORE_PSR_IC
-       ;;
        br.ret.sptk.many rp
        ;;
 END(xen_eoi)
@@ -110,12 +73,8 @@ GLOBAL_ENTRY(xen_thash)
        ;;
        mov r8=r32
        ;;
-       XEN_CLEAR_PSR_IC
-       ;;
        XEN_HYPER_THASH
        ;;
-       XEN_RESTORE_PSR_IC
-       ;;
        br.ret.sptk.many rp
        ;;
 END(xen_thash)
@@ -129,12 +88,8 @@ GLOBAL_ENTRY(xen_set_itm)
        ;;
        mov r8=r32
        ;;
-       XEN_CLEAR_PSR_IC
-       ;;
        XEN_HYPER_SET_ITM
        ;;
-       XEN_RESTORE_PSR_IC
-       ;;
        br.ret.sptk.many rp
        ;;
 END(xen_set_itm)
@@ -149,12 +104,8 @@ GLOBAL_ENTRY(xen_ptcga)
        mov r8=r32
        mov r9=r33
        ;;
-       XEN_CLEAR_PSR_IC
-       ;;
        XEN_HYPER_PTC_GA
        ;;
-       XEN_RESTORE_PSR_IC
-       ;;
        br.ret.sptk.many rp
        ;;
 END(xen_ptcga)
@@ -168,12 +119,8 @@ GLOBAL_ENTRY(xen_get_rr)
        ;;
        mov r8=r32
        ;;
-       XEN_CLEAR_PSR_IC
-       ;;
        XEN_HYPER_GET_RR
        ;;
-       XEN_RESTORE_PSR_IC
-       ;;
        br.ret.sptk.many rp
        ;;
 END(xen_get_rr)
@@ -188,11 +135,7 @@ GLOBAL_ENTRY(xen_set_rr)
        mov r8=r32
        mov r9=r33
        ;;
-       XEN_CLEAR_PSR_IC
-       ;;
        XEN_HYPER_SET_RR
-       ;;
-       XEN_RESTORE_PSR_IC
        ;;
        br.ret.sptk.many rp
        ;;
@@ -240,12 +183,8 @@ 1: mov r8=r32
 1:     mov r8=r32
        mov r9=r33
        ;;
-       XEN_CLEAR_PSR_IC
-       ;;
        XEN_HYPER_SET_KR
        ;;
-       XEN_RESTORE_PSR_IC
-       ;;
        br.ret.sptk.many rp
 END(xen_set_kr)
 
@@ -258,12 +197,8 @@ GLOBAL_ENTRY(xen_fc)
        ;;
        mov r8=r32
        ;;
-       XEN_CLEAR_PSR_IC
-       ;;
        XEN_HYPER_FC
        ;;
-       XEN_RESTORE_PSR_IC
-       ;;
        br.ret.sptk.many rp
 END(xen_fc)
 
@@ -276,12 +211,8 @@ GLOBAL_ENTRY(xen_get_cpuid)
        ;;
        mov r8=r32
        ;;
-       XEN_CLEAR_PSR_IC
-       ;;
        XEN_HYPER_GET_CPUID
        ;;
-       XEN_RESTORE_PSR_IC
-       ;;
        br.ret.sptk.many rp
 END(xen_get_cpuid)
 
@@ -294,11 +225,7 @@ GLOBAL_ENTRY(xen_get_pmd)
        ;;
        mov r8=r32
        ;;
-       XEN_CLEAR_PSR_IC
-       ;;
        XEN_HYPER_GET_PMD
-       ;;
-       XEN_RESTORE_PSR_IC
        ;;
        br.ret.sptk.many rp
 END(xen_get_pmd)
@@ -313,11 +240,7 @@ GLOBAL_ENTRY(xen_get_eflag)
        ;;
        mov r8=r32
        ;;
-       XEN_CLEAR_PSR_IC
-       ;;
        XEN_HYPER_GET_EFLAG
-       ;;
-       XEN_RESTORE_PSR_IC
        ;;
        br.ret.sptk.many rp
 END(xen_get_eflag)
@@ -332,11 +255,7 @@ GLOBAL_ENTRY(xen_set_eflag)
        ;;
        mov r8=r32
        ;;
-       XEN_CLEAR_PSR_IC
-       ;;
        XEN_HYPER_SET_EFLAG
-       ;;
-       XEN_RESTORE_PSR_IC
        ;;
        br.ret.sptk.many rp
 END(xen_set_eflag)
@@ -355,27 +274,6 @@ END(xen_send_ipi)
 #ifdef CONFIG_XEN_IA64_VDSO_PARAVIRT
 // Those are vdso specialized.
 // In fsys mode, call, ret can't be used.
-GLOBAL_ENTRY(xen_rsm_be_i)
-       st1 [r22]=r20
-       st4 [r23]=r0
-       XEN_HYPER_RSM_BE
-       st4 [r23]=r20
-       brl.cond.sptk   .vdso_rsm_be_i_ret
-       ;; 
-END(xen_rsm_be_i)
-
-GLOBAL_ENTRY(xen_get_psr)
-       mov r31=r8
-       mov r25=IA64_PSR_IC
-       st4 [r23]=r0
-       XEN_HYPER_GET_PSR
-       ;; 
-       st4 [r23]=r20
-       or r29=r8,r25 // vpsr.ic was cleared for hyperprivop
-       mov r8=r31
-       brl.cond.sptk   .vdso_get_psr_ret
-       ;; 
-END(xen_get_psr)
 
        // see xen_ssm_i() in privop.h
        // r22 = &vcpu->vcpu_info->evtchn_upcall_mask
@@ -395,7 +293,6 @@ END(xen_get_psr)
 (p14)  cmp.ne.unc p11,p0=r0,r25;       \
        ;;                              \
 (p11)  st1 [r22]=r20;                  \
-(p11)  st4 [r23]=r0;                   \
 (p11)  XEN_HYPER_SSM_I;
                
 GLOBAL_ENTRY(xen_ssm_i_0)
diff -r a50fd1fed61e -r 99ff540b0efe 
linux-2.6-xen-sparse/arch/ia64/xen/xenentry.S
--- a/linux-2.6-xen-sparse/arch/ia64/xen/xenentry.S     Tue Jan 02 15:19:44 
2007 -0700
+++ b/linux-2.6-xen-sparse/arch/ia64/xen/xenentry.S     Tue Jan 02 16:27:50 
2007 -0700
@@ -59,12 +59,6 @@ GLOBAL_ENTRY(ia64_switch_to)
        shr.u r26=r20,IA64_GRANULE_SHIFT
        cmp.eq p7,p6=r25,in0
        ;;
-#ifdef CONFIG_XEN
-       movl r8=XSI_PSR_IC
-       ;;
-       st4 [r8]=r0     // force psr.ic off for hyperprivop(s)
-       ;;
-#endif
        /*
         * If we've already mapped this task's page, we can skip doing it again.
         */
@@ -72,19 +66,13 @@ GLOBAL_ENTRY(ia64_switch_to)
 (p6)   br.cond.dpnt .map
        ;;
 .done:
-#ifdef CONFIG_XEN
-       // psr.ic already off
+       ld8 sp=[r21]                    // load kernel stack pointer of new task
+#ifdef CONFIG_XEN
        // update "current" application register
        mov r8=IA64_KR_CURRENT
        mov r9=in0;;
        XEN_HYPER_SET_KR
-       ld8 sp=[r21]                    // load kernel stack pointer of new task
-       movl r27=XSI_PSR_IC
-       mov r8=1
-       ;;
-       st4 [r27]=r8                    // psr.ic back on
-#else
-       ld8 sp=[r21]                    // load kernel stack pointer of new task
+#else
        mov IA64_KR(CURRENT)=in0        // update "current" application register
 #endif
        mov r8=r13                      // return pointer to previously running 
task
@@ -99,7 +87,10 @@ GLOBAL_ENTRY(ia64_switch_to)
 
 .map:
 #ifdef CONFIG_XEN
-       // psr.ic already off
+    movl r25=XSI_PSR_IC                        // clear psr.ic
+    ;;
+    st4 [r25]=r0
+    ;;
 #else
        rsm psr.ic                      // interrupts (psr.i) are already 
disabled here
 #endif
@@ -132,7 +123,13 @@ GLOBAL_ENTRY(ia64_switch_to)
 #endif
        ;;
        itr.d dtr[r25]=r23              // wire in new mapping...
-#ifndef CONFIG_XEN
+#ifdef CONFIG_XEN
+       mov r9=1
+       movl r8=XSI_PSR_IC
+       ;;
+       st4 [r8]=r9
+       ;;
+#else    
        ssm psr.ic                      // reenable the psr.ic bit
        ;;
        srlz.d
diff -r a50fd1fed61e -r 99ff540b0efe linux-2.6-xen-sparse/arch/ia64/xen/xenivt.S
--- a/linux-2.6-xen-sparse/arch/ia64/xen/xenivt.S       Tue Jan 02 15:19:44 
2007 -0700
+++ b/linux-2.6-xen-sparse/arch/ia64/xen/xenivt.S       Tue Jan 02 16:27:50 
2007 -0700
@@ -709,11 +709,23 @@ ENTRY(page_fault)
        ;;
 #endif
 #ifdef CONFIG_XEN
-       br.cond.sptk.many       xen_page_fault
-       ;;
-done_xen_page_fault:
-#endif
+    
+#define MASK_TO_PEND_OFS    (-1)
+    
+(p15)  movl r14=XSI_PSR_I_ADDR
+       ;;
+(p15)  ld8 r14=[r14]
+       ;;
+(p15)  st1 [r14]=r0,MASK_TO_PEND_OFS           // if (p15) vpsr.i = 1
+       ;;              // if (p15) (vcpu->vcpu_info->evtchn_upcall_mask)=0
+(p15)  ld1 r14=[r14]   // if (vcpu->vcpu_info->evtchn_upcall_pending)
+       ;;
+(p15)  cmp.ne  p15,p0=r14,r0
+       ;;
+(p15)  XEN_HYPER_SSM_I
+#else
 (p15)  ssm psr.i                               // restore psr.i
+#endif
        movl r14=ia64_leave_kernel
        ;;
        SAVE_REST
@@ -729,25 +741,6 @@ ENTRY(dkey_miss)
 ENTRY(dkey_miss)
        DBG_FAULT(7)
        FAULT(7)
-#ifdef CONFIG_XEN
-       // Leaving this code inline above results in an IVT section overflow
-       // There is no particular reason for this code to be here...
-xen_page_fault:
-(p15)  movl r3=XSI_PSR_I_ADDR
-       ;;
-(p15)  ld8 r3=[r3]
-       ;;
-(p15)  st1 [r3]=r0,-1  // if (p15) vpsr.i = 1
-       mov r14=r0
-       ;;
-(p15)  ld1 r14=[r3]                            // if (pending_events)
-       adds r3=8,r2                            // re-set up second base pointer
-       ;;
-(p15)  cmp.ne  p15,p0=r14,r0
-       ;;
-       br.cond.sptk.many done_xen_page_fault
-       ;;
-#endif
 END(dkey_miss)
 
        .org ia64_ivt+0x2000
@@ -1170,14 +1163,13 @@ 1:
 #ifdef CONFIG_XEN
 (p15)  ld8 r16=[r16]                           // vpsr.i
        ;;
-(p15)  st1 [r16]=r0,-1         // if (p15) vpsr.i = 1
-       mov r2=r0
-       ;;
-(p15)  ld1 r2=[r16]                            // if (pending_events)
-       ;;
-       cmp.ne  p6,p0=r2,r0
-       ;;
-(p6)   ssm     psr.i                           //   do a real ssm psr.i
+(p15)  st1 [r16]=r0,MASK_TO_PEND_OFS           // if (p15) vpsr.i = 1
+       ;;              // if (p15) (vcpu->vcpu_info->evtchn_upcall_mask)=0
+(p15)  ld1 r2=[r16]    // if (vcpu->vcpu_info->evtchn_upcall_pending)
+       ;;
+(p15)  cmp.ne.unc p6,p0=r2,r0
+       ;;
+(p6)   XEN_HYPER_SSM_I                         //   do a real ssm psr.i
 #else
 (p15)  ssm psr.i                               // M2   restore psr.i
 #endif
diff -r a50fd1fed61e -r 99ff540b0efe linux-2.6-xen-sparse/arch/ia64/xen/xenpal.S
--- a/linux-2.6-xen-sparse/arch/ia64/xen/xenpal.S       Tue Jan 02 15:19:44 
2007 -0700
+++ b/linux-2.6-xen-sparse/arch/ia64/xen/xenpal.S       Tue Jan 02 16:27:50 
2007 -0700
@@ -41,16 +41,16 @@ 1:  {
 #ifdef CONFIG_XEN
        // this is low priority for paravirtualization, but is called
        // from the idle loop so confuses privop counting
-       movl r31=XSI_PSR_IC
+       movl r31=XSI_PSR_I_ADDR
        ;;
-(p6)   st4 [r31]=r0
+       ld8 r31=[r31]
+       mov r22=1
        ;;
-(p7)   adds r31=XSI_PSR_I_ADDR_OFS-XSI_PSR_IC_OFS,r31
-(p7)   mov r22=1
+       st1 [r31]=r22
+       ;;  
+(p6)   movl r31=XSI_PSR_IC
        ;;
-(p7)   ld8 r31=[r31]
-       ;;
-(p7)   st1 [r31]=r22
+(p6)   st4.rel [r31]=r0
        ;;
        mov r31 = in3
        mov b7 = loc2
diff -r a50fd1fed61e -r 99ff540b0efe 
linux-2.6-xen-sparse/include/asm-ia64/xen/privop.h
--- a/linux-2.6-xen-sparse/include/asm-ia64/xen/privop.h        Tue Jan 02 
15:19:44 2007 -0700
+++ b/linux-2.6-xen-sparse/include/asm-ia64/xen/privop.h        Tue Jan 02 
16:27:50 2007 -0700
@@ -123,8 +123,6 @@ extern void xen_set_eflag(unsigned long)
  * that we inline it */
 #define xen_hyper_ssm_i()                                              \
 ({                                                                     \
-       xen_set_virtual_psr_i(0);                                       \
-       xen_set_virtual_psr_ic(0);                                      \
        XEN_HYPER_SSM_I;                                                \
 })
 
@@ -139,8 +137,12 @@ extern void xen_set_eflag(unsigned long)
 #define xen_ssm_i()                                                    \
 ({                                                                     \
        int old = xen_get_virtual_psr_i();                              \
-       xen_set_virtual_psr_i(1);                                       \
-       if (!old && xen_get_virtual_pend()) xen_hyper_ssm_i();          \
+       if (!old) {                                                     \
+               if (xen_get_virtual_pend())                             \
+                       xen_hyper_ssm_i();                              \
+               else                                                    \
+                       xen_set_virtual_psr_i(1);                       \
+       }                                                               \
 })
 
 #define xen_ia64_intrin_local_irq_restore(x)                           \
diff -r a50fd1fed61e -r 99ff540b0efe xen/arch/ia64/xen/faults.c
--- a/xen/arch/ia64/xen/faults.c        Tue Jan 02 15:19:44 2007 -0700
+++ b/xen/arch/ia64/xen/faults.c        Tue Jan 02 16:27:50 2007 -0700
@@ -545,7 +545,8 @@ ia64_handle_break(unsigned long ifa, str
                                vcpu_increment_iip(current);
                } else
                        reflect_interruption(isr, regs, vector);
-       } else if (!PSCB(v, interrupt_collection_enabled)) {
+       } else if ((iim - HYPERPRIVOP_START) < HYPERPRIVOP_MAX
+                  && ia64_get_cpl(regs->cr_ipsr) == 2) {
                if (ia64_hyperprivop(iim, regs))
                        vcpu_increment_iip(current);
        } else {
diff -r a50fd1fed61e -r 99ff540b0efe xen/arch/ia64/xen/ivt.S
--- a/xen/arch/ia64/xen/ivt.S   Tue Jan 02 15:19:44 2007 -0700
+++ b/xen/arch/ia64/xen/ivt.S   Tue Jan 02 16:27:50 2007 -0700
@@ -1,6 +1,7 @@
 #ifdef XEN
 #include <asm/debugger.h>
 #include <asm/vhpt.h>
+#include <public/arch-ia64.h>
 #endif
 /*
  * arch/ia64/kernel/ivt.S
@@ -1074,18 +1075,26 @@ ENTRY(break_fault)
 #endif
        movl r18=THIS_CPU(current_psr_ic_addr)
        ;;
-       ld8 r18=[r18]
-       ;;
-       ld4 r19=[r18]
+       ld8 r18=[r18]    
        ;;
        cmp.eq p7,p0=r0,r17                     // is this a psuedo-cover?
 (p7)   br.spnt.many dispatch_privop_fault
        ;;
-       // If vpsr.ic is off, we have a hyperprivop.  A hyperprivop is
-       // hand-coded assembly with psr.ic off which means it can make
-       // no calls, cannot use r1-r15, and it can have no memory accesses
-       // unless they are to pinned addresses!
-       cmp4.eq p7,p0=r0,r19
+       // if (ipsr.cpl == 2 && (iim - HYPERPRIVOP_START) < HYPERPRIVOP_MAX)
+       // this is a hyperprivop. A hyperprivop is hand-coded assembly with
+       // psr.ic off which means it can make no calls, cannot use r1-r15,
+       // and it can have no memory accesses unless they are to pinned
+       // addresses!
+       mov r19= cr.ipsr
+       movl r20=HYPERPRIVOP_START
+       mov r21=HYPERPRIVOP_MAX
+       ;;
+       sub r20=r17,r20
+       extr.u r19=r19,IA64_PSR_CPL0_BIT,2  // extract cpl field from cr.ipsr
+       ;;
+       cmp.gtu p7,p0=r21,r20
+       ;;
+       cmp.eq.and p7,p0=2,r19                  // ipsr.cpl==2
 (p7)   br.sptk.many fast_hyperprivop
        ;;
        movl r22=THIS_CPU(cpu_kr)+IA64_KR_CURRENT_OFFSET
diff -r a50fd1fed61e -r 99ff540b0efe xen/include/public/arch-ia64.h
--- a/xen/include/public/arch-ia64.h    Tue Jan 02 15:19:44 2007 -0700
+++ b/xen/include/public/arch-ia64.h    Tue Jan 02 16:27:50 2007 -0700
@@ -434,32 +434,33 @@ struct xen_ia64_boot_param {
 #define XMAPPEDREGS_OFS                        XSI_SIZE
 
 /* Hyperprivops.  */
-#define HYPERPRIVOP_RFI                        0x1
-#define HYPERPRIVOP_RSM_DT             0x2
-#define HYPERPRIVOP_SSM_DT             0x3
-#define HYPERPRIVOP_COVER              0x4
-#define HYPERPRIVOP_ITC_D              0x5
-#define HYPERPRIVOP_ITC_I              0x6
-#define HYPERPRIVOP_SSM_I              0x7
-#define HYPERPRIVOP_GET_IVR            0x8
-#define HYPERPRIVOP_GET_TPR            0x9
-#define HYPERPRIVOP_SET_TPR            0xa
-#define HYPERPRIVOP_EOI                        0xb
-#define HYPERPRIVOP_SET_ITM            0xc
-#define HYPERPRIVOP_THASH              0xd
-#define HYPERPRIVOP_PTC_GA             0xe
-#define HYPERPRIVOP_ITR_D              0xf
-#define HYPERPRIVOP_GET_RR             0x10
-#define HYPERPRIVOP_SET_RR             0x11
-#define HYPERPRIVOP_SET_KR             0x12
-#define HYPERPRIVOP_FC                 0x13
-#define HYPERPRIVOP_GET_CPUID          0x14
-#define HYPERPRIVOP_GET_PMD            0x15
-#define HYPERPRIVOP_GET_EFLAG          0x16
-#define HYPERPRIVOP_SET_EFLAG          0x17
-#define HYPERPRIVOP_RSM_BE             0x18
-#define HYPERPRIVOP_GET_PSR            0x19
-#define HYPERPRIVOP_MAX                        0x19
+#define HYPERPRIVOP_START              0x1
+#define HYPERPRIVOP_RFI                        (HYPERPRIVOP_START + 0x0)
+#define HYPERPRIVOP_RSM_DT             (HYPERPRIVOP_START + 0x1)
+#define HYPERPRIVOP_SSM_DT             (HYPERPRIVOP_START + 0x2)
+#define HYPERPRIVOP_COVER              (HYPERPRIVOP_START + 0x3)
+#define HYPERPRIVOP_ITC_D              (HYPERPRIVOP_START + 0x4)
+#define HYPERPRIVOP_ITC_I              (HYPERPRIVOP_START + 0x5)
+#define HYPERPRIVOP_SSM_I              (HYPERPRIVOP_START + 0x6)
+#define HYPERPRIVOP_GET_IVR            (HYPERPRIVOP_START + 0x7)
+#define HYPERPRIVOP_GET_TPR            (HYPERPRIVOP_START + 0x8)
+#define HYPERPRIVOP_SET_TPR            (HYPERPRIVOP_START + 0x9)
+#define HYPERPRIVOP_EOI                        (HYPERPRIVOP_START + 0xa)
+#define HYPERPRIVOP_SET_ITM            (HYPERPRIVOP_START + 0xb)
+#define HYPERPRIVOP_THASH              (HYPERPRIVOP_START + 0xc)
+#define HYPERPRIVOP_PTC_GA             (HYPERPRIVOP_START + 0xd)
+#define HYPERPRIVOP_ITR_D              (HYPERPRIVOP_START + 0xe)
+#define HYPERPRIVOP_GET_RR             (HYPERPRIVOP_START + 0xf)
+#define HYPERPRIVOP_SET_RR             (HYPERPRIVOP_START + 0x10)
+#define HYPERPRIVOP_SET_KR             (HYPERPRIVOP_START + 0x11)
+#define HYPERPRIVOP_FC                 (HYPERPRIVOP_START + 0x12)
+#define HYPERPRIVOP_GET_CPUID          (HYPERPRIVOP_START + 0x13)
+#define HYPERPRIVOP_GET_PMD            (HYPERPRIVOP_START + 0x14)
+#define HYPERPRIVOP_GET_EFLAG          (HYPERPRIVOP_START + 0x15)
+#define HYPERPRIVOP_SET_EFLAG          (HYPERPRIVOP_START + 0x16)
+#define HYPERPRIVOP_RSM_BE             (HYPERPRIVOP_START + 0x17)
+#define HYPERPRIVOP_GET_PSR            (HYPERPRIVOP_START + 0x18)
+#define HYPERPRIVOP_MAX                        (0x19)
 
 /* Fast and light hypercalls.  */
 #define __HYPERVISOR_ia64_fast_eoi     0x0200

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


 


Rackspace

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