* [Xen-devel] [PATCH 0/4] Clean up viridian code
@ 2019-12-20 19:51 Wei Liu
2019-12-20 19:51 ` [Xen-devel] [PATCH 1/4] x86/viridian: drop duplicate defines from private.h and viridian.c Wei Liu
` (4 more replies)
0 siblings, 5 replies; 11+ messages in thread
From: Wei Liu @ 2019-12-20 19:51 UTC (permalink / raw)
To: Xen Development List; +Cc: Paul Durrant, Wei Liu, Michael Kelley
Wei Liu (4):
x86/viridian: drop duplicate defines from private.h and viridian.c
x86/viridian: drop private copy of HV_REFERENCE_TSC_PAGE in time.c
x86: provide and use hv_tsc_scale
x86: move viridian_guest_os_id_msr to hyperv-tlfs.h
xen/arch/x86/hvm/viridian/private.h | 66 -------------------------
xen/arch/x86/hvm/viridian/time.c | 50 +++----------------
xen/arch/x86/hvm/viridian/viridian.c | 31 +++---------
xen/arch/x86/time.c | 7 +--
xen/include/asm-x86/guest/hyperv-tlfs.h | 14 ++++++
xen/include/asm-x86/guest/hyperv.h | 32 +++++++++++-
xen/include/asm-x86/hvm/viridian.h | 18 ++-----
7 files changed, 64 insertions(+), 154 deletions(-)
--
2.20.1
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel
^ permalink raw reply [flat|nested] 11+ messages in thread
* [Xen-devel] [PATCH 1/4] x86/viridian: drop duplicate defines from private.h and viridian.c
2019-12-20 19:51 [Xen-devel] [PATCH 0/4] Clean up viridian code Wei Liu
@ 2019-12-20 19:51 ` Wei Liu
2019-12-21 12:19 ` Durrant, Paul
2019-12-20 19:51 ` [Xen-devel] [PATCH 2/4] x86/viridian: drop private copy of HV_REFERENCE_TSC_PAGE in time.c Wei Liu
` (3 subsequent siblings)
4 siblings, 1 reply; 11+ messages in thread
From: Wei Liu @ 2019-12-20 19:51 UTC (permalink / raw)
To: Xen Development List
Cc: Wei Liu, Wei Liu, Paul Durrant, Andrew Cooper, Paul Durrant,
Michael Kelley, Jan Beulich, Roger Pau Monné
Also add HVCALL_EXT_CALL_QUERY_CAPABILITIES to hyperv-tlfs.h.
HvGetPartitionID was never used in code so just dropped it.
No functional change intended.
Signed-off-by: Wei Liu <liuwe@microsoft.com>
---
xen/arch/x86/hvm/viridian/private.h | 66 -------------------------
xen/arch/x86/hvm/viridian/viridian.c | 29 +++--------
xen/include/asm-x86/guest/hyperv-tlfs.h | 1 +
3 files changed, 8 insertions(+), 88 deletions(-)
diff --git a/xen/arch/x86/hvm/viridian/private.h b/xen/arch/x86/hvm/viridian/private.h
index c272c34cda..958a2814c2 100644
--- a/xen/arch/x86/hvm/viridian/private.h
+++ b/xen/arch/x86/hvm/viridian/private.h
@@ -5,72 +5,6 @@
#include <asm/hvm/save.h>
-/* Viridian MSR numbers. */
-#define HV_X64_MSR_GUEST_OS_ID 0x40000000
-#define HV_X64_MSR_HYPERCALL 0x40000001
-#define HV_X64_MSR_VP_INDEX 0x40000002
-#define HV_X64_MSR_RESET 0x40000003
-#define HV_X64_MSR_VP_RUNTIME 0x40000010
-#define HV_X64_MSR_TIME_REF_COUNT 0x40000020
-#define HV_X64_MSR_REFERENCE_TSC 0x40000021
-#define HV_X64_MSR_TSC_FREQUENCY 0x40000022
-#define HV_X64_MSR_APIC_FREQUENCY 0x40000023
-#define HV_X64_MSR_EOI 0x40000070
-#define HV_X64_MSR_ICR 0x40000071
-#define HV_X64_MSR_TPR 0x40000072
-#define HV_X64_MSR_VP_ASSIST_PAGE 0x40000073
-#define HV_X64_MSR_SCONTROL 0x40000080
-#define HV_X64_MSR_SVERSION 0x40000081
-#define HV_X64_MSR_SIEFP 0x40000082
-#define HV_X64_MSR_SIMP 0x40000083
-#define HV_X64_MSR_EOM 0x40000084
-#define HV_X64_MSR_SINT0 0x40000090
-#define HV_X64_MSR_SINT1 0x40000091
-#define HV_X64_MSR_SINT2 0x40000092
-#define HV_X64_MSR_SINT3 0x40000093
-#define HV_X64_MSR_SINT4 0x40000094
-#define HV_X64_MSR_SINT5 0x40000095
-#define HV_X64_MSR_SINT6 0x40000096
-#define HV_X64_MSR_SINT7 0x40000097
-#define HV_X64_MSR_SINT8 0x40000098
-#define HV_X64_MSR_SINT9 0x40000099
-#define HV_X64_MSR_SINT10 0x4000009A
-#define HV_X64_MSR_SINT11 0x4000009B
-#define HV_X64_MSR_SINT12 0x4000009C
-#define HV_X64_MSR_SINT13 0x4000009D
-#define HV_X64_MSR_SINT14 0x4000009E
-#define HV_X64_MSR_SINT15 0x4000009F
-#define HV_X64_MSR_STIMER0_CONFIG 0x400000B0
-#define HV_X64_MSR_STIMER0_COUNT 0x400000B1
-#define HV_X64_MSR_STIMER1_CONFIG 0x400000B2
-#define HV_X64_MSR_STIMER1_COUNT 0x400000B3
-#define HV_X64_MSR_STIMER2_CONFIG 0x400000B4
-#define HV_X64_MSR_STIMER2_COUNT 0x400000B5
-#define HV_X64_MSR_STIMER3_CONFIG 0x400000B6
-#define HV_X64_MSR_STIMER3_COUNT 0x400000B7
-#define HV_X64_MSR_POWER_STATE_TRIGGER_C1 0x400000C1
-#define HV_X64_MSR_POWER_STATE_TRIGGER_C2 0x400000C2
-#define HV_X64_MSR_POWER_STATE_TRIGGER_C3 0x400000C3
-#define HV_X64_MSR_POWER_STATE_CONFIG_C1 0x400000D1
-#define HV_X64_MSR_POWER_STATE_CONFIG_C2 0x400000D2
-#define HV_X64_MSR_POWER_STATE_CONFIG_C3 0x400000D3
-#define HV_X64_MSR_STATS_PARTITION_RETAIL_PAGE 0x400000E0
-#define HV_X64_MSR_STATS_PARTITION_INTERNAL_PAGE 0x400000E1
-#define HV_X64_MSR_STATS_VP_RETAIL_PAGE 0x400000E2
-#define HV_X64_MSR_STATS_VP_INTERNAL_PAGE 0x400000E3
-#define HV_X64_MSR_GUEST_IDLE 0x400000F0
-#define HV_X64_MSR_SYNTH_DEBUG_CONTROL 0x400000F1
-#define HV_X64_MSR_SYNTH_DEBUG_STATUS 0x400000F2
-#define HV_X64_MSR_SYNTH_DEBUG_SEND_BUFFER 0x400000F3
-#define HV_X64_MSR_SYNTH_DEBUG_RECEIVE_BUFFER 0x400000F4
-#define HV_X64_MSR_SYNTH_DEBUG_PENDING_BUFFER 0x400000F5
-#define HV_X64_MSR_CRASH_P0 0x40000100
-#define HV_X64_MSR_CRASH_P1 0x40000101
-#define HV_X64_MSR_CRASH_P2 0x40000102
-#define HV_X64_MSR_CRASH_P3 0x40000103
-#define HV_X64_MSR_CRASH_P4 0x40000104
-#define HV_X64_MSR_CRASH_CTL 0x40000105
-
int viridian_synic_wrmsr(struct vcpu *v, uint32_t idx, uint64_t val);
int viridian_synic_rdmsr(const struct vcpu *v, uint32_t idx, uint64_t *val);
diff --git a/xen/arch/x86/hvm/viridian/viridian.c b/xen/arch/x86/hvm/viridian/viridian.c
index 4b06b78a27..341592f054 100644
--- a/xen/arch/x86/hvm/viridian/viridian.c
+++ b/xen/arch/x86/hvm/viridian/viridian.c
@@ -10,6 +10,7 @@
#include <xen/hypercall.h>
#include <xen/domain_page.h>
#include <asm/guest_access.h>
+#include <asm/guest/hyperv-tlfs.h>
#include <asm/paging.h>
#include <asm/p2m.h>
#include <asm/apic.h>
@@ -19,22 +20,6 @@
#include "private.h"
-/* Viridian Hypercall Status Codes. */
-#define HV_STATUS_SUCCESS 0x0000
-#define HV_STATUS_INVALID_HYPERCALL_CODE 0x0002
-#define HV_STATUS_INVALID_PARAMETER 0x0005
-
-/* Viridian Hypercall Codes. */
-#define HvFlushVirtualAddressSpace 0x0002
-#define HvFlushVirtualAddressList 0x0003
-#define HvNotifyLongSpinWait 0x0008
-#define HvSendSyntheticClusterIpi 0x000b
-#define HvGetPartitionId 0x0046
-#define HvExtCallQueryCapabilities 0x8001
-
-/* Viridian Hypercall Flags. */
-#define HV_FLUSH_ALL_PROCESSORS 1
-
/* Viridian Partition Privilege Flags */
typedef struct {
/* Access to virtual MSRs */
@@ -214,7 +199,7 @@ void cpuid_viridian_leaves(const struct vcpu *v, uint32_t leaf,
/*
* This value is the recommended number of attempts to try to
* acquire a spinlock before notifying the hypervisor via the
- * HvNotifyLongSpinWait hypercall.
+ * HVCALL_NOTIFY_LONG_SPIN_WAIT hypercall.
*/
res->b = viridian_spinlock_retry_count;
break;
@@ -583,7 +568,7 @@ int viridian_hypercall(struct cpu_user_regs *regs)
switch ( input.call_code )
{
- case HvNotifyLongSpinWait:
+ case HVCALL_NOTIFY_LONG_SPIN_WAIT:
/*
* See section 14.5.1 of the specification.
*/
@@ -591,8 +576,8 @@ int viridian_hypercall(struct cpu_user_regs *regs)
status = HV_STATUS_SUCCESS;
break;
- case HvFlushVirtualAddressSpace:
- case HvFlushVirtualAddressList:
+ case HVCALL_FLUSH_VIRTUAL_ADDRESS_SPACE:
+ case HVCALL_FLUSH_VIRTUAL_ADDRESS_LIST:
{
struct {
uint64_t address_space;
@@ -632,7 +617,7 @@ int viridian_hypercall(struct cpu_user_regs *regs)
break;
}
- case HvSendSyntheticClusterIpi:
+ case HVCALL_SEND_IPI:
{
struct vcpu *v;
uint32_t vector;
@@ -695,7 +680,7 @@ int viridian_hypercall(struct cpu_user_regs *regs)
gprintk(XENLOG_WARNING, "unimplemented hypercall %04x\n",
input.call_code);
/* Fallthrough. */
- case HvExtCallQueryCapabilities:
+ case HVCALL_EXT_CALL_QUERY_CAPABILITIES:
/*
* This hypercall seems to be erroneously issued by Windows
* despite EnableExtendedHypercalls not being set in CPUID leaf 2.
diff --git a/xen/include/asm-x86/guest/hyperv-tlfs.h b/xen/include/asm-x86/guest/hyperv-tlfs.h
index ccd9850b27..b128807b2c 100644
--- a/xen/include/asm-x86/guest/hyperv-tlfs.h
+++ b/xen/include/asm-x86/guest/hyperv-tlfs.h
@@ -374,6 +374,7 @@ struct hv_tsc_emulation_status {
#define HVCALL_SIGNAL_EVENT 0x005d
#define HVCALL_FLUSH_GUEST_PHYSICAL_ADDRESS_SPACE 0x00af
#define HVCALL_FLUSH_GUEST_PHYSICAL_ADDRESS_LIST 0x00b0
+#define HVCALL_EXT_CALL_QUERY_CAPABILITIES 0x8001
#define HV_X64_MSR_VP_ASSIST_PAGE_ENABLE 0x00000001
#define HV_X64_MSR_VP_ASSIST_PAGE_ADDRESS_SHIFT 12
--
2.20.1
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [Xen-devel] [PATCH 2/4] x86/viridian: drop private copy of HV_REFERENCE_TSC_PAGE in time.c
2019-12-20 19:51 [Xen-devel] [PATCH 0/4] Clean up viridian code Wei Liu
2019-12-20 19:51 ` [Xen-devel] [PATCH 1/4] x86/viridian: drop duplicate defines from private.h and viridian.c Wei Liu
@ 2019-12-20 19:51 ` Wei Liu
2019-12-21 12:20 ` Durrant, Paul
2019-12-20 19:51 ` [Xen-devel] [PATCH 3/4] x86: provide and use hv_tsc_scale Wei Liu
` (2 subsequent siblings)
4 siblings, 1 reply; 11+ messages in thread
From: Wei Liu @ 2019-12-20 19:51 UTC (permalink / raw)
To: Xen Development List
Cc: Wei Liu, Wei Liu, Paul Durrant, Andrew Cooper, Paul Durrant,
Michael Kelley, Jan Beulich, Roger Pau Monné
Use the one defined in hyperv-tlfs.h instead. No functional change
intended.
Signed-off-by: Wei Liu <liuwe@microsoft.com>
---
xen/arch/x86/hvm/viridian/time.c | 20 ++++++--------------
1 file changed, 6 insertions(+), 14 deletions(-)
diff --git a/xen/arch/x86/hvm/viridian/time.c b/xen/arch/x86/hvm/viridian/time.c
index 6ddca29b29..32e79bbcc4 100644
--- a/xen/arch/x86/hvm/viridian/time.c
+++ b/xen/arch/x86/hvm/viridian/time.c
@@ -13,19 +13,11 @@
#include <asm/apic.h>
#include <asm/event.h>
+#include <asm/guest/hyperv-tlfs.h>
#include <asm/hvm/support.h>
#include "private.h"
-typedef struct _HV_REFERENCE_TSC_PAGE
-{
- uint32_t TscSequence;
- uint32_t Reserved1;
- uint64_t TscScale;
- int64_t TscOffset;
- uint64_t Reserved2[509];
-} HV_REFERENCE_TSC_PAGE, *PHV_REFERENCE_TSC_PAGE;
-
static void update_reference_tsc(const struct domain *d, bool initialize)
{
struct viridian_domain *vd = d->arch.hvm.viridian;
@@ -61,7 +53,7 @@ static void update_reference_tsc(const struct domain *d, bool initialize)
* violate the spec. and rely on a value of 0 to indicate that this
* enlightenment should no longer be used.
*/
- p->TscSequence = 0;
+ p->tsc_sequence = 0;
printk(XENLOG_G_INFO "d%d: VIRIDIAN REFERENCE_TSC: invalidated\n",
d->domain_id);
@@ -79,15 +71,15 @@ static void update_reference_tsc(const struct domain *d, bool initialize)
* The offset value is calculated on restore after migration and
* ensures that Windows will not see a large jump in ReferenceTime.
*/
- p->TscScale = ((10000ul << 32) / d->arch.tsc_khz) << 32;
- p->TscOffset = trc->off;
+ p->tsc_scale = ((10000ul << 32) / d->arch.tsc_khz) << 32;
+ p->tsc_offset = trc->off;
smp_wmb();
- seq = p->TscSequence + 1;
+ seq = p->tsc_sequence + 1;
if ( seq == 0xFFFFFFFF || seq == 0 ) /* Avoid both 'invalid' values */
seq = 1;
- p->TscSequence = seq;
+ p->tsc_sequence = seq;
}
/*
--
2.20.1
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [Xen-devel] [PATCH 3/4] x86: provide and use hv_tsc_scale
2019-12-20 19:51 [Xen-devel] [PATCH 0/4] Clean up viridian code Wei Liu
2019-12-20 19:51 ` [Xen-devel] [PATCH 1/4] x86/viridian: drop duplicate defines from private.h and viridian.c Wei Liu
2019-12-20 19:51 ` [Xen-devel] [PATCH 2/4] x86/viridian: drop private copy of HV_REFERENCE_TSC_PAGE in time.c Wei Liu
@ 2019-12-20 19:51 ` Wei Liu
2019-12-21 12:27 ` Durrant, Paul
2019-12-20 19:51 ` [Xen-devel] [PATCH 4/4] x86: move viridian_guest_os_id_msr to hyperv-tlfs.h Wei Liu
2019-12-20 21:21 ` [Xen-devel] [PATCH 5/4] x86/viridian: drop a wrong invalid value from reference TSC implementation Wei Liu
4 siblings, 1 reply; 11+ messages in thread
From: Wei Liu @ 2019-12-20 19:51 UTC (permalink / raw)
To: Xen Development List
Cc: Wei Liu, Wei Liu, Paul Durrant, Andrew Cooper, Paul Durrant,
Michael Kelley, Jan Beulich, Roger Pau Monné
The Hyper-V clock source and Xen's own viridian code need the same
functionality.
Move the function in viridian/time.c to hyperv.h and use it in both
places.
No functional change.
Signed-off-by: Wei Liu <liuwe@microsoft.com>
---
xen/arch/x86/hvm/viridian/time.c | 30 ++--------------------------
xen/arch/x86/time.c | 7 +------
xen/include/asm-x86/guest/hyperv.h | 32 ++++++++++++++++++++++++++++--
3 files changed, 33 insertions(+), 36 deletions(-)
diff --git a/xen/arch/x86/hvm/viridian/time.c b/xen/arch/x86/hvm/viridian/time.c
index 32e79bbcc4..6b2d745f3a 100644
--- a/xen/arch/x86/hvm/viridian/time.c
+++ b/xen/arch/x86/hvm/viridian/time.c
@@ -13,6 +13,7 @@
#include <asm/apic.h>
#include <asm/event.h>
+#include <asm/guest/hyperv.h>
#include <asm/guest/hyperv-tlfs.h>
#include <asm/hvm/support.h>
@@ -82,33 +83,6 @@ static void update_reference_tsc(const struct domain *d, bool initialize)
p->tsc_sequence = seq;
}
-/*
- * The specification says: "The partition reference time is computed
- * by the following formula:
- *
- * ReferenceTime = ((VirtualTsc * TscScale) >> 64) + TscOffset
- *
- * The multiplication is a 64 bit multiplication, which results in a
- * 128 bit number which is then shifted 64 times to the right to obtain
- * the high 64 bits."
- */
-static uint64_t scale_tsc(uint64_t tsc, uint64_t scale, int64_t offset)
-{
- uint64_t result;
-
- /*
- * Quadword MUL takes an implicit operand in RAX, and puts the result
- * in RDX:RAX. Because we only want the result of the multiplication
- * after shifting right by 64 bits, we therefore only need the content
- * of RDX.
- */
- asm ( "mulq %[scale]"
- : "+a" (tsc), "=d" (result)
- : [scale] "rm" (scale) );
-
- return result + offset;
-}
-
static uint64_t trc_val(const struct domain *d, int64_t offset)
{
uint64_t tsc, scale;
@@ -116,7 +90,7 @@ static uint64_t trc_val(const struct domain *d, int64_t offset)
tsc = hvm_get_guest_tsc(pt_global_vcpu_target(d));
scale = ((10000ul << 32) / d->arch.tsc_khz) << 32;
- return scale_tsc(tsc, scale, offset);
+ return hv_scale_tsc(tsc, scale, offset);
}
static void time_ref_count_freeze(const struct domain *d)
diff --git a/xen/arch/x86/time.c b/xen/arch/x86/time.c
index bbcc9b10b8..d21875de9e 100644
--- a/xen/arch/x86/time.c
+++ b/xen/arch/x86/time.c
@@ -725,12 +725,7 @@ static inline uint64_t read_hyperv_timer(void)
} while ( tsc_page->tsc_sequence != seq );
- /* ret = ((tsc * scale) >> 64) + offset; */
- asm ( "mul %[scale]; add %[offset], %[ret]"
- : "+a" (tsc), [ret] "=&d" (ret)
- : [scale] "rm" (scale), [offset] "rm" (offset) );
-
- return ret;
+ return hv_scale_tsc(tsc, scale, offset);
}
static struct platform_timesource __initdata plt_hyperv_timer =
diff --git a/xen/include/asm-x86/guest/hyperv.h b/xen/include/asm-x86/guest/hyperv.h
index cc21b9abfc..c7a7f32bd5 100644
--- a/xen/include/asm-x86/guest/hyperv.h
+++ b/xen/include/asm-x86/guest/hyperv.h
@@ -19,10 +19,38 @@
#ifndef __X86_GUEST_HYPERV_H__
#define __X86_GUEST_HYPERV_H__
-#ifdef CONFIG_HYPERV_GUEST
-
#include <xen/types.h>
+/*
+ * The specification says: "The partition reference time is computed
+ * by the following formula:
+ *
+ * ReferenceTime = ((VirtualTsc * TscScale) >> 64) + TscOffset
+ *
+ * The multiplication is a 64 bit multiplication, which results in a
+ * 128 bit number which is then shifted 64 times to the right to obtain
+ * the high 64 bits."
+ */
+static inline uint64_t hv_scale_tsc(uint64_t tsc, uint64_t scale,
+ int64_t offset)
+{
+ uint64_t result;
+
+ /*
+ * Quadword MUL takes an implicit operand in RAX, and puts the result
+ * in RDX:RAX. Because we only want the result of the multiplication
+ * after shifting right by 64 bits, we therefore only need the content
+ * of RDX.
+ */
+ asm ( "mulq %[scale]"
+ : "+a" (tsc), "=d" (result)
+ : [scale] "rm" (scale) );
+
+ return result + offset;
+}
+
+#ifdef CONFIG_HYPERV_GUEST
+
#include <asm/guest/hypervisor.h>
struct ms_hyperv_info {
--
2.20.1
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [Xen-devel] [PATCH 4/4] x86: move viridian_guest_os_id_msr to hyperv-tlfs.h
2019-12-20 19:51 [Xen-devel] [PATCH 0/4] Clean up viridian code Wei Liu
` (2 preceding siblings ...)
2019-12-20 19:51 ` [Xen-devel] [PATCH 3/4] x86: provide and use hv_tsc_scale Wei Liu
@ 2019-12-20 19:51 ` Wei Liu
2019-12-21 12:28 ` Durrant, Paul
2019-12-20 21:21 ` [Xen-devel] [PATCH 5/4] x86/viridian: drop a wrong invalid value from reference TSC implementation Wei Liu
4 siblings, 1 reply; 11+ messages in thread
From: Wei Liu @ 2019-12-20 19:51 UTC (permalink / raw)
To: Xen Development List
Cc: Wei Liu, Wei Liu, Paul Durrant, Andrew Cooper, Paul Durrant,
Michael Kelley, Jan Beulich, Roger Pau Monné
Suggested-by: Paul Durrant <pdurrant@amazon.com>
Signed-off-by: Wei Liu <liuwe@microsoft.com>
---
xen/arch/x86/hvm/viridian/viridian.c | 2 +-
xen/include/asm-x86/guest/hyperv-tlfs.h | 13 +++++++++++++
xen/include/asm-x86/hvm/viridian.h | 18 +++---------------
3 files changed, 17 insertions(+), 16 deletions(-)
diff --git a/xen/arch/x86/hvm/viridian/viridian.c b/xen/arch/x86/hvm/viridian/viridian.c
index 341592f054..44c8e6cac6 100644
--- a/xen/arch/x86/hvm/viridian/viridian.c
+++ b/xen/arch/x86/hvm/viridian/viridian.c
@@ -218,7 +218,7 @@ void cpuid_viridian_leaves(const struct vcpu *v, uint32_t leaf,
static void dump_guest_os_id(const struct domain *d)
{
- const union viridian_guest_os_id_msr *goi;
+ const union hv_guest_os_id *goi;
goi = &d->arch.hvm.viridian->guest_os_id;
diff --git a/xen/include/asm-x86/guest/hyperv-tlfs.h b/xen/include/asm-x86/guest/hyperv-tlfs.h
index b128807b2c..4402854c80 100644
--- a/xen/include/asm-x86/guest/hyperv-tlfs.h
+++ b/xen/include/asm-x86/guest/hyperv-tlfs.h
@@ -327,6 +327,19 @@ struct ms_hyperv_tsc_page {
*/
#define HV_LINUX_VENDOR_ID 0x8100
+union hv_guest_os_id
+{
+ uint64_t raw;
+ struct
+ {
+ uint64_t build_number:16;
+ uint64_t service_pack:8;
+ uint64_t minor:8;
+ uint64_t major:8;
+ uint64_t os:8;
+ uint64_t vendor:16;
+ };
+};
struct hv_reenlightenment_control {
__u64 vector:8;
diff --git a/xen/include/asm-x86/hvm/viridian.h b/xen/include/asm-x86/hvm/viridian.h
index 010c8b58d4..cfbaede158 100644
--- a/xen/include/asm-x86/hvm/viridian.h
+++ b/xen/include/asm-x86/hvm/viridian.h
@@ -9,6 +9,8 @@
#ifndef __ASM_X86_HVM_VIRIDIAN_H__
#define __ASM_X86_HVM_VIRIDIAN_H__
+#include <asm/guest/hyperv-tlfs.h>
+
union viridian_page_msr
{
uint64_t raw;
@@ -83,20 +85,6 @@ struct viridian_vcpu
uint64_t crash_param[5];
};
-union viridian_guest_os_id_msr
-{
- uint64_t raw;
- struct
- {
- uint64_t build_number:16;
- uint64_t service_pack:8;
- uint64_t minor:8;
- uint64_t major:8;
- uint64_t os:8;
- uint64_t vendor:16;
- };
-};
-
struct viridian_time_ref_count
{
unsigned long flags;
@@ -112,7 +100,7 @@ struct viridian_time_ref_count
struct viridian_domain
{
- union viridian_guest_os_id_msr guest_os_id;
+ union hv_guest_os_id guest_os_id;
union viridian_page_msr hypercall_gpa;
struct viridian_time_ref_count time_ref_count;
struct viridian_page reference_tsc;
--
2.20.1
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [Xen-devel] [PATCH 5/4] x86/viridian: drop a wrong invalid value from reference TSC implementation
2019-12-20 19:51 [Xen-devel] [PATCH 0/4] Clean up viridian code Wei Liu
` (3 preceding siblings ...)
2019-12-20 19:51 ` [Xen-devel] [PATCH 4/4] x86: move viridian_guest_os_id_msr to hyperv-tlfs.h Wei Liu
@ 2019-12-20 21:21 ` Wei Liu
2019-12-21 12:06 ` Durrant, Paul
4 siblings, 1 reply; 11+ messages in thread
From: Wei Liu @ 2019-12-20 21:21 UTC (permalink / raw)
To: Xen Development List
Cc: Wei Liu, Wei Liu, Paul Durrant, Andrew Cooper, Paul Durrant,
Michael Kelley, Jan Beulich, Roger Pau Monné
The only invalid value mentioned in Hyper-V TLFS 5.0c is 0. Michael
Kelley confirmed that 0xFFFFFFFF was never used [0].
[0] https://lists.xen.org/archives/html/xen-devel/2019-12/msg01564.html
Signed-off-by: Wei Liu <liuwe@microsoft.com>
---
xen/arch/x86/hvm/viridian/time.c | 13 ++++---------
1 file changed, 4 insertions(+), 9 deletions(-)
diff --git a/xen/arch/x86/hvm/viridian/time.c b/xen/arch/x86/hvm/viridian/time.c
index 6b2d745f3a..b8280a1a60 100644
--- a/xen/arch/x86/hvm/viridian/time.c
+++ b/xen/arch/x86/hvm/viridian/time.c
@@ -45,14 +45,9 @@ static void update_reference_tsc(const struct domain *d, bool initialize)
if ( !host_tsc_is_safe() || d->arch.vtsc )
{
/*
- * The specification states that valid values of TscSequence range
- * from 0 to 0xFFFFFFFE. The value 0xFFFFFFFF is used to indicate
- * this mechanism is no longer a reliable source of time and that
- * the VM should fall back to a different source.
- *
- * Server 2012 (6.2 kernel) and 2012 R2 (6.3 kernel) actually
- * violate the spec. and rely on a value of 0 to indicate that this
- * enlightenment should no longer be used.
+ * The value 0 is used to indicate this mechanism is no longer a
+ * reliable source of time and that the VM should fall back to a
+ * different source.
*/
p->tsc_sequence = 0;
@@ -77,7 +72,7 @@ static void update_reference_tsc(const struct domain *d, bool initialize)
smp_wmb();
seq = p->tsc_sequence + 1;
- if ( seq == 0xFFFFFFFF || seq == 0 ) /* Avoid both 'invalid' values */
+ if ( seq == 0 ) /* Avoid 'invalid' value */
seq = 1;
p->tsc_sequence = seq;
--
2.20.1
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [Xen-devel] [PATCH 5/4] x86/viridian: drop a wrong invalid value from reference TSC implementation
2019-12-20 21:21 ` [Xen-devel] [PATCH 5/4] x86/viridian: drop a wrong invalid value from reference TSC implementation Wei Liu
@ 2019-12-21 12:06 ` Durrant, Paul
0 siblings, 0 replies; 11+ messages in thread
From: Durrant, Paul @ 2019-12-21 12:06 UTC (permalink / raw)
To: Wei Liu, Xen Development List
Cc: Wei Liu, Paul Durrant, Andrew Cooper, Michael Kelley,
Jan Beulich, Roger Pau Monné
> -----Original Message-----
> From: Wei Liu <wei.liu.xen@gmail.com> On Behalf Of Wei Liu
> Sent: 20 December 2019 21:21
> To: Xen Development List <xen-devel@lists.xenproject.org>
> Cc: Durrant, Paul <pdurrant@amazon.com>; Michael Kelley
> <mikelley@microsoft.com>; Wei Liu <liuwe@microsoft.com>; Paul Durrant
> <paul@xen.org>; Jan Beulich <jbeulich@suse.com>; Andrew Cooper
> <andrew.cooper3@citrix.com>; Wei Liu <wl@xen.org>; Roger Pau Monné
> <roger.pau@citrix.com>
> Subject: [PATCH 5/4] x86/viridian: drop a wrong invalid value from
> reference TSC implementation
>
> The only invalid value mentioned in Hyper-V TLFS 5.0c is 0. Michael
> Kelley confirmed that 0xFFFFFFFF was never used [0].
>
> [0] https://lists.xen.org/archives/html/xen-devel/2019-12/msg01564.html
>
> Signed-off-by: Wei Liu <liuwe@microsoft.com>
> ---
> xen/arch/x86/hvm/viridian/time.c | 13 ++++---------
> 1 file changed, 4 insertions(+), 9 deletions(-)
>
> diff --git a/xen/arch/x86/hvm/viridian/time.c
> b/xen/arch/x86/hvm/viridian/time.c
> index 6b2d745f3a..b8280a1a60 100644
> --- a/xen/arch/x86/hvm/viridian/time.c
> +++ b/xen/arch/x86/hvm/viridian/time.c
> @@ -45,14 +45,9 @@ static void update_reference_tsc(const struct domain
> *d, bool initialize)
> if ( !host_tsc_is_safe() || d->arch.vtsc )
> {
> /*
> - * The specification states that valid values of TscSequence
> range
> - * from 0 to 0xFFFFFFFE. The value 0xFFFFFFFF is used to indicate
> - * this mechanism is no longer a reliable source of time and that
> - * the VM should fall back to a different source.
> - *
> - * Server 2012 (6.2 kernel) and 2012 R2 (6.3 kernel) actually
> - * violate the spec. and rely on a value of 0 to indicate that
> this
> - * enlightenment should no longer be used.
> + * The value 0 is used to indicate this mechanism is no longer a
> + * reliable source of time and that the VM should fall back to a
> + * different source.
> */
> p->tsc_sequence = 0;
>
> @@ -77,7 +72,7 @@ static void update_reference_tsc(const struct domain *d,
> bool initialize)
> smp_wmb();
>
> seq = p->tsc_sequence + 1;
> - if ( seq == 0xFFFFFFFF || seq == 0 ) /* Avoid both 'invalid' values
> */
> + if ( seq == 0 ) /* Avoid 'invalid' value */
> seq = 1;
>
> p->tsc_sequence = seq;
Now that we're just dealing with 0, I think the code would be neater as:
seq = p->tsc_sequence + 1;
p->tsc_sequence = seq ? seq : 1; /* Avoid 'invalid' value 0 */
Paul
> --
> 2.20.1
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [Xen-devel] [PATCH 1/4] x86/viridian: drop duplicate defines from private.h and viridian.c
2019-12-20 19:51 ` [Xen-devel] [PATCH 1/4] x86/viridian: drop duplicate defines from private.h and viridian.c Wei Liu
@ 2019-12-21 12:19 ` Durrant, Paul
0 siblings, 0 replies; 11+ messages in thread
From: Durrant, Paul @ 2019-12-21 12:19 UTC (permalink / raw)
To: Wei Liu, Xen Development List
Cc: Wei Liu, Paul Durrant, Andrew Cooper, Michael Kelley,
Jan Beulich, Roger Pau Monné
> -----Original Message-----
> From: Wei Liu <wei.liu.xen@gmail.com> On Behalf Of Wei Liu
> Sent: 20 December 2019 19:52
> To: Xen Development List <xen-devel@lists.xenproject.org>
> Cc: Michael Kelley <mikelley@microsoft.com>; Durrant, Paul
> <pdurrant@amazon.com>; Wei Liu <liuwe@microsoft.com>; Paul Durrant
> <paul@xen.org>; Jan Beulich <jbeulich@suse.com>; Andrew Cooper
> <andrew.cooper3@citrix.com>; Wei Liu <wl@xen.org>; Roger Pau Monné
> <roger.pau@citrix.com>
> Subject: [PATCH 1/4] x86/viridian: drop duplicate defines from private.h
> and viridian.c
>
> Also add HVCALL_EXT_CALL_QUERY_CAPABILITIES to hyperv-tlfs.h.
> HvGetPartitionID was never used in code so just dropped it.
>
> No functional change intended.
>
> Signed-off-by: Wei Liu <liuwe@microsoft.com>
Reviewed-by: Paul Durrant <paul@xen.org>
> ---
> xen/arch/x86/hvm/viridian/private.h | 66 -------------------------
> xen/arch/x86/hvm/viridian/viridian.c | 29 +++--------
> xen/include/asm-x86/guest/hyperv-tlfs.h | 1 +
> 3 files changed, 8 insertions(+), 88 deletions(-)
>
> diff --git a/xen/arch/x86/hvm/viridian/private.h
> b/xen/arch/x86/hvm/viridian/private.h
> index c272c34cda..958a2814c2 100644
> --- a/xen/arch/x86/hvm/viridian/private.h
> +++ b/xen/arch/x86/hvm/viridian/private.h
> @@ -5,72 +5,6 @@
>
> #include <asm/hvm/save.h>
>
> -/* Viridian MSR numbers. */
> -#define HV_X64_MSR_GUEST_OS_ID 0x40000000
> -#define HV_X64_MSR_HYPERCALL 0x40000001
> -#define HV_X64_MSR_VP_INDEX 0x40000002
> -#define HV_X64_MSR_RESET 0x40000003
> -#define HV_X64_MSR_VP_RUNTIME 0x40000010
> -#define HV_X64_MSR_TIME_REF_COUNT 0x40000020
> -#define HV_X64_MSR_REFERENCE_TSC 0x40000021
> -#define HV_X64_MSR_TSC_FREQUENCY 0x40000022
> -#define HV_X64_MSR_APIC_FREQUENCY 0x40000023
> -#define HV_X64_MSR_EOI 0x40000070
> -#define HV_X64_MSR_ICR 0x40000071
> -#define HV_X64_MSR_TPR 0x40000072
> -#define HV_X64_MSR_VP_ASSIST_PAGE 0x40000073
> -#define HV_X64_MSR_SCONTROL 0x40000080
> -#define HV_X64_MSR_SVERSION 0x40000081
> -#define HV_X64_MSR_SIEFP 0x40000082
> -#define HV_X64_MSR_SIMP 0x40000083
> -#define HV_X64_MSR_EOM 0x40000084
> -#define HV_X64_MSR_SINT0 0x40000090
> -#define HV_X64_MSR_SINT1 0x40000091
> -#define HV_X64_MSR_SINT2 0x40000092
> -#define HV_X64_MSR_SINT3 0x40000093
> -#define HV_X64_MSR_SINT4 0x40000094
> -#define HV_X64_MSR_SINT5 0x40000095
> -#define HV_X64_MSR_SINT6 0x40000096
> -#define HV_X64_MSR_SINT7 0x40000097
> -#define HV_X64_MSR_SINT8 0x40000098
> -#define HV_X64_MSR_SINT9 0x40000099
> -#define HV_X64_MSR_SINT10 0x4000009A
> -#define HV_X64_MSR_SINT11 0x4000009B
> -#define HV_X64_MSR_SINT12 0x4000009C
> -#define HV_X64_MSR_SINT13 0x4000009D
> -#define HV_X64_MSR_SINT14 0x4000009E
> -#define HV_X64_MSR_SINT15 0x4000009F
> -#define HV_X64_MSR_STIMER0_CONFIG 0x400000B0
> -#define HV_X64_MSR_STIMER0_COUNT 0x400000B1
> -#define HV_X64_MSR_STIMER1_CONFIG 0x400000B2
> -#define HV_X64_MSR_STIMER1_COUNT 0x400000B3
> -#define HV_X64_MSR_STIMER2_CONFIG 0x400000B4
> -#define HV_X64_MSR_STIMER2_COUNT 0x400000B5
> -#define HV_X64_MSR_STIMER3_CONFIG 0x400000B6
> -#define HV_X64_MSR_STIMER3_COUNT 0x400000B7
> -#define HV_X64_MSR_POWER_STATE_TRIGGER_C1 0x400000C1
> -#define HV_X64_MSR_POWER_STATE_TRIGGER_C2 0x400000C2
> -#define HV_X64_MSR_POWER_STATE_TRIGGER_C3 0x400000C3
> -#define HV_X64_MSR_POWER_STATE_CONFIG_C1 0x400000D1
> -#define HV_X64_MSR_POWER_STATE_CONFIG_C2 0x400000D2
> -#define HV_X64_MSR_POWER_STATE_CONFIG_C3 0x400000D3
> -#define HV_X64_MSR_STATS_PARTITION_RETAIL_PAGE 0x400000E0
> -#define HV_X64_MSR_STATS_PARTITION_INTERNAL_PAGE 0x400000E1
> -#define HV_X64_MSR_STATS_VP_RETAIL_PAGE 0x400000E2
> -#define HV_X64_MSR_STATS_VP_INTERNAL_PAGE 0x400000E3
> -#define HV_X64_MSR_GUEST_IDLE 0x400000F0
> -#define HV_X64_MSR_SYNTH_DEBUG_CONTROL 0x400000F1
> -#define HV_X64_MSR_SYNTH_DEBUG_STATUS 0x400000F2
> -#define HV_X64_MSR_SYNTH_DEBUG_SEND_BUFFER 0x400000F3
> -#define HV_X64_MSR_SYNTH_DEBUG_RECEIVE_BUFFER 0x400000F4
> -#define HV_X64_MSR_SYNTH_DEBUG_PENDING_BUFFER 0x400000F5
> -#define HV_X64_MSR_CRASH_P0 0x40000100
> -#define HV_X64_MSR_CRASH_P1 0x40000101
> -#define HV_X64_MSR_CRASH_P2 0x40000102
> -#define HV_X64_MSR_CRASH_P3 0x40000103
> -#define HV_X64_MSR_CRASH_P4 0x40000104
> -#define HV_X64_MSR_CRASH_CTL 0x40000105
> -
> int viridian_synic_wrmsr(struct vcpu *v, uint32_t idx, uint64_t val);
> int viridian_synic_rdmsr(const struct vcpu *v, uint32_t idx, uint64_t
> *val);
>
> diff --git a/xen/arch/x86/hvm/viridian/viridian.c
> b/xen/arch/x86/hvm/viridian/viridian.c
> index 4b06b78a27..341592f054 100644
> --- a/xen/arch/x86/hvm/viridian/viridian.c
> +++ b/xen/arch/x86/hvm/viridian/viridian.c
> @@ -10,6 +10,7 @@
> #include <xen/hypercall.h>
> #include <xen/domain_page.h>
> #include <asm/guest_access.h>
> +#include <asm/guest/hyperv-tlfs.h>
> #include <asm/paging.h>
> #include <asm/p2m.h>
> #include <asm/apic.h>
> @@ -19,22 +20,6 @@
>
> #include "private.h"
>
> -/* Viridian Hypercall Status Codes. */
> -#define HV_STATUS_SUCCESS 0x0000
> -#define HV_STATUS_INVALID_HYPERCALL_CODE 0x0002
> -#define HV_STATUS_INVALID_PARAMETER 0x0005
> -
> -/* Viridian Hypercall Codes. */
> -#define HvFlushVirtualAddressSpace 0x0002
> -#define HvFlushVirtualAddressList 0x0003
> -#define HvNotifyLongSpinWait 0x0008
> -#define HvSendSyntheticClusterIpi 0x000b
> -#define HvGetPartitionId 0x0046
> -#define HvExtCallQueryCapabilities 0x8001
> -
> -/* Viridian Hypercall Flags. */
> -#define HV_FLUSH_ALL_PROCESSORS 1
> -
> /* Viridian Partition Privilege Flags */
> typedef struct {
> /* Access to virtual MSRs */
> @@ -214,7 +199,7 @@ void cpuid_viridian_leaves(const struct vcpu *v,
> uint32_t leaf,
> /*
> * This value is the recommended number of attempts to try to
> * acquire a spinlock before notifying the hypervisor via the
> - * HvNotifyLongSpinWait hypercall.
> + * HVCALL_NOTIFY_LONG_SPIN_WAIT hypercall.
> */
> res->b = viridian_spinlock_retry_count;
> break;
> @@ -583,7 +568,7 @@ int viridian_hypercall(struct cpu_user_regs *regs)
>
> switch ( input.call_code )
> {
> - case HvNotifyLongSpinWait:
> + case HVCALL_NOTIFY_LONG_SPIN_WAIT:
> /*
> * See section 14.5.1 of the specification.
> */
> @@ -591,8 +576,8 @@ int viridian_hypercall(struct cpu_user_regs *regs)
> status = HV_STATUS_SUCCESS;
> break;
>
> - case HvFlushVirtualAddressSpace:
> - case HvFlushVirtualAddressList:
> + case HVCALL_FLUSH_VIRTUAL_ADDRESS_SPACE:
> + case HVCALL_FLUSH_VIRTUAL_ADDRESS_LIST:
> {
> struct {
> uint64_t address_space;
> @@ -632,7 +617,7 @@ int viridian_hypercall(struct cpu_user_regs *regs)
> break;
> }
>
> - case HvSendSyntheticClusterIpi:
> + case HVCALL_SEND_IPI:
> {
> struct vcpu *v;
> uint32_t vector;
> @@ -695,7 +680,7 @@ int viridian_hypercall(struct cpu_user_regs *regs)
> gprintk(XENLOG_WARNING, "unimplemented hypercall %04x\n",
> input.call_code);
> /* Fallthrough. */
> - case HvExtCallQueryCapabilities:
> + case HVCALL_EXT_CALL_QUERY_CAPABILITIES:
> /*
> * This hypercall seems to be erroneously issued by Windows
> * despite EnableExtendedHypercalls not being set in CPUID leaf
> 2.
> diff --git a/xen/include/asm-x86/guest/hyperv-tlfs.h b/xen/include/asm-
> x86/guest/hyperv-tlfs.h
> index ccd9850b27..b128807b2c 100644
> --- a/xen/include/asm-x86/guest/hyperv-tlfs.h
> +++ b/xen/include/asm-x86/guest/hyperv-tlfs.h
> @@ -374,6 +374,7 @@ struct hv_tsc_emulation_status {
> #define HVCALL_SIGNAL_EVENT 0x005d
> #define HVCALL_FLUSH_GUEST_PHYSICAL_ADDRESS_SPACE 0x00af
> #define HVCALL_FLUSH_GUEST_PHYSICAL_ADDRESS_LIST 0x00b0
> +#define HVCALL_EXT_CALL_QUERY_CAPABILITIES 0x8001
>
> #define HV_X64_MSR_VP_ASSIST_PAGE_ENABLE 0x00000001
> #define HV_X64_MSR_VP_ASSIST_PAGE_ADDRESS_SHIFT 12
> --
> 2.20.1
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [Xen-devel] [PATCH 2/4] x86/viridian: drop private copy of HV_REFERENCE_TSC_PAGE in time.c
2019-12-20 19:51 ` [Xen-devel] [PATCH 2/4] x86/viridian: drop private copy of HV_REFERENCE_TSC_PAGE in time.c Wei Liu
@ 2019-12-21 12:20 ` Durrant, Paul
0 siblings, 0 replies; 11+ messages in thread
From: Durrant, Paul @ 2019-12-21 12:20 UTC (permalink / raw)
To: Wei Liu, Xen Development List
Cc: Wei Liu, Paul Durrant, Andrew Cooper, Michael Kelley,
Jan Beulich, Roger Pau Monné
> -----Original Message-----
> From: Wei Liu <wei.liu.xen@gmail.com> On Behalf Of Wei Liu
> Sent: 20 December 2019 19:52
> To: Xen Development List <xen-devel@lists.xenproject.org>
> Cc: Michael Kelley <mikelley@microsoft.com>; Durrant, Paul
> <pdurrant@amazon.com>; Wei Liu <liuwe@microsoft.com>; Paul Durrant
> <paul@xen.org>; Jan Beulich <jbeulich@suse.com>; Andrew Cooper
> <andrew.cooper3@citrix.com>; Wei Liu <wl@xen.org>; Roger Pau Monné
> <roger.pau@citrix.com>
> Subject: [PATCH 2/4] x86/viridian: drop private copy of
> HV_REFERENCE_TSC_PAGE in time.c
>
> Use the one defined in hyperv-tlfs.h instead. No functional change
> intended.
>
> Signed-off-by: Wei Liu <liuwe@microsoft.com>
Reviewed-by: Paul Durrant <paul@xen.org>
> ---
> xen/arch/x86/hvm/viridian/time.c | 20 ++++++--------------
> 1 file changed, 6 insertions(+), 14 deletions(-)
>
> diff --git a/xen/arch/x86/hvm/viridian/time.c
> b/xen/arch/x86/hvm/viridian/time.c
> index 6ddca29b29..32e79bbcc4 100644
> --- a/xen/arch/x86/hvm/viridian/time.c
> +++ b/xen/arch/x86/hvm/viridian/time.c
> @@ -13,19 +13,11 @@
>
> #include <asm/apic.h>
> #include <asm/event.h>
> +#include <asm/guest/hyperv-tlfs.h>
> #include <asm/hvm/support.h>
>
> #include "private.h"
>
> -typedef struct _HV_REFERENCE_TSC_PAGE
> -{
> - uint32_t TscSequence;
> - uint32_t Reserved1;
> - uint64_t TscScale;
> - int64_t TscOffset;
> - uint64_t Reserved2[509];
> -} HV_REFERENCE_TSC_PAGE, *PHV_REFERENCE_TSC_PAGE;
> -
> static void update_reference_tsc(const struct domain *d, bool initialize)
> {
> struct viridian_domain *vd = d->arch.hvm.viridian;
> @@ -61,7 +53,7 @@ static void update_reference_tsc(const struct domain *d,
> bool initialize)
> * violate the spec. and rely on a value of 0 to indicate that
> this
> * enlightenment should no longer be used.
> */
> - p->TscSequence = 0;
> + p->tsc_sequence = 0;
>
> printk(XENLOG_G_INFO "d%d: VIRIDIAN REFERENCE_TSC:
> invalidated\n",
> d->domain_id);
> @@ -79,15 +71,15 @@ static void update_reference_tsc(const struct domain
> *d, bool initialize)
> * The offset value is calculated on restore after migration and
> * ensures that Windows will not see a large jump in ReferenceTime.
> */
> - p->TscScale = ((10000ul << 32) / d->arch.tsc_khz) << 32;
> - p->TscOffset = trc->off;
> + p->tsc_scale = ((10000ul << 32) / d->arch.tsc_khz) << 32;
> + p->tsc_offset = trc->off;
> smp_wmb();
>
> - seq = p->TscSequence + 1;
> + seq = p->tsc_sequence + 1;
> if ( seq == 0xFFFFFFFF || seq == 0 ) /* Avoid both 'invalid' values
> */
> seq = 1;
>
> - p->TscSequence = seq;
> + p->tsc_sequence = seq;
> }
>
> /*
> --
> 2.20.1
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [Xen-devel] [PATCH 3/4] x86: provide and use hv_tsc_scale
2019-12-20 19:51 ` [Xen-devel] [PATCH 3/4] x86: provide and use hv_tsc_scale Wei Liu
@ 2019-12-21 12:27 ` Durrant, Paul
0 siblings, 0 replies; 11+ messages in thread
From: Durrant, Paul @ 2019-12-21 12:27 UTC (permalink / raw)
To: Wei Liu, Xen Development List
Cc: Wei Liu, Paul Durrant, Andrew Cooper, Michael Kelley,
Jan Beulich, Roger Pau Monné
> -----Original Message-----
> From: Wei Liu <wei.liu.xen@gmail.com> On Behalf Of Wei Liu
> Sent: 20 December 2019 19:52
> To: Xen Development List <xen-devel@lists.xenproject.org>
> Cc: Michael Kelley <mikelley@microsoft.com>; Durrant, Paul
> <pdurrant@amazon.com>; Wei Liu <liuwe@microsoft.com>; Paul Durrant
> <paul@xen.org>; Jan Beulich <jbeulich@suse.com>; Andrew Cooper
> <andrew.cooper3@citrix.com>; Wei Liu <wl@xen.org>; Roger Pau Monné
> <roger.pau@citrix.com>
> Subject: [PATCH 3/4] x86: provide and use hv_tsc_scale
>
> The Hyper-V clock source and Xen's own viridian code need the same
> functionality.
>
> Move the function in viridian/time.c to hyperv.h and use it in both
> places.
>
> No functional change.
>
> Signed-off-by: Wei Liu <liuwe@microsoft.com>
Reviewed-by: Paul Durrant <paul@xen.org>
> ---
> xen/arch/x86/hvm/viridian/time.c | 30 ++--------------------------
> xen/arch/x86/time.c | 7 +------
> xen/include/asm-x86/guest/hyperv.h | 32 ++++++++++++++++++++++++++++--
> 3 files changed, 33 insertions(+), 36 deletions(-)
>
> diff --git a/xen/arch/x86/hvm/viridian/time.c
> b/xen/arch/x86/hvm/viridian/time.c
> index 32e79bbcc4..6b2d745f3a 100644
> --- a/xen/arch/x86/hvm/viridian/time.c
> +++ b/xen/arch/x86/hvm/viridian/time.c
> @@ -13,6 +13,7 @@
>
> #include <asm/apic.h>
> #include <asm/event.h>
> +#include <asm/guest/hyperv.h>
> #include <asm/guest/hyperv-tlfs.h>
> #include <asm/hvm/support.h>
>
> @@ -82,33 +83,6 @@ static void update_reference_tsc(const struct domain
> *d, bool initialize)
> p->tsc_sequence = seq;
> }
>
> -/*
> - * The specification says: "The partition reference time is computed
> - * by the following formula:
> - *
> - * ReferenceTime = ((VirtualTsc * TscScale) >> 64) + TscOffset
> - *
> - * The multiplication is a 64 bit multiplication, which results in a
> - * 128 bit number which is then shifted 64 times to the right to obtain
> - * the high 64 bits."
> - */
> -static uint64_t scale_tsc(uint64_t tsc, uint64_t scale, int64_t offset)
> -{
> - uint64_t result;
> -
> - /*
> - * Quadword MUL takes an implicit operand in RAX, and puts the result
> - * in RDX:RAX. Because we only want the result of the multiplication
> - * after shifting right by 64 bits, we therefore only need the
> content
> - * of RDX.
> - */
> - asm ( "mulq %[scale]"
> - : "+a" (tsc), "=d" (result)
> - : [scale] "rm" (scale) );
> -
> - return result + offset;
> -}
> -
> static uint64_t trc_val(const struct domain *d, int64_t offset)
> {
> uint64_t tsc, scale;
> @@ -116,7 +90,7 @@ static uint64_t trc_val(const struct domain *d, int64_t
> offset)
> tsc = hvm_get_guest_tsc(pt_global_vcpu_target(d));
> scale = ((10000ul << 32) / d->arch.tsc_khz) << 32;
>
> - return scale_tsc(tsc, scale, offset);
> + return hv_scale_tsc(tsc, scale, offset);
> }
>
> static void time_ref_count_freeze(const struct domain *d)
> diff --git a/xen/arch/x86/time.c b/xen/arch/x86/time.c
> index bbcc9b10b8..d21875de9e 100644
> --- a/xen/arch/x86/time.c
> +++ b/xen/arch/x86/time.c
> @@ -725,12 +725,7 @@ static inline uint64_t read_hyperv_timer(void)
>
> } while ( tsc_page->tsc_sequence != seq );
>
> - /* ret = ((tsc * scale) >> 64) + offset; */
> - asm ( "mul %[scale]; add %[offset], %[ret]"
> - : "+a" (tsc), [ret] "=&d" (ret)
> - : [scale] "rm" (scale), [offset] "rm" (offset) );
> -
> - return ret;
> + return hv_scale_tsc(tsc, scale, offset);
> }
>
> static struct platform_timesource __initdata plt_hyperv_timer =
> diff --git a/xen/include/asm-x86/guest/hyperv.h b/xen/include/asm-
> x86/guest/hyperv.h
> index cc21b9abfc..c7a7f32bd5 100644
> --- a/xen/include/asm-x86/guest/hyperv.h
> +++ b/xen/include/asm-x86/guest/hyperv.h
> @@ -19,10 +19,38 @@
> #ifndef __X86_GUEST_HYPERV_H__
> #define __X86_GUEST_HYPERV_H__
>
> -#ifdef CONFIG_HYPERV_GUEST
> -
> #include <xen/types.h>
>
> +/*
> + * The specification says: "The partition reference time is computed
> + * by the following formula:
> + *
> + * ReferenceTime = ((VirtualTsc * TscScale) >> 64) + TscOffset
> + *
> + * The multiplication is a 64 bit multiplication, which results in a
> + * 128 bit number which is then shifted 64 times to the right to obtain
> + * the high 64 bits."
> + */
> +static inline uint64_t hv_scale_tsc(uint64_t tsc, uint64_t scale,
> + int64_t offset)
> +{
> + uint64_t result;
> +
> + /*
> + * Quadword MUL takes an implicit operand in RAX, and puts the result
> + * in RDX:RAX. Because we only want the result of the multiplication
> + * after shifting right by 64 bits, we therefore only need the
> content
> + * of RDX.
> + */
> + asm ( "mulq %[scale]"
> + : "+a" (tsc), "=d" (result)
> + : [scale] "rm" (scale) );
> +
> + return result + offset;
> +}
> +
> +#ifdef CONFIG_HYPERV_GUEST
> +
> #include <asm/guest/hypervisor.h>
>
> struct ms_hyperv_info {
> --
> 2.20.1
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [Xen-devel] [PATCH 4/4] x86: move viridian_guest_os_id_msr to hyperv-tlfs.h
2019-12-20 19:51 ` [Xen-devel] [PATCH 4/4] x86: move viridian_guest_os_id_msr to hyperv-tlfs.h Wei Liu
@ 2019-12-21 12:28 ` Durrant, Paul
0 siblings, 0 replies; 11+ messages in thread
From: Durrant, Paul @ 2019-12-21 12:28 UTC (permalink / raw)
To: Wei Liu, Xen Development List
Cc: Wei Liu, Paul Durrant, Andrew Cooper, Michael Kelley,
Jan Beulich, Roger Pau Monné
> -----Original Message-----
> From: Wei Liu <wei.liu.xen@gmail.com> On Behalf Of Wei Liu
> Sent: 20 December 2019 19:52
> To: Xen Development List <xen-devel@lists.xenproject.org>
> Cc: Michael Kelley <mikelley@microsoft.com>; Durrant, Paul
> <pdurrant@amazon.com>; Wei Liu <liuwe@microsoft.com>; Paul Durrant
> <paul@xen.org>; Jan Beulich <jbeulich@suse.com>; Andrew Cooper
> <andrew.cooper3@citrix.com>; Wei Liu <wl@xen.org>; Roger Pau Monné
> <roger.pau@citrix.com>
> Subject: [PATCH 4/4] x86: move viridian_guest_os_id_msr to hyperv-tlfs.h
>
> Suggested-by: Paul Durrant <pdurrant@amazon.com>
> Signed-off-by: Wei Liu <liuwe@microsoft.com>
Reviewed-by: Paul Durrant <paul@xen.org>
> ---
> xen/arch/x86/hvm/viridian/viridian.c | 2 +-
> xen/include/asm-x86/guest/hyperv-tlfs.h | 13 +++++++++++++
> xen/include/asm-x86/hvm/viridian.h | 18 +++---------------
> 3 files changed, 17 insertions(+), 16 deletions(-)
>
> diff --git a/xen/arch/x86/hvm/viridian/viridian.c
> b/xen/arch/x86/hvm/viridian/viridian.c
> index 341592f054..44c8e6cac6 100644
> --- a/xen/arch/x86/hvm/viridian/viridian.c
> +++ b/xen/arch/x86/hvm/viridian/viridian.c
> @@ -218,7 +218,7 @@ void cpuid_viridian_leaves(const struct vcpu *v,
> uint32_t leaf,
>
> static void dump_guest_os_id(const struct domain *d)
> {
> - const union viridian_guest_os_id_msr *goi;
> + const union hv_guest_os_id *goi;
>
> goi = &d->arch.hvm.viridian->guest_os_id;
>
> diff --git a/xen/include/asm-x86/guest/hyperv-tlfs.h b/xen/include/asm-
> x86/guest/hyperv-tlfs.h
> index b128807b2c..4402854c80 100644
> --- a/xen/include/asm-x86/guest/hyperv-tlfs.h
> +++ b/xen/include/asm-x86/guest/hyperv-tlfs.h
> @@ -327,6 +327,19 @@ struct ms_hyperv_tsc_page {
> */
>
> #define HV_LINUX_VENDOR_ID 0x8100
> +union hv_guest_os_id
> +{
> + uint64_t raw;
> + struct
> + {
> + uint64_t build_number:16;
> + uint64_t service_pack:8;
> + uint64_t minor:8;
> + uint64_t major:8;
> + uint64_t os:8;
> + uint64_t vendor:16;
> + };
> +};
>
> struct hv_reenlightenment_control {
> __u64 vector:8;
> diff --git a/xen/include/asm-x86/hvm/viridian.h b/xen/include/asm-
> x86/hvm/viridian.h
> index 010c8b58d4..cfbaede158 100644
> --- a/xen/include/asm-x86/hvm/viridian.h
> +++ b/xen/include/asm-x86/hvm/viridian.h
> @@ -9,6 +9,8 @@
> #ifndef __ASM_X86_HVM_VIRIDIAN_H__
> #define __ASM_X86_HVM_VIRIDIAN_H__
>
> +#include <asm/guest/hyperv-tlfs.h>
> +
> union viridian_page_msr
> {
> uint64_t raw;
> @@ -83,20 +85,6 @@ struct viridian_vcpu
> uint64_t crash_param[5];
> };
>
> -union viridian_guest_os_id_msr
> -{
> - uint64_t raw;
> - struct
> - {
> - uint64_t build_number:16;
> - uint64_t service_pack:8;
> - uint64_t minor:8;
> - uint64_t major:8;
> - uint64_t os:8;
> - uint64_t vendor:16;
> - };
> -};
> -
> struct viridian_time_ref_count
> {
> unsigned long flags;
> @@ -112,7 +100,7 @@ struct viridian_time_ref_count
>
> struct viridian_domain
> {
> - union viridian_guest_os_id_msr guest_os_id;
> + union hv_guest_os_id guest_os_id;
> union viridian_page_msr hypercall_gpa;
> struct viridian_time_ref_count time_ref_count;
> struct viridian_page reference_tsc;
> --
> 2.20.1
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2019-12-21 12:29 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-12-20 19:51 [Xen-devel] [PATCH 0/4] Clean up viridian code Wei Liu
2019-12-20 19:51 ` [Xen-devel] [PATCH 1/4] x86/viridian: drop duplicate defines from private.h and viridian.c Wei Liu
2019-12-21 12:19 ` Durrant, Paul
2019-12-20 19:51 ` [Xen-devel] [PATCH 2/4] x86/viridian: drop private copy of HV_REFERENCE_TSC_PAGE in time.c Wei Liu
2019-12-21 12:20 ` Durrant, Paul
2019-12-20 19:51 ` [Xen-devel] [PATCH 3/4] x86: provide and use hv_tsc_scale Wei Liu
2019-12-21 12:27 ` Durrant, Paul
2019-12-20 19:51 ` [Xen-devel] [PATCH 4/4] x86: move viridian_guest_os_id_msr to hyperv-tlfs.h Wei Liu
2019-12-21 12:28 ` Durrant, Paul
2019-12-20 21:21 ` [Xen-devel] [PATCH 5/4] x86/viridian: drop a wrong invalid value from reference TSC implementation Wei Liu
2019-12-21 12:06 ` Durrant, Paul
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).