xref: /openbsd/usr.sbin/ldomctl/ldomctl.h (revision ee96180d)
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