VirtualBox

source: vbox/trunk/include/VBox/vmm/iem.h@ 66000

Last change on this file since 66000 was 66000, checked in by vboxsync, 8 years ago

VMM: Nested Hw.virt: Preps for SVM vmrun/#VMEXIT impl.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 7.4 KB
Line 
1/** @file
2 * IEM - Interpreted Execution Manager.
3 */
4
5/*
6 * Copyright (C) 2011-2016 Oracle Corporation
7 *
8 * This file is part of VirtualBox Open Source Edition (OSE), as
9 * available from http://www.virtualbox.org. This file is free software;
10 * you can redistribute it and/or modify it under the terms of the GNU
11 * General Public License (GPL) as published by the Free Software
12 * Foundation, in version 2 as it comes in the "COPYING" file of the
13 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
14 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
15 *
16 * The contents of this file may alternatively be used under the terms
17 * of the Common Development and Distribution License Version 1.0
18 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
19 * VirtualBox OSE distribution, in which case the provisions of the
20 * CDDL are applicable instead of those of the GPL.
21 *
22 * You may elect to license modified versions of this file under the
23 * terms and conditions of either the GPL or the CDDL or both.
24 */
25
26#ifndef ___VBox_vmm_iem_h
27#define ___VBox_vmm_iem_h
28
29#include <VBox/types.h>
30#include <VBox/vmm/trpm.h>
31#include <iprt/assert.h>
32
33
34RT_C_DECLS_BEGIN
35
36/** @defgroup grp_iem The Interpreted Execution Manager API.
37 * @ingroup grp_vmm
38 * @{
39 */
40
41
42/** @name Operand or addressing mode.
43 * @{ */
44typedef uint8_t IEMMODE;
45#define IEMMODE_16BIT 0
46#define IEMMODE_32BIT 1
47#define IEMMODE_64BIT 2
48/** @} */
49
50
51/** @name IEMTARGETCPU_XXX - IEM target CPU specification.
52 *
53 * This is a gross simpliciation of CPUMMICROARCH for dealing with really old
54 * CPUs which didn't have much in the way of hinting at supported instructions
55 * and features. This slowly changes with the introduction of CPUID with the
56 * Intel Pentium.
57 *
58 * @{
59 */
60/** The dynamic target CPU mode is for getting thru the BIOS and then use
61 * the debugger or modifying instruction behaviour (e.g. HLT) to switch to a
62 * different target CPU. */
63#define IEMTARGETCPU_DYNAMIC UINT32_C(0)
64/** Intel 8086/8088. */
65#define IEMTARGETCPU_8086 UINT32_C(1)
66/** NEC V20/V30.
67 * @remarks must be between 8086 and 80186. */
68#define IEMTARGETCPU_V20 UINT32_C(2)
69/** Intel 80186/80188. */
70#define IEMTARGETCPU_186 UINT32_C(3)
71/** Intel 80286. */
72#define IEMTARGETCPU_286 UINT32_C(4)
73/** Intel 80386. */
74#define IEMTARGETCPU_386 UINT32_C(5)
75/** Intel 80486. */
76#define IEMTARGETCPU_486 UINT32_C(6)
77/** Intel Pentium . */
78#define IEMTARGETCPU_PENTIUM UINT32_C(7)
79/** Intel PentiumPro. */
80#define IEMTARGETCPU_PPRO UINT32_C(8)
81/** A reasonably current CPU, probably newer than the pentium pro when it comes
82 * to the feature set and behaviour. Generally the CPUID info and CPU vendor
83 * dicates the behaviour here. */
84#define IEMTARGETCPU_CURRENT UINT32_C(9)
85/** @} */
86
87
88/** @name IEM status codes.
89 *
90 * Not quite sure how this will play out in the end, just aliasing safe status
91 * codes for now.
92 *
93 * @{ */
94#define VINF_IEM_RAISED_XCPT VINF_EM_RESCHEDULE
95/** @} */
96
97
98VMMDECL(VBOXSTRICTRC) IEMExecOne(PVMCPU pVCpu);
99VMMDECL(VBOXSTRICTRC) IEMExecOneEx(PVMCPU pVCpu, PCPUMCTXCORE pCtxCore, uint32_t *pcbWritten);
100VMMDECL(VBOXSTRICTRC) IEMExecOneWithPrefetchedByPC(PVMCPU pVCpu, PCPUMCTXCORE pCtxCore, uint64_t OpcodeBytesPC,
101 const void *pvOpcodeBytes, size_t cbOpcodeBytes);
102VMMDECL(VBOXSTRICTRC) IEMExecOneBypassEx(PVMCPU pVCpu, PCPUMCTXCORE pCtxCore, uint32_t *pcbWritten);
103VMMDECL(VBOXSTRICTRC) IEMExecOneBypassWithPrefetchedByPC(PVMCPU pVCpu, PCPUMCTXCORE pCtxCore, uint64_t OpcodeBytesPC,
104 const void *pvOpcodeBytes, size_t cbOpcodeBytes);
105VMMDECL(VBOXSTRICTRC) IEMExecOneBypassWithPrefetchedByPCWritten(PVMCPU pVCpu, PCPUMCTXCORE pCtxCore, uint64_t OpcodeBytesPC,
106 const void *pvOpcodeBytes, size_t cbOpcodeBytes,
107 uint32_t *pcbWritten);
108VMMDECL(VBOXSTRICTRC) IEMExecLots(PVMCPU pVCpu, uint32_t *pcInstructions);
109VMMDECL(VBOXSTRICTRC) IEMInjectTrpmEvent(PVMCPU pVCpu);
110VMM_INT_DECL(VBOXSTRICTRC) IEMInjectTrap(PVMCPU pVCpu, uint8_t u8TrapNo, TRPMEVENT enmType, uint16_t uErrCode, RTGCPTR uCr2,
111 uint8_t cbInstr);
112
113VMM_INT_DECL(int) IEMBreakpointSet(PVM pVM, RTGCPTR GCPtrBp);
114VMM_INT_DECL(int) IEMBreakpointClear(PVM pVM, RTGCPTR GCPtrBp);
115
116VMM_INT_DECL(void) IEMTlbInvalidateAll(PVMCPU pVCpu, bool fVmm);
117VMM_INT_DECL(void) IEMTlbInvalidatePage(PVMCPU pVCpu, RTGCPTR GCPtr);
118VMM_INT_DECL(void) IEMTlbInvalidateAllPhysical(PVMCPU pVCpu);
119#ifdef VBOX_WITH_NESTED_HWVIRT
120VMM_INT_DECL(bool) IEMIsRaisingIntOrXcpt(PVMCPU pVCpu);
121#endif
122
123/** @name Given Instruction Interpreters
124 * @{ */
125VMM_INT_DECL(VBOXSTRICTRC) IEMExecStringIoWrite(PVMCPU pVCpu, uint8_t cbValue, IEMMODE enmAddrMode,
126 bool fRepPrefix, uint8_t cbInstr, uint8_t iEffSeg, bool fIoChecked);
127VMM_INT_DECL(VBOXSTRICTRC) IEMExecStringIoRead(PVMCPU pVCpu, uint8_t cbValue, IEMMODE enmAddrMode,
128 bool fRepPrefix, uint8_t cbInstr, bool fIoChecked);
129VMM_INT_DECL(VBOXSTRICTRC) IEMExecDecodedOut(PVMCPU pVCpu, uint8_t cbInstr, uint16_t u16Port, uint8_t cbReg);
130VMM_INT_DECL(VBOXSTRICTRC) IEMExecDecodedIn(PVMCPU pVCpu, uint8_t cbInstr, uint16_t u16Port, uint8_t cbReg);
131VMM_INT_DECL(VBOXSTRICTRC) IEMExecDecodedMovCRxWrite(PVMCPU pVCpu, uint8_t cbInstr, uint8_t iCrReg, uint8_t iGReg);
132VMM_INT_DECL(VBOXSTRICTRC) IEMExecDecodedMovCRxRead(PVMCPU pVCpu, uint8_t cbInstr, uint8_t iGReg, uint8_t iCrReg);
133VMM_INT_DECL(VBOXSTRICTRC) IEMExecDecodedClts(PVMCPU pVCpu, uint8_t cbInstr);
134VMM_INT_DECL(VBOXSTRICTRC) IEMExecDecodedLmsw(PVMCPU pVCpu, uint8_t cbInstr, uint16_t uValue);
135VMM_INT_DECL(VBOXSTRICTRC) IEMExecDecodedXsetbv(PVMCPU pVCpu, uint8_t cbInstr);
136#ifdef VBOX_WITH_NESTED_HWVIRT
137VMM_INT_DECL(VBOXSTRICTRC) IEMExecDecodedClgi(PVMCPU pVCpu, uint8_t cbInstr);
138VMM_INT_DECL(VBOXSTRICTRC) IEMExecDecodedStgi(PVMCPU pVCpu, uint8_t cbInstr);
139VMM_INT_DECL(VBOXSTRICTRC) IEMExecDecodedVmload(PVMCPU pVCpu, uint8_t cbInstr);
140VMM_INT_DECL(VBOXSTRICTRC) IEMExecDecodedVmsave(PVMCPU pVCpu, uint8_t cbInstr);
141VMM_INT_DECL(VBOXSTRICTRC) IEMExecDecodedInvlpga(PVMCPU pVCpu, uint8_t cbInstr);
142#endif
143/** @} */
144
145#if defined(IEM_VERIFICATION_MODE) && defined(IN_RING3)
146VMM_INT_DECL(void) IEMNotifyMMIORead(PVM pVM, RTGCPHYS GCPhys, size_t cbValue);
147VMM_INT_DECL(void) IEMNotifyMMIOWrite(PVM pVM, RTGCPHYS GCPhys, uint32_t u32Value, size_t cbValue);
148VMM_INT_DECL(void) IEMNotifyIOPortRead(PVM pVM, RTIOPORT Port, size_t cbValue);
149VMM_INT_DECL(void) IEMNotifyIOPortWrite(PVM pVM, RTIOPORT Port, uint32_t u32Value, size_t cbValue);
150VMM_INT_DECL(void) IEMNotifyIOPortReadString(PVM pVM, RTIOPORT Port, void *pvDst, RTGCUINTREG cTransfers, size_t cbValue);
151VMM_INT_DECL(void) IEMNotifyIOPortWriteString(PVM pVM, RTIOPORT Port, void const *pvSrc, RTGCUINTREG cTransfers, size_t cbValue);
152#endif
153
154
155/** @defgroup grp_iem_r3 The IEM Host Context Ring-3 API.
156 * @{
157 */
158VMMR3DECL(int) IEMR3Init(PVM pVM);
159VMMR3DECL(int) IEMR3Term(PVM pVM);
160VMMR3DECL(void) IEMR3Relocate(PVM pVM);
161VMMR3_INT_DECL(VBOXSTRICTRC) IEMR3ProcessForceFlag(PVM pVM, PVMCPU pVCpu, VBOXSTRICTRC rcStrict);
162/** @} */
163
164/** @} */
165
166RT_C_DECLS_END
167
168#endif
169
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette