Index | Thread | Search

From:
Mike Larkin <mlarkin@nested.page>
Subject:
Re: remove vmd's send/receive functionality
To:
Dave Voutila <dv@sisu.io>
Cc:
tech@openbsd.org
Date:
Mon, 9 Jun 2025 08:57:26 -0700

Download raw body.

Thread
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(&current_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, &current_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);
> -}
>