func SaveState(vm *platform.Vm, model *machine.Model) (State, error) { // Pause the vm. // NOTE: Our model will also be stopped automatically // with model.DeviceInfo() below, but we manually pause // the Vcpus here in order to ensure they are completely // stopped prior to saving all device state. err := vm.Pause(false) if err != nil { return State{}, err } defer vm.Unpause(false) // Grab our vcpu states. vcpus, err := vm.VcpuInfo() if err != nil { return State{}, err } // Grab our devices. // NOTE: This should block until devices have // actually quiesed (finished processing outstanding // requests generated by the VCPUs). devices, err := model.DeviceInfo(vm) if err != nil { return State{}, err } // Done. return State{Vcpus: vcpus, Devices: devices}, nil }