forked from oasis-tcs/virtio-spec
-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathtransport-msg.tex
More file actions
1640 lines (1389 loc) · 78.1 KB
/
transport-msg.tex
File metadata and controls
1640 lines (1389 loc) · 78.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
\section{Virtio Over Messages}\label{sec:Virtio Transport Options / Virtio Over Messages}
\newcommand{\conceptref}[1]{\hyperref[sec:Virtio Transport Options / Virtio Over Messages / Basic Concepts / #1]{#1}}
\newcommand{\msgref}[1]{\hyperref[sec:Virtio Transport Options / Virtio Over Messages / Transport Messages / VIRTIO_MSG_#1]{VIRTIO_MSG_#1}}
\newcommand{\busref}[1]{\hyperref[sec:Virtio Transport Options / Virtio Over Messages / Bus Messages / BUS_MSG_#1]{BUS_MSG_#1}}
\newcommand{\msgdef}[1]{\subsubsection{VIRTIO_MSG_#1}\label{sec:Virtio Transport Options / Virtio Over Messages / Transport Messages / VIRTIO_MSG_#1}}
\newcommand{\busdef}[1]{\subsubsection{BUS_MSG_#1}\label{sec:Virtio Transport Options / Virtio Over Messages / Bus Messages / BUS_MSG_#1}}
This section defines \textbf{virtio-msg}, a transport mechanism that encapsulates
virtio operations as discrete message exchanges rather than relying on PCI or
memory-mapped I/O regions. It separates bus-level functionality (e.g., device
enumeration, hotplug events) from device-specific operations (e.g., feature
negotiation, virtqueue setup), ensuring that a single, generic transport layer
can be reused across multiple bus implementations.
virtio-msg addresses several key objectives:
\begin{itemize}
\item \textbf{Support multiple bus implementations:}
Systems can rely on various communication methods such as hypercalls, local
IPC, network channels, or device trees for enumerating devices. virtio-msg
defines a common transport interface suitable for any of these mechanisms.
\item \textbf{Reduce per-bus complexity:}
Buses can implement a fully message-based workflow (including optional
enumeration via \busref{GET_DEVICES} and hotplug via \busref{EVENT_DEVICE})
or they can discover and manage devices through
alternative means such as platform firmware data. In either case, they
forward transport messages to and from each device.
\item \textbf{Preserve virtio semantics:}
The transport leverages standard virtio concepts (features, configuration
space, virtqueues), so existing virtio drivers and device implementations can
integrate smoothly once a device is discovered and registered.
\end{itemize}
\subsection{Basic Concepts}
\label{sec:Virtio Transport Options / Virtio Over Messages / Basic Concepts}
The virtio-msg transport relies on a set of foundational concepts to ensure
reusability across different bus implementations and flexibility in device
capabilities. This section defines those concepts and clarifies how they apply,
regardless of whether the bus leverages message-based enumeration or platform
data for device discovery.
\subsubsection{High-Level Architecture}
virtio-msg operates around two layers:
\begin{enumerate}
\item \textbf{Bus Layer}: A \emph{bus instance} exposes zero or more virtio
devices. It discovers available devices through mechanisms such as:
\begin{itemize}
\item Optional message-based queries (\busref{GET_DEVICES}),
\item External data sources (e.g., device tree, ACPI tables, hypervisor
firmware calls),
\item Dynamic hotplug notifications (optionally via \busref{EVENT_DEVICE}).
\end{itemize}
Once a device is identified, regardless of discovery method, the bus
uses \msgref{GET_DEVICE_INFO} to read its device ID and vendor ID, then
\emph{registers} that device with the host OS so the usual virtio driver
probe can occur.
\item \textbf{Transport Layer}: After the bus knows about a device, the
virtio-msg transport handles all device-specific operations:
\begin{itemize}
\item Retrieving and setting features (\msgref{GET_DEVICE_FEATURES},
\msgref{SET_DRIVER_FEATURES}),
\item Accessing the device configuration space (\msgref{GET_CONFIG},
\msgref{SET_CONFIG}),
\item Setting up virtqueues (\msgref{SET_VQUEUE}, \msgref{RESET_VQUEUE}),
\item Managing status and runtime notifications (\msgref{SET_DEVICE_STATUS},
\msgref{EVENT_USED}, etc.).
\end{itemize}
These transport messages remain the same across different bus instances,
allowing a single virtio-msg driver component to function in multiple
environments.
\end{enumerate}
\subsubsection{Relationship Between Bus and Transport}
\label{sec:Virtio Transport Options / Virtio Over Messages / Basic Concepts / Relationship between bus and transport}
This subsubsection explains the division of responsibilities: the bus layer is
the mandatory carrier that moves messages between driver and device endpoints
(e.g., over IPC, shared memory with signalling or hardware messaging), while
the virtio-msg transport defines the semantics of those messages.
virtio-msg groups messages into two categories:
\begin{description}
\item[\textbf{Bus Messages}:]
Intended for global bus operations such as enumerating device numbers
(\busref{GET_DEVICES}), managing device hotplug events (\busref{EVENT_DEVICE})
or assessing bus-wide health (\busref{PING}).
These messages are \emph{optional} in environments where
device discovery or state changes occur through other means (e.g., device
tree). However, if a bus chooses to handle those tasks via messages,
it implements the appropriate bus message definitions described in this
section.
\item[\textbf{Transport Messages}:]
Used for device-specific operations, such as:
\begin{itemize}
\item Retrieving or setting features (\msgref{GET_DEVICE_FEATURES},
\msgref{SET_DRIVER_FEATURES}),
\item Accessing device configuration (\msgref{GET_CONFIG},
\msgref{SET_CONFIG}),
\item Managing virtqueues (\msgref{SET_VQUEUE}, \msgref{RESET_VQUEUE}),
\item Handling device status and notifications (\msgref{SET_DEVICE_STATUS},
\msgref{EVENT_USED}, etc.).
\end{itemize}
\end{description}
This separation lets a bus remain minimal if it obtains device information from
firmware tables, while still supporting fully message-based enumeration and
hotplug when desired.
\busnormative{\paragraph}{Bus Message Implementation}{Virtio Transport Options / Virtio Over Messages / Basic Concepts / Relationship between bus and transport / Bus Messages}
\begin{itemize}
\item A bus implementation that provides enumeration, hotplug, or bus
health handling via bus messages SHOULD implement the corresponding Bus
Message definitions described in this section.
\end{itemize}
\busnormative{\paragraph}{Transport Message Forwarding}{Virtio Transport Options / Virtio Over Messages / Basic Concepts / Relationship between bus and transport / Transport Message Forwarding}
\begin{itemize}
\item A bus implementation MUST relay each transport message to the device
number identified in the message header, regardless of how it
discovered or enumerated that device.
\item A bus implementation SHOULD treat transport messages as opaque apart
from enforcing generic transport limits, such as the advertised maximum
message size, and SHOULD NOT modify the transport payload.
\end{itemize}
\subsubsection{System Topology}
A virtio-msg system contains the following elements:
\begin{itemize}
\item \textbf{Bus Instances and Devices}: Each bus instance advertises its
capabilities (e.g., transport revision, maximum message size) and
discovers devices via message-based queries or external data sources.
Every discovered device has a unique \emph{device number}.
\item \textbf{Driver}: Communicates with the bus to learn about
available devices. Once a device is recognized, the driver uses the
common transport messages to perform feature negotiation, configuration,
and virtqueue setup.
\item \textbf{Device}: Implement virtio device functionality and
respond to the transport messages. The bus forwards these messages to
the correct device instance based on device number.
\end{itemize}
\subsubsection{Transport Revisions and Maximum Message Size}
\label{sec:Virtio Transport Options / Virtio Over Messages / Basic Concepts / Revisions}
Each \textbf{virtio-msg bus instance} advertises the following to the transport
layer:
\begin{itemize}
\item \textbf{Transport revision}: the protocol version supported by the bus
instance (independent of the overall Virtio specification version).
\item \textbf{Maximum message size}: the largest payload (in bytes) that can
be carried per request or response, including the common header.
\item \textbf{Transport feature bits}: revision-specific optional features
implemented by the bus instance.
\end{itemize}
The mechanism for obtaining these parameters is implementation-defined and can
vary between bus instances. Common approaches include:
\begin{itemize}
\item Reading firmware or device-tree data that describes each bus instance,
\item Performing a message exchange during bus setup to retrieve the values,
\item Relying on per-bus configuration structures or driver-specific defaults.
\end{itemize}
\busnormative{\paragraph}{Advertising Transport Parameters}{Virtio Transport Options / Virtio Over Messages / Basic Concepts / Revisions / Advertising Transport Parameters}
\begin{itemize}
\item Each bus instance MUST make its transport revision, maximum message
size, and transport feature bits available to the virtio-msg transport
before any transport messages are exchanged for that device.
\item A bus instance MUST apply the same limits to both driver-originated and
device-originated transport messages; if the values change, the bus
MUST inform the transport layer before accepting additional messages.
\end{itemize}
\drivernormative{\paragraph}{Respecting Bus Limits}{Virtio Transport Options / Virtio Over Messages / Basic Concepts / Revisions / Driver Limits}
\begin{itemize}
\item A driver MUST NOT send a transport message whose total size exceeds the
maximum message size advertised for the target bus instance.
\item A driver MUST NOT rely on transport features or messages that require a
higher transport revision than the bus instance reports.
\end{itemize}
\devicenormative{\paragraph}{Respecting Bus Limits}{Virtio Transport Options / Virtio Over Messages / Basic Concepts / Revisions / Device Limits}
\begin{itemize}
\item A device MUST ensure its responses and device-originated messages do
not exceed the maximum message size advertised by the bus instance that
relays them.
\item A device MUST NOT require transport features or messages beyond the
transport revision reported by the bus instance, and MUST respond with
an error or ignore requests for unsupported features.
\end{itemize}
\paragraph{virtio-msg revisions}
The following table lists the currently defined virtio-msg revisions:
\begin{tabular}{ |l|l|l|l| }
\hline
\field{revision} & \field{maximum size} & \field{features} & remarks \\
\hline \hline
1 & 44-65536 & <empty> & Virtio Message Revision 1 \\
\hline
\end{tabular}
Note that a change in the virtio standard does not necessarily
correspond to a change in the virtio-msg revision.
The maximum message size is specified from the transport-layer point of view
and includes the 8-byte common header plus payload. Any extra encapsulation
imposed by the underlying bus (for example, a framing header) does not count
against this limit. Today the largest practical transport payload is 256 bytes:
messages such as GET_CONFIG and SET_CONFIG can carry up to 256 bytes of device
configuration in one transfer, and larger configuration regions can be accessed
through multiple exchanges without requiring a larger per-message limit.
\busnormative{\paragraph}{Message Size Bounds}{Virtio Transport Options / Virtio Over Messages / Basic Concepts / Revisions / Message Size}
\begin{itemize}
\item A bus implementation MUST advertise a maximum message size of at least
44 bytes.
\item A bus implementation SHOULD NOT advertise a maximum message size that
exceeds 264 bytes (256-byte payload plus the common header).
\end{itemize}
\paragraph{Versioning and Forward Compatibility}
A higher transport revision or additional transport feature bits extend the
protocol with new messages or capabilities. Implementations are expected to
remain interoperable across revisions: devices and drivers designed for a newer
revision still implement the mandatory messages and semantics defined in prior
revisions.
\drivernormative{\paragraph}{Revision Compatibility}{Virtio Transport Options / Virtio Over Messages / Basic Concepts / Versioning and Forward Compatibility / Driver}
\begin{itemize}
\item A driver that negotiates transport revision $N$ MUST implement all
mandatory driver behavior defined for revisions $1$ through $N$.
\item If a driver receives a device-originated message or feature indication
that requires an unsupported revision or transport feature, it MUST
ignore the message (or treat the request as failed) and MUST NOT act on
partially understood data.
\end{itemize}
\devicenormative{\paragraph}{Revision Compatibility}{Virtio Transport Options / Virtio Over Messages / Basic Concepts / Versioning and Forward Compatibility / Device}
\begin{itemize}
\item A device that advertises transport revision $N$ MUST implement all
mandatory device behavior defined for revisions $1$ through $N$.
\item If a device receives a driver request that relies on an unsupported
revision or transport feature, it MUST reject the request using the
message-specific error mechanism (if any) or silently ignore it.
\end{itemize}
\busnormative{\paragraph}{Revision Compatibility}{Virtio Transport Options / Virtio Over Messages / Basic Concepts / Versioning and Forward Compatibility / Bus}
\begin{itemize}
\item A bus instance that advertises transport revision $N$ MUST satisfy every
bus requirement defined for revisions $1$ through $N$.
\item If a bus instance cannot forward a message because it requires an
unsupported revision or transport feature, it MUST surface a transport
error or drop the message without forwarding it.
\end{itemize}
\subsubsection{Device Numbers and Enumeration}
\label{sec:Virtio Transport Options / Virtio Over Messages / Basic Concepts /
Device Numbers}
Each virtio-msg bus instance contains one or more \emph{devices}, identified
by a 16-bit \textbf{device number}. Buses discover these device numbers through
mechanisms such as:
\begin{itemize}
\item \textbf{Message-Based Enumeration}: Using \busref{GET_DEVICES} to query
which numbers exist (optional).
\item \textbf{Platform Data}: A device tree, ACPI tables, or hypervisor calls
might inform the bus of available device numbers and their properties.
\end{itemize}
Once a bus confirms that a device number is valid—regardless of the discovery
method—it normally issues \msgref{GET_DEVICE_INFO} to retrieve the device and
vendor IDs before registering the device with the host OS so the usual Virtio
driver binding process can begin.
\busnormative{\paragraph}{Device Number Assignment}{Virtio Transport Options / Virtio Over Messages / Basic Concepts / Device Numbers / Assignment}
\begin{itemize}
\item A bus implementation MUST assign a unique device number to every
device on a given bus instance and MUST NOT forward transport messages
for a device number that has not been validated.
\item A bus implementation SHOULD provide the driver with sufficient
information—either via \busref{GET_DEVICES} or equivalent platform
data—to discover each valid device number.
\end{itemize}
\subsubsection{Configuration Generation Count}
\label{sec:Virtio Transport Options / Virtio Over Messages / Basic Concepts / Configuration Generation Count}
Each device maintains a \textbf{Configuration Generation Count} to prevent
inconsistent updates. This count is incremented at least once by the device for
every driver-visible change it makes to its configuration data. The current
count is exposed in \msgref{EVENT_CONFIG} and \msgref{GET_CONFIG} responses so
the driver can determine whether its view of the configuration is current. The
count does not necessarily start at zero and is not automatically reset when
the device resets.
\devicenormative{\paragraph}{Configuration Generation Count}{Virtio Transport Options / Virtio Over Messages / Basic Concepts / Configuration Generation Count / Device}
\begin{itemize}
\item A device MUST increment the generation count before it makes a change
that is visible to the driver and MUST ensure that each
\msgref{EVENT_CONFIG} carrying configuration data uses a unique
generation count.
\item If updated configuration data cannot fit in a single
\msgref{EVENT_CONFIG}, the device SHOULD send an \msgref{EVENT_CONFIG}
with zero data length to advertise the new generation count and MUST
make the updated data available via \msgref{GET_CONFIG}.
\item If a \msgref{SET_CONFIG} request includes a generation count that does
not match the device's current count, the device MUST reject the
request.
\end{itemize}
\drivernormative{\paragraph}{Configuration Generation Count}{Virtio Transport Options / Virtio Over Messages / Basic Concepts / Configuration Generation Count / Driver}
\begin{itemize}
\item A driver MUST track the most recent generation count observed (via
\msgref{EVENT_CONFIG} or \msgref{GET_CONFIG}) and include it in every
\msgref{SET_CONFIG} request.
\item If a \msgref{SET_CONFIG} request is rejected due to a mismatched
generation count, the driver SHOULD issue \msgref{GET_CONFIG} to obtain
the latest configuration data and generation count before retrying.
\end{itemize}
This mechanism ensures updates are not lost or overwritten due to stale
information.
\subsubsection{Feature Negotiation Blocks}
\label{sec:Virtio Transport Options / Virtio Over Messages / Basic Concepts / Feature Blocks}
The virtio-msg transport organizes feature bits into 32-bit blocks accessed by
\msgref{GET_DEVICE_FEATURES} and \msgref{SET_DRIVER_FEATURES}. Each block
represents up to 32 feature bits:
\begin{itemize}
\item \textbf{Block Index}: The starting block (e.g., block 0 for
features 0--31, block 1 for features 32--63, etc.).
\item \textbf{Number of Blocks}: How many blocks the driver wishes to retrieve
or modify in a single message.
\item \textbf{Feature Data}: The 32-bit values representing the supported (or
driver-requested) feature bits in the selected blocks.
\end{itemize}
\devicenormative{\paragraph}{Feature Blocks}{Virtio Transport Options / Virtio Over Messages / Basic Concepts / Feature Blocks / Device}
\begin{itemize}
\item When \msgref{GET_DEVICE_FEATURES} covers blocks that extend beyond the
features a device implements, the device MUST return zero for the
feature data in those positions.
\end{itemize}
\subsubsection{Error Signaling}
\label{sec:Virtio Transport Options / Virtio Over Messages / Basic Concepts / Error Signaling}
Transport errors can arise from malformed messages, routing failures inside a
bus implementation, or device-side faults while processing a valid request.
Implementations should handle such faults locally where possible, but a bus may
surface an error to the virtio-msg transport if it cannot deliver a request or
obtain a response within its policy.
\busnormative{\paragraph}{Error Handling}{Virtio Transport Options / Virtio Over Messages / Basic Concepts / Error Signaling / Bus}
\begin{itemize}
\item A bus implementation MAY report a transport-visible failure (for
example, after exhausting a bounded retry policy) when it cannot deliver
a request or obtain a response.
\item A bus implementation MUST treat malformed headers or unsupported
\field{msg_id} values as invalid, MUST discard them without generating
additional protocol traffic, and MAY log the condition for diagnostics.
\item A bus implementation MUST NOT generate error responses to event
(one-way) messages.
\end{itemize}
\devicenormative{\paragraph}{Error Handling}{Virtio Transport Options / Virtio Over Messages / Basic Concepts / Error Signaling / Device}
\begin{itemize}
\item A device receiving a malformed or unsupported transport message MUST
discard it without producing further protocol traffic.
\item Recovery actions taken in response to an error (such as retries,
selective resets, or device removal) MUST follow the normative reset and
status semantics defined in
\ref{sec:Virtio Transport Options / Virtio Over Messages / Device Operation}.
\end{itemize}
This specification does not define a dedicated error-reporting message; it only
permits implementations to surface failures when silent recovery is not
feasible.
\subsubsection{Endianness}
\label{sec:Virtio Transport Options / Virtio Over Messages / Basic Concepts / Endianness}
Unless otherwise stated, all numeric fields defined for virtio-msg messages use
little-endian encoding.
\drivernormative{\paragraph}{Endianness}{Virtio Transport Options / Virtio Over Messages / Basic Concepts / Endianness / Driver}
\begin{itemize}
\item A driver MUST encode and decode the common header and payload fields
defined by this transport using little-endian byte order.
\end{itemize}
\devicenormative{\paragraph}{Endianness}{Virtio Transport Options / Virtio Over Messages / Basic Concepts / Endianness / Device}
\begin{itemize}
\item A device MUST emit and consume the common header and payload fields
defined by this transport using little-endian byte order.
\end{itemize}
\subsubsection{Common Message Format}
\label{sec:Virtio Transport Options / Virtio Over Messages / Basic Concepts / Common Message Format}
All virtio-msg exchanges, whether \emph{bus messages} or \emph{transport
messages}, begin with an 8-byte header followed by an optional payload. The
fields below describe the wire format for that header.
The header layout is:
\begin{lstlisting}
struct virtio_msg_header {
u8 type; /* request/response + bus/transport */
u8 msg_id; /* message id */
le16 dev_num; /* device number (0 for bus messages) */
le16 token; /* bus-managed correlation identifier */
le16 msg_size; /* total size: header (8) + payload */
u8 payload[];
};
\end{lstlisting}
Field semantics:
\begin{itemize}
\item \field{type}:
\begin{itemize}
\item Bit[0]: 0=request, 1=response.
\item Bit[1]: 0=transport message, 1=bus message.
\item Bits[2..7]: reserved for future use.
\end{itemize}
\item \field{msg_id}: Message ID identifying the message definition. Ranges
are defined in
\ref{sec:Virtio Transport Options / Virtio Over Messages / Transport Messages}
and
\ref{sec:Virtio Transport Options / Virtio Over Messages / Bus Messages}.
\item \field{dev_num}: For transport messages, the device number that should
receive the message. Bus messages operate on device number 0.
\item \field{token}: Correlation identifier managed by the bus. Drivers and
devices treat this field as opaque; the bus MAY overwrite it to track
outstanding requests or maintain ordering.
\item \field{msg_size}: Total size in bytes of the complete message (header
plus payload).
\item \field{payload}: Operation-specific data. If a bus introduces extra
padding bytes, those bytes are not part of the payload semantics.
\end{itemize}
\drivernormative{\paragraph}{Common Header}{Virtio Transport Options / Virtio Over Messages / Basic Concepts / Common Message Format / Driver}
\begin{itemize}
\item A driver MUST set bits 2..7 of \field{type} to zero and MUST treat them
as reserved when parsing received headers.
\item A driver MUST ensure \field{msg_size} reflects the total message length
(header plus payload) and MUST NOT exceed the maximum message size
advertised by the bus instance.
\item When sending a transport message, a driver MUST set \field{dev_num} to
the intended device number.
\item If a driver introduces padding bytes that become part of the transport
payload, it MUST set those bytes to zero.
\item A driver MUST treat the \field{token} field as opaque and MUST NOT rely
on its value when processing received messages.
\end{itemize}
\devicenormative{\paragraph}{Common Header}{Virtio Transport Options / Virtio Over Messages / Basic Concepts / Common Message Format / Device}
\begin{itemize}
\item A device MUST set bits 2..7 of \field{type} to zero in transmitted
messages and MUST ignore those bits on receive.
\item A device MUST ensure \field{msg_size} reflects the total message length
(header plus payload) and does not exceed the bus's advertised maximum.
\item When sending a transport message, a device MUST set \field{dev_num} to
its own device number.
\item A device MUST ignore padding bytes that are documented as bus-specific
and MUST zero any such bytes it introduces into the transport payload.
\item A device MUST treat the \field{token} field as opaque and MUST NOT rely
on its value when processing received messages.
\end{itemize}
\busnormative{\paragraph}{Common Header}{Virtio Transport Options / Virtio Over Messages / Basic Concepts / Common Message Format / Bus}
\begin{itemize}
\item A bus implementation MUST deliver bus messages with \field{dev_num}=0
and MUST NOT alter \field{dev_num} for transport messages beyond the
routing needed to reach the addressed device.
\item A bus implementation MUST set bits 2..7 of \field{type} to zero when
generating bus messages and MUST ignore those bits when forwarding
transport messages.
\item If the bus adds framing or padding bytes around the common header or
payload, it MUST set those bytes to zero before delivering the message
to the opposite side and MUST present the same zero padding when the
opposite side reads a message.
\item A bus implementation owns the \field{token} field; it MAY insert or
overwrite values for correlation purposes and MUST ensure that any such
use is transparent to drivers and devices.
\end{itemize}
Reserved header bits and unspecified header values MUST be transmitted as zero
and ignored on receive to preserve forward compatibility.
\subsubsection{Message Ordering}
\label{sec:Virtio Transport Options / Virtio Over Messages / Basic Concepts / Ordering}
Transport messages fall into two classes: requests (which expect responses) and
events (which are one-way). Drivers and devices rely on the bus to preserve the
relative ordering of request/response pairs for each device number; they do not
interpret the \field{token} field directly.
\busnormative{\paragraph}{Message Ordering}{Virtio Transport Options / Virtio Over Messages / Basic Concepts / Ordering / Bus}
\begin{itemize}
\item For each device number, a bus implementation MUST deliver responses to
the driver in the same order that it forwarded the corresponding
requests to the device.
\item A bus implementation MUST ensure that every request forwarded to a
device results in exactly one response delivered to the driver (unless
the request is defined as an event).
\end{itemize}
\subsection{Device Discovery}\label{sec:Virtio Transport Options / Virtio Over Messages / Device Discovery}
A virtio-msg implementation can learn about devices via bus-level enumeration
(e.g., \busref{GET_DEVICES}), platform data (e.g., device tree, ACPI), or
hypervisor/firmware interfaces. The following informative text describes
typical flows; the normative obligations follow.
Bus implementations discover their devices through a mix of platform data,
hypervisor-provided enumeration, or message-based queries such as
\busref{GET_DEVICES}. This specification defines \busref{GET_DEVICES} for
environments that prefer message-driven enumeration, but it does not require
its use when equivalent information is already known out-of-band.
\busnormative{\paragraph}{Device Discovery}{Virtio Transport Options / Virtio Over Messages / Device Discovery / Bus}
\begin{itemize}
\item A bus implementation MUST ensure that every device number it exposes to
the driver has been validated via either platform data or a successful
query such as \busref{GET_DEVICES}.
\item Once a device number is deemed present, the bus implementation SHOULD
invoke \msgref{GET_DEVICE_INFO} so it can register the device with the
host OS and allow the appropriate virtio driver to bind.
\item If a bus implementation provides an alternative enumeration mechanism
(e.g., ACPI, device tree), it MAY omit \busref{GET_DEVICES} provided the
alternative delivers equivalent information to the driver.
\end{itemize}
\subsection{Device Initialization}
\label{sec:Virtio Transport Options / Virtio Over Messages / Device Initialization}
After a bus has identified a virtio-msg device (whether by message-based
enumeration or platform-specific discovery), the driver undertakes a series of
steps to configure and ready the device for normal operation. This section
details the recommended order of operations and the associated messages.
\subsubsection{Initialization Flow Overview}
\label{sec:Virtio Transport Options / Virtio Over Messages / Device Initialization / Overview}
A typical device initialization flow includes:
\begin{enumerate}
\item \textbf{Obtain Device Information:}
Query static parameters with \msgref{GET_DEVICE_INFO}.
\item \textbf{Negotiate Features:}
Read feature blocks via \msgref{GET_DEVICE_FEATURES}, decide which to
enable, and write them back with \msgref{SET_DRIVER_FEATURES} before
updating the device status.
\item \textbf{Initialize Configuration Space:}
Read or write configuration data with
\msgref{GET_CONFIG}/\msgref{SET_CONFIG}, guarding updates with the
configuration generation count.
\item \textbf{Set Up Virtqueues:}
Configure each virtqueue via \msgref{SET_VQUEUE} and verify the settings
with \msgref{GET_VQUEUE}.
\item \textbf{Set Device Status:}
Use \msgref{SET_DEVICE_STATUS} to drive the device through the standard
virtio status states.
\end{enumerate}
The exact order may vary slightly across implementations, but these steps form
the baseline for virtio-msg initialization.
\drivernormative{\paragraph}{Initialization Flow}{Virtio Transport Options / Virtio Over Messages / Device Initialization / Overview / Driver}
\begin{itemize}
\item A driver MUST issue \msgref{GET_DEVICE_INFO} before attempting feature
negotiation or queue setup.
\item A driver MUST complete feature negotiation via
\msgref{GET_DEVICE_FEATURES}/\msgref{SET_DRIVER_FEATURES}
and confirm the FEATURES\_OK state via \msgref{SET_DEVICE_STATUS} before
enabling virtqueues.
\item A driver MUST configure each virtqueue via \msgref{SET_VQUEUE} and
confirm its parameters (e.g., with \msgref{GET_VQUEUE}) before marking
the queue ready for I/O.
\item A driver MUST drive the device status transitions using
\msgref{SET_DEVICE_STATUS}, ensuring the device reaches DRIVER\_OK
before issuing normal I/O.
\end{itemize}
\subsubsection{Device Information}
\label{sec:Virtio Transport Options / Virtio Over Messages / Device Initialization / Device Information}
Once a device number is confirmed, the driver uses \msgref{GET_DEVICE_INFO} to
retrieve static identification data (device ID, vendor ID), the number of
feature bits, configuration space size, maximum virtqueues, shared memory
segments, and any admin virtqueue details. This information determines which
virtio driver should bind to the device, how many feature blocks to query, and
how much configuration space is valid.
\drivernormative{\paragraph}{Device Information}{Virtio Transport Options / Virtio Over Messages / Device Initialization / Device Information / Driver}
\begin{itemize}
\item A driver MUST issue \msgref{GET_DEVICE_INFO} before attempting feature
negotiation or queue setup so it can discover the device ID, vendor ID,
feature count, configuration size, and virtqueue limits.
\item A driver MUST use the configuration size reported via
\msgref{GET_DEVICE_INFO} to bound any offsets and lengths supplied in
\msgref{GET_CONFIG} and \msgref{SET_CONFIG} requests.
\end{itemize}
\subsubsection{Feature Negotiation}
\label{sec:Virtio Transport Options / Virtio Over Messages / Device Initialization / Device Features}
Drivers read available features in 32-bit blocks using
\msgref{GET_DEVICE_FEATURES}; the device returns the requested bitfields,
padding with zeros for any out-of-range blocks. To enable selected features, the
driver writes them back with \msgref{SET_DRIVER_FEATURES} and then updates the
device status via \msgref{SET_DEVICE_STATUS}, checking whether the FEATURES\_OK
bit remains set.
\drivernormative{\paragraph}{Feature Negotiation}{Virtio Transport Options / Virtio Over Messages / Device Initialization / Device Features / Driver}
\begin{itemize}
\item A driver MUST use \msgref{GET_DEVICE_FEATURES} to discover the feature
bits offered by the device and MUST write back only the features it
intends to enable via \msgref{SET_DRIVER_FEATURES}.
\item After writing the desired features, the driver MUST attempt to set the
FEATURES\_OK bit using \msgref{SET_DEVICE_STATUS} and MUST check the
returned status to ensure the device accepted the set.
\end{itemize}
\devicenormative{\paragraph}{Feature Negotiation}{Virtio Transport Options / Virtio Over Messages / Device Initialization / Device Features / Device}
\begin{itemize}
\item When handling \msgref{GET_DEVICE_FEATURES}, a device MUST return zero
for any requested bits that fall outside the number of feature bits it
implements.
\item After receiving \msgref{SET_DRIVER_FEATURES}, a device MUST update its
internal feature mask to match the acknowledged set and MUST reflect
acceptance or rejection by leaving the FEATURES\_OK bit set or clearing
it in the status returned by \msgref{SET_DEVICE_STATUS}.
\end{itemize}
\subsubsection{Device Configuration}
\label{sec:Virtio Transport Options / Virtio Over Messages / Device Initialization / Device Configuration}
Drivers use \msgref{GET_CONFIG} to read portions of the configuration space by
supplying an offset and length; the device returns the requested data plus the
current configuration generation count. Writing is performed via
\msgref{SET_CONFIG}, which carries the same offset/length along with the
driver's notion of the generation count and the new data.
\drivernormative{\paragraph}{Device Configuration}{Virtio Transport Options / Virtio Over Messages / Device Initialization / Device Configuration / Driver}
\begin{itemize}
\item A driver MUST ensure that the offset and length in each
\msgref{GET_CONFIG} or \msgref{SET_CONFIG} request stay within the
configuration size reported by \msgref{GET_DEVICE_INFO}.
\item A driver MUST include its most recently observed configuration
generation count in a \msgref{SET_CONFIG} request and SHOULD re-read the
configuration (via \msgref{GET_CONFIG}) if the request is rejected for a
generation mismatch.
\end{itemize}
\devicenormative{\paragraph}{Device Configuration}{Virtio Transport Options / Virtio Over Messages / Device Initialization / Device Configuration / Device}
\begin{itemize}
\item A device MUST reject a \msgref{SET_CONFIG} request whose generation
count does not match its current value and MUST indicate the rejection
in the response.
\item A device MUST return the current configuration generation count
alongside any data returned via \msgref{GET_CONFIG}.
\end{itemize}
\subsubsection{Virtqueue Configuration}
\label{sec:Virtio Transport Options / Virtio Over Messages / Device Initialization / Virtqueue Configuration}
Drivers query virtqueue parameters with \msgref{GET_VQUEUE}, configure them via
\msgref{SET_VQUEUE}, and optionally reset them using \msgref{RESET_VQUEUE} (if
VIRTIO\_F\_RING\_RESET is negotiated). Each queue is typically configured by
reading its maximum size, provisioning descriptor/available/used buffers, and
then calling \msgref{SET_VQUEUE} with the chosen size and guest-physical
addresses.
\drivernormative{\paragraph}{Virtqueue Configuration}{Virtio Transport Options / Virtio Over Messages / Device Initialization / Virtqueue Configuration / Driver}
\begin{itemize}
\item A driver MUST use \msgref{GET_VQUEUE} to determine the maximum queue
size and confirm that a queue is inactive before programming it.
\item A driver MUST ensure the queue size provided in \msgref{SET_VQUEUE} does
not exceed the maximum reported by the device and MUST supply valid
descriptor/driver/device addresses before enabling the queue.
\item If VIRTIO\_F\_RING\_RESET has been negotiated and a queue requires
reinitialization, the driver SHOULD use \msgref{RESET_VQUEUE} before
reprogramming it.
\end{itemize}
\devicenormative{\paragraph}{Virtqueue Configuration}{Virtio Transport Options / Virtio Over Messages / Device Initialization / Virtqueue Configuration / Device}
\begin{itemize}
\item A device MUST report accurate maximum queue sizes in \msgref{GET_VQUEUE}
and MUST persist the parameters supplied via \msgref{SET_VQUEUE} (size,
descriptor, driver, and device addresses).
\item When \msgref{RESET_VQUEUE} is issued (and VIRTIO\_F\_RING\_RESET is
negotiated), the device MUST quiesce the queue, release any resources
associated with it, and allow the driver to reconfigure it.
\end{itemize}
\subsubsection{Status Information}
\label{sec:Virtio Transport Options / Virtio Over Messages / Device Initialization / Status Information}
Drivers query the device status via \msgref{GET_DEVICE_STATUS} to observe
progress or detect errors, and they drive the Virtio status transitions via
\msgref{SET_DEVICE_STATUS}. Writing zero to the status field resets the device,
invalidating any configuration or virtqueue state.
\drivernormative{\paragraph}{Status Handling}{Virtio Transport Options / Virtio Over Messages / Device Initialization / Status Information / Driver}
\begin{itemize}
\item A driver SHOULD read the device status via \msgref{GET_DEVICE_STATUS}
when diagnosing errors or determining whether the device is ready to
move to the next initialization phase.
\item A driver MUST use \msgref{SET_DEVICE_STATUS} to drive the device through
the virtio-defined status states and MUST write 0 to request a device
reset when needed.
\end{itemize}
\devicenormative{\paragraph}{Status Handling}{Virtio Transport Options / Virtio Over Messages / Device Initialization / Status Information / Device}
\begin{itemize}
\item Upon receiving a \msgref{SET_DEVICE_STATUS} write of 0, a device MUST
reset its internal state, invalidate existing configuration and
virtqueue settings, and present the status field as 0.
\item A device MUST report its current status accurately via
\msgref{GET_DEVICE_STATUS}, including whether the FEATURES\_OK bit has
been accepted or cleared.
\end{itemize}
\subsubsection{Finalizing Initialization}
After configuring virtqueues and agreeing on features, the driver transitions
the device to DRIVER\_OK (and any other required status bits) via
\msgref{SET_DEVICE_STATUS}. At that point, the device is considered ready for
normal virtqueue I/O.
\drivernormative{\paragraph}{Final Status}{Virtio Transport Options / Virtio Over Messages / Device Initialization / Finalizing Initialization / Driver}
\begin{itemize}
\item A driver MUST set DRIVER\_OK via \msgref{SET_DEVICE_STATUS} only after
it has completed feature negotiation and initialized all required
virtqueues.
\item A driver MUST NOT queue normal I/O until the device reports a status
that includes DRIVER\_OK.
\item A driver MUST NOT supply buffers or send driver notifications for a
virtqueue until that queue has been configured via \msgref{SET_VQUEUE}.
\end{itemize}
\devicenormative{\paragraph}{Final Status}{Virtio Transport Options / Virtio Over Messages / Device Initialization / Finalizing Initialization / Device}
\begin{itemize}
\item A device MUST NOT process normal virtqueue I/O until the driver has set
DRIVER\_OK.
\item Once DRIVER\_OK is set, the device MUST begin processing virtqueue
requests subject to the negotiated features and queue configurations.
\end{itemize}
\subsection{Device Operation}
\label{sec:Virtio Transport Options / Virtio Over Messages / Device Operation}
Once a virtio-msg device is fully initialized (see
\ref{sec:Virtio Transport Options / Virtio Over Messages / Device Initialization}),
the driver and device exchange messages to perform I/O and respond to
configuration changes. This section details the primary messaging paths for
\emph{driver notifications}, \emph{device notifications}, and the handling of
runtime resets or shutdown sequences.
\subsubsection{Driver Notifications}
\label{sec:Virtio Transport Options / Virtio Over Messages / Device Operation / Driver Notifications}
After buffers are made available to a virtqueue, the driver issues
\msgref{EVENT_AVAIL} to notify the device. A bus implementation may translate
these notifications into an out-of-band mechanism or deliver them in-band.
\drivernormative{\paragraph}{Driver Notifications}{Virtio Transport Options / Virtio Over Messages / Device Operation / Driver Notifications / Driver}
\begin{itemize}
\item A driver MUST send \msgref{EVENT_AVAIL} when it places new buffers on a
virtqueue.
\item Each \msgref{EVENT_AVAIL} MUST identify the target virtqueue index.
\item If VIRTIO\_F\_NOTIFICATION\_DATA has been negotiated, the driver MUST
populate the “next offset and wrap” fields so the device can locate the
head of the updated ring; otherwise those fields MUST be zero.
\end{itemize}
\busnormative{\paragraph}{Driver Notifications}{Virtio Transport Options / Virtio Over Messages / Device Operation / Driver Notifications / Bus}
\begin{itemize}
\item A bus implementation MAY convert \msgref{EVENT_AVAIL} into an
out-of-band notification but, if it does not, it MUST relay the message
over the virtio-msg channel.
\item A bus implementation MUST NOT drop \msgref{EVENT_AVAIL} unless it has
arranged for the device to detect new buffers through polling or an
equivalent mechanism.
\end{itemize}
\subsubsection{Device Notifications}
\label{sec:Virtio Transport Options / Virtio Over Messages / Device Operation / Device Notifications}
\msgref{EVENT_CONFIG} and \msgref{EVENT_USED} provide asynchronous notifications
from the device (or device-side bus) to the driver. The bus may forward these
messages in-band or synthesize them based on other signals such as interrupts
or polling.
\devicenormative{\paragraph}{Device Notifications}{Virtio Transport Options / Virtio Over Messages / Device Operation / Device Notifications / Device}
\begin{itemize}
\item A device (or device-side bus) MUST send \msgref{EVENT_CONFIG} whenever
it makes a configuration change or status update that becomes visible to
the driver. The message MUST include the new configuration generation
count and MAY include the updated configuration data.
\item If the configuration data is omitted from \msgref{EVENT_CONFIG}, the
device SHOULD include the relevant offsets/lengths so the driver can
re-fetch the data via \msgref{GET_CONFIG}.
\item A device SHOULD send \msgref{EVENT_USED} to inform the driver when
buffers on a virtqueue have been consumed, unless the device relies on
an alternative, agreed-upon completion mechanism.
\end{itemize}
\drivernormative{\paragraph}{Device Notifications}{Virtio Transport Options / Virtio Over Messages / Device Operation / Device Notifications / Driver}
\begin{itemize}
\item Upon receiving \msgref{EVENT_CONFIG}, a driver SHOULD update its view of
the configuration using the provided data (or by issuing
\msgref{GET_CONFIG} if necessary) before resuming normal I/O.
\item Upon receiving \msgref{EVENT_USED}, a driver MUST examine the indicated
virtqueue (for example, by reading the used ring) to reclaim completed
buffers.
\end{itemize}
\busnormative{\paragraph}{Device Notifications}{Virtio Transport Options / Virtio Over Messages / Device Operation / Device Notifications / Bus}
\begin{itemize}
\item A bus implementation MUST forward \msgref{EVENT_CONFIG} and
\msgref{EVENT_USED} notifications (or their equivalents) to the driver,
either in-band or by synthesizing the appropriate message.
\item If a bus implementation relies on polling or other mechanisms instead of
direct notifications, it SHOULD limit that mode to scenarios where no
other notification method is available.
\end{itemize}
\subsubsection{Configuration Changes During Operation}
\label{sec:Virtio Transport Options / Virtio Over Messages / Device Operation / Configuration Changes During Operation}
Drivers may update configuration fields at runtime using \msgref{SET_CONFIG}
when features such as device modes or limits need to change. Devices can also
update configuration data autonomously but must signal those changes via
\msgref{EVENT_CONFIG}.
\drivernormative{\paragraph}{Runtime Configuration}{Virtio Transport Options / Virtio Over Messages / Device Operation / Configuration Changes During Operation / Driver}
\begin{itemize}
\item A driver MAY issue \msgref{SET_CONFIG} after initialization, provided it
includes the current configuration generation count and follows the same
validation rules as during setup.
\item Upon receiving an \msgref{EVENT_CONFIG}, the driver SHOULD refresh its
view of the configuration (via the data provided or by reissuing
\msgref{GET_CONFIG}) before relying on the updated values.
\end{itemize}
\devicenormative{\paragraph}{Runtime Configuration}{Virtio Transport Options / Virtio Over Messages / Device Operation / Configuration Changes During Operation / Device}
\begin{itemize}
\item If a device updates its configuration after initialization, it MUST send
\msgref{EVENT_CONFIG} to inform the driver of the change and provide the
new configuration generation count.
\end{itemize}
\subsubsection{Virtqueue Changes During Operation}
\label{sec:Virtio Transport Options / Virtio Over Messages / Device Operation / Virtqueue Changes During Operation}
Drivers may provision unused virtqueues later in the device lifetime by issuing
\msgref{SET_VQUEUE}, and they may reconfigure existing queues if the
VIRTIO\_F\_RING\_RESET feature has been negotiated.
\drivernormative{\paragraph}{Runtime Virtqueue Changes}{Virtio Transport Options / Virtio Over Messages / Device Operation / Virtqueue Changes During Operation / Driver}
\begin{itemize}
\item A driver MAY configure additional virtqueues after initialization using
\msgref{SET_VQUEUE}, provided it follows the same validation steps
(e.g., checking the maximum queue size).
\item If VIRTIO\_F\_RING\_RESET is negotiated, the driver SHOULD use
\msgref{RESET_VQUEUE} before reprogramming a queue to avoid races with
the device.
\end{itemize}
\devicenormative{\paragraph}{Runtime Virtqueue Changes}{Virtio Transport Options / Virtio Over Messages / Device Operation / Virtqueue Changes During Operation / Device}
\begin{itemize}
\item A device MUST honor \msgref{SET_VQUEUE} requests issued after
initialization and update the queue parameters accordingly.
\item When \msgref{RESET_VQUEUE} is received (and VIRTIO\_F\_RING\_RESET is
negotiated), the device MUST quiesce the queue and allow the driver to
reconfigure it without processing stale data.
\end{itemize}
\subsubsection{Device Reset and Shutdown}
\label{sec:Virtio Transport Options / Virtio Over Messages / Device Operation / Reset}
Drivers reset a device by writing 0 to the status field via \msgref{SET_DEVICE_STATUS},
which forces the device to discard pending operations and return to the initial state.
A device may also signal that a reset is required by sending \msgref{EVENT_CONFIG}
with the DEVICE\_NEEDS\_RESET bit set.
\drivernormative{\paragraph}{Reset and Shutdown}{Virtio Transport Options / Virtio Over Messages / Device Operation / Reset / Driver}
\begin{itemize}
\item A driver MAY request a device reset at any time by writing 0 through
\msgref{SET_DEVICE_STATUS} and MAY reinitialize the device afterwards if
it intends to resume operation.
\item If a device signals DEVICE\_NEEDS\_RESET (for example, via
\msgref{EVENT_CONFIG}), the driver SHOULD write 0 to
\msgref{SET_DEVICE_STATUS} and reinitialize the device before resuming
I/O.
\end{itemize}
\devicenormative{\paragraph}{Reset and Shutdown}{Virtio Transport Options / Virtio Over Messages / Device Operation / Reset / Device}
\begin{itemize}
\item Upon receiving a \msgref{SET_DEVICE_STATUS} write of 0, a device MUST
reset its internal state, discard pending virtqueue operations, and
present the status field as 0.
\item If the device encounters an unrecoverable error that requires driver
intervention, it SHOULD signal DEVICE\_NEEDS\_RESET (such as via
\msgref{EVENT_CONFIG}) so the driver can initiate a reset.
\end{itemize}
\subsubsection{Hotplug and Removal}
\label{sec:Virtio Transport Options / Virtio Over Messages / Device Operation / Hotplug and Removal}
If the bus supports dynamic addition or removal of devices, it can advertise
those changes with \busref{EVENT_DEVICE} (READY or REMOVED). Some platforms may
instead rely on external signals such as ACPI, device tree updates, or
hypervisor events; virtio-msg does not mandate a specific mechanism.
\busnormative{\paragraph}{Hotplug and Removal}{Virtio Transport Options / Virtio Over Messages / Device Operation / Hotplug and Removal / Bus}
\begin{itemize}
\item A bus implementation that uses \busref{EVENT_DEVICE} MUST send the READY
event when a device becomes accessible and the REMOVED event when it is
no longer available.
\item Regardless of how hotplug information is delivered, once a new device is
reported the bus SHOULD query it (e.g., via \msgref{GET_DEVICE_INFO})
and register it with the host OS. When a device is removed, the bus
SHOULD prompt the OS to quiesce and release the associated driver.
\end{itemize}
\subsection{Transport Messages}\label{sec:Virtio Transport Options / Virtio Over Messages / Transport Messages}
Transport messages configure and operate virtio devices once they have been
discovered. Unlike bus messages (which cover enumeration or hotplug), transport
messages focus on feature negotiation, configuration access, virtqueue setup,
and runtime notifications. The subsections below describe each message and how
it is used in the virtio-msg transport.
\subsubsection{Overview}
\label{sec:Virtio Transport Options / Virtio Over Messages / Transport Messages / Overview}
Drivers send transport messages to a specific device number, and the virtio-msg
device replies or emits events accordingly. The bus simply forwards these
messages after enforcing generic checks such as maximum size or verifying that
the target device exists. Most transport messages are request/response pairs,
with events reserved for asynchronous notifications.
\paragraph{Messages IDs and issuers}
\begin{tabular}{|l|l|l|}
\hline
Name & ID & Sender \\
\hline
\hline
Reserved & 0x0 & \\
\hline
Reserved & 0x1 & \\
\hline
\msgref{GET_DEVICE_INFO} & 0x2 & Driver \\
\hline
\msgref{GET_DEVICE_FEATURES} & 0x3 & Driver \\
\hline
\msgref{SET_DRIVER_FEATURES} & 0x4 & Driver \\
\hline
\msgref{GET_CONFIG} & 0x5 & Driver \\
\hline
\msgref{SET_CONFIG} & 0x6 & Driver \\
\hline
\msgref{GET_DEVICE_STATUS} & 0x7 & Driver \\
\hline
\msgref{SET_DEVICE_STATUS} & 0x8 & Driver \\
\hline
\msgref{GET_VQUEUE} & 0x9 & Driver \\
\hline
\msgref{SET_VQUEUE} & 0xA & Driver \\
\hline
\msgref{RESET_VQUEUE} & 0xB & Driver \\
\hline
\msgref{GET_SHM} & 0xC & Driver \\
\hline
\msgref{EVENT_CONFIG} & 0x40 & Device \\
\hline
\msgref{EVENT_AVAIL} & 0x41 & Driver \\
\hline
\msgref{EVENT_USED} & 0x42 & Device \\
\hline
\end{tabular}