diff mbox

[03/10] x86: vmx: better use of report

Message ID 1418400377-17388-4-git-send-email-drjones@redhat.com (mailing list archive)
State New, archived
Headers show

Commit Message

Andrew Jones Dec. 12, 2014, 4:06 p.m. UTC
Signed-off-by: Andrew Jones <drjones@redhat.com>
---
 x86/vmx_tests.c | 204 ++++++++++++++------------------------------------------
 1 file changed, 49 insertions(+), 155 deletions(-)
diff mbox

Patch

diff --git a/x86/vmx_tests.c b/x86/vmx_tests.c
index 184fafc75f2d0..2630f23d1e33a 100644
--- a/x86/vmx_tests.c
+++ b/x86/vmx_tests.c
@@ -271,13 +271,8 @@  static void test_ctrl_pat_main()
 	wrmsr(MSR_IA32_CR_PAT, 0x6);
 	vmcall();
 	guest_ia32_pat = rdmsr(MSR_IA32_CR_PAT);
-	if (ctrl_enter_rev.clr & ENT_LOAD_PAT) {
-		if (guest_ia32_pat != ia32_pat) {
-			report("Entry load PAT", 0);
-			return;
-		}
-		report("Entry load PAT", 1);
-	}
+	if (ctrl_enter_rev.clr & ENT_LOAD_PAT)
+		report("Entry load PAT", guest_ia32_pat == ia32_pat);
 }
 
 static int test_ctrl_pat_exit_handler()
@@ -295,19 +290,12 @@  static int test_ctrl_pat_exit_handler()
 			printf("\tEXI_SAVE_PAT is not supported\n");
 			vmcs_write(GUEST_PAT, 0x6);
 		} else {
-			if (guest_pat == 0x6)
-				report("Exit save PAT", 1);
-			else
-				report("Exit save PAT", 0);
+			report("Exit save PAT", guest_pat == 0x6);
 		}
 		if (!(ctrl_exit_rev.clr & EXI_LOAD_PAT))
 			printf("\tEXI_LOAD_PAT is not supported\n");
-		else {
-			if (rdmsr(MSR_IA32_CR_PAT) == ia32_pat)
-				report("Exit load PAT", 1);
-			else
-				report("Exit load PAT", 0);
-		}
+		else
+			report("Exit load PAT", rdmsr(MSR_IA32_CR_PAT) == ia32_pat);
 		vmcs_write(GUEST_PAT, ia32_pat);
 		vmcs_write(GUEST_RIP, guest_rip + 3);
 		return VMX_TEST_RESUME;
@@ -350,13 +338,8 @@  static void test_ctrl_efer_main()
 	wrmsr(MSR_EFER, ia32_efer);
 	vmcall();
 	guest_ia32_efer = rdmsr(MSR_EFER);
-	if (ctrl_enter_rev.clr & ENT_LOAD_EFER) {
-		if (guest_ia32_efer != ia32_efer) {
-			report("Entry load EFER", 0);
-			return;
-		}
-		report("Entry load EFER", 1);
-	}
+	if (ctrl_enter_rev.clr & ENT_LOAD_EFER)
+		report("Entry load EFER", guest_ia32_efer == ia32_efer);
 }
 
 static int test_ctrl_efer_exit_handler()
@@ -374,19 +357,13 @@  static int test_ctrl_efer_exit_handler()
 			printf("\tEXI_SAVE_EFER is not supported\n");
 			vmcs_write(GUEST_EFER, ia32_efer);
 		} else {
-			if (guest_efer == ia32_efer)
-				report("Exit save EFER", 1);
-			else
-				report("Exit save EFER", 0);
+			report("Exit save EFER", guest_efer == ia32_efer);
 		}
 		if (!(ctrl_exit_rev.clr & EXI_LOAD_EFER)) {
 			printf("\tEXI_LOAD_EFER is not supported\n");
 			wrmsr(MSR_EFER, ia32_efer ^ EFER_NX);
 		} else {
-			if (rdmsr(MSR_EFER) == (ia32_efer ^ EFER_NX))
-				report("Exit load EFER", 1);
-			else
-				report("Exit load EFER", 0);
+			report("Exit load EFER", rdmsr(MSR_EFER) == (ia32_efer ^ EFER_NX));
 		}
 		vmcs_write(GUEST_PAT, ia32_efer);
 		vmcs_write(GUEST_RIP, guest_rip + 3);
@@ -436,20 +413,12 @@  static void cr_shadowing_main()
 	vmx_set_test_stage(4);
 	vmcall();
 	cr0 = read_cr0();
-	if (vmx_get_test_stage() != 5) {
-		if (cr0 == guest_cr0)
-			report("Read shadowing CR0", 1);
-		else
-			report("Read shadowing CR0", 0);
-	}
+	if (vmx_get_test_stage() != 5)
+		report("Read shadowing CR0", cr0 == guest_cr0);
 	vmx_set_test_stage(5);
 	cr4 = read_cr4();
-	if (vmx_get_test_stage() != 6) {
-		if (cr4 == guest_cr4)
-			report("Read shadowing CR4", 1);
-		else
-			report("Read shadowing CR4", 0);
-	}
+	if (vmx_get_test_stage() != 6)
+		report("Read shadowing CR4", cr4 == guest_cr4);
 	// Test write shadow (same value with shadow)
 	vmx_set_test_stage(6);
 	write_cr0(guest_cr0);
@@ -470,40 +439,28 @@  static void cr_shadowing_main()
 		"mov %%rsi, %%cr0\n\t"
 		::"m"(tmp)
 		:"rsi", "memory", "cc");
-	if (vmx_get_test_stage() != 9)
-		report("Write shadowing different X86_CR0_TS", 0);
-	else
-		report("Write shadowing different X86_CR0_TS", 1);
+	report("Write shadowing different X86_CR0_TS", vmx_get_test_stage() == 9);
 	vmx_set_test_stage(9);
 	tmp = guest_cr0 ^ X86_CR0_MP;
 	asm volatile("mov %0, %%rsi\n\t"
 		"mov %%rsi, %%cr0\n\t"
 		::"m"(tmp)
 		:"rsi", "memory", "cc");
-	if (vmx_get_test_stage() != 10)
-		report("Write shadowing different X86_CR0_MP", 0);
-	else
-		report("Write shadowing different X86_CR0_MP", 1);
+	report("Write shadowing different X86_CR0_MP", vmx_get_test_stage() == 10);
 	vmx_set_test_stage(10);
 	tmp = guest_cr4 ^ X86_CR4_TSD;
 	asm volatile("mov %0, %%rsi\n\t"
 		"mov %%rsi, %%cr4\n\t"
 		::"m"(tmp)
 		:"rsi", "memory", "cc");
-	if (vmx_get_test_stage() != 11)
-		report("Write shadowing different X86_CR4_TSD", 0);
-	else
-		report("Write shadowing different X86_CR4_TSD", 1);
+	report("Write shadowing different X86_CR4_TSD", vmx_get_test_stage() == 11);
 	vmx_set_test_stage(11);
 	tmp = guest_cr4 ^ X86_CR4_DE;
 	asm volatile("mov %0, %%rsi\n\t"
 		"mov %%rsi, %%cr4\n\t"
 		::"m"(tmp)
 		:"rsi", "memory", "cc");
-	if (vmx_get_test_stage() != 12)
-		report("Write shadowing different X86_CR4_DE", 0);
-	else
-		report("Write shadowing different X86_CR4_DE", 1);
+	report("Write shadowing different X86_CR4_DE", vmx_get_test_stage() == 12);
 }
 
 static int cr_shadowing_exit_handler()
