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

[Xen-changelog] [linux-2.6.18-xen] [IA64] Fix xen_ssm_i()



# HG changeset patch
# User Alex Williamson <alex.williamson@xxxxxx>
# Date 1185815155 21600
# Node ID 0f9032c33df4d7595f87358775b4694d740da583
# Parent  e92816da20760df8b8716bbd14f0aec3d2729264
[IA64] Fix xen_ssm_i()

Otherwise interruption may not be delivered.

Signed-off-by: Isaku Yamahata <yamahata@xxxxxxxxxxxxx>
---
 arch/ia64/kernel/gate.S       |   18 +++++++++---------
 include/asm-ia64/xen/privop.h |   10 ++++------
 2 files changed, 13 insertions(+), 15 deletions(-)

diff -r e92816da2076 -r 0f9032c33df4 arch/ia64/kernel/gate.S
--- a/arch/ia64/kernel/gate.S   Mon Jul 30 11:03:04 2007 -0600
+++ b/arch/ia64/kernel/gate.S   Mon Jul 30 11:05:55 2007 -0600
@@ -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 e92816da2076 -r 0f9032c33df4 include/asm-ia64/xen/privop.h
--- a/include/asm-ia64/xen/privop.h     Mon Jul 30 11:03:04 2007 -0600
+++ b/include/asm-ia64/xen/privop.h     Mon Jul 30 11:05:55 2007 -0600
@@ -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)                           \

_______________________________________________
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®.