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