The following series implements KVM support for ARM processors, specifically on the Cortex A-15 platform. The patch series applies to commit 0ec4044a029b5ba9ed6dc7c52390c25da717e184 on Catalin Marinas' linux-arm-arch tree. This is Version 5 of the patch series, but the first two versions were reviewed outside of the KVM mailing list. Changes can also be pulled from: git://github.com/virtualopensystems/linux-kvm-arm.git kvm-a15-v5 The implementation is broken up into a logical set of patches, the first one containing a skeleton of files, makefile changes, the basic user space interface and KVM architecture specific stubs. Subsequent patches implement parts of the system as listed: 1. Skeleton 2. Identity Mapping for Hyp mode 3. Hypervisor initialization 4. Memory virtualization setup (hyp mode mappings and 2nd stage) 5. Inject IRQs and FIQs from userspace 6. World-switch implementation and Hyp exception vectors 7. Emulation framework and CP15 emulation 8. Handle guest user memory aborts 9. Handle guest MMIO aborts 10. Support guest wait-for-interrupt instructions. 11. Initial SMP host support (incomplete!) 12. Fix guest view of MPIDR 13. Initial SMP guest support (incomplete!) Testing: Limited testing, but have run GCC inside guest, which compiled a small hello-world program, which was successfully run. Hardware still unavailable, so all testing has been done on ARM Fast Models. For a guide on how to set up a testing environment and try out these patches, see: http://www.virtualopensystems.com/media/pdf/kvm-arm-guide.pdf https://wiki.linaro.org/PeterMaydell/A15OnFastModels Still on the to-do list: - Reuse VMIDs - Fix SMP host support - Fix SMP guest support - Support guest Thumb mode for MMIO emulation - Further testing - Performance improvements Changes since v4: - Addressed reviewer comments from v4 * cleanup debug and trace code * remove printks * fixup kvm_arch_vcpu_ioctl_run * add trace details to mmio emulation - Fix from Marc Zyngier: Move kvm_guest_enter/exit into non-preemptible section (squashed into world-switch patch) - Cleanup create_hyp_mappings/remove_hyp_mappings from Marc Zyngier (squashed into hypervisor initialization patch) - Removed the remove_hyp_mappings feature. Removing hypervisor mappings could potentially unmap other important data shared in the same page. - Removed the arm_ prefix from the arch-specific files. - Initial SMP host/guest support Changes since v3: - v4 actually works, fully boots a guest - Support compiling as a module - Use static inlines instead of macros for vcpu_reg and friends - Optimize kvm_vcpu_reg function - Use Ftrace for trace capabilities - Updated documentation and commenting - Use KVM_IRQ_LINE instead of KVM_INTERRUPT - Emulates load/store instructions not supported through HSR syndrome information. - Frees 2nd stage translation tables on VM teardown - Handles IRQ/FIQ instructions - Handles more CP15 accesses - Support guest WFI calls - Uses debugfs instead of /proc - Support compiling in Thumb mode Changes since v2: - Performs world-switch code - Maps guest memory using 2nd stage translation - Emulates co-processor 15 instructions - Forwards I/O faults to QEMU. --- Christoffer Dall (12): ARM: KVM: Initial skeleton to compile KVM support ARM: KVM: Hypervisor identity mapping ARM: KVM: Add hypervisor inititalization ARM: KVM: Memory virtualization setup ARM: KVM: Inject IRQs and FIQs from userspace ARM: KVM: World-switch implementation ARM: KVM: Emulation framework and CP15 emulation ARM: KVM: Handle guest faults in KVM ARM: KVM: Handle I/O aborts ARM: KVM: Guest wait-for-interrupts (WFI) support ARM: KVM: Support SMP hosts ARM: KVM: Support SMP guests Marc Zyngier (1): ARM: KVM: Fix guest view of MPIDR Documentation/virtual/kvm/api.txt | 10 arch/arm/Kconfig | 2 arch/arm/Makefile | 1 arch/arm/include/asm/kvm.h | 75 +++ arch/arm/include/asm/kvm_arm.h | 130 +++++ arch/arm/include/asm/kvm_asm.h | 51 ++ arch/arm/include/asm/kvm_emulate.h | 100 ++++ arch/arm/include/asm/kvm_host.h | 112 ++++ arch/arm/include/asm/kvm_mmu.h | 42 ++ arch/arm/include/asm/kvm_para.h | 9 arch/arm/include/asm/pgtable-3level-hwdef.h | 5 arch/arm/include/asm/pgtable-3level.h | 12 arch/arm/include/asm/pgtable.h | 11 arch/arm/include/asm/unified.h | 12 arch/arm/kernel/armksyms.c | 7 arch/arm/kernel/asm-offsets.c | 34 + arch/arm/kernel/entry-armv.S | 1 arch/arm/kvm/Kconfig | 44 ++ arch/arm/kvm/Makefile | 17 + arch/arm/kvm/arm.c | 716 +++++++++++++++++++++++++++ arch/arm/kvm/debug.h | 48 ++ arch/arm/kvm/emulate.c | 610 +++++++++++++++++++++++ arch/arm/kvm/exports.c | 26 + arch/arm/kvm/guest.c | 150 ++++++ arch/arm/kvm/init.S | 115 ++++ arch/arm/kvm/interrupts.S | 496 +++++++++++++++++++ arch/arm/kvm/mmu.c | 512 +++++++++++++++++++ arch/arm/kvm/trace.h | 138 +++++ arch/arm/mach-vexpress/Kconfig | 1 arch/arm/mm/Kconfig | 8 arch/arm/mm/idmap.c | 54 ++ arch/arm/mm/mmu.c | 3 include/linux/kvm.h | 1 mm/memory.c | 1 34 files changed, 3552 insertions(+), 2 deletions(-) create mode 100644 arch/arm/include/asm/kvm.h create mode 100644 arch/arm/include/asm/kvm_arm.h create mode 100644 arch/arm/include/asm/kvm_asm.h create mode 100644 arch/arm/include/asm/kvm_emulate.h create mode 100644 arch/arm/include/asm/kvm_host.h create mode 100644 arch/arm/include/asm/kvm_mmu.h create mode 100644 arch/arm/include/asm/kvm_para.h create mode 100644 arch/arm/kvm/Kconfig create mode 100644 arch/arm/kvm/Makefile create mode 100644 arch/arm/kvm/arm.c create mode 100644 arch/arm/kvm/debug.h create mode 100644 arch/arm/kvm/emulate.c create mode 100644 arch/arm/kvm/exports.c create mode 100644 arch/arm/kvm/guest.c create mode 100644 arch/arm/kvm/init.S create mode 100644 arch/arm/kvm/interrupts.S create mode 100644 arch/arm/kvm/mmu.c create mode 100644 arch/arm/kvm/trace.h -- -- 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