Index | Thread | Search

From:
Dave Voutila <dv@sisu.io>
Subject:
declutter vmd/vmctl by pulling vmm structs out of vmd structs
To:
tech@openbsd.org
Date:
Sat, 27 Dec 2025 10:31:23 -0500

Download raw body.

Thread
This looks like deck chair shuffling, but this is to set up for
switching vmm(4) from using magic identifiers (a monotonically
incrementing uint32_t) passed in ioctl's to files[1] to not only clean
up the vmm api a bit, but make virtual machine lifetime management
simpler.

This diff:

 - cleans up how vm identifiers are used, specifically vmm(4)
   vs. vmd(8), making use of explcit naming (vmm_id for kernel ids
   vs. vm_id for vmd ids) to prevent future confusion.

 - makes vmctl(8) not depend on any vmm(4) kernel structs and only on
   the vmd(8)-defined structs by removing the vmm structs embedded in
   vmd structs.

 - is net-negative!?

Right now I'm mostly looking for testers to check for any
regressions. No behavioral change is expected from this diff.

I don't have an AMD SEV machine, so testing on that would be
appreciated.

*You need to also rebuild vmctl to test this.*

If trying to review, I recommend looking at the header file changes as
they better describe the change to the data types.


[1]: KVM has had this file-based API design from the beginning, IIRC,
     but KVM also creates files for each vcpu. The KVM ioctls for
     running a vcpu or reading/writing registers are made against these
     files.

     There's no value to go that wild with vmm, but this would
     allow a vm process to only need a file open to the vm itself, not
     /dev/vmm, and process exits would make the vm process "clean up"
     the vm state. Today, vmd's "vmm" process does this cleanup via
     VMM_IOC_TERM ioctls after the child vm processes exit.

     Another bonus would be not doing some hacky pid-based filtering in
     vmm based on the ioctl being called since nothing currently
     prevents a process from "guessing" another vm's identifier (or
     accidentally using one if there's a bug in vmd).


diffstat refs/heads/master refs/heads/vmd-vmctl-cleanup
 M  usr.sbin/vmctl/vmctl.c       |  49+   64-
 M  usr.sbin/vmd/arm64_vm.c      |   2+    2-
 M  usr.sbin/vmd/config.c        |  14+   15-
 M  usr.sbin/vmd/dhcp.c          |   5+    5-
 M  usr.sbin/vmd/fw_cfg.c        |   2+    2-
 M  usr.sbin/vmd/loadfile_elf.c  |   6+    7-
 M  usr.sbin/vmd/parse.y         |  11+   13-
 M  usr.sbin/vmd/priv.c          |   1+    2-
 M  usr.sbin/vmd/sev.c           |  10+   18-
 M  usr.sbin/vmd/vioblk.c        |   4+    5-
 M  usr.sbin/vmd/vionet.c        |   4+    5-
 M  usr.sbin/vmd/virtio.c        |  38+   40-
 M  usr.sbin/vmd/virtio.h        |   2+    2-
 M  usr.sbin/vmd/vm.c            |  70+   68-
 M  usr.sbin/vmd/vm_agentx.c     |   9+   10-
 M  usr.sbin/vmd/vmd.c           |  86+  104-
 M  usr.sbin/vmd/vmd.h           |  54+   23-
 M  usr.sbin/vmd/vmm.c           |  24+   18-
 M  usr.sbin/vmd/x86_vm.c        |  56+   63-

19 files changed, 447 insertions(+), 466 deletions(-)

diff refs/heads/master refs/heads/vmd-vmctl-cleanup
commit - a39b2115abef8adc9cc601a81bdf809c4a8dc51e
commit + f59376db8c369968041b61dfc8bd7cd9f3cc52f9
blob - eae1a9cb191f08f6bba2cb8d6243cf70d765fcc8
blob + f6a44b6219a58aa0aa56c1f4684777df2edf2ded
--- usr.sbin/vmctl/vmctl.c
+++ usr.sbin/vmctl/vmctl.c
@@ -75,8 +75,7 @@ vm_start(uint32_t start_id, const char *name, size_t m
     char **nics, int ndisks, char **disks, int *disktypes, char *kernel,
     char *iso, char *instance, unsigned int bootdevice)
 {
-	struct vmop_create_params *vmc;
-	struct vm_create_params *vcp;
+	struct vmop_create_params vmc;
 	struct stat sb;
 	unsigned int flags = 0;
 	int i;
@@ -120,47 +119,43 @@ vm_start(uint32_t start_id, const char *name, size_t m
 			warnx("starting without network interfaces");
 	}

-	if ((vmc = calloc(1, sizeof(struct vmop_create_params))) == NULL)
-		return (ENOMEM);
-	vmc->vmc_kernel = -1;
-	vmc->vmc_flags = flags;
+	memset(&vmc, 0, sizeof(vmc));
+	vmc.vmc_kernel = -1;
+	vmc.vmc_flags = flags;

-	/* vcp includes configuration that is shared with the kernel */
-	vcp = &vmc->vmc_params;
-
 	/*
 	 * XXX: vmd(8) fills in the actual memory ranges. vmctl(8)
 	 * just passes in the actual memory size here.
 	 */
-	vcp->vcp_nmemranges = 1;
-	vcp->vcp_memranges[0].vmr_size = memsize;
+	vmc.vmc_nmemranges = 1;
+	vmc.vmc_memranges[0].vmr_size = memsize;

-	vcp->vcp_ncpus = 1;
-	vcp->vcp_id = start_id;
+	vmc.vmc_ncpus = 1;
+	vmc.vmc_id = start_id;

-	vmc->vmc_ndisks = ndisks;
-	vmc->vmc_nnics = nnics;
+	vmc.vmc_ndisks = ndisks;
+	vmc.vmc_nnics = nnics;

 	for (i = 0 ; i < ndisks; i++) {
-		if (strlcpy(vmc->vmc_disks[i], disks[i],
-		    sizeof(vmc->vmc_disks[i])) >=
-		    sizeof(vmc->vmc_disks[i]))
+		if (strlcpy(vmc.vmc_disks[i], disks[i],
+		    sizeof(vmc.vmc_disks[i])) >=
+		    sizeof(vmc.vmc_disks[i]))
 			errx(1, "disk path too long");
-		vmc->vmc_disktypes[i] = disktypes[i];
+		vmc.vmc_disktypes[i] = disktypes[i];
 	}
 	for (i = 0 ; i < nnics; i++) {
-		vmc->vmc_ifflags[i] = VMIFF_UP;
+		vmc.vmc_ifflags[i] = VMIFF_UP;

 		if (strcmp(".", nics[i]) == 0) {
 			/* Add a "local" interface */
-			(void)strlcpy(vmc->vmc_ifswitch[i], "",
-			    sizeof(vmc->vmc_ifswitch[i]));
-			vmc->vmc_ifflags[i] |= VMIFF_LOCAL;
+			(void)strlcpy(vmc.vmc_ifswitch[i], "",
+			    sizeof(vmc.vmc_ifswitch[i]));
+			vmc.vmc_ifflags[i] |= VMIFF_LOCAL;
 		} else {
 			/* Add an interface to a switch */
-			if (strlcpy(vmc->vmc_ifswitch[i], nics[i],
-			    sizeof(vmc->vmc_ifswitch[i])) >=
-			    sizeof(vmc->vmc_ifswitch[i]))
+			if (strlcpy(vmc.vmc_ifswitch[i], nics[i],
+			    sizeof(vmc.vmc_ifswitch[i])) >=
+			    sizeof(vmc.vmc_ifswitch[i]))
 				errx(1, "interface name too long");
 		}
 	}
@@ -179,36 +174,35 @@ vm_start(uint32_t start_id, const char *name, size_t m
 				errx(1, "invalid VM name");
 		}

-		if (strlcpy(vcp->vcp_name, name,
-		    sizeof(vcp->vcp_name)) >= sizeof(vcp->vcp_name))
+		if (strlcpy(vmc.vmc_name, name,
+		    sizeof(vmc.vmc_name)) >= sizeof(vmc.vmc_name))
 			errx(1, "vm name too long");
 	}
 	if (kernel != NULL) {
 		if (strnlen(kernel, PATH_MAX) == PATH_MAX)
 			errx(1, "kernel name too long");
-		vmc->vmc_kernel = open(kernel, O_RDONLY);
-		if (vmc->vmc_kernel == -1)
+		vmc.vmc_kernel = open(kernel, O_RDONLY);
+		if (vmc.vmc_kernel == -1)
 			err(1, "cannot open kernel '%s'", kernel);
 		memset(&sb, 0, sizeof(sb));
-		if (fstat(vmc->vmc_kernel, &sb) == -1)
+		if (fstat(vmc.vmc_kernel, &sb) == -1)
 			err(1, "fstat kernel");
 		if (!S_ISREG(sb.st_mode))
 			errx(1, "kernel must be a regular file");
 	}
 	if (iso != NULL)
-		if (strlcpy(vmc->vmc_cdrom, iso,
-		    sizeof(vmc->vmc_cdrom)) >= sizeof(vmc->vmc_cdrom))
+		if (strlcpy(vmc.vmc_cdrom, iso,
+		    sizeof(vmc.vmc_cdrom)) >= sizeof(vmc.vmc_cdrom))
 			errx(1, "cdrom name too long");
 	if (instance != NULL)
-		if (strlcpy(vmc->vmc_instance, instance,
-		    sizeof(vmc->vmc_instance)) >= sizeof(vmc->vmc_instance))
+		if (strlcpy(vmc.vmc_instance, instance,
+		    sizeof(vmc.vmc_instance)) >= sizeof(vmc.vmc_instance))
 			errx(1, "instance vm name too long");
-	vmc->vmc_bootdevice = bootdevice;
+	vmc.vmc_bootdevice = bootdevice;

-	imsg_compose(ibuf, IMSG_VMDOP_START_VM_REQUEST, 0, 0, vmc->vmc_kernel,
-	    vmc, sizeof(struct vmop_create_params));
+	imsg_compose(ibuf, IMSG_VMDOP_START_VM_REQUEST, 0, 0, vmc.vmc_kernel,
+	    &vmc, sizeof(vmc));

-	free(vmc);
 	return (0);
 }

