1d3916eacSRuslan Bukin /* 2d3916eacSRuslan Bukin * SPDX-License-Identifier: BSD-2-Clause 3d3916eacSRuslan Bukin * 4d3916eacSRuslan Bukin * Copyright (c) 2015 Mihai Carabas <mihai.carabas@gmail.com> 5d3916eacSRuslan Bukin * Copyright (c) 2024 Ruslan Bukin <br@bsdpad.com> 6d3916eacSRuslan Bukin * 7d3916eacSRuslan Bukin * This software was developed by the University of Cambridge Computer 8d3916eacSRuslan Bukin * Laboratory (Department of Computer Science and Technology) under Innovate 9d3916eacSRuslan Bukin * UK project 105694, "Digital Security by Design (DSbD) Technology Platform 10d3916eacSRuslan Bukin * Prototype". 11d3916eacSRuslan Bukin * 12d3916eacSRuslan Bukin * Redistribution and use in source and binary forms, with or without 13d3916eacSRuslan Bukin * modification, are permitted provided that the following conditions 14d3916eacSRuslan Bukin * are met: 15d3916eacSRuslan Bukin * 1. Redistributions of source code must retain the above copyright 16d3916eacSRuslan Bukin * notice, this list of conditions and the following disclaimer. 17d3916eacSRuslan Bukin * 2. Redistributions in binary form must reproduce the above copyright 18d3916eacSRuslan Bukin * notice, this list of conditions and the following disclaimer in the 19d3916eacSRuslan Bukin * documentation and/or other materials provided with the distribution. 20d3916eacSRuslan Bukin * 21d3916eacSRuslan Bukin * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND 22d3916eacSRuslan Bukin * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23d3916eacSRuslan Bukin * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24d3916eacSRuslan Bukin * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE 25d3916eacSRuslan Bukin * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26d3916eacSRuslan Bukin * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27d3916eacSRuslan Bukin * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28d3916eacSRuslan Bukin * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29d3916eacSRuslan Bukin * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30d3916eacSRuslan Bukin * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31d3916eacSRuslan Bukin * SUCH DAMAGE. 32d3916eacSRuslan Bukin */ 33d3916eacSRuslan Bukin 34d3916eacSRuslan Bukin #ifndef _VMM_DEV_H_ 35d3916eacSRuslan Bukin #define _VMM_DEV_H_ 36d3916eacSRuslan Bukin 37*043999b1SMark Johnston #include <machine/vmm.h> 38*043999b1SMark Johnston 39d3916eacSRuslan Bukin struct vm_memmap { 40d3916eacSRuslan Bukin vm_paddr_t gpa; 41d3916eacSRuslan Bukin int segid; /* memory segment */ 42d3916eacSRuslan Bukin vm_ooffset_t segoff; /* offset into memory segment */ 43d3916eacSRuslan Bukin size_t len; /* mmap length */ 44d3916eacSRuslan Bukin int prot; /* RWX */ 45d3916eacSRuslan Bukin int flags; 46d3916eacSRuslan Bukin }; 47d3916eacSRuslan Bukin #define VM_MEMMAP_F_WIRED 0x01 48d3916eacSRuslan Bukin 49d3916eacSRuslan Bukin struct vm_munmap { 50d3916eacSRuslan Bukin vm_paddr_t gpa; 51d3916eacSRuslan Bukin size_t len; 52d3916eacSRuslan Bukin }; 53d3916eacSRuslan Bukin 54d3916eacSRuslan Bukin #define VM_MEMSEG_NAME(m) ((m)->name[0] != '\0' ? (m)->name : NULL) 55d3916eacSRuslan Bukin struct vm_memseg { 56d3916eacSRuslan Bukin int segid; 57d3916eacSRuslan Bukin size_t len; 58d3916eacSRuslan Bukin char name[VM_MAX_SUFFIXLEN + 1]; 59d3916eacSRuslan Bukin }; 60d3916eacSRuslan Bukin 61d3916eacSRuslan Bukin struct vm_register { 62d3916eacSRuslan Bukin int cpuid; 63d3916eacSRuslan Bukin int regnum; /* enum vm_reg_name */ 64d3916eacSRuslan Bukin uint64_t regval; 65d3916eacSRuslan Bukin }; 66d3916eacSRuslan Bukin 67d3916eacSRuslan Bukin struct vm_register_set { 68d3916eacSRuslan Bukin int cpuid; 69d3916eacSRuslan Bukin unsigned int count; 70d3916eacSRuslan Bukin const int *regnums; /* enum vm_reg_name */ 71d3916eacSRuslan Bukin uint64_t *regvals; 72d3916eacSRuslan Bukin }; 73d3916eacSRuslan Bukin 74d3916eacSRuslan Bukin struct vm_run { 75d3916eacSRuslan Bukin int cpuid; 76d3916eacSRuslan Bukin cpuset_t *cpuset; /* CPU set storage */ 77d3916eacSRuslan Bukin size_t cpusetsize; 78d3916eacSRuslan Bukin struct vm_exit *vm_exit; 79d3916eacSRuslan Bukin }; 80d3916eacSRuslan Bukin 81d3916eacSRuslan Bukin struct vm_exception { 82d3916eacSRuslan Bukin int cpuid; 83d3916eacSRuslan Bukin uint64_t scause; 84d3916eacSRuslan Bukin }; 85d3916eacSRuslan Bukin 86d3916eacSRuslan Bukin struct vm_msi { 87d3916eacSRuslan Bukin uint64_t msg; 88d3916eacSRuslan Bukin uint64_t addr; 89d3916eacSRuslan Bukin int bus; 90d3916eacSRuslan Bukin int slot; 91d3916eacSRuslan Bukin int func; 92d3916eacSRuslan Bukin }; 93d3916eacSRuslan Bukin 94d3916eacSRuslan Bukin struct vm_capability { 95d3916eacSRuslan Bukin int cpuid; 96d3916eacSRuslan Bukin enum vm_cap_type captype; 97d3916eacSRuslan Bukin int capval; 98d3916eacSRuslan Bukin int allcpus; 99d3916eacSRuslan Bukin }; 100d3916eacSRuslan Bukin 101d3916eacSRuslan Bukin #define MAX_VM_STATS 64 102d3916eacSRuslan Bukin struct vm_stats { 103d3916eacSRuslan Bukin int cpuid; /* in */ 104d3916eacSRuslan Bukin int index; /* in */ 105d3916eacSRuslan Bukin int num_entries; /* out */ 106d3916eacSRuslan Bukin struct timeval tv; 107d3916eacSRuslan Bukin uint64_t statbuf[MAX_VM_STATS]; 108d3916eacSRuslan Bukin }; 109d3916eacSRuslan Bukin struct vm_stat_desc { 110d3916eacSRuslan Bukin int index; /* in */ 111d3916eacSRuslan Bukin char desc[128]; /* out */ 112d3916eacSRuslan Bukin }; 113d3916eacSRuslan Bukin 114d3916eacSRuslan Bukin struct vm_suspend { 115d3916eacSRuslan Bukin enum vm_suspend_how how; 116d3916eacSRuslan Bukin }; 117d3916eacSRuslan Bukin 118d3916eacSRuslan Bukin struct vm_gla2gpa { 119d3916eacSRuslan Bukin int vcpuid; /* inputs */ 120d3916eacSRuslan Bukin int prot; /* PROT_READ or PROT_WRITE */ 121d3916eacSRuslan Bukin uint64_t gla; 122d3916eacSRuslan Bukin struct vm_guest_paging paging; 123d3916eacSRuslan Bukin int fault; /* outputs */ 124d3916eacSRuslan Bukin uint64_t gpa; 125d3916eacSRuslan Bukin }; 126d3916eacSRuslan Bukin 127d3916eacSRuslan Bukin struct vm_activate_cpu { 128d3916eacSRuslan Bukin int vcpuid; 129d3916eacSRuslan Bukin }; 130d3916eacSRuslan Bukin 131d3916eacSRuslan Bukin struct vm_cpuset { 132d3916eacSRuslan Bukin int which; 133d3916eacSRuslan Bukin int cpusetsize; 134d3916eacSRuslan Bukin cpuset_t *cpus; 135d3916eacSRuslan Bukin }; 136d3916eacSRuslan Bukin #define VM_ACTIVE_CPUS 0 137d3916eacSRuslan Bukin #define VM_SUSPENDED_CPUS 1 138d3916eacSRuslan Bukin #define VM_DEBUG_CPUS 2 139d3916eacSRuslan Bukin 140d3916eacSRuslan Bukin struct vm_aplic_descr { 141d3916eacSRuslan Bukin uint64_t mem_start; 142d3916eacSRuslan Bukin uint64_t mem_size; 143d3916eacSRuslan Bukin }; 144d3916eacSRuslan Bukin 145d3916eacSRuslan Bukin struct vm_irq { 146d3916eacSRuslan Bukin uint32_t irq; 147d3916eacSRuslan Bukin }; 148d3916eacSRuslan Bukin 149d3916eacSRuslan Bukin struct vm_cpu_topology { 150d3916eacSRuslan Bukin uint16_t sockets; 151d3916eacSRuslan Bukin uint16_t cores; 152d3916eacSRuslan Bukin uint16_t threads; 153d3916eacSRuslan Bukin uint16_t maxcpus; 154d3916eacSRuslan Bukin }; 155d3916eacSRuslan Bukin 156d3916eacSRuslan Bukin enum { 157d3916eacSRuslan Bukin /* general routines */ 158d3916eacSRuslan Bukin IOCNUM_ABIVERS = 0, 159d3916eacSRuslan Bukin IOCNUM_RUN = 1, 160d3916eacSRuslan Bukin IOCNUM_SET_CAPABILITY = 2, 161d3916eacSRuslan Bukin IOCNUM_GET_CAPABILITY = 3, 162d3916eacSRuslan Bukin IOCNUM_SUSPEND = 4, 163d3916eacSRuslan Bukin IOCNUM_REINIT = 5, 164d3916eacSRuslan Bukin 165d3916eacSRuslan Bukin /* memory apis */ 166d3916eacSRuslan Bukin IOCNUM_GET_GPA_PMAP = 12, 167d3916eacSRuslan Bukin IOCNUM_GLA2GPA_NOFAULT = 13, 168d3916eacSRuslan Bukin IOCNUM_ALLOC_MEMSEG = 14, 169d3916eacSRuslan Bukin IOCNUM_GET_MEMSEG = 15, 170d3916eacSRuslan Bukin IOCNUM_MMAP_MEMSEG = 16, 171d3916eacSRuslan Bukin IOCNUM_MMAP_GETNEXT = 17, 172d3916eacSRuslan Bukin IOCNUM_MUNMAP_MEMSEG = 18, 173d3916eacSRuslan Bukin 174d3916eacSRuslan Bukin /* register/state accessors */ 175d3916eacSRuslan Bukin IOCNUM_SET_REGISTER = 20, 176d3916eacSRuslan Bukin IOCNUM_GET_REGISTER = 21, 177d3916eacSRuslan Bukin IOCNUM_SET_REGISTER_SET = 24, 178d3916eacSRuslan Bukin IOCNUM_GET_REGISTER_SET = 25, 179d3916eacSRuslan Bukin 180d3916eacSRuslan Bukin /* statistics */ 181d3916eacSRuslan Bukin IOCNUM_VM_STATS = 50, 182d3916eacSRuslan Bukin IOCNUM_VM_STAT_DESC = 51, 183d3916eacSRuslan Bukin 184d3916eacSRuslan Bukin /* CPU Topology */ 185d3916eacSRuslan Bukin IOCNUM_SET_TOPOLOGY = 63, 186d3916eacSRuslan Bukin IOCNUM_GET_TOPOLOGY = 64, 187d3916eacSRuslan Bukin 188d3916eacSRuslan Bukin /* interrupt injection */ 189d3916eacSRuslan Bukin IOCNUM_ASSERT_IRQ = 80, 190d3916eacSRuslan Bukin IOCNUM_DEASSERT_IRQ = 81, 191d3916eacSRuslan Bukin IOCNUM_RAISE_MSI = 82, 192d3916eacSRuslan Bukin IOCNUM_INJECT_EXCEPTION = 83, 193d3916eacSRuslan Bukin 194d3916eacSRuslan Bukin /* vm_cpuset */ 195d3916eacSRuslan Bukin IOCNUM_ACTIVATE_CPU = 90, 196d3916eacSRuslan Bukin IOCNUM_GET_CPUSET = 91, 197d3916eacSRuslan Bukin IOCNUM_SUSPEND_CPU = 92, 198d3916eacSRuslan Bukin IOCNUM_RESUME_CPU = 93, 199d3916eacSRuslan Bukin 200d3916eacSRuslan Bukin /* vm_attach_aplic */ 201d3916eacSRuslan Bukin IOCNUM_ATTACH_APLIC = 110, 202d3916eacSRuslan Bukin }; 203d3916eacSRuslan Bukin 204d3916eacSRuslan Bukin #define VM_RUN \ 205d3916eacSRuslan Bukin _IOWR('v', IOCNUM_RUN, struct vm_run) 206d3916eacSRuslan Bukin #define VM_SUSPEND \ 207d3916eacSRuslan Bukin _IOW('v', IOCNUM_SUSPEND, struct vm_suspend) 208d3916eacSRuslan Bukin #define VM_REINIT \ 209d3916eacSRuslan Bukin _IO('v', IOCNUM_REINIT) 210d3916eacSRuslan Bukin #define VM_ALLOC_MEMSEG \ 211d3916eacSRuslan Bukin _IOW('v', IOCNUM_ALLOC_MEMSEG, struct vm_memseg) 212d3916eacSRuslan Bukin #define VM_GET_MEMSEG \ 213d3916eacSRuslan Bukin _IOWR('v', IOCNUM_GET_MEMSEG, struct vm_memseg) 214d3916eacSRuslan Bukin #define VM_MMAP_MEMSEG \ 215d3916eacSRuslan Bukin _IOW('v', IOCNUM_MMAP_MEMSEG, struct vm_memmap) 216d3916eacSRuslan Bukin #define VM_MMAP_GETNEXT \ 217d3916eacSRuslan Bukin _IOWR('v', IOCNUM_MMAP_GETNEXT, struct vm_memmap) 218d3916eacSRuslan Bukin #define VM_MUNMAP_MEMSEG \ 219d3916eacSRuslan Bukin _IOW('v', IOCNUM_MUNMAP_MEMSEG, struct vm_munmap) 220d3916eacSRuslan Bukin #define VM_SET_REGISTER \ 221d3916eacSRuslan Bukin _IOW('v', IOCNUM_SET_REGISTER, struct vm_register) 222d3916eacSRuslan Bukin #define VM_GET_REGISTER \ 223d3916eacSRuslan Bukin _IOWR('v', IOCNUM_GET_REGISTER, struct vm_register) 224d3916eacSRuslan Bukin #define VM_SET_REGISTER_SET \ 225d3916eacSRuslan Bukin _IOW('v', IOCNUM_SET_REGISTER_SET, struct vm_register_set) 226d3916eacSRuslan Bukin #define VM_GET_REGISTER_SET \ 227d3916eacSRuslan Bukin _IOWR('v', IOCNUM_GET_REGISTER_SET, struct vm_register_set) 228d3916eacSRuslan Bukin #define VM_SET_CAPABILITY \ 229d3916eacSRuslan Bukin _IOW('v', IOCNUM_SET_CAPABILITY, struct vm_capability) 230d3916eacSRuslan Bukin #define VM_GET_CAPABILITY \ 231d3916eacSRuslan Bukin _IOWR('v', IOCNUM_GET_CAPABILITY, struct vm_capability) 232d3916eacSRuslan Bukin #define VM_STATS \ 233d3916eacSRuslan Bukin _IOWR('v', IOCNUM_VM_STATS, struct vm_stats) 234d3916eacSRuslan Bukin #define VM_STAT_DESC \ 235d3916eacSRuslan Bukin _IOWR('v', IOCNUM_VM_STAT_DESC, struct vm_stat_desc) 236d3916eacSRuslan Bukin #define VM_ASSERT_IRQ \ 237d3916eacSRuslan Bukin _IOW('v', IOCNUM_ASSERT_IRQ, struct vm_irq) 238d3916eacSRuslan Bukin #define VM_DEASSERT_IRQ \ 239d3916eacSRuslan Bukin _IOW('v', IOCNUM_DEASSERT_IRQ, struct vm_irq) 240d3916eacSRuslan Bukin #define VM_RAISE_MSI \ 241d3916eacSRuslan Bukin _IOW('v', IOCNUM_RAISE_MSI, struct vm_msi) 242d3916eacSRuslan Bukin #define VM_INJECT_EXCEPTION \ 243d3916eacSRuslan Bukin _IOW('v', IOCNUM_INJECT_EXCEPTION, struct vm_exception) 244d3916eacSRuslan Bukin #define VM_SET_TOPOLOGY \ 245d3916eacSRuslan Bukin _IOW('v', IOCNUM_SET_TOPOLOGY, struct vm_cpu_topology) 246d3916eacSRuslan Bukin #define VM_GET_TOPOLOGY \ 247d3916eacSRuslan Bukin _IOR('v', IOCNUM_GET_TOPOLOGY, struct vm_cpu_topology) 248d3916eacSRuslan Bukin #define VM_GLA2GPA_NOFAULT \ 249d3916eacSRuslan Bukin _IOWR('v', IOCNUM_GLA2GPA_NOFAULT, struct vm_gla2gpa) 250d3916eacSRuslan Bukin #define VM_ACTIVATE_CPU \ 251d3916eacSRuslan Bukin _IOW('v', IOCNUM_ACTIVATE_CPU, struct vm_activate_cpu) 252d3916eacSRuslan Bukin #define VM_GET_CPUS \ 253d3916eacSRuslan Bukin _IOW('v', IOCNUM_GET_CPUSET, struct vm_cpuset) 254d3916eacSRuslan Bukin #define VM_SUSPEND_CPU \ 255d3916eacSRuslan Bukin _IOW('v', IOCNUM_SUSPEND_CPU, struct vm_activate_cpu) 256d3916eacSRuslan Bukin #define VM_RESUME_CPU \ 257d3916eacSRuslan Bukin _IOW('v', IOCNUM_RESUME_CPU, struct vm_activate_cpu) 258d3916eacSRuslan Bukin #define VM_ATTACH_APLIC \ 259d3916eacSRuslan Bukin _IOW('v', IOCNUM_ATTACH_APLIC, struct vm_aplic_descr) 260d3916eacSRuslan Bukin #endif 261