# HG changeset patch # User yamahata@xxxxxxxxxxxxx # Date 1185765493 -32400 # Node ID a28df3d821260d96b234f7133353be347bd4b140 # Parent b0bf9ba32bfe341af07da97d57572659c920fd30 fix xen_ssm_i(). otherwise interruption may not be delivered. PATCHNAME: fix_xen_ssm_i Signed-off-by: Isaku Yamahata diff -r b0bf9ba32bfe -r a28df3d82126 arch/ia64/kernel/gate.S --- a/arch/ia64/kernel/gate.S Fri Jul 27 08:15:50 2007 -0600 +++ b/arch/ia64/kernel/gate.S Mon Jul 30 12:18:13 2007 +0900 @@ -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; ;; diff -r b0bf9ba32bfe -r a28df3d82126 include/asm-ia64/xen/privop.h --- a/include/asm-ia64/xen/privop.h Fri Jul 27 08:15:50 2007 -0600 +++ b/include/asm-ia64/xen/privop.h Mon Jul 30 12:18:13 2007 +0900 @@ -238,12 +238,10 @@ extern void xen_set_eflag(unsigned long) #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) \