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 *
ss2sin(struct sockaddr_storage * ss)432 ss2sin(struct sockaddr_storage *ss)
433 {
434 return ((struct sockaddr_in *)ss);
435 }
436
437 static inline struct sockaddr_in6 *
ss2sin6(struct sockaddr_storage * ss)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