The following commit has been merged into the x86/platform branch of tip: Commit-ID: 81a71f51b89e84f39df2a3b1daf4274ae6b7b194 Gitweb: https://git.kernel.org/tip/81a71f51b89e84f39df2a3b1daf4274ae6b7b194 Author: Fei Li <fei1.li@xxxxxxxxx> AuthorDate: Thu, 04 Aug 2022 13:59:03 +08:00 Committer: Ingo Molnar <mingo@xxxxxxxxxx> CommitterDate: Thu, 04 Aug 2022 11:11:59 +02:00 x86/acrn: Set up timekeeping ACRN Hypervisor reports timing information via CPUID leaf 0x40000010. Get the TSC and CPU frequency via CPUID leaf 0x40000010 and set the kernel values accordingly. Signed-off-by: Fei Li <fei1.li@xxxxxxxxx> Signed-off-by: Ingo Molnar <mingo@xxxxxxxxxx> Reviewed-by: Conghui <conghui.chen@xxxxxxxxx> Link: https://lore.kernel.org/r/20220804055903.365211-1-fei1.li@xxxxxxxxx --- arch/x86/include/asm/acrn.h | 14 ++++++++++++++ arch/x86/kernel/cpu/acrn.c | 3 +++ 2 files changed, 17 insertions(+) diff --git a/arch/x86/include/asm/acrn.h b/arch/x86/include/asm/acrn.h index e003a01..1dd1438 100644 --- a/arch/x86/include/asm/acrn.h +++ b/arch/x86/include/asm/acrn.h @@ -10,6 +10,15 @@ /* Bit 0 indicates whether guest VM is privileged */ #define ACRN_FEATURE_PRIVILEGED_VM BIT(0) +/* + * Timing Information. + * This leaf returns the current TSC frequency in kHz. + * + * EAX: (Virtual) TSC frequency in kHz. + * EBX, ECX, EDX: RESERVED (reserved fields are set to zero). + */ +#define ACRN_CPUID_TIMING_INFO 0x40000010 + void acrn_setup_intr_handler(void (*handler)(void)); void acrn_remove_intr_handler(void); @@ -21,6 +30,11 @@ static inline u32 acrn_cpuid_base(void) return 0; } +static inline unsigned long acrn_get_tsc_khz(void) +{ + return cpuid_eax(ACRN_CPUID_TIMING_INFO); +} + /* * Hypercalls for ACRN * diff --git a/arch/x86/kernel/cpu/acrn.c b/arch/x86/kernel/cpu/acrn.c index 23f5f27..485441b 100644 --- a/arch/x86/kernel/cpu/acrn.c +++ b/arch/x86/kernel/cpu/acrn.c @@ -28,6 +28,9 @@ static void __init acrn_init_platform(void) { /* Setup the IDT for ACRN hypervisor callback */ alloc_intr_gate(HYPERVISOR_CALLBACK_VECTOR, asm_sysvec_acrn_hv_callback); + + x86_platform.calibrate_tsc = acrn_get_tsc_khz; + x86_platform.calibrate_cpu = acrn_get_tsc_khz; } static bool acrn_x2apic_available(void)