xref: /freebsd/sys/riscv/include/vmm_instruction_emul.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  * 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