Files
luma/Sources/LumaCore/VirtualMachines/VirtualMachine.swift
Ole André Vadla Ravnås f6ae01c34f core: Tell a System.map from a kernel image
QEMU hands over a System.map, which LinuxKernelImage cannot read, so no
barebone device was added. Let each machine say which kind it has.
2026-09-26 21:54:46 +02:00

76 lines
2.4 KiB
Swift

import Foundation
@MainActor
public protocol VirtualMachine: AnyObject, Identifiable {
var id: UUID { get }
var name: String { get }
var template: VirtualMachineTemplate { get }
var state: VirtualMachineState { get }
var capabilities: VirtualMachineCapabilities { get }
var display: VirtualMachineDisplay? { get }
var debugStub: BareboneDebugStub? { get }
var agentTransport: BareboneAgentTransport? { get }
var kernelSymbols: BareboneKernelSymbols? { get }
func captureReadySnapshot() async throws
func restoreReadySnapshot() async throws
func discardReadySnapshot() async throws
func shutDown() async
}
extension VirtualMachine {
public var kernelSymbols: BareboneKernelSymbols? {
nil
}
}
public enum VirtualMachineState: Sendable, Equatable {
case starting
case installing(fraction: Double)
case running
case capturingSnapshot
case restoringSnapshot
case stopped
case failed(reason: String)
}
public struct VirtualMachineCapabilities: OptionSet, Sendable {
public let rawValue: Int
public static let snapshot = VirtualMachineCapabilities(rawValue: 1 << 0)
public static let liveDisplay = VirtualMachineCapabilities(rawValue: 1 << 1)
public static let input = VirtualMachineCapabilities(rawValue: 1 << 2)
public init(rawValue: Int) {
self.rawValue = rawValue
}
}
public enum BareboneAgentTransport: Sendable, Equatable {
case hostlink(qmp: String, bus: String?, fabric: BareboneHostlinkFabric)
case vsock(socketPath: URL, port: UInt)
/// The guest dials out over vsock and the emulator bridges it to this host UNIX socket; the
/// path is whitelisted in the emulator by the barebone backend's instrumentation.
case pipeVsock(socketPath: URL)
}
public enum BareboneHostlinkFabric: Sendable, Equatable {
case ports
case ecam(base: UInt64)
case mmio
}
public enum BareboneDebugStub: Sendable, Equatable {
case gdbRemote(host: String, port: UInt16)
case virtualization(pid: UInt)
/// The Android emulator's gdbstub, reachable over host/port but unusable until the backend
/// instruments the hosting qemu process at `pid`.
case androidEmulator(host: String, port: UInt16, pid: UInt)
}
public enum BareboneKernelSymbols: Sendable, Equatable {
case linuxImage(URL)
case linuxSystemMap(URL)
case xnuKernelcache(URL)
}