From: Mike Larkin Subject: Re: remove vmd's send/receive functionality To: Dave Voutila Cc: tech@openbsd.org Date: Mon, 9 Jun 2025 08:57:26 -0700 On Thu, Jun 05, 2025 at 10:10:14PM -0400, Dave Voutila wrote: > This diff nukes it from vmd(8) and vmctl(8). There's a vmm(4) ioctl we > could nuke afterwards as well, but I wanted to keep this immediate > change userland focused. > > vmd's send/receive functionality has been broken for some time now. I'd > guess a few months. Nobody has noticed or I've not noticed anyone > noticing. Clearly it has few users. > > I took a look at fixing it, yet again. It's often broken by advancements > elsewhere in vmd. (Usually by me!) This time, it's proving to be a bit > more pain to root cause and fix fully. *shrug* > > At this point: > > 1. it just gets in the way of new things I'm working on (hint: dragging > vmd's virtio devices from v0.9 dark ages to modern v1.x) > 2. I don't personally use it > 3. I don't get help keeping it working > > 3 strikes, it's out. > > ok? ok mlarkin interested parties can resurrect it from the attic someday. -ml > > > diffstat /usr/src > M usr.sbin/vmctl/main.c | 0+ 43- > M usr.sbin/vmctl/vmctl.8 | 0+ 14- > M usr.sbin/vmctl/vmctl.c | 0+ 78- > M usr.sbin/vmctl/vmctl.h | 0+ 2- > M usr.sbin/vmd/arm64_vm.c | 0+ 24- > M usr.sbin/vmd/config.c | 5+ 12- > M usr.sbin/vmd/control.c | 0+ 3- > M usr.sbin/vmd/vioblk.c | 0+ 12- > M usr.sbin/vmd/vionet.c | 0+ 36- > M usr.sbin/vmd/vm.c | 8+ 238- > M usr.sbin/vmd/vmd.c | 2+ 118- > M usr.sbin/vmd/vmd.h | 0+ 5- > M usr.sbin/vmd/vmm.c | 4+ 44- > M usr.sbin/vmd/x86_vm.c | 0+ 245- > > 14 files changed, 19 insertions(+), 874 deletions(-) > > diff /usr/src > path + /usr/src > commit - 9260884d99d8c4ba4d2a8372e6dee6765b6149b7 > blob - fd60e9d48d0423da507e2b4f7178e3e12ece8652 > file + usr.sbin/vmctl/main.c > --- usr.sbin/vmctl/main.c > +++ usr.sbin/vmctl/main.c > @@ -63,8 +63,6 @@ int ctl_stop(struct parse_result *, int, char *[]); > int ctl_waitfor(struct parse_result *, int, char *[]); > int ctl_pause(struct parse_result *, int, char *[]); > int ctl_unpause(struct parse_result *, int, char *[]); > -int ctl_send(struct parse_result *, int, char *[]); > -int ctl_receive(struct parse_result *, int, char *[]); > > struct ctl_command ctl_commands[] = { > { "console", CMD_CONSOLE, ctl_console, "id" }, > @@ -73,10 +71,8 @@ struct ctl_command ctl_commands[] = { > { "load", CMD_LOAD, ctl_load, "filename" }, > { "log", CMD_LOG, ctl_log, "[brief | verbose]" }, > { "pause", CMD_PAUSE, ctl_pause, "id" }, > - { "receive", CMD_RECEIVE, ctl_receive, "name" , 1}, > { "reload", CMD_RELOAD, ctl_reload, "" }, > { "reset", CMD_RESET, ctl_reset, "[all | switches | vms]" }, > - { "send", CMD_SEND, ctl_send, "id", 1}, > { "show", CMD_STATUS, ctl_status, "[id]" }, > { "start", CMD_START, ctl_start, > "[-cL] [-B device] [-b path] [-d disk] [-i count]\n" > @@ -257,14 +253,6 @@ vmmaction(struct parse_result *res) > case CMD_UNPAUSE: > unpause_vm(res->id, res->name); > break; > - case CMD_SEND: > - send_vm(res->id, res->name); > - done = 1; > - ret = 0; > - break; > - case CMD_RECEIVE: > - vm_receive(res->id, res->name); > - break; > case CMD_CREATE: > case NONE: > /* The action is not expected here */ > @@ -325,9 +313,6 @@ vmmaction(struct parse_result *res) > case CMD_PAUSE: > done = pause_vm_complete(&imsg, &ret); > break; > - case CMD_RECEIVE: > - done = vm_start_complete(&imsg, &ret, 0); > - break; > case CMD_UNPAUSE: > done = unpause_vm_complete(&imsg, &ret); > break; > @@ -1012,34 +997,6 @@ ctl_unpause(struct parse_result *res, int argc, char * > return (vmmaction(res)); > } > > -int > -ctl_send(struct parse_result *res, int argc, char *argv[]) > -{ > - if (pledge("stdio unix sendfd unveil", NULL) == -1) > - err(1, "pledge"); > - if (argc == 2) { > - if (parse_vmid(res, argv[1], 0) == -1) > - errx(1, "invalid id: %s", argv[1]); > - } else if (argc != 2) > - ctl_usage(res->ctl); > - > - return (vmmaction(res)); > -} > - > -int > -ctl_receive(struct parse_result *res, int argc, char *argv[]) > -{ > - if (pledge("stdio unix sendfd unveil", NULL) == -1) > - err(1, "pledge"); > - if (argc == 2) { > - if (parse_vmid(res, argv[1], 1) == -1) > - errx(1, "invalid id: %s", argv[1]); > - } else if (argc != 2) > - ctl_usage(res->ctl); > - > - return (vmmaction(res)); > -} > - > __dead void > ctl_openconsole(const char *name) > { > commit - 9260884d99d8c4ba4d2a8372e6dee6765b6149b7 > blob - e76460bcd6af6b43c298a7976300e3d2eb100ed6 > file + usr.sbin/vmctl/vmctl.8 > --- usr.sbin/vmctl/vmctl.8 > +++ usr.sbin/vmctl/vmctl.8 > @@ -117,9 +117,6 @@ Disable or enable verbose debug logging. > .It Cm pause Ar id > Pause a VM with the specified > .Ar id . > -.It Cm receive Ar name > -Receive a VM from standard input and start it with the specified > -.Ar name . > .It Cm reload > Remove all stopped VMs and reload the configuration from the default > configuration file. > @@ -132,17 +129,6 @@ reset > .Cm switches , > or reset and terminate all > .Cm vms . > -.It Cm send Ar id > -Send a VM with the specified > -.Ar id > -to standard output and terminate it. > -The VM is paused during send processing. > -Data sent to standard output contains the VM parameters and its memory, > -not the disk image. > -.Pp > -In order to move a VM from one host to another, disk files must be > -synced between the send and the receive processes and must be located > -under the same path. > .It Cm show Oo Fl r Oc Op Ar id > An alias for the > .Cm status > commit - 9260884d99d8c4ba4d2a8372e6dee6765b6149b7 > blob - 7c4388fdcb9ff1d7b72cc449df826948b576261a > file + usr.sbin/vmctl/vmctl.c > --- usr.sbin/vmctl/vmctl.c > +++ usr.sbin/vmctl/vmctl.c > @@ -291,84 +291,6 @@ vm_start_complete(struct imsg *imsg, int *ret, int aut > } > > void > -send_vm(uint32_t id, const char *name) > -{ > - struct vmop_id vid; > - int fds[2], readn, writen; > - long pagesz; > - char *buf; > - > - pagesz = getpagesize(); > - buf = malloc(pagesz); > - if (buf == NULL) > - errx(1, "%s: memory allocation failure", __func__); > - > - memset(&vid, 0, sizeof(vid)); > - vid.vid_id = id; > - if (name != NULL) > - strlcpy(vid.vid_name, name, sizeof(vid.vid_name)); > - if (socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC, fds) == -1) { > - warnx("%s: socketpair creation failed", __func__); > - } else { > - imsg_compose(ibuf, IMSG_VMDOP_SEND_VM_REQUEST, 0, 0, fds[0], > - &vid, sizeof(vid)); > - imsgbuf_flush(ibuf); > - while (1) { > - readn = atomicio(read, fds[1], buf, pagesz); > - if (!readn) > - break; > - writen = atomicio(vwrite, STDOUT_FILENO, buf, > - readn); > - if (writen != readn) > - break; > - } > - if (vid.vid_id) > - warnx("sent vm %d successfully", vid.vid_id); > - else > - warnx("sent vm %s successfully", vid.vid_name); > - } > - > - free(buf); > -} > - > -void > -vm_receive(uint32_t id, const char *name) > -{ > - struct vmop_id vid; > - int fds[2], readn, writen; > - long pagesz; > - char *buf; > - > - pagesz = getpagesize(); > - buf = malloc(pagesz); > - if (buf == NULL) > - errx(1, "%s: memory allocation failure", __func__); > - > - memset(&vid, 0, sizeof(vid)); > - if (name != NULL) > - strlcpy(vid.vid_name, name, sizeof(vid.vid_name)); > - if (socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC, fds) == -1) { > - warnx("%s: socketpair creation failed", __func__); > - } else { > - imsg_compose(ibuf, IMSG_VMDOP_RECEIVE_VM_REQUEST, 0, 0, fds[0], > - &vid, sizeof(vid)); > - imsgbuf_flush(ibuf); > - while (1) { > - readn = atomicio(read, STDIN_FILENO, buf, pagesz); > - if (!readn) { > - close(fds[1]); > - break; > - } > - writen = atomicio(vwrite, fds[1], buf, readn); > - if (writen != readn) > - break; > - } > - } > - > - free(buf); > -} > - > -void > pause_vm(uint32_t pause_id, const char *name) > { > struct vmop_id vid; > commit - 9260884d99d8c4ba4d2a8372e6dee6765b6149b7 > blob - 97767f466984ea586e6a555e2193c8719b35ca99 > file + usr.sbin/vmctl/vmctl.h > --- usr.sbin/vmctl/vmctl.h > +++ usr.sbin/vmctl/vmctl.h > @@ -36,8 +36,6 @@ enum actions { > CMD_WAITFOR, > CMD_PAUSE, > CMD_UNPAUSE, > - CMD_SEND, > - CMD_RECEIVE, > }; > > struct ctl_command; > commit - 9260884d99d8c4ba4d2a8372e6dee6765b6149b7 > blob - a17bc8bc18be7c8efd3fed54b4cf20ffe9882472 > file + usr.sbin/vmd/arm64_vm.c > --- usr.sbin/vmd/arm64_vm.c > +++ usr.sbin/vmd/arm64_vm.c > @@ -43,14 +43,6 @@ init_emulated_hw(struct vmop_create_params *vcp, int c > } > > void > -restore_emulated_hw(struct vm_create_params *vcp, int fd, int *child_taps, > - int child_disks[][VM_MAX_BASE_PER_DISK], int child_cdrom) > -{ > - fatalx("%s: unimplemented", __func__); > - /* NOTREACHED */ > -} > - > -void > pause_vm_md(struct vmd_vm *vm) > { > fatalx("%s: unimplemented", __func__); > @@ -64,22 +56,6 @@ unpause_vm_md(struct vmd_vm *vm) > /* NOTREACHED */ > } > > -int > -dump_devs(int fd) > -{ > - fatalx("%s: unimplemented", __func__); > - /* NOTREACHED */ > - return (-1); > -} > - > -int > -dump_send_header(int fd) > -{ > - fatalx("%s: unimplemented", __func__); > - /* NOTREACHED */ > - return (-1); > -} > - > void * > hvaddr_mem(paddr_t gpa, size_t len) > { fatalx("%s: unimplemented", __func__); > commit - 9260884d99d8c4ba4d2a8372e6dee6765b6149b7 > blob - bb2ac1523aaa3fb5c0326f32b05d17c8764ae70b > file + usr.sbin/vmd/config.c > --- usr.sbin/vmd/config.c > +++ usr.sbin/vmd/config.c > @@ -258,7 +258,7 @@ config_setvm(struct privsep *ps, struct vmd_vm *vm, ui > /* > * From here onward, all failures need cleanup and use goto fail > */ > - if (!(vm->vm_state & VM_STATE_RECEIVED) && vm->vm_kernel == -1) { > + if (vm->vm_kernel == -1) { > if (vm->vm_kernel_path != NULL) { > /* Open external kernel for child */ > kernfd = open(vm->vm_kernel_path, O_RDONLY | O_CLOEXEC); > @@ -455,14 +455,8 @@ config_setvm(struct privsep *ps, struct vmd_vm *vm, ui > > /* Send VM information */ > /* XXX check proc_compose_imsg return values */ > - if (vm->vm_state & VM_STATE_RECEIVED) > - proc_compose_imsg(ps, PROC_VMM, -1, > - IMSG_VMDOP_RECEIVE_VM_REQUEST, vm->vm_vmid, fd, vmc, > - sizeof(struct vmop_create_params)); > - else > - proc_compose_imsg(ps, PROC_VMM, -1, > - IMSG_VMDOP_START_VM_REQUEST, vm->vm_vmid, vm->vm_kernel, > - vmc, sizeof(*vmc)); > + proc_compose_imsg(ps, PROC_VMM, -1, IMSG_VMDOP_START_VM_REQUEST, > + vm->vm_vmid, vm->vm_kernel, vmc, sizeof(*vmc)); > > if (strlen(vmc->vmc_cdrom)) > proc_compose_imsg(ps, PROC_VMM, -1, > @@ -490,9 +484,8 @@ config_setvm(struct privsep *ps, struct vmd_vm *vm, ui > vm->vm_vmid, dup(tapfds[i]), &var, sizeof(var)); > } > > - if (!(vm->vm_state & VM_STATE_RECEIVED)) > - proc_compose_imsg(ps, PROC_VMM, -1, > - IMSG_VMDOP_START_VM_END, vm->vm_vmid, fd, NULL, 0); > + proc_compose_imsg(ps, PROC_VMM, -1, IMSG_VMDOP_START_VM_END, > + vm->vm_vmid, fd, NULL, 0); > > free(tapfds); > > commit - 9260884d99d8c4ba4d2a8372e6dee6765b6149b7 > blob - de7325fdeac0bd6a28af675664bca4d9b70b44e9 > file + usr.sbin/vmd/control.c > --- usr.sbin/vmd/control.c > +++ usr.sbin/vmd/control.c > @@ -93,7 +93,6 @@ control_dispatch_vmd(int fd, struct privsep_proc *p, s > switch (type) { > case IMSG_VMDOP_START_VM_RESPONSE: > case IMSG_VMDOP_PAUSE_VM_RESPONSE: > - case IMSG_VMDOP_SEND_VM_RESPONSE: > case IMSG_VMDOP_UNPAUSE_VM_RESPONSE: > case IMSG_VMDOP_GET_INFO_VM_DATA: > case IMSG_VMDOP_GET_INFO_VM_END_DATA: > @@ -438,8 +437,6 @@ control_dispatch_imsg(int fd, short event, void *arg) > peer_id, -1, &v, sizeof(v))) > goto fail; > break; > - case IMSG_VMDOP_RECEIVE_VM_REQUEST: > - case IMSG_VMDOP_SEND_VM_REQUEST: > case IMSG_CTL_RESET: > case IMSG_VMDOP_LOAD: > case IMSG_VMDOP_RELOAD: > commit - 9260884d99d8c4ba4d2a8372e6dee6765b6149b7 > blob - a822584de0f3c41c8e40f96f04f04173d0e5bac6 > file + usr.sbin/vmd/vioblk.c > --- usr.sbin/vmd/vioblk.c > +++ usr.sbin/vmd/vioblk.c > @@ -155,10 +155,6 @@ vioblk_main(int fd, int fd_vmm) > log_debug("%s: initialized vioblk%d with %s image (capacity=%lld)", > __func__, vioblk->idx, disk_type(type), vioblk->capacity); > > - /* If we're restoring hardware, reinitialize the virtqueue hva. */ > - if (vm.vm_state & VM_STATE_RECEIVED) > - vioblk_update_qa(vioblk); > - > /* Initialize libevent so we can start wiring event handlers. */ > event_init(); > > @@ -540,14 +536,6 @@ handle_sync_io(int fd, short event, void *arg) > imsg_free(&imsg); > > switch (msg.type) { > - case VIODEV_MSG_DUMP: > - /* Dump device */ > - n = atomicio(vwrite, dev->sync_fd, dev, sizeof(*dev)); > - if (n != sizeof(*dev)) { > - log_warnx("%s: failed to dump vioblk device", > - __func__); > - break; > - } > case VIODEV_MSG_IO_READ: > /* Read IO: make sure to send a reply */ > msg.data = handle_io_read(&msg, dev, &intr); > commit - 9260884d99d8c4ba4d2a8372e6dee6765b6149b7 > blob - 6d45fc4f675cd0af27ae6364fa5de282cc10686a > file + usr.sbin/vmd/vionet.c > --- usr.sbin/vmd/vionet.c > +++ usr.sbin/vmd/vionet.c > @@ -159,34 +159,6 @@ vionet_main(int fd, int fd_vmm) > if (pledge("stdio", NULL) == -1) > fatal("pledge2"); > > - /* If we're restoring hardware, re-initialize virtqueue hva's. */ > - if (vm.vm_state & VM_STATE_RECEIVED) { > - struct virtio_vq_info *vq_info; > - void *hva = NULL; > - > - vq_info = &dev.vionet.vq[TXQ]; > - if (vq_info->q_gpa != 0) { > - log_debug("%s: restoring TX virtqueue for gpa 0x%llx", > - __func__, vq_info->q_gpa); > - hva = hvaddr_mem(vq_info->q_gpa, > - vring_size(VIONET_QUEUE_SIZE)); > - if (hva == NULL) > - fatalx("%s: hva == NULL", __func__); > - vq_info->q_hva = hva; > - } > - > - vq_info = &dev.vionet.vq[RXQ]; > - if (vq_info->q_gpa != 0) { > - log_debug("%s: restoring RX virtqueue for gpa 0x%llx", > - __func__, vq_info->q_gpa); > - hva = hvaddr_mem(vq_info->q_gpa, > - vring_size(VIONET_QUEUE_SIZE)); > - if (hva == NULL) > - fatalx("%s: hva == NULL", __func__); > - vq_info->q_hva = hva; > - } > - } > - > /* Initialize our packet injection pipe. */ > if (pipe2(pipe_inject, O_NONBLOCK) == -1) { > log_warn("%s: injection pipe", __func__); > @@ -1015,14 +987,6 @@ handle_sync_io(int fd, short event, void *arg) > imsg_free(&imsg); > > switch (msg.type) { > - case VIODEV_MSG_DUMP: > - /* Dump device */ > - n = atomicio(vwrite, dev->sync_fd, dev, sizeof(*dev)); > - if (n != sizeof(*dev)) { > - log_warnx("%s: failed to dump vionet device", > - __func__); > - break; > - } > case VIODEV_MSG_IO_READ: > /* Read IO: make sure to send a reply */ > msg.data = handle_io_read(&msg, dev, &intr); > commit - 9260884d99d8c4ba4d2a8372e6dee6765b6149b7 > blob - feee29aab481e3a965bb5001bea710b6477f3646 > file + usr.sbin/vmd/vm.c > --- usr.sbin/vmd/vm.c > +++ usr.sbin/vmd/vm.c > @@ -49,12 +49,6 @@ static void vm_dispatch_vmm(int, short, void *); > static void *event_thread(void *); > static void *vcpu_run_loop(void *); > static int vmm_create_vm(struct vmd_vm *); > -static int send_vm(int, struct vmd_vm *); > -static int dump_vmr(int , struct vm_mem_range *); > -static int dump_mem(int, struct vmd_vm *); > -static void restore_vmr(int, struct vm_mem_range *); > -static void restore_mem(int, struct vm_create_params *); > -static int restore_vm_params(int, struct vm_create_params *); > static void pause_vm(struct vmd_vm *); > static void unpause_vm(struct vmd_vm *); > static int start_vm(struct vmd_vm *, int); > @@ -143,12 +137,9 @@ vm_main(int fd, int fd_vmm) > * We need, at minimum, a vm_kernel fd to boot a vm. This is either a > * kernel or a BIOS image. > */ > - if (!(vm.vm_state & VM_STATE_RECEIVED)) { > - if (vm.vm_kernel == -1) { > - log_warnx("%s: failed to receive boot fd", > - vcp->vcp_name); > - _exit(EINVAL); > - } > + if (vm.vm_kernel == -1) { > + log_warnx("%s: failed to receive boot fd", vcp->vcp_name); > + _exit(EINVAL); > } > > if (vcp->vcp_sev && env->vmd_psp_fd < 0) { > @@ -191,14 +182,12 @@ start_vm(struct vmd_vm *vm, int fd) > int nicfds[VM_MAX_NICS_PER_VM]; > int ret; > size_t i; > - struct vm_rwregs_params vrp; > > /* > * We first try to initialize and allocate memory before bothering > * vmm(4) with a request to create a new vm. > */ > - if (!(vm->vm_state & VM_STATE_RECEIVED)) > - create_memory_map(vcp); > + create_memory_map(vcp); > > /* Create the vm in vmm(4). */ > ret = vmm_create_vm(vm); > @@ -247,13 +236,8 @@ start_vm(struct vmd_vm *vm, int fd) > return (1); > } > > - /* Prepare either our boot image or receive an existing vm to launch. */ > - if (vm->vm_state & VM_STATE_RECEIVED) { > - ret = atomicio(read, vm->vm_receive_fd, &vrp, sizeof(vrp)); > - if (ret != sizeof(vrp)) > - fatal("received incomplete vrp - exiting"); > - vrs = vrp.vrwp_regs; > - } else if (load_firmware(vm, &vrs)) > + /* Prepare our boot image. */ > + if (load_firmware(vm, &vrs)) > fatalx("failed to load kernel or firmware image"); > > if (vm->vm_kernel != -1) > @@ -291,21 +275,12 @@ start_vm(struct vmd_vm *vm, int fd) > fatal("setup vm pipe"); > > /* > - * Initialize or restore our emulated hardware. > + * Initialize our emulated hardware. > */ > for (i = 0; i < VMM_MAX_NICS_PER_VM; i++) > nicfds[i] = vm->vm_ifs[i].vif_fd; > + init_emulated_hw(vmc, vm->vm_cdrom, vm->vm_disks, nicfds); > > - if (vm->vm_state & VM_STATE_RECEIVED) { > - restore_mem(vm->vm_receive_fd, vcp); > - restore_emulated_hw(vcp, vm->vm_receive_fd, nicfds, > - vm->vm_disks, vm->vm_cdrom); > - if (restore_vm_params(vm->vm_receive_fd, vcp)) > - fatal("restore vm params failed"); > - unpause_vm(vm); > - } else > - init_emulated_hw(vmc, vm->vm_cdrom, vm->vm_disks, nicfds); > - > /* Drop privleges further before starting the vcpu run loop(s). */ > if (pledge("stdio vmm recvfd", NULL) == -1) > fatal("pledge"); > @@ -404,17 +379,6 @@ vm_dispatch_vmm(int fd, short event, void *arg) > IMSG_VMDOP_UNPAUSE_VM_RESPONSE, id, pid, -1, &vmr, > sizeof(vmr)); > break; > - case IMSG_VMDOP_SEND_VM_REQUEST: > - vmr.vmr_id = vm->vm_vmid; > - vmr.vmr_result = send_vm(imsg_get_fd(&imsg), vm); > - imsg_compose_event(&vm->vm_iev, > - IMSG_VMDOP_SEND_VM_RESPONSE, id, pid, -1, &vmr, > - sizeof(vmr)); > - if (!vmr.vmr_result) { > - imsgbuf_flush(¤t_vm->vm_iev.ibuf); > - _exit(0); > - } > - break; > case IMSG_VMDOP_PRIV_GET_ADDR_RESPONSE: > vmop_addr_result_read(&imsg, &var); > log_debug("%s: received tap addr %s for nic %d", > @@ -461,186 +425,6 @@ vm_shutdown(unsigned int cmd) > _exit(0); > } > > -int > -send_vm(int fd, struct vmd_vm *vm) > -{ > - struct vm_rwregs_params vrp; > - struct vm_rwvmparams_params vpp; > - struct vmop_create_params *vmc; > - struct vm_terminate_params vtp; > - unsigned int flags = 0; > - unsigned int i; > - int ret = 0; > - size_t sz; > - > - if (dump_send_header(fd)) { > - log_warnx("%s: failed to send vm dump header", __func__); > - goto err; > - } > - > - pause_vm(vm); > - > - vmc = calloc(1, sizeof(struct vmop_create_params)); > - if (vmc == NULL) { > - log_warn("%s: calloc error getting vmc", __func__); > - ret = -1; > - goto err; > - } > - > - flags |= VMOP_CREATE_MEMORY; > - memcpy(&vmc->vmc_params, ¤t_vm->vm_params, sizeof(struct > - vmop_create_params)); > - vmc->vmc_flags = flags; > - vrp.vrwp_vm_id = vm->vm_params.vmc_params.vcp_id; > - vrp.vrwp_mask = VM_RWREGS_ALL; > - vpp.vpp_mask = VM_RWVMPARAMS_ALL; > - vpp.vpp_vm_id = vm->vm_params.vmc_params.vcp_id; > - > - sz = atomicio(vwrite, fd, vmc, sizeof(struct vmop_create_params)); > - if (sz != sizeof(struct vmop_create_params)) { > - ret = -1; > - goto err; > - } > - > - for (i = 0; i < vm->vm_params.vmc_params.vcp_ncpus; i++) { > - vrp.vrwp_vcpu_id = i; > - if ((ret = ioctl(env->vmd_fd, VMM_IOC_READREGS, &vrp))) { > - log_warn("%s: readregs failed", __func__); > - goto err; > - } > - > - sz = atomicio(vwrite, fd, &vrp, > - sizeof(struct vm_rwregs_params)); > - if (sz != sizeof(struct vm_rwregs_params)) { > - log_warn("%s: dumping registers failed", __func__); > - ret = -1; > - goto err; > - } > - } > - > - /* Dump memory before devices to aid in restoration. */ > - if ((ret = dump_mem(fd, vm))) > - goto err; > - if ((ret = dump_devs(fd))) > - goto err; > - if ((ret = pci_dump(fd))) > - goto err; > - if ((ret = virtio_dump(fd))) > - goto err; > - > - for (i = 0; i < vm->vm_params.vmc_params.vcp_ncpus; i++) { > - vpp.vpp_vcpu_id = i; > - if ((ret = ioctl(env->vmd_fd, VMM_IOC_READVMPARAMS, &vpp))) { > - log_warn("%s: readvmparams failed", __func__); > - goto err; > - } > - > - sz = atomicio(vwrite, fd, &vpp, > - sizeof(struct vm_rwvmparams_params)); > - if (sz != sizeof(struct vm_rwvmparams_params)) { > - log_warn("%s: dumping vm params failed", __func__); > - ret = -1; > - goto err; > - } > - } > - > - vtp.vtp_vm_id = vm->vm_params.vmc_params.vcp_id; > - if (ioctl(env->vmd_fd, VMM_IOC_TERM, &vtp) == -1) { > - log_warnx("%s: term IOC error: %d, %d", __func__, > - errno, ENOENT); > - } > -err: > - close(fd); > - if (ret) > - unpause_vm(vm); > - return ret; > -} > - > -int > -dump_mem(int fd, struct vmd_vm *vm) > -{ > - unsigned int i; > - int ret; > - struct vm_mem_range *vmr; > - > - for (i = 0; i < vm->vm_params.vmc_params.vcp_nmemranges; i++) { > - vmr = &vm->vm_params.vmc_params.vcp_memranges[i]; > - ret = dump_vmr(fd, vmr); > - if (ret) > - return ret; > - } > - return (0); > -} > - > -int > -restore_vm_params(int fd, struct vm_create_params *vcp) { > - unsigned int i; > - struct vm_rwvmparams_params vpp; > - > - for (i = 0; i < vcp->vcp_ncpus; i++) { > - if (atomicio(read, fd, &vpp, sizeof(vpp)) != sizeof(vpp)) { > - log_warn("%s: error restoring vm params", __func__); > - return (-1); > - } > - vpp.vpp_vm_id = vcp->vcp_id; > - vpp.vpp_vcpu_id = i; > - if (ioctl(env->vmd_fd, VMM_IOC_WRITEVMPARAMS, &vpp) < 0) { > - log_debug("%s: writing vm params failed", __func__); > - return (-1); > - } > - } > - return (0); > -} > - > -void > -restore_mem(int fd, struct vm_create_params *vcp) > -{ > - unsigned int i; > - struct vm_mem_range *vmr; > - > - for (i = 0; i < vcp->vcp_nmemranges; i++) { > - vmr = &vcp->vcp_memranges[i]; > - restore_vmr(fd, vmr); > - } > -} > - > -int > -dump_vmr(int fd, struct vm_mem_range *vmr) > -{ > - size_t rem = vmr->vmr_size, read=0; > - char buf[PAGE_SIZE]; > - > - while (rem > 0) { > - if (read_mem(vmr->vmr_gpa + read, buf, PAGE_SIZE)) { > - log_warn("failed to read vmr"); > - return (-1); > - } > - if (atomicio(vwrite, fd, buf, sizeof(buf)) != sizeof(buf)) { > - log_warn("failed to dump vmr"); > - return (-1); > - } > - rem = rem - PAGE_SIZE; > - read = read + PAGE_SIZE; > - } > - return (0); > -} > - > -void > -restore_vmr(int fd, struct vm_mem_range *vmr) > -{ > - size_t rem = vmr->vmr_size, wrote=0; > - char buf[PAGE_SIZE]; > - > - while (rem > 0) { > - if (atomicio(read, fd, buf, sizeof(buf)) != sizeof(buf)) > - fatal("failed to restore vmr"); > - if (write_mem(vmr->vmr_gpa + wrote, buf, PAGE_SIZE)) > - fatal("failed to write vmr"); > - rem = rem - PAGE_SIZE; > - wrote = wrote + PAGE_SIZE; > - } > -} > - > static void > pause_vm(struct vmd_vm *vm) > { > @@ -813,7 +597,6 @@ static int > run_vm(struct vmop_create_params *vmc, struct vcpu_reg_state *vrs) > { > struct vm_create_params *vcp = &vmc->vmc_params; > - struct vm_rwregs_params vregsp; > uint8_t evdone = 0; > size_t i; > int ret; > @@ -882,19 +665,6 @@ run_vm(struct vmop_create_params *vmc, struct vcpu_reg > return (EIO); > } > > - /* once more because reset_cpu changes regs */ > - if (current_vm->vm_state & VM_STATE_RECEIVED) { > - vregsp.vrwp_vm_id = vcp->vcp_id; > - vregsp.vrwp_vcpu_id = i; > - vregsp.vrwp_regs = *vrs; > - vregsp.vrwp_mask = VM_RWREGS_ALL; > - if ((ret = ioctl(env->vmd_fd, VMM_IOC_WRITEREGS, > - &vregsp)) == -1) { > - log_warn("%s: writeregs failed", __func__); > - return (ret); > - } > - } > - > if (sev_encrypt_state(current_vm, i)) { > log_warnx("%s: state encryption failed for VCPU " > "%zu failed - exiting.", __progname, i); > commit - 9260884d99d8c4ba4d2a8372e6dee6765b6149b7 > blob - cfaedcbeb9c4a4b3dd55b1b8519d0319281af934 > file + usr.sbin/vmd/vmd.c > --- usr.sbin/vmd/vmd.c > +++ usr.sbin/vmd/vmd.c > @@ -54,7 +54,6 @@ int vmd_dispatch_control(int, struct privsep_proc *, > int vmd_dispatch_vmm(int, struct privsep_proc *, struct imsg *); > int vmd_dispatch_agentx(int, struct privsep_proc *, struct imsg *); > int vmd_dispatch_priv(int, struct privsep_proc *, struct imsg *); > -int vmd_check_vmh(struct vm_dump_header *); > > int vm_instance(struct privsep *, struct vmd_vm **, > struct vmop_create_params *, uid_t); > @@ -92,18 +91,15 @@ int > vmd_dispatch_control(int fd, struct privsep_proc *p, struct imsg *imsg) > { > struct privsep *ps = p->p_ps; > - int res = 0, ret = 0, cmd = 0, verbose; > - int ifd; > + int res = 0, cmd = 0, verbose; > unsigned int v = 0, flags; > struct vmop_create_params vmc; > struct vmop_id vid; > struct vmop_result vmr; > - struct vm_dump_header vmh; > struct vmd_vm *vm = NULL; > char *str = NULL; > uint32_t peer_id, type, vm_id = 0; > struct control_sock *rcs; > - size_t i; > > peer_id = imsg_get_id(imsg); > type = imsg_get_type(imsg); > @@ -251,95 +247,6 @@ vmd_dispatch_control(int fd, struct privsep_proc *p, s > proc_compose_imsg(ps, PROC_VMM, -1, type, vm->vm_peerid, -1, > &vid, sizeof(vid)); > break; > - case IMSG_VMDOP_SEND_VM_REQUEST: > - vmop_id_read(imsg, &vid); > - vm_id = vid.vid_id; > - ifd = imsg_get_fd(imsg); > - if (vid.vid_id == 0) { > - if ((vm = vm_getbyname(vid.vid_name)) == NULL) { > - res = ENOENT; > - cmd = IMSG_VMDOP_SEND_VM_RESPONSE; > - close(ifd); > - break; > - } else { > - vid.vid_id = vm->vm_vmid; > - } > - } else if ((vm = vm_getbyvmid(vid.vid_id)) == NULL) { > - res = ENOENT; > - cmd = IMSG_VMDOP_SEND_VM_RESPONSE; > - close(ifd); > - break; > - } > - vmr.vmr_id = vid.vid_id; > - log_debug("%s: sending fd to vmm", __func__); > - proc_compose_imsg(ps, PROC_VMM, -1, type, peer_id, ifd, &vid, > - sizeof(vid)); > - break; > - case IMSG_VMDOP_RECEIVE_VM_REQUEST: > - vmop_id_read(imsg, &vid); > - ifd = imsg_get_fd(imsg); > - if (ifd == -1) { > - log_warnx("%s: invalid fd", __func__); > - return (-1); > - } > - if (atomicio(read, ifd, &vmh, sizeof(vmh)) != sizeof(vmh)) { > - log_warnx("%s: error reading vmh from received vm", > - __func__); > - res = EIO; > - close(ifd); > - cmd = IMSG_VMDOP_START_VM_RESPONSE; > - break; > - } > - > - if (vmd_check_vmh(&vmh)) { > - res = ENOENT; > - close(ifd); > - cmd = IMSG_VMDOP_START_VM_RESPONSE; > - break; > - } > - if (atomicio(read, ifd, &vmc, sizeof(vmc)) != sizeof(vmc)) { > - log_warnx("%s: error reading vmc from received vm", > - __func__); > - res = EIO; > - close(ifd); > - cmd = IMSG_VMDOP_START_VM_RESPONSE; > - break; > - } > - > - /* vm_create_params was read from an untrusted source. Scrub. */ > - vmc.vmc_params.vcp_name[sizeof(vmc.vmc_params.vcp_name) - 1] = > - '\0'; > - for (i = 0; i < nitems(vmc.vmc_disks); i++) > - vmc.vmc_disks[i][sizeof(vmc.vmc_disks[i]) - 1] = '\0'; > - for (i = 0; i < nitems(vmc.vmc_ifnames); i++) > - vmc.vmc_ifnames[i][sizeof(vmc.vmc_ifnames[i]) - 1] > - = '\0'; > - for (i = 0; i < nitems(vmc.vmc_ifswitch); i++) > - vmc.vmc_ifswitch[i][sizeof(vmc.vmc_ifswitch[i]) - 1] > - = '\0'; > - for (i = 0; i < nitems(vmc.vmc_ifgroup); i++) > - vmc.vmc_ifgroup[i][sizeof(vmc.vmc_ifgroup[i]) - 1] > - = '\0'; > - vmc.vmc_instance[sizeof(vmc.vmc_instance) - 1] = '\0'; > - > - strlcpy(vmc.vmc_params.vcp_name, vid.vid_name, > - sizeof(vmc.vmc_params.vcp_name)); > - vmc.vmc_params.vcp_id = 0; > - > - ret = vm_register(ps, &vmc, &vm, 0, vmc.vmc_owner.uid); > - if (ret != 0) { > - res = errno; > - cmd = IMSG_VMDOP_START_VM_RESPONSE; > - close(ifd); > - } else { > - vm->vm_state |= VM_STATE_RECEIVED; > - config_setvm(ps, vm, peer_id, vmc.vmc_owner.uid); > - log_debug("%s: sending fd to vmm", __func__); > - proc_compose_imsg(ps, PROC_VMM, -1, > - IMSG_VMDOP_RECEIVE_VM_END, vm->vm_vmid, ifd, > - NULL, 0); > - } > - break; > case IMSG_VMDOP_DONE: > control_reset(&ps->ps_csock); > TAILQ_FOREACH(rcs, &ps->ps_rcsocks, cs_entry) > @@ -463,28 +370,6 @@ vmd_dispatch_vmm(int fd, struct privsep_proc *p, struc > vm->vm_state |= VM_STATE_SHUTDOWN; > } > break; > - case IMSG_VMDOP_SEND_VM_RESPONSE: > - vmop_result_read(imsg, &vmr); > - if ((vm = vm_getbyvmid(vmr.vmr_id)) == NULL) > - break; > - if (!vmr.vmr_result) { > - log_info("%s: sent vm %d successfully.", > - vm->vm_params.vmc_params.vcp_name, > - vm->vm_vmid); > - vm_terminate(vm, __func__); > - } > - > - /* Send a response if a control client is waiting for it */ > - if (peer_id != (uint32_t)-1) { > - /* the error is meaningless for deferred responses */ > - vmr.vmr_result = 0; > - > - if (proc_compose_imsg(ps, PROC_CONTROL, -1, > - IMSG_VMDOP_SEND_VM_RESPONSE, peer_id, -1, &vmr, > - sizeof(vmr)) == -1) > - return (-1); > - } > - break; > case IMSG_VMDOP_TERMINATE_VM_EVENT: > vmop_result_read(imsg, &vmr); > DPRINTF("%s: handling TERMINATE_EVENT for vm id %d ret %d", > @@ -1150,8 +1035,7 @@ vm_stop(struct vmd_vm *vm, int keeptty, const char *ca > __func__, ps->ps_title[privsep_process], caller, > vm->vm_vmid, keeptty ? ", keeping tty open" : ""); > > - vm->vm_state &= ~(VM_STATE_RECEIVED | VM_STATE_RUNNING > - | VM_STATE_SHUTDOWN); > + vm->vm_state &= ~(VM_STATE_RUNNING | VM_STATE_SHUTDOWN); > > if (vm->vm_iev.ibuf.fd != -1) { > event_del(&vm->vm_iev.ev); > commit - 9260884d99d8c4ba4d2a8372e6dee6765b6149b7 > blob - 8efae7f0b109e1763e3442883ebe6634c32c8185 > file + usr.sbin/vmd/vmd.h > --- usr.sbin/vmd/vmd.h > +++ usr.sbin/vmd/vmd.h > @@ -115,10 +115,6 @@ enum imsg_type { > IMSG_VMDOP_PAUSE_VM_RESPONSE, > IMSG_VMDOP_UNPAUSE_VM, > IMSG_VMDOP_UNPAUSE_VM_RESPONSE, > - IMSG_VMDOP_SEND_VM_REQUEST, > - IMSG_VMDOP_SEND_VM_RESPONSE, > - IMSG_VMDOP_RECEIVE_VM_REQUEST, > - IMSG_VMDOP_RECEIVE_VM_END, > IMSG_VMDOP_WAIT_VM_REQUEST, > IMSG_VMDOP_TERMINATE_VM_REQUEST, > IMSG_VMDOP_TERMINATE_VM_RESPONSE, > @@ -322,7 +318,6 @@ struct vmd_vm { > #define VM_STATE_DISABLED 0x02 > /* When set, VM is marked to be shut down */ > #define VM_STATE_SHUTDOWN 0x04 > -#define VM_STATE_RECEIVED 0x08 > #define VM_STATE_PAUSED 0x10 > #define VM_STATE_WAITING 0x20 > > commit - 9260884d99d8c4ba4d2a8372e6dee6765b6149b7 > blob - 85164d7bed27c5b8e10139588103203b87edbfc9 > file + usr.sbin/vmd/vmm.c > --- usr.sbin/vmd/vmm.c > +++ usr.sbin/vmd/vmm.c > @@ -100,7 +100,6 @@ vmm_dispatch_parent(int fd, struct privsep_proc *p, st > struct vm_terminate_params vtp; > struct vmop_id vid; > struct vmop_result vmr; > - struct vmop_create_params vmc; > struct vmop_addr_result var; > uint32_t id = 0, vm_id, type; > pid_t pid, vm_pid = 0; > @@ -250,43 +249,6 @@ vmm_dispatch_parent(int fd, struct privsep_proc *p, st > imsg_compose_event(&vm->vm_iev, type, -1, pid, > imsg_get_fd(imsg), &vid, sizeof(vid)); > break; > - case IMSG_VMDOP_SEND_VM_REQUEST: > - vmop_id_read(imsg, &vid); > - id = vid.vid_id; > - if ((vm = vm_getbyvmid(id)) == NULL) { > - res = ENOENT; > - close(imsg_get_fd(imsg)); /* XXX */ > - cmd = IMSG_VMDOP_START_VM_RESPONSE; > - break; > - } > - imsg_compose_event(&vm->vm_iev, type, -1, pid, > - imsg_get_fd(imsg), &vid, sizeof(vid)); > - break; > - case IMSG_VMDOP_RECEIVE_VM_REQUEST: > - vmop_create_params_read(imsg, &vmc); > - if (vm_register(ps, &vmc, &vm, vm_id, vmc.vmc_owner.uid) != 0) { > - res = errno; > - cmd = IMSG_VMDOP_START_VM_RESPONSE; > - break; > - } > - vm->vm_tty = imsg_get_fd(imsg); > - vm->vm_state |= VM_STATE_RECEIVED; > - vm->vm_state |= VM_STATE_PAUSED; > - break; > - case IMSG_VMDOP_RECEIVE_VM_END: > - if ((vm = vm_getbyvmid(vm_id)) == NULL) { > - res = ENOENT; > - close(imsg_get_fd(imsg)); /* XXX */ > - cmd = IMSG_VMDOP_START_VM_RESPONSE; > - break; > - } > - vm->vm_receive_fd = imsg_get_fd(imsg); > - res = vmm_start_vm(imsg, &id, &pid); > - /* Check if the ID can be mapped correctly */ > - if ((id = vm_id2vmid(id, NULL)) == 0) > - res = ENOENT; > - cmd = IMSG_VMDOP_START_VM_RESPONSE; > - break; > case IMSG_VMDOP_PRIV_GET_ADDR_RESPONSE: > vmop_addr_result_read(imsg, &var); > if ((vm = vm_getbyvmid(var.var_vmid)) == NULL) { > @@ -523,7 +485,6 @@ vmm_dispatch_vm(int fd, short event, void *arg) > case IMSG_VMDOP_VM_REBOOT: > vm->vm_state &= ~VM_STATE_SHUTDOWN; > break; > - case IMSG_VMDOP_SEND_VM_RESPONSE: > case IMSG_VMDOP_PAUSE_VM_RESPONSE: > case IMSG_VMDOP_UNPAUSE_VM_RESPONSE: > for (i = 0; i < nitems(procs); i++) { > @@ -644,13 +605,12 @@ vmm_start_vm(struct imsg *imsg, uint32_t *id, pid_t *p > } > vcp = &vm->vm_params.vmc_params; > > - if (!(vm->vm_state & VM_STATE_RECEIVED)) { > - if ((vm->vm_tty = imsg_get_fd(imsg)) == -1) { > - log_warnx("%s: can't get tty", __func__); > - goto err; > - } > + if ((vm->vm_tty = imsg_get_fd(imsg)) == -1) { > + log_warnx("%s: can't get tty", __func__); > + goto err; > } > > + > if (socketpair(AF_UNIX, SOCK_STREAM | SOCK_NONBLOCK, PF_UNSPEC, fds) > == -1) > fatal("socketpair"); > commit - 9260884d99d8c4ba4d2a8372e6dee6765b6149b7 > blob - aa64ddb02e83af21648fd80a14968f6716db20d8 > file + usr.sbin/vmd/x86_vm.c > --- usr.sbin/vmd/x86_vm.c > +++ usr.sbin/vmd/x86_vm.c > @@ -402,64 +402,7 @@ init_emulated_hw(struct vmop_create_params *vmc, int c > ioports_map[FW_CFG_IO_DMA_ADDR_LOW] = vcpu_exit_fw_cfg_dma; > } > > -/* > - * restore_emulated_hw > - * > - * Restores the userspace hardware emulation from fd > - */ > void > -restore_emulated_hw(struct vm_create_params *vcp, int fd, > - int *child_taps, int child_disks[][VM_MAX_BASE_PER_DISK], int child_cdrom) > -{ > - /* struct vm_create_params *vcp = &vmc->vmc_params; */ > - int i; > - memset(&ioports_map, 0, sizeof(io_fn_t) * MAX_PORTS); > - > - /* Init i8253 PIT */ > - i8253_restore(fd, vcp->vcp_id); > - ioports_map[TIMER_CTRL] = vcpu_exit_i8253; > - ioports_map[TIMER_BASE + TIMER_CNTR0] = vcpu_exit_i8253; > - ioports_map[TIMER_BASE + TIMER_CNTR1] = vcpu_exit_i8253; > - ioports_map[TIMER_BASE + TIMER_CNTR2] = vcpu_exit_i8253; > - > - /* Init master and slave PICs */ > - i8259_restore(fd); > - ioports_map[IO_ICU1] = vcpu_exit_i8259; > - ioports_map[IO_ICU1 + 1] = vcpu_exit_i8259; > - ioports_map[IO_ICU2] = vcpu_exit_i8259; > - ioports_map[IO_ICU2 + 1] = vcpu_exit_i8259; > - > - /* Init ns8250 UART */ > - ns8250_restore(fd, con_fd, vcp->vcp_id); > - for (i = COM1_DATA; i <= COM1_SCR; i++) > - ioports_map[i] = vcpu_exit_com; > - > - /* Init mc146818 RTC */ > - mc146818_restore(fd, vcp->vcp_id); > - ioports_map[IO_RTC] = vcpu_exit_mc146818; > - ioports_map[IO_RTC + 1] = vcpu_exit_mc146818; > - > - /* Init QEMU fw_cfg interface */ > - fw_cfg_restore(fd); > - ioports_map[FW_CFG_IO_SELECT] = vcpu_exit_fw_cfg; > - ioports_map[FW_CFG_IO_DATA] = vcpu_exit_fw_cfg; > - ioports_map[FW_CFG_IO_DMA_ADDR_HIGH] = vcpu_exit_fw_cfg_dma; > - ioports_map[FW_CFG_IO_DMA_ADDR_LOW] = vcpu_exit_fw_cfg_dma; > - > - /* Initialize PCI */ > - for (i = VM_PCI_IO_BAR_BASE; i <= VM_PCI_IO_BAR_END; i++) > - ioports_map[i] = vcpu_exit_pci; > - > - ioports_map[PCI_MODE1_ADDRESS_REG] = vcpu_exit_pci; > - ioports_map[PCI_MODE1_DATA_REG] = vcpu_exit_pci; > - ioports_map[PCI_MODE1_DATA_REG + 1] = vcpu_exit_pci; > - ioports_map[PCI_MODE1_DATA_REG + 2] = vcpu_exit_pci; > - ioports_map[PCI_MODE1_DATA_REG + 3] = vcpu_exit_pci; > - pci_restore(fd); > - virtio_restore(fd, current_vm, child_cdrom, child_disks, child_taps); > -} > - > -void > pause_vm_md(struct vmd_vm *vm) > { > i8253_stop(); > @@ -477,65 +420,6 @@ unpause_vm_md(struct vmd_vm *vm) > virtio_start(vm); > } > > -int > -dump_devs(int fd) > -{ > - int ret = 0; > - > - if ((ret = i8253_dump(fd))) > - return ret; > - if ((ret = i8259_dump(fd))) > - return ret; > - if ((ret = ns8250_dump(fd))) > - return ret; > - if ((ret = mc146818_dump(fd))) > - return ret; > - ret = fw_cfg_dump(fd); > - > - return ret; > -} > - > -int > -dump_send_header(int fd) { > - struct vm_dump_header vmh; > - int i; > - > - memcpy(&vmh.vmh_signature, VM_DUMP_SIGNATURE, > - sizeof(vmh.vmh_signature)); > - > - vmh.vmh_cpuids[0].code = 0x00; > - vmh.vmh_cpuids[0].leaf = 0x00; > - > - vmh.vmh_cpuids[1].code = 0x01; > - vmh.vmh_cpuids[1].leaf = 0x00; > - > - vmh.vmh_cpuids[2].code = 0x07; > - vmh.vmh_cpuids[2].leaf = 0x00; > - > - vmh.vmh_cpuids[3].code = 0x0d; > - vmh.vmh_cpuids[3].leaf = 0x00; > - > - vmh.vmh_cpuids[4].code = 0x80000001; > - vmh.vmh_cpuids[4].leaf = 0x00; > - > - vmh.vmh_version = VM_DUMP_VERSION; > - > - for (i=0; i < VM_DUMP_HEADER_CPUID_COUNT; i++) { > - CPUID_LEAF(vmh.vmh_cpuids[i].code, > - vmh.vmh_cpuids[i].leaf, > - vmh.vmh_cpuids[i].a, > - vmh.vmh_cpuids[i].b, > - vmh.vmh_cpuids[i].c, > - vmh.vmh_cpuids[i].d); > - } > - > - if (atomicio(vwrite, fd, &vmh, sizeof(vmh)) != sizeof(vmh)) > - return (-1); > - > - return (0); > -} > - > - > /* > * vcpu_exit_inout > * > @@ -1238,132 +1122,3 @@ intr_toggle_el(struct vmd_vm *vm, int irq, int val) > /* XXX select active interrupt controller */ > pic_set_elcr(irq, val); > } > - > -int > -vmd_check_vmh(struct vm_dump_header *vmh) > -{ > - int i; > - unsigned int code, leaf; > - unsigned int a, b, c, d; > - > - if (strncmp(vmh->vmh_signature, VM_DUMP_SIGNATURE, strlen(VM_DUMP_SIGNATURE)) != 0) { > - log_warnx("%s: incompatible dump signature", __func__); > - return (-1); > - } > - > - if (vmh->vmh_version != VM_DUMP_VERSION) { > - log_warnx("%s: incompatible dump version", __func__); > - return (-1); > - } > - > - for (i = 0; i < VM_DUMP_HEADER_CPUID_COUNT; i++) { > - code = vmh->vmh_cpuids[i].code; > - leaf = vmh->vmh_cpuids[i].leaf; > - if (leaf != 0x00) { > - log_debug("%s: invalid leaf 0x%x for code 0x%x", > - __func__, leaf, code); > - return (-1); > - } > - > - switch (code) { > - case 0x00: > - CPUID_LEAF(code, leaf, a, b, c, d); > - if (vmh->vmh_cpuids[i].a > a) { > - log_debug("%s: incompatible cpuid level", > - __func__); > - return (-1); > - } > - if (!(vmh->vmh_cpuids[i].b == b && > - vmh->vmh_cpuids[i].c == c && > - vmh->vmh_cpuids[i].d == d)) { > - log_debug("%s: incompatible cpu brand", > - __func__); > - return (-1); > - } > - break; > - > - case 0x01: > - CPUID_LEAF(code, leaf, a, b, c, d); > - if ((vmh->vmh_cpuids[i].c & c & VMM_CPUIDECX_MASK) != > - (vmh->vmh_cpuids[i].c & VMM_CPUIDECX_MASK)) { > - log_debug("%s: incompatible cpu features " > - "code: 0x%x leaf: 0x%x reg: c", __func__, > - code, leaf); > - return (-1); > - } > - if ((vmh->vmh_cpuids[i].d & d & VMM_CPUIDEDX_MASK) != > - (vmh->vmh_cpuids[i].d & VMM_CPUIDEDX_MASK)) { > - log_debug("%s: incompatible cpu features " > - "code: 0x%x leaf: 0x%x reg: d", __func__, > - code, leaf); > - return (-1); > - } > - break; > - > - case 0x07: > - CPUID_LEAF(code, leaf, a, b, c, d); > - if ((vmh->vmh_cpuids[i].b & b & VMM_SEFF0EBX_MASK) != > - (vmh->vmh_cpuids[i].b & VMM_SEFF0EBX_MASK)) { > - log_debug("%s: incompatible cpu features " > - "code: 0x%x leaf: 0x%x reg: c", __func__, > - code, leaf); > - return (-1); > - } > - if ((vmh->vmh_cpuids[i].c & c & VMM_SEFF0ECX_MASK) != > - (vmh->vmh_cpuids[i].c & VMM_SEFF0ECX_MASK)) { > - log_debug("%s: incompatible cpu features " > - "code: 0x%x leaf: 0x%x reg: d", __func__, > - code, leaf); > - return (-1); > - } > - break; > - > - case 0x0d: > - CPUID_LEAF(code, leaf, a, b, c, d); > - if (vmh->vmh_cpuids[i].b > b) { > - log_debug("%s: incompatible cpu: insufficient " > - "max save area for enabled XCR0 features", > - __func__); > - return (-1); > - } > - if (vmh->vmh_cpuids[i].c > c) { > - log_debug("%s: incompatible cpu: insufficient " > - "max save area for supported XCR0 features", > - __func__); > - return (-1); > - } > - break; > - > - case 0x80000001: > - CPUID_LEAF(code, leaf, a, b, c, d); > - if ((vmh->vmh_cpuids[i].a & a) != > - vmh->vmh_cpuids[i].a) { > - log_debug("%s: incompatible cpu features " > - "code: 0x%x leaf: 0x%x reg: a", __func__, > - code, leaf); > - return (-1); > - } > - if ((vmh->vmh_cpuids[i].c & c) != > - vmh->vmh_cpuids[i].c) { > - log_debug("%s: incompatible cpu features " > - "code: 0x%x leaf: 0x%x reg: c", __func__, > - code, leaf); > - return (-1); > - } > - if ((vmh->vmh_cpuids[i].d & d) != > - vmh->vmh_cpuids[i].d) { > - log_debug("%s: incompatible cpu features " > - "code: 0x%x leaf: 0x%x reg: d", __func__, > - code, leaf); > - return (-1); > - } > - break; > - > - default: > - log_debug("%s: unknown code 0x%x", __func__, code); > - return (-1); > - } > - } > - > - return (0); > -} >