aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan Beulich <jbeulich@suse.com>2012-11-27 13:28:36 +0100
committerJan Beulich <jbeulich@suse.com>2012-11-27 13:28:36 +0100
commit0e72e58f153bb377018f120054c9d835f29a4ee9 (patch)
treec96c80155c2d99b721381ee019ac9c309ed552f2
parent44f7bcf93bc77318f35d9a92e638e4ea76a69c08 (diff)
downloadxen-0e72e58f153bb377018f120054c9d835f29a4ee9.tar.gz
xen-0e72e58f153bb377018f120054c9d835f29a4ee9.tar.bz2
xen-0e72e58f153bb377018f120054c9d835f29a4ee9.zip
x86/time: fix scale_delta() inline assembly
The way it was coded, it clobbered %rdx without telling the compiler. This generally didn't cause any problems except when there are two back to back invocations (as in plt_overflow()), as in that case the compiler may validly assume that it can re-use for the second instance the value loaded into %rdx before the first one. Once at it, also properly relax the second operand of "mul" (there's no need for it to be in %rdx, or a register at all), and switch away from using explicit register names in the instruction operands. Signed-off-by: Jan Beulich <jbeulich@suse.com> Acked-by: Keir Fraser <keir@xen.org> xen-unstable changeset: 26188:16bf7f3069a7 xen-unstable date: Mon Nov 26 16:20:39 UTC 2012
-rw-r--r--xen/arch/x86/time.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/xen/arch/x86/time.c b/xen/arch/x86/time.c
index b02da81860..468f822a12 100644
--- a/xen/arch/x86/time.c
+++ b/xen/arch/x86/time.c
@@ -140,8 +140,9 @@ static inline u64 scale_delta(u64 delta, struct time_scale *scale)
: "a" ((u32)delta), "1" ((u32)(delta >> 32)), "2" (scale->mul_frac) );
#else
asm (
- "mul %%rdx ; shrd $32,%%rdx,%%rax"
- : "=a" (product) : "0" (delta), "d" ((u64)scale->mul_frac) );
+ "mul %2 ; shrd $32,%1,%0"
+ : "=a" (product), "=d" (delta)
+ : "rm" (delta), "0" ((u64)scale->mul_frac) );
#endif
return product;