[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen staging] x86/time: use fake read_tsc()
commit 120e26c2bb0097a589d718b1b58d7052ccce4458 Author: Jan Beulich <jbeulich@xxxxxxxx> AuthorDate: Tue Apr 5 11:40:58 2022 +0200 Commit: Jan Beulich <jbeulich@xxxxxxxx> CommitDate: Tue Apr 5 11:40:58 2022 +0200 x86/time: use fake read_tsc() Go a step further than bed9ae54df44 ("x86/time: switch platform timer hooks to altcall") did and eliminate the "real" read_tsc() altogether: It's not used except in pointer comparisons, and hence it looks overall more safe to simply poison plt_tsc's read_counter hook. Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> Reviewed-by: Roger Pau Monné <roger.pau@xxxxxxxxxx> --- xen/arch/x86/time.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/xen/arch/x86/time.c b/xen/arch/x86/time.c index 90fbd23cc0..b01acd390d 100644 --- a/xen/arch/x86/time.c +++ b/xen/arch/x86/time.c @@ -607,16 +607,18 @@ static s64 __init cf_check init_tsc(struct platform_timesource *pts) return ret; } -static uint64_t __init cf_check read_tsc(void) -{ - return rdtsc_ordered(); -} +/* + * plt_tsc's read_counter hook is not (and should not be) invoked via the + * struct field. To avoid carrying an unused, indirectly reachable function, + * poison the field with an easily identifiable non-canonical pointer. + */ +#define READ_TSC_POISON ((uint64_t(*)(void))0x75C75C75C75C75C0ul) static struct platform_timesource __initdata_cf_clobber plt_tsc = { .id = "tsc", .name = "TSC", - .read_counter = read_tsc, + .read_counter = READ_TSC_POISON, /* * Calculations for platform timer overflow assume u64 boundary. * Hence we set to less than 64, such that the TSC wraparound is @@ -846,7 +848,7 @@ static uint64_t read_counter(void) * hence we can't invoke read_tsc() that way. Special case it here, open- * coding the function call at the same time. */ - return plt_src.read_counter != read_tsc + return plt_src.read_counter != READ_TSC_POISON ? alternative_call(plt_src.read_counter) : rdtsc_ordered(); } @@ -2510,7 +2512,7 @@ uint64_t pv_soft_rdtsc(const struct vcpu *v, const struct cpu_user_regs *regs) bool clocksource_is_tsc(void) { - return plt_src.read_counter == read_tsc; + return plt_src.read_counter == READ_TSC_POISON; } int host_tsc_is_safe(void) -- generated by git-patchbot for /home/xen/git/xen.git#staging
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |