* [PATCH kvm-unit-tests 00/10] report is nice, use it more
@ 2014-12-12 16:06 Andrew Jones
2014-12-12 16:06 ` [PATCH 01/10] x86: hypercall: add missing report_summary Andrew Jones
` (10 more replies)
0 siblings, 11 replies; 15+ messages in thread
From: Andrew Jones @ 2014-12-12 16:06 UTC (permalink / raw)
To: kvm
This series applies report() to more x86 unit tests. It also
cleans up some uses of it in vmx_tests. Finally, it also
introduces report prefix support, and applies that a few places.
There should be no functional changes with this series, except of
course the output formatting (which makes the churn debatable).
Anyway, I believe this series helps us to start converging on a
"standard" output format for all unit tests.
I'm afraid I didn't test all the changes, as not all unit tests
could run on my test machine.
svm - didn't run
xsave - didn't run 'have xsave' tests
asyncpf - is commented out of unittests.cfg,
and I didn't uncomment it out
pmu - didn't run
(I probably should add a bunch of kvm-unit-tests contributors to
the CC in order to alert them that I'm touching their unit tests,
but I don't think this series warrants all the git blaming, so
I'm not adding anybody at all :-)
Andrew Jones (10):
x86: hypercall: add missing report_summary
x86: pmu: report takes a fmt
x86: vmx: better use of report
x86: tsc_adjust: use report
x86: svm: use report
x86: asyncpf: use report
x86: xsave: use report
report: add prefix support
x86: use report prefixes
arm: use report prefixes
arm/selftest.c | 31 ++++-----
lib/libcflat.h | 2 +
lib/report.c | 22 ++++++
lib/string.c | 17 +++++
lib/string.h | 1 +
x86/apic.c | 8 ++-
x86/asyncpf.c | 15 ++--
x86/hypercall.c | 2 +-
x86/pmu.c | 28 +++++---
x86/svm.c | 25 +++----
x86/tsc_adjust.c | 44 ++++--------
x86/vmx_tests.c | 204 +++++++++++++------------------------------------------
x86/xsave.c | 150 +++++++++++++++-------------------------
13 files changed, 210 insertions(+), 339 deletions(-)
--
1.9.3
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH 01/10] x86: hypercall: add missing report_summary
2014-12-12 16:06 [PATCH kvm-unit-tests 00/10] report is nice, use it more Andrew Jones
@ 2014-12-12 16:06 ` Andrew Jones
2014-12-12 16:06 ` [PATCH 02/10] x86: pmu: report takes a fmt Andrew Jones
` (9 subsequent siblings)
10 siblings, 0 replies; 15+ messages in thread
From: Andrew Jones @ 2014-12-12 16:06 UTC (permalink / raw)
To: kvm
Signed-off-by: Andrew Jones <drjones@redhat.com>
---
x86/hypercall.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/x86/hypercall.c b/x86/hypercall.c
index 0c9cccf09a169..1548421c840bf 100644
--- a/x86/hypercall.c
+++ b/x86/hypercall.c
@@ -76,5 +76,5 @@ int main(int ac, char **av)
report("VMMCALL on edge of canonical address space (AMD)", test_edge());
#endif
- return 0;
+ return report_summary();
}
--
1.9.3
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 02/10] x86: pmu: report takes a fmt
2014-12-12 16:06 [PATCH kvm-unit-tests 00/10] report is nice, use it more Andrew Jones
2014-12-12 16:06 ` [PATCH 01/10] x86: hypercall: add missing report_summary Andrew Jones
@ 2014-12-12 16:06 ` Andrew Jones
2014-12-15 15:03 ` Paolo Bonzini
2014-12-15 15:03 ` Paolo Bonzini
2014-12-12 16:06 ` [PATCH 03/10] x86: vmx: better use of report Andrew Jones
` (8 subsequent siblings)
10 siblings, 2 replies; 15+ messages in thread
From: Andrew Jones @ 2014-12-12 16:06 UTC (permalink / raw)
To: kvm
Signed-off-by: Andrew Jones <drjones@redhat.com>
---
x86/pmu.c | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/x86/pmu.c b/x86/pmu.c
index 5c85146810cb1..f116bafebf424 100644
--- a/x86/pmu.c
+++ b/x86/pmu.c
@@ -228,14 +228,12 @@ static void check_gp_counter(struct pmu_event *evt)
.ctr = MSR_IA32_PERFCTR0,
.config = EVNTSEL_OS | EVNTSEL_USR | evt->unit_sel,
};
- char fmt[100];
int i;
for (i = 0; i < num_counters; i++, cnt.ctr++) {
cnt.count = 0;
measure(&cnt, 1);
- snprintf(fmt, sizeof(fmt), "%s-%%d", evt->name);
- report(fmt, verify_event(cnt.count, evt), i);
+ report("%s-%%d", verify_event(cnt.count, evt), evt->name, i);
}
}
--
1.9.3
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 03/10] x86: vmx: better use of report
2014-12-12 16:06 [PATCH kvm-unit-tests 00/10] report is nice, use it more Andrew Jones
2014-12-12 16:06 ` [PATCH 01/10] x86: hypercall: add missing report_summary Andrew Jones
2014-12-12 16:06 ` [PATCH 02/10] x86: pmu: report takes a fmt Andrew Jones
@ 2014-12-12 16:06 ` Andrew Jones
2014-12-12 16:06 ` [PATCH 04/10] x86: tsc_adjust: use report Andrew Jones
` (7 subsequent siblings)
10 siblings, 0 replies; 15+ messages in thread
From: Andrew Jones @ 2014-12-12 16:06 UTC (permalink / raw)
To: kvm
Signed-off-by: Andrew Jones <drjones@redhat.com>
---
x86/vmx_tests.c | 204 ++++++++++++++------------------------------------------
1 file changed, 49 insertions(+), 155 deletions(-)
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);
--
1.9.3
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 04/10] x86: tsc_adjust: use report
2014-12-12 16:06 [PATCH kvm-unit-tests 00/10] report is nice, use it more Andrew Jones
` (2 preceding siblings ...)
2014-12-12 16:06 ` [PATCH 03/10] x86: vmx: better use of report Andrew Jones
@ 2014-12-12 16:06 ` Andrew Jones
2014-12-12 16:06 ` [PATCH 05/10] x86: svm: " Andrew Jones
` (6 subsequent siblings)
10 siblings, 0 replies; 15+ messages in thread
From: Andrew Jones @ 2014-12-12 16:06 UTC (permalink / raw)
To: kvm
Signed-off-by: Andrew Jones <drjones@redhat.com>
---
x86/tsc_adjust.c | 44 +++++++++++++-------------------------------
1 file changed, 13 insertions(+), 31 deletions(-)
diff --git a/x86/tsc_adjust.c b/x86/tsc_adjust.c
index 0e9679235eafe..725e4ff75b4ba 100644
--- a/x86/tsc_adjust.c
+++ b/x86/tsc_adjust.c
@@ -7,35 +7,22 @@ int main()
{
u64 t1, t2, t3, t4, t5;
u64 est_delta_time;
- bool pass = true;
if (cpuid(7).b & (1 << 1)) { // IA32_TSC_ADJUST Feature is enabled?
- if ( rdmsr(IA32_TSC_ADJUST) != 0x0) {
- printf("failure: IA32_TSC_ADJUST msr was incorrectly"
- " initialized\n");
- pass = false;
- }
+ report("IA32_TSC_ADJUST msr initialization",
+ rdmsr(IA32_TSC_ADJUST) == 0x0);
t3 = 100000000000ull;
t1 = rdtsc();
wrmsr(IA32_TSC_ADJUST, t3);
t2 = rdtsc();
- if (rdmsr(IA32_TSC_ADJUST) != t3) {
- printf("failure: IA32_TSC_ADJUST msr read / write"
- " incorrect\n");
- pass = false;
- }
- if (t2 - t1 < t3) {
- printf("failure: TSC did not adjust for IA32_TSC_ADJUST"
- " value\n");
- pass = false;
- }
+ report("IA32_TSC_ADJUST msr read / write",
+ rdmsr(IA32_TSC_ADJUST) == t3);
+ report("TSC adjustment for IA32_TSC_ADJUST value",
+ (t2 - t1) >= t3);
t3 = 0x0;
wrmsr(IA32_TSC_ADJUST, t3);
- if (rdmsr(IA32_TSC_ADJUST) != t3) {
- printf("failure: IA32_TSC_ADJUST msr read / write"
- " incorrect\n");
- pass = false;
- }
+ report("IA32_TSC_ADJUST msr read / write",
+ rdmsr(IA32_TSC_ADJUST) == t3);
t4 = 100000000000ull;
t1 = rdtsc();
wrtsc(t4);
@@ -44,17 +31,12 @@ int main()
// est of time between reading tsc and writing tsc,
// (based on IA32_TSC_ADJUST msr value) should be small
est_delta_time = t4 - t5 - t1;
- if (est_delta_time > 2 * (t2 - t4)) {
- // arbitray 2x latency (wrtsc->rdtsc) threshold
- printf("failure: IA32_TSC_ADJUST msr incorrectly"
- " adjusted on tsc write\n");
- pass = false;
- }
- if (pass) printf("success: IA32_TSC_ADJUST enabled and"
- " working correctly\n");
+ // arbitray 2x latency (wrtsc->rdtsc) threshold
+ report("IA32_TSC_ADJUST msr adjustment on tsc write",
+ est_delta_time <= (2 * (t2 - t4)));
}
else {
- printf("success: IA32_TSC_ADJUST feature not enabled\n");
+ report("IA32_TSC_ADJUST feature not enabled", true);
}
- return pass?0:1;
+ return report_summary();
}
--
1.9.3
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 05/10] x86: svm: use report
2014-12-12 16:06 [PATCH kvm-unit-tests 00/10] report is nice, use it more Andrew Jones
` (3 preceding siblings ...)
2014-12-12 16:06 ` [PATCH 04/10] x86: tsc_adjust: use report Andrew Jones
@ 2014-12-12 16:06 ` Andrew Jones
2014-12-12 16:06 ` [PATCH 06/10] x86: asyncpf: " Andrew Jones
` (5 subsequent siblings)
10 siblings, 0 replies; 15+ messages in thread
From: Andrew Jones @ 2014-12-12 16:06 UTC (permalink / raw)
To: kvm
Signed-off-by: Andrew Jones <drjones@redhat.com>
---
x86/svm.c | 25 ++++++++-----------------
1 file changed, 8 insertions(+), 17 deletions(-)
diff --git a/x86/svm.c b/x86/svm.c
index 85bb1fa9d8315..1046ddf73732f 100644
--- a/x86/svm.c
+++ b/x86/svm.c
@@ -239,11 +239,10 @@ struct regs regs;
#define LOAD_GPR_C SAVE_GPR_C
-static bool test_run(struct test *test, struct vmcb *vmcb)
+static void test_run(struct test *test, struct vmcb *vmcb)
{
u64 vmcb_phys = virt_to_phys(vmcb);
u64 guest_stack[10000];
- bool success;
test->vmcb = vmcb;
test->prepare(test);
@@ -276,12 +275,7 @@ static bool test_run(struct test *test, struct vmcb *vmcb)
++test->exits;
} while (!test->finished(test));
-
- success = test->succeeded(test);
-
- printf("%s: %s\n", test->name, success ? "PASS" : "FAIL");
-
- return success;
+ report("%s", test->succeeded(test), test->name);
}
static bool smp_supported(void)
@@ -610,7 +604,7 @@ static void test_ioio(struct test *test)
return;
fail:
- printf("test failure, stage %d\n", get_test_stage(test));
+ report("stage %d\n", false, get_test_stage(test));
test->scratch = -1;
}
@@ -685,8 +679,8 @@ static void sel_cr0_bug_test(struct test *test)
* are not in guest-mode anymore so we can't trigger an intercept.
* Trigger a tripple-fault for now.
*/
- printf("sel_cr0 test failed. Can not recover from this - exiting\n");
- exit(1);
+ report("sel_cr0 test. Can not recover from this - exiting\n", false);
+ exit(report_summary());
}
static bool sel_cr0_bug_check(struct test *test)
@@ -1062,7 +1056,7 @@ static struct test tests[] = {
int main(int ac, char **av)
{
- int i, nr, passed, done;
+ int i, nr;
struct vmcb *vmcb;
setup_vm();
@@ -1078,14 +1072,11 @@ int main(int ac, char **av)
vmcb = alloc_page();
nr = ARRAY_SIZE(tests);
- passed = done = 0;
for (i = 0; i < nr; ++i) {
if (!tests[i].supported())
continue;
- done += 1;
- passed += test_run(&tests[i], vmcb);
+ test_run(&tests[i], vmcb);
}
- printf("\nSUMMARY: %d TESTS, %d FAILURES\n", done, (done - passed));
- return passed == done ? 0 : 1;
+ return report_summary();
}
--
1.9.3
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 06/10] x86: asyncpf: use report
2014-12-12 16:06 [PATCH kvm-unit-tests 00/10] report is nice, use it more Andrew Jones
` (4 preceding siblings ...)
2014-12-12 16:06 ` [PATCH 05/10] x86: svm: " Andrew Jones
@ 2014-12-12 16:06 ` Andrew Jones
2014-12-12 16:06 ` [PATCH 07/10] x86: xsave: " Andrew Jones
` (4 subsequent siblings)
10 siblings, 0 replies; 15+ messages in thread
From: Andrew Jones @ 2014-12-12 16:06 UTC (permalink / raw)
To: kvm
Signed-off-by: Andrew Jones <drjones@redhat.com>
---
x86/asyncpf.c | 15 ++++++---------
1 file changed, 6 insertions(+), 9 deletions(-)
diff --git a/x86/asyncpf.c b/x86/asyncpf.c
index 5d269f7346159..304d015888cfd 100644
--- a/x86/asyncpf.c
+++ b/x86/asyncpf.c
@@ -37,7 +37,6 @@ volatile uint32_t apf_reason __attribute__((aligned(64)));
char *buf;
volatile uint64_t i;
volatile uint64_t phys;
-bool fail;
static inline uint32_t get_apf_reason(void)
{
@@ -53,21 +52,21 @@ static void pf_isr(struct ex_regs *r)
switch (reason) {
case 0:
- printf("unexpected #PF at %p\n", read_cr2());
- fail = true;
+ report("unexpected #PF at %p\n", false, read_cr2());
break;
case KVM_PV_REASON_PAGE_NOT_PRESENT:
phys = virt_to_phys_cr3(virt);
install_pte(phys_to_virt(read_cr3()), 1, virt, phys, 0);
write_cr3(read_cr3());
- printf("Got not present #PF token %x virt addr %p phys addr %p\n", read_cr2(), virt, phys);
+ report("Got not present #PF token %x virt addr %p phys addr %p\n",
+ true, read_cr2(), virt, phys);
while(phys) {
safe_halt(); /* enables irq */
irq_disable();
}
break;
case KVM_PV_REASON_PAGE_READY:
- printf("Got present #PF token %x\n", read_cr2());
+ report("Got present #PF token %x\n", true, read_cr2());
if ((uint32_t)read_cr2() == ~0)
break;
install_pte(phys_to_virt(read_cr3()), 1, virt, phys | PTE_PRESENT | PTE_WRITE, 0);
@@ -75,8 +74,7 @@ static void pf_isr(struct ex_regs *r)
phys = 0;
break;
default:
- printf("unexpected async pf reason %d\n", reason);
- fail = true;
+ report("unexpected async pf reason %d\n", false, reason);
break;
}
}
@@ -107,6 +105,5 @@ int main(int ac, char **av)
}
irq_disable();
- printf("%s\n", fail ? "FAIL" : "PASS");
- return fail;
+ return report_summary();
}
--
1.9.3
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 07/10] x86: xsave: use report
2014-12-12 16:06 [PATCH kvm-unit-tests 00/10] report is nice, use it more Andrew Jones
` (5 preceding siblings ...)
2014-12-12 16:06 ` [PATCH 06/10] x86: asyncpf: " Andrew Jones
@ 2014-12-12 16:06 ` Andrew Jones
2014-12-12 16:06 ` [PATCH 08/10] report: add prefix support Andrew Jones
` (3 subsequent siblings)
10 siblings, 0 replies; 15+ messages in thread
From: Andrew Jones @ 2014-12-12 16:06 UTC (permalink / raw)
To: kvm
Signed-off-by: Andrew Jones <drjones@redhat.com>
---
x86/xsave.c | 150 +++++++++++++++++++++++-------------------------------------
1 file changed, 56 insertions(+), 94 deletions(-)
diff --git a/x86/xsave.c b/x86/xsave.c
index cd2cdceefca26..e471835b42fd9 100644
--- a/x86/xsave.c
+++ b/x86/xsave.c
@@ -65,134 +65,103 @@ uint64_t get_supported_xcr0(void)
#define XSTATE_SSE 0x2
#define XSTATE_YMM 0x4
-static int total_tests, fail_tests;
-
-void pass_if(int condition)
-{
- total_tests ++;
- if (condition)
- printf("Pass!\n");
- else {
- printf("Fail!\n");
- fail_tests ++;
- }
-}
-
void test_xsave(void)
{
unsigned long cr4;
uint64_t supported_xcr0;
uint64_t test_bits;
u64 xcr0;
- int r;
printf("Legal instruction testing:\n");
+
supported_xcr0 = get_supported_xcr0();
printf("Supported XCR0 bits: 0x%x\n", supported_xcr0);
- printf("Check minimal XSAVE required bits: ");
test_bits = XSTATE_FP | XSTATE_SSE;
- pass_if((supported_xcr0 & test_bits) == test_bits);
+ report("Check minimal XSAVE required bits",
+ (supported_xcr0 & test_bits) == test_bits);
- printf("Set CR4 OSXSAVE: ");
cr4 = read_cr4();
- r = write_cr4_checking(cr4 | X86_CR4_OSXSAVE);
- pass_if(r == 0);
-
- printf("Check CPUID.1.ECX.OSXSAVE - expect 1: ");
- pass_if(check_cpuid_1_ecx(CPUID_1_ECX_OSXSAVE));
+ report("Set CR4 OSXSAVE", write_cr4_checking(cr4 | X86_CR4_OSXSAVE) == 0);
+ report("Check CPUID.1.ECX.OSXSAVE - expect 1",
+ check_cpuid_1_ecx(CPUID_1_ECX_OSXSAVE));
- printf(" Legal tests\n");
- printf(" xsetbv(XCR_XFEATURE_ENABLED_MASK, XSTATE_FP): ");
+ printf("\tLegal tests\n");
test_bits = XSTATE_FP;
- r = xsetbv_checking(XCR_XFEATURE_ENABLED_MASK, test_bits);
- pass_if(r == 0);
- printf(" xsetbv(XCR_XFEATURE_ENABLED_MASK, "
- "XSTATE_FP | XSTATE_SSE): ");
+ report("\t\txsetbv(XCR_XFEATURE_ENABLED_MASK, XSTATE_FP)",
+ xsetbv_checking(XCR_XFEATURE_ENABLED_MASK, test_bits) == 0);
+
test_bits = XSTATE_FP | XSTATE_SSE;
- r = xsetbv_checking(XCR_XFEATURE_ENABLED_MASK, test_bits);
- pass_if(r == 0);
- printf(" xgetbv(XCR_XFEATURE_ENABLED_MASK): ");
- r = xgetbv_checking(XCR_XFEATURE_ENABLED_MASK, &xcr0);
- pass_if(r == 0);
- printf(" Illegal tests\n");
- printf(" xsetbv(XCR_XFEATURE_ENABLED_MASK, 0) - expect #GP: ");
+ report("\t\txsetbv(XCR_XFEATURE_ENABLED_MASK, XSTATE_FP | XSTATE_SSE)",
+ xsetbv_checking(XCR_XFEATURE_ENABLED_MASK, test_bits) == 0);
+ report(" xgetbv(XCR_XFEATURE_ENABLED_MASK)",
+ xgetbv_checking(XCR_XFEATURE_ENABLED_MASK, &xcr0) == 0);
+
+ printf("\tIllegal tests\n");
test_bits = 0;
- r = xsetbv_checking(XCR_XFEATURE_ENABLED_MASK, test_bits);
- pass_if(r == GP_VECTOR);
- printf(" xsetbv(XCR_XFEATURE_ENABLED_MASK, XSTATE_SSE) "
- "- expect #GP: ");
+ report("\t\txsetbv(XCR_XFEATURE_ENABLED_MASK, 0) - expect #GP",
+ xsetbv_checking(XCR_XFEATURE_ENABLED_MASK, test_bits) == GP_VECTOR);
+
test_bits = XSTATE_SSE;
- r = xsetbv_checking(XCR_XFEATURE_ENABLED_MASK, test_bits);
- pass_if(r == GP_VECTOR);
+ report("\t\txsetbv(XCR_XFEATURE_ENABLED_MASK, XSTATE_SSE) - expect #GP",
+ xsetbv_checking(XCR_XFEATURE_ENABLED_MASK, test_bits) == GP_VECTOR);
+
if (supported_xcr0 & XSTATE_YMM) {
- printf(" xsetbv(XCR_XFEATURE_ENABLED_MASK, "
- "XSTATE_YMM) - expect #GP: ");
test_bits = XSTATE_YMM;
- r = xsetbv_checking(XCR_XFEATURE_ENABLED_MASK, test_bits);
- pass_if(r == GP_VECTOR);
- printf(" xsetbv(XCR_XFEATURE_ENABLED_MASK, "
- "XSTATE_FP | XSTATE_YMM) - expect #GP: ");
+ report("\t\txsetbv(XCR_XFEATURE_ENABLED_MASK, XSTATE_YMM) - expect #GP",
+ xsetbv_checking(XCR_XFEATURE_ENABLED_MASK, test_bits) == GP_VECTOR);
+
test_bits = XSTATE_FP | XSTATE_YMM;
- r = xsetbv_checking(XCR_XFEATURE_ENABLED_MASK, test_bits);
- pass_if(r == GP_VECTOR);
+ report("\t\txsetbv(XCR_XFEATURE_ENABLED_MASK, XSTATE_FP | XSTATE_YMM) - expect #GP",
+ xsetbv_checking(XCR_XFEATURE_ENABLED_MASK, test_bits) == GP_VECTOR);
}
- printf(" xsetbv(XCR_XFEATURE_ILLEGAL_MASK, XSTATE_FP) "
- "- expect #GP: ");
+
test_bits = XSTATE_SSE;
- r = xsetbv_checking(XCR_XFEATURE_ILLEGAL_MASK, test_bits);
- pass_if(r == GP_VECTOR);
- printf(" xgetbv(XCR_XFEATURE_ILLEGAL_MASK, XSTATE_FP) "
- "- expect #GP: ");
+ report("\t\txsetbv(XCR_XFEATURE_ILLEGAL_MASK, XSTATE_FP) - expect #GP",
+ xsetbv_checking(XCR_XFEATURE_ILLEGAL_MASK, test_bits) == GP_VECTOR);
+
test_bits = XSTATE_SSE;
- r = xsetbv_checking(XCR_XFEATURE_ILLEGAL_MASK, test_bits);
- pass_if(r == GP_VECTOR);
+ report("\t\txgetbv(XCR_XFEATURE_ILLEGAL_MASK, XSTATE_FP) - expect #GP",
+ xsetbv_checking(XCR_XFEATURE_ILLEGAL_MASK, test_bits) == GP_VECTOR);
- printf("Unset CR4 OSXSAVE: ");
cr4 &= ~X86_CR4_OSXSAVE;
- r = write_cr4_checking(cr4);
- pass_if(r == 0);
- printf("Check CPUID.1.ECX.OSXSAVE - expect 0: ");
- pass_if(check_cpuid_1_ecx(CPUID_1_ECX_OSXSAVE) == 0);
- printf(" Illegal tests:\n");
- printf(" xsetbv(XCR_XFEATURE_ENABLED_MASK, XSTATE_FP) - expect #UD: ");
+ report("Unset CR4 OSXSAVE", write_cr4_checking(cr4) == 0);
+ report("Check CPUID.1.ECX.OSXSAVE - expect 0",
+ check_cpuid_1_ecx(CPUID_1_ECX_OSXSAVE) == 0);
+
+ printf("\tIllegal tests:\n");
test_bits = XSTATE_FP;
- r = xsetbv_checking(XCR_XFEATURE_ENABLED_MASK, test_bits);
- pass_if(r == UD_VECTOR);
- printf(" xsetbv(XCR_XFEATURE_ENABLED_MASK, "
- "XSTATE_FP | XSTATE_SSE) - expect #UD: ");
+ report("\t\txsetbv(XCR_XFEATURE_ENABLED_MASK, XSTATE_FP) - expect #UD",
+ xsetbv_checking(XCR_XFEATURE_ENABLED_MASK, test_bits) == UD_VECTOR);
+
test_bits = XSTATE_FP | XSTATE_SSE;
- r = xsetbv_checking(XCR_XFEATURE_ENABLED_MASK, test_bits);
- pass_if(r == UD_VECTOR);
- printf(" Illegal tests:\n");
- printf(" xgetbv(XCR_XFEATURE_ENABLED_MASK) - expect #UD: ");
- r = xgetbv_checking(XCR_XFEATURE_ENABLED_MASK, &xcr0);
- pass_if(r == UD_VECTOR);
+ report("\t\txsetbv(XCR_XFEATURE_ENABLED_MASK, XSTATE_FP | XSTATE_SSE) - expect #UD",
+ xsetbv_checking(XCR_XFEATURE_ENABLED_MASK, test_bits) == UD_VECTOR);
+
+ printf("\tIllegal tests:\n");
+ report("\txgetbv(XCR_XFEATURE_ENABLED_MASK) - expect #UD",
+ xgetbv_checking(XCR_XFEATURE_ENABLED_MASK, &xcr0) == UD_VECTOR);
}
void test_no_xsave(void)
{
unsigned long cr4;
u64 xcr0;
- int r;
- printf("Check CPUID.1.ECX.OSXSAVE - expect 0: ");
- pass_if(check_cpuid_1_ecx(CPUID_1_ECX_OSXSAVE) == 0);
+ report("Check CPUID.1.ECX.OSXSAVE - expect 0",
+ check_cpuid_1_ecx(CPUID_1_ECX_OSXSAVE) == 0);
printf("Illegal instruction testing:\n");
- printf("Set OSXSAVE in CR4 - expect #GP: ");
cr4 = read_cr4();
- r = write_cr4_checking(cr4 | X86_CR4_OSXSAVE);
- pass_if(r == GP_VECTOR);
+ report("Set OSXSAVE in CR4 - expect #GP",
+ write_cr4_checking(cr4 | X86_CR4_OSXSAVE) == GP_VECTOR);
- printf("Execute xgetbv - expect #UD: ");
- r = xgetbv_checking(XCR_XFEATURE_ENABLED_MASK, &xcr0);
- pass_if(r == UD_VECTOR);
+ report("Execute xgetbv - expect #UD",
+ xgetbv_checking(XCR_XFEATURE_ENABLED_MASK, &xcr0) == UD_VECTOR);
- printf("Execute xsetbv - expect #UD: ");
- r = xsetbv_checking(XCR_XFEATURE_ENABLED_MASK, 0x3);
- pass_if(r == UD_VECTOR);
+ report("Execute xsetbv - expect #UD",
+ xsetbv_checking(XCR_XFEATURE_ENABLED_MASK, 0x3) == UD_VECTOR);
}
int main(void)
@@ -205,12 +174,5 @@ int main(void)
printf("CPU don't has XSAVE feature\n");
test_no_xsave();
}
- printf("Total test: %d\n", total_tests);
- if (fail_tests == 0)
- printf("ALL PASS!\n");
- else {
- printf("Fail %d tests.\n", fail_tests);
- return 1;
- }
- return 0;
+ return report_summary();
}
--
1.9.3
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 08/10] report: add prefix support
2014-12-12 16:06 [PATCH kvm-unit-tests 00/10] report is nice, use it more Andrew Jones
` (6 preceding siblings ...)
2014-12-12 16:06 ` [PATCH 07/10] x86: xsave: " Andrew Jones
@ 2014-12-12 16:06 ` Andrew Jones
2014-12-12 16:06 ` [PATCH 09/10] x86: use report prefixes Andrew Jones
` (2 subsequent siblings)
10 siblings, 0 replies; 15+ messages in thread
From: Andrew Jones @ 2014-12-12 16:06 UTC (permalink / raw)
To: kvm
Add some methods to report in order to manage output prefixes.
Also add strstr to string, as it was useful for implementing
report_prefix_pop. Prefixes can be useful, as test code
frequently has the following pattern
main()
{
foreach(subtest)
run(subtest)
}
But, if we want output lines to include 'subtest: ', then we
need
report("%s: ...", cond, subtest, ...)
for each report line. With push/pop we can now just do
subtest()
{
report_prefix_push(subtest);
report(...);
...
report(...);
report_prefix_pop();
}
Signed-off-by: Andrew Jones <drjones@redhat.com>
---
lib/libcflat.h | 2 ++
lib/report.c | 22 ++++++++++++++++++++++
lib/string.c | 17 +++++++++++++++++
lib/string.h | 1 +
4 files changed, 42 insertions(+)
diff --git a/lib/libcflat.h b/lib/libcflat.h
index 7db29a4f4f3cb..9747ccdbc9f1d 100644
--- a/lib/libcflat.h
+++ b/lib/libcflat.h
@@ -57,6 +57,8 @@ extern int snprintf(char *buf, int size, const char *fmt, ...);
extern int vsnprintf(char *buf, int size, const char *fmt, va_list va);
extern long atol(const char *ptr);
+void report_prefix_push(const char *prefix);
+void report_prefix_pop(void);
void report(const char *msg_fmt, bool pass, ...);
void report_xfail(const char *msg_fmt, bool xfail, bool pass, ...);
int report_summary(void);
diff --git a/lib/report.c b/lib/report.c
index 7a9f270b1fafb..dc30250c676d3 100644
--- a/lib/report.c
+++ b/lib/report.c
@@ -13,6 +13,27 @@
#include "libcflat.h"
static unsigned int tests, failures, xfailures;
+static char prefixes[256];
+
+void report_prefix_push(const char *prefix)
+{
+ strcat(prefixes, prefix);
+ strcat(prefixes, ": ");
+}
+
+void report_prefix_pop(void)
+{
+ char *p, *q;
+
+ if (!*prefixes)
+ return;
+
+ for (p = prefixes, q = strstr(p, ": ") + 2;
+ *q;
+ p = q, q = strstr(p, ": ") + 2)
+ ;
+ *p = '\0';
+}
void va_report_xfail(const char *msg_fmt, bool xfail, bool cond, va_list va)
{
@@ -22,6 +43,7 @@ void va_report_xfail(const char *msg_fmt, bool xfail, bool cond, va_list va)
tests++;
printf("%s: ", cond ? pass : fail);
+ puts(prefixes);
vsnprintf(buf, sizeof(buf), msg_fmt, va);
puts(buf);
puts("\n");
diff --git a/lib/string.c b/lib/string.c
index 026f50252287c..e7bcfe945fcfa 100644
--- a/lib/string.c
+++ b/lib/string.c
@@ -45,6 +45,23 @@ char *strchr(const char *s, int c)
return (char *)s;
}
+char *strstr(const char *s1, const char *s2)
+{
+ size_t l1, l2;
+
+ l2 = strlen(s2);
+ if (!l2)
+ return (char *)s1;
+ l1 = strlen(s1);
+ while (l1 >= l2) {
+ l1--;
+ if (!memcmp(s1, s2, l2))
+ return (char *)s1;
+ s1++;
+ }
+ return NULL;
+}
+
void *memset(void *s, int c, size_t n)
{
size_t i;
diff --git a/lib/string.h b/lib/string.h
index dbab368b1b9e4..7820db86ee4e0 100644
--- a/lib/string.h
+++ b/lib/string.h
@@ -6,6 +6,7 @@ extern char *strcat(char *dest, const char *src);
extern char *strcpy(char *dest, const char *src);
extern int strcmp(const char *a, const char *b);
extern char *strchr(const char *s, int c);
+char *strstr(const char *haystack, const char *needle);
extern void *memset(void *s, int c, size_t n);
extern void *memcpy(void *dest, const void *src, size_t n);
extern int memcmp(const void *s1, const void *s2, size_t n);
--
1.9.3
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 09/10] x86: use report prefixes
2014-12-12 16:06 [PATCH kvm-unit-tests 00/10] report is nice, use it more Andrew Jones
` (7 preceding siblings ...)
2014-12-12 16:06 ` [PATCH 08/10] report: add prefix support Andrew Jones
@ 2014-12-12 16:06 ` Andrew Jones
2014-12-12 16:06 ` [PATCH 10/10] arm: " Andrew Jones
2014-12-12 16:19 ` [PATCH kvm-unit-tests 00/10] report is nice, use it more Andrew Jones
10 siblings, 0 replies; 15+ messages in thread
From: Andrew Jones @ 2014-12-12 16:06 UTC (permalink / raw)
To: kvm
So far only applied in a couple obvious places, where
temporary prefixes were already used.
Signed-off-by: Andrew Jones <drjones@redhat.com>
---
x86/apic.c | 8 ++++++--
x86/pmu.c | 24 ++++++++++++++++--------
2 files changed, 22 insertions(+), 10 deletions(-)
diff --git a/x86/apic.c b/x86/apic.c
index 2619d85941907..365c281547331 100644
--- a/x86/apic.c
+++ b/x86/apic.c
@@ -121,19 +121,23 @@ static void test_apicbase(void)
wrmsr(MSR_IA32_APICBASE, orig_apicbase & ~(APIC_EN | APIC_EXTD));
wrmsr(MSR_IA32_APICBASE, ALTERNATE_APIC_BASE | APIC_BSP | APIC_EN);
+ report_prefix_push("apicbase");
+
report("relocate apic",
*(volatile u32 *)(ALTERNATE_APIC_BASE + APIC_LVR) == lvr);
value = orig_apicbase | (1UL << cpuid_maxphyaddr());
- report("apicbase: reserved physaddr bits",
+ report("reserved physaddr bits",
test_for_exception(GP_VECTOR, do_write_apicbase, &value));
value = orig_apicbase | 1;
- report("apicbase: reserved low bits",
+ report("reserved low bits",
test_for_exception(GP_VECTOR, do_write_apicbase, &value));
wrmsr(MSR_IA32_APICBASE, orig_apicbase);
apic_write(APIC_SPIV, 0x1ff);
+
+ report_prefix_pop();
}
static void eoi(void)
diff --git a/x86/pmu.c b/x86/pmu.c
index f116bafebf424..56fe1e3d9d301 100644
--- a/x86/pmu.c
+++ b/x86/pmu.c
@@ -309,6 +309,8 @@ static void check_counter_overflow(void)
/* clear status before test */
wrmsr(MSR_CORE_PERF_GLOBAL_OVF_CTRL, rdmsr(MSR_CORE_PERF_GLOBAL_STATUS));
+ report_prefix_push("overflow");
+
for (i = 0; i < num_counters + 1; i++, cnt.ctr++) {
uint64_t status;
int idx;
@@ -321,14 +323,16 @@ static void check_counter_overflow(void)
idx = event_to_global_idx(&cnt);
cnt.count = 1 - count;
measure(&cnt, 1);
- report("overflow-%d", cnt.count == 1, i);
+ report("cntr-%d", cnt.count == 1, i);
status = rdmsr(MSR_CORE_PERF_GLOBAL_STATUS);
- report("overflow status-%d", status & (1ull << idx), i);
+ report("status-%d", status & (1ull << idx), i);
wrmsr(MSR_CORE_PERF_GLOBAL_OVF_CTRL, status);
status = rdmsr(MSR_CORE_PERF_GLOBAL_STATUS);
- report("overflow status clear-%d", !(status & (1ull << idx)), i);
- report("overflow irq-%d", check_irq() == (i % 2), i);
+ report("status clear-%d", !(status & (1ull << idx)), i);
+ report("irq-%d", check_irq() == (i % 2), i);
}
+
+ report_prefix_pop();
}
static void check_gp_counter_cmask(void)
@@ -348,20 +352,24 @@ static void check_rdpmc(void)
uint64_t val = 0x1f3456789ull;
int i;
+ report_prefix_push("rdpmc");
+
for (i = 0; i < num_counters; i++) {
uint64_t x = (val & 0xffffffff) |
((1ull << (eax.split.bit_width - 32)) - 1) << 32;
wrmsr(MSR_IA32_PERFCTR0 + i, val);
- report("rdpmc-%d", rdpmc(i) == x, i);
- report("rdpmc fast-%d", rdpmc(i | (1<<31)) == (u32)val, i);
+ report("cntr-%d", rdpmc(i) == x, i);
+ report("fast-%d", rdpmc(i | (1<<31)) == (u32)val, i);
}
for (i = 0; i < edx.split.num_counters_fixed; i++) {
uint64_t x = (val & 0xffffffff) |
((1ull << (edx.split.bit_width_fixed - 32)) - 1) << 32;
wrmsr(MSR_CORE_PERF_FIXED_CTR0 + i, val);
- report("rdpmc fixed-%d", rdpmc(i | (1 << 30)) == x, i);
- report("rdpmc fixed fast-%d", rdpmc(i | (3<<30)) == (u32)val, i);
+ report("fixed cntr-%d", rdpmc(i | (1 << 30)) == x, i);
+ report("fixed fast-%d", rdpmc(i | (3<<30)) == (u32)val, i);
}
+
+ report_prefix_pop();
}
int main(int ac, char **av)
--
1.9.3
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 10/10] arm: use report prefixes
2014-12-12 16:06 [PATCH kvm-unit-tests 00/10] report is nice, use it more Andrew Jones
` (8 preceding siblings ...)
2014-12-12 16:06 ` [PATCH 09/10] x86: use report prefixes Andrew Jones
@ 2014-12-12 16:06 ` Andrew Jones
2014-12-12 16:19 ` [PATCH kvm-unit-tests 00/10] report is nice, use it more Andrew Jones
10 siblings, 0 replies; 15+ messages in thread
From: Andrew Jones @ 2014-12-12 16:06 UTC (permalink / raw)
To: kvm
arm/selftest was already making use of prefixes, managing them
itself. Use the prefix support now built into report.
Signed-off-by: Andrew Jones <drjones@redhat.com>
---
arm/selftest.c | 31 ++++++++++++-------------------
1 file changed, 12 insertions(+), 19 deletions(-)
diff --git a/arm/selftest.c b/arm/selftest.c
index 0f70e1dcb3b0e..4f23d7d3ae1f9 100644
--- a/arm/selftest.c
+++ b/arm/selftest.c
@@ -13,23 +13,10 @@
#include "asm/processor.h"
#include "asm/page.h"
-#define TESTGRP "selftest"
-
-static char testname[64];
-
-static void testname_set(const char *subtest)
-{
- strcpy(testname, TESTGRP);
- if (subtest) {
- strcat(testname, "::");
- strcat(testname, subtest);
- }
-}
-
static void assert_args(int num_args, int needed_args)
{
if (num_args < needed_args) {
- printf("%s: not enough arguments\n", testname);
+ printf("selftest: not enough arguments\n");
abort();
}
}
@@ -60,19 +47,24 @@ static void check_setup(int argc, char **argv)
if (!var)
continue;
+ report_prefix_push(var);
+
if (strcmp(var, "mem") == 0) {
phys_addr_t memsize = PHYS_END - PHYS_OFFSET;
phys_addr_t expected = ((phys_addr_t)val)*1024*1024;
- report("%s[%s]", memsize == expected, testname, "mem");
+ report("size = %d MB", memsize == expected,
+ memsize/1024/1024);
++nr_tests;
} else if (strcmp(var, "smp") == 0) {
- report("%s[%s]", nr_cpus == (int)val, testname, "smp");
+ report("nr_cpus = %d", nr_cpus == (int)val, nr_cpus);
++nr_tests;
}
+
+ report_prefix_pop();
}
assert_args(nr_tests, 2);
@@ -181,15 +173,16 @@ static bool check_svc(void)
static void check_vectors(void *arg __unused)
{
- report("%s", check_und() && check_svc(), testname);
+ report("und", check_und());
+ report("svc", check_svc());
exit(report_summary());
}
int main(int argc, char **argv)
{
- testname_set(NULL);
+ report_prefix_push("selftest");
assert_args(argc, 1);
- testname_set(argv[0]);
+ report_prefix_push(argv[0]);
if (strcmp(argv[0], "setup") == 0) {
--
1.9.3
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH kvm-unit-tests 00/10] report is nice, use it more
2014-12-12 16:06 [PATCH kvm-unit-tests 00/10] report is nice, use it more Andrew Jones
` (9 preceding siblings ...)
2014-12-12 16:06 ` [PATCH 10/10] arm: " Andrew Jones
@ 2014-12-12 16:19 ` Andrew Jones
2014-12-15 15:11 ` Paolo Bonzini
10 siblings, 1 reply; 15+ messages in thread
From: Andrew Jones @ 2014-12-12 16:19 UTC (permalink / raw)
To: kvm
On Fri, Dec 12, 2014 at 05:06:07PM +0100, Andrew Jones wrote:
> This series applies report() to more x86 unit tests. It also
> cleans up some uses of it in vmx_tests. Finally, it also
> introduces report prefix support, and applies that a few places.
> There should be no functional changes with this series, except of
> course the output formatting (which makes the churn debatable).
> Anyway, I believe this series helps us to start converging on a
> "standard" output format for all unit tests.
>
> I'm afraid I didn't test all the changes, as not all unit tests
> could run on my test machine.
> svm - didn't run
> xsave - didn't run 'have xsave' tests
> asyncpf - is commented out of unittests.cfg,
> and I didn't uncomment it out
> pmu - didn't run
>
> (I probably should add a bunch of kvm-unit-tests contributors to
> the CC in order to alert them that I'm touching their unit tests,
> but I don't think this series warrants all the git blaming, so
> I'm not adding anybody at all :-)
Forgot to mention that these patches are available here
https://github.com/rhdrjones/kvm-unit-tests/tree/more-report
>
>
> Andrew Jones (10):
> x86: hypercall: add missing report_summary
> x86: pmu: report takes a fmt
> x86: vmx: better use of report
> x86: tsc_adjust: use report
> x86: svm: use report
> x86: asyncpf: use report
> x86: xsave: use report
> report: add prefix support
> x86: use report prefixes
> arm: use report prefixes
>
> arm/selftest.c | 31 ++++-----
> lib/libcflat.h | 2 +
> lib/report.c | 22 ++++++
> lib/string.c | 17 +++++
> lib/string.h | 1 +
> x86/apic.c | 8 ++-
> x86/asyncpf.c | 15 ++--
> x86/hypercall.c | 2 +-
> x86/pmu.c | 28 +++++---
> x86/svm.c | 25 +++----
> x86/tsc_adjust.c | 44 ++++--------
> x86/vmx_tests.c | 204 +++++++++++++------------------------------------------
> x86/xsave.c | 150 +++++++++++++++-------------------------
> 13 files changed, 210 insertions(+), 339 deletions(-)
>
> --
> 1.9.3
>
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 02/10] x86: pmu: report takes a fmt
2014-12-12 16:06 ` [PATCH 02/10] x86: pmu: report takes a fmt Andrew Jones
@ 2014-12-15 15:03 ` Paolo Bonzini
2014-12-15 15:03 ` Paolo Bonzini
1 sibling, 0 replies; 15+ messages in thread
From: Paolo Bonzini @ 2014-12-15 15:03 UTC (permalink / raw)
To: kvm
On 12/12/2014 17:06, Andrew Jones wrote:
> Signed-off-by: Andrew Jones <drjones@redhat.com>
> ---
> x86/pmu.c | 4 +---
> 1 file changed, 1 insertion(+), 3 deletions(-)
>
> diff --git a/x86/pmu.c b/x86/pmu.c
> index 5c85146810cb1..f116bafebf424 100644
> --- a/x86/pmu.c
> +++ b/x86/pmu.c
> @@ -228,14 +228,12 @@ static void check_gp_counter(struct pmu_event *evt)
> .ctr = MSR_IA32_PERFCTR0,
> .config = EVNTSEL_OS | EVNTSEL_USR | evt->unit_sel,
> };
> - char fmt[100];
> int i;
>
> for (i = 0; i < num_counters; i++, cnt.ctr++) {
> cnt.count = 0;
> measure(&cnt, 1);
> - snprintf(fmt, sizeof(fmt), "%s-%%d", evt->name);
> - report(fmt, verify_event(cnt.count, evt), i);
> + report("%s-%%d", verify_event(cnt.count, evt), evt->name, i);
Should be %s-%d, changed it.
Paolo
> }
> }
>
>
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 02/10] x86: pmu: report takes a fmt
2014-12-12 16:06 ` [PATCH 02/10] x86: pmu: report takes a fmt Andrew Jones
2014-12-15 15:03 ` Paolo Bonzini
@ 2014-12-15 15:03 ` Paolo Bonzini
1 sibling, 0 replies; 15+ messages in thread
From: Paolo Bonzini @ 2014-12-15 15:03 UTC (permalink / raw)
To: Andrew Jones, kvm
On 12/12/2014 17:06, Andrew Jones wrote:
> Signed-off-by: Andrew Jones <drjones@redhat.com>
> ---
> x86/pmu.c | 4 +---
> 1 file changed, 1 insertion(+), 3 deletions(-)
>
> diff --git a/x86/pmu.c b/x86/pmu.c
> index 5c85146810cb1..f116bafebf424 100644
> --- a/x86/pmu.c
> +++ b/x86/pmu.c
> @@ -228,14 +228,12 @@ static void check_gp_counter(struct pmu_event *evt)
> .ctr = MSR_IA32_PERFCTR0,
> .config = EVNTSEL_OS | EVNTSEL_USR | evt->unit_sel,
> };
> - char fmt[100];
> int i;
>
> for (i = 0; i < num_counters; i++, cnt.ctr++) {
> cnt.count = 0;
> measure(&cnt, 1);
> - snprintf(fmt, sizeof(fmt), "%s-%%d", evt->name);
> - report(fmt, verify_event(cnt.count, evt), i);
> + report("%s-%%d", verify_event(cnt.count, evt), evt->name, i);
Should be %s-%d, changed it.
Paolo
> }
> }
>
>
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH kvm-unit-tests 00/10] report is nice, use it more
2014-12-12 16:19 ` [PATCH kvm-unit-tests 00/10] report is nice, use it more Andrew Jones
@ 2014-12-15 15:11 ` Paolo Bonzini
0 siblings, 0 replies; 15+ messages in thread
From: Paolo Bonzini @ 2014-12-15 15:11 UTC (permalink / raw)
To: Andrew Jones, KVM list
On 12/12/2014 17:19, Andrew Jones wrote:
>> I'm afraid I didn't test all the changes, as not all unit tests
>> could run on my test machine.
>> svm - didn't run
>> xsave - didn't run 'have xsave' tests
>> asyncpf - is commented out of unittests.cfg,
>> and I didn't uncomment it out
>> pmu - didn't run
>>
Tested svm/xsave/pmu myself, applied series.
Paolo
^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2014-12-15 15:11 UTC | newest]
Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-12-12 16:06 [PATCH kvm-unit-tests 00/10] report is nice, use it more Andrew Jones
2014-12-12 16:06 ` [PATCH 01/10] x86: hypercall: add missing report_summary Andrew Jones
2014-12-12 16:06 ` [PATCH 02/10] x86: pmu: report takes a fmt Andrew Jones
2014-12-15 15:03 ` Paolo Bonzini
2014-12-15 15:03 ` Paolo Bonzini
2014-12-12 16:06 ` [PATCH 03/10] x86: vmx: better use of report Andrew Jones
2014-12-12 16:06 ` [PATCH 04/10] x86: tsc_adjust: use report Andrew Jones
2014-12-12 16:06 ` [PATCH 05/10] x86: svm: " Andrew Jones
2014-12-12 16:06 ` [PATCH 06/10] x86: asyncpf: " Andrew Jones
2014-12-12 16:06 ` [PATCH 07/10] x86: xsave: " Andrew Jones
2014-12-12 16:06 ` [PATCH 08/10] report: add prefix support Andrew Jones
2014-12-12 16:06 ` [PATCH 09/10] x86: use report prefixes Andrew Jones
2014-12-12 16:06 ` [PATCH 10/10] arm: " Andrew Jones
2014-12-12 16:19 ` [PATCH kvm-unit-tests 00/10] report is nice, use it more Andrew Jones
2014-12-15 15:11 ` Paolo Bonzini
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox