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

Bug#599161: [Xen-devel] #599161: Xen debug patch for the "clock shifts by 50 minutes" bug.



On Mon, 2012-11-26 at 15:28 +0000, Jan Beulich wrote:
> >>> On 24.11.12 at 13:06, Mauro <mrsanna1@gmail.com> wrote:
> > Here is a clock jump, I'm using the patch:
> 
> And here's a 4.0.x version of the patch I just sent for -unstable.

Thanks Jan! CCing the Debian bug for posterity.

Mauro, Perhaps you could give this patch a try to confirm that it is
effective?

Ian.
-- 
Ian Campbell
Current Noise: Morbid Angel - Chapel Of Ghouls (Remix)

Paranoia is simply an optimistic outlook on life.
x86-64/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>

--- a/xen/arch/x86/time.c
+++ b/xen/arch/x86/time.c
@@ -140,8 +140,9 @@ static inline u64 scale_delta(u64 delta,
         : "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;

Reply to: