16d65b43dSAaron LI /* 2bfc69df0SAaron LI * Copyright (c) 2018-2021 Maxime Villard, m00nbsd.net 36d65b43dSAaron LI * All rights reserved. 46d65b43dSAaron LI * 57f0e1ce2SAaron LI * This code is part of the NVMM hypervisor. 66d65b43dSAaron LI * 76d65b43dSAaron LI * Redistribution and use in source and binary forms, with or without 86d65b43dSAaron LI * modification, are permitted provided that the following conditions 96d65b43dSAaron LI * are met: 106d65b43dSAaron LI * 1. Redistributions of source code must retain the above copyright 116d65b43dSAaron LI * notice, this list of conditions and the following disclaimer. 126d65b43dSAaron LI * 2. Redistributions in binary form must reproduce the above copyright 136d65b43dSAaron LI * notice, this list of conditions and the following disclaimer in the 146d65b43dSAaron LI * documentation and/or other materials provided with the distribution. 156d65b43dSAaron LI * 167f0e1ce2SAaron LI * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 177f0e1ce2SAaron LI * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 187f0e1ce2SAaron LI * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 197f0e1ce2SAaron LI * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 207f0e1ce2SAaron LI * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 217f0e1ce2SAaron LI * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 227f0e1ce2SAaron LI * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 237f0e1ce2SAaron LI * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 247f0e1ce2SAaron LI * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 257f0e1ce2SAaron LI * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 267f0e1ce2SAaron LI * SUCH DAMAGE. 276d65b43dSAaron LI */ 286d65b43dSAaron LI 296d65b43dSAaron LI #ifndef _NVMM_INTERNAL_H_ 306d65b43dSAaron LI #define _NVMM_INTERNAL_H_ 316d65b43dSAaron LI 32634ba020SAaron LI #ifndef _KERNEL 33634ba020SAaron LI #error "This file should not be included by userland programs." 34634ba020SAaron LI #endif 35634ba020SAaron LI 3642862644SAaron LI #include "nvmm_os.h" 3742862644SAaron LI 386d65b43dSAaron LI #define NVMM_MAX_MACHINES 128 39ddb95be1SAaron LI #define NVMM_MAX_VCPUS 128 406d65b43dSAaron LI #define NVMM_MAX_HMAPPINGS 32 4122b29b22SMatthew Dillon 4222b29b22SMatthew Dillon #if defined(__NetBSD__) 4322b29b22SMatthew Dillon #define NVMM_MAX_RAM (128ULL * (1 << 30)) 4422b29b22SMatthew Dillon #elif defined(__DragonFly__) 4522b29b22SMatthew Dillon #define NVMM_MAX_RAM (127ULL * 1024ULL * (1 << 30)) 4622b29b22SMatthew Dillon #else 4722b29b22SMatthew Dillon #error "OS dependency for NVMM_MAX_RAM required" 4822b29b22SMatthew Dillon #endif 496d65b43dSAaron LI 50d8a75061SAaron LI #define NVMM_COMM_PAGE_SIZE \ 51d8a75061SAaron LI (roundup(sizeof(struct nvmm_comm_page), PAGE_SIZE)) 52d8a75061SAaron LI 536d65b43dSAaron LI struct nvmm_owner { 546d65b43dSAaron LI pid_t pid; 556d65b43dSAaron LI }; 566d65b43dSAaron LI 576d65b43dSAaron LI struct nvmm_cpu { 586d65b43dSAaron LI /* Shared. */ 596d65b43dSAaron LI bool present; 606d65b43dSAaron LI nvmm_cpuid_t cpuid; 6142862644SAaron LI os_mtx_t lock; 626d65b43dSAaron LI 636d65b43dSAaron LI /* Comm page. */ 646d65b43dSAaron LI struct nvmm_comm_page *comm; 656d65b43dSAaron LI 666d65b43dSAaron LI /* Last host CPU on which the VCPU ran. */ 676d65b43dSAaron LI int hcpu_last; 686d65b43dSAaron LI 696d65b43dSAaron LI /* Implementation-specific. */ 706d65b43dSAaron LI void *cpudata; 716d65b43dSAaron LI }; 726d65b43dSAaron LI 736d65b43dSAaron LI struct nvmm_hmapping { 746d65b43dSAaron LI bool present; 756d65b43dSAaron LI uintptr_t hva; 766d65b43dSAaron LI size_t size; 7742862644SAaron LI os_vmobj_t *vmobj; 786d65b43dSAaron LI }; 796d65b43dSAaron LI 806d65b43dSAaron LI struct nvmm_machine { 816d65b43dSAaron LI bool present; 826d65b43dSAaron LI nvmm_machid_t machid; 836d65b43dSAaron LI time_t time; 846d65b43dSAaron LI struct nvmm_owner *owner; 8542862644SAaron LI os_rwl_t lock; 866d65b43dSAaron LI 876d65b43dSAaron LI /* Comm */ 8842862644SAaron LI os_vmobj_t *commvmobj; 896d65b43dSAaron LI 906d65b43dSAaron LI /* Kernel */ 916d65b43dSAaron LI struct vmspace *vm; 926d65b43dSAaron LI gpaddr_t gpa_begin; 936d65b43dSAaron LI gpaddr_t gpa_end; 946d65b43dSAaron LI 956d65b43dSAaron LI /* Host Mappings */ 966d65b43dSAaron LI struct nvmm_hmapping hmap[NVMM_MAX_HMAPPINGS]; 976d65b43dSAaron LI 986d65b43dSAaron LI /* CPU */ 996d65b43dSAaron LI volatile unsigned int ncpus; 1006d65b43dSAaron LI struct nvmm_cpu cpus[NVMM_MAX_VCPUS]; 1016d65b43dSAaron LI 1026d65b43dSAaron LI /* Implementation-specific */ 1036d65b43dSAaron LI void *machdata; 1046d65b43dSAaron LI }; 1056d65b43dSAaron LI 1066d65b43dSAaron LI struct nvmm_impl { 1076d65b43dSAaron LI const char *name; 1086d65b43dSAaron LI bool (*ident)(void); 1096d65b43dSAaron LI void (*init)(void); 1106d65b43dSAaron LI void (*fini)(void); 1116d65b43dSAaron LI void (*capability)(struct nvmm_capability *); 1126d65b43dSAaron LI 1136d65b43dSAaron LI size_t mach_conf_max; 1146d65b43dSAaron LI const size_t *mach_conf_sizes; 1156d65b43dSAaron LI 1166d65b43dSAaron LI size_t vcpu_conf_max; 1176d65b43dSAaron LI const size_t *vcpu_conf_sizes; 1186d65b43dSAaron LI 1196d65b43dSAaron LI size_t state_size; 1206d65b43dSAaron LI 1216d65b43dSAaron LI void (*machine_create)(struct nvmm_machine *); 1226d65b43dSAaron LI void (*machine_destroy)(struct nvmm_machine *); 1236d65b43dSAaron LI int (*machine_configure)(struct nvmm_machine *, uint64_t, void *); 1246d65b43dSAaron LI 1256d65b43dSAaron LI int (*vcpu_create)(struct nvmm_machine *, struct nvmm_cpu *); 1266d65b43dSAaron LI void (*vcpu_destroy)(struct nvmm_machine *, struct nvmm_cpu *); 1276d65b43dSAaron LI int (*vcpu_configure)(struct nvmm_cpu *, uint64_t, void *); 1286d65b43dSAaron LI void (*vcpu_setstate)(struct nvmm_cpu *); 1296d65b43dSAaron LI void (*vcpu_getstate)(struct nvmm_cpu *); 1306d65b43dSAaron LI int (*vcpu_inject)(struct nvmm_cpu *); 1316d65b43dSAaron LI int (*vcpu_run)(struct nvmm_machine *, struct nvmm_cpu *, 1326d65b43dSAaron LI struct nvmm_vcpu_exit *); 1336d65b43dSAaron LI }; 1346d65b43dSAaron LI 1356d65b43dSAaron LI #if defined(__x86_64__) 1366d65b43dSAaron LI extern const struct nvmm_impl nvmm_x86_svm; 1376d65b43dSAaron LI extern const struct nvmm_impl nvmm_x86_vmx; 1386d65b43dSAaron LI #endif 1396d65b43dSAaron LI 140*002185e5SAaron LI extern struct nvmm_owner nvmm_root_owner; 141*002185e5SAaron LI extern volatile unsigned int nmachines; 142*002185e5SAaron LI extern const struct nvmm_impl *nvmm_impl; 143*002185e5SAaron LI 144*002185e5SAaron LI const struct nvmm_impl *nvmm_ident(void); 145*002185e5SAaron LI int nvmm_init(void); 146*002185e5SAaron LI void nvmm_fini(void); 147*002185e5SAaron LI int nvmm_ioctl(struct nvmm_owner *, unsigned long, void *); 148*002185e5SAaron LI void nvmm_kill_machines(struct nvmm_owner *); 149*002185e5SAaron LI 1506d65b43dSAaron LI #endif /* _NVMM_INTERNAL_H_ */ 151