xv6-simplified
0.1
简化版xv6
Loading...
Searching...
No Matches
src
include
virtio.h
Go to the documentation of this file.
1
11
// virtio mmio控制寄存器,从0x10001000开始映射
12
// 参考qemu的virtio_mmio.h
13
#define VIRTIO_MMIO_MAGIC_VALUE 0x000
// Magic value ("virt" string) : 0x74726976
14
#define VIRTIO_MMIO_VERSION 0x004
// version; should be 2
15
#define VIRTIO_MMIO_DEVICE_ID 0x008
// device type; 1 is net, 2 is disk
16
#define VIRTIO_MMIO_VENDOR_ID 0x00c
// 0x554d4551
17
#define VIRTIO_MMIO_DEVICE_FEATURES 0x010
18
#define VIRTIO_MMIO_DRIVER_FEATURES 0x020
19
// 写入该寄存器选择虚拟队列:QueueNumMax, QueueNum, QueueReady, QueueDescLow,
20
// QueueDescHigh, QueueAvailLow, QueueAvailHigh, QueueUsedLow和
21
// QueueUsedHigh, 第一个队列的索引为0x0,write-only
22
#define VIRTIO_MMIO_QUEUE_SEL 0x030
23
// 返回就绪设备队列的最大数目或0x0(队列不可用),适用于QUEUE_SEL选择的队列,read-only
24
#define VIRTIO_MMIO_QUEUE_NUM_MAX 0x034
25
// 返回队列中元素个数
26
// 写入该寄存器用于通知驱动要用的队列长度,适用于QUEUE_SEL选择的队列,write-only
27
#define VIRTIO_MMIO_QUEUE_NUM 0x038
28
// 向该寄存器写入1以通知设备可以执行来自虚拟队列的请求。读取该寄存器将返回最后写入该寄存器的值
29
// 适用于QUEUE_SEL选择的队列
30
#define VIRTIO_MMIO_QUEUE_READY 0x044
31
// 向该寄存器写入值通知队列有新缓冲区待处理
32
// 未确认VIRTIO_F_NOTIFICATION_DATA时,写入的值为队列索引
33
// 否则Notification数据格式如下:
34
// le32 {
35
// vqn : 16;
36
// next_off : 15;
37
// next_wrap : 1;
38
// };
39
// write-only
40
#define VIRTIO_MMIO_QUEUE_NOTIFY 0x050
41
// 中断状态
42
// 返回导致设备中断被断言的事件的位掩码
43
// 可能的中断被断言的情况:
44
// 使用缓冲区通知-bit0-因为设备在至少一个活动虚拟队列中使用缓冲区
45
// 配置更改通知-bit1-因为设备配置改变
46
// read-only
47
#define VIRTIO_MMIO_INTERRUPT_STATUS 0x060
48
// 中断确认
49
// 写入在INTERRUPT_STATUS中定义的位值到该寄存器
50
// 以通知设备导致中断的事件已被处理
51
// write-only
52
#define VIRTIO_MMIO_INTERRUPT_ACK 0x064
53
// 返回当前设备状态标志
54
// 写入则设置设备状态标志
55
// non-zero--指示驱动进度
56
// 0--触发设备复位
57
// read/write
58
#define VIRTIO_MMIO_STATUS 0x070
59
// 描述符表的物理地址
60
// write-only
61
#define VIRTIO_MMIO_QUEUE_DESC_LOW 0x080
62
#define VIRTIO_MMIO_QUEUE_DESC_HIGH 0x084
63
// 可用环的物理地址
64
// write-only
65
#define VIRTIO_MMIO_DRIVER_DESC_LOW 0x090
66
#define VIRTIO_MMIO_DRIVER_DESC_HIGH 0x094
67
// 已使用环的物理地址
68
// write-only
69
#define VIRTIO_MMIO_DEVICE_DESC_LOW 0x0a0
70
#define VIRTIO_MMIO_DEVICE_DESC_HIGH 0x0a4
71
72
// 状态寄存器的位
73
// 参考qemu的virtio_config.h
74
#define VIRTIO_CONFIG_S_ACKNOWLEDGE 1
75
#define VIRTIO_CONFIG_S_DRIVER 2
76
#define VIRTIO_CONFIG_S_DRIVER_OK 4
77
#define VIRTIO_CONFIG_S_FEATURES_OK 8
78
79
// 设备特性位
80
#define VIRTIO_BLK_F_RO 5
/* Disk is read-only */
81
#define VIRTIO_BLK_F_SCSI 7
/* Supports scsi command passthru */
82
#define VIRTIO_BLK_F_CONFIG_WCE 11
/* Writeback mode available in config */
83
#define VIRTIO_BLK_F_MQ 12
/* support more than one vq */
84
#define VIRTIO_F_ANY_LAYOUT 27
85
#define VIRTIO_RING_F_INDIRECT_DESC 28
86
#define VIRTIO_RING_F_EVENT_IDX 29
87
88
// virtio描述符的数量必须为双数
89
#define NUM 8
90
91
// 单个虚拟队列描述符,参考规范
92
// 驱动程序为设备使用的缓冲区
93
struct
virtq_desc
{
94
uint64
addr
;
// 物理地址
95
uint32
len
;
// 缓冲区长度
96
uint16
flags
;
// 缓冲区的标志
97
uint16
next
;
// 缓冲区间连接符,当flags & NEXT非零时有效
98
};
99
#define VRING_DESC_F_NEXT 1
// 是否与另一个缓冲区连接
100
#define VRING_DESC_F_WRITE 2
// 设备只写(若flags在该位不置位则设备只读)
101
102
// 完整的空闲/可使用环,参考规范
103
// 驱动程序使用available ring为设备提供缓冲区
104
// 每个ring项都指向描述符链的头部
105
// 只由驱动程序写入,由设备读取
106
struct
virtq_avail
{
107
uint16
flags
;
// always zero
108
uint16
idx
;
// 下一个ring项的索引。驱动程序将把下一个描述符项放在环中的位置(对队列大小取模)。从0开始
109
uint16
ring
[
NUM
];
// 数组的每一项都是某一个描述符链的头部数字
110
uint16
unused
;
111
};
112
113
// one entry in the "used" ring, with which the
114
// device tells the driver about completed requests.
115
// used ring中的一项
116
struct
virtq_used_elem
{
117
uint32
id
;
// 描述符链的头部索引数字
118
uint32
len
;
// 缓冲区长度
119
};
120
121
// 设备在使用完缓冲区后返回缓冲区的地方
122
// 它只被设备写入,由驱动程序读取。
123
struct
virtq_used
{
124
uint16
flags
;
// always zero
125
uint16
idx
;
// 下一个ring项的索引
126
struct
virtq_used_elem
ring
[
NUM
];
127
};
128
129
// these are specific to virtio block devices, e.g. disks,
130
// described in Section 5.2 of the spec.
131
132
#define VIRTIO_BLK_T_IN 0
// read the disk
133
#define VIRTIO_BLK_T_OUT 1
// write the disk
134
135
// 驱动程序将请求排队到virtqueue,由设备处理
136
// 请求格式:
137
struct
virtio_blk_req
{
138
uint32
type
;
// 有两种类型:VIRTIO_BLK_T_IN or ..._OUT
139
uint32
reserved
;
140
uint64
sector
;
// 起始偏移量(以512字节为单位)
141
};
virtio_blk_req
Definition
virtio.h:137
virtio_blk_req::sector
uint64 sector
Definition
virtio.h:140
virtio_blk_req::reserved
uint32 reserved
Definition
virtio.h:139
virtio_blk_req::type
uint32 type
Definition
virtio.h:138
virtq_avail
Definition
virtio.h:106
virtq_avail::unused
uint16 unused
Definition
virtio.h:110
virtq_avail::ring
uint16 ring[NUM]
Definition
virtio.h:109
virtq_avail::idx
uint16 idx
Definition
virtio.h:108
virtq_avail::flags
uint16 flags
Definition
virtio.h:107
virtq_desc
Definition
virtio.h:93
virtq_desc::len
uint32 len
Definition
virtio.h:95
virtq_desc::addr
uint64 addr
Definition
virtio.h:94
virtq_desc::flags
uint16 flags
Definition
virtio.h:96
virtq_desc::next
uint16 next
Definition
virtio.h:97
virtq_used_elem
Definition
virtio.h:116
virtq_used_elem::id
uint32 id
Definition
virtio.h:117
virtq_used_elem::len
uint32 len
Definition
virtio.h:118
virtq_used
Definition
virtio.h:123
virtq_used::idx
uint16 idx
Definition
virtio.h:125
virtq_used::ring
struct virtq_used_elem ring[NUM]
Definition
virtio.h:126
virtq_used::flags
uint16 flags
Definition
virtio.h:124
uint16
unsigned short uint16
Definition
types.h:20
uint32
unsigned int uint32
Definition
types.h:22
uint64
unsigned long uint64
Definition
types.h:24
NUM
#define NUM
Definition
virtio.h:89
Generated by
1.9.7