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>
master
Peter Maydell 2016-06-23 10:44:56 +01:00
commit 59a79f65ba
3 changed files with 138 additions and 110 deletions

View File

@ -5,31 +5,41 @@
#include <xen/io/blkif.h> #include <xen/io/blkif.h>
#include <xen/io/protocols.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 * the elements common to all protocols only. This way we get a
* compiler-checkable way to use common struct elements, so we can * 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 { struct blkif_common_request {
char dummy; char dummy;
}; };
struct blkif_common_response { struct blkif_common_response {
char dummy; char dummy;
}; };
/* i386 protocol version */ /* i386 protocol version */
#pragma pack(push, 4) #pragma pack(push, 4)
struct blkif_x86_32_request { struct blkif_x86_32_request {
uint8_t operation; /* BLKIF_OP_??? */ uint8_t operation; /* BLKIF_OP_??? */
uint8_t nr_segments; /* number of segments */ uint8_t nr_segments; /* number of segments */
blkif_vdev_t handle; /* only for read/write requests */ blkif_vdev_t handle; /* only for read/write requests */
uint64_t id; /* private guest value, echoed in resp */ uint64_t id; /* private guest value, echoed in resp */
blkif_sector_t sector_number;/* start sector idx on disk (r/w only) */ 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_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 { struct blkif_x86_32_response {
uint64_t id; /* copied from request */ uint64_t id; /* copied from request */
uint8_t operation; /* copied from request */ uint8_t operation; /* copied from request */
int16_t status; /* BLKIF_RSP_??? */ int16_t status; /* BLKIF_RSP_??? */
}; };
typedef struct blkif_x86_32_request blkif_x86_32_request_t; typedef struct blkif_x86_32_request blkif_x86_32_request_t;
typedef struct blkif_x86_32_response blkif_x86_32_response_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 */ /* x86_64 protocol version */
struct blkif_x86_64_request { struct blkif_x86_64_request {
uint8_t operation; /* BLKIF_OP_??? */ uint8_t operation; /* BLKIF_OP_??? */
uint8_t nr_segments; /* number of segments */ uint8_t nr_segments; /* number of segments */
blkif_vdev_t handle; /* only for read/write requests */ blkif_vdev_t handle; /* only for read/write requests */
uint64_t __attribute__((__aligned__(8))) id; uint64_t __attribute__((__aligned__(8))) id;
blkif_sector_t sector_number;/* start sector idx on disk (r/w only) */ 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_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 { struct blkif_x86_64_response {
uint64_t __attribute__((__aligned__(8))) id; uint64_t __attribute__((__aligned__(8))) id;
uint8_t operation; /* copied from request */ uint8_t operation; /* copied from request */
int16_t status; /* BLKIF_RSP_??? */ int16_t status; /* BLKIF_RSP_??? */
}; };
typedef struct blkif_x86_64_request blkif_x86_64_request_t; typedef struct blkif_x86_64_request blkif_x86_64_request_t;
typedef struct blkif_x86_64_response blkif_x86_64_response_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_common, struct blkif_common_request,
DEFINE_RING_TYPES(blkif_x86_32, struct blkif_x86_32_request, struct blkif_x86_32_response); struct blkif_common_response);
DEFINE_RING_TYPES(blkif_x86_64, struct blkif_x86_64_request, struct blkif_x86_64_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 { union blkif_back_rings {
blkif_back_ring_t native; blkif_back_ring_t native;
blkif_common_back_ring_t common; blkif_common_back_ring_t common;
blkif_x86_32_back_ring_t x86_32_part; blkif_x86_32_back_ring_t x86_32_part;
blkif_x86_64_back_ring_t x86_64_part; blkif_x86_64_back_ring_t x86_64_part;
}; };
typedef union blkif_back_rings blkif_back_rings_t; typedef union blkif_back_rings blkif_back_rings_t;
enum blkif_protocol { enum blkif_protocol {
BLKIF_PROTOCOL_NATIVE = 1, BLKIF_PROTOCOL_NATIVE = 1,
BLKIF_PROTOCOL_X86_32 = 2, BLKIF_PROTOCOL_X86_32 = 2,
BLKIF_PROTOCOL_X86_64 = 3, 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->operation = src->operation;
dst->nr_segments = src->nr_segments; dst->nr_segments = src->nr_segments;
dst->handle = src->handle; dst->handle = src->handle;
dst->id = src->id; dst->id = src->id;
dst->sector_number = src->sector_number; dst->sector_number = src->sector_number;
/* Prevent the compiler from using src->... instead. */ /* Prevent the compiler from using src->... instead. */
barrier(); barrier();
if (dst->operation == BLKIF_OP_DISCARD) { if (dst->operation == BLKIF_OP_DISCARD) {
struct blkif_request_discard *s = (void *)src; struct blkif_x86_32_request_discard *s = (void *)src;
struct blkif_request_discard *d = (void *)dst; struct blkif_request_discard *d = (void *)dst;
d->nr_sectors = s->nr_sectors; d->nr_sectors = s->nr_sectors;
return; return;
} }
if (n > dst->nr_segments) if (n > dst->nr_segments) {
n = dst->nr_segments; n = dst->nr_segments;
for (i = 0; i < n; i++) }
dst->seg[i] = src->seg[i]; 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->operation = src->operation;
dst->nr_segments = src->nr_segments; dst->nr_segments = src->nr_segments;
dst->handle = src->handle; dst->handle = src->handle;
dst->id = src->id; dst->id = src->id;
dst->sector_number = src->sector_number; dst->sector_number = src->sector_number;
/* Prevent the compiler from using src->... instead. */ /* Prevent the compiler from using src->... instead. */
barrier(); barrier();
if (dst->operation == BLKIF_OP_DISCARD) { if (dst->operation == BLKIF_OP_DISCARD) {
struct blkif_request_discard *s = (void *)src; struct blkif_x86_64_request_discard *s = (void *)src;
struct blkif_request_discard *d = (void *)dst; struct blkif_request_discard *d = (void *)dst;
d->nr_sectors = s->nr_sectors; d->nr_sectors = s->nr_sectors;
return; return;
} }
if (n > dst->nr_segments) if (n > dst->nr_segments) {
n = dst->nr_segments; n = dst->nr_segments;
for (i = 0; i < n; i++) }
dst->seg[i] = src->seg[i]; for (i = 0; i < n; i++) {
dst->seg[i] = src->seg[i];
}
} }
#endif /* __XEN_BLKIF_H__ */ #endif /* __XEN_BLKIF_H__ */

View File

@ -26,12 +26,17 @@
#include <sys/signal.h> #include <sys/signal.h>
#include "hw/hw.h" #include "hw/hw.h"
#include "hw/sysbus.h"
#include "sysemu/char.h" #include "sysemu/char.h"
#include "qemu/log.h" #include "qemu/log.h"
#include "hw/xen/xen_backend.h" #include "hw/xen/xen_backend.h"
#include <xen/grant_table.h> #include <xen/grant_table.h>
#define TYPE_XENSYSDEV "xensysdev"
DeviceState *xen_sysdev;
/* ------------------------------------------------------------- */ /* ------------------------------------------------------------- */
/* public */ /* public */
@ -762,6 +767,10 @@ int xen_be_init(void)
/* Check if xen_init() have been called */ /* Check if xen_init() have been called */
goto err; goto err;
} }
xen_sysdev = qdev_create(NULL, TYPE_XENSYSDEV);
qdev_init_nofail(xen_sysdev);
return 0; return 0;
err: err:
@ -862,3 +871,35 @@ void xen_be_printf(struct XenDevice *xendev, int msg_level, const char *fmt, ...
} }
qemu_log_flush(); 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);

