VirtualBox

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

Last change on this file since 1586 was 1085, checked in by vboxsync, 18 years ago

Corrected assumptions about flat addresses

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 6.8 KB
Line 
1/** @file
2 * CSAM - Guest OS Code Scanning and Analyis Manager.
3 */
4
5/*
6 * Copyright (C) 2006 InnoTek Systemberatung GmbH
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 as published by the Free Software Foundation,
12 * in version 2 as it comes in the "COPYING" file of the VirtualBox OSE
13 * distribution. VirtualBox OSE is distributed in the hope that it will
14 * be useful, but WITHOUT ANY WARRANTY of any kind.
15 *
16 * If you received this file as part of a commercial VirtualBox
17 * distribution, then only the terms of your commercial VirtualBox
18 * license agreement apply instead of the previous paragraph.
19 */
20
21#ifndef __VBox_csam_h__
22#define __VBox_csam_h__
23
24#include <VBox/cdefs.h>
25#include <VBox/types.h>
26#include <VBox/cpum.h>
27#include <VBox/em.h>
28
29
30/** @defgroup grp_csam The Code Scanning and Analysis API
31 * @{
32 */
33
34/**
35 * CSAM monitoring tag
36 * For use with CSAMR3MonitorPage
37 */
38typedef enum CSAMTAG
39{
40 CSAM_TAG_INVALID = 0,
41 CSAM_TAG_REM,
42 CSAM_TAG_PATM,
43 CSAM_TAG_CSAM,
44 CSAM_TAG_32BIT_HACK = 0x7fffffff
45} CSAMTAG;
46
47
48__BEGIN_DECLS
49
50
51/**
52 * Check if this page needs to be analysed by CSAM.
53 *
54 * This function should only be called for supervisor pages and
55 * only when CSAM is enabled. Leaving these selection criteria
56 * to the caller simplifies the interface (PTE passing).
57 *
58 * Note the the page has not yet been synced, so the TLB trick
59 * (which wasn't ever active anyway) cannot be applied.
60 *
61 * @returns true if the page should be marked not present because
62 * CSAM want need to scan it.
63 * @returns false if the page was already scanned.
64 * @param pVM The VM to operate on.
65 * @param GCPtr GC pointer of page table entry
66 */
67CSAMDECL(bool) CSAMDoesPageNeedScanning(PVM pVM, RTGCPTR GCPtr);
68
69/**
70 * Check if this page was previously scanned by CSAM
71 *
72 * @returns true -> scanned, false -> not scanned
73 * @param pVM The VM to operate on.
74 * @param pPage GC page address
75 */
76CSAMDECL(bool) CSAMIsPageScanned(PVM pVM, RTGCPTR pPage);
77
78/**
79 * Mark a page as scanned/not scanned
80 *
81 * @note: we always mark it as scanned, even if we haven't completely done so
82 *
83 * @returns VBox status code.
84 * @param pVM The VM to operate on.
85 * @param pPage GC page address (not necessarily aligned)
86 * @param fScanned Mark as scanned or not scanned
87 *
88 */
89CSAMDECL(int) CSAMMarkPage(PVM pVM, RTGCPTR pPage, bool fScanned);
90
91/**
92 * Mark an instruction in a page as scanned/not scanned
93 *
94 * @returns VBox status code.
95 * @param pVM The VM to operate on.
96 * @param pInstr Instruction pointer
97 * @param opsize Instruction size
98 * @param fScanned Mark as scanned or not
99 */
100CSAMDECL(int) CSAMR3MarkCode(PVM pVM, RTGCPTR pInstr, uint32_t opsize, bool fScanned);
101
102/**
103 * Query CSAM state (enabled/disabled)
104 *
105 * @returns 0 - disabled, 1 - enabled
106 * @param pVM The VM to operate on.
107 */
108#define CSAMIsEnabled(pVM) (pVM->fCSAMEnabled && EMIsRawRing0Enabled(pVM))
109
110/**
111 * Turn on code scanning
112 *
113 * @returns VBox status code. (trap handled or not)
114 * @param pVM The VM to operate on.
115 */
116CSAMDECL(int) CSAMEnableScanning(PVM pVM);
117
118/**
119 * Turn off code scanning
120 *
121 * @returns VBox status code. (trap handled or not)
122 * @param pVM The VM to operate on.
123 */
124CSAMDECL(int) CSAMDisableScanning(PVM pVM);
125
126
127/**
128 * Check if this page needs to be analysed by CSAM
129 *
130 * @returns 0 - disabled, 1 - enabled
131 * @param pVM The VM to operate on.
132 * @param pvFault Fault address
133 */
134CSAMDECL(int) CSAMExecFault(PVM pVM, RTGCPTR pvFault);
135
136/**
137 * Check if we've scanned this instruction before. If true, then we can emulate
138 * it instead of returning to ring 3.
139 *
140 * @returns boolean
141 * @param pVM The VM to operate on.
142 * @param GCPtr GC pointer of page table entry
143 */
144CSAMDECL(bool) CSAMIsKnownDangerousInstr(PVM pVM, RTGCPTR GCPtr);
145
146
147#ifdef IN_RING3
148/** @defgroup grp_csam_r3 The Code Scanning and Analysis API
149 * @ingroup grp_csam
150 * @{
151 */
152
153/**
154 * Query CSAM state (enabled/disabled)
155 *
156 * @returns 0 - disabled, 1 - enabled
157 * @param pVM The VM to operate on.
158 */
159CSAMR3DECL(int) CSAMR3IsEnabled(PVM pVM);
160
161/**
162 * Initializes the csam.
163 *
164 * @returns VBox status code.
165 * @param pVM The VM to operate on.
166 */
167CSAMR3DECL(int) CSAMR3Init(PVM pVM);
168
169/**
170 * Applies relocations to data and code managed by this
171 * component. This function will be called at init and
172 * whenever the VMM need to relocate it self inside the GC.
173 *
174 * The csam will update the addresses used by the switcher.
175 *
176 * @param pVM The VM.
177 * @param offDelta Relocation delta.
178 */
179CSAMR3DECL(void) CSAMR3Relocate(PVM pVM, RTGCINTPTR offDelta);
180
181/**
182 * Terminates the csam.
183 *
184 * Termination means cleaning up and freeing all resources,
185 * the VM it self is at this point powered off or suspended.
186 *
187 * @returns VBox status code.
188 * @param pVM The VM to operate on.
189 */
190CSAMR3DECL(int) CSAMR3Term(PVM pVM);
191
192/**
193 * CSAM reset callback.
194 *
195 * @returns VBox status code.
196 * @param pVM The VM which is reset.
197 */
198CSAMR3DECL(int) CSAMR3Reset(PVM pVM);
199
200
201/**
202 * Notify CSAM of a page flush
203 *
204 * @returns VBox status code
205 * @param pVM The VM to operate on.
206 * @param addr GC address of the page to flush
207 */
208CSAMR3DECL(int) CSAMR3FlushPage(PVM pVM, RTGCPTR addr);
209
210
211/**
212 * Scan and analyse code
213 *
214 * @returns VBox status code.
215 * @param pVM The VM to operate on.
216 * @param Sel selector
217 * @param pHiddenSel The hidden selector register.
218 * @param pInstrGC Instruction pointer
219 */
220CSAMR3DECL(int) CSAMR3CheckCodeEx(PVM pVM, RTSEL Sel, CPUMSELREGHID *pHiddenSel, RTGCPTR pInstrGC);
221
222/**
223 * Scan and analyse code
224 *
225 * @returns VBox status code.
226 * @param pVM The VM to operate on.
227 * @param pInstrGC Instruction pointer (0:32 virtual address)
228 */
229CSAMR3DECL(int) CSAMR3CheckCode(PVM pVM, RTGCPTR pInstrGC);
230
231/**
232 * Flush dirty code pages
233 *
234 * @returns VBox status code.
235 * @param pVM The VM to operate on.
236 */
237CSAMR3DECL(int) CSAMR3FlushDirtyPages(PVM pVM);
238
239/**
240 * Monitors a code page (if not already monitored)
241 *
242 * @returns VBox status code
243 * @param pVM The VM to operate on.
244 * @param pPageAddrGC The page to monitor
245 * @param enmTag Monitor tag
246 */
247CSAMR3DECL(int) CSAMR3MonitorPage(PVM pVM, RTGCPTR pPageAddrGC, CSAMTAG enmTag);
248
249/**
250 * Analyse interrupt and trap gates
251 *
252 * @returns VBox status code.
253 * @param pVM The VM to operate on.
254 * @param iGate Start gate
255 * @param cGates Number of gates to check
256 */
257CSAMR3DECL(int) CSAMR3CheckGates(PVM pVM, uint32_t iGate, uint32_t cGates);
258
259/** @} */
260#endif
261
262
263/** @} */
264__END_DECLS
265
266#endif
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