jcs's openbsd hax
openbsd
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);