xref: /openbsd/usr.sbin/vmd/vmd.h (revision 7ccb23dd)
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