xref: /illumos-gate/usr/src/uts/intel/sys/vmm_dev.h (revision 09ea9c53cd9ac02c506f68475d98e8f07b457ffc)
17c8c0b82SPatrick Mooney /*-
232640292SAndy Fiddaman  * SPDX-License-Identifier: BSD-2-Clause
37c8c0b82SPatrick Mooney  *
47c8c0b82SPatrick Mooney  * Copyright (c) 2011 NetApp, Inc.
57c8c0b82SPatrick Mooney  * All rights reserved.
67c8c0b82SPatrick Mooney  *
77c8c0b82SPatrick Mooney  * Redistribution and use in source and binary forms, with or without
87c8c0b82SPatrick Mooney  * modification, are permitted provided that the following conditions
97c8c0b82SPatrick Mooney  * are met:
107c8c0b82SPatrick Mooney  * 1. Redistributions of source code must retain the above copyright
117c8c0b82SPatrick Mooney  *    notice, this list of conditions and the following disclaimer.
127c8c0b82SPatrick Mooney  * 2. Redistributions in binary form must reproduce the above copyright
137c8c0b82SPatrick Mooney  *    notice, this list of conditions and the following disclaimer in the
147c8c0b82SPatrick Mooney  *    documentation and/or other materials provided with the distribution.
157c8c0b82SPatrick Mooney  *
167c8c0b82SPatrick Mooney  * THIS SOFTWARE IS PROVIDED BY NETAPP, INC ``AS IS'' AND
177c8c0b82SPatrick Mooney  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
187c8c0b82SPatrick Mooney  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
197c8c0b82SPatrick Mooney  * ARE DISCLAIMED.  IN NO EVENT SHALL NETAPP, INC OR CONTRIBUTORS BE LIABLE
207c8c0b82SPatrick Mooney  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
217c8c0b82SPatrick Mooney  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
227c8c0b82SPatrick Mooney  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
237c8c0b82SPatrick Mooney  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
247c8c0b82SPatrick Mooney  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
257c8c0b82SPatrick Mooney  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
267c8c0b82SPatrick Mooney  * SUCH DAMAGE.
277c8c0b82SPatrick Mooney  */
287c8c0b82SPatrick Mooney /*
297c8c0b82SPatrick Mooney  * This file and its contents are supplied under the terms of the
307c8c0b82SPatrick Mooney  * Common Development and Distribution License ("CDDL"), version 1.0.
317c8c0b82SPatrick Mooney  * You may only use this file in accordance with the terms of version
327c8c0b82SPatrick Mooney  * 1.0 of the CDDL.
337c8c0b82SPatrick Mooney  *
347c8c0b82SPatrick Mooney  * A full copy of the text of the CDDL should have accompanied this
357c8c0b82SPatrick Mooney  * source.  A copy of the CDDL is also available via the Internet at
367c8c0b82SPatrick Mooney  * http://www.illumos.org/license/CDDL.
377c8c0b82SPatrick Mooney  *
387c8c0b82SPatrick Mooney  * Copyright 2015 Pluribus Networks Inc.
397c8c0b82SPatrick Mooney  * Copyright 2019 Joyent, Inc.
40b9b43e84SPatrick Mooney  * Copyright 2024 Oxide Computer Company
417c8c0b82SPatrick Mooney  */
427c8c0b82SPatrick Mooney 
437c8c0b82SPatrick Mooney #ifndef	_VMM_DEV_H_
447c8c0b82SPatrick Mooney #define	_VMM_DEV_H_
457c8c0b82SPatrick Mooney 
467c8c0b82SPatrick Mooney #include <machine/vmm.h>
477c8c0b82SPatrick Mooney 
487c8c0b82SPatrick Mooney #include <sys/param.h>
497c8c0b82SPatrick Mooney #include <sys/cpuset.h>
50d515dd77SPatrick Mooney #include <sys/vmm_data.h>
517c8c0b82SPatrick Mooney 
527c8c0b82SPatrick Mooney struct vm_create_req {
537c8c0b82SPatrick Mooney 	char		name[VM_MAX_NAMELEN];
547c8c0b82SPatrick Mooney 	uint64_t	flags;
557c8c0b82SPatrick Mooney };
567c8c0b82SPatrick Mooney 
577c8c0b82SPatrick Mooney 
587c8c0b82SPatrick Mooney struct vm_destroy_req {
597c8c0b82SPatrick Mooney 	char		name[VM_MAX_NAMELEN];
607c8c0b82SPatrick Mooney };
617c8c0b82SPatrick Mooney 
627c8c0b82SPatrick Mooney struct vm_memmap {
637c8c0b82SPatrick Mooney 	vm_paddr_t	gpa;
647c8c0b82SPatrick Mooney 	int		segid;		/* memory segment */
657c8c0b82SPatrick Mooney 	vm_ooffset_t	segoff;		/* offset into memory segment */
667c8c0b82SPatrick Mooney 	size_t		len;		/* mmap length */
677c8c0b82SPatrick Mooney 	int		prot;		/* RWX */
687c8c0b82SPatrick Mooney 	int		flags;
697c8c0b82SPatrick Mooney };
707c8c0b82SPatrick Mooney #define	VM_MEMMAP_F_WIRED	0x01
717c8c0b82SPatrick Mooney #define	VM_MEMMAP_F_IOMMU	0x02
727c8c0b82SPatrick Mooney 
737c8c0b82SPatrick Mooney struct vm_munmap {
747c8c0b82SPatrick Mooney 	vm_paddr_t	gpa;
757c8c0b82SPatrick Mooney 	size_t		len;
767c8c0b82SPatrick Mooney };
777c8c0b82SPatrick Mooney 
787c8c0b82SPatrick Mooney #define	VM_MEMSEG_NAME(m)	((m)->name[0] != '\0' ? (m)->name : NULL)
797c8c0b82SPatrick Mooney struct vm_memseg {
807c8c0b82SPatrick Mooney 	int		segid;
817c8c0b82SPatrick Mooney 	size_t		len;
827c8c0b82SPatrick Mooney 	char		name[VM_MAX_SEG_NAMELEN];
837c8c0b82SPatrick Mooney };
847c8c0b82SPatrick Mooney 
857c8c0b82SPatrick Mooney struct vm_register {
867c8c0b82SPatrick Mooney 	int		cpuid;
877c8c0b82SPatrick Mooney 	int		regnum;		/* enum vm_reg_name */
887c8c0b82SPatrick Mooney 	uint64_t	regval;
897c8c0b82SPatrick Mooney };
907c8c0b82SPatrick Mooney 
917c8c0b82SPatrick Mooney struct vm_seg_desc {			/* data or code segment */
927c8c0b82SPatrick Mooney 	int		cpuid;
937c8c0b82SPatrick Mooney 	int		regnum;		/* enum vm_reg_name */
947c8c0b82SPatrick Mooney 	struct seg_desc desc;
957c8c0b82SPatrick Mooney };
967c8c0b82SPatrick Mooney 
977c8c0b82SPatrick Mooney struct vm_register_set {
987c8c0b82SPatrick Mooney 	int		cpuid;
997c8c0b82SPatrick Mooney 	unsigned int	count;
1007c8c0b82SPatrick Mooney 	const int	*regnums;	/* enum vm_reg_name */
1017c8c0b82SPatrick Mooney 	uint64_t	*regvals;
1027c8c0b82SPatrick Mooney };
1037c8c0b82SPatrick Mooney 
1047c8c0b82SPatrick Mooney struct vm_exception {
1057c8c0b82SPatrick Mooney 	int		cpuid;
1067c8c0b82SPatrick Mooney 	int		vector;
1077c8c0b82SPatrick Mooney 	uint32_t	error_code;
1087c8c0b82SPatrick Mooney 	int		error_code_valid;
1097c8c0b82SPatrick Mooney 	int		restart_instruction;
1107c8c0b82SPatrick Mooney };
1117c8c0b82SPatrick Mooney 
1127c8c0b82SPatrick Mooney struct vm_lapic_msi {
1137c8c0b82SPatrick Mooney 	uint64_t	msg;
1147c8c0b82SPatrick Mooney 	uint64_t	addr;
1157c8c0b82SPatrick Mooney };
1167c8c0b82SPatrick Mooney 
1177c8c0b82SPatrick Mooney struct vm_lapic_irq {
1187c8c0b82SPatrick Mooney 	int		cpuid;
1197c8c0b82SPatrick Mooney 	int		vector;
1207c8c0b82SPatrick Mooney };
1217c8c0b82SPatrick Mooney 
1227c8c0b82SPatrick Mooney struct vm_ioapic_irq {
1237c8c0b82SPatrick Mooney 	int		irq;
1247c8c0b82SPatrick Mooney };
1257c8c0b82SPatrick Mooney 
1267c8c0b82SPatrick Mooney struct vm_isa_irq {
1277c8c0b82SPatrick Mooney 	int		atpic_irq;
1287c8c0b82SPatrick Mooney 	int		ioapic_irq;
1297c8c0b82SPatrick Mooney };
1307c8c0b82SPatrick Mooney 
1317c8c0b82SPatrick Mooney struct vm_isa_irq_trigger {
1327c8c0b82SPatrick Mooney 	int		atpic_irq;
1337c8c0b82SPatrick Mooney 	enum vm_intr_trigger trigger;
1347c8c0b82SPatrick Mooney };
1357c8c0b82SPatrick Mooney 
1367c8c0b82SPatrick Mooney struct vm_capability {
1377c8c0b82SPatrick Mooney 	int		cpuid;
1387c8c0b82SPatrick Mooney 	enum vm_cap_type captype;
1397c8c0b82SPatrick Mooney 	int		capval;
1407c8c0b82SPatrick Mooney 	int		allcpus;
1417c8c0b82SPatrick Mooney };
1427c8c0b82SPatrick Mooney 
1437c8c0b82SPatrick Mooney struct vm_pptdev {
1447c8c0b82SPatrick Mooney 	int		pptfd;
1457c8c0b82SPatrick Mooney };
1467c8c0b82SPatrick Mooney 
1477c8c0b82SPatrick Mooney struct vm_pptdev_mmio {
1487c8c0b82SPatrick Mooney 	int		pptfd;
1497c8c0b82SPatrick Mooney 	vm_paddr_t	gpa;
1507c8c0b82SPatrick Mooney 	vm_paddr_t	hpa;
1517c8c0b82SPatrick Mooney 	size_t		len;
1527c8c0b82SPatrick Mooney };
1537c8c0b82SPatrick Mooney 
1547c8c0b82SPatrick Mooney struct vm_pptdev_msi {
1557c8c0b82SPatrick Mooney 	int		vcpu;
1567c8c0b82SPatrick Mooney 	int		pptfd;
1577c8c0b82SPatrick Mooney 	int		numvec;		/* 0 means disabled */
1587c8c0b82SPatrick Mooney 	uint64_t	msg;
1597c8c0b82SPatrick Mooney 	uint64_t	addr;
1607c8c0b82SPatrick Mooney };
1617c8c0b82SPatrick Mooney 
1627c8c0b82SPatrick Mooney struct vm_pptdev_msix {
1637c8c0b82SPatrick Mooney 	int		vcpu;
1647c8c0b82SPatrick Mooney 	int		pptfd;
1657c8c0b82SPatrick Mooney 	int		idx;
1667c8c0b82SPatrick Mooney 	uint64_t	msg;
1677c8c0b82SPatrick Mooney 	uint32_t	vector_control;
1687c8c0b82SPatrick Mooney 	uint64_t	addr;
1697c8c0b82SPatrick Mooney };
1707c8c0b82SPatrick Mooney 
1717c8c0b82SPatrick Mooney struct vm_pptdev_limits {
1727c8c0b82SPatrick Mooney 	int		pptfd;
1737c8c0b82SPatrick Mooney 	int		msi_limit;
1747c8c0b82SPatrick Mooney 	int		msix_limit;
1757c8c0b82SPatrick Mooney };
1767c8c0b82SPatrick Mooney 
1777c8c0b82SPatrick Mooney struct vm_nmi {
1787c8c0b82SPatrick Mooney 	int		cpuid;
1797c8c0b82SPatrick Mooney };
1807c8c0b82SPatrick Mooney 
181d7b72f7bSAndy Fiddaman #define	MAX_VM_STATS	64
1827c8c0b82SPatrick Mooney 
1837c8c0b82SPatrick Mooney struct vm_stats {
1847c8c0b82SPatrick Mooney 	int		cpuid;				/* in */
185d7b72f7bSAndy Fiddaman 	int		index;				/* in */
1867c8c0b82SPatrick Mooney 	int		num_entries;			/* out */
1877c8c0b82SPatrick Mooney 	struct timeval	tv;
1887c8c0b82SPatrick Mooney 	uint64_t	statbuf[MAX_VM_STATS];
1897c8c0b82SPatrick Mooney };
1907c8c0b82SPatrick Mooney 
1917c8c0b82SPatrick Mooney struct vm_stat_desc {
1927c8c0b82SPatrick Mooney 	int		index;				/* in */
1937c8c0b82SPatrick Mooney 	char		desc[128];			/* out */
1947c8c0b82SPatrick Mooney };
1957c8c0b82SPatrick Mooney 
1967c8c0b82SPatrick Mooney struct vm_x2apic {
1977c8c0b82SPatrick Mooney 	int			cpuid;
1987c8c0b82SPatrick Mooney 	enum x2apic_state	state;
1997c8c0b82SPatrick Mooney };
2007c8c0b82SPatrick Mooney 
2017c8c0b82SPatrick Mooney struct vm_gpa_pte {
2027c8c0b82SPatrick Mooney 	uint64_t	gpa;				/* in */
2037c8c0b82SPatrick Mooney 	uint64_t	pte[4];				/* out */
2047c8c0b82SPatrick Mooney 	int		ptenum;
2057c8c0b82SPatrick Mooney };
2067c8c0b82SPatrick Mooney 
2077c8c0b82SPatrick Mooney struct vm_hpet_cap {
2087c8c0b82SPatrick Mooney 	uint32_t	capabilities;	/* lower 32 bits of HPET capabilities */
2097c8c0b82SPatrick Mooney };
2107c8c0b82SPatrick Mooney 
2117c8c0b82SPatrick Mooney struct vm_suspend {
2127c8c0b82SPatrick Mooney 	enum vm_suspend_how how;
21372473353SPatrick Mooney 	int source;
2147c8c0b82SPatrick Mooney };
2157c8c0b82SPatrick Mooney 
21672473353SPatrick Mooney /*
21772473353SPatrick Mooney  * Deprecated flags for vm_reinit`flags:
21872473353SPatrick Mooney  *
21972473353SPatrick Mooney  * Suspend (by force) VM as part of reinit.  Effectively a no-op since
22072473353SPatrick Mooney  * suspension requirements during reinit have been lifted.
22172473353SPatrick Mooney  *
22272473353SPatrick Mooney  * #define VM_REINIT_F_FORCE_SUSPEND	(1 << 0)
22372473353SPatrick Mooney  */
2247c8c0b82SPatrick Mooney 
2257c8c0b82SPatrick Mooney struct vm_reinit {
2267c8c0b82SPatrick Mooney 	uint64_t	flags;
2277c8c0b82SPatrick Mooney };
2287c8c0b82SPatrick Mooney 
2297c8c0b82SPatrick Mooney struct vm_gla2gpa {
2307c8c0b82SPatrick Mooney 	int		vcpuid;		/* inputs */
2317c8c0b82SPatrick Mooney 	int		prot;		/* PROT_READ or PROT_WRITE */
2327c8c0b82SPatrick Mooney 	uint64_t	gla;
2337c8c0b82SPatrick Mooney 	struct vm_guest_paging paging;
2347c8c0b82SPatrick Mooney 	int		fault;		/* outputs */
2357c8c0b82SPatrick Mooney 	uint64_t	gpa;
2367c8c0b82SPatrick Mooney };
2377c8c0b82SPatrick Mooney 
2387c8c0b82SPatrick Mooney struct vm_activate_cpu {
2397c8c0b82SPatrick Mooney 	int		vcpuid;
2407c8c0b82SPatrick Mooney };
2417c8c0b82SPatrick Mooney 
2427c8c0b82SPatrick Mooney struct vm_cpuset {
2437c8c0b82SPatrick Mooney 	int		which;
2447c8c0b82SPatrick Mooney 	int		cpusetsize;
2457c8c0b82SPatrick Mooney #ifndef _KERNEL
2467c8c0b82SPatrick Mooney 	cpuset_t	*cpus;
2477c8c0b82SPatrick Mooney #else
2487c8c0b82SPatrick Mooney 	void		*cpus;
2497c8c0b82SPatrick Mooney #endif
2507c8c0b82SPatrick Mooney };
2517c8c0b82SPatrick Mooney #define	VM_ACTIVE_CPUS		0
25272473353SPatrick Mooney /*
25372473353SPatrick Mooney  * Deprecated:
25472473353SPatrick Mooney  * #define VM_SUSPENDED_CPUS	1
25572473353SPatrick Mooney  */
2567c8c0b82SPatrick Mooney #define	VM_DEBUG_CPUS		2
2577c8c0b82SPatrick Mooney 
2587c8c0b82SPatrick Mooney struct vm_intinfo {
2597c8c0b82SPatrick Mooney 	int		vcpuid;
2607c8c0b82SPatrick Mooney 	uint64_t	info1;
2617c8c0b82SPatrick Mooney 	uint64_t	info2;
2627c8c0b82SPatrick Mooney };
2637c8c0b82SPatrick Mooney 
2647c8c0b82SPatrick Mooney struct vm_rtc_data {
2657c8c0b82SPatrick Mooney 	int		offset;
2667c8c0b82SPatrick Mooney 	uint8_t		value;
2677c8c0b82SPatrick Mooney };
2687c8c0b82SPatrick Mooney 
2697c8c0b82SPatrick Mooney struct vm_devmem_offset {
2707c8c0b82SPatrick Mooney 	int		segid;
2717c8c0b82SPatrick Mooney 	off_t		offset;
2727c8c0b82SPatrick Mooney };
2737c8c0b82SPatrick Mooney 
2747c8c0b82SPatrick Mooney struct vm_cpu_topology {
2757c8c0b82SPatrick Mooney 	uint16_t	sockets;
2767c8c0b82SPatrick Mooney 	uint16_t	cores;
2777c8c0b82SPatrick Mooney 	uint16_t	threads;
2787c8c0b82SPatrick Mooney 	uint16_t	maxcpus;
2797c8c0b82SPatrick Mooney };
2807c8c0b82SPatrick Mooney 
2817c8c0b82SPatrick Mooney struct vm_readwrite_kernemu_device {
2827c8c0b82SPatrick Mooney 	int		vcpuid;
2837c8c0b82SPatrick Mooney 	unsigned	access_width : 3;
2847c8c0b82SPatrick Mooney 	unsigned	_unused : 29;
2857c8c0b82SPatrick Mooney 	uint64_t	gpa;
2867c8c0b82SPatrick Mooney 	uint64_t	value;
2877c8c0b82SPatrick Mooney };
2887c8c0b82SPatrick Mooney _Static_assert(sizeof(struct vm_readwrite_kernemu_device) == 24, "ABI");
2897c8c0b82SPatrick Mooney 
2907c8c0b82SPatrick Mooney enum vcpu_reset_kind {
2917c8c0b82SPatrick Mooney 	VRK_RESET = 0,
2927c8c0b82SPatrick Mooney 	/*
2937c8c0b82SPatrick Mooney 	 * The reset performed by an INIT IPI clears much of the CPU state, but
2947c8c0b82SPatrick Mooney 	 * some portions are left untouched, unlike VRK_RESET, which represents
2957c8c0b82SPatrick Mooney 	 * a "full" reset as if the system was freshly powered on.
2967c8c0b82SPatrick Mooney 	 */
2977c8c0b82SPatrick Mooney 	VRK_INIT = 1,
2987c8c0b82SPatrick Mooney };
2997c8c0b82SPatrick Mooney 
3007c8c0b82SPatrick Mooney struct vm_vcpu_reset {
3017c8c0b82SPatrick Mooney 	int		vcpuid;
3027c8c0b82SPatrick Mooney 	uint32_t	kind;	/* contains: enum vcpu_reset_kind */
3037c8c0b82SPatrick Mooney };
3047c8c0b82SPatrick Mooney 
3057c8c0b82SPatrick Mooney struct vm_run_state {
3067c8c0b82SPatrick Mooney 	int		vcpuid;
3077c8c0b82SPatrick Mooney 	uint32_t	state;	/* of enum cpu_init_status type */
3087c8c0b82SPatrick Mooney 	uint8_t		sipi_vector;	/* vector of SIPI, if any */
3097c8c0b82SPatrick Mooney 	uint8_t		_pad[3];
3107c8c0b82SPatrick Mooney };
3117c8c0b82SPatrick Mooney 
3127c8c0b82SPatrick Mooney /* Transfer data for VM_GET_FPU and VM_SET_FPU */
3137c8c0b82SPatrick Mooney struct vm_fpu_state {
3147c8c0b82SPatrick Mooney 	int		vcpuid;
3157c8c0b82SPatrick Mooney 	void		*buf;
3167c8c0b82SPatrick Mooney 	size_t		len;
3177c8c0b82SPatrick Mooney };
3187c8c0b82SPatrick Mooney 
3197c8c0b82SPatrick Mooney struct vm_fpu_desc_entry {
3207c8c0b82SPatrick Mooney 	uint64_t	vfde_feature;
3217c8c0b82SPatrick Mooney 	uint32_t	vfde_size;
3227c8c0b82SPatrick Mooney 	uint32_t	vfde_off;
3237c8c0b82SPatrick Mooney };
3247c8c0b82SPatrick Mooney 
3257c8c0b82SPatrick Mooney struct vm_fpu_desc {
3267c8c0b82SPatrick Mooney 	struct vm_fpu_desc_entry	*vfd_entry_data;
3277c8c0b82SPatrick Mooney 	size_t				vfd_req_size;
3287c8c0b82SPatrick Mooney 	uint32_t			vfd_num_entries;
3297c8c0b82SPatrick Mooney };
3307c8c0b82SPatrick Mooney 
3317c8c0b82SPatrick Mooney struct vmm_resv_query {
3327c8c0b82SPatrick Mooney 	size_t	vrq_free_sz;
3337c8c0b82SPatrick Mooney 	size_t	vrq_alloc_sz;
3347c8c0b82SPatrick Mooney 	size_t	vrq_alloc_transient_sz;
3357c8c0b82SPatrick Mooney 	size_t	vrq_limit;
3367c8c0b82SPatrick Mooney };
3377c8c0b82SPatrick Mooney 
3386bba8b59SPatrick Mooney struct vmm_resv_target {
3396bba8b59SPatrick Mooney 	/* Target size for VMM reservoir */
3406bba8b59SPatrick Mooney 	size_t	vrt_target_sz;
3416bba8b59SPatrick Mooney 
3426bba8b59SPatrick Mooney 	/*
3436bba8b59SPatrick Mooney 	 * Change of reservoir size to meet target will be done in multiple
3446bba8b59SPatrick Mooney 	 * steps of chunk size (or smaller)
3456bba8b59SPatrick Mooney 	 */
3466bba8b59SPatrick Mooney 	size_t	vrt_chunk_sz;
3476bba8b59SPatrick Mooney 
3486bba8b59SPatrick Mooney 	/*
3496bba8b59SPatrick Mooney 	 * Resultant size of reservoir after operation.  Should match target
3506bba8b59SPatrick Mooney 	 * size, except when interrupted.
3516bba8b59SPatrick Mooney 	 */
3526bba8b59SPatrick Mooney 	size_t	vrt_result_sz;
3536bba8b59SPatrick Mooney };
3546bba8b59SPatrick Mooney 
3557c8c0b82SPatrick Mooney /*
356b9b43e84SPatrick Mooney  * The VM_TRACK_DIRTY_PAGES ioctl uses the vmm_dirty_page_tracker struct as
357b9b43e84SPatrick Mooney  * input.  That ioctl is deprecated in favor of VM_NPT_OPERATION, which exposes
358b9b43e84SPatrick Mooney  * equivalent functionality.
3597c8c0b82SPatrick Mooney  *
3607c8c0b82SPatrick Mooney  * - The `vdt_start_gpa` field specifies the offset from the beginning of
3617c8c0b82SPatrick Mooney  *   guest physical memory to track;
3627c8c0b82SPatrick Mooney  * - `vdt_pfns` points to a bit vector indexed by guest PFN relative to the
3637c8c0b82SPatrick Mooney  *   given start address.  Each bit indicates whether the given guest page
3647c8c0b82SPatrick Mooney  *   is dirty or not.
3657c8c0b82SPatrick Mooney  * - `vdt_pfns_len` specifies the length of the of the guest physical memory
3667c8c0b82SPatrick Mooney  *   region in bytes.  It also de facto bounds the range of guest addresses
3677c8c0b82SPatrick Mooney  *   we will examine on any one `VM_TRACK_DIRTY_PAGES` ioctl().  If the
3687c8c0b82SPatrick Mooney  *   range of the bit vector spans an unallocated region (or extends beyond
3697c8c0b82SPatrick Mooney  *   the end of the guest physical address space) the corresponding bits in
3707c8c0b82SPatrick Mooney  *   `vdt_pfns` will be zeroed.
3717c8c0b82SPatrick Mooney  */
3727c8c0b82SPatrick Mooney struct vmm_dirty_tracker {
3737c8c0b82SPatrick Mooney 	uint64_t	vdt_start_gpa;
3747c8c0b82SPatrick Mooney 	size_t		vdt_len;	/* length of region */
3757c8c0b82SPatrick Mooney 	void		*vdt_pfns;	/* bit vector of dirty bits */
3767c8c0b82SPatrick Mooney };
3777c8c0b82SPatrick Mooney 
378b9b43e84SPatrick Mooney /*
379b9b43e84SPatrick Mooney  * Perform an operation the nested page tables for the guest.
380b9b43e84SPatrick Mooney  *
381b9b43e84SPatrick Mooney  * The vno_operation field determines how (if at all) the other fields are used.
382b9b43e84SPatrick Mooney  * If the VNO_FLAG_BITMAP_IN or VNO_FLAG_BITMAP_OUT flags are present in
383b9b43e84SPatrick Mooney  * vno_operation, then vno_bitmap is expected to point to a region of memory
384b9b43e84SPatrick Mooney  * sized adequately (1 bit per page) for the region specified by vno_gpa and
385b9b43e84SPatrick Mooney  * vno_len.  Presently that region size is limited to 1GiB (256k 4k pages).
386b9b43e84SPatrick Mooney  *
387b9b43e84SPatrick Mooney  * Several operations act on the entire guest memory space as whole, and thus
388b9b43e84SPatrick Mooney  * expect that no memory region (or bitmap) are provided.  These operations are:
389b9b43e84SPatrick Mooney  *
390b9b43e84SPatrick Mooney  * - VNO_OP_GET_TRACK_DIRTY: Get status of dirty-page-tracking for the VM.
391b9b43e84SPatrick Mooney  *   Return value of the ioctl will indicate the status (0 = off, 1 = on).
392b9b43e84SPatrick Mooney  * - VNO_OP_EN_TRACK_DIRTY: Enable dirty-page-tracking for the VM.  Will emit an
393b9b43e84SPatrick Mooney  *   error if such tracking is not supported by hardware.
394b9b43e84SPatrick Mooney  * - VNO_OP_DIS_TRACK_DIRTY: Disable dirty-page-tracking for the VM.
395b9b43e84SPatrick Mooney  *
396b9b43e84SPatrick Mooney  * The remaining operations act upon PTEs in the range specified by vno_gpa and
397b9b43e84SPatrick Mooney  * vno_len.
398b9b43e84SPatrick Mooney  *
399b9b43e84SPatrick Mooney  * If the VNO_FLAG_BITMAP_IN flag is set, the operation will be executed only
400b9b43e84SPatrick Mooney  * for pages with a corresponding bit set in the bitmap.  When the flag is not
401b9b43e84SPatrick Mooney  * set, the operation is applied to all pages in the region specified by
402b9b43e84SPatrick Mooney  * vno_gpa/vno_len.
403b9b43e84SPatrick Mooney  *
404b9b43e84SPatrick Mooney  * For operations which yield per-page results, that will be returned to the
405b9b43e84SPatrick Mooney  * caller via the bitmap if the VNO_FLAG_BITMAP_OUT flag is set.  Those
406b9b43e84SPatrick Mooney  * operations are as follows:
407b9b43e84SPatrick Mooney  *
408b9b43e84SPatrick Mooney  * - VNO_OP_GET_DIRTY: Gets the state of the dirty bit for the page(s)
409b9b43e84SPatrick Mooney  * - VNO_OP_RESET_DIRTY: Clears any existing dirty bit for the page(s),
410b9b43e84SPatrick Mooney  *   returning it via the bitmap
411b9b43e84SPatrick Mooney  * - VNO_OP_SET_DIRTY: Asserts the state of the dirty bit for the page(s).  This
412b9b43e84SPatrick Mooney  *   is only performed for pages which are mapped into the guest as writable.
413b9b43e84SPatrick Mooney  *
414b9b43e84SPatrick Mooney  * The above bitmap operations on dirty bits in the NPTs are possible
415b9b43e84SPatrick Mooney  * independent of whether dirty-page-tracking is enabled for the vmspace.
416b9b43e84SPatrick Mooney  * Querying dirty bits from a vmspace without such tracking enabled will return
417b9b43e84SPatrick Mooney  * only bits which have been manually set via a preceding NPT operation.
418b9b43e84SPatrick Mooney  */
419b9b43e84SPatrick Mooney struct vm_npt_operation {
420b9b43e84SPatrick Mooney 	uint64_t	vno_gpa;
421b9b43e84SPatrick Mooney 	uint64_t	vno_len;
422b9b43e84SPatrick Mooney 	uint8_t		*vno_bitmap;
423b9b43e84SPatrick Mooney 	uint32_t	vno_operation;
424b9b43e84SPatrick Mooney };
425b9b43e84SPatrick Mooney 
426b9b43e84SPatrick Mooney #define	VNO_OP_RESET_DIRTY	0x1
427b9b43e84SPatrick Mooney #define	VNO_OP_SET_DIRTY	0x2
428b9b43e84SPatrick Mooney #define	VNO_OP_GET_DIRTY	0x3
429b9b43e84SPatrick Mooney #define	VNO_OP_GET_TRACK_DIRTY	0x20
430b9b43e84SPatrick Mooney #define	VNO_OP_EN_TRACK_DIRTY	0x21
431b9b43e84SPatrick Mooney #define	VNO_OP_DIS_TRACK_DIRTY	0x22
432b9b43e84SPatrick Mooney #define	VNO_FLAG_BITMAP_IN	(1 << 30)
433b9b43e84SPatrick Mooney #define	VNO_FLAG_BITMAP_OUT	(1 << 31)
434b9b43e84SPatrick Mooney 
435d515dd77SPatrick Mooney /* Current (arbitrary) max length for vm_data_xfer */
436d515dd77SPatrick Mooney #define VM_DATA_XFER_LIMIT	8192
437d515dd77SPatrick Mooney 
438d515dd77SPatrick Mooney #define	VDX_FLAG_READ_COPYIN	(1 << 0)
439d515dd77SPatrick Mooney #define	VDX_FLAG_WRITE_COPYOUT	(1 << 1)
440d515dd77SPatrick Mooney 
441d515dd77SPatrick Mooney #define	VDX_FLAGS_VALID		(VDX_FLAG_READ_COPYIN | VDX_FLAG_WRITE_COPYOUT)
442d515dd77SPatrick Mooney 
443d515dd77SPatrick Mooney struct vm_data_xfer {
444d515dd77SPatrick Mooney 	int		vdx_vcpuid;
445d515dd77SPatrick Mooney 	uint16_t	vdx_class;
446d515dd77SPatrick Mooney 	uint16_t	vdx_version;
447d515dd77SPatrick Mooney 	uint32_t	vdx_flags;
448d515dd77SPatrick Mooney 	uint32_t	vdx_len;
44954cf5b63SPatrick Mooney 	uint32_t	vdx_result_len;
450d515dd77SPatrick Mooney 	void		*vdx_data;
451d515dd77SPatrick Mooney };
452d515dd77SPatrick Mooney 
453578d9a56SPatrick Mooney struct vm_vcpu_cpuid_config {
454578d9a56SPatrick Mooney 	int		vvcc_vcpuid;
455578d9a56SPatrick Mooney 	uint32_t	vvcc_flags;
456578d9a56SPatrick Mooney 	uint32_t	vvcc_nent;
457578d9a56SPatrick Mooney 	uint32_t	_pad;
458578d9a56SPatrick Mooney 	void		*vvcc_entries;
459578d9a56SPatrick Mooney };
460578d9a56SPatrick Mooney 
461578d9a56SPatrick Mooney /* Query the computed legacy cpuid value for a vcpuid with VM_LEGACY_CPUID */
462578d9a56SPatrick Mooney struct vm_legacy_cpuid {
463578d9a56SPatrick Mooney 	int		vlc_vcpuid;
464578d9a56SPatrick Mooney 	uint32_t	vlc_eax;
465578d9a56SPatrick Mooney 	uint32_t	vlc_ebx;
466578d9a56SPatrick Mooney 	uint32_t	vlc_ecx;
467578d9a56SPatrick Mooney 	uint32_t	vlc_edx;
468578d9a56SPatrick Mooney };
469578d9a56SPatrick Mooney 
4703466010bSPatrick Mooney /*
4713466010bSPatrick Mooney  * VMM Interface Version
4723466010bSPatrick Mooney  *
4733466010bSPatrick Mooney  * Despite the fact that the kernel interface to bhyve is explicitly considered
4743466010bSPatrick Mooney  * Private, there are out-of-gate consumers which utilize it.  While they assume
4753466010bSPatrick Mooney  * the risk of any breakage incurred by changes to bhyve, we can at least try to
4763466010bSPatrick Mooney  * make it easier to detect changes by exposing a "version" of the interface.
4773466010bSPatrick Mooney  * It can also be used by the in-gate userland to detect if packaging updates
4783466010bSPatrick Mooney  * somehow result in the userland and kernel falling out of sync.
4793466010bSPatrick Mooney  *
4803466010bSPatrick Mooney  * There are no established criteria for the magnitude of change which requires
4813466010bSPatrick Mooney  * this version to be incremented, and maintenance of it is considered a
4823466010bSPatrick Mooney  * best-effort activity.  Nothing is to be inferred about the magnitude of a
4833466010bSPatrick Mooney  * change when the version is modified.  It follows no rules like semver.
4843466010bSPatrick Mooney  */
485*09ea9c53SPatrick Mooney #define	VMM_CURRENT_INTERFACE_VERSION	18
4863466010bSPatrick Mooney 
4873466010bSPatrick Mooney 
4887c8c0b82SPatrick Mooney #define	VMMCTL_IOC_BASE		(('V' << 16) | ('M' << 8))
4897c8c0b82SPatrick Mooney #define	VMM_IOC_BASE		(('v' << 16) | ('m' << 8))
4907c8c0b82SPatrick Mooney #define	VMM_LOCK_IOC_BASE	(('v' << 16) | ('l' << 8))
4917c8c0b82SPatrick Mooney #define	VMM_CPU_IOC_BASE	(('v' << 16) | ('p' << 8))
4927c8c0b82SPatrick Mooney 
4937c8c0b82SPatrick Mooney /* Operations performed on the vmmctl device */
4947c8c0b82SPatrick Mooney #define	VMM_CREATE_VM		(VMMCTL_IOC_BASE | 0x01)
4957c8c0b82SPatrick Mooney #define	VMM_DESTROY_VM		(VMMCTL_IOC_BASE | 0x02)
4967c8c0b82SPatrick Mooney #define	VMM_VM_SUPPORTED	(VMMCTL_IOC_BASE | 0x03)
4973466010bSPatrick Mooney #define	VMM_INTERFACE_VERSION	(VMMCTL_IOC_BASE | 0x04)
498e760f150SPatrick Mooney #define	VMM_CHECK_IOMMU		(VMMCTL_IOC_BASE | 0x05)
4997c8c0b82SPatrick Mooney 
5007c8c0b82SPatrick Mooney #define	VMM_RESV_QUERY		(VMMCTL_IOC_BASE | 0x10)
5016bba8b59SPatrick Mooney #define	VMM_RESV_SET_TARGET	(VMMCTL_IOC_BASE | 0x11)
5027c8c0b82SPatrick Mooney 
5037c8c0b82SPatrick Mooney /* Operations performed in the context of a given vCPU */
5047c8c0b82SPatrick Mooney #define	VM_RUN				(VMM_CPU_IOC_BASE | 0x01)
5057c8c0b82SPatrick Mooney #define	VM_SET_REGISTER			(VMM_CPU_IOC_BASE | 0x02)
5067c8c0b82SPatrick Mooney #define	VM_GET_REGISTER			(VMM_CPU_IOC_BASE | 0x03)
5077c8c0b82SPatrick Mooney #define	VM_SET_SEGMENT_DESCRIPTOR	(VMM_CPU_IOC_BASE | 0x04)
5087c8c0b82SPatrick Mooney #define	VM_GET_SEGMENT_DESCRIPTOR	(VMM_CPU_IOC_BASE | 0x05)
5097c8c0b82SPatrick Mooney #define	VM_SET_REGISTER_SET		(VMM_CPU_IOC_BASE | 0x06)
5107c8c0b82SPatrick Mooney #define	VM_GET_REGISTER_SET		(VMM_CPU_IOC_BASE | 0x07)
5117c8c0b82SPatrick Mooney #define	VM_INJECT_EXCEPTION		(VMM_CPU_IOC_BASE | 0x08)
5127c8c0b82SPatrick Mooney #define	VM_SET_CAPABILITY		(VMM_CPU_IOC_BASE | 0x09)
5137c8c0b82SPatrick Mooney #define	VM_GET_CAPABILITY		(VMM_CPU_IOC_BASE | 0x0a)
5147c8c0b82SPatrick Mooney #define	VM_PPTDEV_MSI			(VMM_CPU_IOC_BASE | 0x0b)
5157c8c0b82SPatrick Mooney #define	VM_PPTDEV_MSIX			(VMM_CPU_IOC_BASE | 0x0c)
5167c8c0b82SPatrick Mooney #define	VM_SET_X2APIC_STATE		(VMM_CPU_IOC_BASE | 0x0d)
5177c8c0b82SPatrick Mooney #define	VM_GLA2GPA			(VMM_CPU_IOC_BASE | 0x0e)
5187c8c0b82SPatrick Mooney #define	VM_GLA2GPA_NOFAULT		(VMM_CPU_IOC_BASE | 0x0f)
5197c8c0b82SPatrick Mooney #define	VM_ACTIVATE_CPU			(VMM_CPU_IOC_BASE | 0x10)
5207c8c0b82SPatrick Mooney #define	VM_SET_INTINFO			(VMM_CPU_IOC_BASE | 0x11)
5217c8c0b82SPatrick Mooney #define	VM_GET_INTINFO			(VMM_CPU_IOC_BASE | 0x12)
5227c8c0b82SPatrick Mooney #define	VM_RESTART_INSTRUCTION		(VMM_CPU_IOC_BASE | 0x13)
5237c8c0b82SPatrick Mooney #define	VM_SET_KERNEMU_DEV		(VMM_CPU_IOC_BASE | 0x14)
5247c8c0b82SPatrick Mooney #define	VM_GET_KERNEMU_DEV		(VMM_CPU_IOC_BASE | 0x15)
5257c8c0b82SPatrick Mooney #define	VM_RESET_CPU			(VMM_CPU_IOC_BASE | 0x16)
5267c8c0b82SPatrick Mooney #define	VM_GET_RUN_STATE		(VMM_CPU_IOC_BASE | 0x17)
5277c8c0b82SPatrick Mooney #define	VM_SET_RUN_STATE		(VMM_CPU_IOC_BASE | 0x18)
5287c8c0b82SPatrick Mooney #define	VM_GET_FPU			(VMM_CPU_IOC_BASE | 0x19)
5297c8c0b82SPatrick Mooney #define	VM_SET_FPU			(VMM_CPU_IOC_BASE | 0x1a)
530578d9a56SPatrick Mooney #define	VM_GET_CPUID			(VMM_CPU_IOC_BASE | 0x1b)
531578d9a56SPatrick Mooney #define	VM_SET_CPUID			(VMM_CPU_IOC_BASE | 0x1c)
532578d9a56SPatrick Mooney #define	VM_LEGACY_CPUID			(VMM_CPU_IOC_BASE | 0x1d)
5337c8c0b82SPatrick Mooney 
5347c8c0b82SPatrick Mooney /* Operations requiring write-locking the VM */
5357c8c0b82SPatrick Mooney #define	VM_REINIT		(VMM_LOCK_IOC_BASE | 0x01)
5367c8c0b82SPatrick Mooney #define	VM_BIND_PPTDEV		(VMM_LOCK_IOC_BASE | 0x02)
5377c8c0b82SPatrick Mooney #define	VM_UNBIND_PPTDEV	(VMM_LOCK_IOC_BASE | 0x03)
5387c8c0b82SPatrick Mooney #define	VM_MAP_PPTDEV_MMIO	(VMM_LOCK_IOC_BASE | 0x04)
5397c8c0b82SPatrick Mooney #define	VM_ALLOC_MEMSEG		(VMM_LOCK_IOC_BASE | 0x05)
5407c8c0b82SPatrick Mooney #define	VM_MMAP_MEMSEG		(VMM_LOCK_IOC_BASE | 0x06)
5417c8c0b82SPatrick Mooney #define	VM_PMTMR_LOCATE		(VMM_LOCK_IOC_BASE | 0x07)
5427c8c0b82SPatrick Mooney #define	VM_MUNMAP_MEMSEG	(VMM_LOCK_IOC_BASE | 0x08)
5437c8c0b82SPatrick Mooney #define	VM_UNMAP_PPTDEV_MMIO	(VMM_LOCK_IOC_BASE | 0x09)
5442cac0506SPatrick Mooney #define	VM_PAUSE		(VMM_LOCK_IOC_BASE | 0x0a)
5452cac0506SPatrick Mooney #define	VM_RESUME		(VMM_LOCK_IOC_BASE | 0x0b)
5467c8c0b82SPatrick Mooney 
5477c8c0b82SPatrick Mooney #define	VM_WRLOCK_CYCLE		(VMM_LOCK_IOC_BASE | 0xff)
5487c8c0b82SPatrick Mooney 
5497c8c0b82SPatrick Mooney /* All other ioctls */
5507c8c0b82SPatrick Mooney #define	VM_GET_GPA_PMAP			(VMM_IOC_BASE | 0x01)
5517c8c0b82SPatrick Mooney #define	VM_GET_MEMSEG			(VMM_IOC_BASE | 0x02)
5527c8c0b82SPatrick Mooney #define	VM_MMAP_GETNEXT			(VMM_IOC_BASE | 0x03)
5537c8c0b82SPatrick Mooney 
5547c8c0b82SPatrick Mooney #define	VM_LAPIC_IRQ			(VMM_IOC_BASE | 0x04)
5557c8c0b82SPatrick Mooney #define	VM_LAPIC_LOCAL_IRQ		(VMM_IOC_BASE | 0x05)
5567c8c0b82SPatrick Mooney #define	VM_LAPIC_MSI			(VMM_IOC_BASE | 0x06)
5577c8c0b82SPatrick Mooney 
5587c8c0b82SPatrick Mooney #define	VM_IOAPIC_ASSERT_IRQ		(VMM_IOC_BASE | 0x07)
5597c8c0b82SPatrick Mooney #define	VM_IOAPIC_DEASSERT_IRQ		(VMM_IOC_BASE | 0x08)
5607c8c0b82SPatrick Mooney #define	VM_IOAPIC_PULSE_IRQ		(VMM_IOC_BASE | 0x09)
5617c8c0b82SPatrick Mooney 
5627c8c0b82SPatrick Mooney #define	VM_ISA_ASSERT_IRQ		(VMM_IOC_BASE | 0x0a)
5637c8c0b82SPatrick Mooney #define	VM_ISA_DEASSERT_IRQ		(VMM_IOC_BASE | 0x0b)
5647c8c0b82SPatrick Mooney #define	VM_ISA_PULSE_IRQ		(VMM_IOC_BASE | 0x0c)
5657c8c0b82SPatrick Mooney #define	VM_ISA_SET_IRQ_TRIGGER		(VMM_IOC_BASE | 0x0d)
5667c8c0b82SPatrick Mooney 
5677c8c0b82SPatrick Mooney #define	VM_RTC_WRITE			(VMM_IOC_BASE | 0x0e)
5687c8c0b82SPatrick Mooney #define	VM_RTC_READ			(VMM_IOC_BASE | 0x0f)
5697c8c0b82SPatrick Mooney #define	VM_RTC_SETTIME			(VMM_IOC_BASE | 0x10)
5707c8c0b82SPatrick Mooney #define	VM_RTC_GETTIME			(VMM_IOC_BASE | 0x11)
5717c8c0b82SPatrick Mooney 
5727c8c0b82SPatrick Mooney #define	VM_SUSPEND			(VMM_IOC_BASE | 0x12)
5737c8c0b82SPatrick Mooney 
5747c8c0b82SPatrick Mooney #define	VM_IOAPIC_PINCOUNT		(VMM_IOC_BASE | 0x13)
5757c8c0b82SPatrick Mooney #define	VM_GET_PPTDEV_LIMITS		(VMM_IOC_BASE | 0x14)
5767c8c0b82SPatrick Mooney #define	VM_GET_HPET_CAPABILITIES	(VMM_IOC_BASE | 0x15)
5777c8c0b82SPatrick Mooney 
5787c8c0b82SPatrick Mooney #define	VM_STATS_IOC			(VMM_IOC_BASE | 0x16)
5797c8c0b82SPatrick Mooney #define	VM_STAT_DESC			(VMM_IOC_BASE | 0x17)
5807c8c0b82SPatrick Mooney 
5817c8c0b82SPatrick Mooney #define	VM_INJECT_NMI			(VMM_IOC_BASE | 0x18)
5827c8c0b82SPatrick Mooney #define	VM_GET_X2APIC_STATE		(VMM_IOC_BASE | 0x19)
5837c8c0b82SPatrick Mooney #define	VM_SET_TOPOLOGY			(VMM_IOC_BASE | 0x1a)
5847c8c0b82SPatrick Mooney #define	VM_GET_TOPOLOGY			(VMM_IOC_BASE | 0x1b)
5857c8c0b82SPatrick Mooney #define	VM_GET_CPUS			(VMM_IOC_BASE | 0x1c)
5867c8c0b82SPatrick Mooney #define	VM_SUSPEND_CPU			(VMM_IOC_BASE | 0x1d)
5877c8c0b82SPatrick Mooney #define	VM_RESUME_CPU			(VMM_IOC_BASE | 0x1e)
5887c8c0b82SPatrick Mooney 
5897c8c0b82SPatrick Mooney #define	VM_PPTDEV_DISABLE_MSIX		(VMM_IOC_BASE | 0x1f)
5907c8c0b82SPatrick Mooney 
5917c8c0b82SPatrick Mooney /* Note: forces a barrier on a flush operation before returning. */
5927c8c0b82SPatrick Mooney #define	VM_TRACK_DIRTY_PAGES		(VMM_IOC_BASE | 0x20)
5937c8c0b82SPatrick Mooney #define	VM_DESC_FPU_AREA		(VMM_IOC_BASE | 0x21)
5947c8c0b82SPatrick Mooney 
595d515dd77SPatrick Mooney #define	VM_DATA_READ			(VMM_IOC_BASE | 0x22)
596d515dd77SPatrick Mooney #define	VM_DATA_WRITE			(VMM_IOC_BASE | 0x23)
597d515dd77SPatrick Mooney 
598aa39f6d0SPatrick Mooney #define	VM_SET_AUTODESTRUCT		(VMM_IOC_BASE | 0x24)
59942640e49SPatrick Mooney #define	VM_DESTROY_SELF			(VMM_IOC_BASE | 0x25)
60042640e49SPatrick Mooney #define	VM_DESTROY_PENDING		(VMM_IOC_BASE | 0x26)
601aa39f6d0SPatrick Mooney 
60272473353SPatrick Mooney #define	VM_VCPU_BARRIER			(VMM_IOC_BASE | 0x27)
603b9b43e84SPatrick Mooney #define	VM_NPT_OPERATION		(VMM_IOC_BASE | 0x28)
60472473353SPatrick Mooney 
6057c8c0b82SPatrick Mooney #define	VM_DEVMEM_GETOFFSET		(VMM_IOC_BASE | 0xff)
6067c8c0b82SPatrick Mooney 
6077c8c0b82SPatrick Mooney #define	VMM_CTL_DEV		"/dev/vmmctl"
6087c8c0b82SPatrick Mooney 
6097c8c0b82SPatrick Mooney #endif
610