mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 10:40:03 +01:00
Fix time handling on x86/64.
Signed-off-by: Keir Fraser <keir@xensource.com>
This commit is contained in:
1 parent
cbc34f7812
commit
e9041e1e82
2 files changed
+16
No files matched your search
@@ -173,13 +173,16 @@ struct timer_opts timer_tsc = {
|
||||
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 @@ static inline u64 scale_delta(u64 delta, u32 mul_frac, int shift)
|
||||
"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;
|
||||
}
|
||||
|
||||
@@ -103,13 +103,16 @@ static inline u32 mul_frac(u32 multiplicand, u32 multiplier)
|
||||
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 @@ static inline u64 scale_delta(u64 delta, struct time_scale *scale)
|
||||
"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;
|
||||
}
|
||||
|
||||