The folded header stops being a rule in a document and becomes the layout on the wire. Verbs number from sixteen, leaving describe, enumerate, subscribe and unsubscribe reserved and answered the same way by every provider — none of them writes a line to do it. What each protocol used to carry in a field of its own now travels in the header: a vfs node and a display layer are the packet's target, and a reply opens with a status the envelope stamps rather than one each protocol spelled for itself. Display gains the most. One forty-byte request had served eleven verbs, so attach_scanout smuggled stride through x, refresh through y and format through colour, and every coordinate crossed as a bitcast. Per-operation structs end all three: the fields have their own names and their own signs, and the tile payload grows to 224 bytes because the prefix shrank. Scanout loses a message maximum of 64 it had no business declaring — it answers calls, and the floor for a call is 256 — and virtio-gpu stops hard-coding that number at its harness. Two changes are semantic rather than notational. A directory now ends at an entry with no name, because the fixed part of a reply always travels and a zero-length reply no longer exists to mean anything. And input joins the service harness, the last loop in the tree that answered no ping and heard no terminate; its subscriber table, its pruning and its fan-out are the same code, and a shutdown now asks it to stop instead of killing it. A new conformance case reads the registry's own listing and asks every protocol it finds for its name, its version and its verb count, then offers a verb nobody defines and requires -ENOSYS — the envelope's promise, checked against providers rather than against itself. What it cannot reach in that boot it names on the serial line instead of passing quietly. Suite 110/110.
34 lines
1.3 KiB
Zig
34 lines
1.3 KiB
Zig
//! The virtio-gpu driver as a binary package (docs/build-packages-plan.md):
|
|
//! this file names the binary and EXACTLY the modules its source imports —
|
|
//! build-support resolves each name from the domains this zon declares.
|
|
|
|
const std = @import("std");
|
|
const build_support = @import("build-support");
|
|
|
|
pub fn build(b: *std.Build) void {
|
|
const exe = build_support.userBinary(b, .{
|
|
.name = "virtio-gpu",
|
|
.root_source_file = b.path("virtio-gpu.zig"),
|
|
.imports = &.{
|
|
"channel", "display-protocol", "driver", "envelope", "ipc", "logging", "memory",
|
|
"mmio", "pci", "process", "scanout-protocol", "service", "time",
|
|
},
|
|
});
|
|
b.installArtifact(exe);
|
|
|
|
// Standalone `zig build test`; the root aggregate depends on this step.
|
|
const test_step = b.step("test", "Run the virtio-gpu unit tests");
|
|
for ([_][]const u8{
|
|
"virtio-gpu-protocol.zig", // virtio-gpu command struct sizes
|
|
"virtio-pci.zig", // virtio 1.0 PCI transport struct sizes
|
|
}) |test_root| {
|
|
const unit_tests = b.addTest(.{
|
|
.root_module = b.createModule(.{
|
|
.root_source_file = b.path(test_root),
|
|
.target = b.resolveTargetQuery(.{}),
|
|
}),
|
|
});
|
|
test_step.dependOn(&b.addRunArtifact(unit_tests).step);
|
|
}
|
|
}
|