@@ -521,28 +478,16 @@  static int cr_shadowing_exit_handler()
 	case VMX_VMCALL:
 		switch (vmx_get_test_stage()) {
 		case 0:
-			if (guest_cr0 == vmcs_read(GUEST_CR0))
-				report("Read through CR0", 1);
-			else
-				report("Read through CR0", 0);
+			report("Read through CR0", guest_cr0 == vmcs_read(GUEST_CR0));
 			break;
 		case 1:
-			if (guest_cr4 == vmcs_read(GUEST_CR4))
-				report("Read through CR4", 1);
-			else
-				report("Read through CR4", 0);
+			report("Read through CR4", guest_cr4 == vmcs_read(GUEST_CR4));
 			break;
 		case 2:
-			if (guest_cr0 == vmcs_read(GUEST_CR0))
-				report("Write through CR0", 1);
-			else
-				report("Write through CR0", 0);
+			report("Write through CR0", guest_cr0 == vmcs_read(GUEST_CR0));
 			break;
 		case 3:
-			if (guest_cr4 == vmcs_read(GUEST_CR4))
-				report("Write through CR4", 1);
-			else
-				report("Write through CR4", 0);
+			report("Write through CR4", guest_cr4 == vmcs_read(GUEST_CR4));
 			break;
 		case 4:
 			guest_cr0 = vmcs_read(GUEST_CR0) ^ (X86_CR0_TS | X86_CR0_MP);
@@ -553,16 +498,12 @@  static int cr_shadowing_exit_handler()
 			vmcs_write(CR4_READ_SHADOW, guest_cr4 & (X86_CR4_TSD | X86_CR4_DE));
 			break;
 		case 6:
-			if (guest_cr0 == (vmcs_read(GUEST_CR0) ^ (X86_CR0_TS | X86_CR0_MP)))
-				report("Write shadowing CR0 (same value)", 1);
-			else
-				report("Write shadowing CR0 (same value)", 0);
+			report("Write shadowing CR0 (same value)",
+					guest_cr0 == (vmcs_read(GUEST_CR0) ^ (X86_CR0_TS | X86_CR0_MP)));
 			break;
 		case 7:
-			if (guest_cr4 == (vmcs_read(GUEST_CR4) ^ (X86_CR4_TSD | X86_CR4_DE)))
-				report("Write shadowing CR4 (same value)", 1);
-			else
-				report("Write shadowing CR4 (same value)", 0);
+			report("Write shadowing CR4 (same value)",
+					guest_cr4 == (vmcs_read(GUEST_CR4) ^ (X86_CR4_TSD | X86_CR4_DE)));
 			break;
 		default:
 			// Should not reach here
@@ -642,59 +583,37 @@  static void iobmp_main()
 	vmx_set_test_stage(0);
 	inb(0x5000);
 	outb(0x0, 0x5000);
-	if (vmx_get_test_stage() != 0)
-		report("I/O bitmap - I/O pass", 0);
-	else
-		report("I/O bitmap - I/O pass", 1);
+	report("I/O bitmap - I/O pass", vmx_get_test_stage() == 0);
 	// test IO width, in/out
 	((u8 *)io_bitmap_a)[0] = 0xFF;
 	vmx_set_test_stage(2);
 	inb(0x0);
-	if (vmx_get_test_stage() != 3)
-		report("I/O bitmap - trap in", 0);
-	else
-		report("I/O bitmap - trap in", 1);
+	report("I/O bitmap - trap in", vmx_get_test_stage() == 3);
 	vmx_set_test_stage(3);
 	outw(0x0, 0x0);
-	if (vmx_get_test_stage() != 4)
-		report("I/O bitmap - trap out", 0);
-	else
-		report("I/O bitmap - trap out", 1);
+	report("I/O bitmap - trap out", vmx_get_test_stage() == 4);
 	vmx_set_test_stage(4);
 	inl(0x0);
-	if (vmx_get_test_stage() != 5)
-		report("I/O bitmap - I/O width, long", 0);
+	report("I/O bitmap - I/O width, long", vmx_get_test_stage() == 5);
 	// test low/high IO port
 	vmx_set_test_stage(5);
 	((u8 *)io_bitmap_a)[0x5000 / 8] = (1 << (0x5000 % 8));
 	inb(0x5000);
-	if (vmx_get_test_stage() == 6)
-		report("I/O bitmap - I/O port, low part", 1);
-	else
-		report("I/O bitmap - I/O port, low part", 0);
+	report("I/O bitmap - I/O port, low part", vmx_get_test_stage() == 6);
 	vmx_set_test_stage(6);
 	((u8 *)io_bitmap_b)[0x1000 / 8] = (1 << (0x1000 % 8));
 	inb(0x9000);
-	if (vmx_get_test_stage() == 7)
-		report("I/O bitmap - I/O port, high part", 1);
-	else
-		report("I/O bitmap - I/O port, high part", 0);
+	report("I/O bitmap - I/O port, high part", vmx_get_test_stage() == 7);
 	// test partial pass
 	vmx_set_test_stage(7);
 	inl(0x4FFF);
-	if (vmx_get_test_stage() == 8)
-		report("I/O bitmap - partial pass", 1);
-	else
-		report("I/O bitmap - partial pass", 0);
+	report("I/O bitmap - partial pass", vmx_get_test_stage() == 8);
 	// test overrun
 	vmx_set_test_stage(8);
 	memset(io_bitmap_a, 0x0, PAGE_SIZE);
 	memset(io_bitmap_b, 0x0, PAGE_SIZE);
 	inl(0xFFFF);
-	if (vmx_get_test_stage() == 9)
-		report("I/O bitmap - overrun", 1);
-	else
-		report("I/O bitmap - overrun", 0);
+	report("I/O bitmap - overrun", vmx_get_test_stage() == 9);
 	vmx_set_test_stage(9);
 	vmcall();
 	outb(0x0, 0x0);
@@ -725,32 +644,21 @@  static int iobmp_exit_handler()
 			vmx_inc_test_stage();
 			break;
 		case 2:
-			if ((exit_qual & VMX_IO_SIZE_MASK) != _VMX_IO_BYTE)
-				report("I/O bitmap - I/O width, byte", 0);
-			else
-				report("I/O bitmap - I/O width, byte", 1);
-			if (!(exit_qual & VMX_IO_IN))
-				report("I/O bitmap - I/O direction, in", 0);
-			else
-				report("I/O bitmap - I/O direction, in", 1);
+			report("I/O bitmap - I/O width, byte",
+					(exit_qual & VMX_IO_SIZE_MASK) == _VMX_IO_BYTE);
+			report("I/O bitmap - I/O direction, in", exit_qual & VMX_IO_IN);
 			vmx_inc_test_stage();
 			break;
 		case 3:
-			if ((exit_qual & VMX_IO_SIZE_MASK) != _VMX_IO_WORD)
-				report("I/O bitmap - I/O width, word", 0);
-			else
-				report("I/O bitmap - I/O width, word", 1);
-			if (!(exit_qual & VMX_IO_IN))
-				report("I/O bitmap - I/O direction, out", 1);
-			else
-				report("I/O bitmap - I/O direction, out", 0);
+			report("I/O bitmap - I/O width, word",
+					(exit_qual & VMX_IO_SIZE_MASK) == _VMX_IO_WORD);
+			report("I/O bitmap - I/O direction, out",
+					!(exit_qual & VMX_IO_IN));
 			vmx_inc_test_stage();
 			break;
 		case 4:
-			if ((exit_qual & VMX_IO_SIZE_MASK) != _VMX_IO_LONG)
-				report("I/O bitmap - I/O width, long", 0);
-			else
-				report("I/O bitmap - I/O width, long", 1);
+			report("I/O bitmap - I/O width, long",
+					(exit_qual & VMX_IO_SIZE_MASK) == _VMX_IO_LONG);
 			vmx_inc_test_stage();
 			break;
 		case 5:
@@ -922,8 +830,6 @@  static int insn_intercept_init()
 
 static void insn_intercept_main()
 {
-	char msg[80];
-
 	for (cur_insn = 0; insn_table[cur_insn].name != NULL; cur_insn++) {
 		vmx_set_test_stage(cur_insn * 2);
 		if ((insn_table[cur_insn].type == INSN_CPU0 &&
@@ -943,9 +849,8 @@  static void insn_intercept_main()
 			/* skip hlt, it stalls the guest and is tested below */
 			if (insn_table[cur_insn].insn_func != insn_hlt)
 				insn_table[cur_insn].insn_func();
-			snprintf(msg, sizeof(msg), "execute %s",
-				 insn_table[cur_insn].name);
-			report(msg, vmx_get_test_stage() == cur_insn * 2);
+			report("execute %s", vmx_get_test_stage() == cur_insn * 2,
+					insn_table[cur_insn].name);
 		} else if (insn_table[cur_insn].type != INSN_ALWAYS_TRAP)
 			printf("\tCPU_CTRL%d.CPU_%s always traps.\n",
 			       insn_table[cur_insn].type - INSN_CPU0,
@@ -954,9 +859,8 @@  static void insn_intercept_main()
 		vmcall();
 
 		insn_table[cur_insn].insn_func();
-		snprintf(msg, sizeof(msg), "intercept %s",
-			 insn_table[cur_insn].name);
-		report(msg, vmx_get_test_stage() == cur_insn * 2 + 1);
+		report("intercept %s", vmx_get_test_stage() == cur_insn * 2 + 1,
+				insn_table[cur_insn].name);
 
 		vmx_set_test_stage(cur_insn * 2 + 1);
 		vmcall();
@@ -1115,28 +1019,18 @@  static void ept_main()
 	vmx_set_test_stage(2);
 	vmcall();
 	*((u32 *)data_page1) = MAGIC_VAL_1;
-	if (vmx_get_test_stage() != 3) {
-		report("EPT misconfigurations", 0);
-		goto t1;
-	}
-	report("EPT misconfigurations", 1);
+	report("EPT misconfigurations", vmx_get_test_stage() == 3);
 t1:
 	// Test EPT violation
 	vmx_set_test_stage(3);
 	vmcall();
 	*((u32 *)data_page1) = MAGIC_VAL_1;
-	if (vmx_get_test_stage() == 4)
-		report("EPT violation - page permission", 1);
-	else
-		report("EPT violation - page permission", 0);
+	report("EPT violation - page permission", vmx_get_test_stage() == 4);
 	// Violation caused by EPT paging structure
 	vmx_set_test_stage(4);
 	vmcall();
 	*((u32 *)data_page1) = MAGIC_VAL_2;
-	if (vmx_get_test_stage() == 5)
-		report("EPT violation - paging structure", 1);
-	else
-		report("EPT violation - paging structure", 0);
+	report("EPT violation - paging structure", vmx_get_test_stage() == 5);
 
 	// Test EPT access to L1 MMIO
 	vmx_set_test_stage(6);