]> xenbits.xensource.com Git - xenclient/kernel.git/commitdiff
[IA64] Fix xen_ssm_i()
authorAlex Williamson <alex.williamson@hp.com>
Mon, 30 Jul 2007 17:05:55 +0000 (11:05 -0600)
committerAlex Williamson <alex.williamson@hp.com>
Mon, 30 Jul 2007 17:05:55 +0000 (11:05 -0600)
Otherwise interruption may not be delivered.

Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
arch/ia64/kernel/gate.S
include/asm-ia64/xen/privop.h

index 389646e063452e0dbdb7f358e65e22542dc8ac3f..c1a083b17c5e96f89188ef10262cc842c7804f7f 100644 (file)
@@ -149,16 +149,16 @@ GLOBAL_ENTRY(__kernel_syscall_via_epc)
 (p6)   tbit.z.unc p8,p0=r18,0                  // I0 (dual-issues with "mov b7=r18"!)
 #ifdef CONFIG_XEN_IA64_VDSO_PARAVIRT
        
-#define XEN_SET_PSR_I(pr)              \
-(pr)   ld1 r31=[r22];                  \
-(pr)   ld1 r25=[r24];                  \
-       ;;                              \
-(pr)   st1 [r22]=r0;                   \
-(pr)   cmp.ne.unc p14,p0=r0,r31;       \
-       ;;                              \
+#define XEN_SET_PSR_I(pred)            \
+(pred) ld1 r31=[r22];                  \
+       ;; ;                            \
+(pred) st1 [r22]=r0;                   \
+(pred) cmp.ne.unc p14,p0=r0,r31;       \
+       ;; ;                            \
+(p14)  ld1 r25=[r24];                  \
+       ;; ;                            \
 (p14)  cmp.ne.unc p11,p0=r0,r25;       \
-       ;;                              \
-(p11)  st1 [r22]=r20;                  \
+       ;; ;                            \
 (p11)  XEN_HYPER_SSM_I;
 
        ;; 
index b01e4cca4cf40a32d8893131df7df2c1c955d93f..823ece410f6c0f50d2b8997340bb731d15051ef2 100644 (file)
@@ -238,12 +238,10 @@ extern void xen_set_eflag(unsigned long); /* see xen_ia64_setreg */
 #define xen_ssm_i()                                                    \
 ({                                                                     \
        int old = xen_get_virtual_psr_i();                              \
-       if (!old) {                                                     \
-               if (xen_get_virtual_pend())                             \
-                       xen_hyper_ssm_i();                              \
-               else                                                    \
-                       xen_set_virtual_psr_i(1);                       \
-       }                                                               \
+       xen_set_virtual_psr_i(1);                                       \
+       barrier();                                                      \
+       if (!old && xen_get_virtual_pend())                             \
+               xen_hyper_ssm_i();                                      \
 })
 
 #define xen_ia64_intrin_local_irq_restore(x)                           \