VirtualBox

source: vbox/trunk/include/VBox/csam.h@ 21217

Last change on this file since 21217 was 21217, checked in by vboxsync, 15 years ago

include/VBox/*.h: Mark which components the header files relate to.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 8.2 KB
Line 
1/** @file
2 * CSAM - Guest OS Code Scanning and Analyis Manager. (VMM)
3 */
4
5/*
6 * Copyright (C) 2006-2007 Sun Microsystems, Inc.
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 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
26 * Clara, CA 95054 USA or visit http://www.sun.com if you need
27 * additional information or have any questions.
28 */
29
30#ifndef ___VBox_csam_h
31#define ___VBox_csam_h
32
33#include <VBox/cdefs.h>
34#include <VBox/types.h>
35#include <VBox/em.h>
36
37
38/** @defgroup grp_csam The Code Scanning and Analysis API
39 * @{
40 */
41
42/**
43 * CSAM monitoring tag
44 * For use with CSAMR3MonitorPage
45 */
46typedef enum CSAMTAG
47{
48 CSAM_TAG_INVALID = 0,
49 CSAM_TAG_REM,
50 CSAM_TAG_PATM,
51 CSAM_TAG_CSAM,
52 CSAM_TAG_32BIT_HACK = 0x7fffffff
53} CSAMTAG;
54
55
56RT_C_DECLS_BEGIN
57
58
59/**
60 * Check if this page needs to be analysed by CSAM.
61 *
62 * This function should only be called for supervisor pages and
63 * only when CSAM is enabled. Leaving these selection criteria
64 * to the caller simplifies the interface (PTE passing).
65 *
66 * Note the the page has not yet been synced, so the TLB trick
67 * (which wasn't ever active anyway) cannot be applied.
68 *
69 * @returns true if the page should be marked not present because
70 * CSAM want need to scan it.
71 * @returns false if the page was already scanned.
72 * @param pVM The VM to operate on.
73 * @param GCPtr GC pointer of page table entry
74 */
75VMMDECL(bool) CSAMDoesPageNeedScanning(PVM pVM, RTRCPTR GCPtr);
76
77/**
78 * Check if this page was previously scanned by CSAM
79 *
80 * @returns true -> scanned, false -> not scanned
81 * @param pVM The VM to operate on.
82 * @param pPage GC page address
83 */
84VMMDECL(bool) CSAMIsPageScanned(PVM pVM, RTRCPTR pPage);
85
86/**
87 * Mark a page as scanned/not scanned
88 *
89 * @note: we always mark it as scanned, even if we haven't completely done so
90 *
91 * @returns VBox status code.
92 * @param pVM The VM to operate on.
93 * @param pPage GC page address (not necessarily aligned)
94 * @param fScanned Mark as scanned or not scanned
95 *
96 */
97VMMDECL(int) CSAMMarkPage(PVM pVM, RTRCPTR pPage, bool fScanned);
98
99
100/**
101 * Remember a possible code page for later inspection
102 *
103 * @returns VBox status code.
104 * @param pVM The VM to operate on.
105 * @param GCPtr GC pointer of page
106 */
107VMMDECL(void) CSAMMarkPossibleCodePage(PVM pVM, RTRCPTR GCPtr);
108
109/**
110 * Query CSAM state (enabled/disabled)
111 *
112 * @returns 0 - disabled, 1 - enabled
113 * @param pVM The VM to operate on.
114 */
115#define CSAMIsEnabled(pVM) (pVM->fCSAMEnabled && EMIsRawRing0Enabled(pVM))
116
117/**
118 * Turn on code scanning
119 *
120 * @returns VBox status code. (trap handled or not)
121 * @param pVM The VM to operate on.
122 */
123VMMDECL(int) CSAMEnableScanning(PVM pVM);
124
125/**
126 * Turn off code scanning
127 *
128 * @returns VBox status code. (trap handled or not)
129 * @param pVM The VM to operate on.
130 */
131VMMDECL(int) CSAMDisableScanning(PVM pVM);
132
133
134/**
135 * Check if this page needs to be analysed by CSAM
136 *
137 * @returns 0 - disabled, 1 - enabled
138 * @param pVM The VM to operate on.
139 * @param pvFault Fault address
140 */
141VMMDECL(int) CSAMExecFault(PVM pVM, RTRCPTR pvFault);
142
143/**
144 * Check if we've scanned this instruction before. If true, then we can emulate
145 * it instead of returning to ring 3.
146 *
147 * @returns boolean
148 * @param pVM The VM to operate on.
149 * @param GCPtr GC pointer of page table entry
150 */
151VMMDECL(bool) CSAMIsKnownDangerousInstr(PVM pVM, RTRCPTR GCPtr);
152
153
154#ifdef IN_RING3
155/** @defgroup grp_csam_r3 The Code Scanning and Analysis API
156 * @ingroup grp_csam
157 * @{
158 */
159
160/**
161 * Query CSAM state (enabled/disabled)
162 *
163 * @returns 0 - disabled, 1 - enabled
164 * @param pVM The VM to operate on.
165 */
166VMMR3DECL(int) CSAMR3IsEnabled(PVM pVM);
167
168/**
169 * Initializes the csam.
170 *
171 * @returns VBox status code.
172 * @param pVM The VM to operate on.
173 */
174VMMR3DECL(int) CSAMR3Init(PVM pVM);
175
176/**
177 * Applies relocations to data and code managed by this
178 * component. This function will be called at init and
179 * whenever the VMM need to relocate it self inside the GC.
180 *
181 * The csam will update the addresses used by the switcher.
182 *
183 * @param pVM The VM.
184 * @param offDelta Relocation delta.
185 */
186VMMR3DECL(void) CSAMR3Relocate(PVM pVM, RTGCINTPTR offDelta);
187
188/**
189 * Terminates the csam.
190 *
191 * Termination means cleaning up and freeing all resources,
192 * the VM it self is at this point powered off or suspended.
193 *
194 * @returns VBox status code.
195 * @param pVM The VM to operate on.
196 */
197VMMR3DECL(int) CSAMR3Term(PVM pVM);
198
199/**
200 * CSAM reset callback.
201 *
202 * @returns VBox status code.
203 * @param pVM The VM which is reset.
204 */
205VMMR3DECL(int) CSAMR3Reset(PVM pVM);
206
207
208/**
209 * Notify CSAM of a page flush
210 *
211 * @returns VBox status code
212 * @param pVM The VM to operate on.
213 * @param addr GC address of the page to flush
214 */
215VMMR3DECL(int) CSAMR3FlushPage(PVM pVM, RTRCPTR addr);
216
217/**
218 * Remove a CSAM monitored page. Use with care!
219 *
220 * @returns VBox status code
221 * @param pVM The VM to operate on.
222 * @param addr GC address of the page to flush
223 */
224VMMR3DECL(int) CSAMR3RemovePage(PVM pVM, RTRCPTR addr);
225
226/**
227 * Scan and analyse code
228 *
229 * @returns VBox status code.
230 * @param pVM The VM to operate on.
231 * @param pCtxCore CPU context
232 * @param pInstrGC Instruction pointer
233 */
234VMMR3DECL(int) CSAMR3CheckCodeEx(PVM pVM, PCPUMCTXCORE pCtxCore, RTRCPTR pInstrGC);
235
236/**
237 * Scan and analyse code
238 *
239 * @returns VBox status code.
240 * @param pVM The VM to operate on.
241 * @param pInstrGC Instruction pointer (0:32 virtual address)
242 */
243VMMR3DECL(int) CSAMR3CheckCode(PVM pVM, RTRCPTR pInstrGC);
244
245/**
246 * Mark an instruction in a page as scanned/not scanned
247 *
248 * @returns VBox status code.
249 * @param pVM The VM to operate on.
250 * @param pInstr Instruction pointer
251 * @param opsize Instruction size
252 * @param fScanned Mark as scanned or not
253 */
254VMMR3DECL(int) CSAMR3MarkCode(PVM pVM, RTRCPTR pInstr, uint32_t opsize, bool fScanned);
255
256/**
257 * Perform any pending actions
258 *
259 * @returns VBox status code.
260 * @param pVM The VM to operate on.
261 * @param pVCpu The VMCPU to operate on.
262 */
263VMMR3DECL(int) CSAMR3DoPendingAction(PVM pVM, PVMCPU pVCpu);
264
265/**
266 * Monitors a code page (if not already monitored)
267 *
268 * @returns VBox status code
269 * @param pVM The VM to operate on.
270 * @param pPageAddrGC The page to monitor
271 * @param enmTag Monitor tag
272 */
273VMMR3DECL(int) CSAMR3MonitorPage(PVM pVM, RTRCPTR pPageAddrGC, CSAMTAG enmTag);
274
275/**
276 * Unmonitors a code page
277 *
278 * @returns VBox status code
279 * @param pVM The VM to operate on.
280 * @param pPageAddrGC The page to monitor
281 * @param enmTag Monitor tag
282 */
283VMMR3DECL(int) CSAMR3UnmonitorPage(PVM pVM, RTRCPTR pPageAddrGC, CSAMTAG enmTag);
284
285/**
286 * Analyse interrupt and trap gates
287 *
288 * @returns VBox status code.
289 * @param pVM The VM to operate on.
290 * @param iGate Start gate
291 * @param cGates Number of gates to check
292 */
293VMMR3DECL(int) CSAMR3CheckGates(PVM pVM, uint32_t iGate, uint32_t cGates);
294
295/**
296 * Record previous call instruction addresses
297 *
298 * @returns VBox status code.
299 * @param pVM The VM to operate on.
300 * @param GCPtrCall Call address
301 */
302VMMR3DECL(int) CSAMR3RecordCallAddress(PVM pVM, RTRCPTR GCPtrCall);
303
304/** @} */
305#endif
306
307
308/** @} */
309RT_C_DECLS_END
310
311#endif
Note: See TracBrowser for help on using the repository browser.

© 2023 Oracle
ContactPrivacy policyTerms of Use