1 /* $NetBSD: xenring.h,v 1.8 2024/07/16 22:44:38 riastradh Exp $ */ 2 3 /* 4 * Glue goop for xbd ring request/response protocol structures. 5 * 6 * These are used only from __XEN_INTERFACE_VERSION__ >= 0x00030201 7 * prior to which they were part of the public XEN api. 8 */ 9 10 #ifndef _XEN_RING_H 11 #define _XEN_RING_H 12 13 #if (__XEN_INTERFACE_VERSION__ >= 0x00030201) && \ 14 (__XEN_INTERFACE_VERSION < 0x00030208) 15 16 #include <xen/include/public/io/ring.h> 17 18 /* 19 * Undo namespace damage from xen/include/public/io/ring.h 20 * The proper fix is to get upstream to stop assuming that all OSs use 21 * mb(), rmb(), wmb(). 22 */ 23 #undef xen_mb 24 #undef xen_rmb 25 #undef xen_wmb 26 27 void xen_mb(void); 28 #define xen_rmb() membar_acquire() 29 #define xen_wmb() membar_release() 30 31 /* 32 * Define ring types. These were previously part of the public API. 33 * Not anymore. 34 */ 35 /* i386 requests/responses */ 36 struct blkif_x86_32_request { 37 uint8_t operation; /* BLKIF_OP_??? */ 38 uint8_t nr_segments; /* number of segments */ 39 blkif_vdev_t handle; /* only for read/write requests */ 40 uint64_t id; /* private guest value, echoed in resp */ 41 blkif_sector_t sector_number;/* start sector idx on disk (r/w only) */ 42 struct blkif_request_segment seg[BLKIF_MAX_SEGMENTS_PER_REQUEST]; 43 } __packed; 44 typedef struct blkif_x86_32_request blkif_x86_32_request_t; 45 46 struct blkif_x86_32_response { 47 uint64_t id; /* copied from request */ 48 uint8_t operation; /* copied from request */ 49 uint8_t _pad; 50 int16_t status; /* BLKIF_RSP_??? */ 51 } __packed; 52 typedef struct blkif_x86_32_response blkif_x86_32_response_t; 53 54 struct blkif_x86_32_request_indirect { 55 uint8_t operation; /* BLKIF_OP_INDIRECT */ 56 uint8_t indirect_op; /* BLKIF_OP_{READ/WRITE} */ 57 uint16_t nr_segments; /* number of segments */ 58 uint64_t id; /* private guest value, echoed in resp */ 59 blkif_sector_t sector_number;/* start sector idx on disk (r/w only) */ 60 blkif_vdev_t handle; /* only for read/write requests */ 61 uint16_t _pad2; 62 grant_ref_t indirect_grefs[BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST]; 63 uint64_t _pad3; /* make it 64 byte aligned */ 64 } __packed; 65 typedef struct blkif_x86_32_request_indirect blkif_x86_32_request_indirect_t; 66 67 /* amd64-type requests/responses (always used in frontends ) */ 68 69 struct blkif_x86_64_request { 70 uint8_t operation; /* BLKIF_OP_??? */ 71 uint8_t nr_segments; /* number of segments */ 72 blkif_vdev_t handle; /* only for read/write requests */ 73 uint64_t __attribute__((__aligned__(8))) id;/* private guest value, echoed in resp */ 74 blkif_sector_t sector_number;/* start sector idx on disk (r/w only) */ 75 struct blkif_request_segment seg[BLKIF_MAX_SEGMENTS_PER_REQUEST]; 76 }; 77 typedef struct blkif_x86_64_request blkif_x86_64_request_t; 78 79 struct blkif_x86_64_response { 80 uint64_t __attribute__((__aligned__(8))) id; /* copied from request */ 81 uint8_t operation; /* copied from request */ 82 int16_t status; /* BLKIF_RSP_??? */ 83 }; 84 typedef struct blkif_x86_64_response blkif_x86_64_response_t; 85 86 struct blkif_x86_64_request_indirect { 87 uint8_t operation; /* BLKIF_OP_INDIRECT */ 88 uint8_t indirect_op; /* BLKIF_OP_{READ/WRITE} */ 89 uint16_t nr_segments; /* number of segments */ 90 uint32_t _pad1; 91 uint64_t id; /* private guest value, echoed in resp */ 92 blkif_sector_t sector_number;/* start sector idx on disk (r/w only) */ 93 blkif_vdev_t handle; /* only for read/write requests */ 94 uint16_t _pad2; 95 grant_ref_t indirect_grefs[BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST]; 96 uint32_t _pad3; /* make it 64 byte aligned */ 97 } __packed; 98 typedef struct blkif_x86_64_request_indirect blkif_x86_64_request_indirect_t; 99 100 CTASSERT(sizeof(struct blkif_x86_32_request_indirect) 101 == sizeof(struct blkif_x86_64_request_indirect)); 102 CTASSERT(sizeof(struct blkif_request_indirect) 103 == sizeof(struct blkif_x86_64_request_indirect)); 104 105 DEFINE_RING_TYPES(blkif_x86_32, struct blkif_x86_32_request, struct blkif_x86_32_response); 106 DEFINE_RING_TYPES(blkif_x86_64, struct blkif_x86_64_request, struct blkif_x86_64_response); 107 108 union blkif_back_ring_proto { 109 blkif_back_ring_t ring_n; /* native/common members */ 110 blkif_x86_32_back_ring_t ring_32; 111 blkif_x86_64_back_ring_t ring_64; 112 }; 113 typedef union blkif_back_ring_proto blkif_back_ring_proto_t; 114 115 #endif /* __XEN_INTERFACE_VERSION__ */ 116 117 #endif /* _XEN_RING_H_ */ 118