e976a2b997
This patch implements kvm guest kernel support for paravirtualized devices and contains two parts: o a basic virtio stub using virtio_ring and external interrupts and hypercalls o full hypercall implementation in kvm_para.h Currently we dont have PCI on s390. Making virtio_pci usable for s390 seems more complicated that providing an own stub. This virtio stub is similar to the lguest one, the memory for the descriptors and the device detection is made via additional mapped memory on top of the guest storage. We use an external interrupt with extint code 0x2603 for host->guest notification. The hypercall definition uses the diag instruction for issuing a hypercall. The parameters are written in R2-R7, the hypercall number is written in R1. This is similar to the system call ABI (svc) which can use R1 for the number and R2-R6 for the parameters. Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com> Acked-by: Martin Schwidefsky <schwidefsky@de.ibm.com> Signed-off-by: Carsten Otte <cotte@de.ibm.com> Signed-off-by: Avi Kivity <avi@qumranet.com>
53 lines
1.3 KiB
C
53 lines
1.3 KiB
C
/*
|
|
* kvm_virtio.h - definition for virtio for kvm on s390
|
|
*
|
|
* Copyright IBM Corp. 2008
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License (version 2 only)
|
|
* as published by the Free Software Foundation.
|
|
*
|
|
* Author(s): Christian Borntraeger <borntraeger@de.ibm.com>
|
|
*/
|
|
|
|
#ifndef __KVM_S390_VIRTIO_H
|
|
#define __KVM_S390_VIRTIO_H
|
|
|
|
#include <linux/types.h>
|
|
|
|
struct kvm_device_desc {
|
|
/* The device type: console, network, disk etc. Type 0 terminates. */
|
|
__u8 type;
|
|
/* The number of virtqueues (first in config array) */
|
|
__u8 num_vq;
|
|
/*
|
|
* The number of bytes of feature bits. Multiply by 2: one for host
|
|
* features and one for guest acknowledgements.
|
|
*/
|
|
__u8 feature_len;
|
|
/* The number of bytes of the config array after virtqueues. */
|
|
__u8 config_len;
|
|
/* A status byte, written by the Guest. */
|
|
__u8 status;
|
|
__u8 config[0];
|
|
};
|
|
|
|
/*
|
|
* This is how we expect the device configuration field for a virtqueue
|
|
* to be laid out in config space.
|
|
*/
|
|
struct kvm_vqconfig {
|
|
/* The token returned with an interrupt. Set by the guest */
|
|
__u64 token;
|
|
/* The address of the virtio ring */
|
|
__u64 address;
|
|
/* The number of entries in the virtio_ring */
|
|
__u16 num;
|
|
|
|
};
|
|
|
|
#define KVM_S390_VIRTIO_NOTIFY 0
|
|
#define KVM_S390_VIRTIO_RESET 1
|
|
#define KVM_S390_VIRTIO_SET_STATUS 2
|
|
|
|
#endif
|