xref: /netbsd-src/sys/arch/xen/include/xenring.h (revision f183eaeed00232c8d8b44a8611d174d9ff1b475b)
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