The following items need some love. Please post to the list if you are interested in helping out:

The following items need some love. Please post to the list if you are interested in helping out:

−

* Real mode support: VT support for real mode is terrible, so we need to do it in software. This means extending the x86 emulator (x86_emulate.c) to handle more instructions, and changing the execution loop to call the emulator for real mode (in progress).

The following smaller scale tasks can be a nice entry point to someone wishing to get involved:

+

==== Networking TODO: ====

+

* Has its [[NetworkingTodo|own page]]

−

* Store command line options in an empty snapshot in a qcow2 format image file. This allows an image file to be self contained: <code><nowiki>qemu file.img</nowiki></code> should be enough to launch a fully configured virtual machine. (this is probably a bad idea--see qemu-devel/kvm-devel discussion)

+

==== PCI TODO: ====

−

* Allow all cpuid features supported by kvm to be passed to the guest; add a command line option to specifiy the cpuid explicitly to allow migration in a heterogeneous server farm. (in progress)

+

* Has its [[PCITodo|own page]]

−

* Add a Unix domain socket device. With this, the guest can talk to a pci device which is connected to a Unix domain socket on the host.

+

−

* Add a qemu interface for sharing memory between guests. Using a pci device to expose the shared memory is probably a good starting point. (this should use virtio and probably depends on mmu-notifiers)

+

−

* Allow userspace to manage which msrs are emulated as no-ops (read zero, write ignored) to hack support for some guests

* O(1) write protection by protecting the PML4Es, then on demand PDPTEs, PDEs, and PTEs

+

* Simpler variant: don't drop large ptes when write protecting; just write protect them. When taking a write fault, either drop the large pte, or convert it to small ptes and write protect those (like O(1) write protection).

+

* O(1) mmu invalidation using a generation number

−

x86 emulator updates:

+

==== x86 emulator updates: ====

−

* Trap #UD and emulate sysenter/syscall/sysret/sysexit. These instructions don't exist on all cpus in all modes, so they hinder cross-vendor migration (in progress)

+

* On-demand register access, really, copying all registers all the time is gross.

−

* Add a NonPT flag (or maybe its inverse, Paging) to instructions that are never used for page table updates (like add, sub, call). Teach the mmu to unshadow page tables if a NonPT instruction is executed on them.

+

** Can be done by adding 'available' and 'dirty' bitmasks

−

* Change the emulator initialization sequence not to read all segment registers (this is slow), instead read them on demand. On 64-bit, no segments are usually needed while on 32-bit only cs and ds are commenly required.

* Implement an operation queue for the emulator. The emulator often calls userspace to perform a read or a write, but due to inversion of control it actually restarts instead of continuing. The queue would allow it to replay all previous operations until it reaches the point it last stopped.

+

** if this is done, we can retire ->read_std() in favour of ->read_emulated().

* move init_emulate_ctxt() into x86_decode_insn() and other emulator entry points

−

Interactivity improvements:

+

==== Interactivity improvements: ====

−

* If for several frames in a row a large proportion of the framebuffer pages are

+

* If for several frames in a row a large proportion of the framebuffer pages are changing, then for the next few frames don't bother to get the dirty page log from kvm, but instead assume that all pages are dirty. This will reduce page fault overhead on highly interactive workloads.

−

changing, then for the next few frames don't bother to get the dirty page log

+

* When detecting keyboard/video/mouse activity, scale up the frame rate; when activity dies down, scale it back down (applicable to qemu as well).

−

from kvm, but instead assume that all pages are dirty. This will reduce page

+

−

fault overhead on highly interactive workloads.

+

−

* When detecting keyboard/video/mouse activity, scale up the frame rate; when

* Emulate the VT and SVM instructions, so that kvm can run in a virtual machine. Test by running a VM in a VT guest in an SVM guest on VT hardware, as well as running a VM in an SVM guest in a VT guest on SVM hardware.

+

==== For the adventurous: ====

−

* Emulate the VT and SVM instruction sets on qemu. This would be very beneficial to debugging kvm.

+

* Emulate the VMX instruction sets on qemu. This would be very beneficial to debugging kvm ( working on this - kern.devel@gmail.com ).

PCI TODO:

MMU related:

O(1) write protection by protecting the PML4Es, then on demand PDPTEs, PDEs, and PTEs

Simpler variant: don't drop large ptes when write protecting; just write protect them. When taking a write fault, either drop the large pte, or convert it to small ptes and write protect those (like O(1) write protection).

O(1) mmu invalidation using a generation number

x86 emulator updates:

On-demand register access, really, copying all registers all the time is gross.

Implement an operation queue for the emulator. The emulator often calls userspace to perform a read or a write, but due to inversion of control it actually restarts instead of continuing. The queue would allow it to replay all previous operations until it reaches the point it last stopped.

if this is done, we can retire ->read_std() in favour of ->read_emulated().

move init_emulate_ctxt() into x86_decode_insn() and other emulator entry points

Interactivity improvements:

If for several frames in a row a large proportion of the framebuffer pages are changing, then for the next few frames don't bother to get the dirty page log from kvm, but instead assume that all pages are dirty. This will reduce page fault overhead on highly interactive workloads.

When detecting keyboard/video/mouse activity, scale up the frame rate; when activity dies down, scale it back down (applicable to qemu as well).