ARMv8.3 added support for nested virtualization, which makes it possible for a hypervisor to run another hypervisor as a guest. Support for nested virtualization is being worked on in KVM [1]. This patch series aims to make it possible for kvm-unit-tests to run at EL2 under KVM. The focus has been on having all the infrastructure in place to run at EL2, and not on adding comprehensive tests for this Exception Level. All existing tests that fulfill KVM's requirements for a nested guest (the architecture is arm64 and they use GICv3) will be able to be run at EL2. To keep the changes minimal, kvm-unit-tests will run with VHE enabled when it detects that has been booted at EL2. Functions for enabling and disabling VHE have been added, with the aim to let the user specify to disable VHE for a given test via command-line parameters. At the moment, only the timer test has been modified to run with VHE disabled. The series are firmly an RFC because: * The patches that implement KVM nested support are themselves in the RFC phase. * Some tests don't complete because of bugs in the current version of the KVM patches. Where appropriate, I will provide fixes to allow the tests to finish, however those fixes are my own have not been reviewed in any way. Use at your own risk. To run the tests, one obviously needs KVM with nested virtualization support from [2]. These patches have been tested from commit 78c66132035c ("arm64: KVM: nv: Allow userspace to request KVM_ARM_VCPU_NESTED_VIRT"), on top of which the following patches have been cherry-picked from upstream Linux: * b4a1583abc83 ("KVM: arm/arm64: Fix emulated ptimer irq injection") * 16e604a437c8 ("KVM: arm/arm64: vgic: Reevaluate level sensitive interrupts on enable") Without those two patches some timer tests will fail. A version of kvmtool that knows about nested virtualization is also needed [3]. The kvmtool --nested parameter is required for releasing a guest at EL2. For example, to run the newly added selftest-el2 test: lkvm -f selftest.flat -c 2 -m 128 -p el2 --nested --console serial \ --irqchip gicv3 Changes in v2: * Gathered Reviewed-by tags. * Implemented review comments (more details in the specific patches). * Patch #1 was remove and I've added 4 new patches: #1 removes the obsolete CPU_OFF parameter; #4 implements a TODO from arm's flush_tlb_all; #10 fixes asm_mmu_enable; #11 replaces an expensive and unnecessary TLBI with the correct one. Summary of the patches: * Patches 1-13 are various fixes or enhancements and can be merged without the rest of the series. * Patches 14-16 add support for running at EL2. A basic selftest-el2 test is added that targets EL2. * Patches 17-19 add support for disabling VHE. The timer and selftest-el2 tests are modified to use this feature. [1] https://www.spinics.net/lists/arm-kernel/msg736687.html [2] git://git.kernel.org/pub/scm/linux/kernel/git/maz/arm-platforms.git kvm-arm64/nv-wip-5.2-rc5 [3] git://linux-arm.org/kvmtool.git nv/nv-wip-5.2-rc5 Alexandru Elisei (19): lib: arm/arm64: Remove unused CPU_OFF parameter arm/arm64: psci: Don't run C code without stack or vectors lib: arm/arm64: Add missing include for alloc_page.h in pgtable.h lib: arm: Implement flush_tlb_all arm/arm64: selftest: Add prefetch abort test arm64: timer: Write to ICENABLER to disable timer IRQ arm64: timer: EOIR the interrupt after masking the timer arm64: timer: Test behavior when timer disabled or masked lib: arm/arm64: Refuse to disable the MMU with non-identity stack pointer arm/arm64: Perform dcache clean + invalidate after turning MMU off arm/cstart64.S: Downgrade TLBI to non-shareable in asm_mmu_enable arm/arm64: Invalidate TLB before enabling MMU lib: Add _UL and _ULL definitions to linux/const.h lib: arm64: Run existing tests at EL2 arm64: timer: Add test for EL2 timers arm64: selftest: Add basic test for EL2 lib: arm64: Add support for disabling and re-enabling VHE arm64: selftest: Expand EL2 test to disable and re-enable VHE arm64: timer: Run tests with VHE disabled lib/linux/const.h | 7 +- lib/arm/asm/gic-v3.h | 1 + lib/arm/asm/gic.h | 1 + lib/arm/asm/mmu.h | 7 +- lib/arm/asm/pgtable.h | 1 + lib/arm/asm/processor.h | 6 + lib/arm/asm/psci.h | 1 + lib/arm64/asm/esr.h | 5 + lib/arm64/asm/mmu.h | 11 +- lib/arm64/asm/pgtable-hwdef.h | 79 +++++--- lib/arm64/asm/pgtable.h | 1 + lib/arm64/asm/processor.h | 34 ++++ lib/arm64/asm/sysreg.h | 28 +++ lib/arm/mmu.c | 5 +- lib/arm/processor.c | 10 + lib/arm/psci.c | 47 ++++- lib/arm/setup.c | 7 + lib/arm64/processor.c | 54 +++++- arm/cstart.S | 33 ++++ arm/cstart64.S | 243 +++++++++++++++++++++++- arm/micro-bench.c | 17 +- arm/psci.c | 5 +- arm/selftest.c | 188 +++++++++++++++++-- arm/timer.c | 340 ++++++++++++++++++++++++++++++---- arm/unittests.cfg | 8 + 25 files changed, 1048 insertions(+), 91 deletions(-) -- 2.20.1 _______________________________________________ kvmarm mailing list kvmarm@xxxxxxxxxxxxxxxxxxxxx https://lists.cs.columbia.edu/mailman/listinfo/kvmarm