1 /* $OpenBSD: ldomctl.h,v 1.16 2022/10/06 21:35:52 kn Exp $ */ 2 3 /* 4 * Copyright (c) 2012 Mark Kettenis 5 * 6 * Permission to use, copy, modify, and distribute this software for any 7 * purpose with or without fee is hereby granted, provided that the above 8 * copyright notice and this permission notice appear in all copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17 */ 18 19 #define LDOMCTL_CU "/usr/bin/cu" 20 21 struct core; 22 struct guest; 23 24 struct console { 25 uint64_t ino; 26 uint64_t resource_id; 27 uint64_t uartbase; 28 29 struct guest *guest; 30 struct ldc_endpoint *client_endpoint; 31 struct ldc_endpoint *server_endpoint; 32 struct md_node *hv_node; 33 TAILQ_ENTRY(console) link; 34 }; 35 36 struct cpu { 37 uint64_t pid, vid, gid, partid; 38 uint64_t resource_id; 39 40 struct guest *guest; 41 struct md_node *hv_node; 42 struct core *core; 43 TAILQ_ENTRY(cpu) link; 44 }; 45 46 struct device { 47 uint64_t gid; 48 uint64_t cfghandle; 49 uint64_t resource_id; 50 uint64_t rcid; 51 52 int virtual; 53 54 uint64_t num_msi_eqs; 55 uint64_t num_msis; 56 uint64_t msi_ranges[2]; 57 uint64_t num_vpci; 58 59 uint64_t msi_eqs_per_vpci; 60 uint64_t msis_per_vpci; 61 uint64_t msi_base; 62 63 struct guest *guest; 64 struct md_node *hv_node; 65 TAILQ_ENTRY(device) link; 66 }; 67 68 struct subdevice { 69 const char *path; 70 TAILQ_ENTRY(subdevice) link; 71 }; 72 73 struct rootcomplex { 74 uint64_t num_msi_eqs; 75 uint64_t num_msis; 76 const void *msi_ranges; 77 int num_msi_ranges; 78 const void *vdma_ranges; 79 int num_vdma_ranges; 80 uint64_t cfghandle; 81 const char *path; 82 TAILQ_ENTRY(rootcomplex) link; 83 }; 84 85 struct mblock { 86 uint64_t membase; 87 uint64_t memsize; 88 uint64_t realbase; 89 uint64_t resource_id; 90 91 struct guest *guest; 92 struct md_node *hv_node; 93 TAILQ_ENTRY(mblock) link; 94 }; 95 96 struct ldc_endpoint { 97 uint64_t target_type; 98 uint64_t target_guest; 99 uint64_t channel; 100 uint64_t target_channel; 101 uint64_t tx_ino; 102 uint64_t rx_ino; 103 uint64_t resource_id; 104 uint64_t private_svc; 105 uint64_t svc_id; 106 107 struct guest *guest; 108 struct md_node *hv_node; 109 TAILQ_ENTRY(ldc_endpoint) link; 110 }; 111 112 struct ldc_channel { 113 struct ldc_endpoint *client_endpoint; 114 struct ldc_endpoint *server_endpoint; 115 }; 116 117 struct guest { 118 const char *name; 119 uint64_t gid; 120 uint64_t pid; 121 uint64_t resource_id; 122 uint64_t tod_offset; 123 uint64_t perfctraccess; 124 uint64_t perfctrhtaccess; 125 uint64_t rngctlaccessible; 126 uint64_t mdpa; 127 128 struct md_node *hv_node; 129 130 struct md *md; 131 uint64_t cpu_vid; 132 uint64_t endpoint_id; 133 134 struct console *console; 135 TAILQ_HEAD(, cpu) cpu_list; 136 int num_cpus; 137 TAILQ_HEAD(, device) device_list; 138 TAILQ_HEAD(, subdevice) subdevice_list; 139 TAILQ_HEAD(, mblock) mblock_list; 140 TAILQ_HEAD(, ldc_endpoint) endpoint_list; 141 142 struct ldc_channel domain_services; 143 struct ldc_channel vio[8]; 144 int num_vios; 145 146 TAILQ_ENTRY(guest) link; 147 }; 148 149 extern TAILQ_HEAD(guest_head, guest) guest_list; 150 151 void add_guest(struct md_node *); 152 153 extern struct md *hvmd; 154 extern uint64_t hv_mdpa; 155 extern uint64_t hv_membase; 156 extern uint64_t hv_memsize; 157 158 struct vdisk { 159 SIMPLEQ_ENTRY(vdisk) entry; 160 const char *path; 161 const char *devalias; 162 }; 163 164 struct vnet { 165 SIMPLEQ_ENTRY(vnet) entry; 166 uint64_t mac_addr; 167 uint64_t mtu; 168 const char *devalias; 169 }; 170 171 struct var { 172 SIMPLEQ_ENTRY(var) entry; 173 const char *name; 174 const char *str; 175 }; 176 177 struct iodev { 178 SIMPLEQ_ENTRY(iodev) entry; 179 const char *dev; 180 }; 181 182 struct domain { 183 SIMPLEQ_ENTRY(domain) entry; 184 const char *name; 185 uint64_t vcpu, vcpu_stride; 186 uint64_t memory; 187 SIMPLEQ_HEAD(, vdisk) vdisk_list; 188 SIMPLEQ_HEAD(, vnet) vnet_list; 189 SIMPLEQ_HEAD(, var) var_list; 190 SIMPLEQ_HEAD(, iodev) iodev_list; 191 }; 192 193 struct ldom_config { 194 SIMPLEQ_HEAD(, domain) domain_list; 195 }; 196 197 int parse_config(const char *, struct ldom_config *); 198 void build_config(const char *, int); 199 void list_components(void); 200