VirtualBox

source: vbox/trunk/src/VBox/VMM/testcase/tstMicroRC.cpp@ 84044

Last change on this file since 84044 was 82968, checked in by vboxsync, 4 years ago

Copyright year updates by scm.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id Revision
File size: 7.5 KB
Line 
1/* $Id: tstMicroRC.cpp 82968 2020-02-04 10:35:17Z vboxsync $ */
2/** @file
3 * Micro Testcase, profiling special CPU operations - GC Code (hacks).
4 */
5
6/*
7 * Copyright (C) 2006-2020 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 */
17
18
19/*********************************************************************************************************************************
20* Header Files *
21*********************************************************************************************************************************/
22#include <VBox/vmm/vm.h>
23#include <VBox/vmm/vmm.h>
24#include <VBox/vmm/selm.h>
25#include "tstMicro.h"
26
27#include <iprt/errcore.h>
28#include <iprt/asm-amd64-x86.h>
29#include <VBox/log.h>
30#include <iprt/assert.h>
31#include <iprt/string.h>
32
33
34/*********************************************************************************************************************************
35* Internal Functions *
36*********************************************************************************************************************************/
37RT_C_DECLS_BEGIN
38DECLEXPORT(int) tstMicroRC(PTSTMICRO pTst, unsigned uTestcase);
39RT_C_DECLS_END
40
41
42/**
43 * Save and load our IDT.
44 *
45 * @param pTst Pointer to the instance data.
46 * @param iIDT The index of the IDT entry which should be hooked.
47 */
48void idtInstall(PTSTMICRO pTst, int iIDT)
49{
50 RTIDTR Idtr;
51 ASMGetIDTR(&Idtr);
52 if (Idtr.pIdt == (uintptr_t)&pTst->aIDT[0])
53 return;
54 pTst->OriginalIDTR.cbIdt = Idtr.cbIdt;
55 pTst->OriginalIDTR.pIdt = Idtr.pIdt;
56
57 /*
58 * Copy the IDT.
59 */
60 if (Idtr.cbIdt >= sizeof(pTst->aIDT))
61 Idtr.cbIdt = sizeof(pTst->aIDT) - 1;
62 memcpy(&pTst->aIDT[0], (void *)Idtr.pIdt, Idtr.cbIdt + 1);
63
64
65 /* Hook up IDT entry. */
66 if (iIDT >= 0)
67 {
68 uintptr_t uHandler = (uintptr_t)tstTrapHandlerNoErr;
69 if ( iIDT == 8
70 || iIDT == 0xa
71 || iIDT == 0xb
72 || iIDT == 0xc
73 || iIDT == 0xd
74 || iIDT == 0xe
75 || iIDT == 0x11)
76 uHandler = (uintptr_t)tstTrapHandler;
77 pTst->aIDT[iIDT].Int.u16OffsetHigh = uHandler >> 16;
78 pTst->aIDT[iIDT].Int.u16OffsetLow = uHandler & 0xffff;
79 pTst->aIDT[iIDT].Int.u16SegSel = SELMGetHyperCS(&g_VM);
80 pTst->aIDT[iIDT].Int.u2DPL = 3;
81 pTst->aIDT[iIDT].Int.u1Present = 1;
82 pTst->aIDT[iIDT].Int.u1Fixed0 = 0;
83 pTst->aIDT[iIDT].Int.u1Fixed1 = 0;
84 pTst->aIDT[iIDT].Int.u1Fixed2 = 0;
85 pTst->aIDT[iIDT].Int.u1Fixed3 = 0;
86 pTst->aIDT[iIDT].Int.u1Fixed4 = 1;
87 pTst->aIDT[iIDT].Int.u1Fixed5 = 1;
88 pTst->aIDT[iIDT].Int.u132BitGate = 1;
89 pTst->aIDT[iIDT].Int.u1Fixed6 = 0;
90 pTst->aIDT[iIDT].Int.u5Reserved2 = 0;
91 }
92
93 /* Install int 42h, R3 gate */
94 pTst->aIDT[0x42].Int.u16OffsetHigh = (uintptr_t)tstInterrupt42 >> 16;
95 pTst->aIDT[0x42].Int.u16OffsetLow = (uintptr_t)tstInterrupt42 & 0xffff;
96 pTst->aIDT[0x42].Int.u16SegSel = SELMGetHyperCS(&g_VM);
97 pTst->aIDT[0x42].Int.u2DPL = 3;
98 pTst->aIDT[0x42].Int.u1Present = 1;
99 pTst->aIDT[0x42].Int.u1Fixed0 = 0;
100 pTst->aIDT[0x42].Int.u1Fixed1 = 0;
101 pTst->aIDT[0x42].Int.u1Fixed2 = 0;
102 pTst->aIDT[0x42].Int.u1Fixed3 = 0;
103 pTst->aIDT[0x42].Int.u1Fixed4 = 1;
104 pTst->aIDT[0x42].Int.u1Fixed5 = 1;
105 pTst->aIDT[0x42].Int.u132BitGate = 1;
106 pTst->aIDT[0x42].Int.u1Fixed6 = 0;
107 pTst->aIDT[0x42].Int.u5Reserved2 = 0;
108
109 /*
110 * Load our IDT.
111 */
112 Idtr.pIdt = (uintptr_t)&pTst->aIDT[0];
113 ASMSetIDTR(&Idtr);
114
115 RTIDTR Idtr2;
116 ASMGetIDTR(&Idtr2);
117 Assert(Idtr2.pIdt == (uintptr_t)&pTst->aIDT[0]);
118}
119
120
121/**
122 * Removes all trap overrides except for gate 42.
123 */
124DECLASM(void) idtOnly42(PTSTMICRO pTst)
125{
126 if (pTst->OriginalIDTR.pIdt)
127 memcpy(&pTst->aIDT[0], (void *)(uintptr_t)pTst->OriginalIDTR.pIdt, sizeof(VBOXIDTE) * 32);
128}
129
130
131
132DECLEXPORT(int) tstMicroRC(PTSTMICRO pTst, unsigned uTestcase)
133{
134 RTLogPrintf("pTst=%p uTestcase=%d\n", pTst, uTestcase);
135
136 /*
137 * Validate input.
138 */
139 if (uTestcase >= TSTMICROTEST_MAX)
140 return VERR_INVALID_PARAMETER;
141
142 /*
143 * Clear the results.
144 */
145 pTst->u64TSCR0Start = 0;
146 pTst->u64TSCRxStart = 0;
147 pTst->u64TSCR0Enter = 0;
148 pTst->u64TSCR0Exit = 0;
149 pTst->u64TSCRxEnd = 0;
150 pTst->u64TSCR0End = 0;
151 pTst->cHits = 0;
152 pTst->offEIPAdd = 0;
153 pTst->u32CR2 = 0;
154 pTst->u32EIP = 0;
155 pTst->u32ErrCd = 0;
156 PTSTMICRORESULT pRes = &pTst->aResults[uTestcase];
157 memset(&pTst->aResults[uTestcase], 0, sizeof(pTst->aResults[uTestcase]));
158
159
160 /*
161 * Do the testcase.
162 */
163 int rc = VINF_SUCCESS;
164 switch (uTestcase)
165 {
166 case TSTMICROTEST_OVERHEAD:
167 {
168 tstOverhead(pTst);
169 break;
170 }
171
172 case TSTMICROTEST_INVLPG_0:
173 {
174 tstInvlpg0(pTst);
175 break;
176 }
177
178 case TSTMICROTEST_INVLPG_EIP:
179 {
180 tstInvlpgEIP(pTst);
181 break;
182 }
183
184 case TSTMICROTEST_INVLPG_ESP:
185 {
186 tstInvlpgESP(pTst);
187 break;
188 }
189
190 case TSTMICROTEST_CR3_RELOAD:
191 {
192 tstCR3Reload(pTst);
193 break;
194 }
195
196 case TSTMICROTEST_WP_DISABLE:
197 {
198 tstWPDisable(pTst);
199 break;
200 }
201
202 case TSTMICROTEST_WP_ENABLE:
203 {
204 tstWPEnable(pTst);
205 break;
206 }
207
208 case TSTMICROTEST_PF_R0:
209 {
210 idtInstall(pTst, 0xe);
211 pTst->offEIPAdd = 2;
212 rc = tstPFR0(pTst);
213 break;
214 }
215
216 case TSTMICROTEST_PF_R1:
217 {
218 idtInstall(pTst, 0xe);
219 pTst->offEIPAdd = 2;
220 rc = tstPFR1(pTst);
221 break;
222 }
223
224 case TSTMICROTEST_PF_R2:
225 {
226 idtInstall(pTst, 0xe);
227 pTst->offEIPAdd = 2;
228 rc = tstPFR2(pTst);
229 break;
230 }
231
232 case TSTMICROTEST_PF_R3:
233 {
234 idtInstall(pTst, 0xe);
235 pTst->offEIPAdd = 2;
236 rc = tstPFR3(pTst);
237 break;
238 }
239
240 }
241
242 /*
243 * Compute the results.
244 */
245 if (pTst->u64TSCR0End && pTst->u64TSCR0Start)
246 pRes->cTotalTicks = pTst->u64TSCR0End - pTst->u64TSCR0Start - pTst->u64Overhead;
247 if (pTst->u64TSCRxStart && pTst->u64TSCR0Start)
248 pRes->cToRxFirstTicks = pTst->u64TSCRxStart - pTst->u64TSCR0Start - pTst->u64Overhead;
249 if (pTst->u64TSCR0Enter && pTst->u64TSCRxStart)
250 pRes->cTrapTicks = pTst->u64TSCR0Enter - pTst->u64TSCRxStart - pTst->u64Overhead;
251 if (pTst->u64TSCRxEnd && pTst->u64TSCR0Exit)
252 pRes->cToRxTrapTicks = pTst->u64TSCRxEnd - pTst->u64TSCR0Exit - pTst->u64Overhead;
253 if (pTst->u64TSCR0End && pTst->u64TSCRxEnd)
254 pRes->cToR0Ticks = pTst->u64TSCR0End - pTst->u64TSCRxEnd - pTst->u64Overhead;
255
256 return rc;
257}
258
Note: See TracBrowser for help on using the repository browser.

© 2023 Oracle
ContactPrivacy policyTerms of Use