]> err.no Git - linux-2.6/commitdiff
[IA64] pvops: preparation: introduce ia64_get_psr_i() to make kernel paravirtualizati...
authorIsaku Yamahata <yamahata@valinux.co.jp>
Mon, 19 May 2008 13:13:31 +0000 (22:13 +0900)
committerTony Luck <tony.luck@intel.com>
Tue, 27 May 2008 21:39:07 +0000 (14:39 -0700)
__local_irq_save() and local_save_flags() are used to mask interruptions.
They read all psr bits that requres whole bit emulation.
On the other hand, reading only psr.i, the single bit, can be virtualized
cheaply.

Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
Signed-off-by: Tony Luck <tony.luck@intel.com>
include/asm-ia64/intrinsics.h
include/asm-ia64/system.h

index 9b83f8f01678462eba91009f5245d703e244a908..a3b96892f83f14e1352b2df23dd52ab5ef06c702 100644 (file)
@@ -18,6 +18,8 @@
 # include <asm/gcc_intrin.h>
 #endif
 
+#define ia64_get_psr_i()       (ia64_getreg(_IA64_REG_PSR) & IA64_PSR_I)
+
 #define ia64_set_rr0_to_rr4(val0, val1, val2, val3, val4)      \
 do {                                                           \
        ia64_set_rr(0x0000000000000000UL, (val0));              \
index 0db8c9812ceb19ce37a63f32cee2705a39ef0129..927a381c20ca06e35c7ba7ed10a6ef35e1826752 100644 (file)
@@ -123,10 +123,16 @@ extern struct ia64_boot_param {
  *   write a floating-point register right before reading the PSR
  *   and that writes to PSR.mfl
  */
+#ifdef CONFIG_PARAVIRT
+#define __local_save_flags()   ia64_get_psr_i()
+#else
+#define __local_save_flags()   ia64_getreg(_IA64_REG_PSR)
+#endif
+
 #define __local_irq_save(x)                    \
 do {                                           \
        ia64_stop();                            \
-       (x) = ia64_getreg(_IA64_REG_PSR);       \
+       (x) = __local_save_flags();             \
        ia64_stop();                            \
        ia64_rsm(IA64_PSR_I);                   \
 } while (0)
@@ -174,7 +180,7 @@ do {                                                                \
 #endif /* !CONFIG_IA64_DEBUG_IRQ */
 
 #define local_irq_enable()     ({ ia64_stop(); ia64_ssm(IA64_PSR_I); ia64_srlz_d(); })
-#define local_save_flags(flags)        ({ ia64_stop(); (flags) = ia64_getreg(_IA64_REG_PSR); })
+#define local_save_flags(flags)        ({ ia64_stop(); (flags) = __local_save_flags(); })
 
 #define irqs_disabled()                                \
 ({                                             \