|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH] XTF: tests SPEC_CTRL added bits
Dummy set/clear tests for additional spec_ctrl bits.
---
docs/all-tests.dox | 2 +
tests/test/Makefile | 9 ++++
tests/test/main.c | 100 ++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 111 insertions(+)
create mode 100644 tests/test/Makefile
create mode 100644 tests/test/main.c
diff --git a/docs/all-tests.dox b/docs/all-tests.dox
index 892a9e474743..5a66ac252ea5 100644
--- a/docs/all-tests.dox
+++ b/docs/all-tests.dox
@@ -187,3 +187,5 @@ states.
@subpage test-nested-vmx - Nested VT-x tests.
*/
+# Placeholder: Merge into the appropriate location above
+@subpage test-test - @todo title
diff --git a/tests/test/Makefile b/tests/test/Makefile
new file mode 100644
index 000000000000..19bc4b6a4639
--- /dev/null
+++ b/tests/test/Makefile
@@ -0,0 +1,9 @@
+include $(ROOT)/build/common.mk
+
+NAME := test
+CATEGORY := utility
+TEST-ENVS := hvm32 pv64
+
+obj-perenv += main.o
+
+include $(ROOT)/build/gen.mk
diff --git a/tests/test/main.c b/tests/test/main.c
new file mode 100644
index 000000000000..9a25e95d91b7
--- /dev/null
+++ b/tests/test/main.c
@@ -0,0 +1,100 @@
+/**
+ * @file tests/test/main.c
+ * @ref test-test
+ *
+ * @page test-test test
+ *
+ * @todo Docs for test-test
+ *
+ * @see tests/test/main.c
+ */
+#include <xtf.h>
+
+#define MSR_SPEC_CTRL 0x00000048
+#define SPEC_CTRL_IPRED_DIS_U (_AC(1, ULL) << 3)
+#define SPEC_CTRL_IPRED_DIS_S (_AC(1, ULL) << 4)
+#define SPEC_CTRL_RRSBA_DIS_U (_AC(1, ULL) << 5)
+#define SPEC_CTRL_RRSBA_DIS_S (_AC(1, ULL) << 6)
+#define SPEC_CTRL_DDP_DIS_U (_AC(1, ULL) << 8)
+#define SPEC_CTRL_BHI_DIS_S (_AC(1, ULL) << 10)
+
+const char test_title[] = "SPEC_CTRL";
+
+static void update_spec_ctrl(uint64_t mask, bool set)
+{
+ uint64_t spec_ctrl = rdmsr(MSR_SPEC_CTRL);
+
+ if ( set )
+ spec_ctrl |= mask;
+ else
+ spec_ctrl &= ~mask;
+
+ wrmsr(MSR_SPEC_CTRL, spec_ctrl);
+}
+
+static void assert_spec_ctrl(uint64_t mask, bool set)
+{
+ uint64_t spec_ctrl = rdmsr(MSR_SPEC_CTRL);
+
+ if ( (spec_ctrl & mask) != (set ? mask : 0) )
+ {
+ xtf_failure("SPEC_CTRL expected: %#" PRIx64 " got: %#" PRIx64 "\n",
+ set ? (spec_ctrl | mask) : (spec_ctrl & ~mask),
+ spec_ctrl);
+ xtf_exit();
+ }
+}
+
+static void test_loop(uint64_t mask)
+{
+ update_spec_ctrl(mask, true);
+ assert_spec_ctrl(mask, true);
+ /* Ensure context switch to Xen. */
+ hypercall_yield();
+ assert_spec_ctrl(mask, true);
+
+ update_spec_ctrl(mask, false);
+ assert_spec_ctrl(mask, false);
+ /* Ensure context switch to Xen. */
+ hypercall_yield();
+ assert_spec_ctrl(mask, false);
+}
+
+void test_main(void)
+{
+ static const struct {
+ const char *name;
+ unsigned int feat;
+ uint64_t mask;
+ } tests[] = {
+ { "IPRED CTRL", 1, SPEC_CTRL_IPRED_DIS_U | SPEC_CTRL_IPRED_DIS_S },
+ { "RRSBA CTRL", 2, SPEC_CTRL_RRSBA_DIS_U | SPEC_CTRL_RRSBA_DIS_S },
+ { "DDP DIS", 3, SPEC_CTRL_DDP_DIS_U },
+ { "BHI DIS", 4, SPEC_CTRL_BHI_DIS_S },
+ };
+ unsigned int i;
+ uint32_t regs[4];
+
+ cpuid_count(7, 2, ®s[0], ®s[1], ®s[2], ®s[3]);
+
+ for ( i = 0; i < ARRAY_SIZE(tests); i++ )
+ {
+ if ( !test_bit(tests[i].feat, ®s[3]) )
+ continue;
+
+ printk("Testing %s\n", tests[i].name);
+ test_loop(tests[i].mask);
+ }
+
+ xtf_success(NULL);
+}
+
+/*
+ * Local variables:
+ * mode: C
+ * c-file-style: "BSD"
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
--
2.43.0
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |