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