From patchwork Wed Jun 11 14:01:18 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Jones X-Patchwork-Id: 4336441 Return-Path: X-Original-To: patchwork-kvm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 94A9ABEEAA for ; Wed, 11 Jun 2014 14:02:50 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 79C31201FE for ; Wed, 11 Jun 2014 14:02:48 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 3A23F2028D for ; Wed, 11 Jun 2014 14:02:46 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932394AbaFKOCk (ORCPT ); Wed, 11 Jun 2014 10:02:40 -0400 Received: from mx1.redhat.com ([209.132.183.28]:53609 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753692AbaFKOBo (ORCPT ); Wed, 11 Jun 2014 10:01:44 -0400 Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s5BE1gVm025244 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 11 Jun 2014 10:01:42 -0400 Received: from dhcp-27-201.brq.redhat.com (dhcp-1-235.brq.redhat.com [10.34.1.235]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s5BE1ZbT014365; Wed, 11 Jun 2014 10:01:41 -0400 From: Andrew Jones To: kvmarm@lists.cs.columbia.edu, kvm@vger.kernel.org Cc: christoffer.dall@linaro.org, pbonzini@redhat.com Subject: [PATCH v5 03/19] clean root dir of all x86-ness Date: Wed, 11 Jun 2014 16:01:18 +0200 Message-Id: <1402495294-30737-4-git-send-email-drjones@redhat.com> In-Reply-To: <1402495294-30737-1-git-send-email-drjones@redhat.com> References: <1402495294-30737-1-git-send-email-drjones@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Spam-Status: No, score=-7.5 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP 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 Acked-by: Christoffer Dall --- 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 | 124 ------------------------------------------- config-x86_64.mak | 14 ----- config/config-i386.mak | 12 +++++ config/config-x86-common.mak | 124 +++++++++++++++++++++++++++++++++++++++++++ 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, 324 insertions(+), 291 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 .//*.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= 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 .//*.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= +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/: architecture dependent services for the tests -./: 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/: architecture dependent services for the tests +./: the sources of the tests and the created objects/images + +See /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 84cce7065d400..0000000000000 --- a/config-x86-common.mak +++ /dev/null @@ -1,124 +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 $(TEST_DIR)/smap.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)/smap.elf: $(cstart.o) $(TEST_DIR)/smap.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..0b0da85f2a9df --- /dev/null +++ b/config/config-x86-common.mak @@ -0,0 +1,124 @@ +#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 $(TEST_DIR)/smap.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)/smap.elf: $(cstart.o) $(TEST_DIR)/smap.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