1
2
3
4
5
6
7
8
9
10
11
12 #define VIRTIO_MMIO_MAGIC_VALUE 0x000
13 #define VIRTIO_MMIO_VERSION 0x004
14 #define VIRTIO_MMIO_DEVICE_ID 0x008
15 #define VIRTIO_MMIO_VENDOR_ID 0x00c
16 #define VIRTIO_MMIO_DEVICE_FEATURES 0x010
17 #define VIRTIO_MMIO_DRIVER_FEATURES 0x020
18 #define VIRTIO_MMIO_QUEUE_SEL 0x030
19 #define VIRTIO_MMIO_QUEUE_NUM_MAX 0x034
20 #define VIRTIO_MMIO_QUEUE_NUM 0x038
21 #define VIRTIO_MMIO_QUEUE_READY 0x044
22 #define VIRTIO_MMIO_QUEUE_NOTIFY 0x050
23 #define VIRTIO_MMIO_INTERRUPT_STATUS 0x060
24 #define VIRTIO_MMIO_INTERRUPT_ACK 0x064
25 #define VIRTIO_MMIO_STATUS 0x070
26 #define VIRTIO_MMIO_QUEUE_DESC_LOW 0x080
27 #define VIRTIO_MMIO_QUEUE_DESC_HIGH 0x084
28 #define VIRTIO_MMIO_DRIVER_DESC_LOW 0x090
29 #define VIRTIO_MMIO_DRIVER_DESC_HIGH 0x094
30 #define VIRTIO_MMIO_DEVICE_DESC_LOW 0x0a0
31 #define VIRTIO_MMIO_DEVICE_DESC_HIGH 0x0a4
32
33
34 #define VIRTIO_CONFIG_S_ACKNOWLEDGE 1
35 #define VIRTIO_CONFIG_S_DRIVER 2
36 #define VIRTIO_CONFIG_S_DRIVER_OK 4
37 #define VIRTIO_CONFIG_S_FEATURES_OK 8
38
39
40 #define VIRTIO_BLK_F_RO 5
41 #define VIRTIO_BLK_F_SCSI 7
42 #define VIRTIO_BLK_F_CONFIG_WCE 11
43 #define VIRTIO_BLK_F_MQ 12
44 #define VIRTIO_F_ANY_LAYOUT 27
45 #define VIRTIO_RING_F_INDIRECT_DESC 28
46 #define VIRTIO_RING_F_EVENT_IDX 29
47
48
49
50 #define NUM 8
51
52
53 struct virtq_desc {
54 uint64 addr;
55 uint32 len;
56 uint16 flags;
57 uint16 next;
58 };
59 #define VRING_DESC_F_NEXT 1
60 #define VRING_DESC_F_WRITE 2
61
62
63 struct virtq_avail {
64 uint16 flags;
65 uint16 idx;
66 uint16 ring[NUM];
67 uint16 unused;
68 };
69
70
71
72 struct virtq_used_elem {
73 uint32 id;
74 uint32 len;
75 };
76
77 struct virtq_used {
78 uint16 flags;
79 uint16 idx;
80 struct virtq_used_elem ring[NUM];
81 };
82
83
84
85
86 #define VIRTIO_BLK_T_IN 0
87 #define VIRTIO_BLK_T_OUT 1
88
89
90
91
92 struct virtio_blk_req {
93 uint32 type;
94 uint32 reserved;
95 uint64 sector;
96 };