mirror of
https://github.com/qemu/qemu.git
synced 2024-12-04 09:13:39 +08:00
xen-20160622
-----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABAgAGBQJXanp0AAoJEIlPj0hw4a6Qq8gQAMDIhehsd67u437Hddcz9XI7 9UdUOvRBq5+nqtKkmcoVIfONGAL5aWxEdV+mpGtWzAuH3PO6A8eu+r6m3tPJKECF R/izA2knkooP16Lq2ex60FMEF7mrB9KO0Wrs5RPfhObE4WPge76a/ZvNWiA0i5Vi IXwyDRYl0pERACm0FrsUcJhvXfTzOX8wi6pDDe71uyXB6isFttniL+aQ5QWHvpeT PR59Scj1QHI8IfU39IyIojZYCM22DOtZeXTk7KTJcCMUlCf0BgRVyYVGcXXp0OBw nMqYmBIYvCpjvKsMS+iKOIbuRMzqlfW6EvqDRv4k7bo0nSBu/OdALZ7Ay7Ah2o8G APUerlM3ynwuHyxIn8qSed5L+AprSMvKtdm9i+sEt39YN+tXJphz6OLgaEPsosXF DvOUISdJDSOK5ZTxLZ49RUfTppgwAzuvN9QDKV1uJQ3oeTaPMYnYXVLJOzCPIrEZ S+ww+LKdgPe3N/tXF72nmb1qU7W+6FKICSzXIB63j7RD6BGt0HkGYUZ7ZcrU16pU yp1rQruM86s3yG5SsYGvz2AH9w+rC1A8zfuXJ6XetpFT7epzEjSvtoi4paSWRbdf x3Q784AGjJh2XyDUk9VTPyeTkurj4ixv0fbIgigMKrNY12riRwMnR2d83Jgs4ngU AIx373LdpF6b9BtVMTyf =m6s4 -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/sstabellini/tags/xen-20160622-tag' into staging xen-20160622 # gpg: Signature made Wed 22 Jun 2016 12:45:56 BST # gpg: using RSA key 0x894F8F4870E1AE90 # gpg: Good signature from "Stefano Stabellini <stefano.stabellini@eu.citrix.com>" # Primary key fingerprint: D04E 33AB A51F 67BA 07D3 0AEA 894F 8F48 70E1 AE90 * remotes/sstabellini/tags/xen-20160622-tag: xen: move xen_sysdev to xen_backend.c xen: fix qdisk BLKIF_OP_DISCARD for 32/64 word size mix xen: fix style of hw/block/xen_blkif.h Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
59a79f65ba
@ -5,31 +5,41 @@
|
||||
#include <xen/io/blkif.h>
|
||||
#include <xen/io/protocols.h>
|
||||
|
||||
/* Not a real protocol. Used to generate ring structs which contain
|
||||
/*
|
||||
* Not a real protocol. Used to generate ring structs which contain
|
||||
* the elements common to all protocols only. This way we get a
|
||||
* compiler-checkable way to use common struct elements, so we can
|
||||
* avoid using switch(protocol) in a number of places. */
|
||||
* avoid using switch(protocol) in a number of places.
|
||||
*/
|
||||
struct blkif_common_request {
|
||||
char dummy;
|
||||
char dummy;
|
||||
};
|
||||
struct blkif_common_response {
|
||||
char dummy;
|
||||
char dummy;
|
||||
};
|
||||
|
||||
/* i386 protocol version */
|
||||
#pragma pack(push, 4)
|
||||
struct blkif_x86_32_request {
|
||||
uint8_t operation; /* BLKIF_OP_??? */
|
||||
uint8_t nr_segments; /* number of segments */
|
||||
blkif_vdev_t handle; /* only for read/write requests */
|
||||
uint64_t id; /* private guest value, echoed in resp */
|
||||
blkif_sector_t sector_number;/* start sector idx on disk (r/w only) */
|
||||
struct blkif_request_segment seg[BLKIF_MAX_SEGMENTS_PER_REQUEST];
|
||||
uint8_t operation; /* BLKIF_OP_??? */
|
||||
uint8_t nr_segments; /* number of segments */
|
||||
blkif_vdev_t handle; /* only for read/write requests */
|
||||
uint64_t id; /* private guest value, echoed in resp */
|
||||
blkif_sector_t sector_number; /* start sector idx on disk (r/w only) */
|
||||
struct blkif_request_segment seg[BLKIF_MAX_SEGMENTS_PER_REQUEST];
|
||||
};
|
||||
struct blkif_x86_32_request_discard {
|
||||
uint8_t operation; /* BLKIF_OP_DISCARD */
|
||||
uint8_t flag; /* nr_segments in request struct */
|
||||
blkif_vdev_t handle; /* only for read/write requests */
|
||||
uint64_t id; /* private guest value, echoed in resp */
|
||||
blkif_sector_t sector_number; /* start sector idx on disk (r/w only) */
|
||||
uint64_t nr_sectors; /* # of contiguous sectors to discard */
|
||||
};
|
||||
struct blkif_x86_32_response {
|
||||
uint64_t id; /* copied from request */
|
||||
uint8_t operation; /* copied from request */
|
||||
int16_t status; /* BLKIF_RSP_??? */
|
||||
uint64_t id; /* copied from request */
|
||||
uint8_t operation; /* copied from request */
|
||||
int16_t status; /* BLKIF_RSP_??? */
|
||||
};
|
||||
typedef struct blkif_x86_32_request blkif_x86_32_request_t;
|
||||
typedef struct blkif_x86_32_response blkif_x86_32_response_t;
|
||||
@ -37,83 +47,100 @@ typedef struct blkif_x86_32_response blkif_x86_32_response_t;
|
||||
|
||||
/* x86_64 protocol version */
|
||||
struct blkif_x86_64_request {
|
||||
uint8_t operation; /* BLKIF_OP_??? */
|
||||
uint8_t nr_segments; /* number of segments */
|
||||
blkif_vdev_t handle; /* only for read/write requests */
|
||||
uint64_t __attribute__((__aligned__(8))) id;
|
||||
blkif_sector_t sector_number;/* start sector idx on disk (r/w only) */
|
||||
struct blkif_request_segment seg[BLKIF_MAX_SEGMENTS_PER_REQUEST];
|
||||
uint8_t operation; /* BLKIF_OP_??? */
|
||||
uint8_t nr_segments; /* number of segments */
|
||||
blkif_vdev_t handle; /* only for read/write requests */
|
||||
uint64_t __attribute__((__aligned__(8))) id;
|
||||
blkif_sector_t sector_number; /* start sector idx on disk (r/w only) */
|
||||
struct blkif_request_segment seg[BLKIF_MAX_SEGMENTS_PER_REQUEST];
|
||||
};
|
||||
struct blkif_x86_64_request_discard {
|
||||
uint8_t operation; /* BLKIF_OP_DISCARD */
|
||||
uint8_t flag; /* nr_segments in request struct */
|
||||
blkif_vdev_t handle; /* only for read/write requests */
|
||||
uint64_t __attribute__((__aligned__(8))) id;
|
||||
blkif_sector_t sector_number; /* start sector idx on disk (r/w only) */
|
||||
uint64_t nr_sectors; /* # of contiguous sectors to discard */
|
||||
};
|
||||
struct blkif_x86_64_response {
|
||||
uint64_t __attribute__((__aligned__(8))) id;
|
||||
uint8_t operation; /* copied from request */
|
||||
int16_t status; /* BLKIF_RSP_??? */
|
||||
uint64_t __attribute__((__aligned__(8))) id;
|
||||
uint8_t operation; /* copied from request */
|
||||
int16_t status; /* BLKIF_RSP_??? */
|
||||
};
|
||||
typedef struct blkif_x86_64_request blkif_x86_64_request_t;
|
||||
typedef struct blkif_x86_64_response blkif_x86_64_response_t;
|
||||
|
||||
DEFINE_RING_TYPES(blkif_common, struct blkif_common_request, struct blkif_common_response);
|
||||
DEFINE_RING_TYPES(blkif_x86_32, struct blkif_x86_32_request, struct blkif_x86_32_response);
|
||||
DEFINE_RING_TYPES(blkif_x86_64, struct blkif_x86_64_request, struct blkif_x86_64_response);
|
||||
DEFINE_RING_TYPES(blkif_common, struct blkif_common_request,
|
||||
struct blkif_common_response);
|
||||
DEFINE_RING_TYPES(blkif_x86_32, struct blkif_x86_32_request,
|
||||
struct blkif_x86_32_response);
|
||||
DEFINE_RING_TYPES(blkif_x86_64, struct blkif_x86_64_request,
|
||||
struct blkif_x86_64_response);
|
||||
|
||||
union blkif_back_rings {
|
||||
blkif_back_ring_t native;
|
||||
blkif_common_back_ring_t common;
|
||||
blkif_x86_32_back_ring_t x86_32_part;
|
||||
blkif_x86_64_back_ring_t x86_64_part;
|
||||
blkif_back_ring_t native;
|
||||
blkif_common_back_ring_t common;
|
||||
blkif_x86_32_back_ring_t x86_32_part;
|
||||
blkif_x86_64_back_ring_t x86_64_part;
|
||||
};
|
||||
typedef union blkif_back_rings blkif_back_rings_t;
|
||||
|
||||
enum blkif_protocol {
|
||||
BLKIF_PROTOCOL_NATIVE = 1,
|
||||
BLKIF_PROTOCOL_X86_32 = 2,
|
||||
BLKIF_PROTOCOL_X86_64 = 3,
|
||||
BLKIF_PROTOCOL_NATIVE = 1,
|
||||
BLKIF_PROTOCOL_X86_32 = 2,
|
||||
BLKIF_PROTOCOL_X86_64 = 3,
|
||||
};
|
||||
|
||||
static inline void blkif_get_x86_32_req(blkif_request_t *dst, blkif_x86_32_request_t *src)
|
||||
static inline void blkif_get_x86_32_req(blkif_request_t *dst,
|
||||
blkif_x86_32_request_t *src)
|
||||
{
|
||||
int i, n = BLKIF_MAX_SEGMENTS_PER_REQUEST;
|
||||
int i, n = BLKIF_MAX_SEGMENTS_PER_REQUEST;
|
||||
|
||||
dst->operation = src->operation;
|
||||
dst->nr_segments = src->nr_segments;
|
||||
dst->handle = src->handle;
|
||||
dst->id = src->id;
|
||||
dst->sector_number = src->sector_number;
|
||||
/* Prevent the compiler from using src->... instead. */
|
||||
barrier();
|
||||
if (dst->operation == BLKIF_OP_DISCARD) {
|
||||
struct blkif_request_discard *s = (void *)src;
|
||||
struct blkif_request_discard *d = (void *)dst;
|
||||
d->nr_sectors = s->nr_sectors;
|
||||
return;
|
||||
}
|
||||
if (n > dst->nr_segments)
|
||||
n = dst->nr_segments;
|
||||
for (i = 0; i < n; i++)
|
||||
dst->seg[i] = src->seg[i];
|
||||
dst->operation = src->operation;
|
||||
dst->nr_segments = src->nr_segments;
|
||||
dst->handle = src->handle;
|
||||
dst->id = src->id;
|
||||
dst->sector_number = src->sector_number;
|
||||
/* Prevent the compiler from using src->... instead. */
|
||||
barrier();
|
||||
if (dst->operation == BLKIF_OP_DISCARD) {
|
||||
struct blkif_x86_32_request_discard *s = (void *)src;
|
||||
struct blkif_request_discard *d = (void *)dst;
|
||||
d->nr_sectors = s->nr_sectors;
|
||||
return;
|
||||
}
|
||||
if (n > dst->nr_segments) {
|
||||
n = dst->nr_segments;
|
||||
}
|
||||
for (i = 0; i < n; i++) {
|
||||
dst->seg[i] = src->seg[i];
|
||||
}
|
||||
}
|
||||
|
||||
static inline void blkif_get_x86_64_req(blkif_request_t *dst, blkif_x86_64_request_t *src)
|
||||
static inline void blkif_get_x86_64_req(blkif_request_t *dst,
|
||||
blkif_x86_64_request_t *src)
|
||||
{
|
||||
int i, n = BLKIF_MAX_SEGMENTS_PER_REQUEST;
|
||||
int i, n = BLKIF_MAX_SEGMENTS_PER_REQUEST;
|
||||
|
||||
dst->operation = src->operation;
|
||||
dst->nr_segments = src->nr_segments;
|
||||
dst->handle = src->handle;
|
||||
dst->id = src->id;
|
||||
dst->sector_number = src->sector_number;
|
||||
/* Prevent the compiler from using src->... instead. */
|
||||
barrier();
|
||||
if (dst->operation == BLKIF_OP_DISCARD) {
|
||||
struct blkif_request_discard *s = (void *)src;
|
||||
struct blkif_request_discard *d = (void *)dst;
|
||||
d->nr_sectors = s->nr_sectors;
|
||||
return;
|
||||
}
|
||||
if (n > dst->nr_segments)
|
||||
n = dst->nr_segments;
|
||||
for (i = 0; i < n; i++)
|
||||
dst->seg[i] = src->seg[i];
|
||||
dst->operation = src->operation;
|
||||
dst->nr_segments = src->nr_segments;
|
||||
dst->handle = src->handle;
|
||||
dst->id = src->id;
|
||||
dst->sector_number = src->sector_number;
|
||||
/* Prevent the compiler from using src->... instead. */
|
||||
barrier();
|
||||
if (dst->operation == BLKIF_OP_DISCARD) {
|
||||
struct blkif_x86_64_request_discard *s = (void *)src;
|
||||
struct blkif_request_discard *d = (void *)dst;
|
||||
d->nr_sectors = s->nr_sectors;
|
||||
return;
|
||||
}
|
||||
if (n > dst->nr_segments) {
|
||||
n = dst->nr_segments;
|
||||
}
|
||||
for (i = 0; i < n; i++) {
|
||||
dst->seg[i] = src->seg[i];
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* __XEN_BLKIF_H__ */
|
||||
|
@ -26,12 +26,17 @@
|
||||
#include <sys/signal.h>
|
||||
|
||||
#include "hw/hw.h"
|
||||
#include "hw/sysbus.h"
|
||||
#include "sysemu/char.h"
|
||||
#include "qemu/log.h"
|
||||
#include "hw/xen/xen_backend.h"
|
||||
|
||||
#include <xen/grant_table.h>
|
||||
|
||||
#define TYPE_XENSYSDEV "xensysdev"
|
||||
|
||||
DeviceState *xen_sysdev;
|
||||
|
||||
/* ------------------------------------------------------------- */
|
||||
|
||||
/* public */
|
||||
@ -762,6 +767,10 @@ int xen_be_init(void)
|
||||
/* Check if xen_init() have been called */
|
||||
goto err;
|
||||
}
|
||||
|
||||
xen_sysdev = qdev_create(NULL, TYPE_XENSYSDEV);
|
||||
qdev_init_nofail(xen_sysdev);
|
||||
|
||||
return 0;
|
||||
|
||||
err:
|
||||
@ -862,3 +871,35 @@ void xen_be_printf(struct XenDevice *xendev, int msg_level, const char *fmt, ...
|
||||
}
|
||||
qemu_log_flush();
|
||||
}
|
||||
|
||||
static int xen_sysdev_init(SysBusDevice *dev)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static Property xen_sysdev_properties[] = {
|
||||
{/* end of property list */},
|
||||
};
|
||||
|
||||
static void xen_sysdev_class_init(ObjectClass *klass, void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
|
||||
|
||||
k->init = xen_sysdev_init;
|
||||
dc->props = xen_sysdev_properties;
|
||||
}
|
||||
|
||||
static const TypeInfo xensysdev_info = {
|
||||
.name = TYPE_XENSYSDEV,
|
||||
.parent = TYPE_SYS_BUS_DEVICE,
|
||||
.instance_size = sizeof(SysBusDevice),
|
||||
.class_init = xen_sysdev_class_init,
|
||||
};
|
||||
|
||||
static void xenbe_register_types(void)
|
||||
{
|
||||
type_register_static(&xensysdev_info);
|
||||
}
|
||||
|
||||
type_init(xenbe_register_types);
|
||||
|
@ -25,15 +25,10 @@
|
||||
#include "qemu/osdep.h"
|
||||
#include "hw/hw.h"
|
||||
#include "hw/boards.h"
|
||||
#include "hw/sysbus.h"
|
||||
#include "hw/xen/xen_backend.h"
|
||||
#include "xen_domainbuild.h"
|
||||
#include "sysemu/block-backend.h"
|
||||
|
||||
#define TYPE_XENSYSDEV "xensysdev"
|
||||
|
||||
DeviceState *xen_sysdev;
|
||||
|
||||
static void xen_init_pv(MachineState *machine)
|
||||
{
|
||||
DriveInfo *dinfo;
|
||||
@ -72,9 +67,6 @@ static void xen_init_pv(MachineState *machine)
|
||||
break;
|
||||
}
|
||||
|
||||
xen_sysdev = qdev_create(NULL, TYPE_XENSYSDEV);
|
||||
qdev_init_nofail(xen_sysdev);
|
||||
|
||||
xen_be_register("console", &xen_console_ops);
|
||||
xen_be_register("vkbd", &xen_kbdmouse_ops);
|
||||
xen_be_register("vfb", &xen_framebuffer_ops);
|
||||
@ -112,38 +104,6 @@ static void xen_init_pv(MachineState *machine)
|
||||
xen_init_display(xen_domid);
|
||||
}
|
||||
|
||||
static int xen_sysdev_init(SysBusDevice *dev)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static Property xen_sysdev_properties[] = {
|
||||
{/* end of property list */},
|
||||
};
|
||||
|
||||
static void xen_sysdev_class_init(ObjectClass *klass, void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
|
||||
|
||||
k->init = xen_sysdev_init;
|
||||
dc->props = xen_sysdev_properties;
|
||||
}
|
||||
|
||||
static const TypeInfo xensysdev_info = {
|
||||
.name = TYPE_XENSYSDEV,
|
||||
.parent = TYPE_SYS_BUS_DEVICE,
|
||||
.instance_size = sizeof(SysBusDevice),
|
||||
.class_init = xen_sysdev_class_init,
|
||||
};
|
||||
|
||||
static void xenpv_register_types(void)
|
||||
{
|
||||
type_register_static(&xensysdev_info);
|
||||
}
|
||||
|
||||
type_init(xenpv_register_types);
|
||||
|
||||
static void xenpv_machine_init(MachineClass *mc)
|
||||
{
|
||||
mc->desc = "Xen Para-virtualized PC";
|
||||
|
Loading…
Reference in New Issue
Block a user