View File

@ -25,15 +25,10 @@
#include "qemu/osdep.h" #include "qemu/osdep.h"
#include "hw/hw.h" #include "hw/hw.h"
#include "hw/boards.h" #include "hw/boards.h"
#include "hw/sysbus.h"
#include "hw/xen/xen_backend.h" #include "hw/xen/xen_backend.h"
#include "xen_domainbuild.h" #include "xen_domainbuild.h"
#include "sysemu/block-backend.h" #include "sysemu/block-backend.h"
#define TYPE_XENSYSDEV "xensysdev"
DeviceState *xen_sysdev;
static void xen_init_pv(MachineState *machine) static void xen_init_pv(MachineState *machine)
{ {
DriveInfo *dinfo; DriveInfo *dinfo;
@ -72,9 +67,6 @@ static void xen_init_pv(MachineState *machine)
break; break;
} }
xen_sysdev = qdev_create(NULL, TYPE_XENSYSDEV);
qdev_init_nofail(xen_sysdev);
xen_be_register("console", &xen_console_ops); xen_be_register("console", &xen_console_ops);
xen_be_register("vkbd", &xen_kbdmouse_ops); xen_be_register("vkbd", &xen_kbdmouse_ops);
xen_be_register("vfb", &xen_framebuffer_ops); xen_be_register("vfb", &xen_framebuffer_ops);
@ -112,38 +104,6 @@ static void xen_init_pv(MachineState *machine)
xen_init_display(xen_domid); 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) static void xenpv_machine_init(MachineClass *mc)
{ {
mc->desc = "Xen Para-virtualized PC"; mc->desc = "Xen Para-virtualized PC";