[PATCH v3 0/9] KVM Support for MIPS32 Processors

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This patchset implements KVM support for MIPS32 processors, using Trap &
Emulation.

In KVM mode, CPU virtualization is handled via the kvm kernel module,
while system and I/O virtualization leverage the Malta model already
present in QEMU.

Both Guest kernel and Guest Userspace execute in UM. The Guest address
space is as folows:
Guest User address space:   0x00000000 -> 0x40000000
Guest Kernel Unmapped:      0x40000000 -> 0x60000000
Guest Kernel Mapped:        0x60000000 -> 0x80000000

As a result, Guest Usermode virtual memory is limited to 1GB.

KVM support (by trap and emulate) was added to the Linux kernel in
v3.10.

Changes in v3:

Changes mostly addressing review comments from v2 patchset.

A git tag for this version of the patchset can also be found on github:
https://github.com/jahogan/qemu-kvm-mips.git kvm-mips-v3

 - Remove "target-mips: Set target page size to 16K in KVM mode". It
   should actually work fine with 4k TARGET_PAGE_SIZE as long as there
   is no cache aliasing or both host and guest kernels are configured to
   a sufficient page size to avoid aliasing (which the kernel
   arch/mips/kvm/00README.txt alludes to anyway).
 - Rewrote kvm sigmask patch to allow sigmask length to be set by
   kvm_arch_init(), so that MIPS can set it to 16 as it has 128 signals.
   This is better than cluttering kvm-all.c with TARGET_* ifdefs (Peter
   Maydell).
 - Set sigmask length to 16 from kvm_arch_init() since MIPS Linux has
   128 signals. This is better than cluttering kvm_all.c with TARGET_*
   ifdefs (Peter Maydell).
 - s/dprintf/DPRINTF/ (Andreas Färber).
 - Use "cs" rather than "cpu" or "env" for CPUState variable names
   (Andreas Färber).
 - Use CPUMIPSState rather than CPUArchState (Andreas Färber).
 - Pass MIPSCPU to cpu_mips_io_interrupts_pending() rather than
   CPUMIPSState (Andreas Färber).
 - Remove spurious parentheses around cpu_mips_io_interrupts_pending()
   call (Andreas Färber).
 - Pass MIPSCPU to kvm_mips_set_[ipi_]interrupt (Andreas Färber).
 - Make use of error_report (Andreas Färber) and clean up error messages
   a little to include __func__.
 - Remove inline kvm_mips_{put,get}_one_[ul]reg() declarations from
   kvm_mips.h. They're only used in target-mips/kvm.c anyway.
 - Make kvm_arch_{put,get}_registers static within target-mips/kvm.c and
   remove from kvm_mips.h.
 - Remove unnecessary includes from Malta patch, especially linux/kvm.h
   which isn't a good idea on non-Linux (Peter Maydell).

Changes in v2:

This patchset is based on Sanjay Lal's V1 patchset from 2nd March 2013:
https://patchwork.kernel.org/project/kvm/list/?submitter=51991&state=*&q=qemu-devel

I think I've addressed all the V1 feedback. The other main change is the
removal of the boot-CPS ROM code binary blob and GIC/SMP support since
it's all slightly orthogonal to KVM support. Instead the existing
minimal bootloader code for Malta has been updated to work with KVM T&E.

A git tag for this version of the patchset can also be found on github:
https://github.com/jahogan/qemu-kvm-mips.git kvm-mips-v2

 - Expand commit messages
 - Rebase on v1.7.0
 - Misc checkpatch and other cleanups
 - Some interrupt bug fixes from Yann Le Du <ledu@xxxxxxxxxxx>
 - Add get/set register functionality from Yann Le Du <ledu@xxxxxxxxxxx>
 - Use new 64 bit compatible ABI from Cavium from Sanjay Lal
   <sanjayl@xxxxxxxxxxx>
 - Add dummy kvm_arch_init_irq_routing()
   The common KVM code insists on calling kvm_arch_init_irq_routing() as
   soon as it sees kernel header support for it (regardless of whether
   QEMU supports it). Provide a dummy function to satisfy this.
 - Remove request_interrupt_window code (Peter Maydell)
 - Remove #ifdef CONFIG_KVM where guarded by kvm_enabled() already
 - Removal of cps / GIC / SMP support
 - Minimal bootloader modified to execute safely from RAM
 - Create asm-mips symlink using generic code and move above default
   case (Peter Maydell)
 - Remove redundant check of target_name = cpu = mips
 - Remove mipsel cross compilation fix, which is now fixed by commit
   61cc919f73ea (configure: detect endian via compile test)
 - Add translation of guest kernel segments to allow an attached gdb to
   see kernel memory correctly

James Hogan (4):
  target-mips: get_physical_address: Add defines for segment bases
  target-mips: get_physical_address: Add KVM awareness
  kvm: Allow arch to set sigmask length
  hw/mips: malta: Add KVM support

Sanjay Lal (5):
  hw/mips/cputimer: Don't start periodic timer in KVM mode
  hw/mips: Add API to convert KVM guest KSEG0 <-> GPA
  target-mips: kvm: Add main KVM support for MIPS
  hw/mips: In KVM mode, inject IRQ2 (I/O) interupts via ioctls
  target-mips: Enable KVM support in build system

 configure                 |   6 +-
 hw/mips/addr.c            |  10 +
 hw/mips/cputimer.c        |  13 +-
 hw/mips/mips_int.c        |  11 ++
 hw/mips/mips_malta.c      |  82 +++++---
 include/hw/mips/cpudevs.h |   4 +
 include/sysemu/kvm.h      |   2 +
 kvm-all.c                 |  11 +-
 target-mips/Makefile.objs |   1 +
 target-mips/helper.c      |  51 +++--
 target-mips/kvm.c         | 472 ++++++++++++++++++++++++++++++++++++++++++++++
 target-mips/kvm_mips.h    |  19 ++
 12 files changed, 642 insertions(+), 40 deletions(-)
 create mode 100644 target-mips/kvm.c
 create mode 100644 target-mips/kvm_mips.h

-- 
1.8.1.2

--
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




[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux