Skip to documentation
SLOP

tiny.sys.kvm

Reference tiny.sys kvm

Defined in tiny.sys.

API (65)

Actions

Public operations.

Types and contracts

Public types and contracts.

Namespaces

Public namespaces.

Values and defaults

Public values and defaults.

No direct callersNo direct callstiny.syskvm
Static calls · unresolved targets: unknown · external targets: unknown.

Source

Source: lib/sys/src/kvm/exit.zig:4

zig
pub const DecodeError = error{    InvalidDirection,    InvalidPayload,    MappingTooSmall,};

Source: lib/sys/src/kvm/exit.zig:10

zig
pub const Direction = enum(u8) {    input = 0,    output = 1,};

Source: lib/sys/src/kvm/exit.zig:148

zig
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

zig
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

zig
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

zig
pub const OpenAttempt = union(enum) {    ready: System,    rejected: types.CapabilityReceipt,};

Source: lib/sys/src/kvm/system.zig:13

zig
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

zig
pub const Availability = enum {    available,    unsupported,    unavailable,    denied,    failed,};

Source: lib/sys/src/kvm/types.zig:44

zig
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

zig
pub const CapabilityStage = enum {    platform,    device,    api_version,    run_mapping,    extensions,    complete,};

Source: lib/sys/src/kvm/types.zig:60

zig
pub const CreateError = error{    AccessDenied,    Closed,    CreateFailed,    ResourceLimit,    UnsupportedOperation,};

Source: lib/sys/src/kvm/types.zig:26

zig
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

zig
pub const MapResult = union(enum) {    mapping: []align(page_size) u8,    failure: Errno,};

Source: lib/sys/src/kvm/types.zig:68

zig
pub const MemoryError = error{    AccessDenied,    Closed,    GuestRangeOverflow,    InvalidAlignment,    InvalidSlot,    MemoryRegionFailed,    UnsupportedFlags,};

Source: lib/sys/src/kvm/types.zig:53

zig
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

zig
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

zig
pub const RawResult = union(enum) {    value: usize,    failure: Errno,};

Source: lib/sys/src/kvm/types.zig:78

zig
pub const RunError = error{    AccessDenied,    Closed,    Interrupted,    InvalidRunState,    RunFailed,    UnsupportedOperation,    WouldBlock,};

Source: lib/sys/src/kvm/types.zig:88

zig
pub const StateError = error{    AccessDenied,    CapacityExceeded,    Closed,    PartialTransfer,    StateFailed,    UnsupportedState,};

Source: lib/sys/src/kvm/vcpu.zig:7

zig
pub const RunControls = struct {    request_interrupt_window: bool = false,    cr8: u64 = 0,    apic_base: u64 = 0,};

Source: lib/sys/src/kvm/vcpu.zig:13

zig
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

zig
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

zig
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

zig
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 },    };}
Called byCallstest sourcelib.sys.src.kvm.exittest: run exit decoder bounds interna...test sourcelib.sys.src.kvm.exittest: run exit decoder exposes bounde...test sourcelib.sys.src.kvm.exittest: run exit decoder exposes bounde...test sourcelib.sys.src.kvm.exittest: run exit decoder rejects data b...private sourcelib.sys.src.kvm.exitdecodeDebugprivate sourcelib.sys.src.kvm.exitdecodeExceptionprivate sourcelib.sys.src.kvm.exitdecodeFailEntryprivate sourcelib.sys.src.kvm.exitdecodeHypercallprivate sourcelib.sys.src.kvm.exitdecodeInternalError+10 morekvmdecode
Static calls · unresolved targets: 1 · external targets: 0.

Source: lib/sys/src/kvm/linux.zig:7

zig
pub const supported = builtin.os.tag == .linux and builtin.cpu.arch == .x86_64;
Called byCallsNo direct callersprivate sourcelib.sys.src.kvm.typescontrolRetryprivate sourcelib.sys.src.kvm.typescreateDescriptorkvm.SystemcreateVm
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callerskvm.Operationsclosekvm.Systemdeinit
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callersprivate sourcelib.sys.src.kvm.systemvalidateCpuidBufferprivate sourcelib.sys.src.kvm.typesstateControlkvm.SystemsupportedCpuid
Static calls · unresolved targets: 0 · external targets: 0.

Source: lib/sys/src/kvm/system.zig:110

zig
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,    } };}
Called byCallskvmopenprivate sourcelib.sys.src.kvm.systemopenDescriptorprivate sourcelib.sys.src.kvm.systemreadApiVersionprivate sourcelib.sys.src.kvm.systemreadExtensionsprivate sourcelib.sys.src.kvm.systemreadRunMappingSizekvmacquire
Static calls · unresolved targets: 1 · external targets: 1.

Source: lib/sys/src/kvm/system.zig:94

zig
pub fn open() OpenAttempt {    return acquire(linux.operations());}
Called byCallskvmprobeprivate sourcelib.sys.src.kvm.linuxoperationskvmacquirekvmopen
Static calls · unresolved targets: 0 · external targets: 0.

