1 1.19 reinoud /* $NetBSD: nvmm.h,v 1.19 2021/04/06 08:40:17 reinoud Exp $ */ 2 1.1 maxv 3 1.1 maxv /* 4 1.18 maxv * Copyright (c) 2018-2020 Maxime Villard, m00nbsd.net 5 1.1 maxv * All rights reserved. 6 1.1 maxv * 7 1.18 maxv * This code is part of the NVMM hypervisor. 8 1.1 maxv * 9 1.1 maxv * Redistribution and use in source and binary forms, with or without 10 1.1 maxv * modification, are permitted provided that the following conditions 11 1.1 maxv * are met: 12 1.1 maxv * 1. Redistributions of source code must retain the above copyright 13 1.1 maxv * notice, this list of conditions and the following disclaimer. 14 1.1 maxv * 2. Redistributions in binary form must reproduce the above copyright 15 1.1 maxv * notice, this list of conditions and the following disclaimer in the 16 1.1 maxv * documentation and/or other materials provided with the distribution. 17 1.1 maxv * 18 1.18 maxv * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 19 1.18 maxv * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 20 1.18 maxv * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 21 1.18 maxv * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 22 1.18 maxv * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 23 1.18 maxv * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 24 1.18 maxv * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 25 1.18 maxv * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 26 1.18 maxv * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 27 1.18 maxv * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 28 1.18 maxv * SUCH DAMAGE. 29 1.1 maxv */ 30 1.1 maxv 31 1.1 maxv #ifndef _LIBNVMM_H_ 32 1.1 maxv #define _LIBNVMM_H_ 33 1.1 maxv 34 1.1 maxv #include <stdint.h> 35 1.1 maxv #include <stdbool.h> 36 1.1 maxv 37 1.1 maxv #include <dev/nvmm/nvmm.h> 38 1.1 maxv #include <dev/nvmm/nvmm_ioctl.h> 39 1.1 maxv 40 1.19 reinoud #define NVMM_USER_VERSION 2 41 1.19 reinoud 42 1.19 reinoud /* 43 1.19 reinoud * Version 1 - Initial release in NetBSD 9.0. 44 1.19 reinoud * Version 2 - Added nvmm_vcpu::stop. 45 1.19 reinoud */ 46 1.13 maxv 47 1.14 maxv struct nvmm_io; 48 1.14 maxv struct nvmm_mem; 49 1.1 maxv 50 1.14 maxv struct nvmm_assist_callbacks { 51 1.4 maxv void (*io)(struct nvmm_io *); 52 1.4 maxv void (*mem)(struct nvmm_mem *); 53 1.4 maxv }; 54 1.4 maxv 55 1.11 maxv struct nvmm_machine { 56 1.11 maxv nvmm_machid_t machid; 57 1.11 maxv struct nvmm_comm_page **pages; 58 1.11 maxv void *areas; /* opaque */ 59 1.11 maxv }; 60 1.11 maxv 61 1.12 maxv struct nvmm_vcpu { 62 1.12 maxv nvmm_cpuid_t cpuid; 63 1.14 maxv struct nvmm_assist_callbacks cbs; 64 1.12 maxv struct nvmm_vcpu_state *state; 65 1.13 maxv struct nvmm_vcpu_event *event; 66 1.13 maxv struct nvmm_vcpu_exit *exit; 67 1.19 reinoud volatile int *stop; 68 1.12 maxv }; 69 1.12 maxv 70 1.14 maxv struct nvmm_io { 71 1.14 maxv struct nvmm_machine *mach; 72 1.14 maxv struct nvmm_vcpu *vcpu; 73 1.17 maxv uint16_t port; 74 1.14 maxv bool in; 75 1.14 maxv size_t size; 76 1.14 maxv uint8_t *data; 77 1.14 maxv }; 78 1.14 maxv 79 1.14 maxv struct nvmm_mem { 80 1.14 maxv struct nvmm_machine *mach; 81 1.14 maxv struct nvmm_vcpu *vcpu; 82 1.14 maxv gpaddr_t gpa; 83 1.14 maxv bool write; 84 1.14 maxv size_t size; 85 1.14 maxv uint8_t *data; 86 1.14 maxv }; 87 1.14 maxv 88 1.14 maxv #define NVMM_VCPU_CONF_CALLBACKS NVMM_VCPU_CONF_LIBNVMM_BEGIN 89 1.11 maxv 90 1.1 maxv #define NVMM_PROT_READ 0x01 91 1.1 maxv #define NVMM_PROT_WRITE 0x02 92 1.1 maxv #define NVMM_PROT_EXEC 0x04 93 1.1 maxv #define NVMM_PROT_USER 0x08 94 1.1 maxv #define NVMM_PROT_ALL 0x0F 95 1.1 maxv typedef uint64_t nvmm_prot_t; 96 1.1 maxv 97 1.15 maxv int nvmm_init(void); 98 1.16 maxv int nvmm_root_init(void); 99 1.15 maxv 100 1.1 maxv int nvmm_capability(struct nvmm_capability *); 101 1.1 maxv 102 1.1 maxv int nvmm_machine_create(struct nvmm_machine *); 103 1.1 maxv int nvmm_machine_destroy(struct nvmm_machine *); 104 1.1 maxv int nvmm_machine_configure(struct nvmm_machine *, uint64_t, void *); 105 1.1 maxv 106 1.12 maxv int nvmm_vcpu_create(struct nvmm_machine *, nvmm_cpuid_t, struct nvmm_vcpu *); 107 1.12 maxv int nvmm_vcpu_destroy(struct nvmm_machine *, struct nvmm_vcpu *); 108 1.13 maxv int nvmm_vcpu_configure(struct nvmm_machine *, struct nvmm_vcpu *, uint64_t, 109 1.13 maxv void *); 110 1.12 maxv int nvmm_vcpu_setstate(struct nvmm_machine *, struct nvmm_vcpu *, uint64_t); 111 1.12 maxv int nvmm_vcpu_getstate(struct nvmm_machine *, struct nvmm_vcpu *, uint64_t); 112 1.12 maxv int nvmm_vcpu_inject(struct nvmm_machine *, struct nvmm_vcpu *); 113 1.12 maxv int nvmm_vcpu_run(struct nvmm_machine *, struct nvmm_vcpu *); 114 1.1 maxv 115 1.1 maxv int nvmm_gpa_map(struct nvmm_machine *, uintptr_t, gpaddr_t, size_t, int); 116 1.1 maxv int nvmm_gpa_unmap(struct nvmm_machine *, uintptr_t, gpaddr_t, size_t); 117 1.3 maxv int nvmm_hva_map(struct nvmm_machine *, uintptr_t, size_t); 118 1.3 maxv int nvmm_hva_unmap(struct nvmm_machine *, uintptr_t, size_t); 119 1.1 maxv 120 1.12 maxv int nvmm_gva_to_gpa(struct nvmm_machine *, struct nvmm_vcpu *, gvaddr_t, gpaddr_t *, 121 1.1 maxv nvmm_prot_t *); 122 1.7 maxv int nvmm_gpa_to_hva(struct nvmm_machine *, gpaddr_t, uintptr_t *, 123 1.7 maxv nvmm_prot_t *); 124 1.1 maxv 125 1.12 maxv int nvmm_assist_io(struct nvmm_machine *, struct nvmm_vcpu *); 126 1.12 maxv int nvmm_assist_mem(struct nvmm_machine *, struct nvmm_vcpu *); 127 1.4 maxv 128 1.8 maxv int nvmm_ctl(int, void *, size_t); 129 1.8 maxv 130 1.12 maxv int nvmm_vcpu_dump(struct nvmm_machine *, struct nvmm_vcpu *); 131 1.1 maxv 132 1.19 reinoud int nvmm_vcpu_stop(struct nvmm_vcpu *); 133 1.19 reinoud 134 1.1 maxv #endif /* _LIBNVMM_H_ */ 135