#ifndef _XEN_RING_H
#define _XEN_RING_H
#if (__XEN_INTERFACE_VERSION__ >= 0x00030201) && \
(__XEN_INTERFACE_VERSION < 0x00030208)
#include <xen/include/public/io/ring.h>
#undef xen_mb
#undef xen_rmb
#undef xen_wmb
void xen_mb(void);
#define xen_rmb() membar_acquire()
#define xen_wmb() membar_release()
struct blkif_x86_32_request {
uint8_t operation;
uint8_t nr_segments;
blkif_vdev_t handle;
uint64_t id;
blkif_sector_t sector_number;
struct blkif_request_segment seg[BLKIF_MAX_SEGMENTS_PER_REQUEST];
} __packed;
typedef struct blkif_x86_32_request blkif_x86_32_request_t;
struct blkif_x86_32_response {
uint64_t id;
uint8_t operation;
uint8_t _pad;
int16_t status;
} __packed;
typedef struct blkif_x86_32_response blkif_x86_32_response_t;
struct blkif_x86_32_request_indirect {
uint8_t operation;
uint8_t indirect_op;
uint16_t nr_segments;
uint64_t id;
blkif_sector_t sector_number;
blkif_vdev_t handle;
uint16_t _pad2;
grant_ref_t indirect_grefs[BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST];
uint64_t _pad3;
} __packed;
typedef struct blkif_x86_32_request_indirect blkif_x86_32_request_indirect_t;
struct blkif_x86_64_request {
uint8_t operation;
uint8_t nr_segments;
blkif_vdev_t handle;
uint64_t __attribute__((__aligned__(8))) id;
blkif_sector_t sector_number;
struct blkif_request_segment seg[BLKIF_MAX_SEGMENTS_PER_REQUEST];
};
typedef struct blkif_x86_64_request blkif_x86_64_request_t;
struct blkif_x86_64_response {
uint64_t __attribute__((__aligned__(8))) id;
uint8_t operation;
int16_t status;
};
typedef struct blkif_x86_64_response blkif_x86_64_response_t;
struct blkif_x86_64_request_indirect {
uint8_t operation;
uint8_t indirect_op;
uint16_t nr_segments;
uint32_t _pad1;
uint64_t id;
blkif_sector_t sector_number;
blkif_vdev_t handle;
uint16_t _pad2;
grant_ref_t indirect_grefs[BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST];
uint32_t _pad3;
} __packed;
typedef struct blkif_x86_64_request_indirect blkif_x86_64_request_indirect_t;
CTASSERT(sizeof(struct blkif_x86_32_request_indirect)
== sizeof(struct blkif_x86_64_request_indirect));
CTASSERT(sizeof(struct blkif_request_indirect)
== sizeof(struct blkif_x86_64_request_indirect));
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_ring_proto {
blkif_back_ring_t ring_n;
blkif_x86_32_back_ring_t ring_32;
blkif_x86_64_back_ring_t ring_64;
};
typedef union blkif_back_ring_proto blkif_back_ring_proto_t;
#endif
#endif