aboutsummaryrefslogtreecommitdiffstats
path: root/arch/ia64/include/asm/paravirt_privop.h
diff options
context:
space:
mode:
authorIsaku Yamahata <yamahata@valinux.co.jp>2008-11-18 19:19:50 +0900
committerTony Luck <tony.luck@intel.com>2008-11-20 13:41:20 -0800
commit93fe10b670a7a6a1dc9649c7860f452dc7bbbb9d (patch)
treee141f994b5040f34a2ec4d7b9666677bbab6cca4 /arch/ia64/include/asm/paravirt_privop.h
parentd5964107763d7155e9bea658098a337507b3e928 (diff)
downloadkernel_samsung_smdk4412-93fe10b670a7a6a1dc9649c7860f452dc7bbbb9d.zip
kernel_samsung_smdk4412-93fe10b670a7a6a1dc9649c7860f452dc7bbbb9d.tar.gz
kernel_samsung_smdk4412-93fe10b670a7a6a1dc9649c7860f452dc7bbbb9d.tar.bz2
[IA64] ia64/pv_ops/pv_cpu_ops: fix _IA64_REG_IP case.
pv_cpu_ops.getreg(_IA64_REG_IP) returned constant. But the returned ip valued should be the one in the caller, not of the callee. This patch fixes that. Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp> Signed-off-by: Tony Luck <tony.luck@intel.com>
Diffstat (limited to 'arch/ia64/include/asm/paravirt_privop.h')
-rw-r--r--arch/ia64/include/asm/paravirt_privop.h13
1 files changed, 13 insertions, 0 deletions
diff --git a/arch/ia64/include/asm/paravirt_privop.h b/arch/ia64/include/asm/paravirt_privop.h
index d577aac..0b59742 100644
--- a/arch/ia64/include/asm/paravirt_privop.h
+++ b/arch/ia64/include/asm/paravirt_privop.h
@@ -78,6 +78,19 @@ extern unsigned long ia64_native_getreg_func(int regnum);
ia64_native_rsm(mask); \
} while (0)
+/* returned ip value should be the one in the caller,
+ * not in __paravirt_getreg() */
+#define paravirt_getreg(reg) \
+ ({ \
+ unsigned long res; \
+ BUILD_BUG_ON(!__builtin_constant_p(reg)); \
+ if ((reg) == _IA64_REG_IP) \
+ res = ia64_native_getreg(_IA64_REG_IP); \
+ else \
+ res = pv_cpu_ops.getreg(reg); \
+ res; \
+ })
+
/******************************************************************************
* replacement of hand written assembly codes.
*/