* [PATCH kvm-unit-tests] x86: add tests for MSR_IA32_TSX_CTRL
@ 2019-11-18 17:28 Paolo Bonzini
2019-11-20 18:13 ` Jim Mattson
0 siblings, 1 reply; 6+ messages in thread
From: Paolo Bonzini @ 2019-11-18 17:28 UTC (permalink / raw)
To: kvm
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
lib/x86/msr.h | 14 +++++++++++++
lib/x86/processor.h | 2 ++
x86/Makefile.common | 2 +-
x86/tsx-ctrl.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++
x86/vmexit.c | 12 +++++++++++
5 files changed, 89 insertions(+), 1 deletion(-)
create mode 100644 x86/tsx-ctrl.c
diff --git a/lib/x86/msr.h b/lib/x86/msr.h
index abf0d93..8dca964 100644
--- a/lib/x86/msr.h
+++ b/lib/x86/msr.h
@@ -221,6 +221,20 @@
#define MSR_IA32_UCODE_WRITE 0x00000079
#define MSR_IA32_UCODE_REV 0x0000008b
+#define MSR_IA32_ARCH_CAPABILITIES 0x0000010a
+#define ARCH_CAP_RDCL_NO (1ULL << 0)
+#define ARCH_CAP_IBRS_ALL (1ULL << 1)
+#define ARCH_CAP_SKIP_VMENTRY_L1DFLUSH (1ULL << 3)
+#define ARCH_CAP_SSB_NO (1ULL << 4)
+#define ARCH_CAP_MDS_NO (1ULL << 5)
+#define ARCH_CAP_PSCHANGE_MC_NO (1ULL << 6)
+#define ARCH_CAP_TSX_CTRL_MSR (1ULL << 7)
+#define ARCH_CAP_TAA_NO (1ULL << 8)
+
+#define MSR_IA32_TSX_CTRL 0x00000122
+#define TSX_CTRL_RTM_DISABLE (1ULL << 0)
+#define TSX_CTRL_CPUID_CLEAR (1ULL << 1)
+
#define MSR_IA32_PERF_STATUS 0x00000198
#define MSR_IA32_PERF_CTL 0x00000199
diff --git a/lib/x86/processor.h b/lib/x86/processor.h
index 3f461dc..7057180 100644
--- a/lib/x86/processor.h
+++ b/lib/x86/processor.h
@@ -137,6 +137,7 @@ static inline u8 cpuid_maxphyaddr(void)
#define X86_FEATURE_XMM (CPUID(0x1, 0, EDX, 25))
#define X86_FEATURE_XMM2 (CPUID(0x1, 0, EDX, 26))
#define X86_FEATURE_TSC_ADJUST (CPUID(0x7, 0, EBX, 1))
+#define X86_FEATURE_HLE (CPUID(0x7, 0, EBX, 4))
#define X86_FEATURE_INVPCID_SINGLE (CPUID(0x7, 0, EBX, 7))
#define X86_FEATURE_INVPCID (CPUID(0x7, 0, EBX, 10))
#define X86_FEATURE_RTM (CPUID(0x7, 0, EBX, 11))
@@ -149,6 +150,7 @@ static inline u8 cpuid_maxphyaddr(void)
#define X86_FEATURE_LA57 (CPUID(0x7, 0, ECX, 16))
#define X86_FEATURE_RDPID (CPUID(0x7, 0, ECX, 22))
#define X86_FEATURE_SPEC_CTRL (CPUID(0x7, 0, EDX, 26))
+#define X86_FEATURE_ARCH_CAPABILITIES (CPUID(0x7, 0, EDX, 29))
#define X86_FEATURE_NX (CPUID(0x80000001, 0, EDX, 20))
#define X86_FEATURE_RDPRU (CPUID(0x80000008, 0, EBX, 4))
diff --git a/x86/Makefile.common b/x86/Makefile.common
index e612dbe..b157154 100644
--- a/x86/Makefile.common
+++ b/x86/Makefile.common
@@ -58,7 +58,7 @@ tests-common = $(TEST_DIR)/vmexit.flat $(TEST_DIR)/tsc.flat \
$(TEST_DIR)/init.flat $(TEST_DIR)/smap.flat \
$(TEST_DIR)/hyperv_synic.flat $(TEST_DIR)/hyperv_stimer.flat \
$(TEST_DIR)/hyperv_connections.flat \
- $(TEST_DIR)/umip.flat
+ $(TEST_DIR)/umip.flat $(TEST_DIR)/tsx-ctrl.flat
ifdef API
tests-api = api/api-sample api/dirty-log api/dirty-log-perf
diff --git a/x86/tsx-ctrl.c b/x86/tsx-ctrl.c
new file mode 100644
index 0000000..f482cb5
--- /dev/null
+++ b/x86/tsx-ctrl.c
@@ -0,0 +1,60 @@
+/* TSX tests */
+
+#include "libcflat.h"
+#include "processor.h"
+#include "msr.h"
+
+static bool try_transaction(void)
+{
+ unsigned x;
+ int i;
+
+ for (i = 0; i < 100; i++) {
+ x = 0;
+ /*
+ * The value before the transaction is important, so make the
+ * operand input/output.
+ */
+ asm volatile("xbegin 2f; movb $1, %0; xend; 2:" : "+m" (x) : : "eax");
+ if (x) {
+ return true;
+ }
+ }
+ return false;
+}
+
+int main(int ac, char **av)
+{
+ if (!this_cpu_has(X86_FEATURE_RTM)) {
+ report_skip("TSX not available");
+ return 0;
+ }
+ if (!this_cpu_has(X86_FEATURE_ARCH_CAPABILITIES)) {
+ report_skip("ARCH_CAPABILITIES not available");
+ return 0;
+ }
+ if (!(rdmsr(MSR_IA32_ARCH_CAPABILITIES) & ARCH_CAP_TSX_CTRL_MSR)) {
+ report_skip("TSX_CTRL not available");
+ return 0;
+ }
+
+ report("TSX_CTRL should be 0", rdmsr(MSR_IA32_TSX_CTRL) == 0);
+ report("Transactions do not abort", try_transaction());
+
+ wrmsr(MSR_IA32_TSX_CTRL, TSX_CTRL_CPUID_CLEAR);
+ report("TSX_CTRL hides RTM", !this_cpu_has(X86_FEATURE_RTM));
+ report("TSX_CTRL hides HLE", !this_cpu_has(X86_FEATURE_HLE));
+
+ /* Microcode might hide HLE unconditionally */
+ wrmsr(MSR_IA32_TSX_CTRL, 0);
+ report("TSX_CTRL=0 unhides RTM", this_cpu_has(X86_FEATURE_RTM));
+
+ wrmsr(MSR_IA32_TSX_CTRL, TSX_CTRL_RTM_DISABLE);
+ report("TSX_CTRL causes transactions to abort", !try_transaction());
+
+ wrmsr(MSR_IA32_TSX_CTRL, 0);
+ report("TSX_CTRL=0 causes transactions to succeed", try_transaction());
+
+ return report_summary();
+}
+
diff --git a/x86/vmexit.c b/x86/vmexit.c
index 81b743b..acdcbdc 100644
--- a/x86/vmexit.c
+++ b/x86/vmexit.c
@@ -434,6 +434,17 @@ static void tscdeadline(void)
while (x == 0) barrier();
}
+static void wr_tsx_ctrl_msr(void)
+{
+ wrmsr(MSR_IA32_TSX_CTRL, 0);
+}
+
+static int has_tsx_ctrl(void)
+{
+ return this_cpu_has(X86_FEATURE_ARCH_CAPABILITIES)
+ && (rdmsr(MSR_IA32_ARCH_CAPABILITIES) & ARCH_CAP_TSX_CTRL_MSR);
+}
+
static void wr_ibrs_msr(void)
{
wrmsr(MSR_IA32_SPEC_CTRL, 1);
@@ -478,6 +489,7 @@ static struct test tests[] = {
{ ipi_halt, "ipi_halt", is_smp, .parallel = 0, },
{ ple_round_robin, "ple_round_robin", .parallel = 1 },
{ wr_kernel_gs_base, "wr_kernel_gs_base", .parallel = 1 },
+ { wr_tsx_ctrl_msr, "wr_tsx_ctrl_msr", has_tsx_ctrl, .parallel = 1, },
{ wr_ibrs_msr, "wr_ibrs_msr", has_spec_ctrl, .parallel = 1 },
{ wr_ibpb_msr, "wr_ibpb_msr", has_ibpb, .parallel = 1 },
{ wr_tsc_adjust_msr, "wr_tsc_adjust_msr", .parallel = 1 },
--
1.8.3.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH kvm-unit-tests] x86: add tests for MSR_IA32_TSX_CTRL
2019-11-18 17:28 [PATCH kvm-unit-tests] x86: add tests for MSR_IA32_TSX_CTRL Paolo Bonzini
@ 2019-11-20 18:13 ` Jim Mattson
2019-11-20 18:43 ` Paolo Bonzini
0 siblings, 1 reply; 6+ messages in thread
From: Jim Mattson @ 2019-11-20 18:13 UTC (permalink / raw)
To: Paolo Bonzini; +Cc: kvm list
On Mon, Nov 18, 2019 at 9:29 AM Paolo Bonzini <pbonzini@redhat.com> wrote:
>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
I had to add tsx-ctrl to x86/unittests.cfg:
+[tsx-ctrl]
+file = tsx-ctrl.flat
+extra_params = -cpu host
+groups = tsx-ctrl
+
With qemu 4.1, I get:
timeout -k 1s --foreground 90s /root/kvm-unit-tests/deps/qemu.sh
-nodefaults -device pc-testdev -device
isa-debug-exit,iobase=0xf4,iosize=0x4 -vnc none -serial stdio -device
pci-testdev -machine accel=kvm -kernel x86/tsx-ctrl.flat -smp 1 -cpu
host # -initrd /tmp/tmp.7wOLppNO4W
enabling apic
SKIP: TSX_CTRL not available
Maybe qemu is masking off ARCH_CAP_TSX_CTRL_MSR? I haven't investigated.
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH kvm-unit-tests] x86: add tests for MSR_IA32_TSX_CTRL
2019-11-20 18:13 ` Jim Mattson
@ 2019-11-20 18:43 ` Paolo Bonzini
2019-11-20 22:16 ` Jim Mattson
0 siblings, 1 reply; 6+ messages in thread
From: Paolo Bonzini @ 2019-11-20 18:43 UTC (permalink / raw)
To: Jim Mattson; +Cc: kvm list
On 20/11/19 19:13, Jim Mattson wrote:
> On Mon, Nov 18, 2019 at 9:29 AM Paolo Bonzini <pbonzini@redhat.com> wrote:
>>
>> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
>
> I had to add tsx-ctrl to x86/unittests.cfg:
>
> +[tsx-ctrl]
> +file = tsx-ctrl.flat
> +extra_params = -cpu host
> +groups = tsx-ctrl
> +
>
> With qemu 4.1, I get:
>
> timeout -k 1s --foreground 90s /root/kvm-unit-tests/deps/qemu.sh
> -nodefaults -device pc-testdev -device
> isa-debug-exit,iobase=0xf4,iosize=0x4 -vnc none -serial stdio -device
> pci-testdev -machine accel=kvm -kernel x86/tsx-ctrl.flat -smp 1 -cpu
> host # -initrd /tmp/tmp.7wOLppNO4W
> enabling apic
> SKIP: TSX_CTRL not available
>
> Maybe qemu is masking off ARCH_CAP_TSX_CTRL_MSR? I haven't investigated.
Yes, you need "-cpu host,migratable=off" if you don't have the
corresponding QEMU patches (which I've only sent today, but just
allowing unmigratable features in extra_params will be okay for you to
test).
Paolo
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH kvm-unit-tests] x86: add tests for MSR_IA32_TSX_CTRL
2019-11-20 18:43 ` Paolo Bonzini
@ 2019-11-20 22:16 ` Jim Mattson
2019-11-20 22:17 ` Paolo Bonzini
0 siblings, 1 reply; 6+ messages in thread
From: Jim Mattson @ 2019-11-20 22:16 UTC (permalink / raw)
To: Paolo Bonzini; +Cc: kvm list
On Wed, Nov 20, 2019 at 10:43 AM Paolo Bonzini <pbonzini@redhat.com> wrote:
>
> On 20/11/19 19:13, Jim Mattson wrote:
> > On Mon, Nov 18, 2019 at 9:29 AM Paolo Bonzini <pbonzini@redhat.com> wrote:
> >>
> >> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> >
> > I had to add tsx-ctrl to x86/unittests.cfg:
> >
> > +[tsx-ctrl]
> > +file = tsx-ctrl.flat
> > +extra_params = -cpu host
> > +groups = tsx-ctrl
> > +
> >
> > With qemu 4.1, I get:
> >
> > timeout -k 1s --foreground 90s /root/kvm-unit-tests/deps/qemu.sh
> > -nodefaults -device pc-testdev -device
> > isa-debug-exit,iobase=0xf4,iosize=0x4 -vnc none -serial stdio -device
> > pci-testdev -machine accel=kvm -kernel x86/tsx-ctrl.flat -smp 1 -cpu
> > host # -initrd /tmp/tmp.7wOLppNO4W
> > enabling apic
> > SKIP: TSX_CTRL not available
> >
> > Maybe qemu is masking off ARCH_CAP_TSX_CTRL_MSR? I haven't investigated.
>
> Yes, you need "-cpu host,migratable=off" if you don't have the
> corresponding QEMU patches (which I've only sent today, but just
> allowing unmigratable features in extra_params will be okay for you to
> test).
Okay, that works!
enabling apic
PASS: TSX_CTRL should be 0
PASS: Transactions do not abort
PASS: TSX_CTRL hides RTM
PASS: TSX_CTRL hides HLE
PASS: TSX_CTRL=0 unhides RTM
PASS: TSX_CTRL causes transactions to abort
PASS: TSX_CTRL=0 causes transactions to succeed
SUMMARY: 7 tests
...and, for the vmexit test...
enabling apic
paging enabled
cr0 = 80010011
cr3 = 61e000
cr4 = 20
pci-testdev at 0x10 membar febff000 iobar c000
wr_tsx_ctrl_msr 2058
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH kvm-unit-tests] x86: add tests for MSR_IA32_TSX_CTRL
2019-11-20 22:16 ` Jim Mattson
@ 2019-11-20 22:17 ` Paolo Bonzini
2019-11-20 22:21 ` Jim Mattson
0 siblings, 1 reply; 6+ messages in thread
From: Paolo Bonzini @ 2019-11-20 22:17 UTC (permalink / raw)
To: Jim Mattson; +Cc: kvm list
On 20/11/19 23:16, Jim Mattson wrote:
> On Wed, Nov 20, 2019 at 10:43 AM Paolo Bonzini <pbonzini@redhat.com> wrote:
>>
>> On 20/11/19 19:13, Jim Mattson wrote:
>>> On Mon, Nov 18, 2019 at 9:29 AM Paolo Bonzini <pbonzini@redhat.com> wrote:
>>>>
>>>> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
>>>
>>> I had to add tsx-ctrl to x86/unittests.cfg:
>>>
>>> +[tsx-ctrl]
>>> +file = tsx-ctrl.flat
>>> +extra_params = -cpu host
>>> +groups = tsx-ctrl
>>> +
>>>
>>> With qemu 4.1, I get:
>>>
>>> timeout -k 1s --foreground 90s /root/kvm-unit-tests/deps/qemu.sh
>>> -nodefaults -device pc-testdev -device
>>> isa-debug-exit,iobase=0xf4,iosize=0x4 -vnc none -serial stdio -device
>>> pci-testdev -machine accel=kvm -kernel x86/tsx-ctrl.flat -smp 1 -cpu
>>> host # -initrd /tmp/tmp.7wOLppNO4W
>>> enabling apic
>>> SKIP: TSX_CTRL not available
>>>
>>> Maybe qemu is masking off ARCH_CAP_TSX_CTRL_MSR? I haven't investigated.
>>
>> Yes, you need "-cpu host,migratable=off" if you don't have the
>> corresponding QEMU patches (which I've only sent today, but just
>> allowing unmigratable features in extra_params will be okay for you to
>> test).
>
> Okay, that works!
>
> enabling apic
> PASS: TSX_CTRL should be 0
> PASS: Transactions do not abort
> PASS: TSX_CTRL hides RTM
> PASS: TSX_CTRL hides HLE
> PASS: TSX_CTRL=0 unhides RTM
> PASS: TSX_CTRL causes transactions to abort
> PASS: TSX_CTRL=0 causes transactions to succeed
> SUMMARY: 7 tests
Great, should I merge the patches in 5.5 with your Tested-by annotation?
Paolo
> ...and, for the vmexit test...
>
> enabling apic
> paging enabled
> cr0 = 80010011
> cr3 = 61e000
> cr4 = 20
> pci-testdev at 0x10 membar febff000 iobar c000
> wr_tsx_ctrl_msr 2058
>
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH kvm-unit-tests] x86: add tests for MSR_IA32_TSX_CTRL
2019-11-20 22:17 ` Paolo Bonzini
@ 2019-11-20 22:21 ` Jim Mattson
0 siblings, 0 replies; 6+ messages in thread
From: Jim Mattson @ 2019-11-20 22:21 UTC (permalink / raw)
To: Paolo Bonzini; +Cc: kvm list
On Wed, Nov 20, 2019 at 2:17 PM Paolo Bonzini <pbonzini@redhat.com> wrote:
>
> On 20/11/19 23:16, Jim Mattson wrote:
> > On Wed, Nov 20, 2019 at 10:43 AM Paolo Bonzini <pbonzini@redhat.com> wrote:
> >>
> >> On 20/11/19 19:13, Jim Mattson wrote:
> >>> On Mon, Nov 18, 2019 at 9:29 AM Paolo Bonzini <pbonzini@redhat.com> wrote:
> >>>>
> >>>> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> >>>
> >>> I had to add tsx-ctrl to x86/unittests.cfg:
> >>>
> >>> +[tsx-ctrl]
> >>> +file = tsx-ctrl.flat
> >>> +extra_params = -cpu host
> >>> +groups = tsx-ctrl
> >>> +
> >>>
> >>> With qemu 4.1, I get:
> >>>
> >>> timeout -k 1s --foreground 90s /root/kvm-unit-tests/deps/qemu.sh
> >>> -nodefaults -device pc-testdev -device
> >>> isa-debug-exit,iobase=0xf4,iosize=0x4 -vnc none -serial stdio -device
> >>> pci-testdev -machine accel=kvm -kernel x86/tsx-ctrl.flat -smp 1 -cpu
> >>> host # -initrd /tmp/tmp.7wOLppNO4W
> >>> enabling apic
> >>> SKIP: TSX_CTRL not available
> >>>
> >>> Maybe qemu is masking off ARCH_CAP_TSX_CTRL_MSR? I haven't investigated.
> >>
> >> Yes, you need "-cpu host,migratable=off" if you don't have the
> >> corresponding QEMU patches (which I've only sent today, but just
> >> allowing unmigratable features in extra_params will be okay for you to
> >> test).
> >
> > Okay, that works!
> >
> > enabling apic
> > PASS: TSX_CTRL should be 0
> > PASS: Transactions do not abort
> > PASS: TSX_CTRL hides RTM
> > PASS: TSX_CTRL hides HLE
> > PASS: TSX_CTRL=0 unhides RTM
> > PASS: TSX_CTRL causes transactions to abort
> > PASS: TSX_CTRL=0 causes transactions to succeed
> > SUMMARY: 7 tests
>
> Great, should I merge the patches in 5.5 with your Tested-by annotation?
Please do.
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2019-11-20 22:21 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-11-18 17:28 [PATCH kvm-unit-tests] x86: add tests for MSR_IA32_TSX_CTRL Paolo Bonzini
2019-11-20 18:13 ` Jim Mattson
2019-11-20 18:43 ` Paolo Bonzini
2019-11-20 22:16 ` Jim Mattson
2019-11-20 22:17 ` Paolo Bonzini
2019-11-20 22:21 ` Jim Mattson
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.