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
21struct core;
22struct guest;
23
24struct 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
36struct 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
46struct 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
68struct subdevice {
69	const char *path;
70	TAILQ_ENTRY(subdevice) link;
71};
72
73struct 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
85struct 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
96struct 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
112struct ldc_channel {
113	struct ldc_endpoint *client_endpoint;
114	struct ldc_endpoint *server_endpoint;
115};
116
117struct 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
149extern TAILQ_HEAD(guest_head, guest) guest_list;
150
151void add_guest(struct md_node *);
152
153extern struct md *hvmd;
154extern uint64_t hv_mdpa;
155extern uint64_t hv_membase;
156extern uint64_t hv_memsize;
157
158struct vdisk {
159	SIMPLEQ_ENTRY(vdisk)	entry;
160	const char		*path;
161	const char		*devalias;
162};
163
164struct vnet {
165	SIMPLEQ_ENTRY(vnet)	entry;
166	uint64_t		mac_addr;
167	uint64_t		mtu;
168	const char		*devalias;
169};
170
171struct var {
172	SIMPLEQ_ENTRY(var)	entry;
173	const char		*name;
174	const char		*str;
175};
176
177struct iodev {
178	SIMPLEQ_ENTRY(iodev)	entry;
179	const char		*dev;
180};
181
182struct 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
193struct ldom_config {
194	SIMPLEQ_HEAD(, domain) domain_list;
195};
196
197int parse_config(const char *, struct ldom_config *);
198void build_config(const char *, int);
199void list_components(void);
200