diff mbox

[x86] Fix register corruption in pvclock_scale_delta

Message ID 4DF97D6C.2080900@redhat.com (mailing list archive)
State New, archived
Headers show

Commit Message

Zachary Amsden June 16, 2011, 3:50 a.m. UTC
The 128-bit multiply in pvclock.h was missing an output constraint for 
EDX which caused a register corruption to appear.  Thanks to Ulrich for 
diagnosing the EDX corruption and Avi for providing this fix (which now 
I am sending back to you Avi..)

Zach
From Avi and Ulrich, fix constraints for 128-bit multiply

Signed-off-by: Zachary Amsden <zamsden@redhat.com>

Comments

Avi Kivity June 19, 2011, 12:44 p.m. UTC | #1
On 06/16/2011 06:50 AM, Zachary Amsden wrote:
> The 128-bit multiply in pvclock.h was missing an output constraint for 
> EDX which caused a register corruption to appear.  Thanks to Ulrich 
> for diagnosing the EDX corruption and Avi for providing this fix 
> (which now I am sending back to you Avi..)

Applied and queued, thanks.
Ian Campbell June 22, 2011, 9:35 a.m. UTC | #2
On Sun, 2011-06-19 at 15:44 +0300, Avi Kivity wrote:
> On 06/16/2011 06:50 AM, Zachary Amsden wrote:
> > The 128-bit multiply in pvclock.h was missing an output constraint for 
> > EDX which caused a register corruption to appear.

Was there any particular symptom associated with corruption at that
particular point or just general badness?

>   Thanks to Ulrich 
> > for diagnosing the EDX corruption and Avi for providing this fix 
> > (which now I am sending back to you Avi..)
> 
> Applied and queued, thanks.

Seems like a stable candidate also?

Ian.

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Avi Kivity June 22, 2011, 9:39 a.m. UTC | #3
On 06/22/2011 12:35 PM, Ian Campbell wrote:
> On Sun, 2011-06-19 at 15:44 +0300, Avi Kivity wrote:
> >  On 06/16/2011 06:50 AM, Zachary Amsden wrote:
> >  >  The 128-bit multiply in pvclock.h was missing an output constraint for
> >  >  EDX which caused a register corruption to appear.
>
> Was there any particular symptom associated with corruption at that
> particular point or just general badness?
>
> >    Thanks to Ulrich
> >  >  for diagnosing the EDX corruption and Avi for providing this fix
> >  >  (which now I am sending back to you Avi..)
> >
> >  Applied and queued, thanks.
>
> Seems like a stable candidate also?

Yes.  I see it's merged; Marcelo, can you backport it?
Avi Kivity June 22, 2011, 9:40 a.m. UTC | #4
On 06/22/2011 12:35 PM, Ian Campbell wrote:
> On Sun, 2011-06-19 at 15:44 +0300, Avi Kivity wrote:
> >  On 06/16/2011 06:50 AM, Zachary Amsden wrote:
> >  >  The 128-bit multiply in pvclock.h was missing an output constraint for
> >  >  EDX which caused a register corruption to appear.
>
> Was there any particular symptom associated with corruption at that
> particular point or just general badness?
>

Time went backwards and forwards as vcpus were migrated across cpus.

The problem was in the host, not the guest, so Xen should not be affected.
Ian Campbell June 22, 2011, 9:52 a.m. UTC | #5
On Wed, 2011-06-22 at 10:40 +0100, Avi Kivity wrote:
> On 06/22/2011 12:35 PM, Ian Campbell wrote:
> > On Sun, 2011-06-19 at 15:44 +0300, Avi Kivity wrote:
> > >  On 06/16/2011 06:50 AM, Zachary Amsden wrote:
> > >  >  The 128-bit multiply in pvclock.h was missing an output constraint for
> > >  >  EDX which caused a register corruption to appear.
> >
> > Was there any particular symptom associated with corruption at that
> > particular point or just general badness?
> >
> 
> Time went backwards and forwards as vcpus were migrated across cpus.

Oops!

> The problem was in the host, not the guest, so Xen should not be affected.

Good to know, thanks!

Ian.

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/arch/x86/include/asm/pvclock.h b/arch/x86/include/asm/pvclock.h
index 31d84ac..a518c0a 100644
--- a/arch/x86/include/asm/pvclock.h
+++ b/arch/x86/include/asm/pvclock.h
@@ -22,6 +22,8 @@  static inline u64 pvclock_scale_delta(u64 delta, u32 mul_frac, int shift)
 	u64 product;
 #ifdef __i386__
 	u32 tmp1, tmp2;
+#else
+	ulong tmp;
 #endif
 
 	if (shift < 0)
@@ -42,8 +44,11 @@  static inline u64 pvclock_scale_delta(u64 delta, u32 mul_frac, int shift)
 		: "a" ((u32)delta), "1" ((u32)(delta >> 32)), "2" (mul_frac) );
 #elif defined(__x86_64__)
 	__asm__ (
-		"mul %%rdx ; shrd $32,%%rdx,%%rax"
-		: "=a" (product) : "0" (delta), "d" ((u64)mul_frac) );
+		"mul %[mul_frac] ; shrd $32, %[hi], %[lo]"
+		: [lo]"=a"(product),
+		  [hi]"=d"(tmp)
+		: "0"(delta),
+		  [mul_frac]"rm"((u64)mul_frac));
 #else
 #error implement me!
 #endif