Otherwise interruption may not be delivered.
Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
(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;
;;
#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) \