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