Description: 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.
From: Jan Beulich <jbeulich@suse.com>
Origin: upstream, commit:26188:16bf7f3069a7, commit:23415:d89986111f0c
Bug-Debian: http://bugs.debian.org/599161

--- a/xen/arch/x86/time.c       Mon Nov 19 09:43:48 2012 +0100
+++ b/xen/arch/x86/time.c       Tue Nov 27 13:28:36 2012 +0100
@@ -140,8 +140,9 @@
         : "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;
