1 /* $OpenBSD: vmd.h,v 1.132 2025/01/08 15:46:10 dv Exp $ */ 2 3 /* 4 * Copyright (c) 2015 Mike Larkin <mlarkin@openbsd.org> 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 #include <sys/types.h> 20 #include <sys/queue.h> 21 #include <sys/un.h> 22 #include <sys/socket.h> 23 24 #include <dev/vmm/vmm.h> 25 26 #include <net/if.h> 27 #include <netinet/in.h> 28 #include <netinet/if_ether.h> 29 #include <netinet6/in6_var.h> 30 31 #include <limits.h> 32 #include <stdio.h> 33 #include <pthread.h> 34 35 #include "proc.h" 36 37 #ifndef VMD_H 38 #define VMD_H 39 40 #define SET(_v, _m) ((_v) |= (_m)) 41 #define CLR(_v, _m) ((_v) &= ~(_m)) 42 #define ISSET(_v, _m) ((_v) & (_m)) 43 44 #define nitems(_a) (sizeof((_a)) / sizeof((_a)[0])) 45 46 #define MB(x) (x * 1024UL * 1024UL) 47 #define GB(x) (x * 1024UL * 1024UL * 1024UL) 48 49 #define VMD_USER "_vmd" 50 #define VMD_CONF "/etc/vm.conf" 51 #define SOCKET_NAME "/var/run/vmd.sock" 52 #define VMM_NODE "/dev/vmm" 53 #define PSP_NODE "/dev/psp" 54 #define VM_DEFAULT_BIOS "/etc/firmware/vmm-bios" 55 #define VM_DEFAULT_KERNEL "/bsd" 56 #define VM_DEFAULT_DEVICE "hd0a" 57 #define VM_BOOT_CONF "/etc/boot.conf" 58 #define VM_NAME_MAX 64 59 #define VM_MAX_BASE_PER_DISK 4 60 #define VM_TTYNAME_MAX 16 61 #define VM_MAX_DISKS_PER_VM 4 62 #define VM_MAX_NICS_PER_VM 4 63 64 #define VM_PCI_MMIO_BAR_SIZE 0x00010000 65 #define VM_PCI_IO_BAR_BASE 0x1000 66 #define VM_PCI_IO_BAR_END 0xFFFF 67 #define VM_PCI_IO_BAR_SIZE 0x1000 68 69 #define MAX_TAP 256 70 #define NR_BACKLOG 5 71 #define VMD_SWITCH_TYPE "bridge" 72 #define VM_DEFAULT_MEMORY 512 * 1024 * 1024 /* 512 MiB */ 73 74 #define VMD_DEFAULT_STAGGERED_START_DELAY 30 75 76 /* Launch mode identifiers for when a vm fork+exec's. */ 77 #define VMD_LAUNCH_VM 1 78 #define VMD_LAUNCH_DEV 2 79 80 #define VMD_DEVTYPE_NET 'n' 81 #define VMD_DEVTYPE_DISK 'd' 82 83 /* Rate-limit fast reboots */ 84 #define VM_START_RATE_SEC 6 /* min. seconds since last reboot */ 85 #define VM_START_RATE_LIMIT 3 /* max. number of fast reboots */ 86 87 /* vmd -> vmctl error codes */ 88 #define VMD_BIOS_MISSING 1001 89 #define VMD_DISK_MISSING 1002 90 /* 1003 is obsolete VMD_DISK_INVALID */ 91 #define VMD_VM_STOP_INVALID 1004 92 #define VMD_CDROM_MISSING 1005 93 #define VMD_CDROM_INVALID 1006 94 #define VMD_PARENT_INVALID 1007 95 96 #define IMSG_AGENTX_PEERID (uint32_t)-2 97 98 /* Image file signatures */ 99 #define VM_MAGIC_QCOW "QFI\xfb" 100 101 /* 100.64.0.0/10 from rfc6598 (IPv4 Prefix for Shared Address Space) */ 102 #define VMD_DHCP_PREFIX "100.64.0.0/10" 103 104 /* Unique local address for IPv6 */ 105 #define VMD_ULA_PREFIX "fd00::/8" 106 107 enum imsg_type { 108 IMSG_VMDOP_START_VM_REQUEST = IMSG_PROC_MAX, 109 IMSG_VMDOP_START_VM_CDROM, 110 IMSG_VMDOP_START_VM_DISK, 111 IMSG_VMDOP_START_VM_IF, 112 IMSG_VMDOP_START_VM_END, 113 IMSG_VMDOP_START_VM_RESPONSE, 114 IMSG_VMDOP_PAUSE_VM, 115 IMSG_VMDOP_PAUSE_VM_RESPONSE, 116 IMSG_VMDOP_UNPAUSE_VM, 117 IMSG_VMDOP_UNPAUSE_VM_RESPONSE, 118 IMSG_VMDOP_SEND_VM_REQUEST, 119 IMSG_VMDOP_SEND_VM_RESPONSE, 120 IMSG_VMDOP_RECEIVE_VM_REQUEST, 121 IMSG_VMDOP_RECEIVE_VM_END, 122 IMSG_VMDOP_WAIT_VM_REQUEST, 123 IMSG_VMDOP_TERMINATE_VM_REQUEST, 124 IMSG_VMDOP_TERMINATE_VM_RESPONSE, 125 IMSG_VMDOP_TERMINATE_VM_EVENT, 126 IMSG_VMDOP_GET_INFO_VM_REQUEST, 127 IMSG_VMDOP_GET_INFO_VM_DATA, 128 IMSG_VMDOP_GET_INFO_VM_END_DATA, 129 IMSG_VMDOP_LOAD, 130 IMSG_VMDOP_RECEIVE_VMM_FD, 131 IMSG_VMDOP_RECEIVE_PSP_FD, 132 IMSG_VMDOP_RELOAD, 133 IMSG_VMDOP_PRIV_IFDESCR, 134 IMSG_VMDOP_PRIV_IFADD, 135 IMSG_VMDOP_PRIV_IFEXISTS, 136 IMSG_VMDOP_PRIV_IFUP, 137 IMSG_VMDOP_PRIV_IFDOWN, 138 IMSG_VMDOP_PRIV_IFGROUP, 139 IMSG_VMDOP_PRIV_IFADDR, 140 IMSG_VMDOP_PRIV_IFADDR6, 141 IMSG_VMDOP_PRIV_IFRDOMAIN, 142 IMSG_VMDOP_PRIV_GET_ADDR, 143 IMSG_VMDOP_PRIV_GET_ADDR_RESPONSE, 144 IMSG_VMDOP_VM_SHUTDOWN, 145 IMSG_VMDOP_VM_REBOOT, 146 IMSG_VMDOP_CONFIG, 147 IMSG_VMDOP_DONE, 148 /* Device Operation Messages */ 149 IMSG_DEVOP_HOSTMAC, 150 IMSG_DEVOP_MSG, 151 IMSG_DEVOP_VIONET_MSG, 152 }; 153 154 struct vmop_result { 155 int vmr_result; 156 uint32_t vmr_id; 157 pid_t vmr_pid; 158 char vmr_ttyname[VM_TTYNAME_MAX]; 159 }; 160 161 struct vmop_info_result { 162 struct vm_info_result vir_info; 163 char vir_ttyname[VM_TTYNAME_MAX]; 164 uid_t vir_uid; 165 int64_t vir_gid; 166 unsigned int vir_state; 167 }; 168 169 struct vmop_id { 170 uint32_t vid_id; 171 char vid_name[VMM_MAX_NAME_LEN]; 172 uid_t vid_uid; 173 unsigned int vid_flags; 174 #define VMOP_FORCE 0x01 175 #define VMOP_WAIT 0x02 176 }; 177 178 struct vmop_ifreq { 179 uint32_t vfr_id; 180 char vfr_name[IF_NAMESIZE]; 181 char vfr_value[VM_NAME_MAX]; 182 struct sockaddr_storage vfr_addr; 183 struct sockaddr_storage vfr_mask; 184 }; 185 186 struct vmop_addr_req { 187 uint32_t var_vmid; 188 unsigned int var_nic_idx; 189 }; 190 191 struct vmop_addr_result { 192 uint32_t var_vmid; 193 unsigned int var_nic_idx; 194 uint8_t var_addr[ETHER_ADDR_LEN]; 195 }; 196 197 struct vmop_owner { 198 uid_t uid; 199 int64_t gid; 200 }; 201 202 struct vmop_create_params { 203 struct vm_create_params vmc_params; 204 unsigned int vmc_flags; 205 #define VMOP_CREATE_CPU 0x01 206 #define VMOP_CREATE_KERNEL 0x02 207 #define VMOP_CREATE_MEMORY 0x04 208 #define VMOP_CREATE_NETWORK 0x08 209 #define VMOP_CREATE_DISK 0x10 210 #define VMOP_CREATE_CDROM 0x20 211 #define VMOP_CREATE_INSTANCE 0x40 212 213 /* same flags; check for access to these resources */ 214 unsigned int vmc_checkaccess; 215 216 /* userland-only part of the create params */ 217 unsigned int vmc_bootdevice; 218 #define VMBOOTDEV_AUTO 0 219 #define VMBOOTDEV_DISK 1 220 #define VMBOOTDEV_CDROM 2 221 #define VMBOOTDEV_NET 3 222 unsigned int vmc_ifflags[VM_MAX_NICS_PER_VM]; 223 #define VMIFF_UP 0x01 224 #define VMIFF_LOCKED 0x02 225 #define VMIFF_LOCAL 0x04 226 #define VMIFF_RDOMAIN 0x08 227 #define VMIFF_OPTMASK (VMIFF_LOCKED|VMIFF_LOCAL|VMIFF_RDOMAIN) 228 229 size_t vmc_ndisks; 230 char vmc_disks[VM_MAX_DISKS_PER_VM][PATH_MAX]; 231 unsigned int vmc_disktypes[VM_MAX_DISKS_PER_VM]; 232 unsigned int vmc_diskbases[VM_MAX_DISKS_PER_VM]; 233 #define VMDF_RAW 0x01 234 #define VMDF_QCOW2 0x02 235 236 char vmc_cdrom[PATH_MAX]; 237 int vmc_kernel; 238 239 size_t vmc_nnics; 240 char vmc_ifnames[VM_MAX_NICS_PER_VM][IF_NAMESIZE]; 241 char vmc_ifswitch[VM_MAX_NICS_PER_VM][VM_NAME_MAX]; 242 char vmc_ifgroup[VM_MAX_NICS_PER_VM][IF_NAMESIZE]; 243 unsigned int vmc_ifrdomain[VM_MAX_NICS_PER_VM]; 244 uint8_t vmc_macs[VM_MAX_NICS_PER_VM][6]; 245 246 struct vmop_owner vmc_owner; 247 248 /* instance template params */ 249 char vmc_instance[VMM_MAX_NAME_LEN]; 250 struct vmop_owner vmc_insowner; 251 unsigned int vmc_insflags; 252 }; 253 254 struct vm_dump_header_cpuid { 255 unsigned long code, leaf; 256 unsigned int a, b, c, d; 257 }; 258 259 #define VM_DUMP_HEADER_CPUID_COUNT 5 260 261 struct vm_dump_header { 262 uint8_t vmh_signature[12]; 263 #define VM_DUMP_SIGNATURE VMM_HV_SIGNATURE 264 uint8_t vmh_pad[3]; 265 uint8_t vmh_version; 266 #define VM_DUMP_VERSION 7 267 struct vm_dump_header_cpuid 268 vmh_cpuids[VM_DUMP_HEADER_CPUID_COUNT]; 269 } __packed; 270 271 struct vmboot_params { 272 off_t vbp_partoff; 273 char vbp_device[PATH_MAX]; 274 char vbp_image[PATH_MAX]; 275 unsigned int vbp_type; 276 void *vbp_arg; 277 char *vbp_buf; 278 }; 279 280 struct vmd_if { 281 char *vif_name; 282 char *vif_switch; 283 char *vif_group; 284 int vif_fd; 285 unsigned int vif_rdomain; 286 unsigned int vif_flags; 287 TAILQ_ENTRY(vmd_if) vif_entry; 288 }; 289 290 struct vmd_switch { 291 uint32_t sw_id; 292 char *sw_name; 293 char sw_ifname[IF_NAMESIZE]; 294 char *sw_group; 295 unsigned int sw_rdomain; 296 unsigned int sw_flags; 297 int sw_running; 298 TAILQ_ENTRY(vmd_switch) sw_entry; 299 }; 300 TAILQ_HEAD(switchlist, vmd_switch); 301 302 struct vmd_vm { 303 struct vmop_create_params vm_params; 304 pid_t vm_pid; 305 uint32_t vm_vmid; 306 uint32_t vm_sev_handle; 307 uint32_t vm_sev_asid[VMM_MAX_VCPUS_PER_VM]; 308 309 #define VM_SEV_NSEGMENTS 128 310 size_t vm_sev_nmemsegments; 311 struct vm_mem_range vm_sev_memsegments[VM_SEV_NSEGMENTS]; 312 313 int vm_kernel; 314 char *vm_kernel_path; /* Used by vm.conf. */ 315 316 int vm_cdrom; 317 int vm_disks[VM_MAX_DISKS_PER_VM][VM_MAX_BASE_PER_DISK]; 318 struct vmd_if vm_ifs[VM_MAX_NICS_PER_VM]; 319 char vm_ttyname[VM_TTYNAME_MAX]; 320 int vm_tty; 321 uint32_t vm_peerid; 322 /* When set, VM was defined in a config file */ 323 int vm_from_config; 324 struct imsgev vm_iev; 325 uid_t vm_uid; 326 int vm_receive_fd; 327 unsigned int vm_state; 328 /* When set, VM is running now (PROC_PARENT only) */ 329 #define VM_STATE_RUNNING 0x01 330 /* When set, VM is not started by default (PROC_PARENT only) */ 331 #define VM_STATE_DISABLED 0x02 332 /* When set, VM is marked to be shut down */ 333 #define VM_STATE_SHUTDOWN 0x04 334 #define VM_STATE_RECEIVED 0x08 335 #define VM_STATE_PAUSED 0x10 336 #define VM_STATE_WAITING 0x20 337 338 /* For rate-limiting */ 339 struct timeval vm_start_tv; 340 int vm_start_limit; 341 342 TAILQ_ENTRY(vmd_vm) vm_entry; 343 }; 344 TAILQ_HEAD(vmlist, vmd_vm); 345 346 struct name2id { 347 char name[VMM_MAX_NAME_LEN]; 348 int uid; 349 int32_t id; 350 TAILQ_ENTRY(name2id) entry; 351 }; 352 TAILQ_HEAD(name2idlist, name2id); 353 354 struct local_prefix { 355 struct in_addr lp_in; 356 struct in_addr lp_mask; 357 struct in6_addr lp_in6; 358 struct in6_addr lp_mask6; 359 }; 360 361 #define SUN_PATH_LEN (sizeof(((struct sockaddr_un *)NULL)->sun_path)) 362 struct vmd_agentx { 363 int ax_enabled; 364 char ax_path[SUN_PATH_LEN]; 365 /* 366 * SNMP-VIEW-BASED-ACM-MIB:vacmContextName 367 * Should probably be a define in agentx.h 368 */ 369 char ax_context[32 + 1]; 370 }; 371 372 struct vmd_config { 373 unsigned int cfg_flags; 374 #define VMD_CFG_INET6 0x01 375 #define VMD_CFG_AUTOINET6 0x02 376 #define VMD_CFG_STAGGERED_START 0x04 377 378 struct timeval delay; 379 int parallelism; 380 struct local_prefix cfg_localprefix; 381 struct vmd_agentx cfg_agentx; 382 }; 383 384 struct vmd { 385 struct privsep vmd_ps; 386 const char *vmd_conffile; 387 char *argv0; /* abs. path to vmd for exec, unveil */ 388 389 /* global configuration that is sent to the children */ 390 struct vmd_config vmd_cfg; 391 392 int vmd_debug; 393 int vmd_verbose; 394 int vmd_noaction; 395 396 uint32_t vmd_nvm; 397 struct vmlist *vmd_vms; 398 struct name2idlist *vmd_known; 399 uint32_t vmd_nswitches; 400 struct switchlist *vmd_switches; 401 402 int vmd_fd; 403 int vmd_fd6; 404 int vmd_ptmfd; 405 int vmd_psp_fd; 406 }; 407 408 struct vm_dev_pipe { 409 int read; 410 int write; 411 struct event read_ev; 412 }; 413 414 enum pipe_msg_type { 415 I8253_RESET_CHAN_0 = 0, 416 I8253_RESET_CHAN_1 = 1, 417 I8253_RESET_CHAN_2 = 2, 418 NS8250_ZERO_READ, 419 NS8250_RATELIMIT, 420 MC146818_RESCHEDULE_PER, 421 VIRTIO_NOTIFY, 422 VIRTIO_RAISE_IRQ, 423 VIRTIO_THREAD_START, 424 VIRTIO_THREAD_PAUSE, 425 VIRTIO_THREAD_STOP, 426 VIRTIO_THREAD_ACK, 427 VMMCI_SET_TIMEOUT_SHORT, 428 VMMCI_SET_TIMEOUT_LONG, 429 }; 430 431 static inline struct sockaddr_in * 432 ss2sin(struct sockaddr_storage *ss) 433 { 434 return ((struct sockaddr_in *)ss); 435 } 436 437 static inline struct sockaddr_in6 * 438 ss2sin6(struct sockaddr_storage *ss) 439 { 440 return ((struct sockaddr_in6 *)ss); 441 } 442 443 struct packet_ctx { 444 uint8_t pc_htype; 445 uint8_t pc_hlen; 446 uint8_t pc_smac[ETHER_ADDR_LEN]; 447 uint8_t pc_dmac[ETHER_ADDR_LEN]; 448 449 struct sockaddr_storage pc_src; 450 struct sockaddr_storage pc_dst; 451 }; 452 453 /* packet.c */ 454 ssize_t assemble_hw_header(unsigned char *, size_t, size_t, 455 struct packet_ctx *, unsigned int); 456 ssize_t assemble_udp_ip_header(unsigned char *, size_t, size_t, 457 struct packet_ctx *pc, unsigned char *, size_t); 458 ssize_t decode_hw_header(unsigned char *, size_t, size_t, struct packet_ctx *, 459 unsigned int); 460 ssize_t decode_udp_ip_header(unsigned char *, size_t, size_t, 461 struct packet_ctx *); 462 463 /* vmd.c */ 464 int vmd_reload(unsigned int, const char *); 465 struct vmd_vm *vm_getbyid(uint32_t); 466 struct vmd_vm *vm_getbyvmid(uint32_t); 467 uint32_t vm_id2vmid(uint32_t, struct vmd_vm *); 468 uint32_t vm_vmid2id(uint32_t, struct vmd_vm *); 469 struct vmd_vm *vm_getbyname(const char *); 470 struct vmd_vm *vm_getbypid(pid_t); 471 void vm_stop(struct vmd_vm *, int, const char *); 472 void vm_remove(struct vmd_vm *, const char *); 473 int vm_register(struct privsep *, struct vmop_create_params *, 474 struct vmd_vm **, uint32_t, uid_t); 475 int vm_checkperm(struct vmd_vm *, struct vmop_owner *, uid_t); 476 int vm_checkaccess(int, unsigned int, uid_t, int); 477 int vm_opentty(struct vmd_vm *); 478 void vm_closetty(struct vmd_vm *); 479 void switch_remove(struct vmd_switch *); 480 struct vmd_switch *switch_getbyname(const char *); 481 char *get_string(uint8_t *, size_t); 482 uint32_t prefixlen2mask(uint8_t); 483 void prefixlen2mask6(u_int8_t, struct in6_addr *); 484 void getmonotime(struct timeval *); 485 int close_fd(int); 486 487 /* priv.c */ 488 void priv(struct privsep *, struct privsep_proc *); 489 int priv_getiftype(char *, char *, unsigned int *); 490 int priv_findname(const char *, const char **); 491 int priv_validgroup(const char *); 492 int vm_priv_ifconfig(struct privsep *, struct vmd_vm *); 493 int vm_priv_brconfig(struct privsep *, struct vmd_switch *); 494 uint32_t vm_priv_addr(struct local_prefix *, uint32_t, int, int); 495 int vm_priv_addr6(struct local_prefix *, uint32_t, int, int, 496 struct in6_addr *); 497 498 /* vmm.c */ 499 void vmm(struct privsep *, struct privsep_proc *); 500 void vmm_shutdown(void); 501 int opentap(char *); 502 int fd_hasdata(int); 503 int vmm_pipe(struct vmd_vm *, int, void (*)(int, short, void *)); 504 505 /* {mach}_vm.c (md interface) */ 506 void create_memory_map(struct vm_create_params *); 507 int load_firmware(struct vmd_vm *, struct vcpu_reg_state *); 508 void init_emulated_hw(struct vmop_create_params *, int, 509 int[][VM_MAX_BASE_PER_DISK], int *); 510 void restore_emulated_hw(struct vm_create_params *vcp, int, int *, 511 int[][VM_MAX_BASE_PER_DISK], int); 512 int vcpu_reset(uint32_t, uint32_t, struct vcpu_reg_state *); 513 void pause_vm_md(struct vmd_vm *); 514 void unpause_vm_md(struct vmd_vm *); 515 int dump_devs(int); 516 int dump_send_header(int); 517 void *hvaddr_mem(paddr_t, size_t); 518 struct vm_mem_range * 519 find_gpa_range(struct vm_create_params *, paddr_t, size_t); 520 int write_mem(paddr_t, const void *, size_t); 521 int read_mem(paddr_t, void *, size_t); 522 int intr_ack(struct vmd_vm *); 523 int intr_pending(struct vmd_vm *); 524 void intr_toggle_el(struct vmd_vm *, int, int); 525 void vcpu_assert_irq(uint32_t, uint32_t, int); 526 void vcpu_deassert_irq(uint32_t, uint32_t, int); 527 int vcpu_exit(struct vm_run_params *); 528 uint8_t vcpu_exit_pci(struct vm_run_params *); 529 530 #ifdef __amd64__ 531 /* x86 io functions in x86_vm.c */ 532 void set_return_data(struct vm_exit *, uint32_t); 533 void get_input_data(struct vm_exit *, uint32_t *); 534 #endif /* __amd64 __ */ 535 536 /* vm.c (mi functions) */ 537 void vcpu_halt(uint32_t); 538 void vcpu_unhalt(uint32_t); 539 void vcpu_signal_run(uint32_t); 540 int vcpu_intr(uint32_t, uint32_t, uint8_t); 541 void vm_main(int, int); 542 void mutex_lock(pthread_mutex_t *); 543 void mutex_unlock(pthread_mutex_t *); 544 int vmd_check_vmh(struct vm_dump_header *); 545 void vm_pipe_init(struct vm_dev_pipe *, void (*)(int, short, void *)); 546 void vm_pipe_init2(struct vm_dev_pipe *, void (*)(int, short, void *), 547 void *); 548 void vm_pipe_send(struct vm_dev_pipe *, enum pipe_msg_type); 549 enum pipe_msg_type vm_pipe_recv(struct vm_dev_pipe *); 550 int write_mem(paddr_t, const void *buf, size_t); 551 int remap_guest_mem(struct vmd_vm *, int); 552 __dead void vm_shutdown(unsigned int); 553 554 /* config.c */ 555 int config_init(struct vmd *); 556 void config_purge(struct vmd *, unsigned int); 557 int config_setconfig(struct vmd *); 558 int config_getconfig(struct vmd *, struct imsg *); 559 int config_setreset(struct vmd *, unsigned int); 560 int config_getreset(struct vmd *, struct imsg *); 561 int config_setvm(struct privsep *, struct vmd_vm *, uint32_t, uid_t); 562 int config_getvm(struct privsep *, struct imsg *); 563 int config_getdisk(struct privsep *, struct imsg *); 564 int config_getif(struct privsep *, struct imsg *); 565 int config_getcdrom(struct privsep *, struct imsg *); 566 567 /* vm_agentx.c */ 568 void vm_agentx(struct privsep *, struct privsep_proc *); 569 void vm_agentx_shutdown(void); 570 571 /* parse.y */ 572 int parse_config(const char *); 573 int cmdline_symset(char *); 574 int parse_prefix4(const char *, struct local_prefix *, const char **); 575 int parse_prefix6(const char *, struct local_prefix *, const char **); 576 577 /* virtio.c */ 578 int virtio_get_base(int, char *, size_t, int, const char *); 579 580 /* vionet.c */ 581 __dead void vionet_main(int, int); 582 583 /* vioblk.c */ 584 __dead void vioblk_main(int, int); 585 586 /* psp.c */ 587 int psp_get_pstate(uint16_t *, uint8_t *, uint8_t *, uint8_t *, uint8_t *); 588 int psp_df_flush(void); 589 int psp_get_gstate(uint32_t, uint32_t *, uint32_t *, uint8_t *); 590 int psp_launch_start(uint32_t *); 591 int psp_launch_update(uint32_t, vaddr_t, size_t); 592 int psp_launch_measure(uint32_t); 593 int psp_launch_finish(uint32_t); 594 int psp_activate(uint32_t, uint32_t); 595 int psp_guest_shutdown(uint32_t); 596 void psp_setup(void); 597 598 /* sev.c */ 599 int sev_init(struct vmd_vm *); 600 int sev_register_encryption(vaddr_t, size_t); 601 int sev_encrypt_memory(struct vmd_vm *); 602 int sev_activate(struct vmd_vm *, int); 603 int sev_shutdown(struct vmd_vm *); 604 605 #endif /* VMD_H */ 606