Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F106104893
D8723.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
5 KB
Referenced Files
None
Subscribers
None
D8723.diff
View Options
Index: head/sys/dev/hyperv/include/hyperv.h
===================================================================
--- head/sys/dev/hyperv/include/hyperv.h
+++ head/sys/dev/hyperv/include/hyperv.h
@@ -36,6 +36,23 @@
#include <vm/vm.h>
#include <vm/pmap.h>
+#define MSR_HV_TIME_REF_COUNT 0x40000020
+
+#define CPUID_HV_MSR_TIME_REFCNT 0x0002 /* MSR_HV_TIME_REF_COUNT */
+#define CPUID_HV_MSR_SYNIC 0x0004 /* MSRs for SynIC */
+#define CPUID_HV_MSR_SYNTIMER 0x0008 /* MSRs for SynTimer */
+#define CPUID_HV_MSR_APIC 0x0010 /* MSR_HV_{EOI,ICR,TPR} */
+#define CPUID_HV_MSR_HYPERCALL 0x0020 /* MSR_HV_GUEST_OS_ID
+ * MSR_HV_HYPERCALL */
+#define CPUID_HV_MSR_VP_INDEX 0x0040 /* MSR_HV_VP_INDEX */
+#define CPUID_HV_MSR_GUEST_IDLE 0x0400 /* MSR_HV_GUEST_IDLE */
+
+#ifndef NANOSEC
+#define NANOSEC 1000000000ULL
+#endif
+#define HYPERV_TIMER_NS_FACTOR 100ULL
+#define HYPERV_TIMER_FREQ (NANOSEC / HYPERV_TIMER_NS_FACTOR)
+
struct hyperv_guid {
uint8_t hv_guid[16];
} __packed;
@@ -44,4 +61,6 @@
int hyperv_guid2str(const struct hyperv_guid *, char *, size_t);
+extern u_int hyperv_features; /* CPUID_HV_MSR_ */
+
#endif /* _HYPERV_H_ */
Index: head/sys/dev/hyperv/utilities/hv_timesync.c
===================================================================
--- head/sys/dev/hyperv/utilities/hv_timesync.c
+++ head/sys/dev/hyperv/utilities/hv_timesync.c
@@ -46,10 +46,14 @@
#define VMBUS_TIMESYNC_FWVER \
VMBUS_IC_VERSION(VMBUS_TIMESYNC_FWVER_MAJOR, 0)
-#define VMBUS_TIMESYNC_MSGVER_MAJOR 3
+#define VMBUS_TIMESYNC_MSGVER_MAJOR 4
#define VMBUS_TIMESYNC_MSGVER \
VMBUS_IC_VERSION(VMBUS_TIMESYNC_MSGVER_MAJOR, 0)
+#define VMBUS_TIMESYNC_DORTT(sc) \
+ ((sc)->ic_msgver >= VMBUS_IC_VERSION(4, 0) && \
+ (hyperv_features & CPUID_HV_MSR_TIME_REFCNT))
+
static const struct vmbus_ic_desc vmbus_timesync_descs[] = {
{
.ic_guid = { .hv_guid = {
@@ -81,12 +85,16 @@
&vmbus_ts_sample_verbose, 0, "Increase sample request verbosity.");
static void
-vmbus_timesync(struct hv_util_sc *sc, uint64_t hvtime, uint8_t tsflags)
+vmbus_timesync(struct hv_util_sc *sc, uint64_t hvtime, uint64_t sent_tc,
+ uint8_t tsflags)
{
struct timespec vm_ts;
- uint64_t hv_ns, vm_ns;
+ uint64_t hv_ns, vm_ns, rtt = 0;
+
+ if (VMBUS_TIMESYNC_DORTT(sc))
+ rtt = rdmsr(MSR_HV_TIME_REF_COUNT) - sent_tc;
- hv_ns = (hvtime - VMBUS_ICMSG_TS_BASE) * VMBUS_ICMSG_TS_FACTOR;
+ hv_ns = (hvtime - VMBUS_ICMSG_TS_BASE + rtt) * HYPERV_TIMER_NS_FACTOR;
nanotime(&vm_ts);
vm_ns = (vm_ts.tv_sec * NANOSEC) + vm_ts.tv_nsec;
@@ -174,6 +182,8 @@
VMBUS_TIMESYNC_FWVER, VMBUS_TIMESYNC_MSGVER);
if (error)
return;
+ if (VMBUS_TIMESYNC_DORTT(sc))
+ device_printf(sc->ic_dev, "RTT\n");
break;
case VMBUS_ICMSG_TYPE_TIMESYNC:
@@ -183,7 +193,8 @@
return;
}
msg = data;
- vmbus_timesync(sc, msg->ic_hvtime, msg->ic_tsflags);
+ vmbus_timesync(sc, msg->ic_hvtime, msg->ic_sent_tc,
+ msg->ic_tsflags);
break;
default:
Index: head/sys/dev/hyperv/utilities/vmbus_icreg.h
===================================================================
--- head/sys/dev/hyperv/utilities/vmbus_icreg.h
+++ head/sys/dev/hyperv/utilities/vmbus_icreg.h
@@ -114,18 +114,13 @@
struct vmbus_icmsg_hdr ic_hdr;
uint64_t ic_hvtime;
uint64_t ic_vmtime;
- uint64_t ic_rtt;
+ uint64_t ic_sent_tc;
uint8_t ic_tsflags; /* VMBUS_ICMSG_TS_FLAG_ */
} __packed;
#define VMBUS_ICMSG_TS_FLAG_SYNC 0x01
#define VMBUS_ICMSG_TS_FLAG_SAMPLE 0x02
-/* XXX consolidate w/ hyperv */
#define VMBUS_ICMSG_TS_BASE 116444736000000000ULL
-#define VMBUS_ICMSG_TS_FACTOR 100ULL
-#ifndef NANOSEC
-#define NANOSEC 1000000000ULL
-#endif
#endif /* !_VMBUS_ICREG_H_ */
Index: head/sys/dev/hyperv/vmbus/hyperv_reg.h
===================================================================
--- head/sys/dev/hyperv/vmbus/hyperv_reg.h
+++ head/sys/dev/hyperv/vmbus/hyperv_reg.h
@@ -57,8 +57,6 @@
#define MSR_HV_VP_INDEX 0x40000002
-#define MSR_HV_TIME_REF_COUNT 0x40000020
-
#define MSR_HV_SCONTROL 0x40000080
#define MSR_HV_SCTRL_ENABLE 0x0001ULL
#define MSR_HV_SCTRL_RSVD_MASK 0xfffffffffffffffeULL
@@ -106,15 +104,7 @@
#define CPUID_LEAF_HV_IDENTITY 0x40000002
#define CPUID_LEAF_HV_FEATURES 0x40000003
-/* EAX: features */
-#define CPUID_HV_MSR_TIME_REFCNT 0x0002 /* MSR_HV_TIME_REF_COUNT */
-#define CPUID_HV_MSR_SYNIC 0x0004 /* MSRs for SynIC */
-#define CPUID_HV_MSR_SYNTIMER 0x0008 /* MSRs for SynTimer */
-#define CPUID_HV_MSR_APIC 0x0010 /* MSR_HV_{EOI,ICR,TPR} */
-#define CPUID_HV_MSR_HYPERCALL 0x0020 /* MSR_HV_GUEST_OS_ID
- * MSR_HV_HYPERCALL */
-#define CPUID_HV_MSR_VP_INDEX 0x0040 /* MSR_HV_VP_INDEX */
-#define CPUID_HV_MSR_GUEST_IDLE 0x0400 /* MSR_HV_GUEST_IDLE */
+/* EAX: features include/hyperv.h CPUID_HV_MSR */
/* ECX: power management features */
#define CPUPM_HV_CSTATE_MASK 0x000f /* deepest C-state */
#define CPUPM_HV_C3_HPET 0x0010 /* C3 requires HPET */
Index: head/sys/dev/hyperv/vmbus/hyperv_var.h
===================================================================
--- head/sys/dev/hyperv/vmbus/hyperv_var.h
+++ head/sys/dev/hyperv/vmbus/hyperv_var.h
@@ -29,13 +29,6 @@
#ifndef _HYPERV_VAR_H_
#define _HYPERV_VAR_H_
-#ifndef NANOSEC
-#define NANOSEC 1000000000ULL
-#endif
-#define HYPERV_TIMER_NS_FACTOR 100ULL
-#define HYPERV_TIMER_FREQ (NANOSEC / HYPERV_TIMER_NS_FACTOR)
-
-extern u_int hyperv_features;
extern u_int hyperv_recommends;
uint64_t hypercall_post_message(bus_addr_t msg_paddr);
Index: head/sys/dev/hyperv/vmbus/vmbus_et.c
===================================================================
--- head/sys/dev/hyperv/vmbus/vmbus_et.c
+++ head/sys/dev/hyperv/vmbus/vmbus_et.c
@@ -36,6 +36,7 @@
#include <sys/systm.h>
#include <sys/timeet.h>
+#include <dev/hyperv/include/hyperv.h>
#include <dev/hyperv/vmbus/hyperv_reg.h>
#include <dev/hyperv/vmbus/hyperv_var.h>
#include <dev/hyperv/vmbus/vmbus_var.h>
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Thu, Dec 26, 11:46 AM (11 h, 49 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
15604403
Default Alt Text
D8723.diff (5 KB)
Attached To
Mode
D8723: hyperv/timesync: Support "sent TC" to improve accuracy.
Attached
Detach File
Event Timeline
Log In to Comment