Commit 605a140a authored by Ilias Stamatis's avatar Ilias Stamatis Committed by Paolo Bonzini

math64.h: Add mul_s64_u64_shr()

This function is needed for KVM's nested virtualization. The nested TSC
scaling implementation requires multiplying the signed TSC offset with
the unsigned TSC multiplier.
Signed-off-by: default avatarIlias Stamatis <ilstam@amazon.com>
Reviewed-by: default avatarMaxim Levitsky <mlevitsk@redhat.com>
Message-Id: <20210526184418.28881-2-ilstam@amazon.com>
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
parent d501f747
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
#define _LINUX_MATH64_H #define _LINUX_MATH64_H
#include <linux/types.h> #include <linux/types.h>
#include <linux/math.h>
#include <vdso/math64.h> #include <vdso/math64.h>
#include <asm/div64.h> #include <asm/div64.h>
...@@ -234,6 +235,24 @@ static inline u64 mul_u64_u64_shr(u64 a, u64 b, unsigned int shift) ...@@ -234,6 +235,24 @@ static inline u64 mul_u64_u64_shr(u64 a, u64 b, unsigned int shift)
#endif #endif
#ifndef mul_s64_u64_shr
static inline u64 mul_s64_u64_shr(s64 a, u64 b, unsigned int shift)
{
u64 ret;
/*
* Extract the sign before the multiplication and put it back
* afterwards if needed.
*/
ret = mul_u64_u64_shr(abs(a), b, shift);
if (a < 0)
ret = -((s64) ret);
return ret;
}
#endif /* mul_s64_u64_shr */
#ifndef mul_u64_u32_div #ifndef mul_u64_u32_div
static inline u64 mul_u64_u32_div(u64 a, u32 mul, u32 divisor) static inline u64 mul_u64_u32_div(u64 a, u32 mul, u32 divisor)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment