xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
* [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).