tiny.sys.kvm
Defined in tiny.sys.
API (65)
Actions
Public operations.
Operations.closeOperations.controlOperations.mapRunOperations.openDeviceOperations.platformSupportedOperations.unmapSystem.createVmSystem.deinitSystem.memorySlotCapacitySystem.supportedCpuidSystem.supportsReadOnlyMemoryVcpu.captureVcpu.deinitVcpu.readCpuidVcpu.readMsrsVcpu.restoreVcpu.runVcpu.runStatusVcpu.setImmediateExitVcpu.setRunControlsVcpu.writeCpuidVcpu.writeMsrsVm.createVcpuVm.deinitVm.getClockVm.registerMemoryVm.setClockVm.unregisterMemoryacquiredecodeopenoperationsForprobe
Types and contracts
Public types and contracts.
AvailabilityCapabilityReceiptCapabilityStageCreateErrorDecodeErrorDirectionExitExitReasonExtensionsMapResultMemoryErrorMemoryRegionOpenAttemptOperationsRawResultRunControlsRunErrorRunStatusStateErrorSystemSystemEventKindVcpuVm
Namespaces
Public namespaces.
Values and defaults
Public values and defaults.
System.descriptor_capacityVcpu.descriptor_capacityVcpu.mapping_capacityVm.descriptor_capacityrequired_capabilitiessupportedsupported_cpuid_entries_max
Source
Source: lib/sys/src/kvm/exit.zig:4
pub const DecodeError = error{ InvalidDirection, InvalidPayload, MappingTooSmall,};Source: lib/sys/src/kvm/exit.zig:10
pub const Direction = enum(u8) { input = 0, output = 1,};Source: lib/sys/src/kvm/exit.zig:148
pub const Exit = union(enum) { unknown: Unknown, exception: Exception, io: Io, hypercall: Hypercall, debug: Debug, halted, mmio: Mmio, interrupt_window_open, shutdown, fail_entry: FailEntry, interrupted, set_task_priority, task_priority_access: TaskPriorityAccess, non_maskable_interrupt, internal_error: InternalError, watchdog, system_event: SystemEvent, ioapic_eoi: u8, msr_read: Msr, msr_write: Msr, dirty_ring_full, application_processor_reset_hold, bus_lock, notify: Notify, memory_fault: MemoryFault, unhandled: Reason,};Source: lib/sys/src/kvm/exit.zig:15
pub const Reason = enum(u32) { unknown = 0, exception = 1, io = 2, hypercall = 3, debug = 4, halted = 5, mmio = 6, interrupt_window_open = 7, shutdown = 8, fail_entry = 9, interrupted = 10, set_task_priority = 11, task_priority_access = 12, s390_intercept = 13, s390_reset = 14, dcr = 15, non_maskable_interrupt = 16, internal_error = 17, osi = 18, papr_hypercall = 19, s390_ucontrol = 20, watchdog = 21, s390_tsch = 22, epr = 23, system_event = 24, s390_stsi = 25, ioapic_eoi = 26, hyperv = 27, arm_nisv = 28, msr_read = 29, msr_write = 30, dirty_ring_full = 31, application_processor_reset_hold = 32, bus_lock = 33, xen = 34, riscv_sbi = 35, riscv_csr = 36, notify = 37, loongarch_iocsr = 38, memory_fault = 39, tdx = 40, arm_sea = 41, arm_ldst64b = 42, snp_request_certificates = 43, _,};Source: lib/sys/src/kvm/exit.zig:63
pub const SystemEventKind = enum(u32) { shutdown = 1, reset = 2, crash = 3, wakeup = 4, @"suspend" = 5, encrypted_guest_termination = 6, confidential_guest_fatal = 7, _,};Source: lib/sys/src/kvm/system.zig:8
pub const OpenAttempt = union(enum) { ready: System, rejected: types.CapabilityReceipt,};Source: lib/sys/src/kvm/system.zig:13
pub const System = struct { pub const descriptor_capacity: usize = 1; operations: types.Operations, descriptor: types.Descriptor, receipt: types.CapabilityReceipt, active: bool = true, pub fn deinit(self: *@This()) void { if (!self.active) return; std.debug.assert(self.descriptor >= 0); self.operations.close(self.descriptor); self.active = false; } pub fn createVm(self: *@This(), machine_type: u32) types.CreateError!vm.Vm { if (!self.active) return error.Closed; const result = types.controlRetry( self.operations, self.descriptor, abi.request.create_vm, machine_type, ); const descriptor = try types.createDescriptor(result); return .{ .operations = self.operations, .descriptor = descriptor, .run_mapping_bytes = self.receipt.run_mapping_bytes, .extensions = self.receipt.extensions, }; } pub fn memorySlotCapacity(self: *const @This()) u32 { std.debug.assert(self.active); return self.receipt.extensions.memory_slots; } pub fn supportsReadOnlyMemory(self: *const @This()) bool { std.debug.assert(self.active); return self.receipt.extensions.read_only_memory != 0; } pub fn supportedCpuid(self: *@This(), buffer: anytype) types.StateError!void { if (!self.active) return error.Closed; if (self.receipt.extensions.extended_cpuid == 0) { return error.UnsupportedState; } validateCpuidBuffer(@TypeOf(buffer.*)); if (buffer.count > buffer.entries.len) return error.CapacityExceeded; try types.stateControl( self.operations, self.descriptor, abi.request.get_supported_cpuid, @intFromPtr(buffer), ); }};Source: lib/sys/src/kvm/types.zig:9
pub const Availability = enum { available, unsupported, unavailable, denied, failed,};Source: lib/sys/src/kvm/types.zig:44
pub const CapabilityReceipt = struct { availability: Availability = .failed, stage: CapabilityStage = .platform, errno_code: u16 = 0, api_version: u32 = 0, run_mapping_bytes: u32 = 0, extensions: Extensions = .{},};Source: lib/sys/src/kvm/types.zig:17
pub const CapabilityStage = enum { platform, device, api_version, run_mapping, extensions, complete,};Source: lib/sys/src/kvm/types.zig:60
pub const CreateError = error{ AccessDenied, Closed, CreateFailed, ResourceLimit, UnsupportedOperation,};Source: lib/sys/src/kvm/types.zig:26
pub const Extensions = struct { user_memory: u32 = 0, extended_cpuid: u32 = 0, recommended_vcpus: u32 = 0, memory_slots: u32 = 0, multiprocessor_state: u32 = 0, vcpu_events: u32 = 0, debug_registers: u32 = 0, xsave: u32 = 0, xcrs: u32 = 0, maximum_vcpus: u32 = 0, read_only_memory: u32 = 0, maximum_vcpu_id: u32 = 0, immediate_exit: u32 = 0, special_registers_2: u32 = 0, xsave_2: u32 = 0,};Source: lib/sys/src/kvm/types.zig:102
pub const MapResult = union(enum) { mapping: []align(page_size) u8, failure: Errno,};Source: lib/sys/src/kvm/types.zig:68
pub const MemoryError = error{ AccessDenied, Closed, GuestRangeOverflow, InvalidAlignment, InvalidSlot, MemoryRegionFailed, UnsupportedFlags,};Source: lib/sys/src/kvm/types.zig:53
pub const MemoryRegion = struct { slot: u32, guest_physical_address: u64, memory: []align(page_size) u8, flags: abi.MemoryFlags = .{},};Source: lib/sys/src/kvm/types.zig:107
pub const Operations = struct { context: *anyopaque, platform_supported: *const fn (*anyopaque) bool, open_device: *const fn (*anyopaque) RawResult, control_descriptor: *const fn (*anyopaque, Descriptor, u32, usize) RawResult, map_run: *const fn (*anyopaque, Descriptor, usize) MapResult, unmap_run: *const fn (*anyopaque, []align(page_size) u8) void, close_descriptor: *const fn (*anyopaque, Descriptor) void, pub fn platformSupported(self: @This()) bool { return self.platform_supported(self.context); } pub fn openDevice(self: @This()) RawResult { return self.open_device(self.context); } pub fn control( self: @This(), descriptor: Descriptor, request: u32, argument: usize, ) RawResult { return self.control_descriptor(self.context, descriptor, request, argument); } pub fn mapRun(self: @This(), descriptor: Descriptor, len: usize) MapResult { return self.map_run(self.context, descriptor, len); } pub fn unmap(self: @This(), mapping: []align(page_size) u8) void { self.unmap_run(self.context, mapping); } pub fn close(self: @This(), descriptor: Descriptor) void { self.close_descriptor(self.context, descriptor); }};Source: lib/sys/src/kvm/types.zig:97
pub const RawResult = union(enum) { value: usize, failure: Errno,};Source: lib/sys/src/kvm/types.zig:78
pub const RunError = error{ AccessDenied, Closed, Interrupted, InvalidRunState, RunFailed, UnsupportedOperation, WouldBlock,};Source: lib/sys/src/kvm/types.zig:88
pub const StateError = error{ AccessDenied, CapacityExceeded, Closed, PartialTransfer, StateFailed, UnsupportedState,};Source: lib/sys/src/kvm/vcpu.zig:7
pub const RunControls = struct { request_interrupt_window: bool = false, cr8: u64 = 0, apic_base: u64 = 0,};Source: lib/sys/src/kvm/vcpu.zig:13
pub const RunStatus = struct { ready_for_interrupt_injection: bool, interrupts_enabled: bool, flags: u16, cr8: u64, apic_base: u64,};Source: lib/sys/src/kvm/vcpu.zig:21
pub const Vcpu = struct { pub const descriptor_capacity: usize = 1; pub const mapping_capacity: usize = 1; operations: types.Operations, descriptor: types.Descriptor, mapping: []align(types.page_size) u8, extensions: types.Extensions, active: bool = true, pub fn deinit(self: *@This()) void { if (!self.active) return; std.debug.assert(self.descriptor >= 0); std.debug.assert(self.mapping.len >= abi.minimum_run_bytes); self.operations.unmap(self.mapping); self.operations.close(self.descriptor); self.active = false; } pub fn run(self: *@This()) (types.RunError || run_exit.DecodeError)!run_exit.Exit { if (!self.active) return error.Closed; std.debug.assert(self.mapping.len >= abi.minimum_run_bytes); switch (self.operations.control(self.descriptor, abi.request.run, 0)) { .value => {}, .failure => |code| return runError(code), } return run_exit.decode(self.mapping); } pub fn setImmediateExit(self: *@This(), requested: bool) types.RunError!void { if (!self.active) return error.Closed; if (self.extensions.immediate_exit == 0) { return error.UnsupportedOperation; } std.debug.assert(self.mapping.len >= @sizeOf(abi.RunHeader)); const header: *abi.RunHeader = @ptrCast(self.mapping.ptr); @atomicStore(u8, &header.immediate_exit, @intFromBool(requested), .monotonic); } pub fn setRunControls(self: *@This(), controls: RunControls) types.RunError!void { if (!self.active) return error.Closed; const header = self.runHeader(); header.request_interrupt_window = @intFromBool(controls.request_interrupt_window); header.cr8 = controls.cr8; header.apic_base = controls.apic_base; } pub fn runStatus(self: *@This()) types.RunError!RunStatus { if (!self.active) return error.Closed; const header = self.runHeader(); return .{ .ready_for_interrupt_injection = header.ready_for_interrupt_injection != 0, .interrupts_enabled = header.interrupts_enabled != 0, .flags = header.flags, .cr8 = header.cr8, .apic_base = header.apic_base, }; } pub fn capture(self: *@This(), parts: state.Parts) types.StateError!state.Fixed { if (!self.active) return error.Closed; if (!fixedStateSupported(parts, self.extensions)) return error.UnsupportedState; var result = std.mem.zeroes(state.Fixed); result.valid = parts; try self.captureBasic(parts, &result); try self.captureExtended(parts, &result); return result; } pub fn restore(self: *@This(), snapshot: *const state.Fixed) types.StateError!void { if (!self.active) return error.Closed; if (!fixedStateSupported(snapshot.valid, self.extensions)) { return error.UnsupportedState; } try self.restoreBasic(snapshot); try self.restoreExtended(snapshot); } pub fn readMsrs(self: *@This(), buffer: anytype) types.StateError!void { if (!self.active) return error.Closed; validateMsrBuffer(@TypeOf(buffer.*)); if (buffer.count > buffer.entries.len) return error.CapacityExceeded; const result = types.controlRetry( self.operations, self.descriptor, abi.request.get_msrs, @intFromPtr(buffer), ); try expectTransfer(result, buffer.count); } pub fn writeMsrs(self: *@This(), buffer: anytype) types.StateError!void { if (!self.active) return error.Closed; validateMsrBuffer(@TypeOf(buffer.*)); if (buffer.count > buffer.entries.len) return error.CapacityExceeded; const result = types.controlRetry( self.operations, self.descriptor, abi.request.set_msrs, @intFromPtr(buffer), ); try expectTransfer(result, buffer.count); } pub fn readCpuid(self: *@This(), buffer: anytype) types.StateError!void { if (!self.active) return error.Closed; if (self.extensions.extended_cpuid == 0) return error.UnsupportedState; validateCpuidBuffer(@TypeOf(buffer.*)); if (buffer.count > buffer.entries.len) return error.CapacityExceeded; try types.stateControl( self.operations, self.descriptor, abi.request.get_cpuid, @intFromPtr(buffer), ); } pub fn writeCpuid(self: *@This(), buffer: anytype) types.StateError!void { if (!self.active) return error.Closed; if (self.extensions.extended_cpuid == 0) return error.UnsupportedState; validateCpuidBuffer(@TypeOf(buffer.*)); if (buffer.count > buffer.entries.len) return error.CapacityExceeded; try types.stateControl( self.operations, self.descriptor, abi.request.set_cpuid, @intFromPtr(buffer), ); } fn captureBasic( self: *@This(), parts: state.Parts, result: *state.Fixed, ) types.StateError!void { if (parts.registers) try self.get(abi.request.get_registers, &result.registers); if (parts.special_registers) { try self.get(abi.request.get_special_registers, &result.special_registers); } if (parts.fpu) try self.get(abi.request.get_fpu, &result.fpu); } fn captureExtended( self: *@This(), parts: state.Parts, result: *state.Fixed, ) types.StateError!void { if (parts.events) try self.get(abi.request.get_vcpu_events, &result.events); if (parts.debug_registers) { try self.get(abi.request.get_debug_registers, &result.debug_registers); } if (parts.xsave) try self.get(abi.request.get_xsave, &result.xsave); if (parts.xcrs) try self.get(abi.request.get_xcrs, &result.xcrs); if (parts.multiprocessor) { try self.get(abi.request.get_mp_state, &result.multiprocessor); } } fn restoreBasic(self: *@This(), snapshot: *const state.Fixed) types.StateError!void { if (snapshot.valid.special_registers) { try self.set(abi.request.set_special_registers, &snapshot.special_registers); } if (snapshot.valid.registers) { try self.set(abi.request.set_registers, &snapshot.registers); } if (snapshot.valid.fpu) try self.set(abi.request.set_fpu, &snapshot.fpu); } fn restoreExtended( self: *@This(), snapshot: *const state.Fixed, ) types.StateError!void { if (snapshot.valid.events) { try self.set(abi.request.set_vcpu_events, &snapshot.events); } if (snapshot.valid.debug_registers) { try self.set(abi.request.set_debug_registers, &snapshot.debug_registers); } if (snapshot.valid.xsave) try self.set(abi.request.set_xsave, &snapshot.xsave); if (snapshot.valid.xcrs) try self.set(abi.request.set_xcrs, &snapshot.xcrs); if (snapshot.valid.multiprocessor) { try self.set(abi.request.set_mp_state, &snapshot.multiprocessor); } } fn get(self: *@This(), request: u32, destination: anytype) types.StateError!void { std.debug.assert(request != 0); try types.stateControl( self.operations, self.descriptor, request, @intFromPtr(destination), ); } fn set(self: *@This(), request: u32, source: anytype) types.StateError!void { std.debug.assert(request != 0); try types.stateControl( self.operations, self.descriptor, request, @intFromPtr(source), ); } fn runHeader(self: *@This()) *abi.RunHeader { std.debug.assert(self.mapping.len >= @sizeOf(abi.RunHeader)); return @ptrCast(self.mapping.ptr); }};Source: lib/sys/src/kvm/vm.zig:6
pub const Vm = struct { pub const descriptor_capacity: usize = 1; operations: types.Operations, descriptor: types.Descriptor, run_mapping_bytes: u32, extensions: types.Extensions, active: bool = true, pub fn deinit(self: *@This()) void { if (!self.active) return; std.debug.assert(self.descriptor >= 0); self.operations.close(self.descriptor); self.active = false; } pub fn registerMemory( self: *@This(), region: types.MemoryRegion, ) types.MemoryError!void { if (!self.active) return error.Closed; try validateMemory(region, self.extensions); const raw: abi.UserMemoryRegion = .{ .slot = region.slot, .flags = region.flags.bits(), .guest_physical_address = region.guest_physical_address, .memory_size = @intCast(region.memory.len), .userspace_address = @intFromPtr(region.memory.ptr), }; try memoryControl(self.operations, self.descriptor, &raw); } pub fn unregisterMemory(self: *@This(), slot: u32) types.MemoryError!void { if (!self.active) return error.Closed; if (self.extensions.memory_slots != 0 and slot >= self.extensions.memory_slots) { return error.InvalidSlot; } const raw: abi.UserMemoryRegion = .{ .slot = slot, .flags = 0, .guest_physical_address = 0, .memory_size = 0, .userspace_address = 0, }; try memoryControl(self.operations, self.descriptor, &raw); } pub fn createVcpu(self: *@This(), identifier: u32) types.CreateError!vcpu.Vcpu { if (!self.active) return error.Closed; if (self.extensions.maximum_vcpu_id != 0 and identifier >= self.extensions.maximum_vcpu_id) { return error.UnsupportedOperation; } const result = types.controlRetry( self.operations, self.descriptor, abi.request.create_vcpu, identifier, ); const descriptor = try types.createDescriptor(result); return createVcpuMapping(self, descriptor); } pub fn getClock(self: *@This()) types.StateError!abi.Clock { if (!self.active) return error.Closed; var clock = std.mem.zeroes(abi.Clock); try types.stateControl( self.operations, self.descriptor, abi.request.get_clock, @intFromPtr(&clock), ); return clock; } pub fn setClock(self: *@This(), clock: *const abi.Clock) types.StateError!void { if (!self.active) return error.Closed; try types.stateControl( self.operations, self.descriptor, abi.request.set_clock, @intFromPtr(clock), ); } fn createVcpuMapping( self: *@This(), descriptor: types.Descriptor, ) types.CreateError!vcpu.Vcpu { std.debug.assert(self.run_mapping_bytes >= abi.minimum_run_bytes); const mapping = switch (self.operations.mapRun( descriptor, self.run_mapping_bytes, )) { .mapping => |value| value, .failure => |code| { self.operations.close(descriptor); return types.createError(code); }, }; std.debug.assert(mapping.len >= self.run_mapping_bytes); return .{ .operations = self.operations, .descriptor = descriptor, .mapping = mapping, .extensions = self.extensions, }; }};Source: lib/sys/src/kvm/exit.zig:257
pub fn decode(mapping: []align(std.heap.page_size_min) u8) DecodeError!Exit { if (mapping.len < abi.minimum_run_bytes) return error.MappingTooSmall; const header = view(abi.RunHeader, mapping); const reason: Reason = @fromBackingInt(@intCast(header.exit_reason)); return switch (reason) { .unknown => decodeUnknown(mapping), .exception => decodeException(mapping), .io => decodeIo(mapping), .hypercall => decodeHypercall(mapping), .debug => decodeDebug(mapping), .halted => .halted, .mmio => decodeMmio(mapping), .interrupt_window_open => .interrupt_window_open, .shutdown => .shutdown, .fail_entry => decodeFailEntry(mapping), .interrupted => .interrupted, .set_task_priority => .set_task_priority, .task_priority_access => decodeTaskPriorityAccess(mapping), .non_maskable_interrupt => .non_maskable_interrupt, .internal_error => decodeInternalError(mapping), .watchdog => .watchdog, .system_event => decodeSystemEvent(mapping), .ioapic_eoi => decodeIoapicEoi(mapping), .msr_read => .{ .msr_read = decodeMsr(mapping) }, .msr_write => .{ .msr_write = decodeMsr(mapping) }, .dirty_ring_full => .dirty_ring_full, .application_processor_reset_hold => .application_processor_reset_hold, .bus_lock => .bus_lock, .notify => decodeNotify(mapping), .memory_fault => decodeMemoryFault(mapping), else => .{ .unhandled = reason }, };}Source: lib/sys/src/kvm/linux.zig:7
pub const supported = builtin.os.tag == .linux and builtin.cpu.arch == .x86_64;Source: lib/sys/src/kvm/system.zig:110
pub fn acquire(operations: types.Operations) OpenAttempt { var receipt: types.CapabilityReceipt = .{}; if (!operations.platformSupported()) { receipt.availability = .unsupported; return .{ .rejected = receipt }; } receipt.stage = .device; const descriptor = openDescriptor(operations, &receipt) orelse { return .{ .rejected = receipt }; }; if (!readApiVersion(operations, descriptor, &receipt)) { operations.close(descriptor); return .{ .rejected = receipt }; } if (!readRunMappingSize(operations, descriptor, &receipt)) { operations.close(descriptor); return .{ .rejected = receipt }; } if (!readExtensions(operations, descriptor, &receipt)) { operations.close(descriptor); return .{ .rejected = receipt }; } receipt.availability = .available; receipt.stage = .complete; return .{ .ready = .{ .operations = operations, .descriptor = descriptor, .receipt = receipt, } };}Source: lib/sys/src/kvm/system.zig:94
pub fn open() OpenAttempt { return acquire(linux.operations());}Source: lib/sys/src/kvm/system.zig:98
pub fn probe() types.CapabilityReceipt { return switch (open()) { .ready => |value| result: { var system = value; const receipt = system.receipt; system.deinit(); break :result receipt; }, .rejected => |receipt| receipt, };}Source: lib/sys/src/kvm/system.zig:7
pub const supported_cpuid_entries_max: usize = 256;Source: lib/sys/src/kvm/types.zig:183
pub fn operationsFor(implementation: anytype) Operations { const pointer = @typeInfo(@TypeOf(implementation)).pointer; const ImplementationAdapter = Adapter(pointer.child); return .{ .context = implementation, .platform_supported = ImplementationAdapter.platformSupported, .open_device = ImplementationAdapter.openDevice, .control_descriptor = ImplementationAdapter.control, .map_run = ImplementationAdapter.mapRun, .unmap_run = ImplementationAdapter.unmap, .close_descriptor = ImplementationAdapter.close, };}Source: lib/sys/src/kvm/root.zig
const sys = @import("../root.zig");const linux = @import("linux.zig");const run_exit = @import("exit.zig");const system = @import("system.zig");const types = @import("types.zig");const vcpu = @import("vcpu.zig");const vm = @import("vm.zig");pub const abi = @import("abi.zig");pub const state = @import("state.zig");pub const required_capabilities = sys.capabilities.noLibc(&.{ .descriptors, .memory_mapping, .virtualization,});pub const supported = linux.supported;pub const Availability = types.Availability;pub const CapabilityReceipt = types.CapabilityReceipt;pub const CapabilityStage = types.CapabilityStage;pub const Extensions = types.Extensions;pub const MemoryRegion = types.MemoryRegion;pub const MapResult = types.MapResult;pub const OpenAttempt = system.OpenAttempt;pub const Operations = types.Operations;pub const System = system.System;pub const Vm = vm.Vm;pub const Vcpu = vcpu.Vcpu;pub const RunControls = vcpu.RunControls;pub const RunStatus = vcpu.RunStatus;pub const RawResult = types.RawResult;pub const CreateError = types.CreateError;pub const MemoryError = types.MemoryError;pub const RunError = types.RunError;pub const StateError = types.StateError;pub const DecodeError = run_exit.DecodeError;pub const Direction = run_exit.Direction;pub const Exit = run_exit.Exit;pub const ExitReason = run_exit.Reason;pub const SystemEventKind = run_exit.SystemEventKind;pub const decode = run_exit.decode;pub const acquire = system.acquire;pub const open = system.open;pub const operationsFor = types.operationsFor;pub const probe = system.probe;pub const supported_cpuid_entries_max = system.supported_cpuid_entries_max;Source: lib/sys/src/root.zig:35
pub const kvm = @import("kvm/root.zig");Complete call list for kvm.decode
15 direct calls.
lib.sys.src.kvm.exit.decodeDebug[function] — private source atlib/sys/src/kvm/exit.zig:327in nearest public ownerlib.sys.src.kvm.exitlib.sys.src.kvm.exit.decodeException[function] — private source atlib/sys/src/kvm/exit.zig:296in nearest public ownerlib.sys.src.kvm.exitlib.sys.src.kvm.exit.decodeFailEntry[function] — private source atlib/sys/src/kvm/exit.zig:357in nearest public ownerlib.sys.src.kvm.exitlib.sys.src.kvm.exit.decodeHypercall[function] — private source atlib/sys/src/kvm/exit.zig:347in nearest public ownerlib.sys.src.kvm.exitlib.sys.src.kvm.exit.decodeInternalError[function] — private source atlib/sys/src/kvm/exit.zig:377in nearest public ownerlib.sys.src.kvm.exitlib.sys.src.kvm.exit.decodeIo[function] — private source atlib/sys/src/kvm/exit.zig:301in nearest public ownerlib.sys.src.kvm.exitlib.sys.src.kvm.exit.decodeIoapicEoi[function] — private source atlib/sys/src/kvm/exit.zig:373in nearest public ownerlib.sys.src.kvm.exitlib.sys.src.kvm.exit.decodeMemoryFault[function] — private source atlib/sys/src/kvm/exit.zig:410in nearest public ownerlib.sys.src.kvm.exitlib.sys.src.kvm.exit.decodeMmio[function] — private source atlib/sys/src/kvm/exit.zig:337in nearest public ownerlib.sys.src.kvm.exitlib.sys.src.kvm.exit.decodeMsr[function] — private source atlib/sys/src/kvm/exit.zig:395in nearest public ownerlib.sys.src.kvm.exitlib.sys.src.kvm.exit.decodeNotify[function] — private source atlib/sys/src/kvm/exit.zig:405in nearest public ownerlib.sys.src.kvm.exitlib.sys.src.kvm.exit.decodeSystemEvent[function] — private source atlib/sys/src/kvm/exit.zig:386in nearest public ownerlib.sys.src.kvm.exitlib.sys.src.kvm.exit.decodeTaskPriorityAccess[function] — private source atlib/sys/src/kvm/exit.zig:365in nearest public ownerlib.sys.src.kvm.exitlib.sys.src.kvm.exit.decodeUnknown[function] — private source atlib/sys/src/kvm/exit.zig:291in nearest public ownerlib.sys.src.kvm.exitlib.sys.src.kvm.exit.view[function] — private source atlib/sys/src/kvm/exit.zig:419in nearest public ownerlib.sys.src.kvm.exit
Audit
| Definitions | 64 |
|---|---|
| Public names | 64 |
| Members | 180 |
| Version | 26.7.0 |
| Revision | daab053ee433 |