Source: lib/sys/src/kvm/system.zig:98

zig
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,    };}
Called byCallsNo direct callerskvmopenkvmprobe
Static calls · unresolved targets: 0 · external targets: 1.

Source: lib/sys/src/kvm/system.zig:7

zig
pub const supported_cpuid_entries_max: usize = 256;
Called byCallsNo direct callskvm.Systemdeinitkvm.Vcpudeinitprivate sourcelib.sys.src.kvm.vm.VmcreateVcpuMappingkvm.Vmdeinitkvm.Operationsclose
Static calls · unresolved targets: 1 · external targets: 0.
Called byCallsNo direct callskvm.Vcpurunkvm.Operationscontrol
Static calls · unresolved targets: 1 · external targets: 0.
Called byCallsNo direct callsprivate sourcelib.sys.src.kvm.vm.VmcreateVcpuMappingkvm.OperationsmapRun
Static calls · unresolved targets: 1 · external targets: 0.
Called byCallsNo direct callskvm.Vcpudeinitkvm.Operationsunmap
Static calls · unresolved targets: 2 · external targets: 0.

Source: lib/sys/src/kvm/types.zig:183

zig
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,    };}
Called byCallsprivate sourcelib.sys.src.kvm.linuxoperationsprivate sourcelib.sys.src.kvm.testexpectDeviceRejectionprivate sourcelib.sys.src.kvm.testreadySystemtest sourcelib.sys.src.kvm.testtest: KVM capability receipt classifi...test sourcelib.sys.src.kvm.testtest: KVM capability receipt closes r...private sourcelib.sys.src.kvm.typesAdapterkvmoperationsFor
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callersprivate sourcelib.sys.src.kvm.vcpu.VcpucaptureBasicprivate sourcelib.sys.src.kvm.vcpu.VcpucaptureExtendedprivate sourcelib.sys.src.kvm.vcpufixedStateSupportedkvm.Vcpucapture
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callerskvm.Operationsclosekvm.Operationsunmapkvm.Vcpudeinit
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callersprivate sourcelib.sys.src.kvm.typesstateControlprivate sourcelib.sys.src.kvm.vcpuvalidateCpuidBufferkvm.VcpureadCpuid
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callersprivate sourcelib.sys.src.kvm.typescontrolRetryprivate sourcelib.sys.src.kvm.vcpuexpectTransferprivate sourcelib.sys.src.kvm.vcpuvalidateMsrBufferkvm.VcpureadMsrs
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callersprivate sourcelib.sys.src.kvm.vcpu.VcpurestoreBasicprivate sourcelib.sys.src.kvm.vcpu.VcpurestoreExtendedprivate sourcelib.sys.src.kvm.vcpufixedStateSupportedkvm.Vcpurestore
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callerskvm.Operationscontrolprivate sourcelib.sys.src.kvm.vcpurunErrorkvm.Vcpurun
Static calls · unresolved targets: 1 · external targets: 0.
Called byCallsNo direct callersprivate sourcelib.sys.src.kvm.vcpu.VcpurunHeaderkvm.VcpurunStatus
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callersprivate sourcelib.sys.src.kvm.vcpu.VcpurunHeaderkvm.VcpusetRunControls
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callersprivate sourcelib.sys.src.kvm.typesstateControlprivate sourcelib.sys.src.kvm.vcpuvalidateCpuidBufferkvm.VcpuwriteCpuid
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callersprivate sourcelib.sys.src.kvm.typescontrolRetryprivate sourcelib.sys.src.kvm.vcpuexpectTransferprivate sourcelib.sys.src.kvm.vcpuvalidateMsrBufferkvm.VcpuwriteMsrs
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callersprivate sourcelib.sys.src.kvm.typescontrolRetryprivate sourcelib.sys.src.kvm.typescreateDescriptorprivate sourcelib.sys.src.kvm.vm.VmcreateVcpuMappingkvm.VmcreateVcpu
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callerskvm.Operationsclosekvm.Vmdeinit
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callersprivate sourcelib.sys.src.kvm.typesstateControlkvm.VmgetClock
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callersprivate sourcelib.sys.src.kvm.vmmemoryControlprivate sourcelib.sys.src.kvm.vmvalidateMemorykvm.VmregisterMemory
Static calls · unresolved targets: 0 · external targets: 1.
Called byCallsNo direct callersprivate sourcelib.sys.src.kvm.typesstateControlkvm.VmsetClock
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callersprivate sourcelib.sys.src.kvm.vmmemoryControlkvm.VmunregisterMemory
Static calls · unresolved targets: 0 · external targets: 0.

Source: lib/sys/src/kvm/root.zig

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

zig
pub const kvm = @import("kvm/root.zig");

Complete call list for kvm.decode

15 direct calls.

Audit

Definitions64
Public names64
Members180
Version26.7.0
Revisiondaab053ee433