Messages in this thread Patch in this message | | | From | Zachary Amsden <> | Subject | [PATCH RFC: kvm tsc virtualization 16/20] Fix 32-bit mult_precise | Date | Mon, 14 Dec 2009 18:08:43 -1000 |
| |
Turns out it wasn't very precise; it needs to work on 64-bit values.
Signed-off-by: Zachary Amsden <zamsden@redhat.com> --- arch/x86/kvm/x86.c | 18 +++++++++++++++--- 1 files changed, 15 insertions(+), 3 deletions(-)
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 7e2ba3e..792c895 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -803,15 +803,27 @@ static void compute_best_multiplier(unsigned long a, unsigned long b, *s = shift; } -static inline unsigned long mult_precise(unsigned long val, unsigned long mult, - int shift) +static inline u64 mult_precise(u64 val, unsigned long mult, int shift) { +#if (BITS_PER_LONG == 64) unsigned long top, bot; - __asm__ ( "mul %3; shrd %1, %0" : + __asm__ ( "mulq %3; shrdq %1, %0" : "=&a" (bot), "=&d" (top) : "0" (mult), "rm" (val), "c" (shift)); return bot; +#else + unsigned long ltop, lbot; + unsigned long htop, hbot; + + __asm__ ( "mull %3; shrd %1, %0" : + "=&a" (lbot), "=&d" (ltop) : + "0" (mult), "rm" (long)(val), "c" (shift)); + __asm__ ( "mull %3; shrd %1, %0" : + "=&a" (hbot), "=&d" (htop) : + "0" (mult), "rm" (long)(val >> 32), "c" (shift)); + return (u64)lbot + ((u64)ltop + (u64)hbot) << 32; +#endif } static inline u64 compute_ref_tsc(void) -- 1.6.5.2
| |