147e07394SAndrew Turner /* 247e07394SAndrew Turner * Copyright (C) 2015 Mihai Carabas <mihai.carabas@gmail.com> 347e07394SAndrew Turner * All rights reserved. 447e07394SAndrew Turner * 547e07394SAndrew Turner * Redistribution and use in source and binary forms, with or without 647e07394SAndrew Turner * modification, are permitted provided that the following conditions 747e07394SAndrew Turner * are met: 847e07394SAndrew Turner * 1. Redistributions of source code must retain the above copyright 947e07394SAndrew Turner * notice, this list of conditions and the following disclaimer. 1047e07394SAndrew Turner * 2. Redistributions in binary form must reproduce the above copyright 1147e07394SAndrew Turner * notice, this list of conditions and the following disclaimer in the 1247e07394SAndrew Turner * documentation and/or other materials provided with the distribution. 1347e07394SAndrew Turner * 1447e07394SAndrew Turner * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1547e07394SAndrew Turner * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1647e07394SAndrew Turner * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1747e07394SAndrew Turner * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE 1847e07394SAndrew Turner * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 1947e07394SAndrew Turner * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2047e07394SAndrew Turner * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2147e07394SAndrew Turner * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2247e07394SAndrew Turner * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2347e07394SAndrew Turner * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2447e07394SAndrew Turner * SUCH DAMAGE. 2547e07394SAndrew Turner */ 2647e07394SAndrew Turner 2747e07394SAndrew Turner #ifndef _VMM_DEV_H_ 2847e07394SAndrew Turner #define _VMM_DEV_H_ 2947e07394SAndrew Turner 3047e07394SAndrew Turner #ifdef _KERNEL 3147e07394SAndrew Turner void vmmdev_init(void); 3247e07394SAndrew Turner int vmmdev_cleanup(void); 3347e07394SAndrew Turner #endif 3447e07394SAndrew Turner 3547e07394SAndrew Turner struct vm_memmap { 3647e07394SAndrew Turner vm_paddr_t gpa; 3747e07394SAndrew Turner int segid; /* memory segment */ 3847e07394SAndrew Turner vm_ooffset_t segoff; /* offset into memory segment */ 3947e07394SAndrew Turner size_t len; /* mmap length */ 4047e07394SAndrew Turner int prot; /* RWX */ 4147e07394SAndrew Turner int flags; 4247e07394SAndrew Turner }; 4347e07394SAndrew Turner #define VM_MEMMAP_F_WIRED 0x01 4447e07394SAndrew Turner 4547e07394SAndrew Turner struct vm_munmap { 4647e07394SAndrew Turner vm_paddr_t gpa; 4747e07394SAndrew Turner size_t len; 4847e07394SAndrew Turner }; 4947e07394SAndrew Turner 5047e07394SAndrew Turner #define VM_MEMSEG_NAME(m) ((m)->name[0] != '\0' ? (m)->name : NULL) 5147e07394SAndrew Turner struct vm_memseg { 5247e07394SAndrew Turner int segid; 5347e07394SAndrew Turner size_t len; 5447e07394SAndrew Turner char name[VM_MAX_SUFFIXLEN + 1]; 5547e07394SAndrew Turner }; 5647e07394SAndrew Turner 5747e07394SAndrew Turner struct vm_register { 5847e07394SAndrew Turner int cpuid; 5947e07394SAndrew Turner int regnum; /* enum vm_reg_name */ 6047e07394SAndrew Turner uint64_t regval; 6147e07394SAndrew Turner }; 6247e07394SAndrew Turner 6347e07394SAndrew Turner struct vm_register_set { 6447e07394SAndrew Turner int cpuid; 6547e07394SAndrew Turner unsigned int count; 6647e07394SAndrew Turner const int *regnums; /* enum vm_reg_name */ 6747e07394SAndrew Turner uint64_t *regvals; 6847e07394SAndrew Turner }; 6947e07394SAndrew Turner 7047e07394SAndrew Turner struct vm_run { 7147e07394SAndrew Turner int cpuid; 7247e07394SAndrew Turner cpuset_t *cpuset; /* CPU set storage */ 7347e07394SAndrew Turner size_t cpusetsize; 7447e07394SAndrew Turner struct vm_exit *vm_exit; 7547e07394SAndrew Turner }; 7647e07394SAndrew Turner 7747e07394SAndrew Turner struct vm_exception { 7847e07394SAndrew Turner int cpuid; 7947e07394SAndrew Turner uint64_t esr; 8047e07394SAndrew Turner uint64_t far; 8147e07394SAndrew Turner }; 8247e07394SAndrew Turner 8347e07394SAndrew Turner struct vm_msi { 8447e07394SAndrew Turner uint64_t msg; 8547e07394SAndrew Turner uint64_t addr; 8647e07394SAndrew Turner int bus; 8747e07394SAndrew Turner int slot; 8847e07394SAndrew Turner int func; 8947e07394SAndrew Turner }; 9047e07394SAndrew Turner 9147e07394SAndrew Turner struct vm_capability { 9247e07394SAndrew Turner int cpuid; 9347e07394SAndrew Turner enum vm_cap_type captype; 9447e07394SAndrew Turner int capval; 9547e07394SAndrew Turner int allcpus; 9647e07394SAndrew Turner }; 9747e07394SAndrew Turner 9847e07394SAndrew Turner #define MAX_VM_STATS 64 9947e07394SAndrew Turner struct vm_stats { 10047e07394SAndrew Turner int cpuid; /* in */ 10147e07394SAndrew Turner int index; /* in */ 10247e07394SAndrew Turner int num_entries; /* out */ 10347e07394SAndrew Turner struct timeval tv; 10447e07394SAndrew Turner uint64_t statbuf[MAX_VM_STATS]; 10547e07394SAndrew Turner }; 10647e07394SAndrew Turner struct vm_stat_desc { 10747e07394SAndrew Turner int index; /* in */ 10847e07394SAndrew Turner char desc[128]; /* out */ 10947e07394SAndrew Turner }; 11047e07394SAndrew Turner 11147e07394SAndrew Turner struct vm_suspend { 11247e07394SAndrew Turner enum vm_suspend_how how; 11347e07394SAndrew Turner }; 11447e07394SAndrew Turner 11547e07394SAndrew Turner struct vm_gla2gpa { 11647e07394SAndrew Turner int vcpuid; /* inputs */ 11747e07394SAndrew Turner int prot; /* PROT_READ or PROT_WRITE */ 11847e07394SAndrew Turner uint64_t gla; 11947e07394SAndrew Turner struct vm_guest_paging paging; 12047e07394SAndrew Turner int fault; /* outputs */ 12147e07394SAndrew Turner uint64_t gpa; 12247e07394SAndrew Turner }; 12347e07394SAndrew Turner 12447e07394SAndrew Turner struct vm_activate_cpu { 12547e07394SAndrew Turner int vcpuid; 12647e07394SAndrew Turner }; 12747e07394SAndrew Turner 12847e07394SAndrew Turner struct vm_cpuset { 12947e07394SAndrew Turner int which; 13047e07394SAndrew Turner int cpusetsize; 13147e07394SAndrew Turner cpuset_t *cpus; 13247e07394SAndrew Turner }; 13347e07394SAndrew Turner #define VM_ACTIVE_CPUS 0 13447e07394SAndrew Turner #define VM_SUSPENDED_CPUS 1 13547e07394SAndrew Turner #define VM_DEBUG_CPUS 2 13647e07394SAndrew Turner 13747e07394SAndrew Turner struct vm_vgic_version { 13847e07394SAndrew Turner u_int version; 13947e07394SAndrew Turner u_int flags; 14047e07394SAndrew Turner }; 14147e07394SAndrew Turner 14247e07394SAndrew Turner struct vm_vgic_descr { 14347e07394SAndrew Turner struct vm_vgic_version ver; 14447e07394SAndrew Turner union { 14547e07394SAndrew Turner struct { 14647e07394SAndrew Turner uint64_t dist_start; 14747e07394SAndrew Turner uint64_t dist_size; 14847e07394SAndrew Turner uint64_t redist_start; 14947e07394SAndrew Turner uint64_t redist_size; 15047e07394SAndrew Turner } v3_regs; 15147e07394SAndrew Turner }; 15247e07394SAndrew Turner }; 15347e07394SAndrew Turner 15447e07394SAndrew Turner struct vm_irq { 15547e07394SAndrew Turner uint32_t irq; 15647e07394SAndrew Turner }; 15747e07394SAndrew Turner 15847e07394SAndrew Turner struct vm_cpu_topology { 15947e07394SAndrew Turner uint16_t sockets; 16047e07394SAndrew Turner uint16_t cores; 16147e07394SAndrew Turner uint16_t threads; 16247e07394SAndrew Turner uint16_t maxcpus; 16347e07394SAndrew Turner }; 16447e07394SAndrew Turner 16547e07394SAndrew Turner enum { 16647e07394SAndrew Turner /* general routines */ 16747e07394SAndrew Turner IOCNUM_ABIVERS = 0, 16847e07394SAndrew Turner IOCNUM_RUN = 1, 16947e07394SAndrew Turner IOCNUM_SET_CAPABILITY = 2, 17047e07394SAndrew Turner IOCNUM_GET_CAPABILITY = 3, 17147e07394SAndrew Turner IOCNUM_SUSPEND = 4, 17247e07394SAndrew Turner IOCNUM_REINIT = 5, 17347e07394SAndrew Turner 17447e07394SAndrew Turner /* memory apis */ 17547e07394SAndrew Turner IOCNUM_GET_GPA_PMAP = 12, 17647e07394SAndrew Turner IOCNUM_GLA2GPA_NOFAULT = 13, 17747e07394SAndrew Turner IOCNUM_ALLOC_MEMSEG = 14, 17847e07394SAndrew Turner IOCNUM_GET_MEMSEG = 15, 17947e07394SAndrew Turner IOCNUM_MMAP_MEMSEG = 16, 18047e07394SAndrew Turner IOCNUM_MMAP_GETNEXT = 17, 18147e07394SAndrew Turner IOCNUM_MUNMAP_MEMSEG = 18, 18247e07394SAndrew Turner 18347e07394SAndrew Turner /* register/state accessors */ 18447e07394SAndrew Turner IOCNUM_SET_REGISTER = 20, 18547e07394SAndrew Turner IOCNUM_GET_REGISTER = 21, 18647e07394SAndrew Turner IOCNUM_SET_REGISTER_SET = 24, 18747e07394SAndrew Turner IOCNUM_GET_REGISTER_SET = 25, 18847e07394SAndrew Turner 18947e07394SAndrew Turner /* statistics */ 19047e07394SAndrew Turner IOCNUM_VM_STATS = 50, 19147e07394SAndrew Turner IOCNUM_VM_STAT_DESC = 51, 19247e07394SAndrew Turner 19347e07394SAndrew Turner /* CPU Topology */ 19447e07394SAndrew Turner IOCNUM_SET_TOPOLOGY = 63, 19547e07394SAndrew Turner IOCNUM_GET_TOPOLOGY = 64, 19647e07394SAndrew Turner 19747e07394SAndrew Turner /* interrupt injection */ 19847e07394SAndrew Turner IOCNUM_ASSERT_IRQ = 80, 19947e07394SAndrew Turner IOCNUM_DEASSERT_IRQ = 81, 20047e07394SAndrew Turner IOCNUM_RAISE_MSI = 82, 20147e07394SAndrew Turner IOCNUM_INJECT_EXCEPTION = 83, 20247e07394SAndrew Turner 20347e07394SAndrew Turner /* vm_cpuset */ 20447e07394SAndrew Turner IOCNUM_ACTIVATE_CPU = 90, 20547e07394SAndrew Turner IOCNUM_GET_CPUSET = 91, 20647e07394SAndrew Turner IOCNUM_SUSPEND_CPU = 92, 20747e07394SAndrew Turner IOCNUM_RESUME_CPU = 93, 20847e07394SAndrew Turner 20947e07394SAndrew Turner /* vm_attach_vgic */ 21047e07394SAndrew Turner IOCNUM_GET_VGIC_VERSION = 110, 21147e07394SAndrew Turner IOCNUM_ATTACH_VGIC = 111, 21247e07394SAndrew Turner }; 21347e07394SAndrew Turner 21447e07394SAndrew Turner #define VM_RUN \ 21547e07394SAndrew Turner _IOWR('v', IOCNUM_RUN, struct vm_run) 21647e07394SAndrew Turner #define VM_SUSPEND \ 21747e07394SAndrew Turner _IOW('v', IOCNUM_SUSPEND, struct vm_suspend) 21847e07394SAndrew Turner #define VM_REINIT \ 21947e07394SAndrew Turner _IO('v', IOCNUM_REINIT) 22047e07394SAndrew Turner #define VM_ALLOC_MEMSEG \ 22147e07394SAndrew Turner _IOW('v', IOCNUM_ALLOC_MEMSEG, struct vm_memseg) 22247e07394SAndrew Turner #define VM_GET_MEMSEG \ 22347e07394SAndrew Turner _IOWR('v', IOCNUM_GET_MEMSEG, struct vm_memseg) 22447e07394SAndrew Turner #define VM_MMAP_MEMSEG \ 22547e07394SAndrew Turner _IOW('v', IOCNUM_MMAP_MEMSEG, struct vm_memmap) 22647e07394SAndrew Turner #define VM_MMAP_GETNEXT \ 22747e07394SAndrew Turner _IOWR('v', IOCNUM_MMAP_GETNEXT, struct vm_memmap) 22847e07394SAndrew Turner #define VM_MUNMAP_MEMSEG \ 22947e07394SAndrew Turner _IOW('v', IOCNUM_MUNMAP_MEMSEG, struct vm_munmap) 23047e07394SAndrew Turner #define VM_SET_REGISTER \ 23147e07394SAndrew Turner _IOW('v', IOCNUM_SET_REGISTER, struct vm_register) 23247e07394SAndrew Turner #define VM_GET_REGISTER \ 23347e07394SAndrew Turner _IOWR('v', IOCNUM_GET_REGISTER, struct vm_register) 23447e07394SAndrew Turner #define VM_SET_REGISTER_SET \ 23547e07394SAndrew Turner _IOW('v', IOCNUM_SET_REGISTER_SET, struct vm_register_set) 23647e07394SAndrew Turner #define VM_GET_REGISTER_SET \ 23747e07394SAndrew Turner _IOWR('v', IOCNUM_GET_REGISTER_SET, struct vm_register_set) 23847e07394SAndrew Turner #define VM_SET_CAPABILITY \ 23947e07394SAndrew Turner _IOW('v', IOCNUM_SET_CAPABILITY, struct vm_capability) 24047e07394SAndrew Turner #define VM_GET_CAPABILITY \ 24147e07394SAndrew Turner _IOWR('v', IOCNUM_GET_CAPABILITY, struct vm_capability) 24247e07394SAndrew Turner #define VM_STATS \ 24347e07394SAndrew Turner _IOWR('v', IOCNUM_VM_STATS, struct vm_stats) 24447e07394SAndrew Turner #define VM_STAT_DESC \ 24547e07394SAndrew Turner _IOWR('v', IOCNUM_VM_STAT_DESC, struct vm_stat_desc) 24647e07394SAndrew Turner #define VM_ASSERT_IRQ \ 24747e07394SAndrew Turner _IOW('v', IOCNUM_ASSERT_IRQ, struct vm_irq) 24847e07394SAndrew Turner #define VM_DEASSERT_IRQ \ 24947e07394SAndrew Turner _IOW('v', IOCNUM_DEASSERT_IRQ, struct vm_irq) 25047e07394SAndrew Turner #define VM_RAISE_MSI \ 25147e07394SAndrew Turner _IOW('v', IOCNUM_RAISE_MSI, struct vm_msi) 25247e07394SAndrew Turner #define VM_INJECT_EXCEPTION \ 25347e07394SAndrew Turner _IOW('v', IOCNUM_INJECT_EXCEPTION, struct vm_exception) 25447e07394SAndrew Turner #define VM_SET_TOPOLOGY \ 25547e07394SAndrew Turner _IOW('v', IOCNUM_SET_TOPOLOGY, struct vm_cpu_topology) 25647e07394SAndrew Turner #define VM_GET_TOPOLOGY \ 25747e07394SAndrew Turner _IOR('v', IOCNUM_GET_TOPOLOGY, struct vm_cpu_topology) 25847e07394SAndrew Turner #define VM_GLA2GPA_NOFAULT \ 25947e07394SAndrew Turner _IOWR('v', IOCNUM_GLA2GPA_NOFAULT, struct vm_gla2gpa) 26047e07394SAndrew Turner #define VM_ACTIVATE_CPU \ 26147e07394SAndrew Turner _IOW('v', IOCNUM_ACTIVATE_CPU, struct vm_activate_cpu) 26247e07394SAndrew Turner #define VM_GET_CPUS \ 26347e07394SAndrew Turner _IOW('v', IOCNUM_GET_CPUSET, struct vm_cpuset) 26447e07394SAndrew Turner #define VM_SUSPEND_CPU \ 26547e07394SAndrew Turner _IOW('v', IOCNUM_SUSPEND_CPU, struct vm_activate_cpu) 26647e07394SAndrew Turner #define VM_RESUME_CPU \ 26747e07394SAndrew Turner _IOW('v', IOCNUM_RESUME_CPU, struct vm_activate_cpu) 26847e07394SAndrew Turner #define VM_GET_VGIC_VERSION \ 26947e07394SAndrew Turner _IOR('v', IOCNUM_GET_VGIC_VERSION, struct vm_vgic_version) 27047e07394SAndrew Turner #define VM_ATTACH_VGIC \ 27147e07394SAndrew Turner _IOW('v', IOCNUM_ATTACH_VGIC, struct vm_vgic_descr) 27247e07394SAndrew Turner #endif 273