|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen master] x86/hvm: replace architecture TSC scaling by a common function
commit 2b921b9bf8b04e8c72844965a15f9ec5713b0cca
Author: Haozhong Zhang <haozhong.zhang@xxxxxxxxx>
AuthorDate: Tue Mar 1 14:37:53 2016 +0100
Commit: Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Tue Mar 1 14:37:53 2016 +0100
x86/hvm: replace architecture TSC scaling by a common function
This patch implements a common function hvm_scale_tsc() to scale TSC by
using TSC scaling information collected by architecture code.
Signed-off-by: Haozhong Zhang <haozhong.zhang@xxxxxxxxx>
Acked-by: Boris Ostrovsky <boris.ostrovsky@xxxxxxxxxx> for SVM bits
Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx>
---
xen/arch/x86/hvm/hvm.c | 21 +++++++++++++++++++--
xen/arch/x86/hvm/svm/svm.c | 8 --------
xen/arch/x86/time.c | 3 +--
xen/include/asm-x86/hvm/hvm.h | 3 +--
4 files changed, 21 insertions(+), 14 deletions(-)
diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c
index 38586da..1a261eb 100644
--- a/xen/arch/x86/hvm/hvm.c
+++ b/xen/arch/x86/hvm/hvm.c
@@ -334,6 +334,23 @@ u64 hvm_get_tsc_scaling_ratio(u32 gtsc_khz)
return ratio > max_ratio ? 0 : ratio;
}
+u64 hvm_scale_tsc(const struct domain *d, u64 tsc)
+{
+ u64 ratio = d->arch.hvm_domain.tsc_scaling_ratio;
+ u64 dummy;
+
+ if ( ratio == hvm_default_tsc_scaling_ratio )
+ return tsc;
+
+ /* tsc = (tsc * ratio) >> hvm_funcs.tsc_scaling.ratio_frac_bits */
+ asm ( "mulq %[ratio]; shrdq %[frac],%%rdx,%[tsc]"
+ : [tsc] "+a" (tsc), "=&d" (dummy)
+ : [frac] "c" (hvm_funcs.tsc_scaling.ratio_frac_bits),
+ [ratio] "rm" (ratio) );
+
+ return tsc;
+}
+
void hvm_set_guest_tsc_fixed(struct vcpu *v, u64 guest_tsc, u64 at_tsc)
{
uint64_t tsc;
@@ -348,7 +365,7 @@ void hvm_set_guest_tsc_fixed(struct vcpu *v, u64 guest_tsc,
u64 at_tsc)
{
tsc = at_tsc ?: rdtsc();
if ( hvm_tsc_scaling_supported )
- tsc = hvm_funcs.tsc_scaling.scale_tsc(v, tsc);
+ tsc = hvm_scale_tsc(v->domain, tsc);
}
delta_tsc = guest_tsc - tsc;
@@ -380,7 +397,7 @@ u64 hvm_get_guest_tsc_fixed(struct vcpu *v, uint64_t at_tsc)
{
tsc = at_tsc ?: rdtsc();
if ( hvm_tsc_scaling_supported )
- tsc = hvm_funcs.tsc_scaling.scale_tsc(v, tsc);
+ tsc = hvm_scale_tsc(v->domain, tsc);
}
return tsc + v->arch.hvm_vcpu.cache_tsc_offset;
diff --git a/xen/arch/x86/hvm/svm/svm.c b/xen/arch/x86/hvm/svm/svm.c
index 7172f25..979d226 100644
--- a/xen/arch/x86/hvm/svm/svm.c
+++ b/xen/arch/x86/hvm/svm/svm.c
@@ -819,13 +819,6 @@ static uint64_t scale_tsc(uint64_t host_tsc, uint64_t
ratio)
return scaled_host_tsc;
}
-static uint64_t svm_scale_tsc(const struct vcpu *v, uint64_t tsc)
-{
- ASSERT(cpu_has_tsc_ratio && !v->domain->arch.vtsc);
-
- return scale_tsc(tsc, hvm_tsc_scaling_ratio(v->domain));
-}
-
static uint64_t svm_get_tsc_offset(uint64_t host_tsc, uint64_t guest_tsc,
uint64_t ratio)
{
@@ -2291,7 +2284,6 @@ static struct hvm_function_table __initdata
svm_function_table = {
.tsc_scaling = {
.max_ratio = ~TSC_RATIO_RSVD_BITS,
- .scale_tsc = svm_scale_tsc,
},
};
diff --git a/xen/arch/x86/time.c b/xen/arch/x86/time.c
index fda9692..687e39b 100644
--- a/xen/arch/x86/time.c
+++ b/xen/arch/x86/time.c
@@ -816,8 +816,7 @@ static void __update_vcpu_system_time(struct vcpu *v, int
force)
{
if ( has_hvm_container_domain(d) && hvm_tsc_scaling_supported )
{
- tsc_stamp =
- hvm_funcs.tsc_scaling.scale_tsc(v, t->local_tsc_stamp);
+ tsc_stamp = hvm_scale_tsc(d, t->local_tsc_stamp);
_u.tsc_to_system_mul = d->arch.vtsc_to_ns.mul_frac;
_u.tsc_shift = d->arch.vtsc_to_ns.shift;
}
diff --git a/xen/include/asm-x86/hvm/hvm.h b/xen/include/asm-x86/hvm/hvm.h
index ddb1e33..c5c9328 100644
--- a/xen/include/asm-x86/hvm/hvm.h
+++ b/xen/include/asm-x86/hvm/hvm.h
@@ -231,8 +231,6 @@ struct hvm_function_table {
uint8_t ratio_frac_bits;
/* maximum-allowed TSC scaling ratio */
uint64_t max_ratio;
-
- uint64_t (*scale_tsc)(const struct vcpu *v, uint64_t tsc);
} tsc_scaling;
};
@@ -278,6 +276,7 @@ u64 hvm_get_guest_tsc_fixed(struct vcpu *v, u64 at_tsc);
#define hvm_tsc_scaling_ratio(d) \
((d)->arch.hvm_domain.tsc_scaling_ratio)
+u64 hvm_scale_tsc(const struct domain *d, u64 tsc);
u64 hvm_get_tsc_scaling_ratio(u32 gtsc_khz);
int hvm_set_mode(struct vcpu *v, int mode);
--
generated by git-patchbot for /home/xen/git/xen.git#master
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |