diff mbox series

[v3,6/6] KVM: selftests: test KVM_GUESTDBG_BLOCKIRQ

Message ID 20210811122927.900604-7-mlevitsk@redhat.com
State Accepted
Commit 85cc207b8e07df8ee05ee83115c9086aef20a1f5
Headers show
Series None | expand

Commit Message

Maxim Levitsky Aug. 11, 2021, 12:29 p.m. UTC
Modify debug_regs test to create a pending interrupt
and see that it is blocked when single stepping is done
with KVM_GUESTDBG_BLOCKIRQ

Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com>
---
 .../testing/selftests/kvm/x86_64/debug_regs.c | 24 ++++++++++++++++---
 1 file changed, 21 insertions(+), 3 deletions(-)

Comments

Paolo Bonzini Sept. 6, 2021, 11:20 a.m. UTC | #1
On 11/08/21 14:29, Maxim Levitsky wrote:
> Modify debug_regs test to create a pending interrupt

> and see that it is blocked when single stepping is done

> with KVM_GUESTDBG_BLOCKIRQ

> 

> Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com>

> ---

>   .../testing/selftests/kvm/x86_64/debug_regs.c | 24 ++++++++++++++++---

>   1 file changed, 21 insertions(+), 3 deletions(-)


I haven't looked very much at this, but the test fails.

Paolo

> diff --git a/tools/testing/selftests/kvm/x86_64/debug_regs.c b/tools/testing/selftests/kvm/x86_64/debug_regs.c

> index 6097a8283377..5f078db1bcba 100644

> --- a/tools/testing/selftests/kvm/x86_64/debug_regs.c

> +++ b/tools/testing/selftests/kvm/x86_64/debug_regs.c

> @@ -8,12 +8,15 @@

>   #include <string.h>

>   #include "kvm_util.h"

>   #include "processor.h"

> +#include "apic.h"

>   

>   #define VCPU_ID 0

>   

>   #define DR6_BD		(1 << 13)

>   #define DR7_GD		(1 << 13)

>   

> +#define IRQ_VECTOR 0xAA

> +

>   /* For testing data access debug BP */

>   uint32_t guest_value;

>   

> @@ -21,6 +24,11 @@ extern unsigned char sw_bp, hw_bp, write_data, ss_start, bd_start;

>   

>   static void guest_code(void)

>   {

> +	/* Create a pending interrupt on current vCPU */

> +	x2apic_enable();

> +	x2apic_write_reg(APIC_ICR, APIC_DEST_SELF | APIC_INT_ASSERT |

> +			 APIC_DM_FIXED | IRQ_VECTOR);

> +

>   	/*

>   	 * Software BP tests.

>   	 *

> @@ -38,12 +46,19 @@ static void guest_code(void)

>   		     "mov %%rax,%0;\n\t write_data:"

>   		     : "=m" (guest_value) : : "rax");

>   

> -	/* Single step test, covers 2 basic instructions and 2 emulated */

> +	/*

> +	 * Single step test, covers 2 basic instructions and 2 emulated

> +	 *

> +	 * Enable interrupts during the single stepping to see that

> +	 * pending interrupt we raised is not handled due to KVM_GUESTDBG_BLOCKIRQ

> +	 */

>   	asm volatile("ss_start: "

> +		     "sti\n\t"

>   		     "xor %%eax,%%eax\n\t"

>   		     "cpuid\n\t"

>   		     "movl $0x1a0,%%ecx\n\t"

>   		     "rdmsr\n\t"

> +		     "cli\n\t"

>   		     : : : "eax", "ebx", "ecx", "edx");

>   

>   	/* DR6.BD test */

> @@ -72,11 +87,13 @@ int main(void)

>   	uint64_t cmd;

>   	int i;

>   	/* Instruction lengths starting at ss_start */

> -	int ss_size[4] = {

> +	int ss_size[6] = {

> +		1,		/* sti*/

>   		2,		/* xor */

>   		2,		/* cpuid */

>   		5,		/* mov */

>   		2,		/* rdmsr */

> +		1,		/* cli */

>   	};

>   

>   	if (!kvm_check_cap(KVM_CAP_SET_GUEST_DEBUG)) {

> @@ -154,7 +171,8 @@ int main(void)

>   	for (i = 0; i < (sizeof(ss_size) / sizeof(ss_size[0])); i++) {

>   		target_rip += ss_size[i];

>   		CLEAR_DEBUG();

> -		debug.control = KVM_GUESTDBG_ENABLE | KVM_GUESTDBG_SINGLESTEP;

> +		debug.control = KVM_GUESTDBG_ENABLE | KVM_GUESTDBG_SINGLESTEP |

> +				KVM_GUESTDBG_BLOCKIRQ;

>   		debug.arch.debugreg[7] = 0x00000400;

>   		APPLY_DEBUG();

>   		vcpu_run(vm, VCPU_ID);

>
Maxim Levitsky Sept. 6, 2021, 9:03 p.m. UTC | #2
On Mon, 2021-09-06 at 13:20 +0200, Paolo Bonzini wrote:
> On 11/08/21 14:29, Maxim Levitsky wrote:

> > Modify debug_regs test to create a pending interrupt

> > and see that it is blocked when single stepping is done

> > with KVM_GUESTDBG_BLOCKIRQ

> > 

> > Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com>

> > ---

> >   .../testing/selftests/kvm/x86_64/debug_regs.c | 24 ++++++++++++++++---

> >   1 file changed, 21 insertions(+), 3 deletions(-)

> 

> I haven't looked very much at this, but the test fails.


Works for me :-(

[mlevitsk@starship ~/Kernel/master/src/tools/testing/selftests/kvm]$./x86_64/debug_regs 
[mlevitsk@starship ~/Kernel/master/src/tools/testing/selftests/kvm]$echo $?
0


Maybe you run the test on kernel that doesn't support KVM_GUESTDBG_BLOCKIRQ?

Best regards,
	Maxim Levitsky

> 

> Paolo

> 

> > diff --git a/tools/testing/selftests/kvm/x86_64/debug_regs.c b/tools/testing/selftests/kvm/x86_64/debug_regs.c

> > index 6097a8283377..5f078db1bcba 100644

> > --- a/tools/testing/selftests/kvm/x86_64/debug_regs.c

> > +++ b/tools/testing/selftests/kvm/x86_64/debug_regs.c

> > @@ -8,12 +8,15 @@

> >   #include <string.h>

> >   #include "kvm_util.h"

> >   #include "processor.h"

> > +#include "apic.h"

> >   

> >   #define VCPU_ID 0

> >   

> >   #define DR6_BD		(1 << 13)

> >   #define DR7_GD		(1 << 13)

> >   

> > +#define IRQ_VECTOR 0xAA

> > +

> >   /* For testing data access debug BP */

> >   uint32_t guest_value;

> >   

> > @@ -21,6 +24,11 @@ extern unsigned char sw_bp, hw_bp, write_data, ss_start, bd_start;

> >   

> >   static void guest_code(void)

> >   {

> > +	/* Create a pending interrupt on current vCPU */

> > +	x2apic_enable();

> > +	x2apic_write_reg(APIC_ICR, APIC_DEST_SELF | APIC_INT_ASSERT |

> > +			 APIC_DM_FIXED | IRQ_VECTOR);

> > +

> >   	/*

> >   	 * Software BP tests.

> >   	 *

> > @@ -38,12 +46,19 @@ static void guest_code(void)

> >   		     "mov %%rax,%0;\n\t write_data:"

> >   		     : "=m" (guest_value) : : "rax");

> >   

> > -	/* Single step test, covers 2 basic instructions and 2 emulated */

> > +	/*

> > +	 * Single step test, covers 2 basic instructions and 2 emulated

> > +	 *

> > +	 * Enable interrupts during the single stepping to see that

> > +	 * pending interrupt we raised is not handled due to KVM_GUESTDBG_BLOCKIRQ

> > +	 */

> >   	asm volatile("ss_start: "

> > +		     "sti\n\t"

> >   		     "xor %%eax,%%eax\n\t"

> >   		     "cpuid\n\t"

> >   		     "movl $0x1a0,%%ecx\n\t"

> >   		     "rdmsr\n\t"

> > +		     "cli\n\t"

> >   		     : : : "eax", "ebx", "ecx", "edx");

> >   

> >   	/* DR6.BD test */

> > @@ -72,11 +87,13 @@ int main(void)

> >   	uint64_t cmd;

> >   	int i;

> >   	/* Instruction lengths starting at ss_start */

> > -	int ss_size[4] = {

> > +	int ss_size[6] = {

> > +		1,		/* sti*/

> >   		2,		/* xor */

> >   		2,		/* cpuid */

> >   		5,		/* mov */

> >   		2,		/* rdmsr */

> > +		1,		/* cli */

> >   	};

> >   

> >   	if (!kvm_check_cap(KVM_CAP_SET_GUEST_DEBUG)) {

> > @@ -154,7 +171,8 @@ int main(void)

> >   	for (i = 0; i < (sizeof(ss_size) / sizeof(ss_size[0])); i++) {

> >   		target_rip += ss_size[i];

> >   		CLEAR_DEBUG();

> > -		debug.control = KVM_GUESTDBG_ENABLE | KVM_GUESTDBG_SINGLESTEP;

> > +		debug.control = KVM_GUESTDBG_ENABLE | KVM_GUESTDBG_SINGLESTEP |

> > +				KVM_GUESTDBG_BLOCKIRQ;

> >   		debug.arch.debugreg[7] = 0x00000400;

> >   		APPLY_DEBUG();

> >   		vcpu_run(vm, VCPU_ID);

> >
diff mbox series

Patch

diff --git a/tools/testing/selftests/kvm/x86_64/debug_regs.c b/tools/testing/selftests/kvm/x86_64/debug_regs.c
index 6097a8283377..5f078db1bcba 100644
--- a/tools/testing/selftests/kvm/x86_64/debug_regs.c
+++ b/tools/testing/selftests/kvm/x86_64/debug_regs.c
@@ -8,12 +8,15 @@ 
 #include <string.h>
 #include "kvm_util.h"
 #include "processor.h"
+#include "apic.h"
 
 #define VCPU_ID 0
 
 #define DR6_BD		(1 << 13)
 #define DR7_GD		(1 << 13)
 
+#define IRQ_VECTOR 0xAA
+
 /* For testing data access debug BP */
 uint32_t guest_value;
 
@@ -21,6 +24,11 @@  extern unsigned char sw_bp, hw_bp, write_data, ss_start, bd_start;
 
 static void guest_code(void)
 {
+	/* Create a pending interrupt on current vCPU */
+	x2apic_enable();
+	x2apic_write_reg(APIC_ICR, APIC_DEST_SELF | APIC_INT_ASSERT |
+			 APIC_DM_FIXED | IRQ_VECTOR);
+
 	/*
 	 * Software BP tests.
 	 *
@@ -38,12 +46,19 @@  static void guest_code(void)
 		     "mov %%rax,%0;\n\t write_data:"
 		     : "=m" (guest_value) : : "rax");
 
-	/* Single step test, covers 2 basic instructions and 2 emulated */
+	/*
+	 * Single step test, covers 2 basic instructions and 2 emulated
+	 *
+	 * Enable interrupts during the single stepping to see that
+	 * pending interrupt we raised is not handled due to KVM_GUESTDBG_BLOCKIRQ
+	 */
 	asm volatile("ss_start: "
+		     "sti\n\t"
 		     "xor %%eax,%%eax\n\t"
 		     "cpuid\n\t"
 		     "movl $0x1a0,%%ecx\n\t"
 		     "rdmsr\n\t"
+		     "cli\n\t"
 		     : : : "eax", "ebx", "ecx", "edx");
 
 	/* DR6.BD test */
@@ -72,11 +87,13 @@  int main(void)
 	uint64_t cmd;
 	int i;
 	/* Instruction lengths starting at ss_start */
-	int ss_size[4] = {
+	int ss_size[6] = {
+		1,		/* sti*/
 		2,		/* xor */
 		2,		/* cpuid */
 		5,		/* mov */
 		2,		/* rdmsr */
+		1,		/* cli */
 	};
 
 	if (!kvm_check_cap(KVM_CAP_SET_GUEST_DEBUG)) {
@@ -154,7 +171,8 @@  int main(void)
 	for (i = 0; i < (sizeof(ss_size) / sizeof(ss_size[0])); i++) {
 		target_rip += ss_size[i];
 		CLEAR_DEBUG();
-		debug.control = KVM_GUESTDBG_ENABLE | KVM_GUESTDBG_SINGLESTEP;
+		debug.control = KVM_GUESTDBG_ENABLE | KVM_GUESTDBG_SINGLESTEP |
+				KVM_GUESTDBG_BLOCKIRQ;
 		debug.arch.debugreg[7] = 0x00000400;
 		APPLY_DEBUG();
 		vcpu_run(vm, VCPU_ID);