# HG changeset patch
# User kaf24@xxxxxxxxxxxxxxxxxxxx
# Node ID 7c9513a80026d90cc97496886b05725c0b3c2f8a
# Parent 50e57636bdd817f51624e40611a77036d2073e23
Fix time handling on x86/64.
Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>
diff -r 50e57636bdd8 -r 7c9513a80026
linux-2.6-xen-sparse/arch/xen/i386/kernel/time.c
--- a/linux-2.6-xen-sparse/arch/xen/i386/kernel/time.c Wed Aug 10 12:21:39 2005
+++ b/linux-2.6-xen-sparse/arch/xen/i386/kernel/time.c Wed Aug 10 12:56:47 2005
@@ -173,13 +173,16 @@
static inline u64 scale_delta(u64 delta, u32 mul_frac, int shift)
{
u64 product;
+#ifdef __i386__
u32 tmp1, tmp2;
+#endif
if ( shift < 0 )
delta >>= -shift;
else
delta <<= shift;
+#ifdef __i386__
__asm__ (
"mul %5 ; "
"mov %4,%%eax ; "
@@ -190,6 +193,11 @@
"adc %5,%%edx ; "
: "=A" (product), "=r" (tmp1), "=r" (tmp2)
: "a" ((u32)delta), "1" ((u32)(delta >> 32)), "2" (mul_frac) );
+#else
+ __asm__ (
+ "mul %%rdx ; shrd $32,%%rdx,%%rax"
+ : "=a" (product) : "0" (delta), "d" ((u64)mul_frac) );
+#endif
return product;
}
diff -r 50e57636bdd8 -r 7c9513a80026 xen/arch/x86/time.c
--- a/xen/arch/x86/time.c Wed Aug 10 12:21:39 2005
+++ b/xen/arch/x86/time.c Wed Aug 10 12:56:47 2005
@@ -103,13 +103,16 @@
static inline u64 scale_delta(u64 delta, struct time_scale *scale)
{
u64 product;
+#ifdef CONFIG_x86_32
u32 tmp1, tmp2;
+#endif
if ( scale->shift < 0 )
delta >>= -scale->shift;
else
delta <<= scale->shift;
+#ifdef CONFIG_X86_32
__asm__ (
"mul %5 ; "
"mov %4,%%eax ; "
@@ -120,6 +123,11 @@
"adc %5,%%edx ; "
: "=A" (product), "=r" (tmp1), "=r" (tmp2)
: "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) );
+#endif
return product;
}
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|