From: Jan Kiszka <jan.kis...@siemens.com>

Test if we ignore "unconditional I/O exiting" as long as "use I/O
bitmap" is enabled. Also test if unconditional exiting itself works.

Signed-off-by: Jan Kiszka <jan.kis...@siemens.com>
---
 x86/vmx_tests.c | 36 +++++++++++++++++++++++++++++++++++-
 1 file changed, 35 insertions(+), 1 deletion(-)

diff --git a/x86/vmx_tests.c b/x86/vmx_tests.c
index 0077f3f..2c2d6c4 100644
--- a/x86/vmx_tests.c
+++ b/x86/vmx_tests.c
@@ -701,13 +701,21 @@ static void iobmp_main()
                report("I/O bitmap - overrun", 1);
        else
                report("I/O bitmap - overrun", 0);
+       set_stage(9);
+       vmcall();
+       outb(0x0, 0x0);
+       report("I/O bitmap - ignore unconditional exiting", stage == 9);
+       set_stage(10);
+       vmcall();
+       outb(0x0, 0x0);
+       report("I/O bitmap - unconditional exiting", stage == 11);
 }
 
 static int iobmp_exit_handler()
 {
        u64 guest_rip;
        ulong reason, exit_qual;
-       u32 insn_len;
+       u32 insn_len, ctrl_cpu0;
 
        guest_rip = vmcs_read(GUEST_RIP);
        reason = vmcs_read(EXI_REASON) & 0xff;
@@ -765,6 +773,32 @@ static int iobmp_exit_handler()
                        if (((exit_qual & VMX_IO_PORT_MASK) >> 
VMX_IO_PORT_SHIFT) == 0xFFFF)
                                set_stage(stage + 1);
                        break;
+               case 9:
+               case 10:
+                       ctrl_cpu0 = vmcs_read(CPU_EXEC_CTRL0);
+                       vmcs_write(CPU_EXEC_CTRL0, ctrl_cpu0 & ~CPU_IO);
+                       set_stage(stage + 1);
+                       break;
+               default:
+                       // Should not reach here
+                       printf("ERROR : unexpected stage, %d\n", get_stage());
+                       print_vmexit_info();
+                       return VMX_TEST_VMEXIT;
+               }
+               vmcs_write(GUEST_RIP, guest_rip + insn_len);
+               return VMX_TEST_RESUME;
+       case VMX_VMCALL:
+               switch (get_stage()) {
+               case 9:
+                       ctrl_cpu0 = vmcs_read(CPU_EXEC_CTRL0);
+                       ctrl_cpu0 |= CPU_IO | CPU_IO_BITMAP;
+                       vmcs_write(CPU_EXEC_CTRL0, ctrl_cpu0);
+                       break;
+               case 10:
+                       ctrl_cpu0 = vmcs_read(CPU_EXEC_CTRL0);
+                       ctrl_cpu0 = (ctrl_cpu0 & ~CPU_IO_BITMAP) | CPU_IO;
+                       vmcs_write(CPU_EXEC_CTRL0, ctrl_cpu0);
+                       break;
                default:
                        // Should not reach here
                        printf("ERROR : unexpected stage, %d\n", get_stage());
-- 
1.8.1.1.298.ge7eed54

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to