Remove all references to x86 from the root dir (except from in configure). Also remove references from the root dir README by moving that documentation to the x86/README, and touch up the READMEs at the same time. Signed-off-by: Andrew Jones <drjones@xxxxxxxxxx> --- v4: some more doc touch-ups, check for config.mak in run_tests.sh --- Makefile | 7 ++- README | 59 ++++++++------------- config-i386.mak | 13 ----- config-x86-common.mak | 122 ------------------------------------------- config-x86_64.mak | 14 ----- config/config-i386.mak | 12 +++++ config/config-x86-common.mak | 122 +++++++++++++++++++++++++++++++++++++++++++ config/config-x86_64.mak | 13 +++++ configure | 17 ++++++ docs/testdev.txt | 13 +++++ flat.lds | 21 -------- run_tests.sh | 22 ++++---- testdev.txt | 14 ----- x86-run | 41 --------------- x86/README | 59 ++++++++++++++++----- x86/flat.lds | 21 ++++++++ x86/run | 41 +++++++++++++++ 17 files changed, 322 insertions(+), 289 deletions(-) delete mode 100644 config-i386.mak delete mode 100644 config-x86-common.mak delete mode 100644 config-x86_64.mak create mode 100644 config/config-i386.mak create mode 100644 config/config-x86-common.mak create mode 100644 config/config-x86_64.mak create mode 100644 docs/testdev.txt delete mode 100644 flat.lds delete mode 100644 testdev.txt delete mode 100755 x86-run create mode 100644 x86/flat.lds create mode 100755 x86/run diff --git a/Makefile b/Makefile index 17307d1dfd760..566d2bee771e1 100644 --- a/Makefile +++ b/Makefile @@ -18,7 +18,7 @@ cflatobjs := \ lib/report.o #include architecure specific make rules -include config-$(ARCH).mak +include config/config-$(ARCH).mak # cc-option # Usage: OP_CFLAGS+=$(call cc-option, -falign-functions=0, -malign-functions=0) @@ -31,7 +31,6 @@ CFLAGS += $(autodepend-flags) -Wall CFLAGS += $(call cc-option, -fomit-frame-pointer, "") CFLAGS += $(call cc-option, -fno-stack-protector, "") CFLAGS += $(call cc-option, -fno-stack-protector-all, "") -CFLAGS += -I. CXXFLAGS += $(CFLAGS) @@ -46,11 +45,11 @@ $(libcflat): $(cflatobjs) %.o: %.S $(CC) $(CFLAGS) -c -nostdlib -o $@ $< --include .*.d */.*.d */*/.*.d +-include */.*.d */*/.*.d install: mkdir -p $(DESTDIR) install $(tests_and_config) $(DESTDIR) clean: arch_clean - $(RM) *.o *.a .*.d lib/.*.d $(libcflat) $(cflatobjs) + $(RM) lib/.*.d $(libcflat) $(cflatobjs) diff --git a/README b/README index 0f5d810738de7..e9869d12bfa20 100644 --- a/README +++ b/README @@ -1,40 +1,27 @@ This directory contains sources for a kvm test suite. -Tests for x86 architecture are run as kernel images for qemu that supports multiboot format. -Tests uses an infrastructure called from the bios code. The infrastructure initialize the system/cpu's, -switch to long-mode and calls the 'main' function of the individual test. -Tests uses a qemu's virtual test device, named testdev, for services like printing, exiting, query memory size etc. -See file testdev.txt for more details. - -To create the tests' images just type 'make' in this directory. -Tests' images created in ./<ARCH>/*.flat - -An example of a test invocation: -Using qemu-kvm: - -qemu-kvm -device testdev,chardev=testlog -chardev file,id=testlog,path=msr.out -serial stdio -kernel ./x86/msr.flat -This invocation runs the msr test case. The test outputs to stdio. - -Using qemu (supported since qemu 1.3): -qemu-system-x86_64 -enable-kvm -device pc-testdev -serial stdio -device isa-debug-exit,iobase=0xf4,iosize=0x4 -kernel ./x86/msr.flat - -Note that it's not necessary to specify the "-m" option to qemu. The default -memory size is enough. Actually, the tests infrastructure doesn't support too -much RAM anyway, so specifying a large amount of RAM may break it. - -Or use a runner script to detect the correct invocation: -./x86-run ./x86/msr.flat -To select a specific qemu binary, specify the QEMU=<path> environment: -QEMU=/tmp/qemu/x86_64-softmmu/qemu-system-x86_64 ./x86-run ./x86/msr.flat - -The exit status of the binary (and the script) is inconsistent: with -qemu-system, after the unittest is done, the exit status of qemu is 1, -different from the 'old style' qemu-kvm, whose exit status in successful -completion is 0. +To create the test images do + ./configure + make +in this directory. Test images are created in ./<ARCH>/*.flat + +Then use the runner script to detect the correct invocation and +invoke the test, e.g. + ./x86-run ./x86/msr.flat +or + ./run_tests.sh +to run them all. + +To select a specific qemu binary, specify the QEMU=<path> +environment variable, e.g. + QEMU=/tmp/qemu/x86_64-softmmu/qemu-system-x86_64 ./x86-run ./x86/msr.flat Directory structure: -.: Makefile and config files for the tests -./lib: general services for the tests -./lib/<ARCH>: architecture dependent services for the tests -./<ARCH>: the sources of the tests and the created objects/images - +.: configure script, top-level Makefile, and run_tests.sh +./config: collection of architecture dependent makefiles +./docs: documentation files +./lib: general architecture neutral services for the tests +./lib/<ARCH>: architecture dependent services for the tests +./<ARCH>: the sources of the tests and the created objects/images + +See <ARCH>/README for architecture specific documentation. diff --git a/config-i386.mak b/config-i386.mak deleted file mode 100644 index de52f3d53cff8..0000000000000 --- a/config-i386.mak +++ /dev/null @@ -1,13 +0,0 @@ -TEST_DIR=x86 -cstart.o = $(TEST_DIR)/cstart.o -bits = 32 -ldarch = elf32-i386 -CFLAGS += -D__i386__ -CFLAGS += -I $(KERNELDIR)/include - -tests = $(TEST_DIR)/taskswitch.flat $(TEST_DIR)/taskswitch2.flat - -include config-x86-common.mak - -$(TEST_DIR)/taskswitch.elf: $(cstart.o) $(TEST_DIR)/taskswitch.o -$(TEST_DIR)/taskswitch2.elf: $(cstart.o) $(TEST_DIR)/taskswitch2.o diff --git a/config-x86-common.mak b/config-x86-common.mak deleted file mode 100644 index 5815a9a0302c8..0000000000000 --- a/config-x86-common.mak +++ /dev/null @@ -1,122 +0,0 @@ -#This is a make file with common rules for both x86 & x86-64 - -all: test_cases - -cflatobjs += lib/x86/io.o -cflatobjs += lib/x86/smp.o -cflatobjs += lib/x86/vm.o -cflatobjs += lib/x86/fwcfg.o -cflatobjs += lib/x86/apic.o -cflatobjs += lib/x86/atomic.o -cflatobjs += lib/x86/desc.o -cflatobjs += lib/x86/isr.o -cflatobjs += lib/x86/pci.o - -$(libcflat): LDFLAGS += -nostdlib -$(libcflat): CFLAGS += -ffreestanding -I lib - -CFLAGS += -m$(bits) -CFLAGS += -O1 - -libgcc := $(shell $(CC) -m$(bits) --print-libgcc-file-name) - -FLATLIBS = lib/libcflat.a $(libgcc) -%.elf: %.o $(FLATLIBS) flat.lds - $(CC) $(CFLAGS) -nostdlib -o $@ -Wl,-T,flat.lds \ - $(filter %.o, $^) $(FLATLIBS) - -%.flat: %.elf - $(OBJCOPY) -O elf32-i386 $^ $@ - -tests-common = $(TEST_DIR)/vmexit.flat $(TEST_DIR)/tsc.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)/eventinj.flat \ - $(TEST_DIR)/s3.flat $(TEST_DIR)/pmu.flat \ - $(TEST_DIR)/tsc_adjust.flat $(TEST_DIR)/asyncpf.flat \ - $(TEST_DIR)/init.flat - -ifdef API -tests-common += api/api-sample -tests-common += api/dirty-log -tests-common += api/dirty-log-perf -endif - -tests_and_config = $(TEST_DIR)/*.flat $(TEST_DIR)/unittests.cfg - -test_cases: $(tests-common) $(tests) - -$(TEST_DIR)/%.o: CFLAGS += -std=gnu99 -ffreestanding -I lib -I lib/x86 - -$(TEST_DIR)/access.elf: $(cstart.o) $(TEST_DIR)/access.o - -$(TEST_DIR)/hypercall.elf: $(cstart.o) $(TEST_DIR)/hypercall.o - -$(TEST_DIR)/sieve.elf: $(cstart.o) $(TEST_DIR)/sieve.o - -$(TEST_DIR)/vmexit.elf: $(cstart.o) $(TEST_DIR)/vmexit.o - -$(TEST_DIR)/smptest.elf: $(cstart.o) $(TEST_DIR)/smptest.o - -$(TEST_DIR)/emulator.elf: $(cstart.o) $(TEST_DIR)/emulator.o - -$(TEST_DIR)/port80.elf: $(cstart.o) $(TEST_DIR)/port80.o - -$(TEST_DIR)/tsc.elf: $(cstart.o) $(TEST_DIR)/tsc.o - -$(TEST_DIR)/tsc_adjust.elf: $(cstart.o) $(TEST_DIR)/tsc_adjust.o - -$(TEST_DIR)/apic.elf: $(cstart.o) $(TEST_DIR)/apic.o - -$(TEST_DIR)/init.elf: $(cstart.o) $(TEST_DIR)/init.o - -$(TEST_DIR)/realmode.elf: $(TEST_DIR)/realmode.o - $(CC) -m32 -nostdlib -o $@ -Wl,-T,$(TEST_DIR)/realmode.lds $^ - -$(TEST_DIR)/realmode.o: bits = 32 - -$(TEST_DIR)/msr.elf: $(cstart.o) $(TEST_DIR)/msr.o - -$(TEST_DIR)/idt_test.elf: $(cstart.o) $(TEST_DIR)/idt_test.o - -$(TEST_DIR)/xsave.elf: $(cstart.o) $(TEST_DIR)/xsave.o - -$(TEST_DIR)/rmap_chain.elf: $(cstart.o) $(TEST_DIR)/rmap_chain.o - -$(TEST_DIR)/svm.elf: $(cstart.o) $(TEST_DIR)/svm.o - -$(TEST_DIR)/kvmclock_test.elf: $(cstart.o) $(TEST_DIR)/kvmclock.o \ - $(TEST_DIR)/kvmclock_test.o - -$(TEST_DIR)/eventinj.elf: $(cstart.o) $(TEST_DIR)/eventinj.o - -$(TEST_DIR)/s3.elf: $(cstart.o) $(TEST_DIR)/s3.o - -$(TEST_DIR)/pmu.elf: $(cstart.o) $(TEST_DIR)/pmu.o - -$(TEST_DIR)/asyncpf.elf: $(cstart.o) $(TEST_DIR)/asyncpf.o - -$(TEST_DIR)/pcid.elf: $(cstart.o) $(TEST_DIR)/pcid.o - -$(TEST_DIR)/vmx.elf: $(cstart.o) $(TEST_DIR)/vmx.o $(TEST_DIR)/vmx_tests.o - -$(TEST_DIR)/debug.elf: $(cstart.o) $(TEST_DIR)/debug.o - -arch_clean: - $(RM) $(TEST_DIR)/*.o $(TEST_DIR)/*.flat $(TEST_DIR)/*.elf \ - $(TEST_DIR)/.*.d lib/x86/.*.d - -api/%.o: CFLAGS += -m32 - -api/%: LDLIBS += -lstdc++ -lboost_thread-mt -lpthread -lrt -api/%: LDFLAGS += -m32 - -api/libapi.a: api/kvmxx.o api/identity.o api/exception.o api/memmap.o - $(AR) rcs $@ $^ - -api/api-sample: api/api-sample.o api/libapi.a - -api/dirty-log: api/dirty-log.o api/libapi.a - -api/dirty-log-perf: api/dirty-log-perf.o api/libapi.a diff --git a/config-x86_64.mak b/config-x86_64.mak deleted file mode 100644 index a9a2a9e87c3a6..0000000000000 --- a/config-x86_64.mak +++ /dev/null @@ -1,14 +0,0 @@ -TEST_DIR=x86 -cstart.o = $(TEST_DIR)/cstart64.o -bits = 64 -ldarch = elf64-x86-64 -CFLAGS += -D__x86_64__ - -tests = $(TEST_DIR)/access.flat $(TEST_DIR)/apic.flat \ - $(TEST_DIR)/emulator.flat $(TEST_DIR)/idt_test.flat \ - $(TEST_DIR)/xsave.flat $(TEST_DIR)/rmap_chain.flat \ - $(TEST_DIR)/pcid.flat $(TEST_DIR)/debug.flat -tests += $(TEST_DIR)/svm.flat -tests += $(TEST_DIR)/vmx.flat - -include config-x86-common.mak diff --git a/config/config-i386.mak b/config/config-i386.mak new file mode 100644 index 0000000000000..82fed0f5a48b0 --- /dev/null +++ b/config/config-i386.mak @@ -0,0 +1,12 @@ +cstart.o = $(TEST_DIR)/cstart.o +bits = 32 +ldarch = elf32-i386 +CFLAGS += -D__i386__ +CFLAGS += -I $(KERNELDIR)/include + +tests = $(TEST_DIR)/taskswitch.flat $(TEST_DIR)/taskswitch2.flat + +include config/config-x86-common.mak + +$(TEST_DIR)/taskswitch.elf: $(cstart.o) $(TEST_DIR)/taskswitch.o +$(TEST_DIR)/taskswitch2.elf: $(cstart.o) $(TEST_DIR)/taskswitch2.o diff --git a/config/config-x86-common.mak b/config/config-x86-common.mak new file mode 100644 index 0000000000000..735c43a73c0b3 --- /dev/null +++ b/config/config-x86-common.mak @@ -0,0 +1,122 @@ +#This is a make file with common rules for both x86 & x86-64 + +all: test_cases + +cflatobjs += lib/x86/io.o +cflatobjs += lib/x86/smp.o +cflatobjs += lib/x86/vm.o +cflatobjs += lib/x86/fwcfg.o +cflatobjs += lib/x86/apic.o +cflatobjs += lib/x86/atomic.o +cflatobjs += lib/x86/desc.o +cflatobjs += lib/x86/isr.o +cflatobjs += lib/x86/pci.o + +$(libcflat): LDFLAGS += -nostdlib +$(libcflat): CFLAGS += -ffreestanding -I lib + +CFLAGS += -m$(bits) +CFLAGS += -O1 + +libgcc := $(shell $(CC) -m$(bits) --print-libgcc-file-name) + +FLATLIBS = lib/libcflat.a $(libgcc) +%.elf: %.o $(FLATLIBS) x86/flat.lds + $(CC) $(CFLAGS) -nostdlib -o $@ -Wl,-T,x86/flat.lds \ + $(filter %.o, $^) $(FLATLIBS) + +%.flat: %.elf + $(OBJCOPY) -O elf32-i386 $^ $@ + +tests-common = $(TEST_DIR)/vmexit.flat $(TEST_DIR)/tsc.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)/eventinj.flat \ + $(TEST_DIR)/s3.flat $(TEST_DIR)/pmu.flat \ + $(TEST_DIR)/tsc_adjust.flat $(TEST_DIR)/asyncpf.flat \ + $(TEST_DIR)/init.flat + +ifdef API +tests-common += api/api-sample +tests-common += api/dirty-log +tests-common += api/dirty-log-perf +endif + +tests_and_config = $(TEST_DIR)/*.flat $(TEST_DIR)/unittests.cfg + +test_cases: $(tests-common) $(tests) + +$(TEST_DIR)/%.o: CFLAGS += -std=gnu99 -ffreestanding -I lib -I lib/x86 + +$(TEST_DIR)/access.elf: $(cstart.o) $(TEST_DIR)/access.o + +$(TEST_DIR)/hypercall.elf: $(cstart.o) $(TEST_DIR)/hypercall.o + +$(TEST_DIR)/sieve.elf: $(cstart.o) $(TEST_DIR)/sieve.o + +$(TEST_DIR)/vmexit.elf: $(cstart.o) $(TEST_DIR)/vmexit.o + +$(TEST_DIR)/smptest.elf: $(cstart.o) $(TEST_DIR)/smptest.o + +$(TEST_DIR)/emulator.elf: $(cstart.o) $(TEST_DIR)/emulator.o + +$(TEST_DIR)/port80.elf: $(cstart.o) $(TEST_DIR)/port80.o + +$(TEST_DIR)/tsc.elf: $(cstart.o) $(TEST_DIR)/tsc.o + +$(TEST_DIR)/tsc_adjust.elf: $(cstart.o) $(TEST_DIR)/tsc_adjust.o + +$(TEST_DIR)/apic.elf: $(cstart.o) $(TEST_DIR)/apic.o + +$(TEST_DIR)/init.elf: $(cstart.o) $(TEST_DIR)/init.o + +$(TEST_DIR)/realmode.elf: $(TEST_DIR)/realmode.o + $(CC) -m32 -nostdlib -o $@ -Wl,-T,$(TEST_DIR)/realmode.lds $^ + +$(TEST_DIR)/realmode.o: bits = 32 + +$(TEST_DIR)/msr.elf: $(cstart.o) $(TEST_DIR)/msr.o + +$(TEST_DIR)/idt_test.elf: $(cstart.o) $(TEST_DIR)/idt_test.o + +$(TEST_DIR)/xsave.elf: $(cstart.o) $(TEST_DIR)/xsave.o + +$(TEST_DIR)/rmap_chain.elf: $(cstart.o) $(TEST_DIR)/rmap_chain.o + +$(TEST_DIR)/svm.elf: $(cstart.o) $(TEST_DIR)/svm.o + +$(TEST_DIR)/kvmclock_test.elf: $(cstart.o) $(TEST_DIR)/kvmclock.o \ + $(TEST_DIR)/kvmclock_test.o + +$(TEST_DIR)/eventinj.elf: $(cstart.o) $(TEST_DIR)/eventinj.o + +$(TEST_DIR)/s3.elf: $(cstart.o) $(TEST_DIR)/s3.o + +$(TEST_DIR)/pmu.elf: $(cstart.o) $(TEST_DIR)/pmu.o + +$(TEST_DIR)/asyncpf.elf: $(cstart.o) $(TEST_DIR)/asyncpf.o + +$(TEST_DIR)/pcid.elf: $(cstart.o) $(TEST_DIR)/pcid.o + +$(TEST_DIR)/vmx.elf: $(cstart.o) $(TEST_DIR)/vmx.o $(TEST_DIR)/vmx_tests.o + +$(TEST_DIR)/debug.elf: $(cstart.o) $(TEST_DIR)/debug.o + +arch_clean: + $(RM) $(TEST_DIR)/*.o $(TEST_DIR)/*.flat $(TEST_DIR)/*.elf \ + $(TEST_DIR)/.*.d lib/x86/.*.d + +api/%.o: CFLAGS += -m32 + +api/%: LDLIBS += -lstdc++ -lboost_thread-mt -lpthread -lrt +api/%: LDFLAGS += -m32 + +api/libapi.a: api/kvmxx.o api/identity.o api/exception.o api/memmap.o + $(AR) rcs $@ $^ + +api/api-sample: api/api-sample.o api/libapi.a + +api/dirty-log: api/dirty-log.o api/libapi.a + +api/dirty-log-perf: api/dirty-log-perf.o api/libapi.a diff --git a/config/config-x86_64.mak b/config/config-x86_64.mak new file mode 100644 index 0000000000000..d69252f3d35b1 --- /dev/null +++ b/config/config-x86_64.mak @@ -0,0 +1,13 @@ +cstart.o = $(TEST_DIR)/cstart64.o +bits = 64 +ldarch = elf64-x86-64 +CFLAGS += -D__x86_64__ + +tests = $(TEST_DIR)/access.flat $(TEST_DIR)/apic.flat \ + $(TEST_DIR)/emulator.flat $(TEST_DIR)/idt_test.flat \ + $(TEST_DIR)/xsave.flat $(TEST_DIR)/rmap_chain.flat \ + $(TEST_DIR)/pcid.flat $(TEST_DIR)/debug.flat +tests += $(TEST_DIR)/svm.flat +tests += $(TEST_DIR)/vmx.flat + +include config/config-x86-common.mak diff --git a/configure b/configure index d0c62e24dd1d2..6cfc64943f6e6 100755 --- a/configure +++ b/configure @@ -15,6 +15,7 @@ usage() { Usage: $0 [options] Options include: + --test-dir=DIR the main directory for tests ($arch) --arch=ARCH architecture to compile for ($arch) --cross-prefix=PREFIX cross compiler prefix --cc=CC c compiler to use ($cc) @@ -33,6 +34,9 @@ while [[ "$1" = -* ]]; do opt="${opt%%=*}" fi case "$opt" in + --test-dir) + testdir="$arg" + ;; --prefix) prefix="$arg" ;; @@ -62,6 +66,18 @@ while [[ "$1" = -* ]]; do ;; esac done +if [ -z "$testdir" -a \( "$arch" = "i386" -o "$arch" = "x86_64" \) ]; then + testdir=x86 +elif [ -z "$testdir" ]; then + testdir=$arch +fi +if [ ! -d $testdir ]; then + echo "$testdir does not exist!" + exit 1 +fi +if [ -f $testdir/run ]; then + ln -fs $testdir/run $testdir-run +fi # check for dependent 32 bit libraries cat << EOF > lib_test.c @@ -89,4 +105,5 @@ LD=$cross_prefix$ld OBJCOPY=$cross_prefix$objcopy AR=$cross_prefix$ar API=$api +TEST_DIR=$testdir EOF diff --git a/docs/testdev.txt b/docs/testdev.txt new file mode 100644 index 0000000000000..854fe20d56f66 --- /dev/null +++ b/docs/testdev.txt @@ -0,0 +1,13 @@ +This file describes the virtual device of qemu for supporting this +test suite. + +Services supplied by the testdev device: + serial output: write-only, on io port 0xf1 + exit process: write-only, on io port 0xf4, value used as + the exit code + ram size: read-only, on io port 0xd1, 4 bytes' size + irq line setting: write-only, on io ports 0x2000 - 0x2018, + value to set/clear + simple io: read/write, on io port 0xe0, 1/2/4 bytes + +The test device uses a char device for actual output. diff --git a/flat.lds b/flat.lds deleted file mode 100644 index a278b56c9a4e3..0000000000000 --- a/flat.lds +++ /dev/null @@ -1,21 +0,0 @@ -SECTIONS -{ - . = 4M + SIZEOF_HEADERS; - stext = .; - .text : { *(.init) *(.text) *(.text.*) } - . = ALIGN(4K); - .data : { - *(.data) - exception_table_start = .; - *(.data.ex) - exception_table_end = .; - } - . = ALIGN(16); - .rodata : { *(.rodata) } - . = ALIGN(16); - .bss : { *(.bss) } - . = ALIGN(4K); - edata = .; -} - -ENTRY(start) diff --git a/run_tests.sh b/run_tests.sh index b077091da18b3..4758573183ba7 100755 --- a/run_tests.sh +++ b/run_tests.sh @@ -1,8 +1,13 @@ #!/bin/bash -testroot=x86 -config=$testroot/unittests.cfg -qemu=${qemu:-qemu-system-x86_64} +if [ ! -f config.mak ]; then + echo "run ./configure && make first. See ./configure -h" + exit +fi +source config.mak + +config=$TEST_DIR/unittests.cfg +qemu=${QEMU:-qemu-system-$ARCH} verbose=0 function run() @@ -27,7 +32,7 @@ function run() return fi - cmdline="./x86-run $kernel -smp $smp $opts" + cmdline="./$TEST_DIR-run $kernel -smp $smp $opts" if [ $verbose != 0 ]; then echo $cmdline fi @@ -65,7 +70,7 @@ function run_all() groups="" arch="" elif [[ $line =~ ^file\ *=\ *(.*)$ ]]; then - kernel=$testroot/${BASH_REMATCH[1]} + kernel=$TEST_DIR/${BASH_REMATCH[1]} elif [[ $line =~ ^smp\ *=\ *(.*)$ ]]; then smp=${BASH_REMATCH[1]} elif [[ $line =~ ^extra_params\ *=\ *(.*)$ ]]; then @@ -92,15 +97,12 @@ Usage: $0 [-g group] [-h] [-v] -h: Output this help text -v: Enables verbose mode -Set the environment variable QEMU=/path/to/qemu-system-x86_64 to -specify the appropriate qemu binary for x86-run. +Set the environment variable QEMU=/path/to/qemu-system-ARCH to +specify the appropriate qemu binary for ARCH-run. EOF } -# As it happens, config.mak is valid shell script code, too :-) -source config.mak - echo > test.log while getopts "g:hv" opt; do case $opt in diff --git a/testdev.txt b/testdev.txt deleted file mode 100644 index ac436efadb633..0000000000000 --- a/testdev.txt +++ /dev/null @@ -1,14 +0,0 @@ -This file describes the virtual device of qemu for supporting this test suite. - -Services supplied by the testdev device: - -serial output: write only, on io port 0xf1 -exit process: write only, on io port 0xf4, value used as exit code -ram size: read-only, on io port 0xd1, 4 bytes' size -irq line setting: write only, on io ports 0x2000 - 0x2018, value to set/clear -simple io: read/write, on io port 0xe0, 1/2/4 bytes - -Test device used a char device for actual output - - - diff --git a/x86-run b/x86-run deleted file mode 100755 index 646c5770ed03f..0000000000000 --- a/x86-run +++ /dev/null @@ -1,41 +0,0 @@ -#!/bin/bash - -qemukvm="${QEMU:-qemu-kvm}" -qemusystem="${QEMU:-qemu-system-x86_64}" -if - ${qemukvm} -device '?' 2>&1 | grep -F -e \"testdev\" -e \"pc-testdev\" > /dev/null; -then - qemu="${qemukvm}" -else - if - ${qemusystem} -device '?' 2>&1 | grep -F -e \"testdev\" -e \"pc-testdev\" > /dev/null; - then - qemu="${qemusystem}" - else - echo QEMU binary ${QEMU} has no support for test device. Exiting. - exit 2 - fi -fi - -if - ${qemu} -device '?' 2>&1 | grep -F "pci-testdev" > /dev/null; -then - pci_testdev="-device pci-testdev" -else - pci_testdev="" -fi - -if - ${qemu} -device '?' 2>&1 | grep -F "pc-testdev" > /dev/null; -then - pc_testdev="-device pc-testdev -device isa-debug-exit,iobase=0xf4,iosize=0x4" -else - pc_testdev="-device testdev,chardev=testlog -chardev file,id=testlog,path=msr.out" -fi - -command="${qemu} -enable-kvm $pc_testdev -display none -serial stdio $pci_testdev -kernel" -echo ${command} "$@" -${command} "$@" -ret=$? -echo Return value from qemu: $ret -exit $ret diff --git a/x86/README b/x86/README index d644abdf31708..996ed33546d62 100644 --- a/x86/README +++ b/x86/README @@ -1,16 +1,47 @@ + +Tests for the x86 architecture are run as kernel images for qemu that support +multiboot format. The tests use an infrastructure called from the bios code. +The infrastructure initialize the system/cpus, switches to long-mode, and +calls the 'main' function of the individual test. Tests use a qemu virtual +test device, named testdev, for services like printing, exiting, querying +memory size, etc. See file docs/testdev.txt for more details. + +Examples of a test invocation: + These invocations run the msr test case and outputs to stdio. + + Using qemu-kvm: + + qemu-kvm -device testdev,chardev=testlog \ + -chardev file,id=testlog,path=msr.out \ + -serial stdio -kernel ./x86/msr.flat + + Using qemu (supported since qemu 1.3): + + qemu-system-x86_64 -enable-kvm -device pc-testdev -serial stdio \ + -device isa-debug-exit,iobase=0xf4,iosize=0x4 \ + -kernel ./x86/msr.flat + Tests in this directory and what they do: + access: lots of page table related access (pte/pde) (read/write) + apic: enable x2apic, self ipi, ioapic intr, ioapic simultaneous + emulator: move to/from regs, cmps, push, pop, to/from cr8, smsw and lmsw + hypercall: intel and amd hypercall insn + msr: write to msr (only KERNEL_GS_BASE for now) + port80: lots of out to port 80 + realmode: goes back to realmode, shld, push/pop, mov immediate, cmp + immediate, add immediate, io, eflags instructions + (clc, cli, etc.), jcc short, jcc near, call, long jmp, xchg + sieve: heavy memory access with no paging and with paging static and + with paging vmalloc'ed + smptest: run smp_id() on every cpu and compares return value to number + tsc: write to tsc(0) and write to tsc(100000000000) and read it back + vmexit: long loops for each: cpuid, vmcall, mov_from_cr8, mov_to_cr8, + inl_pmtimer, ipi, ipi+halt + kvmclock_test: test of wallclock, monotonic cycle and performance of kvmclock + pcid: basic functionality test of PCID/INVPCID feature -access: lots of page table related access (pte/pde) (read/write) -apic: enable x2apic, self ipi, ioapic intr, ioapic simultaneous -emulator: move to/from regs, cmps, push, pop, to/from cr8, smsw and lmsw -hypercall: intel and amd hypercall insn -msr: write to msr (only KERNEL_GS_BASE for now) -port80: lots of out to port 80 -realmode: goes back to realmode, shld, push/pop, mov immediate, cmp immediate, add immediate, - io, eflags instructions (clc, cli, etc.), jcc short, jcc near, call, long jmp, xchg -sieve: heavy memory access with no paging and with paging static and with paging vmalloc'ed -smptest: run smp_id() on every cpu and compares return value to number -tsc: write to tsc(0) and write to tsc(100000000000) and read it back -vmexit: long loops for each: cpuid, vmcall, mov_from_cr8, mov_to_cr8, inl_pmtimer, ipi, ipi+halt -kvmclock_test: test of wallclock, monotonic cycle and performance of kvmclock -pcid: basic functionality test of PCID/INVPCID feature \ No newline at end of file +Legacy notes: + The exit status of the binary (and the script) is inconsistent: with + qemu-system, after the unit-test is done, the exit status of qemu is 1, + different from the 'old style' qemu-kvm, whose exit status in successful + completion is 0. diff --git a/x86/flat.lds b/x86/flat.lds new file mode 100644 index 0000000000000..a278b56c9a4e3 --- /dev/null +++ b/x86/flat.lds @@ -0,0 +1,21 @@ +SECTIONS +{ + . = 4M + SIZEOF_HEADERS; + stext = .; + .text : { *(.init) *(.text) *(.text.*) } + . = ALIGN(4K); + .data : { + *(.data) + exception_table_start = .; + *(.data.ex) + exception_table_end = .; + } + . = ALIGN(16); + .rodata : { *(.rodata) } + . = ALIGN(16); + .bss : { *(.bss) } + . = ALIGN(4K); + edata = .; +} + +ENTRY(start) diff --git a/x86/run b/x86/run new file mode 100755 index 0000000000000..646c5770ed03f --- /dev/null +++ b/x86/run @@ -0,0 +1,41 @@ +#!/bin/bash + +qemukvm="${QEMU:-qemu-kvm}" +qemusystem="${QEMU:-qemu-system-x86_64}" +if + ${qemukvm} -device '?' 2>&1 | grep -F -e \"testdev\" -e \"pc-testdev\" > /dev/null; +then + qemu="${qemukvm}" +else + if + ${qemusystem} -device '?' 2>&1 | grep -F -e \"testdev\" -e \"pc-testdev\" > /dev/null; + then + qemu="${qemusystem}" + else + echo QEMU binary ${QEMU} has no support for test device. Exiting. + exit 2 + fi +fi + +if + ${qemu} -device '?' 2>&1 | grep -F "pci-testdev" > /dev/null; +then + pci_testdev="-device pci-testdev" +else + pci_testdev="" +fi + +if + ${qemu} -device '?' 2>&1 | grep -F "pc-testdev" > /dev/null; +then + pc_testdev="-device pc-testdev -device isa-debug-exit,iobase=0xf4,iosize=0x4" +else + pc_testdev="-device testdev,chardev=testlog -chardev file,id=testlog,path=msr.out" +fi + +command="${qemu} -enable-kvm $pc_testdev -display none -serial stdio $pci_testdev -kernel" +echo ${command} "$@" +${command} "$@" +ret=$? +echo Return value from qemu: $ret +exit $ret -- 1.8.1.4 -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html