Download raw body.
remove vmd's send/receive functionality
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?
I know that hshoexer@ used it to create files with memory images
of virtual machines. Then he could verify that AMD SEV did encrypt
everything. It is helpfull to analyze the memory layout of the
guest. But with arrival of SEV-SNP this won't be possible anymore.
So let's see if we find someone who wants to maintain it. Otherwise
I understand, why you want to remove this extra complexity.
bluhm
> 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);
> -}
remove vmd's send/receive functionality