summaryrefslogtreecommitdiffstats
Commit message (Collapse)AuthorAgeFilesLines
* tools/lguest: don't use legacy definitions for net device in example launcher.Rusty Russell2015-02-131-1/+2
| | | | Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
* virtio: Don't expose legacy net features when VIRTIO_NET_NO_LEGACY defined.Rusty Russell2015-02-131-2/+30
| | | | | | | | | | | | | In particular, the virtio header always has the u16 num_buffers field. We define a new 'struct virtio_net_hdr_v1' for this (rather than simply calling it 'struct virtio_net_hdr', to avoid nasty type errors if some parts of a project define VIRTIO_NET_NO_LEGACY and some don't. Transitional devices (which can't define VIRTIO_NET_NO_LEGACY) will have to keep using struct virtio_net_hdr_mrg_rxbuf, which has the same byte layout as struct virtio_net_hdr_v1. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
* tools/lguest: use common error macros in the example launcher.Rusty Russell2015-02-131-101/+105
| | | | Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
* tools/lguest: give virtqueues names for better error messagesRusty Russell2015-02-131-7/+12
| | | | Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
* tools/lguest: more documentation and checking of virtio 1.0 compliance.Rusty Russell2015-02-131-14/+293
| | | | | | This is from all the non-PCI parts of the spec. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
* lguest: don't look in console features to find emerg_wr.Rusty Russell2015-02-131-33/+24
| | | | | | | | | | | | | | | The 1.0 spec clearly states that you must set the ACKNOWLEDGE and DRIVER status bits before accessing the feature bits. This is a problem for the early console code, which doesn't really want to acknowledge the device (the spec specifically excepts writing to the console's emerg_wr from the usual ordering constrains). Instead, we check that the *size* of the device configuration is sufficient to hold emerg_wr: at worst (if the device doesn't support the VIRTIO_CONSOLE_F_EMERG_WRITE feature), it will ignore the writes. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
* tools/lguest: don't start devices until DRIVER_OK status set.Rusty Russell2015-02-131-8/+36
| | | | | | We were activating them with the virtqueues, and that's not allowed. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
* tools/lguest: handle indirect partway through chain.Rusty Russell2015-02-131-12/+13
| | | | | | | | Linux doesn't generate these, but it's perfectly valid according to a close reading of the spec. I opened virtio spec bug VIRTIO-134 to make this clearer there, too. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
* tools/lguest: insert driver references from the 1.0 spec (4.1 Virtio Over PCI)Rusty Russell2015-02-131-2/+57
| | | | | | | | | As a demonstration, the lguest launcher is pretty strict, trying to catch badly behaved drivers. Document this precisely. A good implementation would *NOT* crash the guest when these happened! Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
* tools/lguest: insert device references from the 1.0 spec (4.1 Virtio Over PCI)Rusty Russell2015-02-131-9/+131
| | | | | | | | There are some (optional) parts we don't implement, but this quotes all the device requirements from the spec (csd 03, but it should be the same across all released versions). Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
* tools/lguest: rename virtio_pci_cfg_cap field to match spec.Rusty Russell2015-02-131-8/+9
| | | | | | | The next patch will insert many quotes from the virtio 1.0 spec; they make most sense if we copy the spec. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
* tools/lguest: fix features_accepted logic in example launcher.Rusty Russell2015-02-131-1/+1
| | | | | | We were clearing the lower bits when setting the upper bits. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
* tools/lguest: handle device reset correctly in example launcher.Rusty Russell2015-02-131-2/+18
| | | | | | | | | | The example launcher doesn't reset the queue_enable like the spec says we have to. Plus, we should reset the size in case they negotiated a different (smaller) one. This is easy to test by unloading and reloading a virtio module. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
* virtual: Documentation: simplify and generalize paravirt_ops.txtLuis R. Rodriguez2015-02-134-138/+36
| | | | | | | | | | | | | | | | | | | | | | | | The general documentation we have for pv_ops is currenty present on the IA64 docs, but since this documentation covers IA64 xen enablement and IA64 Xen support got ripped out a while ago through commit d52eefb47 present since v3.14-rc1 lets just simplify, generalize and move the pv_ops documentation to a shared place. Cc: Isaku Yamahata <yamahata@valinux.co.jp> Cc: Jeremy Fitzhardinge <jeremy@goop.org> Cc: Chris Wright <chrisw@sous-sol.org> Cc: Alok Kataria <akataria@vmware.com> Cc: Rusty Russell <rusty@rustcorp.com.au> Cc: virtualization@lists.linux-foundation.org Cc: Tony Luck <tony.luck@intel.com> Cc: Fenghua Yu <fenghua.yu@intel.com> Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com> Cc: xen-devel@lists.xenproject.org Cc: kvm@vger.kernel.org Cc: linux-kernel@vger.kernel.org Signed-off-by: Luis R. Rodriguez <mcgrof@suse.com> Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
* lguest: remove NOTIFY call and eventfd facility.Rusty Russell2015-02-116-215/+10
| | | | | | | | | Disappointing, as this was kind of neat (especially getting to use RCU to manage the address -> eventfd mapping). But now the devices are PCI handled in userspace, we get rid of both the NOTIFY hypercall and the interface to connect an eventfd. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
* lguest: remove NOTIFY facility from demonstration launcher.Rusty Russell2015-02-111-24/+1
| | | | | | This was only used for early console, now we can get rid of it altogether. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
* lguest: use the PCI console device's emerg_wr for early boot messages.Rusty Russell2015-02-111-12/+134
| | | | | | | | | | | This involves manually checking the console device (which is always in slot 1 of bus 0) and using the window in VIRTIO_PCI_CAP_PCI_CFG to program it (as we can't map the BAR yet). We could in fact do this much earlier, but we wait for the first write from the virtio_cons_early_init() facility. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
* lguest: always put console in PCI slot #1.Rusty Russell2015-02-111-3/+3
| | | | | | This simplifies the early probe. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
* lguest: support backdoor window.Rusty Russell2015-02-111-1/+100
| | | | | | | | | | | | | | | | | | | | | | | | | | | | The VIRTIO_PCI_CAP_PCI_CFG in the PCI virtio 1.0 spec allows access to the BAR registers without mapping them. This is a compulsory feature, and we implement it here. There are some subtleties involving access widths which we should note: 4.1.4.7.1 Device Requirements: PCI configuration access capability ... Upon detecting driver write access to pci_cfg_data, the device MUST execute a write access at offset cap.offset at BAR selected by cap.bar using the first cap.length bytes from pci_cfg_data. Upon detecting driver read access to pci_cfg_data, the device MUST execute a read access of length cap.length at offset cap.offset at BAR selected by cap.bar and store the first cap.length bytes in pci_cfg_data. So, for a write, we copy into the pci_cfg_data window, then write from there out to the BAR. This works correctly if cap.length != width of write. Similarly, for a read, we read into window from the BAR then read the value from there. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
* lguest: support emerg_wr in console device in example launcher.Rusty Russell2015-02-111-3/+14
| | | | | | | This is a magic register which causes a character to be outputted: it can be used even before the device is configured. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
* lguest: remove lguest bus definitions from header.Rusty Russell2015-02-111-47/+2
| | | | Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
* lguest: remove support for lguest bus in demonstration launcher.Rusty Russell2015-02-111-333/+22
| | | | Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
* lguest: remove support for lguest bus.Rusty Russell2015-02-112-543/+0
| | | | | | The demonstration launcher now uses PCI entirely. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
* lguest: define VIRTIO_CONFIG_NO_LEGACY in example launcher.Rusty Russell2015-02-111-0/+1
| | | | | | We only support virtio 1.0 now Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
* lguest: Convert console device to virtio 1.0 PCI.Rusty Russell2015-02-111-7/+7
| | | | Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
* lguest: Convert entropy device to virtio 1.0 PCI.Rusty Russell2015-02-111-5/+7
| | | | Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
* lguest: Convert net device to virtio 1.0 PCI.Rusty Russell2015-02-111-20/+28
| | | | | | | | | The only real change here (other than using the PCI bus) is that we didn't negotiate VIRTIO_NET_F_MRG_RXBUF before, so the format of the packet header changed with virtio 1.0; we need TUNSETVNETHDRSZ on the tun fd to tell it about the extra two bytes. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
* lguest: Convert block device to virtio 1.0 PCI.Rusty Russell2015-02-111-21/+9
| | | | | | | | | We remove SCSI support (which was removed for 1.0) and VIRTIO_BLK_F_FLUSH feature flag (removed too, since it's compulsory for 1.0). The rest is mainly mechanical. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
* lguest: add a dummy PCI host bridge.Rusty Russell2015-02-111-0/+14
| | | | | | Otherwise Linux fails to find the bus. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
* lguest: fix failure to find linux/virtio_types.hRusty Russell2015-02-111-1/+7
| | | | | | | | | | | | We want to use the local kernel headers, but -I../../include/uapi leads us into a world of hurt. Instead we create a dummy include/ dir with symlinks. If we just use #include "../../include/uapi/linux/virtio_blk.h" we get: ../../include/uapi/linux/virtio_blk.h:31:32: fatal error: linux/virtio_types.h: No such file or directory #include <linux/virtio_types.h> Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
* lguest: implement virtio-PCI MMIO accesses.Rusty Russell2015-02-111-2/+490
| | | | | | | | | | For each device, We need to include the vendor capabilities to demark where virtio common, notification and ISR regions are (we put them all in BAR0). We need to handle the switching of the virtqueues using the accessors. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
* lguest: add PCI config space emulation to example launcher.Rusty Russell2015-02-111-5/+211
| | | | | | | This handles ioport 0xCF8 and 0xCFC accesses, which are used to read/write PCI device config space. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
* lguest: decode mmio accesses for PCI in example launcher.Rusty Russell2015-02-111-0/+167
| | | | | | | | We don't do anything with them yet (emulate_mmio_write and emulate_mmio_read are stubs), but we decode the instructions and search for the device they're hitting. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
* lguest: add MMIO region allocator in example launcher.Rusty Russell2015-02-111-5/+23
| | | | | | | | This is where we point our PCI BARs, so that we can intercept MMIO accesses. We tell the kernel about it so any faults in this area are directed to us. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
* lguest: Override pcibios_enable_irq/pcibios_disable_irq to our stupid PICRusty Russell2015-02-111-0/+24
| | | | | | | This lets us deliver interrupts for our emulated PCI devices using our dumb PIC, and not emulate an 8259 and PCI irq mapping tables or whatever. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
* lguest: disable ACPI explicitly.Rusty Russell2015-02-111-0/+4
| | | | | | Once we add PCI, it starts trying to manage our interrupts. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
* lguest: add iomem region, where guest page faults get sent to userspace.Rusty Russell2015-02-115-7/+58
| | | | | | This lets us implement PCI. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
* lguest: don't disable iospace.Rusty Russell2015-02-111-8/+0
| | | | | | | This no longer speeds up boot (IDE got better, I guess), but it does stop us probing for a PCI bus. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
* lguest: suppress PS/2 keyboard polling.Rusty Russell2015-02-111-0/+4
| | | | | | | | | While hacking on getting I/O out to the lguest launcher, I noticed that returning 0xFF for the PS/2 keyboard status made it spin for a while thinking there was a key pending. Fix this by returning 1 instead of 0xFF. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
* lguest: send trap 13 through to userspace.Rusty Russell2015-02-112-90/+192
| | | | | | | | | | | We copy 7 bytes at eip for userspace's instruction decode; we have to carefully handle the case where eip is at the end of a page. We can't leave this to userspace since kernel has all the page table decode logic. The decode logic moves to userspace, basically unchanged. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
* lguest: add infrastructure to check mappings.Rusty Russell2015-02-112-13/+30
| | | | | | | We normally abort the guest unconditionally when it gives us a bad address, but in the next patch we want to copy some bytes which may not be mapped. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
* lguest: add infrastructure for userspace to deliver a trap to the guest.Rusty Russell2015-02-112-0/+20
| | | | | | This is required for instruction emulation to move to userspace. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
* lguest: write more information to userspace about pending traps.Rusty Russell2015-02-116-18/+42
| | | | | | This is preparation for userspace handling MMIO and ioport accesses. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
* lguest: add operations to get/set a register from the Launcher.Rusty Russell2015-02-115-0/+108
| | | | | | | We use the ptrace API struct, and we currently don't let them set anything but the normal registers (we'd have to filter the others). Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
* lguest: have --rng read from /dev/urandom not /dev/random.Rusty Russell2015-02-111-5/+5
| | | | | | Theoretical debates aside, now it boots. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
* virtio: don't require a config space on the console device.Rusty Russell2015-02-111-1/+4
| | | | | | Strictly, it's only needed when we have features (size or multiport). Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
* virtio_pci: use 16-bit accessor for queue_enable.Rusty Russell2015-02-111-2/+2
| | | | | | | | | | | | | | Since PCI is little endian, 8-bit access might work, but the spec section is very clear on this: 4.1.3.1 Driver Requirements: PCI Device Layout The driver MUST access each field using the “natural” access method, i.e. 32-bit accesses for 32-bit fields, 16-bit accesses for 16-bit fields and 8-bit accesses for 8-bit fields. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au> Acked-by: Michael S. Tsirkin <mst@redhat.com>
* virtio: Don't expose legacy config features when VIRTIO_CONFIG_NO_LEGACY ↵Rusty Russell2015-02-111-0/+2
| | | | | | | | | | defined. The VIRTIO_F_ANY_LAYOUT and VIRTIO_F_NOTIFY_ON_EMPTY features are pre-1.0 only. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au> Acked-by: Michael S. Tsirkin <mst@redhat.com>
* virtio: Don't expose legacy block features when VIRTIO_BLK_NO_LEGACY defined.Rusty Russell2015-02-111-4/+13
| | | | | | | | This allows modern implementations to ensure they don't use legacy feature bits or SCSI commands (which are not used in v1.0 non-legacy). Signed-off-by: Rusty Russell <rusty@rustcorp.com.au> Acked-by: Michael S. Tsirkin <mst@redhat.com>
* virtio: define VIRTIO_PCI_CAP_PCI_CFG in header.Rusty Russell2015-02-111-1/+3
| | | | | | | | | | | | This provides backdoor access to the device MMIOs, and every device should have one. From the virtio 1.0 spec (CS03): 4.1.4.7.1 Device Requirements: PCI configuration access capability The device MUST present at least one VIRTIO_PCI_CAP_PCI_CFG capability. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au> Acked-by: Michael S. Tsirkin <mst@redhat.com>
OpenPOWER on IntegriCloud