virtio_spec/
pvirtq.rs

1//! Packed virtqueue definitions
2
3use bitfield_struct::bitfield;
4
5use crate::{le16, le32, le64, virtq, RingEventFlags};
6
7/// Packed Virtqueue Descriptor
8#[doc(alias = "pvirtq_desc")]
9#[repr(C)]
10pub struct Desc {
11    /// Buffer Address.
12    pub addr: le64,
13
14    /// Buffer Length.
15    pub len: le32,
16
17    /// Buffer ID.
18    pub id: le16,
19
20    /// The flags depending on descriptor type.
21    pub flags: virtq::DescF,
22}
23
24/// Event Suppression Descriptor
25#[doc(alias = "pvirtq_event_suppress")]
26#[repr(C)]
27pub struct EventSuppress {
28    /// If desc_event_flags set to RING_EVENT_FLAGS_DESC
29    pub desc: EventSuppressDesc,
30    pub flags: EventSuppressFlags,
31}
32
33/// Event Suppression Flags
34#[bitfield(u16, repr = le16, from = le16::from_ne, into = le16::to_ne)]
35pub struct EventSuppressDesc {
36    /// Descriptor Ring Change Event Offset
37    #[bits(15)]
38    pub desc_event_off: u16,
39
40    /// Descriptor Ring Change Event Wrap Counter
41    #[bits(1)]
42    pub desc_event_wrap: u8,
43}
44
45#[bitfield(u16, repr = le16, from = le16::from_ne, into = le16::to_ne)]
46pub struct EventSuppressFlags {
47    /// Descriptor Ring Change Event Flags
48    #[bits(2)]
49    pub desc_event_flags: RingEventFlags,
50
51    /// Reserved, set to 0
52    #[bits(14)]
53    pub reserved: u16,
54}