xref: /openbsd-src/usr.sbin/ldomctl/ldomctl.h (revision ee96180de911a25bf20a6f878c381b9ba950e865)
1*ee96180dSkn /*	$OpenBSD: ldomctl.h,v 1.16 2022/10/06 21:35:52 kn Exp $	*/
2bb93e559Skettenis 
3bb93e559Skettenis /*
4bb93e559Skettenis  * Copyright (c) 2012 Mark Kettenis
5bb93e559Skettenis  *
6bb93e559Skettenis  * Permission to use, copy, modify, and distribute this software for any
7bb93e559Skettenis  * purpose with or without fee is hereby granted, provided that the above
8bb93e559Skettenis  * copyright notice and this permission notice appear in all copies.
9bb93e559Skettenis  *
10bb93e559Skettenis  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11bb93e559Skettenis  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12bb93e559Skettenis  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13bb93e559Skettenis  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14bb93e559Skettenis  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15bb93e559Skettenis  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16bb93e559Skettenis  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17bb93e559Skettenis  */
18bb93e559Skettenis 
194f98d0d5Skn #define LDOMCTL_CU	"/usr/bin/cu"
204f98d0d5Skn 
2102ce1e77Skettenis struct core;
2297d8cafcSkettenis struct guest;
2397d8cafcSkettenis 
2497d8cafcSkettenis struct console {
2597d8cafcSkettenis 	uint64_t ino;
2697d8cafcSkettenis 	uint64_t resource_id;
27d27a0d69Skettenis 	uint64_t uartbase;
2897d8cafcSkettenis 
2997d8cafcSkettenis 	struct guest *guest;
3097d8cafcSkettenis 	struct ldc_endpoint *client_endpoint;
3197d8cafcSkettenis 	struct ldc_endpoint *server_endpoint;
3297d8cafcSkettenis 	struct md_node *hv_node;
3397d8cafcSkettenis 	TAILQ_ENTRY(console) link;
3497d8cafcSkettenis };
3597d8cafcSkettenis 
3697d8cafcSkettenis struct cpu {
3797d8cafcSkettenis 	uint64_t pid, vid, gid, partid;
3897d8cafcSkettenis 	uint64_t resource_id;
3997d8cafcSkettenis 
4097d8cafcSkettenis 	struct guest *guest;
4197d8cafcSkettenis 	struct md_node *hv_node;
4202ce1e77Skettenis 	struct core *core;
4397d8cafcSkettenis 	TAILQ_ENTRY(cpu) link;
4497d8cafcSkettenis };
4597d8cafcSkettenis 
46e099dd74Skettenis struct device {
47e099dd74Skettenis 	uint64_t gid;
48e099dd74Skettenis 	uint64_t cfghandle;
49e099dd74Skettenis 	uint64_t resource_id;
50d27a0d69Skettenis 	uint64_t rcid;
51e099dd74Skettenis 
528cfaec25Skettenis 	int virtual;
538cfaec25Skettenis 
548cfaec25Skettenis 	uint64_t num_msi_eqs;
558cfaec25Skettenis 	uint64_t num_msis;
568cfaec25Skettenis 	uint64_t msi_ranges[2];
578cfaec25Skettenis 	uint64_t num_vpci;
588cfaec25Skettenis 
598cfaec25Skettenis 	uint64_t msi_eqs_per_vpci;
608cfaec25Skettenis 	uint64_t msis_per_vpci;
618cfaec25Skettenis 	uint64_t msi_base;
628cfaec25Skettenis 
63e099dd74Skettenis 	struct guest *guest;
64e099dd74Skettenis 	struct md_node *hv_node;
65e099dd74Skettenis 	TAILQ_ENTRY(device) link;
66e099dd74Skettenis };
67e099dd74Skettenis 
688cfaec25Skettenis struct subdevice {
698cfaec25Skettenis 	const char *path;
708cfaec25Skettenis 	TAILQ_ENTRY(subdevice) link;
718cfaec25Skettenis };
728cfaec25Skettenis 
738cfaec25Skettenis struct rootcomplex {
748cfaec25Skettenis 	uint64_t num_msi_eqs;
758cfaec25Skettenis 	uint64_t num_msis;
768cfaec25Skettenis 	const void *msi_ranges;
778cfaec25Skettenis 	int num_msi_ranges;
788cfaec25Skettenis 	const void *vdma_ranges;
798cfaec25Skettenis 	int num_vdma_ranges;
808cfaec25Skettenis 	uint64_t cfghandle;
818cfaec25Skettenis 	const char *path;
828cfaec25Skettenis 	TAILQ_ENTRY(rootcomplex) link;
838cfaec25Skettenis };
848cfaec25Skettenis 
8597d8cafcSkettenis struct mblock {
8697d8cafcSkettenis 	uint64_t membase;
8797d8cafcSkettenis 	uint64_t memsize;
8897d8cafcSkettenis 	uint64_t realbase;
8997d8cafcSkettenis 	uint64_t resource_id;
9097d8cafcSkettenis 
9197d8cafcSkettenis 	struct guest *guest;
9297d8cafcSkettenis 	struct md_node *hv_node;
9397d8cafcSkettenis 	TAILQ_ENTRY(mblock) link;
9497d8cafcSkettenis };
9597d8cafcSkettenis 
9697d8cafcSkettenis struct ldc_endpoint {
9797d8cafcSkettenis 	uint64_t target_type;
9897d8cafcSkettenis 	uint64_t target_guest;
9997d8cafcSkettenis 	uint64_t channel;
10097d8cafcSkettenis 	uint64_t target_channel;
10197d8cafcSkettenis 	uint64_t tx_ino;
10297d8cafcSkettenis 	uint64_t rx_ino;
10397d8cafcSkettenis 	uint64_t resource_id;
10497d8cafcSkettenis 	uint64_t private_svc;
10597d8cafcSkettenis 	uint64_t svc_id;
10697d8cafcSkettenis 
10797d8cafcSkettenis 	struct guest *guest;
10897d8cafcSkettenis 	struct md_node *hv_node;
10997d8cafcSkettenis 	TAILQ_ENTRY(ldc_endpoint) link;
11097d8cafcSkettenis };
11197d8cafcSkettenis 
11297d8cafcSkettenis struct ldc_channel {
11397d8cafcSkettenis 	struct ldc_endpoint *client_endpoint;
11497d8cafcSkettenis 	struct ldc_endpoint *server_endpoint;
11597d8cafcSkettenis };
11697d8cafcSkettenis 
117bb93e559Skettenis struct guest {
118bb93e559Skettenis 	const char *name;
119bb93e559Skettenis 	uint64_t gid;
12097d8cafcSkettenis 	uint64_t pid;
12197d8cafcSkettenis 	uint64_t resource_id;
122e099dd74Skettenis 	uint64_t tod_offset;
123e099dd74Skettenis 	uint64_t perfctraccess;
124e099dd74Skettenis 	uint64_t perfctrhtaccess;
125e099dd74Skettenis 	uint64_t rngctlaccessible;
126bb93e559Skettenis 	uint64_t mdpa;
127bb93e559Skettenis 
12897d8cafcSkettenis 	struct md_node *hv_node;
12997d8cafcSkettenis 
13097d8cafcSkettenis 	struct md *md;
13197d8cafcSkettenis 	uint64_t cpu_vid;
13297d8cafcSkettenis 	uint64_t endpoint_id;
13397d8cafcSkettenis 
13497d8cafcSkettenis 	struct console *console;
13597d8cafcSkettenis 	TAILQ_HEAD(, cpu) cpu_list;
136bb93e559Skettenis 	int num_cpus;
137e099dd74Skettenis 	TAILQ_HEAD(, device) device_list;
1388cfaec25Skettenis 	TAILQ_HEAD(, subdevice) subdevice_list;
13997d8cafcSkettenis 	TAILQ_HEAD(, mblock) mblock_list;
14097d8cafcSkettenis 	TAILQ_HEAD(, ldc_endpoint) endpoint_list;
14197d8cafcSkettenis 
14297d8cafcSkettenis 	struct ldc_channel domain_services;
14397d8cafcSkettenis 	struct ldc_channel vio[8];
14497d8cafcSkettenis 	int num_vios;
145bb93e559Skettenis 
146bb93e559Skettenis 	TAILQ_ENTRY(guest) link;
147bb93e559Skettenis };
148bb93e559Skettenis 
14997d8cafcSkettenis extern TAILQ_HEAD(guest_head, guest) guest_list;
150bb93e559Skettenis 
151bb93e559Skettenis void add_guest(struct md_node *);
152bb93e559Skettenis 
153bb93e559Skettenis extern struct md *hvmd;
154bb93e559Skettenis extern uint64_t hv_mdpa;
155ecf7be60Skettenis extern uint64_t hv_membase;
156ecf7be60Skettenis extern uint64_t hv_memsize;
15797d8cafcSkettenis 
15897d8cafcSkettenis struct vdisk {
15997d8cafcSkettenis 	SIMPLEQ_ENTRY(vdisk)	entry;
16097d8cafcSkettenis 	const char		*path;
161693255e2Skn 	const char		*devalias;
16297d8cafcSkettenis };
16397d8cafcSkettenis 
16497d8cafcSkettenis struct vnet {
16597d8cafcSkettenis 	SIMPLEQ_ENTRY(vnet)	entry;
16697d8cafcSkettenis 	uint64_t		mac_addr;
16797d8cafcSkettenis 	uint64_t		mtu;
168a3b2112fSkn 	const char		*devalias;
16997d8cafcSkettenis };
17097d8cafcSkettenis 
1718e765095Skettenis struct var {
1728e765095Skettenis 	SIMPLEQ_ENTRY(var)	entry;
1738e765095Skettenis 	const char		*name;
1748e765095Skettenis 	const char		*str;
1758e765095Skettenis };
1768e765095Skettenis 
1778cfaec25Skettenis struct iodev {
1788cfaec25Skettenis 	SIMPLEQ_ENTRY(iodev)	entry;
179*ee96180dSkn 	const char		*dev;
1808cfaec25Skettenis };
1818cfaec25Skettenis 
18297d8cafcSkettenis struct domain {
18397d8cafcSkettenis 	SIMPLEQ_ENTRY(domain)	entry;
18497d8cafcSkettenis 	const char *name;
18559eb6c85Skettenis 	uint64_t vcpu, vcpu_stride;
18697d8cafcSkettenis 	uint64_t memory;
18797d8cafcSkettenis 	SIMPLEQ_HEAD(, vdisk) vdisk_list;
18897d8cafcSkettenis 	SIMPLEQ_HEAD(, vnet) vnet_list;
1898e765095Skettenis 	SIMPLEQ_HEAD(, var) var_list;
1908cfaec25Skettenis 	SIMPLEQ_HEAD(, iodev) iodev_list;
19153681a8bSkn };
19297d8cafcSkettenis 
19397d8cafcSkettenis struct ldom_config {
19497d8cafcSkettenis 	SIMPLEQ_HEAD(, domain) domain_list;
19597d8cafcSkettenis };
19697d8cafcSkettenis 
19797d8cafcSkettenis int parse_config(const char *, struct ldom_config *);
19899a0bfacSkn void build_config(const char *, int);
199b300726bSkn void list_components(void);
200