* [PATCH kvm-unit-tests v2] memory: Skip tests for instructions that are absent
@ 2023-04-03 16:44 Paolo Bonzini
2023-04-03 16:53 ` Sean Christopherson
0 siblings, 1 reply; 2+ messages in thread
From: Paolo Bonzini @ 2023-04-03 16:44 UTC (permalink / raw)
To: kvm; +Cc: seanjc, Thomas Huth
Checking that instructions are absent is broken when running with CPU
models other than the bare metal processor's, because neither VMX nor SVM have
intercept controls for the instructions.
This can even happen with "-cpu max" when running under nested
virtualization, which is the current situation in the Fedora KVM job
on Cirrus-CI:
FAIL: clflushopt (ABSENT)
FAIL: clwb (ABSENT)
In other words it looks like the features have been marked as disabled
in the L0 host, while the hardware supports them.
Reported-by: Thomas Huth <thuth@redhat.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
x86/memory.c | 83 +++++++++++++++++++++++++++++++---------------------
1 file changed, 49 insertions(+), 34 deletions(-)
diff --git a/x86/memory.c b/x86/memory.c
index 351e7c0..58ef835 100644
--- a/x86/memory.c
+++ b/x86/memory.c
@@ -25,53 +25,68 @@ static void handle_ud(struct ex_regs *regs)
int main(int ac, char **av)
{
- int expected;
-
handle_exception(UD_VECTOR, handle_ud);
/* 3-byte instructions: */
isize = 3;
- expected = !this_cpu_has(X86_FEATURE_CLFLUSH); /* CLFLUSH */
- ud = 0;
- asm volatile("clflush (%0)" : : "b" (&target));
- report(ud == expected, "clflush (%s)", expected ? "ABSENT" : "present");
+ if (this_cpu_has(X86_FEATURE_CLFLUSH)) { /* CLFLUSH */
+ ud = 0;
+ asm volatile("clflush (%0)" : : "b" (&target));
+ report(!ud, "clflush");
+ } else {
+ report_skip("clflush");
+ }
- expected = !this_cpu_has(X86_FEATURE_XMM); /* SSE */
- ud = 0;
- asm volatile("sfence");
- report(ud == expected, "sfence (%s)", expected ? "ABSENT" : "present");
+ if (this_cpu_has(X86_FEATURE_XMM)) { /* SSE */
+ ud = 0;
+ asm volatile("sfence");
+ report(!ud, "sfence");
+ } else {
+ report_skip("sfence");
+ }
- expected = !this_cpu_has(X86_FEATURE_XMM2); /* SSE2 */
- ud = 0;
- asm volatile("lfence");
- report(ud == expected, "lfence (%s)", expected ? "ABSENT" : "present");
-
- ud = 0;
- asm volatile("mfence");
- report(ud == expected, "mfence (%s)", expected ? "ABSENT" : "present");
+ if (this_cpu_has(X86_FEATURE_XMM2)) { /* SSE2 */
+ ud = 0;
+ asm volatile("lfence");
+ report(!ud, "lfence");
+ ud = 0;
+ asm volatile("mfence");
+ report(!ud, "mfence");
+ } else {
+ report_skip("lfence");
+ report_skip("mfence");
+ }
/* 4-byte instructions: */
isize = 4;
- expected = !this_cpu_has(X86_FEATURE_CLFLUSHOPT); /* CLFLUSHOPT */
- ud = 0;
- /* clflushopt (%rbx): */
- asm volatile(".byte 0x66, 0x0f, 0xae, 0x3b" : : "b" (&target));
- report(ud == expected, "clflushopt (%s)",
- expected ? "ABSENT" : "present");
+ if (this_cpu_has(X86_FEATURE_CLFLUSHOPT)) { /* CLFLUSHOPT */
+ ud = 0;
+ /* clflushopt (%rbx): */
+ asm volatile(".byte 0x66, 0x0f, 0xae, 0x3b" : : "b" (&target));
+ report(!ud, "clflushopt");
+ } else {
+ report_skip("clflushopt");
+ }
- expected = !this_cpu_has(X86_FEATURE_CLWB); /* CLWB */
- ud = 0;
- /* clwb (%rbx): */
- asm volatile(".byte 0x66, 0x0f, 0xae, 0x33" : : "b" (&target));
- report(ud == expected, "clwb (%s)", expected ? "ABSENT" : "present");
+ if (this_cpu_has(X86_FEATURE_CLWB)) { /* CLWB */
+ ud = 0;
+ /* clwb (%rbx): */
+ asm volatile(".byte 0x66, 0x0f, 0xae, 0x33" : : "b" (&target));
+ report(!ud, "clwb");
+ } else {
+ report_skip("clwb");
+ }
- expected = !this_cpu_has(X86_FEATURE_PCOMMIT); /* PCOMMIT */
- ud = 0;
- /* pcommit: */
- asm volatile(".byte 0x66, 0x0f, 0xae, 0xf8");
- report(ud == expected, "pcommit (%s)", expected ? "ABSENT" : "present");
+ if (this_cpu_has(X86_FEATURE_PCOMMIT)) { /* PCOMMIT */
+ ud = 0;
+ /* pcommit: */
+ asm volatile(".byte 0x66, 0x0f, 0xae, 0xf8");
+ report(!ud, "pcommit");
+ } else {
+ report_skip("pcommit");
+ }
return report_summary();
}
--
2.39.2
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH kvm-unit-tests v2] memory: Skip tests for instructions that are absent
2023-04-03 16:44 [PATCH kvm-unit-tests v2] memory: Skip tests for instructions that are absent Paolo Bonzini
@ 2023-04-03 16:53 ` Sean Christopherson
0 siblings, 0 replies; 2+ messages in thread
From: Sean Christopherson @ 2023-04-03 16:53 UTC (permalink / raw)
To: Paolo Bonzini; +Cc: kvm, Thomas Huth
On Mon, Apr 03, 2023, Paolo Bonzini wrote:
> Checking that instructions are absent is broken when running with CPU
> models other than the bare metal processor's, because neither VMX nor SVM have
> intercept controls for the instructions.
>
> This can even happen with "-cpu max" when running under nested
> virtualization, which is the current situation in the Fedora KVM job
> on Cirrus-CI:
>
> FAIL: clflushopt (ABSENT)
> FAIL: clwb (ABSENT)
>
> In other words it looks like the features have been marked as disabled
> in the L0 host, while the hardware supports them.
>
> Reported-by: Thomas Huth <thuth@redhat.com>
> Reviewed-by: Thomas Huth <thuth@redhat.com>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
> x86/memory.c | 83 +++++++++++++++++++++++++++++++---------------------
> 1 file changed, 49 insertions(+), 34 deletions(-)
>
> diff --git a/x86/memory.c b/x86/memory.c
> index 351e7c0..58ef835 100644
> --- a/x86/memory.c
> +++ b/x86/memory.c
> @@ -25,53 +25,68 @@ static void handle_ud(struct ex_regs *regs)
>
> int main(int ac, char **av)
> {
> - int expected;
> -
> handle_exception(UD_VECTOR, handle_ud);
>
> /* 3-byte instructions: */
> isize = 3;
We can clean this up even further by utilizing TRY_ASM(). Though I think this is
a good excuse to add things like asm_safe(), asm_safe_report(), and asm_safe_report_ex(),
to cut down on the boilerplate even more. I'll send patches on top.
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2023-04-03 16:54 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-04-03 16:44 [PATCH kvm-unit-tests v2] memory: Skip tests for instructions that are absent Paolo Bonzini
2023-04-03 16:53 ` Sean Christopherson
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).