xref: /freebsd/sys/riscv/include/vmm.h (revision d3916eace506b8ab23537223f5c92924636a1c41)
1*d3916eacSRuslan Bukin /*
2*d3916eacSRuslan Bukin  * SPDX-License-Identifier: BSD-2-Clause
3*d3916eacSRuslan Bukin  *
4*d3916eacSRuslan Bukin  * Copyright (c) 2015 Mihai Carabas <mihai.carabas@gmail.com>
5*d3916eacSRuslan Bukin  * Copyright (c) 2024 Ruslan Bukin <br@bsdpad.com>
6*d3916eacSRuslan Bukin  *
7*d3916eacSRuslan Bukin  * This software was developed by the University of Cambridge Computer
8*d3916eacSRuslan Bukin  * Laboratory (Department of Computer Science and Technology) under Innovate
9*d3916eacSRuslan Bukin  * UK project 105694, "Digital Security by Design (DSbD) Technology Platform
10*d3916eacSRuslan Bukin  * Prototype".
11*d3916eacSRuslan Bukin  *
12*d3916eacSRuslan Bukin  * Redistribution and use in source and binary forms, with or without
13*d3916eacSRuslan Bukin  * modification, are permitted provided that the following conditions
14*d3916eacSRuslan Bukin  * are met:
15*d3916eacSRuslan Bukin  * 1. Redistributions of source code must retain the above copyright
16*d3916eacSRuslan Bukin  *    notice, this list of conditions and the following disclaimer.
17*d3916eacSRuslan Bukin  * 2. Redistributions in binary form must reproduce the above copyright
18*d3916eacSRuslan Bukin  *    notice, this list of conditions and the following disclaimer in the
19*d3916eacSRuslan Bukin  *    documentation and/or other materials provided with the distribution.
20*d3916eacSRuslan Bukin  *
21*d3916eacSRuslan Bukin  * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
22*d3916eacSRuslan Bukin  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23*d3916eacSRuslan Bukin  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24*d3916eacSRuslan Bukin  * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
25*d3916eacSRuslan Bukin  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26*d3916eacSRuslan Bukin  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27*d3916eacSRuslan Bukin  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28*d3916eacSRuslan Bukin  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29*d3916eacSRuslan Bukin  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30*d3916eacSRuslan Bukin  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31*d3916eacSRuslan Bukin  * SUCH DAMAGE.
32*d3916eacSRuslan Bukin  */
33*d3916eacSRuslan Bukin 
34*d3916eacSRuslan Bukin #ifndef _VMM_H_
35*d3916eacSRuslan Bukin #define	_VMM_H_
36*d3916eacSRuslan Bukin 
37*d3916eacSRuslan Bukin #include <sys/param.h>
38*d3916eacSRuslan Bukin #include <sys/cpuset.h>
39*d3916eacSRuslan Bukin #include <vm/vm.h>
40*d3916eacSRuslan Bukin #include <vm/pmap.h>
41*d3916eacSRuslan Bukin 
42*d3916eacSRuslan Bukin #include "pte.h"
43*d3916eacSRuslan Bukin #include "pmap.h"
44*d3916eacSRuslan Bukin 
45*d3916eacSRuslan Bukin struct vcpu;
46*d3916eacSRuslan Bukin 
47*d3916eacSRuslan Bukin enum vm_suspend_how {
48*d3916eacSRuslan Bukin 	VM_SUSPEND_NONE,
49*d3916eacSRuslan Bukin 	VM_SUSPEND_RESET,
50*d3916eacSRuslan Bukin 	VM_SUSPEND_POWEROFF,
51*d3916eacSRuslan Bukin 	VM_SUSPEND_HALT,
52*d3916eacSRuslan Bukin 	VM_SUSPEND_LAST
53*d3916eacSRuslan Bukin };
54*d3916eacSRuslan Bukin 
55*d3916eacSRuslan Bukin /*
56*d3916eacSRuslan Bukin  * Identifiers for architecturally defined registers.
57*d3916eacSRuslan Bukin  */
58*d3916eacSRuslan Bukin enum vm_reg_name {
59*d3916eacSRuslan Bukin 	VM_REG_GUEST_ZERO = 0,
60*d3916eacSRuslan Bukin 	VM_REG_GUEST_RA,
61*d3916eacSRuslan Bukin 	VM_REG_GUEST_SP,
62*d3916eacSRuslan Bukin 	VM_REG_GUEST_GP,
63*d3916eacSRuslan Bukin 	VM_REG_GUEST_TP,
64*d3916eacSRuslan Bukin 	VM_REG_GUEST_T0,
65*d3916eacSRuslan Bukin 	VM_REG_GUEST_T1,
66*d3916eacSRuslan Bukin 	VM_REG_GUEST_T2,
67*d3916eacSRuslan Bukin 	VM_REG_GUEST_S0,
68*d3916eacSRuslan Bukin 	VM_REG_GUEST_S1,
69*d3916eacSRuslan Bukin 	VM_REG_GUEST_A0,
70*d3916eacSRuslan Bukin 	VM_REG_GUEST_A1,
71*d3916eacSRuslan Bukin 	VM_REG_GUEST_A2,
72*d3916eacSRuslan Bukin 	VM_REG_GUEST_A3,
73*d3916eacSRuslan Bukin 	VM_REG_GUEST_A4,
74*d3916eacSRuslan Bukin 	VM_REG_GUEST_A5,
75*d3916eacSRuslan Bukin 	VM_REG_GUEST_A6,
76*d3916eacSRuslan Bukin 	VM_REG_GUEST_A7,
77*d3916eacSRuslan Bukin 	VM_REG_GUEST_S2,
78*d3916eacSRuslan Bukin 	VM_REG_GUEST_S3,
79*d3916eacSRuslan Bukin 	VM_REG_GUEST_S4,
80*d3916eacSRuslan Bukin 	VM_REG_GUEST_S5,
81*d3916eacSRuslan Bukin 	VM_REG_GUEST_S6,
82*d3916eacSRuslan Bukin 	VM_REG_GUEST_S7,
83*d3916eacSRuslan Bukin 	VM_REG_GUEST_S8,
84*d3916eacSRuslan Bukin 	VM_REG_GUEST_S9,
85*d3916eacSRuslan Bukin 	VM_REG_GUEST_S10,
86*d3916eacSRuslan Bukin 	VM_REG_GUEST_S11,
87*d3916eacSRuslan Bukin 	VM_REG_GUEST_T3,
88*d3916eacSRuslan Bukin 	VM_REG_GUEST_T4,
89*d3916eacSRuslan Bukin 	VM_REG_GUEST_T5,
90*d3916eacSRuslan Bukin 	VM_REG_GUEST_T6,
91*d3916eacSRuslan Bukin 	VM_REG_GUEST_SEPC,
92*d3916eacSRuslan Bukin 	VM_REG_LAST
93*d3916eacSRuslan Bukin };
94*d3916eacSRuslan Bukin 
95*d3916eacSRuslan Bukin #define	VM_INTINFO_VECTOR(info)	((info) & 0xff)
96*d3916eacSRuslan Bukin #define	VM_INTINFO_DEL_ERRCODE	0x800
97*d3916eacSRuslan Bukin #define	VM_INTINFO_RSVD		0x7ffff000
98*d3916eacSRuslan Bukin #define	VM_INTINFO_VALID	0x80000000
99*d3916eacSRuslan Bukin #define	VM_INTINFO_TYPE		0x700
100*d3916eacSRuslan Bukin #define	VM_INTINFO_HWINTR	(0 << 8)
101*d3916eacSRuslan Bukin #define	VM_INTINFO_NMI		(2 << 8)
102*d3916eacSRuslan Bukin #define	VM_INTINFO_HWEXCEPTION	(3 << 8)
103*d3916eacSRuslan Bukin #define	VM_INTINFO_SWINTR	(4 << 8)
104*d3916eacSRuslan Bukin 
105*d3916eacSRuslan Bukin #define VM_MAX_SUFFIXLEN 15
106*d3916eacSRuslan Bukin 
107*d3916eacSRuslan Bukin #ifdef _KERNEL
108*d3916eacSRuslan Bukin 
109*d3916eacSRuslan Bukin #define	VM_MAX_NAMELEN	32
110*d3916eacSRuslan Bukin 
111*d3916eacSRuslan Bukin struct vm;
112*d3916eacSRuslan Bukin struct vm_exception;
113*d3916eacSRuslan Bukin struct vm_exit;
114*d3916eacSRuslan Bukin struct vm_run;
115*d3916eacSRuslan Bukin struct vm_object;
116*d3916eacSRuslan Bukin struct vm_guest_paging;
117*d3916eacSRuslan Bukin struct vm_aplic_descr;
118*d3916eacSRuslan Bukin struct pmap;
119*d3916eacSRuslan Bukin 
120*d3916eacSRuslan Bukin struct vm_eventinfo {
121*d3916eacSRuslan Bukin 	void	*rptr;		/* rendezvous cookie */
122*d3916eacSRuslan Bukin 	int	*sptr;		/* suspend cookie */
123*d3916eacSRuslan Bukin 	int	*iptr;		/* reqidle cookie */
124*d3916eacSRuslan Bukin };
125*d3916eacSRuslan Bukin 
126*d3916eacSRuslan Bukin int vm_create(const char *name, struct vm **retvm);
127*d3916eacSRuslan Bukin struct vcpu *vm_alloc_vcpu(struct vm *vm, int vcpuid);
128*d3916eacSRuslan Bukin void vm_disable_vcpu_creation(struct vm *vm);
129*d3916eacSRuslan Bukin void vm_slock_vcpus(struct vm *vm);
130*d3916eacSRuslan Bukin void vm_unlock_vcpus(struct vm *vm);
131*d3916eacSRuslan Bukin void vm_destroy(struct vm *vm);
132*d3916eacSRuslan Bukin int vm_reinit(struct vm *vm);
133*d3916eacSRuslan Bukin const char *vm_name(struct vm *vm);
134*d3916eacSRuslan Bukin 
135*d3916eacSRuslan Bukin /*
136*d3916eacSRuslan Bukin  * APIs that modify the guest memory map require all vcpus to be frozen.
137*d3916eacSRuslan Bukin  */
138*d3916eacSRuslan Bukin void vm_slock_memsegs(struct vm *vm);
139*d3916eacSRuslan Bukin void vm_xlock_memsegs(struct vm *vm);
140*d3916eacSRuslan Bukin void vm_unlock_memsegs(struct vm *vm);
141*d3916eacSRuslan Bukin int vm_mmap_memseg(struct vm *vm, vm_paddr_t gpa, int segid, vm_ooffset_t off,
142*d3916eacSRuslan Bukin     size_t len, int prot, int flags);
143*d3916eacSRuslan Bukin int vm_munmap_memseg(struct vm *vm, vm_paddr_t gpa, size_t len);
144*d3916eacSRuslan Bukin int vm_alloc_memseg(struct vm *vm, int ident, size_t len, bool sysmem);
145*d3916eacSRuslan Bukin void vm_free_memseg(struct vm *vm, int ident);
146*d3916eacSRuslan Bukin 
147*d3916eacSRuslan Bukin /*
148*d3916eacSRuslan Bukin  * APIs that inspect the guest memory map require only a *single* vcpu to
149*d3916eacSRuslan Bukin  * be frozen. This acts like a read lock on the guest memory map since any
150*d3916eacSRuslan Bukin  * modification requires *all* vcpus to be frozen.
151*d3916eacSRuslan Bukin  */
152*d3916eacSRuslan Bukin int vm_mmap_getnext(struct vm *vm, vm_paddr_t *gpa, int *segid,
153*d3916eacSRuslan Bukin     vm_ooffset_t *segoff, size_t *len, int *prot, int *flags);
154*d3916eacSRuslan Bukin int vm_get_memseg(struct vm *vm, int ident, size_t *len, bool *sysmem,
155*d3916eacSRuslan Bukin     struct vm_object **objptr);
156*d3916eacSRuslan Bukin vm_paddr_t vmm_sysmem_maxaddr(struct vm *vm);
157*d3916eacSRuslan Bukin void *vm_gpa_hold(struct vcpu *vcpu, vm_paddr_t gpa, size_t len,
158*d3916eacSRuslan Bukin     int prot, void **cookie);
159*d3916eacSRuslan Bukin void *vm_gpa_hold_global(struct vm *vm, vm_paddr_t gpa, size_t len,
160*d3916eacSRuslan Bukin     int prot, void **cookie);
161*d3916eacSRuslan Bukin void vm_gpa_release(void *cookie);
162*d3916eacSRuslan Bukin bool vm_mem_allocated(struct vcpu *vcpu, vm_paddr_t gpa);
163*d3916eacSRuslan Bukin 
164*d3916eacSRuslan Bukin int vm_gla2gpa_nofault(struct vcpu *vcpu, struct vm_guest_paging *paging,
165*d3916eacSRuslan Bukin     uint64_t gla, int prot, uint64_t *gpa, int *is_fault);
166*d3916eacSRuslan Bukin 
167*d3916eacSRuslan Bukin uint16_t vm_get_maxcpus(struct vm *vm);
168*d3916eacSRuslan Bukin void vm_get_topology(struct vm *vm, uint16_t *sockets, uint16_t *cores,
169*d3916eacSRuslan Bukin     uint16_t *threads, uint16_t *maxcpus);
170*d3916eacSRuslan Bukin int vm_set_topology(struct vm *vm, uint16_t sockets, uint16_t cores,
171*d3916eacSRuslan Bukin     uint16_t threads, uint16_t maxcpus);
172*d3916eacSRuslan Bukin int vm_get_register(struct vcpu *vcpu, int reg, uint64_t *retval);
173*d3916eacSRuslan Bukin int vm_set_register(struct vcpu *vcpu, int reg, uint64_t val);
174*d3916eacSRuslan Bukin int vm_run(struct vcpu *vcpu);
175*d3916eacSRuslan Bukin int vm_suspend(struct vm *vm, enum vm_suspend_how how);
176*d3916eacSRuslan Bukin void* vm_get_cookie(struct vm *vm);
177*d3916eacSRuslan Bukin int vcpu_vcpuid(struct vcpu *vcpu);
178*d3916eacSRuslan Bukin void *vcpu_get_cookie(struct vcpu *vcpu);
179*d3916eacSRuslan Bukin struct vm *vcpu_vm(struct vcpu *vcpu);
180*d3916eacSRuslan Bukin struct vcpu *vm_vcpu(struct vm *vm, int cpu);
181*d3916eacSRuslan Bukin int vm_get_capability(struct vcpu *vcpu, int type, int *val);
182*d3916eacSRuslan Bukin int vm_set_capability(struct vcpu *vcpu, int type, int val);
183*d3916eacSRuslan Bukin int vm_activate_cpu(struct vcpu *vcpu);
184*d3916eacSRuslan Bukin int vm_suspend_cpu(struct vm *vm, struct vcpu *vcpu);
185*d3916eacSRuslan Bukin int vm_resume_cpu(struct vm *vm, struct vcpu *vcpu);
186*d3916eacSRuslan Bukin int vm_inject_exception(struct vcpu *vcpu, uint64_t scause);
187*d3916eacSRuslan Bukin int vm_attach_aplic(struct vm *vm, struct vm_aplic_descr *descr);
188*d3916eacSRuslan Bukin int vm_assert_irq(struct vm *vm, uint32_t irq);
189*d3916eacSRuslan Bukin int vm_deassert_irq(struct vm *vm, uint32_t irq);
190*d3916eacSRuslan Bukin int vm_raise_msi(struct vm *vm, uint64_t msg, uint64_t addr, int bus, int slot,
191*d3916eacSRuslan Bukin     int func);
192*d3916eacSRuslan Bukin struct vm_exit *vm_exitinfo(struct vcpu *vcpu);
193*d3916eacSRuslan Bukin void vm_exit_suspended(struct vcpu *vcpu, uint64_t pc);
194*d3916eacSRuslan Bukin void vm_exit_debug(struct vcpu *vcpu, uint64_t pc);
195*d3916eacSRuslan Bukin void vm_exit_rendezvous(struct vcpu *vcpu, uint64_t pc);
196*d3916eacSRuslan Bukin void vm_exit_astpending(struct vcpu *vcpu, uint64_t pc);
197*d3916eacSRuslan Bukin 
198*d3916eacSRuslan Bukin cpuset_t vm_active_cpus(struct vm *vm);
199*d3916eacSRuslan Bukin cpuset_t vm_debug_cpus(struct vm *vm);
200*d3916eacSRuslan Bukin cpuset_t vm_suspended_cpus(struct vm *vm);
201*d3916eacSRuslan Bukin 
202*d3916eacSRuslan Bukin static __inline int
203*d3916eacSRuslan Bukin vcpu_rendezvous_pending(struct vm_eventinfo *info)
204*d3916eacSRuslan Bukin {
205*d3916eacSRuslan Bukin 
206*d3916eacSRuslan Bukin 	return (*((uintptr_t *)(info->rptr)) != 0);
207*d3916eacSRuslan Bukin }
208*d3916eacSRuslan Bukin 
209*d3916eacSRuslan Bukin static __inline int
210*d3916eacSRuslan Bukin vcpu_suspended(struct vm_eventinfo *info)
211*d3916eacSRuslan Bukin {
212*d3916eacSRuslan Bukin 
213*d3916eacSRuslan Bukin 	return (*info->sptr);
214*d3916eacSRuslan Bukin }
215*d3916eacSRuslan Bukin 
216*d3916eacSRuslan Bukin int vcpu_debugged(struct vcpu *vcpu);
217*d3916eacSRuslan Bukin 
218*d3916eacSRuslan Bukin enum vcpu_state {
219*d3916eacSRuslan Bukin 	VCPU_IDLE,
220*d3916eacSRuslan Bukin 	VCPU_FROZEN,
221*d3916eacSRuslan Bukin 	VCPU_RUNNING,
222*d3916eacSRuslan Bukin 	VCPU_SLEEPING,
223*d3916eacSRuslan Bukin };
224*d3916eacSRuslan Bukin 
225*d3916eacSRuslan Bukin int vcpu_set_state(struct vcpu *vcpu, enum vcpu_state state, bool from_idle);
226*d3916eacSRuslan Bukin enum vcpu_state vcpu_get_state(struct vcpu *vcpu, int *hostcpu);
227*d3916eacSRuslan Bukin 
228*d3916eacSRuslan Bukin static int __inline
229*d3916eacSRuslan Bukin vcpu_is_running(struct vcpu *vcpu, int *hostcpu)
230*d3916eacSRuslan Bukin {
231*d3916eacSRuslan Bukin 	return (vcpu_get_state(vcpu, hostcpu) == VCPU_RUNNING);
232*d3916eacSRuslan Bukin }
233*d3916eacSRuslan Bukin 
234*d3916eacSRuslan Bukin #ifdef _SYS_PROC_H_
235*d3916eacSRuslan Bukin static int __inline
236*d3916eacSRuslan Bukin vcpu_should_yield(struct vcpu *vcpu)
237*d3916eacSRuslan Bukin {
238*d3916eacSRuslan Bukin 	struct thread *td;
239*d3916eacSRuslan Bukin 
240*d3916eacSRuslan Bukin 	td = curthread;
241*d3916eacSRuslan Bukin 	return (td->td_ast != 0 || td->td_owepreempt != 0);
242*d3916eacSRuslan Bukin }
243*d3916eacSRuslan Bukin #endif
244*d3916eacSRuslan Bukin 
245*d3916eacSRuslan Bukin void *vcpu_stats(struct vcpu *vcpu);
246*d3916eacSRuslan Bukin void vcpu_notify_event(struct vcpu *vcpu);
247*d3916eacSRuslan Bukin 
248*d3916eacSRuslan Bukin enum vm_reg_name vm_segment_name(int seg_encoding);
249*d3916eacSRuslan Bukin 
250*d3916eacSRuslan Bukin #endif	/* _KERNEL */
251*d3916eacSRuslan Bukin 
252*d3916eacSRuslan Bukin #define	VM_DIR_READ	0
253*d3916eacSRuslan Bukin #define	VM_DIR_WRITE	1
254*d3916eacSRuslan Bukin 
255*d3916eacSRuslan Bukin #define	VM_GP_M_MASK		0x1f
256*d3916eacSRuslan Bukin #define	VM_GP_MMU_ENABLED	(1 << 5)
257*d3916eacSRuslan Bukin 
258*d3916eacSRuslan Bukin struct vm_guest_paging {
259*d3916eacSRuslan Bukin 	int		flags;
260*d3916eacSRuslan Bukin 	int		padding;
261*d3916eacSRuslan Bukin };
262*d3916eacSRuslan Bukin 
263*d3916eacSRuslan Bukin struct vie {
264*d3916eacSRuslan Bukin 	uint8_t access_size:4, sign_extend:1, dir:1, unused:2;
265*d3916eacSRuslan Bukin 	enum vm_reg_name reg;
266*d3916eacSRuslan Bukin };
267*d3916eacSRuslan Bukin 
268*d3916eacSRuslan Bukin struct vre {
269*d3916eacSRuslan Bukin 	uint32_t inst_syndrome;
270*d3916eacSRuslan Bukin 	uint8_t dir:1, unused:7;
271*d3916eacSRuslan Bukin 	enum vm_reg_name reg;
272*d3916eacSRuslan Bukin };
273*d3916eacSRuslan Bukin 
274*d3916eacSRuslan Bukin /*
275*d3916eacSRuslan Bukin  * Identifiers for optional vmm capabilities
276*d3916eacSRuslan Bukin  */
277*d3916eacSRuslan Bukin enum vm_cap_type {
278*d3916eacSRuslan Bukin 	VM_CAP_UNRESTRICTED_GUEST,
279*d3916eacSRuslan Bukin 	VM_CAP_MAX
280*d3916eacSRuslan Bukin };
281*d3916eacSRuslan Bukin 
282*d3916eacSRuslan Bukin enum vm_exitcode {
283*d3916eacSRuslan Bukin 	VM_EXITCODE_BOGUS,
284*d3916eacSRuslan Bukin 	VM_EXITCODE_ECALL,
285*d3916eacSRuslan Bukin 	VM_EXITCODE_HYP,
286*d3916eacSRuslan Bukin 	VM_EXITCODE_PAGING,
287*d3916eacSRuslan Bukin 	VM_EXITCODE_SUSPENDED,
288*d3916eacSRuslan Bukin 	VM_EXITCODE_DEBUG,
289*d3916eacSRuslan Bukin 	VM_EXITCODE_INST_EMUL,
290*d3916eacSRuslan Bukin 	VM_EXITCODE_WFI,
291*d3916eacSRuslan Bukin 	VM_EXITCODE_MAX
292*d3916eacSRuslan Bukin };
293*d3916eacSRuslan Bukin 
294*d3916eacSRuslan Bukin struct vm_exit {
295*d3916eacSRuslan Bukin 	uint64_t scause;
296*d3916eacSRuslan Bukin 	uint64_t sepc;
297*d3916eacSRuslan Bukin 	uint64_t stval;
298*d3916eacSRuslan Bukin 	uint64_t htval;
299*d3916eacSRuslan Bukin 	uint64_t htinst;
300*d3916eacSRuslan Bukin 	enum vm_exitcode exitcode;
301*d3916eacSRuslan Bukin 	int inst_length;
302*d3916eacSRuslan Bukin 	uint64_t pc;
303*d3916eacSRuslan Bukin 	union {
304*d3916eacSRuslan Bukin 		struct {
305*d3916eacSRuslan Bukin 			uint64_t gpa;
306*d3916eacSRuslan Bukin 		} paging;
307*d3916eacSRuslan Bukin 
308*d3916eacSRuslan Bukin 		struct {
309*d3916eacSRuslan Bukin 			uint64_t gpa;
310*d3916eacSRuslan Bukin 			struct vm_guest_paging paging;
311*d3916eacSRuslan Bukin 			struct vie vie;
312*d3916eacSRuslan Bukin 		} inst_emul;
313*d3916eacSRuslan Bukin 
314*d3916eacSRuslan Bukin 		struct {
315*d3916eacSRuslan Bukin 			uint64_t args[8];
316*d3916eacSRuslan Bukin 		} ecall;
317*d3916eacSRuslan Bukin 
318*d3916eacSRuslan Bukin 		struct {
319*d3916eacSRuslan Bukin 			enum vm_suspend_how how;
320*d3916eacSRuslan Bukin 		} suspended;
321*d3916eacSRuslan Bukin 
322*d3916eacSRuslan Bukin 		struct {
323*d3916eacSRuslan Bukin 			uint64_t scause;
324*d3916eacSRuslan Bukin 		} hyp;
325*d3916eacSRuslan Bukin 	} u;
326*d3916eacSRuslan Bukin };
327*d3916eacSRuslan Bukin 
328*d3916eacSRuslan Bukin #endif	/* _VMM_H_ */
329