From: Wei Liu <wl@xen.org>
To: Xen Development List <xen-devel@lists.xenproject.org>
Cc: "Wei Liu" <liuwe@microsoft.com>, "Wei Liu" <wl@xen.org>,
"Paul Durrant" <paul@xen.org>,
"Andrew Cooper" <andrew.cooper3@citrix.com>,
"Michael Kelley" <mikelley@microsoft.com>,
"Jan Beulich" <jbeulich@suse.com>,
"Roger Pau Monné" <roger.pau@citrix.com>
Subject: [Xen-devel] [PATCH for-next 7/7] x86: implement Hyper-V clock source
Date: Fri, 25 Oct 2019 10:16:18 +0100 [thread overview]
Message-ID: <20191025091618.10153-8-liuwe@microsoft.com> (raw)
In-Reply-To: <20191025091618.10153-1-liuwe@microsoft.com>
Implement a clock source using Hyper-V's reference TSC page.
Signed-off-by: Wei Liu <liuwe@microsoft.com>
---
Relevant spec:
https://github.com/MicrosoftDocs/Virtualization-Documentation/raw/live/tlfs/Hypervisor%20Top%20Level%20Functional%20Specification%20v5.0C.pdf
Section 12.6.
---
xen/arch/x86/time.c | 87 +++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 87 insertions(+)
diff --git a/xen/arch/x86/time.c b/xen/arch/x86/time.c
index d8242295ef..f7e93b8a1f 100644
--- a/xen/arch/x86/time.c
+++ b/xen/arch/x86/time.c
@@ -30,6 +30,7 @@
#include <asm/processor.h>
#include <asm/fixmap.h>
#include <asm/guest.h>
+#include <asm/guest/hyperv-tlfs.h>
#include <asm/mc146818rtc.h>
#include <asm/div64.h>
#include <asm/acpi.h>
@@ -614,6 +615,89 @@ static struct platform_timesource __initdata plt_xen_timer =
};
#endif
+#ifdef CONFIG_HYPERV_GUEST
+/************************************************************
+ * PLATFORM TIMER 6: HYPER-V REFERENCE TSC
+ */
+
+static struct ms_hyperv_tsc_page hyperv_tsc_page __aligned(PAGE_SIZE);
+
+static int64_t __init init_hyperv_timer(struct platform_timesource *pts)
+{
+ unsigned long maddr;
+ uint64_t tsc_msr, freq;
+
+ if ( !hyperv_guest ||
+ !(ms_hyperv.features & HV_MSR_REFERENCE_TSC_AVAILABLE) )
+ return 0;
+
+ maddr = virt_to_maddr(&hyperv_tsc_page);
+
+ /*
+ * Per Hyper-V TLFS:
+ * 1. Read existing MSR value
+ * 2. Preserve bits [11:1]
+ * 3. Set bits [63:12] to be guest physical address of tsc page
+ * 4. Set enabled bit (0)
+ * 5. Write back new MSR value
+ */
+ rdmsrl(HV_X64_MSR_REFERENCE_TSC, tsc_msr);
+ tsc_msr &= GENMASK_ULL(11, 1);
+ tsc_msr = tsc_msr | (uint64_t)maddr | 1 /* enabled */;
+ wrmsrl(HV_X64_MSR_REFERENCE_TSC, tsc_msr);
+
+ /* Get TSC frequency from Hyper-V */
+ rdmsrl(HV_X64_MSR_TSC_FREQUENCY, freq);
+ pts->frequency = freq;
+
+ return freq;
+}
+
+static inline uint64_t read_hyperv_timer(void)
+{
+ uint64_t scale, offset, ret, tsc;
+ uint32_t seq;
+ struct ms_hyperv_tsc_page *tsc_page = &hyperv_tsc_page;
+
+ do {
+ seq = tsc_page->tsc_sequence;
+
+ /* Seq 0 is special. It means the TSC enlightenment is not
+ * available at the moment. The reference time can only be
+ * obtained from the Reference Counter MSR.
+ */
+ if ( seq == 0 )
+ {
+ rdmsrl(HV_X64_MSR_TIME_REF_COUNT, ret);
+ return ret;
+ }
+
+ smp_rmb();
+
+ tsc = rdtsc_ordered();
+ scale = tsc_page->tsc_scale;
+ offset = tsc_page->tsc_offset;
+
+ smp_rmb();
+
+ } while (tsc_page->tsc_sequence != seq);
+
+ /* x86 has ARCH_SUPPORTS_INT128 */
+ ret = (uint64_t)(((__uint128_t)tsc * scale) >> 64) + offset;
+
+ return ret;
+}
+
+static struct platform_timesource __initdata plt_hyperv_timer =
+{
+ .id = "hyperv",
+ .name = "HYPER-V REFERENCE TSC",
+ .read_counter = read_hyperv_timer,
+ .init = init_hyperv_timer,
+ .counter_bits = 63,
+};
+#endif
+
/************************************************************
* GENERIC PLATFORM TIMER INFRASTRUCTURE
*/
@@ -763,6 +847,9 @@ static u64 __init init_platform_timer(void)
static struct platform_timesource * __initdata plt_timers[] = {
#ifdef CONFIG_XEN_GUEST
&plt_xen_timer,
+#endif
+#ifdef CONFIG_HYPERV_GUEST
+ &plt_hyperv_timer,
#endif
&plt_hpet, &plt_pmtimer, &plt_pit
};
--
2.20.1
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel
next prev parent reply other threads:[~2019-10-25 9:17 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-10-25 9:16 [Xen-devel] [PATCH for-next 0/7] Implement Hyper-V reference TSC based clock source Wei Liu
2019-10-25 9:16 ` [Xen-devel] [PATCH for-next 1/7] x86: import hyperv-tlfs.h from Linux Wei Liu
2019-12-10 15:33 ` Jan Beulich
2019-12-10 15:37 ` Durrant, Paul
2019-12-10 15:43 ` Jan Beulich
2019-12-11 11:14 ` Wei Liu
2019-12-11 11:22 ` Durrant, Paul
2019-12-11 11:28 ` Wei Liu
2019-10-25 9:16 ` [Xen-devel] [PATCH for-next 2/7] x86: fix up hyperv-tlfs.h Wei Liu
2019-12-10 15:35 ` Jan Beulich
2019-12-11 11:42 ` Wei Liu
2019-10-25 9:16 ` [Xen-devel] [PATCH for-next 3/7] x86/hyperv: extract more information from Hyper-V Wei Liu
2019-12-10 16:10 ` Jan Beulich
2019-10-25 9:16 ` [Xen-devel] [PATCH for-next 4/7] x86: add a comment regarding the location of hypervisor_probe Wei Liu
2019-12-10 16:15 ` Jan Beulich
2019-10-25 9:16 ` [Xen-devel] [PATCH for-next 5/7] x86: use running_on_hypervisor to gate hypervisor_setup Wei Liu
2019-12-10 16:17 ` Jan Beulich
2019-12-11 11:34 ` Wei Liu
2019-10-25 9:16 ` [Xen-devel] [PATCH for-next 6/7] x86/hyperv: provide hyperv_guest variable Wei Liu
2019-12-10 16:39 ` Jan Beulich
2019-10-25 9:16 ` Wei Liu [this message]
2019-12-10 16:59 ` [Xen-devel] [PATCH for-next 7/7] x86: implement Hyper-V clock source Jan Beulich
2019-12-18 12:38 ` Wei Liu
2019-12-18 12:51 ` Jan Beulich
2019-12-18 12:56 ` Andrew Cooper
2019-12-18 12:59 ` Wei Liu
2019-12-18 13:28 ` Jan Beulich
2019-12-18 13:18 ` Wei Liu
2019-12-18 13:24 ` Jan Beulich
2019-12-18 13:47 ` Wei Liu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20191025091618.10153-8-liuwe@microsoft.com \
--to=wl@xen.org \
--cc=andrew.cooper3@citrix.com \
--cc=jbeulich@suse.com \
--cc=liuwe@microsoft.com \
--cc=mikelley@microsoft.com \
--cc=paul@xen.org \
--cc=roger.pau@citrix.com \
--cc=xen-devel@lists.xenproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.