@@ -495,14 +489,12 @@ terminate_vm_complete(struct imsg *imsg, int *ret, uns
 void
 terminate_all(struct vmop_info_result *list, size_t ct, unsigned int flags)
 {
-	struct vm_info_result *vir;
-	struct vmop_info_result *vmi;
+	struct vmop_info_result *vir;
 	struct parse_result res;
 	size_t i;

 	for (i = 0; i < ct; i++) {
-		vmi = &list[i];
-		vir = &vmi->vir_info;
+		vir = &list[i];

 		/* The VM is already stopped */
 		if (vir->vir_creator_pid == 0 || vir->vir_id == 0)
@@ -705,8 +697,7 @@ vm_state(unsigned int mask)
 int
 print_vm_info(struct vmop_info_result *list, size_t ct)
 {
-	struct vm_info_result *vir;
-	struct vmop_info_result *vmi;
+	struct vmop_info_result *vir;
 	size_t i;
 	char *tty;
 	char curmem[FMT_SCALED_STRSIZE];
@@ -722,8 +713,7 @@ print_vm_info(struct vmop_info_result *list, size_t ct
 	    "MAXMEM", "CURMEM", "TTY", "OWNER", "STATE", "NAME");

 	for (i = 0; i < ct; i++) {
-		vmi = &list[i];
-		vir = &vmi->vir_info;
+		vir = &list[i];
 		running = (vir->vir_creator_pid != 0 && vir->vir_id != 0);
 		if (!running && stat_rflag)
 			continue;
@@ -732,18 +722,18 @@ print_vm_info(struct vmop_info_result *list, size_t ct

 		if (check_info_id(vir->vir_name, vir->vir_id)) {
 			/* get user name */
-			name = user_from_uid(vmi->vir_uid, 1);
+			name = user_from_uid(vir->vir_uid, 1);
 			if (name == NULL)
 				(void)snprintf(user, sizeof(user),
-				    "%d", vmi->vir_uid);
+				    "%d", vir->vir_uid);
 			else
 				(void)strlcpy(user, name, sizeof(user));
 			/* get group name */
-			if (vmi->vir_gid != -1) {
-				name = group_from_gid(vmi->vir_gid, 1);
+			if (vir->vir_gid != -1) {
+				name = group_from_gid(vir->vir_gid, 1);
 				if (name == NULL)
 					(void)snprintf(group, sizeof(group),
-					    ":%lld", vmi->vir_gid);
+					    ":%lld", vir->vir_gid);
 				else
 					(void)snprintf(group, sizeof(group),
 					    ":%s", name);
@@ -756,10 +746,10 @@ print_vm_info(struct vmop_info_result *list, size_t ct
 			(void)fmt_scaled(vir->vir_memory_size, maxmem);

 			if (running) {
-				if (*vmi->vir_ttyname == '\0')
+				if (*vir->vir_ttyname == '\0')
 					tty = "-";
 				/* get tty - skip /dev/ path */
-				else if ((tty = strrchr(vmi->vir_ttyname,
+				else if ((tty = strrchr(vir->vir_ttyname,
 				    '/')) == NULL || *++tty == '\0')
 					tty = list[i].vir_ttyname;

@@ -769,14 +759,14 @@ print_vm_info(struct vmop_info_result *list, size_t ct
 				printf("%5u %5u %5zd %7s %7s %7s %12s %8s %s\n",
 				    vir->vir_id, vir->vir_creator_pid,
 				    vir->vir_ncpus, maxmem, curmem,
-				    tty, user, vm_state(vmi->vir_state),
+				    tty, user, vm_state(vir->vir_state),
 				    vir->vir_name);
 			} else {
 				/* disabled vm */
 				printf("%5u %5s %5zd %7s %7s %7s %12s %8s %s\n",
 				    vir->vir_id, "-",
 				    vir->vir_ncpus, maxmem, curmem,
-				    "-", user, vm_state(vmi->vir_state),
+				    "-", user, vm_state(vir->vir_state),
 				    vir->vir_name);
 			}
 		}
@@ -805,9 +795,8 @@ vm_console(struct vmop_info_result *list, size_t ct)

 	for (i = 0; i < ct; i++) {
 		vir = &list[i];
-		if ((check_info_id(vir->vir_info.vir_name,
-		    vir->vir_info.vir_id) > 0) &&
-			(vir->vir_ttyname[0] != '\0')) {
+		if ((check_info_id(vir->vir_name, vir->vir_id) > 0) &&
+		    (vir->vir_ttyname[0] != '\0')) {
 			/* does not return */
 			ctl_openconsole(vir->vir_ttyname);
 		}
@@ -930,14 +919,10 @@ vmop_result_read(struct imsg *imsg, struct vmop_result
 void
 vmop_info_result_read(struct imsg *imsg, struct vmop_info_result *vir)
 {
-	struct vm_info_result *r;
-
 	if (imsg_get_data(imsg, vir, sizeof(*vir)))
 		fatal("%s", __func__);

-	r = &vir->vir_info;
-	r->vir_name[sizeof(r->vir_name) - 1] = '\0';
-
+	vir->vir_name[sizeof(vir->vir_name) - 1] = '\0';
 	vir->vir_ttyname[sizeof(vir->vir_ttyname) - 1] = '\0';
 }

blob - bb3eb114e83c6a2c1cedbd159911543b1a0cb6b2
blob + 89b19e74b702e71e2a09265d69fc3c4f3c61c776
--- usr.sbin/vmd/arm64_vm.c
+++ usr.sbin/vmd/arm64_vm.c
@@ -20,7 +20,7 @@
 #include "vmm.h"

 void
-create_memory_map(struct vm_create_params *vcp)
+create_memory_map(struct vmd_vm *vm)
 {
 	fatalx("%s: unimplemented", __func__);
 	/* NOTREACHED */
@@ -35,7 +35,7 @@ load_firmware(struct vmd_vm *vm, struct vcpu_reg_state
 }

 int
-init_emulated_hw(struct vmop_create_params *vcp, int child_cdrom,
+init_emulated_hw(struct vmd_vm *vm, int child_cdrom,
     int child_disks[][VM_MAX_BASE_PER_DISK], int *child_taps)
 {
 	fatalx("%s: unimplemented", __func__);
blob - 069c05608cc842bc9604504698bfb453d62ce475
blob + 24f1c7fe8bd6edc255d5360ed6d12e56c53cf517
--- usr.sbin/vmd/config.c
+++ usr.sbin/vmd/config.c
@@ -190,7 +190,6 @@ config_setvm(struct privsep *ps, struct vmd_vm *vm, ui
 	int diskfds[VM_MAX_DISKS_PER_VM][VM_MAX_BASE_PER_DISK];
 	struct vmd_if		*vif;
 	struct vmop_create_params *vmc = &vm->vm_params;
-	struct vm_create_params	*vcp = &vmc->vmc_params;
 	unsigned int		 i, j;
 	int			 fd = -1, cdromfd = -1, kernfd = -1;
 	int			*tapfds = NULL;
@@ -227,13 +226,13 @@ config_setvm(struct privsep *ps, struct vmd_vm *vm, ui
 		}

 		log_debug("%s: vm %u restarted after %lld.%ld seconds,"
-		    " limit %d/%d", __func__, vcp->vcp_id, since_last.tv_sec,
+		    " limit %d/%d", __func__, vm->vm_vmid, since_last.tv_sec,
 		    since_last.tv_usec, vm->vm_start_limit,
 		    VM_START_RATE_LIMIT);

 		if (vm->vm_start_limit >= VM_START_RATE_LIMIT) {
-			log_warnx("%s: vm %u restarted too quickly",
-			    __func__, vcp->vcp_id);
+			log_warnx("%s: vm %u restarted too quickly", __func__,
+			    vm->vm_vmid);
 			return (EPERM);
 		}
 	}
@@ -290,7 +289,7 @@ config_setvm(struct privsep *ps, struct vmd_vm *vm, ui
 		    vmc->vmc_checkaccess & VMOP_CREATE_KERNEL,
 		    uid, R_OK) == -1) {
 			log_warnx("vm \"%s\" no read access to kernel "
-			    "%s", vcp->vcp_name, vm->vm_kernel_path);
+			    "%s", vmc->vmc_name, vm->vm_kernel_path);
 			ret = EPERM;
 			goto fail;
 		}
@@ -313,7 +312,7 @@ config_setvm(struct privsep *ps, struct vmd_vm *vm, ui
 		    vmc->vmc_checkaccess & VMOP_CREATE_CDROM,
 		    uid, R_OK) == -1) {
 			log_warnx("vm \"%s\" no read access to cdrom %s",
-			    vcp->vcp_name, vmc->vmc_cdrom);
+			    vmc->vmc_name, vmc->vmc_cdrom);
 			ret = EPERM;
 			goto fail;
 		}
@@ -343,7 +342,7 @@ config_setvm(struct privsep *ps, struct vmd_vm *vm, ui
 			    vmc->vmc_checkaccess & VMOP_CREATE_DISK,
 			    uid, aflags) == -1) {
 				log_warnx("vm \"%s\" unable to access "
-				    "disk %s", vcp->vcp_name, path);
+				    "disk %s", vmc->vmc_name, path);
 				errno = EPERM;
 				goto fail;
 			}
@@ -361,7 +360,7 @@ config_setvm(struct privsep *ps, struct vmd_vm *vm, ui
 				break;
 			if (n == -1) {
 				log_warnx("vm \"%s\" unable to read "
-				    "base for disk %s", vcp->vcp_name,
+				    "base for disk %s", vmc->vmc_name,
 				    vmc->vmc_disks[i]);
 				goto fail;
 			}
@@ -488,18 +487,18 @@ config_setvm(struct privsep *ps, struct vmd_vm *vm, ui
 	free(tapfds);

 	/* Collapse any memranges after the vm was sent to PROC_VMM */
-	if (vcp->vcp_nmemranges > 0) {
-		for (i = 0; i < vcp->vcp_nmemranges; i++)
-			bytes += vcp->vcp_memranges[i].vmr_size;
-		memset(&vcp->vcp_memranges, 0, sizeof(vcp->vcp_memranges));
-		vcp->vcp_nmemranges = 0;
-		vcp->vcp_memranges[0].vmr_size = bytes;
+	if (vmc->vmc_nmemranges > 0) {
+		for (i = 0; i < vmc->vmc_nmemranges; i++)
+			bytes += vmc->vmc_memranges[i].vmr_size;
+		memset(&vmc->vmc_memranges, 0, sizeof(vmc->vmc_memranges));
+		vmc->vmc_nmemranges = 0;
+		vmc->vmc_memranges[0].vmr_size = bytes;
 	}
 	vm->vm_state |= VM_STATE_RUNNING;
 	return (0);

  fail:
-	log_warnx("failed to start vm %s", vcp->vcp_name);
+	log_warnx("failed to start vm %s", vmc->vmc_name);

 	if (vm->vm_kernel != -1)
 		close(kernfd);
blob - 256a29f51260e7af51977b4ea16676e056376943
blob + 03cdcb269dcc3f8560c2d35299c1226da5fdea26
--- usr.sbin/vmd/dhcp.c
+++ usr.sbin/vmd/dhcp.c
@@ -139,13 +139,13 @@ dhcp_request(struct virtio_dev *dev, char *buf, size_t

 	if (vionet->pxeboot) {
 		strlcpy(resp.file, "auto_install", sizeof resp.file);
-		vm = vm_getbyvmid(dev->vm_vmid);
-		if (vm && res_hnok(vm->vm_params.vmc_params.vcp_name))
-			hostname = vm->vm_params.vmc_params.vcp_name;
+		vm = vm_getbyid(dev->vmm_id);
+		if (vm && res_hnok(vm->vm_params.vmc_name))
+			hostname = vm->vm_params.vmc_name;
 	}

 	if ((client_addr.s_addr = vm_priv_addr(&vionet->local_prefix,
-	    dev->vm_vmid, vionet->idx, 1)) == 0)
+	    dev->vm_id, vionet->idx, 1)) == 0)
 		return (-1);
 	memcpy(&resp.yiaddr, &client_addr,
 	    sizeof(client_addr));
@@ -154,7 +154,7 @@ dhcp_request(struct virtio_dev *dev, char *buf, size_t
 	ss2sin(&pc.pc_dst)->sin_port = htons(CLIENT_PORT);

 	if ((server_addr.s_addr = vm_priv_addr(&vionet->local_prefix,
-	    dev->vm_vmid, vionet->idx, 0)) == 0)
+	    dev->vm_id, vionet->idx, 0)) == 0)
 		return (-1);
 	memcpy(&resp.siaddr, &server_addr, sizeof(server_addr));
 	memcpy(&ss2sin(&pc.pc_src)->sin_addr, &server_addr,
blob - 44bc7bd58fbf956168c8adb8731def6e14a076eb
blob + ce6b6cc2187ed3c983ed324bd1054b7cbc3b46cb
--- usr.sbin/vmd/fw_cfg.c
+++ usr.sbin/vmd/fw_cfg.c
@@ -79,8 +79,8 @@ fw_cfg_init(struct vmop_create_params *vmc)

 	/* Define e820 memory ranges. */
 	memset(&e820, 0, sizeof(e820));
-	for (i = 0; i < vmc->vmc_params.vcp_nmemranges; i++) {
-		struct vm_mem_range *range = &vmc->vmc_params.vcp_memranges[i];
+	for (i = 0; i < vmc->vmc_nmemranges; i++) {
+		struct vm_mem_range *range = &vmc->vmc_memranges[i];
 		bios_memmap_t *entry = &e820[i];
 		entry->addr = range->vmr_gpa;
 		entry->size = range->vmr_size;
blob - 875287d8c7a856d34efd730603e1d9a9c692daa4
blob + 36a94208ee400e3831878be04feb910dec913f09
--- usr.sbin/vmd/loadfile_elf.c
+++ usr.sbin/vmd/loadfile_elf.c
@@ -113,7 +113,7 @@ static void setsegment(struct mem_segment_descriptor *
     size_t, int, int, int, int);
 static int elf32_exec(gzFile, Elf32_Ehdr *, u_long *, int);
 static int elf64_exec(gzFile, Elf64_Ehdr *, u_long *, int);
-static size_t create_bios_memmap(struct vm_create_params *, bios_memmap_t *);
+static size_t create_bios_memmap(struct vmop_create_params *, bios_memmap_t *);
 static uint32_t push_bootargs(bios_memmap_t *, size_t, bios_bootmac_t *);
 static size_t push_stack(uint32_t, uint32_t);
 static void push_gdt(void);
@@ -217,7 +217,6 @@ loadfile_elf(gzFile fp, struct vmd_vm *vm, struct vcpu
 	u_long marks[MARK_MAX];
 	bios_memmap_t memmap[VMM_MAX_MEM_RANGES + 1];
 	bios_bootmac_t bm, *bootmac = NULL;
-	struct vm_create_params *vcp = &vm->vm_params.vmc_params;

 	if ((r = gzread(fp, &hdr, sizeof(hdr))) != sizeof(hdr))
 		return 1;
@@ -251,7 +250,7 @@ loadfile_elf(gzFile fp, struct vmd_vm *vm, struct vcpu
 		bootmac = &bm;
 		memcpy(bootmac, vm->vm_params.vmc_macs[0], ETHER_ADDR_LEN);
 	}
-	n = create_bios_memmap(vcp, memmap);
+	n = create_bios_memmap(&vm->vm_params, memmap);
 	bootargsz = push_bootargs(memmap, n, bootmac);
 	stacksize = push_stack(bootargsz, marks[MARK_END]);

@@ -270,20 +269,20 @@ loadfile_elf(gzFile fp, struct vmd_vm *vm, struct vcpu
  * Construct a memory map as returned by the BIOS INT 0x15, e820 routine.
  *
  * Parameters:
- *  vcp: the VM create parameters, containing the memory map passed to vmm(4)
+ *  vmc: the VM create parameters, containing the memory map passed to vmm(4)
  *   memmap (out): the BIOS memory map
  *
  * Return values:
  * Number of bios_memmap_t entries, including the terminating nul-entry.
  */
 static size_t
-create_bios_memmap(struct vm_create_params *vcp, bios_memmap_t *memmap)
+create_bios_memmap(struct vmop_create_params *vmc, bios_memmap_t *memmap)
 {
 	size_t i, n = 0;
 	struct vm_mem_range *vmr;

-	for (i = 0; i < vcp->vcp_nmemranges; i++, n++) {
-		vmr = &vcp->vcp_memranges[i];
+	for (i = 0; i < vmc->vmc_nmemranges; i++, n++) {
+		vmr = &vmc->vmc_memranges[i];
 		memmap[n].addr = vmr->vmr_gpa;
 		memmap[n].size = vmr->vmr_size;
 		if (vmr->vmr_type == VM_MEM_RAM)
blob - 967583ea5fa26da4f30fe4e6b6c7e9377782621a
blob + 4a8e2d2166784330be19cbb0c9dedbffa0dd5574
--- usr.sbin/vmd/parse.y
+++ usr.sbin/vmd/parse.y
@@ -92,7 +92,6 @@ int		 parse_disk(char *, int);
 unsigned int	 parse_format(const char *);

 static struct vmop_create_params vmc;
-static struct vm_create_params	*vcp;
 static struct vmd_switch	*vsw;
 static char			*kernel = NULL;
 static char			 vsw_type[IF_NAMESIZE];
@@ -323,7 +322,6 @@ vm		: VM string vm_instance		{
 			memset(&vmc, 0, sizeof(vmc));
 			vmc.vmc_kernel = -1;

-			vcp = &vmc.vmc_params;
 			vmc_disable = 0;
 			vmc_nnics = 0;

@@ -349,8 +347,8 @@ vm		: VM string vm_instance		{
 				vmc.vmc_ifflags[i] |= IFF_UP;
 			}

-			if (strlcpy(vcp->vcp_name, name,
-			    sizeof(vcp->vcp_name)) >= sizeof(vcp->vcp_name)) {
+			if (strlcpy(vmc.vmc_name, name,
+			    sizeof(vmc.vmc_name)) >= sizeof(vmc.vmc_name)) {
 				yyerror("vm name too long");
 				free($2);
 				free($3);
@@ -375,12 +373,12 @@ vm		: VM string vm_instance		{
 					log_debug("%s:%d: vm \"%s\""
 					    " skipped (%s)",
 					    file->name, yylval.lineno,
-					    vcp->vcp_name,
+					    vmc.vmc_name,
 					    (vm->vm_state & VM_STATE_RUNNING) ?
 					    "running" : "already exists");
 				} else if (ret == -1) {
 					yyerror("vm \"%s\" failed: %s",
-					    vcp->vcp_name, strerror(errno));
+					    vmc.vmc_name, strerror(errno));
 					YYERROR;
 				} else {
 					if (vmc_disable)
@@ -390,7 +388,7 @@ vm		: VM string vm_instance		{
 					log_debug("%s:%d: vm \"%s\" "
 					    "registered (%s)",
 					    file->name, yylval.lineno,
-					    vcp->vcp_name,
+					    vmc.vmc_name,
 					    vmc_disable ?
 					    "disabled" : "enabled");
 				}
@@ -414,10 +412,10 @@ vm_opts		: disable			{
 			vmc_disable = $1;
 		}
 		| sev				{
-			vcp->vcp_sev = 1;
+			vmc.vmc_sev = 1;
 		}
 		| seves				{
-			vcp->vcp_sev = vcp->vcp_seves = 1;
+			vmc.vmc_sev = vmc.vmc_seves = 1;
 		}
 		| DISK string image_format	{
 			if (parse_disk($2, $3) != 0) {
@@ -518,7 +516,7 @@ vm_opts		: disable			{
 		}
 		| MEMORY NUMBER			{
 			ssize_t	 res;
-			if (vcp->vcp_memranges[0].vmr_size != 0) {
+			if (vmc.vmc_memranges[0].vmr_size != 0) {
 				yyerror("memory specified more than once");
 				YYERROR;
 			}
@@ -526,12 +524,12 @@ vm_opts		: disable			{
 				yyerror("failed to parse size: %lld", $2);
 				YYERROR;
 			}
-			vcp->vcp_memranges[0].vmr_size = (size_t)res;
+			vmc.vmc_memranges[0].vmr_size = (size_t)res;
 			vmc.vmc_flags |= VMOP_CREATE_MEMORY;
 		}
 		| MEMORY STRING			{
 			ssize_t	 res;
-			if (vcp->vcp_memranges[0].vmr_size != 0) {
+			if (vmc.vmc_memranges[0].vmr_size != 0) {
 				yyerror("argument specified more than once");
 				free($2);
 				YYERROR;
@@ -541,7 +539,7 @@ vm_opts		: disable			{
 				free($2);
 				YYERROR;
 			}
-			vcp->vcp_memranges[0].vmr_size = (size_t)res;
+			vmc.vmc_memranges[0].vmr_size = (size_t)res;
 			vmc.vmc_flags |= VMOP_CREATE_MEMORY;
 		}
 		| OWNER owner_id		{
blob - 196e905aa98f0a31c0108505015c4adca947a8a6
blob + 100454da36c65a5d70e7f7421abb121038a00b38
--- usr.sbin/vmd/priv.c
+++ usr.sbin/vmd/priv.c
@@ -326,7 +326,6 @@ vm_priv_ifconfig(struct privsep *ps, struct vmd_vm *vm
 {
 	char			 name[64];
 	struct vmd		*env = ps->ps_env;
-	struct vm_create_params	*vcp = &vm->vm_params.vmc_params;
 	struct vmd_if		*vif;
 	struct vmd_switch	*vsw;
 	unsigned int		 i;
@@ -347,7 +346,7 @@ vm_priv_ifconfig(struct privsep *ps, struct vmd_vm *vm

 		/* Description can be truncated */
 		(void)snprintf(vfr.vfr_value, sizeof(vfr.vfr_value),
-		    "vm%u-if%u-%s", vm->vm_vmid, i, vcp->vcp_name);
+		    "vm%u-if%u-%s", vm->vm_vmid, i, vm->vm_params.vmc_name);

 		log_debug("%s: interface %s description %s", __func__,
 		    vfr.vfr_name, vfr.vfr_value);
blob - 77964c495de4f5042c305208a2e79aa172b95803
blob + eef693d6e863e25f4887c33dca0a8c1fb9b85e42
--- usr.sbin/vmd/sev.c
+++ usr.sbin/vmd/sev.c
@@ -41,12 +41,11 @@ int
 sev_init(struct vmd_vm *vm)
 {
 	struct vmop_create_params *vmc = &vm->vm_params;
-	struct vm_create_params	*vcp = &vmc->vmc_params;
 	uint32_t		 handle;
 	uint16_t		 pstate;
 	uint8_t			 gstate;

-	if (!vcp->vcp_sev)
+	if (!vmc->vmc_sev)
 		return (0);

 	if (psp_get_pstate(&pstate, NULL, NULL, NULL, NULL)) {
@@ -58,7 +57,7 @@ sev_init(struct vmd_vm *vm)
 		return (-1);
 	}

-	if (psp_launch_start(&handle, vcp->vcp_seves) < 0) {
+	if (psp_launch_start(&handle, vmc->vmc_seves) < 0) {
 		log_warnx("%s: launch failed", __func__);
 		return (-1);
 	}
@@ -83,15 +82,13 @@ int
 sev_register_encryption(vaddr_t addr, size_t size)
 {
 	struct vmop_create_params *vmc;
-	struct vm_create_params *vcp;
 	struct vm_mem_range	*vmr;
 	size_t			 off;
 	int			 i;

 	vmc = &current_vm->vm_params;
-	vcp = &vmc->vmc_params;

-	if (!vcp->vcp_sev)
+	if (!vmc->vmc_sev)
 		return (0);

 	if (size == 0)
@@ -103,7 +100,7 @@ sev_register_encryption(vaddr_t addr, size_t size)
 		addr &= ~(AES_XTS_BLOCKSIZE - 1);
 	}

-	vmr = find_gpa_range(&current_vm->vm_params.vmc_params, addr, size);
+	vmr = find_gpa_range(&current_vm->vm_params, addr, size);
 	if (vmr == NULL) {
 		log_warnx("%s: failed - invalid memory range addr = 0x%lx, "
 		    "len = 0x%zx", __func__, addr, size);
@@ -145,11 +142,10 @@ int
 sev_encrypt_memory(struct vmd_vm *vm)
 {
 	struct vmop_create_params *vmc = &vm->vm_params;
-	struct vm_create_params *vcp = &vmc->vmc_params;
 	struct vm_mem_range	*vmr;
 	size_t			 i;

-	if (!vcp->vcp_sev)
+	if (!vmc->vmc_sev)
 		return (0);

 	for (i = 0; i < vm->vm_sev_nmemsegments; i++) {
@@ -178,10 +174,9 @@ int
 sev_activate(struct vmd_vm *vm, int vcpu_id)
 {
 	struct vmop_create_params *vmc = &vm->vm_params;
-	struct vm_create_params *vcp = &vmc->vmc_params;
 	uint8_t			 gstate;

-	if (!vcp->vcp_sev)
+	if (!vmc->vmc_sev)
 		return (0);

 	if (psp_df_flush() ||
@@ -208,13 +203,12 @@ int
 sev_encrypt_state(struct vmd_vm *vm, int vcpu_id)
 {
 	struct vmop_create_params *vmc = &vm->vm_params;
-	struct vm_create_params *vcp = &vmc->vmc_params;

-	if (!vcp->vcp_seves)
+	if (!vmc->vmc_seves)
 		return (0);

 	if (psp_encrypt_state(vm->vm_sev_handle, vm->vm_sev_asid[vcpu_id],
-	    vcp->vcp_id, vcpu_id)) {
+	    vm->vm_vmmid, vcpu_id)) {
 		log_warnx("%s: failed to encrypt state: 0x%x 0x%x 0x%0x 0x%0x",
 		    __func__, vm->vm_sev_handle, vm->vm_sev_asid[vcpu_id],
 		    vm->vm_vmid, vcpu_id);
@@ -228,10 +222,9 @@ int
 sev_launch_finalize(struct vmd_vm *vm)
 {
 	struct vmop_create_params *vmc = &vm->vm_params;
-	struct vm_create_params *vcp = &vmc->vmc_params;
 	uint8_t		gstate;

-	if (!vcp->vcp_sev)
+	if (!vmc->vmc_sev)
 		return (0);

 	if (psp_launch_measure(vm->vm_sev_handle)) {
@@ -262,9 +255,8 @@ int
 sev_shutdown(struct vmd_vm *vm)
 {
 	struct vmop_create_params *vmc = &vm->vm_params;
-	struct vm_create_params *vcp = &vmc->vmc_params;

-	if (!vcp->vcp_sev)
+	if (!vmc->vmc_sev)
 		return (0);

 	if (psp_guest_shutdown(vm->vm_sev_handle)) {
blob - dbebb76e022433696a5894ef63ad3ddd9b6f0adf
blob + 97b69ab11c6c8dd3311610a560f2c363fec4d695
--- usr.sbin/vmd/vioblk.c
+++ usr.sbin/vmd/vioblk.c
@@ -65,7 +65,6 @@ vioblk_main(int fd, int fd_vmm)
 	struct vioblk_dev	*vioblk = NULL;
 	struct viodev_msg 	 msg;
 	struct vmd_vm		 vm;
-	struct vm_create_params	*vcp;
 	ssize_t			 sz;
 	off_t			 szp = 0;
 	int			 i, ret, type;
@@ -109,11 +108,10 @@ vioblk_main(int fd, int fd_vmm)
 		log_warnx("failed to receive vm details");
 		goto fail;
 	}
-	vcp = &vm.vm_params.vmc_params;
 	current_vm = &vm;

-	setproctitle("%s/vioblk%d", vcp->vcp_name, vioblk->idx);
-	log_procinit("vm/%s/vioblk%d", vcp->vcp_name, vioblk->idx);
+	setproctitle("%s/vioblk%d", vm.vm_params.vmc_name, vioblk->idx);
+	log_procinit("vm/%s/vioblk%d", vm.vm_params.vmc_name, vioblk->idx);

 	/* Now that we have our vm information, we can remap memory. */
 	ret = remap_guest_mem(&vm, fd_vmm);
@@ -178,7 +176,8 @@ vioblk_main(int fd, int fd_vmm)
 	imsg_event_add(&dev.sync_iev);

 	/* Send a ready message over the sync channel. */
-	log_debug("%s: telling vm %s device is ready", __func__, vcp->vcp_name);
+	log_debug("%s: telling vm %s device is ready", __func__,
+	    vm.vm_params.vmc_name);
 	memset(&msg, 0, sizeof(msg));
 	msg.type = VIODEV_MSG_READY;
 	imsg_compose_event(&dev.sync_iev, IMSG_DEVOP_MSG, 0, 0, -1, &msg,
blob - 7435db9f8ad7d22fe61ab35f986b03e9652547d7
blob + 8e50229938b143626337676554a63c4080648cb4
--- usr.sbin/vmd/vionet.c
+++ usr.sbin/vmd/vionet.c
@@ -112,7 +112,6 @@ vionet_main(int fd, int fd_vmm)
 	struct vionet_dev	*vionet = NULL;
 	struct viodev_msg 	 msg;
 	struct vmd_vm	 	 vm;
-	struct vm_create_params	*vcp;
 	ssize_t			 sz;
 	int			 ret;

@@ -154,10 +153,9 @@ vionet_main(int fd, int fd_vmm)
 		log_warnx("failed to receive vm details");
 		goto fail;
 	}
-	vcp = &vm.vm_params.vmc_params;
 	current_vm = &vm;
-	setproctitle("%s/vionet%d", vcp->vcp_name, vionet->idx);
-	log_procinit("vm/%s/vionet%d", vcp->vcp_name, vionet->idx);
+	setproctitle("%s/vionet%d", vm.vm_params.vmc_name, vionet->idx);
+	log_procinit("vm/%s/vionet%d", vm.vm_params.vmc_name, vionet->idx);

 	/* Now that we have our vm information, we can remap memory. */
 	ret = remap_guest_mem(&vm, fd_vmm);
@@ -238,7 +236,8 @@ vionet_main(int fd, int fd_vmm)
 	imsg_event_add2(&dev.sync_iev, ev_base_main);

 	/* Send a ready message over the sync channel. */
-	log_debug("%s: telling vm %s device is ready", __func__, vcp->vcp_name);
+	log_debug("%s: telling vm %s device is ready", __func__,
+	    vm.vm_params.vmc_name);
 	memset(&msg, 0, sizeof(msg));
 	msg.type = VIODEV_MSG_READY;
 	imsg_compose_event2(&dev.sync_iev, IMSG_DEVOP_MSG, 0, 0, -1, &msg,
blob - ecd033cc7ac0e397936b6d2b1e18dbfbed2aa15f
blob + 9a1f0ad93de15f1048289c46a7436879e05a6096
--- usr.sbin/vmd/virtio.c
+++ usr.sbin/vmd/virtio.c
@@ -73,8 +73,8 @@ SLIST_HEAD(virtio_dev_head, virtio_dev) virtio_devs;
 #define RXQ	0
 #define TXQ	1

-static void virtio_dev_init(struct virtio_dev *, uint8_t, uint16_t, uint16_t,
-    uint64_t, uint32_t);
+static void virtio_dev_init(struct vmd_vm *, struct virtio_dev *, uint8_t,
+    uint16_t, uint16_t, uint64_t);
 static int virtio_dev_launch(struct vmd_vm *, struct virtio_dev *);
 static void virtio_dispatch_dev(int, short, void *);
 static int handle_dev_msg(struct viodev_msg *, struct virtio_dev *);
@@ -649,7 +649,7 @@ virtio_io_isr(int dir, uint16_t reg, uint32_t *data, u
 	if (dir == VEI_DIR_IN) {
 		*data = dev->isr;
 		dev->isr = 0;
-		vcpu_deassert_irq(dev->vm_id, 0, dev->irq);
+		vcpu_deassert_irq(dev->vmm_id, 0, dev->irq);
 	}

 	return (0);
@@ -750,7 +750,7 @@ vmmci_ctl(struct virtio_dev *dev, unsigned int cmd)

 		/* Trigger interrupt */
 		dev->isr = VIRTIO_CONFIG_ISR_CONFIG_CHANGE;
-		vcpu_assert_irq(dev->vm_id, 0, dev->irq);
+		vcpu_assert_irq(dev->vmm_id, 0, dev->irq);

 		/* Add ACK timeout */
 		tv.tv_sec = VMMCI_TIMEOUT_SHORT;
@@ -762,7 +762,7 @@ vmmci_ctl(struct virtio_dev *dev, unsigned int cmd)
 			v->cmd = cmd;

 			dev->isr = VIRTIO_CONFIG_ISR_CONFIG_CHANGE;
-			vcpu_assert_irq(dev->vm_id, 0, dev->irq);
+			vcpu_assert_irq(dev->vmm_id, 0, dev->irq);
 		} else {
 			log_debug("%s: RTC sync skipped (guest does not "
 			    "support RTC sync)\n", __func__);
@@ -806,7 +806,7 @@ vmmci_ack(struct virtio_dev *dev, unsigned int cmd)
 		 */
 		if (v->cmd == 0) {
 			log_debug("%s: vm %u requested shutdown", __func__,
-			    dev->vm_id);
+			    dev->vmm_id);
 			vm_pipe_send(&v->dev_pipe, VMMCI_SET_TIMEOUT_SHORT);
 			return;
 		}
@@ -821,13 +821,13 @@ vmmci_ack(struct virtio_dev *dev, unsigned int cmd)
 		 */
 		if (cmd == v->cmd) {
 			log_debug("%s: vm %u acknowledged shutdown request",
-			    __func__, dev->vm_id);
+			    __func__, dev->vmm_id);
 			vm_pipe_send(&v->dev_pipe, VMMCI_SET_TIMEOUT_LONG);
 		}
 		break;
 	case VMMCI_SYNCRTC:
 		log_debug("%s: vm %u acknowledged RTC sync request",
-		    __func__, dev->vm_id);
+		    __func__, dev->vmm_id);
 		v->cmd = VMMCI_NONE;
 		break;
 	default:
@@ -846,7 +846,7 @@ vmmci_timeout(int fd, short type, void *arg)
 		fatalx("%s: device is not a vmmci device", __func__);
 	v = &dev->vmmci;

-	log_debug("vm %u shutdown", dev->vm_id);
+	log_debug("vm %u shutdown", dev->vmm_id);
 	vm_shutdown(v->cmd == VMMCI_REBOOT ? VMMCI_REBOOT : VMMCI_SHUTDOWN);
 }

@@ -935,7 +935,7 @@ vmmci_io(int dir, uint16_t reg, uint32_t *data, uint8_
 		case VIRTIO_CONFIG_ISR_STATUS:
 			*data = dev->isr;
 			dev->isr = 0;
-			vcpu_deassert_irq(dev->vm_id, 0, dev->irq);
+			vcpu_deassert_irq(dev->vmm_id, 0, dev->irq);
 			break;
 		}
 	}
@@ -990,7 +990,6 @@ virtio_init(struct vmd_vm *vm, int child_cdrom,
     int child_disks[][VM_MAX_BASE_PER_DISK], int *child_taps)
 {
 	struct vmop_create_params *vmc = &vm->vm_params;
-	struct vm_create_params *vcp = &vmc->vmc_params;
 	struct virtio_dev *dev;
 	uint8_t id, i, j;
 	int bar_id, ret = 0;
@@ -1005,8 +1004,8 @@ virtio_init(struct vmd_vm *vm, int child_cdrom,
 		log_warnx("can't add PCI virtio rng device");
 		return (1);
 	}
-	virtio_dev_init(&viornd, id, VIORND_QUEUE_SIZE_DEFAULT,
-	    VIRTIO_RND_QUEUES, VIRTIO_F_VERSION_1, vcp->vcp_id);
+	virtio_dev_init(vm, &viornd, id, VIORND_QUEUE_SIZE_DEFAULT,
+	    VIRTIO_RND_QUEUES, VIRTIO_F_VERSION_1);

 	bar_id = pci_add_bar(id, PCI_MAPREG_TYPE_IO, virtio_io_dispatch,
 	    &viornd);
@@ -1033,10 +1032,9 @@ virtio_init(struct vmd_vm *vm, int child_cdrom,
 				log_warnx("can't add PCI virtio net device");
 				return (1);
 			}
-			virtio_dev_init(dev, id, VIONET_QUEUE_SIZE_DEFAULT,
+			virtio_dev_init(vm, dev, id, VIONET_QUEUE_SIZE_DEFAULT,
 			    VIRTIO_NET_QUEUES,
-			    (VIRTIO_NET_F_MAC | VIRTIO_F_VERSION_1),
-			    vcp->vcp_id);
+			    (VIRTIO_NET_F_MAC | VIRTIO_F_VERSION_1));

 			if (pci_add_bar(id, PCI_MAPREG_TYPE_IO, virtio_pci_io,
 			    dev) == -1) {
@@ -1055,7 +1053,7 @@ virtio_init(struct vmd_vm *vm, int child_cdrom,

 			/* Device specific initializiation. */
 			dev->dev_type = VMD_DEVTYPE_NET;
-			dev->vm_vmid = vm->vm_vmid;
+			dev->vmm_id = vm->vm_vmmid;
 			dev->vionet.data_fd = child_taps[i];

 			/* MAC address has been assigned by the parent */
@@ -1070,7 +1068,7 @@ virtio_init(struct vmd_vm *vm, int child_cdrom,
 			    &env->vmd_cfg.cfg_localprefix,
 			    sizeof(dev->vionet.local_prefix));
 			log_debug("%s: vm \"%s\" vio%u lladdr %s%s%s%s",
-			    __func__, vcp->vcp_name, i,
+			    __func__, vm->vm_params.vmc_name, i,
 			    ether_ntoa((void *)dev->vionet.mac),
 			    dev->vionet.lockedmac ? ", locked" : "",
 			    dev->vionet.local ? ", local" : "",
@@ -1100,10 +1098,9 @@ virtio_init(struct vmd_vm *vm, int child_cdrom,
 				    "device");
 				return (1);
 			}
-			virtio_dev_init(dev, id, VIOBLK_QUEUE_SIZE_DEFAULT,
+			virtio_dev_init(vm, dev, id, VIOBLK_QUEUE_SIZE_DEFAULT,
 			    VIRTIO_BLK_QUEUES,
-			    (VIRTIO_F_VERSION_1 | VIRTIO_BLK_F_SEG_MAX),
-			    vcp->vcp_id);
+			    (VIRTIO_F_VERSION_1 | VIRTIO_BLK_F_SEG_MAX));

 			bar_id = pci_add_bar(id, PCI_MAPREG_TYPE_IO, virtio_pci_io,
 			    dev);
@@ -1123,7 +1120,7 @@ virtio_init(struct vmd_vm *vm, int child_cdrom,

 			/* Device specific initialization. */
 			dev->dev_type = VMD_DEVTYPE_DISK;
-			dev->vm_vmid = vm->vm_vmid;
+			dev->vmm_id = vm->vm_vmmid;
 			dev->vioblk.seg_max = VIOBLK_SEG_MAX_DEFAULT;

 			/*
@@ -1165,8 +1162,8 @@ virtio_init(struct vmd_vm *vm, int child_cdrom,
 			log_warnx("can't add PCI vioscsi device");
 			return (1);
 		}
-		virtio_dev_init(dev, id, VIOSCSI_QUEUE_SIZE_DEFAULT,
-		    VIRTIO_SCSI_QUEUES, VIRTIO_F_VERSION_1, vcp->vcp_id);
+		virtio_dev_init(vm, dev, id, VIOSCSI_QUEUE_SIZE_DEFAULT,
+		    VIRTIO_SCSI_QUEUES, VIRTIO_F_VERSION_1);
 		if (pci_add_bar(id, PCI_MAPREG_TYPE_IO, virtio_io_dispatch, dev)
 		    == -1) {
 			log_warnx("can't add bar for vioscsi device");
@@ -1199,8 +1196,8 @@ virtio_init(struct vmd_vm *vm, int child_cdrom,
 		log_warnx("can't add PCI vmm control device");
 		return (1);
 	}
-	virtio_dev_init(dev, id, 0, 0,
-	    VMMCI_F_TIMESYNC | VMMCI_F_ACK | VMMCI_F_SYNCRTC, vcp->vcp_id);
+	virtio_dev_init(vm, dev, id, 0, 0,
+	    VMMCI_F_TIMESYNC | VMMCI_F_ACK | VMMCI_F_SYNCRTC);
 	if (pci_add_bar(id, PCI_MAPREG_TYPE_IO, vmmci_io, dev) == -1) {
 		log_warnx("can't add bar for vmm control device");
 		return (1);
@@ -1346,8 +1343,8 @@ virtio_start(struct vmd_vm *vm)
  * Initialize a new virtio device structure.
  */
 static void
-virtio_dev_init(struct virtio_dev *dev, uint8_t pci_id, uint16_t queue_size,
-    uint16_t num_queues, uint64_t features, uint32_t vm_id)
+virtio_dev_init(struct vmd_vm *vm, struct virtio_dev *dev, uint8_t pci_id,
+    uint16_t queue_size, uint16_t num_queues, uint64_t features)
 {
 	size_t i;
 	uint16_t device_id;
@@ -1365,7 +1362,8 @@ virtio_dev_init(struct virtio_dev *dev, uint8_t pci_id
 	dev->device_id = device_id;
 	dev->irq = pci_get_dev_irq(pci_id);
 	dev->isr = 0;
-	dev->vm_id = vm_id;
+	dev->vm_id = vm->vm_vmid;
+	dev->vmm_id = vm->vm_vmmid;

 	dev->device_feature = features;

@@ -1478,12 +1476,12 @@ virtio_dev_launch(struct vmd_vm *vm, struct virtio_dev

 	switch (dev->dev_type) {
 	case VMD_DEVTYPE_NET:
-		log_debug("%s: launching vionet%d",
-		    vm->vm_params.vmc_params.vcp_name, dev->vionet.idx);
+		log_debug("%s: launching vionet%d", vm->vm_params.vmc_name,
+		    dev->vionet.idx);
 		break;
 	case VMD_DEVTYPE_DISK:
-		log_debug("%s: launching vioblk%d",
-		    vm->vm_params.vmc_params.vcp_name, dev->vioblk.idx);
+		log_debug("%s: launching vioblk%d", vm->vm_params.vmc_name,
+		    dev->vioblk.idx);
 		break;
 		/* NOTREACHED */
 	default:
@@ -1542,7 +1540,7 @@ virtio_dev_launch(struct vmd_vm *vm, struct virtio_dev

 		/* 2. Send over details on the VM (including memory fds). */
 		log_debug("%s: sending vm message for '%s'", __func__,
-			vm->vm_params.vmc_params.vcp_name);
+			vm->vm_params.vmc_name);
 		sz = atomicio(vwrite, sync_fds[0], vm, sizeof(*vm));
 		if (sz != sizeof(*vm)) {
 			log_warnx("%s: failed to send vm details", __func__);
@@ -1616,7 +1614,7 @@ virtio_dev_launch(struct vmd_vm *vm, struct virtio_dev
 		snprintf(vmm_fd, sizeof(vmm_fd), "%d", env->vmd_fd);
 		memset(vm_name, 0, sizeof(vm_name));
 		snprintf(vm_name, sizeof(vm_name), "%s",
-		    vm->vm_params.vmc_params.vcp_name);
+		    vm->vm_params.vmc_name);

 		t[0] = dev->dev_type;
 		t[1] = '\0';
@@ -1745,14 +1743,14 @@ virtio_dispatch_dev(int fd, short event, void *arg)
 static int
 handle_dev_msg(struct viodev_msg *msg, struct virtio_dev *gdev)
 {
-	uint32_t vm_id = gdev->vm_id;
+	uint32_t vmm_id = gdev->vmm_id;

 	switch (msg->type) {
 	case VIODEV_MSG_KICK:
 		if (msg->state == INTR_STATE_ASSERT)
-			vcpu_assert_irq(vm_id, msg->vcpu, msg->irq);
+			vcpu_assert_irq(vmm_id, msg->vcpu, msg->irq);
 		else if (msg->state == INTR_STATE_DEASSERT)
-			vcpu_deassert_irq(vm_id, msg->vcpu, msg->irq);
+			vcpu_deassert_irq(vmm_id, msg->vcpu, msg->irq);
 		break;
 	case VIODEV_MSG_READY:
 		log_debug("%s: device reports ready", __func__);
@@ -1851,9 +1849,9 @@ virtio_pci_io(int dir, uint16_t reg, uint32_t *data, u
 			 * device performs a register read.
 			 */
 			if (msg.state == INTR_STATE_ASSERT)
-				vcpu_assert_irq(dev->vm_id, msg.vcpu, msg.irq);
+				vcpu_assert_irq(dev->vmm_id, msg.vcpu, msg.irq);
 			else if (msg.state == INTR_STATE_DEASSERT)
-				vcpu_deassert_irq(dev->vm_id, msg.vcpu, msg.irq);
+				vcpu_deassert_irq(dev->vmm_id, msg.vcpu, msg.irq);
 		} else {
 			log_warnx("%s: expected IO_READ, got %d", __func__,
 			    msg.type);
blob - b7a49b40e0b1255139a130f554d2363eb33d99d1
blob + 1d7f1d45c684400b5c95c2b70f2cb6a474332c96
--- usr.sbin/vmd/virtio.h
+++ usr.sbin/vmd/virtio.h
@@ -358,7 +358,6 @@ struct virtio_dev {
 	uint64_t 	driver_feature;		/* driver features [rw] */

 	uint8_t		pci_id;			/* pci device id [r] */
-	uint32_t	vm_id;			/* vmm(4) vm identifier [r] */
 	int		irq;			/* assigned irq [r] */

 	/* Multi-process emulation fields. */
@@ -368,7 +367,8 @@ struct virtio_dev {
 	int sync_fd;				/* fd for synchronous channel */
 	int async_fd;				/* fd for async channel */

-	uint32_t	vm_vmid;		/* vmd(8) vm identifier [r] */
+	uint32_t	vm_id;			/* vmd(8) vm identifier [r] */
+	uint32_t	vmm_id;			/* vmm(4) vm identifier [r] */
 	pid_t		dev_pid;		/* pid of emulator process */
 	char		dev_type;		/* device type (as char) */
 	SLIST_ENTRY(virtio_dev) dev_next;
blob - b971c4688b4e47fc5bfe4ad8a26b1cdf2834a8af
blob + 58bafe332a92f318fec6e82289dd4205fb46b5bc
--- usr.sbin/vmd/vm.c
+++ usr.sbin/vmd/vm.c
@@ -44,7 +44,7 @@

 #define MMIO_NOTYET 0

-static int run_vm(struct vmop_create_params *, struct vcpu_reg_state *);
+static int run_vm(struct vmd_vm *, struct vcpu_reg_state *);
 static void vm_dispatch_vmm(int, short, void *);
 static void *event_thread(void *);
 static void *vcpu_run_loop(void *);
@@ -82,7 +82,6 @@ uint8_t vcpu_done[VMM_MAX_VCPUS_PER_VM];
 void
 vm_main(int fd, int fd_vmm)
 {
-	struct vm_create_params	*vcp = NULL;
 	struct vmd_vm		 vm;
 	size_t			 sz = 0;
 	int			 ret = 0;
@@ -118,9 +117,8 @@ vm_main(int fd, int fd_vmm)
 	}

 	/* Update process with the vm name. */
-	vcp = &vm.vm_params.vmc_params;
-	setproctitle("%s", vcp->vcp_name);
-	log_procinit("vm/%s", vcp->vcp_name);
+	setproctitle("%s", vm.vm_params.vmc_name);
+	log_procinit("vm/%s", vm.vm_params.vmc_name);

 	/* Receive the local prefix settings. */
 	sz = atomicio(read, fd, &env->vmd_cfg.cfg_localprefix,
@@ -135,11 +133,11 @@ vm_main(int fd, int fd_vmm)
 	 * kernel or a BIOS image.
 	 */
 	if (vm.vm_kernel == -1) {
-		log_warnx("%s: failed to receive boot fd", vcp->vcp_name);
+		log_warnx("failed to receive boot fd");
 		_exit(EINVAL);
 	}

-	if (vcp->vcp_sev && env->vmd_psp_fd < 0) {
+	if (vm.vm_params.vmc_sev && env->vmd_psp_fd < 0) {
 		log_warnx("%s not available", PSP_NODE);
 		_exit(EINVAL);
 	}
@@ -173,18 +171,15 @@ vm_main(int fd, int fd_vmm)
 int
 start_vm(struct vmd_vm *vm, int fd)
 {
-	struct vmop_create_params *vmc = &vm->vm_params;
-	struct vm_create_params	*vcp = &vmc->vmc_params;
 	struct vcpu_reg_state	 vrs;
-	int			 nicfds[VM_MAX_NICS_PER_VM];
-	int			 ret;
+	int			 ret, nicfds[VM_MAX_NICS_PER_VM];
 	size_t			 i;

 	/*
 	 * We first try to initialize and allocate memory before bothering
 	 * vmm(4) with a request to create a new vm.
 	 */
-	create_memory_map(vcp);
+	create_memory_map(vm);

 	/* Create the vm in vmm(4). */
 	ret = vmm_create_vm(vm);
@@ -201,8 +196,8 @@ start_vm(struct vmd_vm *vm, int fd)
 		}

 		/* Let the vmm process know we failed by sending a 0 vm id. */
-		vcp->vcp_id = 0;
-		atomicio(vwrite, fd, &vcp->vcp_id, sizeof(vcp->vcp_id));
+		vm->vm_vmmid = 0;
+		atomicio(vwrite, fd, &vm->vm_vmmid, sizeof(vm->vm_vmmid));
 		return (ret);
 	}

@@ -227,8 +222,8 @@ start_vm(struct vmd_vm *vm, int fd)
 	 * We now let the vmm process know we were successful by sending it our
 	 * vmm(4) assigned vm id.
 	 */
-	if (atomicio(vwrite, fd, &vcp->vcp_id, sizeof(vcp->vcp_id)) !=
-	    sizeof(vcp->vcp_id)) {
+	if (atomicio(vwrite, fd, &vm->vm_vmmid, sizeof(vm->vm_vmmid)) !=
+	    sizeof(vm->vm_vmmid)) {
 		log_warn("failed to send created vm id to vmm process");
 		return (1);
 	}
@@ -276,7 +271,7 @@ start_vm(struct vmd_vm *vm, int fd)
 	 */
 	for (i = 0; i < VMM_MAX_NICS_PER_VM; i++)
 		nicfds[i] = vm->vm_ifs[i].vif_fd;
-	ret = init_emulated_hw(vmc, vm->vm_cdrom, vm->vm_disks, nicfds);
+	ret = init_emulated_hw(vm, vm->vm_cdrom, vm->vm_disks, nicfds);
 	if (ret) {
 		virtio_shutdown(vm);
 		return (ret);
@@ -289,7 +284,7 @@ start_vm(struct vmd_vm *vm, int fd)
 	/*
 	 * Execute the vcpu run loop(s) for this VM.
 	 */
-	ret = run_vm(&vm->vm_params, &vrs);
+	ret = run_vm(vm, &vrs);

 	/* Shutdown SEV. */
 	if (sev_shutdown(vm))
@@ -383,14 +378,14 @@ vm_dispatch_vmm(int fd, short event, void *arg)
 		case IMSG_VMDOP_PRIV_GET_ADDR_RESPONSE:
 			vmop_addr_result_read(&imsg, &var);
 			log_debug("%s: received tap addr %s for nic %d",
-			    vm->vm_params.vmc_params.vcp_name,
+			    vm->vm_params.vmc_name,
 			    ether_ntoa((void *)var.var_addr), var.var_nic_idx);

 			vionet_set_hostmac(vm, var.var_nic_idx, var.var_addr);
 			break;
 		default:
 			fatalx("%s: got invalid imsg %d from %s", __func__,
-			    type, vm->vm_params.vmc_params.vcp_name);
+			    type, vm->vm_params.vmc_name);
 		}
 		imsg_free(&imsg);
 	}
@@ -440,7 +435,7 @@ pause_vm(struct vmd_vm *vm)
 	current_vm->vm_state |= VM_STATE_PAUSED;
 	mutex_unlock(&vm_mtx);

-	for (n = 0; n < vm->vm_params.vmc_params.vcp_ncpus; n++) {
+	for (n = 0; n < vm->vm_params.vmc_ncpus; n++) {
 		ret = pthread_cond_broadcast(&vcpu_run_cond[n]);
 		if (ret) {
 			log_warnx("%s: can't broadcast vcpu run cond (%d)",
@@ -472,7 +467,7 @@ unpause_vm(struct vmd_vm *vm)
 	current_vm->vm_state &= ~VM_STATE_PAUSED;
 	mutex_unlock(&vm_mtx);

-	for (n = 0; n < vm->vm_params.vmc_params.vcp_ncpus; n++) {
+	for (n = 0; n < vm->vm_params.vmc_ncpus; n++) {
 		ret = pthread_cond_broadcast(&vcpu_unpause_cond[n]);
 		if (ret) {
 			log_warnx("%s: can't broadcast vcpu unpause cond (%d)",
@@ -535,44 +530,54 @@ vcpu_reset(uint32_t vmid, uint32_t vcpu_id, struct vcp
 static int
 vmm_create_vm(struct vmd_vm *vm)
 {
-	struct vm_create_params *vcp = &vm->vm_params.vmc_params;
-	size_t i;
+	struct vm_create_params		 vcp;
+	struct vmop_create_params	*vmc = &vm->vm_params;
+	size_t				 i;

 	/* Sanity check arguments */
-	if (vcp->vcp_ncpus > VMM_MAX_VCPUS_PER_VM)
+	if (vmc->vmc_ncpus > VMM_MAX_VCPUS_PER_VM)
 		return (EINVAL);

-	if (vcp->vcp_nmemranges == 0 ||
-	    vcp->vcp_nmemranges > VMM_MAX_MEM_RANGES)
+	if (vmc->vmc_nmemranges == 0 ||
+	    vmc->vmc_nmemranges > VMM_MAX_MEM_RANGES)
 		return (EINVAL);

-	if (vm->vm_params.vmc_ndisks > VM_MAX_DISKS_PER_VM)
+	if (vmc->vmc_ndisks > VM_MAX_DISKS_PER_VM)
 		return (EINVAL);

-	if (vm->vm_params.vmc_nnics > VM_MAX_NICS_PER_VM)
+	if (vmc->vmc_nnics > VM_MAX_NICS_PER_VM)
 		return (EINVAL);

-	if (ioctl(env->vmd_fd, VMM_IOC_CREATE, vcp) == -1)
+	memset(&vcp, 0, sizeof(vcp));
+	vcp.vcp_nmemranges = vmc->vmc_nmemranges;
+	vcp.vcp_ncpus = vmc->vmc_ncpus;
+	memcpy(vcp.vcp_memranges, vmc->vmc_memranges,
+	    sizeof(vcp.vcp_memranges));
+	memcpy(vcp.vcp_name, vmc->vmc_name, sizeof(vcp.vcp_name));
+	vcp.vcp_sev = vmc->vmc_sev;
+	vcp.vcp_seves = vmc->vmc_seves;
+
+	if (ioctl(env->vmd_fd, VMM_IOC_CREATE, &vcp) == -1)
 		return (errno);

-	for (i = 0; i < vcp->vcp_ncpus; i++)
-		vm->vm_sev_asid[i] = vcp->vcp_asid[i];
+	vm->vm_vmmid = vcp.vcp_id;
+	for (i = 0; i < vcp.vcp_ncpus; i++)
+		vm->vm_sev_asid[i] = vcp.vcp_asid[i];
+	for (i = 0; i < vmc->vmc_nmemranges; i++)
+		vmc->vmc_memranges[i].vmr_va = vcp.vcp_memranges[i].vmr_va;
+	vm->vm_poscbit = vcp.vcp_poscbit;

 	return (0);
 }


-	/*
+/*
  * run_vm
  *
  * Runs the VM whose creation parameters are specified in vcp
  *
  * Parameters:
- *  child_cdrom: previously-opened child ISO disk file descriptor
- *  child_disks: previously-opened child VM disk file file descriptors
- *  child_taps: previously-opened child tap file descriptors
- *  vmc: vmop_create_params struct containing the VM's desired creation
- *      configuration
+ *  vm:  vm to begin emulating
  *  vrs: VCPU register state to initialize
  *
  * Return values:
@@ -580,9 +585,9 @@ vmm_create_vm(struct vmd_vm *vm)
  *  !0 : the VM exited abnormally or failed to start
  */
 static int
-run_vm(struct vmop_create_params *vmc, struct vcpu_reg_state *vrs)
+run_vm(struct vmd_vm *vm, struct vcpu_reg_state *vrs)
 {
-	struct vm_create_params *vcp = &vmc->vmc_params;
+	struct vmop_create_params *vmc;
 	uint8_t evdone = 0;
 	size_t i;
 	int ret;
@@ -591,32 +596,31 @@ run_vm(struct vmop_create_params *vmc, struct vcpu_reg
 	struct vm_run_params **vrp;
 	void *exit_status;

-	if (vcp == NULL)
-		return (EINVAL);
+	vmc = &vm->vm_params;

-	if (vcp->vcp_nmemranges == 0 ||
-	    vcp->vcp_nmemranges > VMM_MAX_MEM_RANGES)
+	if (vmc->vmc_nmemranges == 0 ||
+	    vmc->vmc_nmemranges > VMM_MAX_MEM_RANGES)
 		return (EINVAL);

-	tid = calloc(vcp->vcp_ncpus, sizeof(pthread_t));
+	tid = calloc(vmc->vmc_ncpus, sizeof(pthread_t));
 	if (tid == NULL) {
 		log_warn("failed to allocate pthread structures");
 		return (ENOMEM);
 	}
-	vrp = calloc(vcp->vcp_ncpus, sizeof(struct vm_run_params *));
+	vrp = calloc(vmc->vmc_ncpus, sizeof(struct vm_run_params *));
 	if (vrp == NULL) {
 		log_warn("failed to allocate vm run params array");
 		return (ENOMEM);
 	}

-	ret = pthread_barrier_init(&vm_pause_barrier, NULL, vcp->vcp_ncpus + 1);
+	ret = pthread_barrier_init(&vm_pause_barrier, NULL, vmc->vmc_ncpus + 1);
 	if (ret) {
 		log_warnx("cannot initialize pause barrier (%d)", ret);
 		return (ret);
 	}

 	log_debug("%s: starting %zu vcpu thread(s) for vm %s", __func__,
-	    vcp->vcp_ncpus, vcp->vcp_name);
+	    vmc->vmc_ncpus, vmc->vmc_name);

 	/*
 	 * Create and launch one thread for each VCPU. These threads may
@@ -624,7 +628,7 @@ run_vm(struct vmop_create_params *vmc, struct vcpu_reg
 	 * in such situations is detected and performed by vmm(4) in the
 	 * kernel.
 	 */
-	for (i = 0 ; i < vcp->vcp_ncpus; i++) {
+	for (i = 0 ; i < vmc->vmc_ncpus; i++) {
 		vrp[i] = malloc(sizeof(struct vm_run_params));
 		if (vrp[i] == NULL) {
 			log_warn("failed to allocate vm run parameters");
@@ -637,30 +641,30 @@ run_vm(struct vmop_create_params *vmc, struct vcpu_reg
 			/* caller will exit, so skip freeing */
 			return (ENOMEM);
 		}
-		vrp[i]->vrp_vm_id = vcp->vcp_id;
+		vrp[i]->vrp_vm_id = vm->vm_vmmid;
 		vrp[i]->vrp_vcpu_id = i;

-		if (vcpu_reset(vcp->vcp_id, i, vrs)) {
+		if (vcpu_reset(vm->vm_vmmid, i, vrs)) {
 			log_warnx("cannot reset vcpu %zu", i);
 			return (EIO);
 		}

-		if (sev_activate(current_vm, i)) {
+		if (sev_activate(vm, i)) {
 			log_warnx("SEV activatation failed for vcpu %zu", i);
 			return (EIO);
 		}

-		if (sev_encrypt_memory(current_vm)) {
+		if (sev_encrypt_memory(vm)) {
 			log_warnx("memory encryption failed for vcpu %zu", i);
 			return (EIO);
 		}

-		if (sev_encrypt_state(current_vm, i)) {
+		if (sev_encrypt_state(vm, i)) {
 			log_warnx("state encryption failed for vcpu %zu", i);
 			return (EIO);
 		}

-		if (sev_launch_finalize(current_vm)) {
+		if (sev_launch_finalize(vm)) {
 			log_warnx("encryption failed for vcpu %zu", i);
 			return (EIO);
 		}
@@ -705,7 +709,7 @@ run_vm(struct vmop_create_params *vmc, struct vcpu_reg
 		pthread_set_name_np(tid[i], tname);
 	}

-	log_debug("%s: waiting on events for VM %s", __func__, vcp->vcp_name);
+	log_debug("%s: waiting on events for VM %s", __func__, vmc->vmc_name);
 	ret = pthread_create(&evtid, NULL, event_thread, &evdone);
 	if (ret) {
 		errno = ret;
@@ -726,7 +730,7 @@ run_vm(struct vmop_create_params *vmc, struct vcpu_reg
 		 * Did a VCPU thread exit with an error? => return the first one
 		 */
 		mutex_lock(&vm_mtx);
-		for (i = 0; i < vcp->vcp_ncpus; i++) {
+		for (i = 0; i < vmc->vmc_ncpus; i++) {
 			if (vcpu_done[i] == 0)
 				continue;

@@ -747,19 +751,18 @@ run_vm(struct vmop_create_params *vmc, struct vcpu_reg
 				return (EIO);
 			}

-			log_warnx("vm %d event thread exited unexpectedly",
-			    vcp->vcp_id);
+			log_warnx("event thread exited unexpectedly");
 			return (EIO);
 		}

 		/* Did all VCPU threads exit successfully? => return */
 		mutex_lock(&vm_mtx);
-		for (i = 0; i < vcp->vcp_ncpus; i++) {
+		for (i = 0; i < vmc->vmc_ncpus; i++) {
 			if (vcpu_done[i] == 0)
 				break;
 		}
 		mutex_unlock(&vm_mtx);
-		if (i == vcp->vcp_ncpus)
+		if (i == vmc->vmc_ncpus)
 			break;

 		/* Some more threads to wait for, start over */
@@ -928,13 +931,13 @@ vcpu_run_loop(void *arg)
 }

 int
-vcpu_intr(uint32_t vm_id, uint32_t vcpu_id, uint8_t intr)
+vcpu_intr(uint32_t vmm_id, uint32_t vcpu_id, uint8_t intr)
 {
 	struct vm_intr_params vip;

 	memset(&vip, 0, sizeof(vip));

-	vip.vip_vm_id = vm_id;
+	vip.vip_vm_id = vmm_id;
 	vip.vip_vcpu_id = vcpu_id; /* XXX always 0? */
 	vip.vip_intr = intr;

@@ -1096,7 +1099,6 @@ int
 remap_guest_mem(struct vmd_vm *vm, int vmm_fd)
 {
 	size_t i;
-	struct vm_create_params	*vcp = &vm->vm_params.vmc_params;
 	struct vm_sharemem_params vsp;

 	if (vm == NULL)
@@ -1104,9 +1106,9 @@ remap_guest_mem(struct vmd_vm *vm, int vmm_fd)

 	/* Initialize using our original creation parameters. */
 	memset(&vsp, 0, sizeof(vsp));
-	vsp.vsp_nmemranges = vcp->vcp_nmemranges;
-	vsp.vsp_vm_id = vcp->vcp_id;
-	memcpy(&vsp.vsp_memranges, &vcp->vcp_memranges,
+	vsp.vsp_nmemranges = vm->vm_params.vmc_nmemranges;
+	vsp.vsp_vm_id = vm->vm_vmmid;
+	memcpy(&vsp.vsp_memranges, &vm->vm_params.vmc_memranges,
 	    sizeof(vsp.vsp_memranges));

 	/* Ask vmm(4) to enter a shared mapping to guest memory. */
@@ -1115,7 +1117,7 @@ remap_guest_mem(struct vmd_vm *vm, int vmm_fd)

 	/* Update with the location of the new mappings. */
 	for (i = 0; i < vsp.vsp_nmemranges; i++)
-		vcp->vcp_memranges[i].vmr_va = vsp.vsp_va[i];
+		vm->vm_params.vmc_memranges[i].vmr_va = vsp.vsp_va[i];

 	return (0);
 }
blob - 13b7ccf9ef324f6e99f85974d6e51024b8fee28d
blob + 9b6f58ded8cd0c8c41f993255f677cde2094e771
--- usr.sbin/vmd/vm_agentx.c
+++ usr.sbin/vmd/vm_agentx.c
@@ -183,14 +183,14 @@ vm_agentx_dispatch_parent(int fd, struct privsep_proc
 			    vmIndex);
 			rtype = agentx_varbind_request(vminfo[i]);
 			for (j = 0; j < nvir; j++) {
-				if (vir[j].vir_info.vir_id < index)
+				if (vir[j].vir_id < index)
 					continue;
-				if (vir[j].vir_info.vir_id == index &&
+				if (vir[j].vir_id == index &&
 				    (rtype == AGENTX_REQUEST_TYPE_GET ||
 				    rtype ==
 				    AGENTX_REQUEST_TYPE_GETNEXTINCLUSIVE))
 					break;
-				if (vir[j].vir_info.vir_id > index &&
+				if (vir[j].vir_id > index &&
 				    (rtype == AGENTX_REQUEST_TYPE_GETNEXT ||
 				    rtype ==
 				    AGENTX_REQUEST_TYPE_GETNEXTINCLUSIVE))
@@ -202,10 +202,10 @@ vm_agentx_dispatch_parent(int fd, struct privsep_proc
 			}
 			mvir = &(vir[j]);
 			agentx_varbind_set_index_integer(vminfo[i], vmIndex,
-			    mvir->vir_info.vir_id);
+			    mvir->vir_id);
 			if (reqObject == vmName)
 				agentx_varbind_string(vminfo[i],
-				    mvir->vir_info.vir_name);
+				    mvir->vir_name);
 			else if (reqObject == vmUUID)
 				agentx_varbind_string(vminfo[i], "");
 			else if (reqObject == vmOSType)
@@ -228,17 +228,17 @@ vm_agentx_dispatch_parent(int fd, struct privsep_proc
 			    reqObject == vmMinCpuNumber ||
 			    reqObject == vmMaxCpuNumber)
 				agentx_varbind_integer(vminfo[i],
-				    mvir->vir_info.vir_ncpus);
+				    mvir->vir_ncpus);
 			else if (reqObject == vmMemUnit)
 				agentx_varbind_integer(vminfo[i], MEM_SCALE);
 			else if (reqObject == vmCurMem)
 				agentx_varbind_integer(vminfo[i],
-				    mvir->vir_info.vir_used_size / MEM_SCALE);
+				    mvir->vir_used_size / MEM_SCALE);
 			else if (reqObject == vmMinMem)
 				agentx_varbind_integer(vminfo[i], -1);
 			else if (reqObject == vmMaxMem)
 				agentx_varbind_integer(vminfo[i],
-				    mvir->vir_info.vir_memory_size / MEM_SCALE);
+				    mvir->vir_memory_size / MEM_SCALE);
 /* We probably had a reload */
 			else
 				agentx_varbind_notfound(vminfo[i]);
@@ -433,8 +433,7 @@ vm_agentx_sortvir(const void *c1, const void *c2)
 {
 	const struct vmop_info_result *v1 = c1, *v2 = c2;

-	return (v1->vir_info.vir_id < v2->vir_info.vir_id ? -1 :
-	    v1->vir_info.vir_id > v2->vir_info.vir_id);
+	return (v1->vir_id < v2->vir_id ? -1 : v1->vir_id > v2->vir_id);
 }

 static int
blob - f69738bbe98955b73c542519f0d822d527101a26
blob + de3cfa7cf57999ad863e939dd93fb73138ed6a89
--- usr.sbin/vmd/vmd.c
+++ usr.sbin/vmd/vmd.c
@@ -283,8 +283,7 @@ vmd_dispatch_vmm(int fd, struct privsep_proc *p, struc
 {
 	struct vmop_result	 vmr;
 	struct privsep		*ps = p->p_ps;
-	struct vmd_vm		*vm;
-	struct vm_create_params	*vcp;
+	struct vmd_vm		*vm = NULL;
 	struct vmop_info_result	 vir;
 	uint32_t		 peer_id, type;

@@ -299,7 +298,7 @@ vmd_dispatch_vmm(int fd, struct privsep_proc *p, struc
 		proc_compose_imsg(ps, PROC_CONTROL, type, vm->vm_peerid, -1,
 		    &vmr, sizeof(vmr));
 		log_info("%s: paused vm %d successfully",
-		    vm->vm_params.vmc_params.vcp_name, vm->vm_vmid);
+		    vm->vm_params.vmc_name, vm->vm_vmid);
 		vm->vm_state |= VM_STATE_PAUSED;
 		break;
 	case IMSG_VMDOP_UNPAUSE_VM_RESPONSE:
@@ -309,7 +308,7 @@ vmd_dispatch_vmm(int fd, struct privsep_proc *p, struc
 		proc_compose_imsg(ps, PROC_CONTROL, type, vm->vm_peerid, -1,
 		    &vmr, sizeof(vmr));
 		log_info("%s: unpaused vm %d successfully.",
-		    vm->vm_params.vmc_params.vcp_name, vm->vm_vmid);
+		    vm->vm_params.vmc_name, vm->vm_vmid);
 		vm->vm_state &= ~VM_STATE_PAUSED;
 		break;
 	case IMSG_VMDOP_START_VM_RESPONSE:
@@ -317,8 +316,7 @@ vmd_dispatch_vmm(int fd, struct privsep_proc *p, struc
 		if ((vm = vm_getbyvmid(vmr.vmr_id)) == NULL)
 			break;
 		vm->vm_pid = vmr.vmr_pid;
-		vcp = &vm->vm_params.vmc_params;
-		vcp->vcp_id = vmr.vmr_id;
+		vm->vm_vmmid = vmr.vmr_id;

 		/*
 		 * If the peerid is not -1, forward the response back to the
@@ -332,14 +330,15 @@ vmd_dispatch_vmm(int fd, struct privsep_proc *p, struc
 			    vm->vm_peerid, -1, &vmr, sizeof(vmr)) == -1) {
 				errno = vmr.vmr_result;
 				log_warn("%s: failed to forward vm result",
-				    vcp->vcp_name);
+				    vm->vm_params.vmc_name);
 				vm_terminate(vm, __func__);
 				return (-1);
 			}
 		}

 		if (vmr.vmr_result) {
-			log_warnx("%s: failed to start vm", vcp->vcp_name);
+			log_warnx("%s: failed to start vm",
+			    vm->vm_params.vmc_name);
 			vm_terminate(vm, __func__);
 			errno = vmr.vmr_result;
 			break;
@@ -347,13 +346,14 @@ vmd_dispatch_vmm(int fd, struct privsep_proc *p, struc

 		/* Now configure all the interfaces */
 		if (vm_priv_ifconfig(ps, vm) == -1) {
-			log_warn("%s: failed to configure vm", vcp->vcp_name);
+			log_warn("%s: failed to configure vm",
+			    vm->vm_params.vmc_name);
 			vm_terminate(vm, __func__);
 			break;
 		}

 		log_info("started %s (vm %d) successfully, tty %s",
-		    vcp->vcp_name, vm->vm_vmid, vm->vm_ttyname);
+		    vm->vm_params.vmc_name, vm->vm_vmid, vm->vm_ttyname);
 		break;
 	case IMSG_VMDOP_TERMINATE_VM_RESPONSE:
 		vmop_result_read(imsg, &vmr);
@@ -397,7 +397,7 @@ vmd_dispatch_vmm(int fd, struct privsep_proc *p, struc
 		break;
 	case IMSG_VMDOP_GET_INFO_VM_DATA:
 		vmop_info_result_read(imsg, &vir);
-		if ((vm = vm_getbyvmid(vir.vir_info.vir_id)) != NULL) {
+		if ((vm = vm_getbyvmid(vir.vir_id)) != NULL) {
 			memset(vir.vir_ttyname, 0, sizeof(vir.vir_ttyname));
 			if (vm->vm_ttyname[0] != '\0')
 				strlcpy(vir.vir_ttyname, vm->vm_ttyname,
@@ -426,15 +426,12 @@ vmd_dispatch_vmm(int fd, struct privsep_proc *p, struc
 		TAILQ_FOREACH(vm, env->vmd_vms, vm_entry) {
 			if (!(vm->vm_state & VM_STATE_RUNNING)) {
 				memset(&vir, 0, sizeof(vir));
-				vir.vir_info.vir_id = vm->vm_vmid;
-				strlcpy(vir.vir_info.vir_name,
-				    vm->vm_params.vmc_params.vcp_name,
-				    VMM_MAX_NAME_LEN);
-				vir.vir_info.vir_memory_size =
-				    vm->vm_params.vmc_params.
-				    vcp_memranges[0].vmr_size;
-				vir.vir_info.vir_ncpus =
-				    vm->vm_params.vmc_params.vcp_ncpus;
+				vir.vir_id = vm->vm_vmid;
+				strlcpy(vir.vir_name, vm->vm_params.vmc_name,
+				    sizeof(vir.vir_name));
+				vir.vir_memory_size =
+				    vm->vm_params.vmc_memranges[0].vmr_size;
+				vir.vir_ncpus = vm->vm_params.vmc_ncpus;
 				/* get the configured user id for this vm */
 				vir.vir_uid = vm->vm_params.vmc_owner.uid;
 				vir.vir_gid = vm->vm_params.vmc_owner.gid;
@@ -748,8 +745,7 @@ start_vm_batch(int fd, short type, void *args)
 	TAILQ_FOREACH(vm, env->vmd_vms, vm_entry) {
 		if (!(vm->vm_state & VM_STATE_WAITING)) {
 			log_debug("%s: not starting vm %s (disabled)",
-			    __func__,
-			    vm->vm_params.vmc_params.vcp_name);
+			    __func__, vm->vm_params.vmc_name);
 			continue;
 		}
 		i++;
@@ -944,13 +940,14 @@ vm_getbyvmid(uint32_t vmid)
 	if (vmid == 0)
 		return (NULL);
 	TAILQ_FOREACH(vm, env->vmd_vms, vm_entry) {
-		if (vm->vm_vmid == vmid)
+		if (vm->vm_vmid == vmid)	// XXX check this
 			return (vm);
 	}

 	return (NULL);
 }

+/* Find a vm in the list by it's vmm(4) id. */
 struct vmd_vm *
 vm_getbyid(uint32_t id)
 {
@@ -959,13 +956,14 @@ vm_getbyid(uint32_t id)
 	if (id == 0)
 		return (NULL);
 	TAILQ_FOREACH(vm, env->vmd_vms, vm_entry) {
-		if (vm->vm_params.vmc_params.vcp_id == id)
+		if (vm->vm_vmmid == id)	// XXX check this
 			return (vm);
 	}

 	return (NULL);
 }

+/* Translate a kernel/vmm(4) vm id to a vmd(8) id. */
 uint32_t
 vm_id2vmid(uint32_t id, struct vmd_vm *vm)
 {
@@ -981,9 +979,8 @@ vm_vmid2id(uint32_t vmid, struct vmd_vm *vm)
 {
 	if (vm == NULL && (vm = vm_getbyvmid(vmid)) == NULL)
 		return (0);
-	DPRINTF("%s: vmid %u is vmm id %u", __func__,
-	    vmid, vm->vm_params.vmc_params.vcp_id);
-	return (vm->vm_params.vmc_params.vcp_id);
+	DPRINTF("%s: vmid %u is vmm id %u", __func__, vmid, vm->vm_vmmid);
+	return (vm->vm_vmmid);
 }

 struct vmd_vm *
@@ -994,7 +991,7 @@ vm_getbyname(const char *name)
 	if (name == NULL)
 		return (NULL);
 	TAILQ_FOREACH(vm, env->vmd_vms, vm_entry) {
-		if (strcmp(vm->vm_params.vmc_params.vcp_name, name) == 0)
+		if (strcmp(vm->vm_params.vmc_name, name) == 0)
 			return (vm);
 	}

@@ -1123,7 +1120,6 @@ vm_register(struct privsep *ps, struct vmop_create_par
     struct vmd_vm **ret_vm, uint32_t id, uid_t uid)
 {
 	struct vmd_vm		*vm = NULL, *vm_parent = NULL;
-	struct vm_create_params	*vcp = &vmc->vmc_params;
 	struct vmop_owner	*vmo = NULL;
 	uint32_t		 nid, rng;
 	unsigned int		 i, j;
@@ -1140,8 +1136,8 @@ vm_register(struct privsep *ps, struct vmop_create_par
 	errno = 0;
 	*ret_vm = NULL;

-	if ((vm = vm_getbyname(vcp->vcp_name)) != NULL ||
-	    (vm = vm_getbyvmid(vcp->vcp_id)) != NULL) {
+	if ((vm = vm_getbyname(vmc->vmc_name)) != NULL ||
+	    (vm = vm_getbyvmid(vmc->vmc_id)) != NULL) {
 		if (vm_checkperm(vm, &vm->vm_params.vmc_owner,
 		    uid) != 0) {
 			errno = EPERM;
@@ -1167,11 +1163,11 @@ vm_register(struct privsep *ps, struct vmop_create_par
 		errno = VMD_DISK_MISSING;
 		goto fail;
 	}
-	if (vcp->vcp_ncpus == 0)
-		vcp->vcp_ncpus = 1;
-	if (vcp->vcp_memranges[0].vmr_size == 0)
-		vcp->vcp_memranges[0].vmr_size = VM_DEFAULT_MEMORY;
-	if (vcp->vcp_ncpus > VMM_MAX_VCPUS_PER_VM) {
+	if (vmc->vmc_ncpus == 0)
+		vmc->vmc_ncpus = 1;
+	if (vmc->vmc_memranges[0].vmr_size == 0)
+		vmc->vmc_memranges[0].vmr_size = VM_DEFAULT_MEMORY;
+	if (vmc->vmc_ncpus > VMM_MAX_VCPUS_PER_VM) {
 		log_warnx("invalid number of CPUs");
 		goto fail;
 	} else if (vmc->vmc_ndisks > VM_MAX_DISKS_PER_VM) {
@@ -1184,15 +1180,15 @@ vm_register(struct privsep *ps, struct vmop_create_par
 	    && strlen(vmc->vmc_cdrom) == 0) {
 		log_warnx("no kernel or disk/cdrom specified");
 		goto fail;
-	} else if (strlen(vcp->vcp_name) == 0) {
+	} else if (strlen(vmc->vmc_name) == 0) {
 		log_warnx("invalid VM name");
 		goto fail;
-	} else if (*vcp->vcp_name == '-' || *vcp->vcp_name == '.' ||
-	    *vcp->vcp_name == '_') {
+	} else if (*vmc->vmc_name == '-' || *vmc->vmc_name == '.' ||
+	    *vmc->vmc_name == '_') {
 		log_warnx("invalid VM name");
 		goto fail;
 	} else {
-		for (s = vcp->vcp_name; *s != '\0'; ++s) {
+		for (s = vmc->vmc_name; *s != '\0'; ++s) {
 			if (!(isalnum((unsigned char)*s) || *s == '.' || \
 			    *s == '-' || *s == '_')) {
 				log_warnx("invalid VM name");
@@ -1206,7 +1202,6 @@ vm_register(struct privsep *ps, struct vmop_create_par

 	memcpy(&vm->vm_params, vmc, sizeof(vm->vm_params));
 	vmc = &vm->vm_params;
-	vcp = &vmc->vmc_params;
 	vm->vm_pid = -1;
 	vm->vm_tty = -1;
 	vm->vm_kernel = -1;
@@ -1252,7 +1247,7 @@ vm_register(struct privsep *ps, struct vmop_create_par
 	 */
 	if (id != 0)
 		vm->vm_vmid = id;
-	else if (vm_claimid(vcp->vcp_name, uid, &nid) == -1)
+	else if (vm_claimid(vmc->vmc_name, uid, &nid) == -1)
 		goto fail;
 	else
 		vm->vm_vmid = nid;
@@ -1272,69 +1267,63 @@ int
 vm_instance(struct privsep *ps, struct vmd_vm **vm_parent,
     struct vmop_create_params *vmc, uid_t uid)
 {
-	char			*name;
-	struct vm_create_params	*vcp = &vmc->vmc_params;
-	struct vmop_create_params *vmcp;
-	struct vm_create_params	*vcpp;
-	unsigned int		 i, j;
+	char				*name;
+	struct vmop_create_params	*vmc_parent;
+	unsigned int			 i, j;

 	/* return without error if the parent is NULL (nothing to inherit) */
 	if ((vmc->vmc_flags & VMOP_CREATE_INSTANCE) == 0 ||
 	    vmc->vmc_instance[0] == '\0')
 		return (0);

-	if ((*vm_parent = vm_getbyname(vmc->vmc_instance)) == NULL) {
+	if ((*vm_parent = vm_getbyname(vmc->vmc_instance)) == NULL)
 		return (VMD_PARENT_INVALID);
-	}

-	vmcp = &(*vm_parent)->vm_params;
-	vcpp = &vmcp->vmc_params;
+	vmc_parent = &(*vm_parent)->vm_params;

 	/* Are we allowed to create an instance from this VM? */
-	if (vm_checkperm(NULL, &vmcp->vmc_insowner, uid) != 0) {
+	if (vm_checkperm(NULL, &vmc_parent->vmc_insowner, uid) != 0) {
 		log_warnx("vm \"%s\" no permission to create vm instance",
-		    vcpp->vcp_name);
+		    vmc->vmc_name);
 		return (ENAMETOOLONG);
 	}

-	name = vcp->vcp_name;
+	name = vmc->vmc_name;

-	if (vm_getbyname(vcp->vcp_name) != NULL ||
-	    vm_getbyvmid(vcp->vcp_id) != NULL) {
+	if (vm_getbyname(name) != NULL || vm_getbyvmid(vmc->vmc_id) != NULL)
 		return (EPROCLIM);
-	}

 	/* CPU */
-	if (vcp->vcp_ncpus == 0)
-		vcp->vcp_ncpus = vcpp->vcp_ncpus;
-	if (vm_checkinsflag(vmcp, VMOP_CREATE_CPU, uid) != 0 &&
-	    vcp->vcp_ncpus != vcpp->vcp_ncpus) {
+	if (vmc->vmc_ncpus == 0)
+		vmc->vmc_ncpus = vmc_parent->vmc_ncpus;
+	if (vm_checkinsflag(vmc_parent, VMOP_CREATE_CPU, uid) != 0 &&
+	    vmc->vmc_ncpus != vmc_parent->vmc_ncpus) {
 		log_warnx("vm \"%s\" no permission to set cpus", name);
 		return (EPERM);
 	}

 	/* memory */
-	if (vcp->vcp_memranges[0].vmr_size == 0)
-		vcp->vcp_memranges[0].vmr_size =
-		    vcpp->vcp_memranges[0].vmr_size;
-	if (vm_checkinsflag(vmcp, VMOP_CREATE_MEMORY, uid) != 0 &&
-	    vcp->vcp_memranges[0].vmr_size !=
-	    vcpp->vcp_memranges[0].vmr_size) {
+	if (vmc->vmc_memranges[0].vmr_size == 0)
+		vmc->vmc_memranges[0].vmr_size =
+		    vmc_parent->vmc_memranges[0].vmr_size;
+	if (vm_checkinsflag(vmc_parent, VMOP_CREATE_MEMORY, uid) != 0 &&
+	    vmc->vmc_memranges[0].vmr_size !=
+	    vmc_parent->vmc_memranges[0].vmr_size) {
 		log_warnx("vm \"%s\" no permission to set memory", name);
 		return (EPERM);
 	}

 	/* disks cannot be inherited */
-	if (vm_checkinsflag(vmcp, VMOP_CREATE_DISK, uid) != 0 &&
+	if (vm_checkinsflag(vmc_parent, VMOP_CREATE_DISK, uid) != 0 &&
 	    vmc->vmc_ndisks) {
 		log_warnx("vm \"%s\" no permission to set disks", name);
 		return (EPERM);
 	}
 	for (i = 0; i < vmc->vmc_ndisks; i++) {
 		/* Check if this disk is already used in the parent */
-		for (j = 0; j < vmcp->vmc_ndisks; j++) {
+		for (j = 0; j < vmc_parent->vmc_ndisks; j++) {
 			if (strcmp(vmc->vmc_disks[i],
-			    vmcp->vmc_disks[j]) == 0) {
+			    vmc_parent->vmc_disks[j]) == 0) {
 				log_warnx("vm \"%s\" disk %s cannot be reused",
 				    name, vmc->vmc_disks[i]);
 				return (EBUSY);
@@ -1345,34 +1334,34 @@ vm_instance(struct privsep *ps, struct vmd_vm **vm_par

 	/* interfaces */
 	if (vmc->vmc_nnics > 0 &&
-	    vm_checkinsflag(vmcp, VMOP_CREATE_NETWORK, uid) != 0 &&
-	    vmc->vmc_nnics != vmcp->vmc_nnics) {
+	    vm_checkinsflag(vmc_parent, VMOP_CREATE_NETWORK, uid) != 0 &&
+	    vmc->vmc_nnics != vmc_parent->vmc_nnics) {
 		log_warnx("vm \"%s\" no permission to set interfaces", name);
 		return (EPERM);
 	}
-	for (i = 0; i < vmcp->vmc_nnics; i++) {
+	for (i = 0; i < vmc_parent->vmc_nnics; i++) {
 		/* Interface got overwritten */
 		if (i < vmc->vmc_nnics)
 			continue;

 		/* Copy interface from parent */
-		vmc->vmc_ifflags[i] = vmcp->vmc_ifflags[i];
-		(void)strlcpy(vmc->vmc_ifnames[i], vmcp->vmc_ifnames[i],
+		vmc->vmc_ifflags[i] = vmc_parent->vmc_ifflags[i];
+		(void)strlcpy(vmc->vmc_ifnames[i], vmc_parent->vmc_ifnames[i],
 		    sizeof(vmc->vmc_ifnames[i]));
-		(void)strlcpy(vmc->vmc_ifswitch[i], vmcp->vmc_ifswitch[i],
+		(void)strlcpy(vmc->vmc_ifswitch[i], vmc_parent->vmc_ifswitch[i],
 		    sizeof(vmc->vmc_ifswitch[i]));
-		(void)strlcpy(vmc->vmc_ifgroup[i], vmcp->vmc_ifgroup[i],
+		(void)strlcpy(vmc->vmc_ifgroup[i], vmc_parent->vmc_ifgroup[i],
 		    sizeof(vmc->vmc_ifgroup[i]));
-		memcpy(vmc->vmc_macs[i], vmcp->vmc_macs[i],
+		memcpy(vmc->vmc_macs[i], vmc_parent->vmc_macs[i],
 		    sizeof(vmc->vmc_macs[i]));
-		vmc->vmc_ifrdomain[i] = vmcp->vmc_ifrdomain[i];
+		vmc->vmc_ifrdomain[i] = vmc_parent->vmc_ifrdomain[i];
 		vmc->vmc_nnics++;
 	}
 	for (i = 0; i < vmc->vmc_nnics; i++) {
-		for (j = 0; j < vmcp->vmc_nnics; j++) {
+		for (j = 0; j < vmc_parent->vmc_nnics; j++) {
 			if (memcmp(zero_mac, vmc->vmc_macs[i],
 			    sizeof(vmc->vmc_macs[i])) != 0 &&
-			    memcmp(vmcp->vmc_macs[i], vmc->vmc_macs[i],
+			    memcmp(vmc_parent->vmc_macs[i], vmc->vmc_macs[i],
 			    sizeof(vmc->vmc_macs[i])) != 0) {
 				log_warnx("vm \"%s\" lladdr cannot be reused",
 				    name);
@@ -1380,7 +1369,7 @@ vm_instance(struct privsep *ps, struct vmd_vm **vm_par
 			}
 			if (strlen(vmc->vmc_ifnames[i]) &&
 			    strcmp(vmc->vmc_ifnames[i],
-			    vmcp->vmc_ifnames[j]) == 0) {
+			    vmc_parent->vmc_ifnames[j]) == 0) {
 				log_warnx("vm \"%s\" %s cannot be reused",
 				    vmc->vmc_ifnames[i], name);
 				return (EBUSY);
@@ -1391,7 +1380,7 @@ vm_instance(struct privsep *ps, struct vmd_vm **vm_par
 	/* kernel */
 	if (vmc->vmc_kernel > -1 || ((*vm_parent)->vm_kernel_path != NULL &&
 		strnlen((*vm_parent)->vm_kernel_path, PATH_MAX) < PATH_MAX)) {
-		if (vm_checkinsflag(vmcp, VMOP_CREATE_KERNEL, uid) != 0) {
+		if (vm_checkinsflag(vmc_parent, VMOP_CREATE_KERNEL, uid) != 0) {
 			log_warnx("vm \"%s\" no permission to set boot image",
 			    name);
 			return (EPERM);
@@ -1401,12 +1390,12 @@ vm_instance(struct privsep *ps, struct vmd_vm **vm_par

 	/* cdrom */
 	if (strlen(vmc->vmc_cdrom) > 0) {
-		if (vm_checkinsflag(vmcp, VMOP_CREATE_CDROM, uid) != 0) {
+		if (vm_checkinsflag(vmc_parent, VMOP_CREATE_CDROM, uid) != 0) {
 			log_warnx("vm \"%s\" no permission to set cdrom", name);
 			return (EPERM);
 		}
 		vmc->vmc_checkaccess |= VMOP_CREATE_CDROM;
-	} else if (strlcpy(vmc->vmc_cdrom, vmcp->vmc_cdrom,
+	} else if (strlcpy(vmc->vmc_cdrom, vmc_parent->vmc_cdrom,
 	    sizeof(vmc->vmc_cdrom)) >= sizeof(vmc->vmc_cdrom)) {
 		log_warnx("vm \"%s\" cdrom name too long", name);
 		return (EINVAL);
@@ -1414,17 +1403,17 @@ vm_instance(struct privsep *ps, struct vmd_vm **vm_par

 	/* user */
 	if (vmc->vmc_owner.uid == 0)
-		vmc->vmc_owner.uid = vmcp->vmc_owner.uid;
+		vmc->vmc_owner.uid = vmc_parent->vmc_owner.uid;
 	else if (vmc->vmc_owner.uid != uid &&
-	    vmc->vmc_owner.uid != vmcp->vmc_owner.uid) {
+	    vmc->vmc_owner.uid != vmc_parent->vmc_owner.uid) {
 		log_warnx("vm \"%s\" user mismatch", name);
 		return (EPERM);
 	}

 	/* group */
 	if (vmc->vmc_owner.gid == 0)
-		vmc->vmc_owner.gid = vmcp->vmc_owner.gid;
-	else if (vmc->vmc_owner.gid != vmcp->vmc_owner.gid) {
+		vmc->vmc_owner.gid = vmc_parent->vmc_owner.gid;
+	else if (vmc->vmc_owner.gid != vmc_parent->vmc_owner.gid) {
 		log_warnx("vm \"%s\" group mismatch", name);
 		return (EPERM);
 	}
@@ -1434,10 +1423,10 @@ vm_instance(struct privsep *ps, struct vmd_vm **vm_par
 		log_warnx("vm \"%s\" cannot change instance permissions", name);
 		return (EPERM);
 	}
-	if (vmcp->vmc_insflags & VMOP_CREATE_INSTANCE) {
-		vmc->vmc_insowner.gid = vmcp->vmc_insowner.gid;
-		vmc->vmc_insowner.uid = vmcp->vmc_insowner.gid;
-		vmc->vmc_insflags = vmcp->vmc_insflags;
+	if (vmc_parent->vmc_insflags & VMOP_CREATE_INSTANCE) {
+		vmc->vmc_insowner.gid = vmc_parent->vmc_insowner.gid;
+		vmc->vmc_insowner.uid = vmc_parent->vmc_insowner.gid;
+		vmc->vmc_insflags = vmc_parent->vmc_insflags;
 	} else {
 		vmc->vmc_insowner.gid = 0;
 		vmc->vmc_insowner.uid = 0;
@@ -1647,9 +1636,8 @@ vm_opentty(struct vmd_vm *vm)
 		gid = 0;
 	}

-	log_debug("%s: vm %s tty %s uid %d gid %d mode %o",
-	    __func__, vm->vm_params.vmc_params.vcp_name,
-	    vm->vm_ttyname, uid, gid, mode);
+	log_debug("%s: vm %s tty %s uid %d gid %d mode %o", __func__,
+	    vm->vm_params.vmc_name, vm->vm_ttyname, uid, gid, mode);

 	/*
 	 * Change ownership and mode of the tty as required.
@@ -1825,14 +1813,10 @@ vmop_result_read(struct imsg *imsg, struct vmop_result
 void
 vmop_info_result_read(struct imsg *imsg, struct vmop_info_result *vir)
 {
-	struct vm_info_result *r;
-
 	if (imsg_get_data(imsg, vir, sizeof(*vir)))
 		fatal("%s", __func__);

-	r = &vir->vir_info;
-	r->vir_name[sizeof(r->vir_name) - 1] = '\0';
-
+	vir->vir_name[sizeof(vir->vir_name) - 1] = '\0';
 	vir->vir_ttyname[sizeof(vir->vir_ttyname) - 1] = '\0';
 }

@@ -1879,14 +1863,12 @@ vmop_owner_read(struct imsg *imsg, struct vmop_owner *
 void
 vmop_create_params_read(struct imsg *imsg, struct vmop_create_params *vmc)
 {
-	struct vm_create_params *vcp;
 	size_t i, n;

 	if (imsg_get_data(imsg, vmc, sizeof(*vmc)))
 		fatal("%s", __func__);

-	vcp = &vmc->vmc_params;
-	vcp->vcp_name[sizeof(vcp->vcp_name) - 1] = '\0';
+	vmc->vmc_name[sizeof(vmc->vmc_name) - 1] = '\0';

 	n = sizeof(vmc->vmc_disks) / sizeof(vmc->vmc_disks[0]);
 	for (i = 0; i < n; i++)
blob - f0f5a9bccf9fc12a2ebb55c4fe31efd0a00f8105
blob + 37bdefb911c61464e11f6119ea2519ef777b1a8e
--- usr.sbin/vmd/vmd.h
+++ usr.sbin/vmd/vmd.h
@@ -159,7 +159,14 @@ struct vmop_result {
 };

 struct vmop_info_result {
-	struct vm_info_result	 vir_info;
+	size_t			 vir_memory_size;
+	size_t			 vir_used_size;
+	size_t			 vir_ncpus;
+	uint8_t			 vir_vcpu_state[VMM_MAX_VCPUS_PER_VM];
+	pid_t			 vir_creator_pid;
+	uint32_t		 vir_id;
+	char			 vir_name[VMM_MAX_NAME_LEN];
+
 	char			 vir_ttyname[VM_TTYNAME_MAX];
 	uid_t			 vir_uid;
 	int64_t			 vir_gid;
@@ -200,7 +207,11 @@ struct vmop_owner {
 };

 struct vmop_create_params {
-	struct vm_create_params	 vmc_params;
+	/* vm identifying information */
+	uint32_t		 vmc_id;
+	char			 vmc_name[VMM_MAX_NAME_LEN];
+	struct vmop_owner	 vmc_owner;
+
 	unsigned int		 vmc_flags;
 #define VMOP_CREATE_CPU		0x01
 #define VMOP_CREATE_KERNEL	0x02
@@ -209,42 +220,53 @@ struct vmop_create_params {
 #define VMOP_CREATE_DISK	0x10
 #define VMOP_CREATE_CDROM	0x20
 #define VMOP_CREATE_INSTANCE	0x40
-
-	/* same flags; check for access to these resources */
+	/* same flags as vmc_flags; check for access to these resources */
 	unsigned int		 vmc_checkaccess;

-	/* userland-only part of the create params */
+	/* vcpu count and features */
+	size_t			 vmc_ncpus;
+	uint32_t		 vmc_asid[VMM_MAX_VCPUS];
+
+	/* AMD SEV support */
+	uint32_t		 vmc_poscbit;
+	int			 vmc_sev;
+	int			 vmc_seves;
+
+	/* guest memory */
+	size_t			 vmc_nmemranges;
+	struct vm_mem_range	 vmc_memranges[VMM_MAX_MEM_RANGES];
+
+	/* Boot device and firmware */
+	int			 vmc_kernel;
 	unsigned int		 vmc_bootdevice;
 #define VMBOOTDEV_AUTO		0
 #define VMBOOTDEV_DISK		1
 #define VMBOOTDEV_CDROM		2
 #define VMBOOTDEV_NET		3
-	unsigned int		 vmc_ifflags[VM_MAX_NICS_PER_VM];
-#define VMIFF_UP		0x01
-#define VMIFF_LOCKED		0x02
-#define VMIFF_LOCAL		0x04
-#define VMIFF_RDOMAIN		0x08
-#define VMIFF_OPTMASK		(VMIFF_LOCKED|VMIFF_LOCAL|VMIFF_RDOMAIN)

+	/* Emulated disk and cdrom drives */
 	size_t			 vmc_ndisks;
 	char			 vmc_disks[VM_MAX_DISKS_PER_VM][PATH_MAX];
 	unsigned int		 vmc_disktypes[VM_MAX_DISKS_PER_VM];
 	unsigned int		 vmc_diskbases[VM_MAX_DISKS_PER_VM];
 #define VMDF_RAW		0x01
 #define VMDF_QCOW2		0x02
-
 	char			 vmc_cdrom[PATH_MAX];
-	int			 vmc_kernel;

+	/* Emulated network devices */
 	size_t			 vmc_nnics;
 	char			 vmc_ifnames[VM_MAX_NICS_PER_VM][IF_NAMESIZE];
 	char			 vmc_ifswitch[VM_MAX_NICS_PER_VM][VM_NAME_MAX];
 	char			 vmc_ifgroup[VM_MAX_NICS_PER_VM][IF_NAMESIZE];
 	unsigned int		 vmc_ifrdomain[VM_MAX_NICS_PER_VM];
 	uint8_t			 vmc_macs[VM_MAX_NICS_PER_VM][6];
+	unsigned int		 vmc_ifflags[VM_MAX_NICS_PER_VM];
+#define VMIFF_UP		0x01
+#define VMIFF_LOCKED		0x02
+#define VMIFF_LOCAL		0x04
+#define VMIFF_RDOMAIN		0x08
+#define VMIFF_OPTMASK		(VMIFF_LOCKED|VMIFF_LOCAL|VMIFF_RDOMAIN)

-	struct vmop_owner	 vmc_owner;
-
 	/* instance template params */
 	char			 vmc_instance[VMM_MAX_NAME_LEN];
 	struct vmop_owner	 vmc_insowner;
@@ -275,11 +297,18 @@ TAILQ_HEAD(switchlist, vmd_switch);

 struct vmd_vm {
 	struct vmop_create_params vm_params;
+
+	/* Owner and identifier information */
 	pid_t			 vm_pid;
-	uint32_t		 vm_vmid;
+	uid_t			 vm_uid;
+	uint32_t		 vm_vmid;	/* vmd(8) identifier */
+	uint32_t		 vm_vmmid;	/* vmm(4) identifier */
+	uint32_t		 vm_peerid;
+
+	/* AMD SEV features */
 	uint32_t		 vm_sev_handle;
 	uint32_t		 vm_sev_asid[VMM_MAX_VCPUS_PER_VM];
-
+	uint32_t		 vm_poscbit;
 #define VM_SEV_NSEGMENTS	128
 	size_t			 vm_sev_nmemsegments;
 	struct vm_mem_range	 vm_sev_memsegments[VM_SEV_NSEGMENTS];
@@ -287,16 +316,18 @@ struct vmd_vm {
 	int			 vm_kernel;
 	char			*vm_kernel_path; /* Used by vm.conf. */

+	/* Device and disk image file descriptors */
 	int			 vm_cdrom;
 	int			 vm_disks[VM_MAX_DISKS_PER_VM][VM_MAX_BASE_PER_DISK];
 	struct vmd_if		 vm_ifs[VM_MAX_NICS_PER_VM];
+
+	/* Serial port */
 	char			 vm_ttyname[VM_TTYNAME_MAX];
 	int			 vm_tty;
-	uint32_t		 vm_peerid;
+
 	/* When set, VM was defined in a config file */
 	int			 vm_from_config;
 	struct imsgev		 vm_iev;
-	uid_t			 vm_uid;
 	unsigned int		 vm_state;
 /* When set, VM is running now (PROC_PARENT only) */
 #define VM_STATE_RUNNING	0x01
@@ -484,16 +515,16 @@ int	 fd_hasdata(int);
 int	 vmm_pipe(struct vmd_vm *, int, void (*)(int, short, void *));

 /* {mach}_vm.c (md interface) */
-void	 create_memory_map(struct vm_create_params *);
+void	 create_memory_map(struct vmd_vm *);
 int	 load_firmware(struct vmd_vm *, struct vcpu_reg_state *);
-int	 init_emulated_hw(struct vmop_create_params *, int,
-    int[][VM_MAX_BASE_PER_DISK], int *);
+int	 init_emulated_hw(struct vmd_vm *, int, int[][VM_MAX_BASE_PER_DISK],
+    int *);
 int	 vcpu_reset(uint32_t, uint32_t, struct vcpu_reg_state *);
 void	 pause_vm_md(struct vmd_vm *);
 void	 unpause_vm_md(struct vmd_vm *);
 void	*hvaddr_mem(paddr_t, size_t);
 struct vm_mem_range *
-	 find_gpa_range(struct vm_create_params *, paddr_t, size_t);
+	 find_gpa_range(struct vmop_create_params *, paddr_t, size_t);
 int	 write_mem(paddr_t, const void *, size_t);
 int	 read_mem(paddr_t, void *, size_t);
 int	 intr_ack(struct vmd_vm *);
blob - 51d6e406d1d924a3750f4aa62bd12fdeba2c2e50
blob + 5892156f831aa8d6cb03c981cb32e51cede4b6b1
--- usr.sbin/vmd/vmm.c
+++ usr.sbin/vmd/vmm.c
@@ -317,7 +317,6 @@ vmm_sighdlr(int sig, short event, void *arg)
 {
 	struct privsep *ps = arg;
 	int status, ret = 0;
-	uint32_t vmid;
 	pid_t pid;
 	struct vmop_result vmr;
 	struct vmd_vm *vm;
@@ -350,18 +349,18 @@ vmm_sighdlr(int sig, short event, void *arg)
 				    (vm->vm_state & VM_STATE_SHUTDOWN))
 					ret = 0;

-				vmid = vm->vm_params.vmc_params.vcp_id;
-				vtp.vtp_vm_id = vmid;
+				/* XXX check this */
+				vtp.vtp_vm_id = vm->vm_vmmid;

 				if (terminate_vm(&vtp) == 0)
 					log_debug("%s: terminated vm %s"
 					    " (id %d)", __func__,
-					    vm->vm_params.vmc_params.vcp_name,
+					    vm->vm_params.vmc_name,
 					    vm->vm_vmid);

 				memset(&vmr, 0, sizeof(vmr));
 				vmr.vmr_result = ret;
-				vmr.vmr_id = vm_id2vmid(vmid, vm);
+				vmr.vmr_id = vm_id2vmid(vm->vm_vmmid, vm);
 				if (proc_compose_imsg(ps, PROC_PARENT,
 				    IMSG_VMDOP_TERMINATE_VM_EVENT,
 				    vm->vm_peerid, -1, &vmr, sizeof(vmr)) == -1)
@@ -497,7 +496,7 @@ vmm_dispatch_vm(int fd, short event, void *arg)

 		default:
 			fatalx("%s: got invalid imsg %d from %s", __func__,
-			    type, vm->vm_params.vmc_params.vcp_name);
+			    type, vm->vm_params.vmc_name);
 		}
 		imsg_free(&imsg);
 	}
@@ -588,7 +587,6 @@ opentap(char *ifname)
 int
 vmm_start_vm(struct imsg *imsg, uint32_t *id, pid_t *pid)
 {
-	struct vm_create_params	*vcp;
 	struct vmd_vm		*vm;
 	char			*nargv[10], num[32], vmm_fd[32], psp_fd[32];
 	int			 fd, ret = EINVAL;
@@ -602,14 +600,12 @@ vmm_start_vm(struct imsg *imsg, uint32_t *id, pid_t *p
 		log_warnx("%s: can't find vm", __func__);
 		return (ENOENT);
 	}
-	vcp = &vm->vm_params.vmc_params;

 	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");
@@ -631,7 +627,7 @@ vmm_start_vm(struct imsg *imsg, uint32_t *id, pid_t *p
 		sz = atomicio(vwrite, fds[0], vm, sizeof(*vm));
 		if (sz != sizeof(*vm)) {
 			log_warnx("%s: failed to send config for vm '%s'",
-			    __func__, vcp->vcp_name);
+			    __func__, vm->vm_params.vmc_name);
 			ret = EIO;
 			/* Defer error handling until after fd closing. */
 		}
@@ -663,26 +659,27 @@ vmm_start_vm(struct imsg *imsg, uint32_t *id, pid_t *p
 		    sizeof(env->vmd_cfg.cfg_localprefix));
 		if (sz != sizeof(env->vmd_cfg.cfg_localprefix)) {
 			log_warnx("%s: failed to send local prefix for vm '%s'",
-			    __func__, vcp->vcp_name);
+			    __func__, vm->vm_params.vmc_name);
 			ret = EIO;
 			goto err;
 		}

 		/* Read back the kernel-generated vm id from the child */
-		sz = atomicio(read, fds[0], &vcp->vcp_id, sizeof(vcp->vcp_id));
-		if (sz != sizeof(vcp->vcp_id)) {
+		sz = atomicio(read, fds[0], &vm->vm_vmmid,
+		    sizeof(vm->vm_vmmid));
+		if (sz != sizeof(vm->vm_vmmid)) {
 			log_debug("%s: failed to receive vm id from vm %s",
-			    __func__, vcp->vcp_name);
+			    __func__, vm->vm_params.vmc_name);
 			/* vmd could not allocate memory for the vm. */
 			ret = ENOMEM;
 			goto err;
 		}

 		/* Check for an invalid id. This indicates child failure. */
-		if (vcp->vcp_id == 0)
+		if (vm->vm_vmmid == 0)
 			goto err;

-		*id = vcp->vcp_id;
+		*id = vm->vm_vmmid;
 		*pid = vm->vm_pid;

 		/* Wire up our pipe into the event handling. */
@@ -828,8 +825,17 @@ get_info_vm(struct privsep *ps, struct imsg *imsg, int
 			    info[i].vir_name, info[i].vir_id);
 			continue;
 		}
-		memcpy(&vir.vir_info, &info[i], sizeof(vir.vir_info));
-		vir.vir_info.vir_id = vm_id2vmid(info[i].vir_id, NULL);
+
+		/* XXX */
+		vir.vir_memory_size = info[i].vir_memory_size;
+		vir.vir_used_size = info[i].vir_used_size;
+		vir.vir_ncpus = info[i].vir_ncpus;
+		memcpy(vir.vir_vcpu_state, info[i].vir_vcpu_state,
+		    sizeof(vir.vir_vcpu_state));
+		vir.vir_creator_pid = info[i].vir_creator_pid;
+		vir.vir_id = vm_id2vmid(info[i].vir_id, NULL);
+		memcpy(vir.vir_name, info[i].vir_name, sizeof(vir.vir_name));
+
 		peer_id = imsg_get_id(imsg);

 		if (proc_compose_imsg(ps, PROC_PARENT,
blob - ff02fd9a3515d05cfd468280230c3731e687bbbb
blob + 403f0b1ec4a58ffeb7b65ee32fa2cb4a5e7f6a8a
--- usr.sbin/vmd/x86_vm.c
+++ usr.sbin/vmd/x86_vm.c
@@ -47,7 +47,6 @@ typedef uint8_t (*io_fn_t)(struct vm_run_params *);

 io_fn_t	ioports_map[MAX_PORTS];

-void	 create_memory_map(struct vm_create_params *);
 int	 translate_gva(struct vm_exit*, uint64_t, uint64_t *, int);

 static int	loadfile_bios(gzFile, off_t, struct vcpu_reg_state *);
@@ -148,30 +147,24 @@ static const struct vcpu_reg_state vcpu_init_flat16 =
  * create_memory_map
  *
  * Sets up the guest physical memory ranges that the VM can access.
- *
- * Parameters:
- *  vcp: VM create parameters describing the VM whose memory map
- *       is being created
- *
- * Return values:
- *  nothing
  */
 void
-create_memory_map(struct vm_create_params *vcp)
+create_memory_map(struct vmd_vm *vm)
 {
+	struct vmop_create_params *vmc = &vm->vm_params;
 	size_t len, mem_bytes;
 	size_t above_1m = 0, above_4g = 0;

-	mem_bytes = vcp->vcp_memranges[0].vmr_size;
-	vcp->vcp_nmemranges = 0;
+	mem_bytes = vmc->vmc_memranges[0].vmr_size;
+	vmc->vmc_nmemranges = 0;
 	if (mem_bytes == 0 || mem_bytes > VMM_MAX_VM_MEM_SIZE)
 		return;

 	/* First memory region: 0 - LOWMEM_KB (DOS low mem) */
 	len = LOWMEM_KB * 1024;
-	vcp->vcp_memranges[0].vmr_gpa = 0x0;
-	vcp->vcp_memranges[0].vmr_size = len;
-	vcp->vcp_memranges[0].vmr_type = VM_MEM_RAM;
+	vmc->vmc_memranges[0].vmr_gpa = 0x0;
+	vmc->vmc_memranges[0].vmr_size = len;
+	vmc->vmc_memranges[0].vmr_type = VM_MEM_RAM;
 	mem_bytes -= len;

 	/*
@@ -184,9 +177,9 @@ create_memory_map(struct vm_create_params *vcp)
 	 * to it. So allocate guest memory for it.
 	 */
 	len = MB(1) - (LOWMEM_KB * 1024);
-	vcp->vcp_memranges[1].vmr_gpa = LOWMEM_KB * 1024;
-	vcp->vcp_memranges[1].vmr_size = len;
-	vcp->vcp_memranges[1].vmr_type = VM_MEM_RESERVED;
+	vmc->vmc_memranges[1].vmr_gpa = LOWMEM_KB * 1024;
+	vmc->vmc_memranges[1].vmr_size = len;
+	vmc->vmc_memranges[1].vmr_type = VM_MEM_RESERVED;
 	mem_bytes -= len;

 	/*
@@ -194,10 +187,10 @@ create_memory_map(struct vm_create_params *vcp)
 	 * BIOS area.
 	 */
 	if (mem_bytes <= MB(4)) {
-		vcp->vcp_memranges[2].vmr_gpa = PCI_MMIO_BAR_END;
-		vcp->vcp_memranges[2].vmr_size = MB(4);
-		vcp->vcp_memranges[2].vmr_type = VM_MEM_RESERVED;
-		vcp->vcp_nmemranges = 3;
+		vmc->vmc_memranges[2].vmr_gpa = PCI_MMIO_BAR_END;
+		vmc->vmc_memranges[2].vmr_size = MB(4);
+		vmc->vmc_memranges[2].vmr_type = VM_MEM_RESERVED;
+		vmc->vmc_nmemranges = 3;
 		return;
 	}

@@ -215,29 +208,29 @@ create_memory_map(struct vm_create_params *vcp)
 	}

 	/* Third memory region: area above 1MB to MMIO region */
-	vcp->vcp_memranges[2].vmr_gpa = MB(1);
-	vcp->vcp_memranges[2].vmr_size = above_1m;
-	vcp->vcp_memranges[2].vmr_type = VM_MEM_RAM;
+	vmc->vmc_memranges[2].vmr_gpa = MB(1);
+	vmc->vmc_memranges[2].vmr_size = above_1m;
+	vmc->vmc_memranges[2].vmr_type = VM_MEM_RAM;

 	/* Fourth region: PCI MMIO range */
-	vcp->vcp_memranges[3].vmr_gpa = PCI_MMIO_BAR_BASE;
-	vcp->vcp_memranges[3].vmr_size = PCI_MMIO_BAR_END -
+	vmc->vmc_memranges[3].vmr_gpa = PCI_MMIO_BAR_BASE;
+	vmc->vmc_memranges[3].vmr_size = PCI_MMIO_BAR_END -
 	    PCI_MMIO_BAR_BASE + 1;
-	vcp->vcp_memranges[3].vmr_type = VM_MEM_MMIO;
+	vmc->vmc_memranges[3].vmr_type = VM_MEM_MMIO;

 	/* Fifth region: 2nd copy of BIOS above MMIO ending at 4GB */
-	vcp->vcp_memranges[4].vmr_gpa = PCI_MMIO_BAR_END + 1;
-	vcp->vcp_memranges[4].vmr_size = MB(4);
-	vcp->vcp_memranges[4].vmr_type = VM_MEM_RESERVED;
+	vmc->vmc_memranges[4].vmr_gpa = PCI_MMIO_BAR_END + 1;
+	vmc->vmc_memranges[4].vmr_size = MB(4);
+	vmc->vmc_memranges[4].vmr_type = VM_MEM_RESERVED;

 	/* Sixth region: any remainder above 4GB */
 	if (above_4g > 0) {
-		vcp->vcp_memranges[5].vmr_gpa = GB(4);
-		vcp->vcp_memranges[5].vmr_size = above_4g;
-		vcp->vcp_memranges[5].vmr_type = VM_MEM_RAM;
-		vcp->vcp_nmemranges = 6;
+		vmc->vmc_memranges[5].vmr_gpa = GB(4);
+		vmc->vmc_memranges[5].vmr_size = above_4g;
+		vmc->vmc_memranges[5].vmr_type = VM_MEM_RAM;
+		vmc->vmc_nmemranges = 6;
 	} else
-		vcp->vcp_nmemranges = 5;
+		vmc->vmc_nmemranges = 5;
 }

 int
@@ -353,28 +346,28 @@ loadfile_bios(gzFile fp, off_t size, struct vcpu_reg_s
  * Returns 0 on success, 1 on failure.
  */
 int
-init_emulated_hw(struct vmop_create_params *vmc, int child_cdrom,
+init_emulated_hw(struct vmd_vm *vm, int child_cdrom,
     int child_disks[][VM_MAX_BASE_PER_DISK], int *child_taps)
 {
-	struct vm_create_params *vcp = &vmc->vmc_params;
+	struct vmop_create_params *vmc = &vm->vm_params;
 	size_t i;
 	uint64_t memlo, memhi;

 	/* Calculate memory size for NVRAM registers */
 	memlo = memhi = 0;
-	for (i = 0; i < vcp->vcp_nmemranges; i++) {
-		if (vcp->vcp_memranges[i].vmr_gpa == MB(1) &&
-		    vcp->vcp_memranges[i].vmr_size > (15 * MB(1)))
-			memlo = vcp->vcp_memranges[i].vmr_size - (15 * MB(1));
-		else if (vcp->vcp_memranges[i].vmr_gpa == GB(4))
-			memhi = vcp->vcp_memranges[i].vmr_size;
+	for (i = 0; i < vmc->vmc_nmemranges; i++) {
+		if (vmc->vmc_memranges[i].vmr_gpa == MB(1) &&
+		    vmc->vmc_memranges[i].vmr_size > (15 * MB(1)))
+			memlo = vmc->vmc_memranges[i].vmr_size - (15 * MB(1));
+		else if (vmc->vmc_memranges[i].vmr_gpa == GB(4))
+			memhi = vmc->vmc_memranges[i].vmr_size;
 	}

 	/* Reset the IO port map */
 	memset(&ioports_map, 0, sizeof(io_fn_t) * MAX_PORTS);

 	/* Init i8253 PIT */
-	i8253_init(vcp->vcp_id);
+	i8253_init(vm->vm_vmmid);
 	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;
@@ -382,7 +375,7 @@ init_emulated_hw(struct vmop_create_params *vmc, int c
 	ioports_map[PCKBC_AUX] = vcpu_exit_i8253_misc;

 	/* Init mc146818 RTC */
-	mc146818_init(vcp->vcp_id, memlo, memhi);
+	mc146818_init(vm->vm_vmmid, memlo, memhi);
 	ioports_map[IO_RTC] = vcpu_exit_mc146818;
 	ioports_map[IO_RTC + 1] = vcpu_exit_mc146818;

@@ -396,7 +389,7 @@ init_emulated_hw(struct vmop_create_params *vmc, int c
 	ioports_map[ELCR1] = vcpu_exit_elcr;

 	/* Init ns8250 UART */
-	ns8250_init(con_fd, vcp->vcp_id);
+	ns8250_init(con_fd, vm->vm_vmmid);
 	for (i = COM1_DATA; i <= COM1_SCR; i++)
 		ioports_map[i] = vcpu_exit_com;

@@ -697,20 +690,20 @@ vcpu_exit_pci(struct vm_run_params *vrp)
  *  Pointer to vm_mem_range that contains the start of the range otherwise.
  */
 struct vm_mem_range *
-find_gpa_range(struct vm_create_params *vcp, paddr_t gpa, size_t len)
+find_gpa_range(struct vmop_create_params *vmc, paddr_t gpa, size_t len)
 {
 	size_t i, n;
 	struct vm_mem_range *vmr;

 	/* Find the first vm_mem_range that contains gpa */
-	for (i = 0; i < vcp->vcp_nmemranges; i++) {
-		vmr = &vcp->vcp_memranges[i];
+	for (i = 0; i < vmc->vmc_nmemranges; i++) {
+		vmr = &vmc->vmc_memranges[i];
 		if (gpa < vmr->vmr_gpa + vmr->vmr_size)
 			break;
 	}

 	/* No range found. */
-	if (i == vcp->vcp_nmemranges)
+	if (i == vmc->vmc_nmemranges)
 		return (NULL);

 	/*
@@ -724,8 +717,8 @@ find_gpa_range(struct vm_create_params *vcp, paddr_t g
 	else
 		len -= n;
 	gpa = vmr->vmr_gpa + vmr->vmr_size;
-	for (i = i + 1; len != 0 && i < vcp->vcp_nmemranges; i++) {
-		vmr = &vcp->vcp_memranges[i];
+	for (i = i + 1; len != 0 && i < vmc->vmc_nmemranges; i++) {
+		vmr = &vmc->vmc_memranges[i];
 		if (gpa != vmr->vmr_gpa)
 			return (NULL);
 		if (len <= vmr->vmr_size)
@@ -764,7 +757,7 @@ write_mem(paddr_t dst, const void *buf, size_t len)
 	size_t n, off;
 	struct vm_mem_range *vmr;

-	vmr = find_gpa_range(&current_vm->vm_params.vmc_params, dst, len);
+	vmr = find_gpa_range(&current_vm->vm_params, dst, len);
 	if (vmr == NULL) {
 		errno = EINVAL;
 		log_warn("%s: failed - invalid memory range dst = 0x%lx, "
@@ -815,7 +808,7 @@ read_mem(paddr_t src, void *buf, size_t len)
 	size_t n, off;
 	struct vm_mem_range *vmr;

-	vmr = find_gpa_range(&current_vm->vm_params.vmc_params, src, len);
+	vmr = find_gpa_range(&current_vm->vm_params, src, len);
 	if (vmr == NULL) {
 		errno = EINVAL;
 		log_warn("%s: failed - invalid memory range src = 0x%lx, "
@@ -864,7 +857,7 @@ hvaddr_mem(paddr_t gpa, size_t len)
 	struct vm_mem_range *vmr;
 	size_t off;

-	vmr = find_gpa_range(&current_vm->vm_params.vmc_params, gpa, len);
+	vmr = find_gpa_range(&current_vm->vm_params, gpa, len);
 	if (vmr == NULL) {
 		log_warnx("%s: failed - invalid gpa: 0x%lx\n", __func__, gpa);
 		errno = EFAULT;
@@ -888,17 +881,17 @@ hvaddr_mem(paddr_t gpa, size_t len)
  * Injects the specified IRQ on the supplied vcpu/vm
  *
  * Parameters:
- *  vm_id: VM ID to inject to
+ *  vm_id: VMM vm ID to inject to
  *  vcpu_id: VCPU ID to inject to
  *  irq: IRQ to inject
  */
 void
-vcpu_assert_irq(uint32_t vm_id, uint32_t vcpu_id, int irq)
+vcpu_assert_irq(uint32_t vmm_id, uint32_t vcpu_id, int irq)
 {
 	i8259_assert_irq(irq);

 	if (i8259_is_pending()) {
-		if (vcpu_intr(vm_id, vcpu_id, 1))
+		if (vcpu_intr(vmm_id, vcpu_id, 1))
 			fatalx("%s: can't assert INTR", __func__);

 		vcpu_unhalt(vcpu_id);
@@ -912,19 +905,19 @@ vcpu_assert_irq(uint32_t vm_id, uint32_t vcpu_id, int
  * Clears the specified IRQ on the supplied vcpu/vm
  *
  * Parameters:
- *  vm_id: VM ID to clear in
+ *  vm_id: VMM vm ID to clear in
  *  vcpu_id: VCPU ID to clear in
  *  irq: IRQ to clear
  */
 void
-vcpu_deassert_irq(uint32_t vm_id, uint32_t vcpu_id, int irq)
+vcpu_deassert_irq(uint32_t vmm_id, uint32_t vcpu_id, int irq)
 {
 	i8259_deassert_irq(irq);

 	if (!i8259_is_pending()) {
-		if (vcpu_intr(vm_id, vcpu_id, 0))
-			fatalx("%s: can't deassert INTR for vm_id %d, "
-			    "vcpu_id %d", __func__, vm_id, vcpu_id);
+		if (vcpu_intr(vmm_id, vcpu_id, 0))
+			fatalx("%s: can't deassert INTR for vmm_id %d, "
+			    "vcpu_id %d", __func__, vmm_id, vcpu_id);
 	}
 }