xref: /openbsd-src/sys/arch/arm64/include/vmmvar.h (revision 2c368633012f11160ce4f4f506a1354074d20134)
1 /*	$OpenBSD: vmmvar.h,v 1.2 2024/11/08 04:02:30 jsg Exp $	*/
2 /*
3  * Copyright (c) 2014 Mike Larkin <mlarkin@openbsd.org>
4  *
5  * Permission to use, copy, modify, and distribute this software for any
6  * purpose with or without fee is hereby granted, provided that the above
7  * copyright notice and this permission notice appear in all copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16  */
17 
18 /*
19  * CPU capabilities for VMM operation
20  */
21 #ifndef _MACHINE_VMMVAR_H_
22 #define _MACHINE_VMMVAR_H_
23 
24 #define VMM_HV_SIGNATURE 	"OpenBSDVMM58"
25 
26 /* Exit Reasons */
27 #define VM_EXIT_TERMINATED			0xFFFE
28 #define VM_EXIT_NONE				0xFFFF
29 
30 struct vmm_softc_md {
31 	/* Capabilities */
32 	uint32_t		nr_cpus;	/* [I] */
33 };
34 
35 /*
36  * struct vcpu_inject_event	: describes an exception or interrupt to inject.
37  */
38 struct vcpu_inject_event {
39 	uint8_t		vie_vector;	/* Exception or interrupt vector. */
40 	uint32_t	vie_errorcode;	/* Optional error code. */
41 	uint8_t		vie_type;
42 #define VCPU_INJECT_NONE	0
43 #define VCPU_INJECT_INTR	1	/* External hardware interrupt. */
44 #define VCPU_INJECT_EX		2	/* HW or SW Exception */
45 #define VCPU_INJECT_NMI		3	/* Non-maskable Interrupt */
46 };
47 
48 #define VCPU_REGS_NGPRS		31
49 
50 struct vcpu_reg_state {
51 	uint64_t			vrs_gprs[VCPU_REGS_NGPRS];
52 };
53 
54 /*
55  * struct vm_exit
56  *
57  * Contains VM exit information communicated to vmd(8). This information is
58  * gathered by vmm(4) from the CPU on each exit that requires help from vmd.
59  */
60 struct vm_exit {
61 	struct vcpu_reg_state		vrs;
62 };
63 
64 struct vm_intr_params {
65 	/* Input parameters to VMM_IOC_INTR */
66 	uint32_t		vip_vm_id;
67 	uint32_t		vip_vcpu_id;
68 	uint16_t		vip_intr;
69 };
70 
71 #define VM_RWREGS_GPRS	0x1	/* read/write GPRs */
72 #define VM_RWREGS_ALL	(VM_RWREGS_GPRS)
73 
74 struct vm_rwregs_params {
75 	/*
76 	 * Input/output parameters to VMM_IOC_READREGS /
77 	 * VMM_IOC_WRITEREGS
78 	 */
79 	uint32_t		vrwp_vm_id;
80 	uint32_t		vrwp_vcpu_id;
81 	uint64_t		vrwp_mask;
82 	struct vcpu_reg_state	vrwp_regs;
83 };
84 
85 /* IOCTL definitions */
86 #define VMM_IOC_INTR _IOW('V', 6, struct vm_intr_params) /* Intr pending */
87 
88 #endif /* ! _MACHINE_VMMVAR_H_ */
89