mirror of
https://github.com/slackhq/nebula.git
synced 2025-11-22 16:34:25 +01:00
44 lines
1.7 KiB
Go
44 lines
1.7 KiB
Go
package virtqueue
|
|
|
|
// descriptorFlag is a flag that describes a [Descriptor].
|
|
type descriptorFlag uint16
|
|
|
|
const (
|
|
// descriptorFlagHasNext marks a descriptor chain as continuing via the next
|
|
// field.
|
|
descriptorFlagHasNext descriptorFlag = 1 << iota
|
|
// descriptorFlagWritable marks a buffer as device write-only (otherwise
|
|
// device read-only).
|
|
descriptorFlagWritable
|
|
// descriptorFlagIndirect means the buffer contains a list of buffer
|
|
// descriptors to provide an additional layer of indirection.
|
|
// Only allowed when the [virtio.FeatureIndirectDescriptors] feature was
|
|
// negotiated.
|
|
descriptorFlagIndirect
|
|
)
|
|
|
|
// descriptorSize is the number of bytes needed to store a [Descriptor] in
|
|
// memory.
|
|
const descriptorSize = 16
|
|
|
|
// Descriptor describes (a part of) a buffer which is either read-only for the
|
|
// device or write-only for the device (depending on [descriptorFlagWritable]).
|
|
// Multiple descriptors can be chained to produce a "descriptor chain" that can
|
|
// contain both device-readable and device-writable buffers. Device-readable
|
|
// descriptors always come first in a chain. A single, large buffer may be
|
|
// split up by chaining multiple similar descriptors that reference different
|
|
// memory pages. This is required, because buffers may exceed a single page size
|
|
// and the memory accessed by the device is expected to be continuous.
|
|
type Descriptor struct {
|
|
// address is the address to the continuous memory holding the data for this
|
|
// descriptor.
|
|
address uintptr
|
|
// length is the amount of bytes stored at address.
|
|
length uint32
|
|
// flags that describe this descriptor.
|
|
flags descriptorFlag
|
|
// next contains the index of the next descriptor continuing this descriptor
|
|
// chain when the [descriptorFlagHasNext] flag is set.
|
|
next uint16
|
|
}
|