[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [XTF PATCH v2 3/3] vlapic-timer: Testing TSC-deadline timer mode



Signed-off-by: Anthony PERARD <anthony.perard@xxxxxxxxxx>
---
 arch/x86/include/arch/apic.h      |  1 +
 arch/x86/include/arch/cpuid.h     |  1 +
 arch/x86/include/arch/lib.h       |  9 ++++++
 arch/x86/include/arch/msr-index.h |  1 +
 tests/vlapic-timer/main.c         | 67 +++++++++++++++++++++++++++++++++++++++
 5 files changed, 79 insertions(+)

diff --git a/arch/x86/include/arch/apic.h b/arch/x86/include/arch/apic.h
index 0f48df1..b9cf0d7 100644
--- a/arch/x86/include/arch/apic.h
+++ b/arch/x86/include/arch/apic.h
@@ -28,6 +28,7 @@
 #define   APIC_TIMER_MODE_MASK          (0x3<<17)
 #define   APIC_TIMER_MODE_ONESHOT       (0x0<<17)
 #define   APIC_TIMER_MODE_PERIODIC      (0x1<<17)
+#define   APIC_TIMER_MODE_TSC_DEADLINE  (0x2<<17)
 
 #define APIC_TMICT      0x380
 #define APIC_TMCCT      0x390
diff --git a/arch/x86/include/arch/cpuid.h b/arch/x86/include/arch/cpuid.h
index a51a829..ad2443a 100644
--- a/arch/x86/include/arch/cpuid.h
+++ b/arch/x86/include/arch/cpuid.h
@@ -77,6 +77,7 @@ static inline bool cpu_has(unsigned int feature)
 #define cpu_has_smx             cpu_has(X86_FEATURE_SMX)
 #define cpu_has_pcid            cpu_has(X86_FEATURE_PCID)
 #define cpu_has_x2apic          cpu_has(X86_FEATURE_X2APIC)
+#define cpu_has_tsc_deadline    cpu_has(X86_FEATURE_TSC_DEADLINE)
 #define cpu_has_xsave           cpu_has(X86_FEATURE_XSAVE)
 #define cpu_has_avx             cpu_has(X86_FEATURE_AVX)
 
diff --git a/arch/x86/include/arch/lib.h b/arch/x86/include/arch/lib.h
index f608af9..513587d 100644
--- a/arch/x86/include/arch/lib.h
+++ b/arch/x86/include/arch/lib.h
@@ -425,6 +425,15 @@ static inline void write_xcr0(uint64_t xcr0)
     xsetbv(0, xcr0);
 }
 
+static inline uint64_t rdtsc(void)
+{
+    uint32_t lo, hi;
+
+    asm volatile("rdtsc": "=a" (lo), "=d" (hi));
+
+    return (((uint64_t)hi) << 32) | lo;
+}
+
 #endif /* XTF_X86_LIB_H */
 
 /*
diff --git a/arch/x86/include/arch/msr-index.h 
b/arch/x86/include/arch/msr-index.h
index d5cf57f..80d8d4e 100644
--- a/arch/x86/include/arch/msr-index.h
+++ b/arch/x86/include/arch/msr-index.h
@@ -37,6 +37,7 @@
 
 #define MSR_A_PMC(n)                   (0x000004c1 + (n))
 
+#define MSR_TSC_DEADLINE                0x000006e0
 #define MSR_X2APIC_REGS                 0x00000800
 
 #define MSR_EFER                        0xc0000080 /* Extended Feature 
register. */
diff --git a/tests/vlapic-timer/main.c b/tests/vlapic-timer/main.c
index 19f47d7..44e4735 100644
--- a/tests/vlapic-timer/main.c
+++ b/tests/vlapic-timer/main.c
@@ -16,9 +16,22 @@
  */
 #include <xtf.h>
 #include <arch/apic.h>
+#include <arch/msr-index.h>
 
 const char test_title[] = "Test vlapic-timer";
 
+static inline uint64_t rdtscdeadline(void)
+{
+    uint64_t v = 0;
+    rdmsr_safe(MSR_TSC_DEADLINE, &v);
+    return v;
+}
+
+static inline void wrtscdeadline(uint64_t tsc)
+{
+    wrmsr_safe(MSR_TSC_DEADLINE, tsc);
+}
+
 static inline void change_mode(unsigned long new_mode)
 {
     uint32_t lvtt;
@@ -168,6 +181,58 @@ void testing_divide_configuration(void)
         xtf_failure("Fail: TMCCT should not be 0\n");
 }
 
+/*
+ * Testing TSC-Deadline Mode Timer
+ */
+void testing_tsc_deadline_mode(void)
+{
+    uint64_t tsc_diff;
+    uint32_t tmict = 0x19999999;
+
+    if ( !cpu_has_tsc_deadline )
+        return;
+
+    /* find a short time in TSC */
+    change_mode(APIC_TIMER_MODE_ONESHOT);
+    apic_write(APIC_TMICT, tmict);
+    tsc_diff = rdtsc();
+    wait_until_tmcct_is_zero(tmict);
+    tsc_diff = rdtsc() - tsc_diff;
+
+    printk("Testing TSC Deadline Timer\n");
+
+    /* Before changing mode, test writes to TDT */
+    wrtscdeadline(rdtsc() + tsc_diff);
+    if ( rdtscdeadline() )
+        xtf_failure("Fail: TSC Deadline should be 0 when not in TDT mode\n");
+
+    /*
+     * Switching to TSC-Deadline mode should disarm the timer.
+     * Observation show that TMICT also reads 0.
+     */
+    change_mode(APIC_TIMER_MODE_TSC_DEADLINE);
+    if ( apic_read(APIC_TMCCT) )
+        xtf_failure("Fail: TMCCT should be 0\n");
+    if ( apic_read(APIC_TMICT) )
+        xtf_failure("Fail: TMICT should be 0\n");
+
+    /* Testing write to TMICT while in TSC-Deadline mode */
+    apic_write(APIC_TMICT, tmict);
+    if ( apic_read(APIC_TMICT) )
+        xtf_failure("Fail: Write to TMICT should be ignored\n");
+
+    /* Setting the timer */
+    wrtscdeadline(rdtsc() + tsc_diff);
+    if ( !rdtscdeadline() )
+        xtf_failure("Fail: TSC-Deadline should have a value when set\n");
+
+    /* Check that switching to other modes disarm TSC-Deadline timer. */
+    change_mode(APIC_TIMER_MODE_ONESHOT);
+    if ( rdtscdeadline() )
+        xtf_failure("Fail: TSC-Deadline should be disarmed when changing mode"
+                    " TDT -> one-shot\n");
+}
+
 void test_main(void)
 {
     if ( apic_init(APIC_MODE_XAPIC) )
@@ -177,6 +242,8 @@ void test_main(void)
 
     testing_divide_configuration();
 
+    testing_tsc_deadline_mode();
+
     xtf_success(NULL);
 }
 
-- 
Anthony PERARD


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.