add mce test
Subsystems (2)
PATCH 2/3 kvm test: add kvm-unit.cfg
In reply to Marcelo TosattiTo avoid a large parameter list.
kvm-unit.cfg new file +23 -0
@@ -0,0 +1,23 @@ +# qemu config file + +[chardev "mon1"] + backend = "socket" + host = "localhost" + port = "7321" + server = "on" + wait = "off" + +[chardev "mon2"] + backend = "socket" + host = "localhost" + port = "7321" + +[device] + driver = "testdev" + chardev = "testlog" + mon = "mon2" + +[mon] + chardev = "mon1" + mode = "readline" +
README +1 -1
@@ -10,7 +10,7 @@ To create the tests' images just type 'm Tests' images created in ./<ARCH>/*.flat An example of a test invocation: -qemu-system-x86_64 -device testdev,chardev=testlog -chardev file,id=testlog,path=msr.out -kernel ./x86/msr.flat +qemu-system-x86_64 -readconfig kvm-unit.cfg -chardev file,id=testlog,path=msr.out -kernel ./x86/msr.flat This invocation runs the msr test case. The test output is in file msr.out.
cover add mce test
PATCH 1/3 kvm test: add monitor_printf
lib/x86/io.c +15 -0
@@ -2,6 +2,7 @@#include "smp.h" static struct spinlock lock; +static struct spinlock mon_lock;static void print_serial (const char *buf) {
@@ -17,6 +18,20 @@ void puts(const char *s)spin_unlock (&lock); } +static void print_monitor (const char *buf) +{ +unsigned long len =strlen (buf); + + asmvolatile ("rep/outsb" :"+S" (buf),"+c" (len) :"d" (0xf2 )); +} + +void puts_monitor (const char *s) +{ +spin_lock (&mon_lock); +print_serial (s); +spin_unlock (&mon_lock); +} +void exit (int code) { asmvolatile ("out %0, %1" : :"a" (code),"d" ((short )0xf4 ));
lib/libcflat.h +2 -0
@@ -45,8 +45,10 @@ extern char *strcat(char *dest, const chextern int printf (const char *fmt, ...);extern int vsnprintf (char *buf,int size,const char *fmt,va_list va); +extern int monitor_printf (const char *fmt, ...);extern void puts (const char *s); +extern void puts_monitor (const char *s);extern void *memset (void *s,int c,size_t n);
lib/printf.c +13 -0
@@ -177,3 +177,16 @@ int printf(const char *fmt, ...)puts (buf);return r; } + +int monitor_printf (const char *fmt, ...) +{ +va_list va; +char buf[2000 ]; +int r; + +va_start (va, fmt); + r =vsnprintf (buf,sizeof buf, fmt, va); +va_end (va); +puts_monitor (buf); +return r; +}
PATCH 3/3 Add mce test
In reply to Marcelo TosattiTest mce injection, triggered via monitor interface.
config-x86-common.mak +3 -1
@@ -27,7 +27,7 @@ tests-common = $(TEST_DIR)/vmexit.flat $ $(TEST_DIR)/smptest.flat $(TEST_DIR)/port80.flat \ $(TEST_DIR)/realmode.flat $(TEST_DIR)/msr.flat \ $(TEST_DIR)/hypercall.flat $(TEST_DIR)/sieve.flat \ - $(TEST_DIR)/kvmclock_test.flat + $(TEST_DIR)/kvmclock_test.flat $(TEST_DIR)/mce.flat tests_and_config = $(TEST_DIR)/*.flat $(TEST_DIR)/unittests.cfg
@@ -74,6 +74,8 @@ $(TEST_DIR)/svm.flat: $(cstart.o) $(TEST $(TEST_DIR)/kvmclock_test.flat: $(cstart.o) $(TEST_DIR)/kvmclock.o \ $(TEST_DIR)/kvmclock_test.o +$(TEST_DIR)/mce.flat: $(cstart.o) $(TEST_DIR)/mce.o $(TEST_DIR)/vm.o + arch_clean: $(RM) $(TEST_DIR)/*.o $(TEST_DIR)/*.flat \ $(TEST_DIR)/.*.d $(TEST_DIR)/lib/.*.d $(TEST_DIR)/lib/*.o
x86/mce.c new file +267 -0
267 lines not on this page · raw message
Paolo Bonzini
maintainerRe: [patch 1/3] kvm test: add monitor_printf
In reply to Marcelo Tosattilib/x86/io.c void puts(const char *s) · line 31
Quoted 9 lines · Marcelo Tosatti
lib/x86/io.c +9
-0+static void print_monitor (const char *buf) +{ + [...] +} + +void puts_monitor (const char *s) +{ +spin_lock (&mon_lock); +print_serial (s);
^^^^^^^^^^^^
Is this intended?
Paolo
Re: [patch 1/3] kvm test: add monitor_printf
Quoted 12 lines · Paolo Bonzini
lib/x86/io.c void puts(const char *s) · line 31
Quoted 9 lines · Marcelo Tosatti
lib/x86/io.c +9
-0+static void print_monitor (const char *buf) +{ + [...] +} + +void puts_monitor (const char *s) +{ +spin_lock (&mon_lock); +print_serial (s);^^^^^^^^^^^^
Quoted 1 line
Is this intended?
Ouch, no, print_monitor.
Quoted 2 lines
Paolo
Re: [patch 3/3] Add mce test
In reply to Marcelo TosattiQuoted 11 lines · Marcelo Tosatti
x86/mce.c new file +11
-0+ +int main (void ) +{ +unsigned long long status, addr; +int bank; + +smp_init (); +init_idt (); +set_idt_entry (18 , do_handle_mce); + +write_cr4 (read_cr4 () |X86_CR4_MCE );
x86/mce.c line 240
Quoted 10 lines
x86/mce.c new file +10
-0+ +wrmsr (MSR_IA32_MCG_CTL , ~0ULL ); +wrmsr (MSR_IA32_MC0_CTL , ~0ULL ); + + status =MCI_STATUS_VAL |MCI_STATUS_UC ; + addr =0x7ffffff ; + bank =0 ; + ex_done =0 ; +/* mce cpu bank status mcgstatus addr misc */ +monitor_printf ("mce %d %d 0x%llx 1 0x%llx 1\n" ,0 , bank, status, addr);
Wow, this is really evil.
I guess it could be done more nicely via the api unit tests we talked about during kf2010?
Signature · 1 line
error compiling committee.c: too many arguments to function
PATCH 1/3 kvm test: add monitor_printf (v2)
In reply to Marcelo Tosattilib/x86/io.c +15 -0
@@ -2,6 +2,7 @@#include "smp.h" static struct spinlock lock; +static struct spinlock mon_lock;static void print_serial (const char *buf) {
@@ -17,6 +18,20 @@ void puts(const char *s)spin_unlock (&lock); } +static void print_monitor (const char *buf) +{ +unsigned long len =strlen (buf); + + asmvolatile ("rep/outsb" :"+S" (buf),"+c" (len) :"d" (0xf2 )); +} + +void puts_monitor (const char *s) +{ +spin_lock (&mon_lock); +print_monitor (s); +spin_unlock (&mon_lock); +} +void exit (int code) { asmvolatile ("out %0, %1" : :"a" (code),"d" ((short )0xf4 ));
lib/libcflat.h +2 -0
@@ -45,8 +45,10 @@ extern char *strcat(char *dest, const chextern int printf (const char *fmt, ...);extern int vsnprintf (char *buf,int size,const char *fmt,va_list va); +extern int monitor_printf (const char *fmt, ...);extern void puts (const char *s); +extern void puts_monitor (const char *s);extern void *memset (void *s,int c,size_t n);
lib/printf.c +13 -0
@@ -177,3 +177,16 @@ int printf(const char *fmt, ...)puts (buf);return r; } + +int monitor_printf (const char *fmt, ...) +{ +va_list va; +char buf[2000 ]; +int r; + +va_start (va, fmt); + r =vsnprintf (buf,sizeof buf, fmt, va); +va_end (va); +puts_monitor (buf); +return r; +}
Re: [patch 3/3] Add mce test
In reply to Avi KivityQuoted 25 lines · Avi Kivity
Quoted 11 lines · Marcelo Tosatti
x86/mce.c new file +11
-0+ +int main (void ) +{ +unsigned long long status, addr; +int bank; + +smp_init (); +init_idt (); +set_idt_entry (18 , do_handle_mce); + +write_cr4 (read_cr4 () |X86_CR4_MCE );x86/mce.c line 240
Quoted 10 lines
x86/mce.c new file +10
-0+ +wrmsr (MSR_IA32_MCG_CTL , ~0ULL ); +wrmsr (MSR_IA32_MC0_CTL , ~0ULL ); + + status =MCI_STATUS_VAL |MCI_STATUS_UC ; + addr =0x7ffffff ; + bank =0 ; + ex_done =0 ; +/* mce cpu bank status mcgstatus addr misc */ +monitor_printf ("mce %d %d 0x%llx 1 0x%llx 1\n" ,0 , bank, status, addr);Wow, this is really evil.
Quoted 2 lines
I guess it could be done more nicely via the api unit tests we talked about during kf2010?
I don't remember the details. What do you consider evil?
Re: [patch 3/3] Add mce test
Quoted 25 lines · Marcelo Tosatti
Quoted 24 lines · Avi Kivity
Quoted 11 lines · Marcelo Tosatti
x86/mce.c new file +11
-0+ +int main (void ) +{ +unsigned long long status, addr; +int bank; + +smp_init (); +init_idt (); +set_idt_entry (18 , do_handle_mce); + +write_cr4 (read_cr4 () |X86_CR4_MCE );x86/mce.c line 240
Quoted 10 lines
x86/mce.c new file +10
-0+ +wrmsr (MSR_IA32_MCG_CTL , ~0ULL ); +wrmsr (MSR_IA32_MC0_CTL , ~0ULL ); + + status =MCI_STATUS_VAL |MCI_STATUS_UC ; + addr =0x7ffffff ; + bank =0 ; + ex_done =0 ; +/* mce cpu bank status mcgstatus addr misc */ +monitor_printf ("mce %d %d 0x%llx 1 0x%llx 1\n" ,0 , bank, status, addr);Wow, this is really evil.
Quoted 3 lines
Quoted 2 lines
I guess it could be done more nicely via the api unit tests we talked about during kf2010?
I don't remember the details.
Map gpa:hva 1:1; map gva:gpa 1:1; do direct calls between host userspace and guest kernel.
Hope to post a patch soon.
Quoted 1 line
What do you consider evil?
Not really evil. It's a nice roundabout loop guest -> testdev -> chardev -> host -> chardev -> monitor -> kvm -> guest.
Works well, but only for features that are directly controlled via the monitor. To test save/restore (for vcpu events or fpu) we need something more direct (guest -> host userspace -> guest).
Signature · 1 line
error compiling committee.c: too many arguments to function