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 * All rights reserved. 6*d3916eacSRuslan Bukin * 7*d3916eacSRuslan Bukin * Redistribution and use in source and binary forms, with or without 8*d3916eacSRuslan Bukin * modification, are permitted provided that the following conditions 9*d3916eacSRuslan Bukin * are met: 10*d3916eacSRuslan Bukin * 1. Redistributions of source code must retain the above copyright 11*d3916eacSRuslan Bukin * notice, this list of conditions and the following disclaimer. 12*d3916eacSRuslan Bukin * 2. Redistributions in binary form must reproduce the above copyright 13*d3916eacSRuslan Bukin * notice, this list of conditions and the following disclaimer in the 14*d3916eacSRuslan Bukin * documentation and/or other materials provided with the distribution. 15*d3916eacSRuslan Bukin * 16*d3916eacSRuslan Bukin * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17*d3916eacSRuslan Bukin * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18*d3916eacSRuslan Bukin * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19*d3916eacSRuslan Bukin * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE 20*d3916eacSRuslan Bukin * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21*d3916eacSRuslan Bukin * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22*d3916eacSRuslan Bukin * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23*d3916eacSRuslan Bukin * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24*d3916eacSRuslan Bukin * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25*d3916eacSRuslan Bukin * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26*d3916eacSRuslan Bukin * SUCH DAMAGE. 27*d3916eacSRuslan Bukin */ 28*d3916eacSRuslan Bukin 29*d3916eacSRuslan Bukin #ifndef _VMM_INSTRUCTION_EMUL_H_ 30*d3916eacSRuslan Bukin #define _VMM_INSTRUCTION_EMUL_H_ 31*d3916eacSRuslan Bukin 32*d3916eacSRuslan Bukin /* 33*d3916eacSRuslan Bukin * Callback functions to read and write memory regions. 34*d3916eacSRuslan Bukin */ 35*d3916eacSRuslan Bukin typedef int (*mem_region_read_t)(struct vcpu *vcpu, uint64_t gpa, 36*d3916eacSRuslan Bukin uint64_t *rval, int rsize, void *arg); 37*d3916eacSRuslan Bukin typedef int (*mem_region_write_t)(struct vcpu *vcpu, uint64_t gpa, 38*d3916eacSRuslan Bukin uint64_t wval, int wsize, void *arg); 39*d3916eacSRuslan Bukin 40*d3916eacSRuslan Bukin /* 41*d3916eacSRuslan Bukin * Callback functions to read and write registers. 42*d3916eacSRuslan Bukin */ 43*d3916eacSRuslan Bukin typedef int (*reg_read_t)(struct vcpu *vcpu, uint64_t *rval, void *arg); 44*d3916eacSRuslan Bukin typedef int (*reg_write_t)(struct vcpu *vcpu, uint64_t wval, void *arg); 45*d3916eacSRuslan Bukin 46*d3916eacSRuslan Bukin /* 47*d3916eacSRuslan Bukin * Emulate the decoded 'vie' instruction when it contains a memory operation. 48*d3916eacSRuslan Bukin * 49*d3916eacSRuslan Bukin * The callbacks 'mrr' and 'mrw' emulate reads and writes to the memory region 50*d3916eacSRuslan Bukin * containing 'gpa'. 'mrarg' is an opaque argument that is passed into the 51*d3916eacSRuslan Bukin * callback functions. 52*d3916eacSRuslan Bukin * 53*d3916eacSRuslan Bukin * 'void *vm' should be 'struct vm *' when called from kernel context and 54*d3916eacSRuslan Bukin * 'struct vmctx *' when called from user context. 55*d3916eacSRuslan Bukin * 56*d3916eacSRuslan Bukin */ 57*d3916eacSRuslan Bukin int vmm_emulate_instruction(struct vcpu *vcpu, uint64_t gpa, struct vie *vie, 58*d3916eacSRuslan Bukin struct vm_guest_paging *paging, mem_region_read_t mrr, 59*d3916eacSRuslan Bukin mem_region_write_t mrw, void *mrarg); 60*d3916eacSRuslan Bukin 61*d3916eacSRuslan Bukin /* 62*d3916eacSRuslan Bukin * Emulate the decoded 'vre' instruction when it contains a register access. 63*d3916eacSRuslan Bukin * 64*d3916eacSRuslan Bukin * The callbacks 'regread' and 'regwrite' emulate reads and writes to the 65*d3916eacSRuslan Bukin * register from 'vie'. 'regarg' is an opaque argument that is passed into the 66*d3916eacSRuslan Bukin * callback functions. 67*d3916eacSRuslan Bukin * 68*d3916eacSRuslan Bukin * 'void *vm' should be 'struct vm *' when called from kernel context and 69*d3916eacSRuslan Bukin * 'struct vmctx *' when called from user context. 70*d3916eacSRuslan Bukin * 71*d3916eacSRuslan Bukin */ 72*d3916eacSRuslan Bukin int vmm_emulate_register(struct vcpu *vcpu, struct vre *vre, reg_read_t regread, 73*d3916eacSRuslan Bukin reg_write_t regwrite, void *regarg); 74*d3916eacSRuslan Bukin 75*d3916eacSRuslan Bukin #ifdef _KERNEL 76*d3916eacSRuslan Bukin void vm_register_reg_handler(struct vm *vm, uint64_t iss, uint64_t mask, 77*d3916eacSRuslan Bukin reg_read_t reg_read, reg_write_t reg_write, void *arg); 78*d3916eacSRuslan Bukin void vm_deregister_reg_handler(struct vm *vm, uint64_t iss, uint64_t mask); 79*d3916eacSRuslan Bukin 80*d3916eacSRuslan Bukin void vm_register_inst_handler(struct vm *vm, uint64_t start, uint64_t size, 81*d3916eacSRuslan Bukin mem_region_read_t mmio_read, mem_region_write_t mmio_write); 82*d3916eacSRuslan Bukin void vm_deregister_inst_handler(struct vm *vm, uint64_t start, uint64_t size); 83*d3916eacSRuslan Bukin #endif 84*d3916eacSRuslan Bukin 85*d3916eacSRuslan Bukin #endif /* _VMM_INSTRUCTION_EMUL_H_ */ 86