VirtualBox

source: vbox/trunk/src/VBox/VMM/VMMR3/IEMR3.cpp@ 61968

最後變更 在這個檔案從61968是 61968,由 vboxsync 提交於 9 年 前

IEM: Fixed setjmp bug (still disabled). Made IEMExecLots execute lots of instructions instead of just one, forcing us to return an instruction count and add proper flushing of the prefetch buffer.

  • 屬性 svn:eol-style 設為 native
  • 屬性 svn:keywords 設為 Author Date Id Revision
檔案大小: 7.0 KB
 
1/* $Id: IEMR3.cpp 61968 2016-06-30 17:42:31Z vboxsync $ */
2/** @file
3 * IEM - Interpreted Execution Manager.
4 */
5
6/*
7 * Copyright (C) 2011-2015 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.alldomusa.eu.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#define LOG_GROUP LOG_GROUP_EM
23#include <VBox/vmm/iem.h>
24#include <VBox/vmm/cpum.h>
25#include "IEMInternal.h"
26#include <VBox/vmm/vm.h>
27#include <VBox/err.h>
28
29#include <iprt/asm-amd64-x86.h>
30#include <iprt/assert.h>
31
32static const char *iemGetTargetCpuName(uint32_t enmTargetCpu)
33{
34 switch (enmTargetCpu)
35 {
36#define CASE_RET_STR(enmValue) case enmValue: return #enmValue + (sizeof("IEMTARGETCPU_") - 1)
37 CASE_RET_STR(IEMTARGETCPU_8086);
38 CASE_RET_STR(IEMTARGETCPU_V20);
39 CASE_RET_STR(IEMTARGETCPU_186);
40 CASE_RET_STR(IEMTARGETCPU_286);
41 CASE_RET_STR(IEMTARGETCPU_386);
42 CASE_RET_STR(IEMTARGETCPU_486);
43 CASE_RET_STR(IEMTARGETCPU_PENTIUM);
44 CASE_RET_STR(IEMTARGETCPU_PPRO);
45 CASE_RET_STR(IEMTARGETCPU_CURRENT);
46#undef CASE_RET_STR
47 default: return "Unknown";
48 }
49}
50
51/**
52 * Initializes the interpreted execution manager.
53 *
54 * This must be called after CPUM as we're quering information from CPUM about
55 * the guest and host CPUs.
56 *
57 * @returns VBox status code.
58 * @param pVM The cross context VM structure.
59 */
60VMMR3DECL(int) IEMR3Init(PVM pVM)
61{
62 for (VMCPUID idCpu = 0; idCpu < pVM->cCpus; idCpu++)
63 {
64 PVMCPU pVCpu = &pVM->aCpus[idCpu];
65 pVCpu->iem.s.offVM = -RT_OFFSETOF(VM, aCpus[idCpu].iem.s);
66 pVCpu->iem.s.offVMCpu = -RT_OFFSETOF(VMCPU, iem.s);
67 pVCpu->iem.s.pCtxR3 = CPUMQueryGuestCtxPtr(pVCpu);
68 pVCpu->iem.s.pCtxR0 = VM_R0_ADDR(pVM, pVCpu->iem.s.pCtxR3);
69 pVCpu->iem.s.pCtxRC = VM_RC_ADDR(pVM, pVCpu->iem.s.pCtxR3);
70
71 STAMR3RegisterF(pVM, &pVCpu->iem.s.cInstructions, STAMTYPE_U32, STAMVISIBILITY_ALWAYS, STAMUNIT_COUNT,
72 "Instructions interpreted", "/IEM/CPU%u/cInstructions", idCpu);
73 STAMR3RegisterF(pVM, &pVCpu->iem.s.cLongJumps, STAMTYPE_U32, STAMVISIBILITY_ALWAYS, STAMUNIT_BYTES,
74 "Number of longjmp calls", "/IEM/CPU%u/cLongJumps", idCpu);
75 STAMR3RegisterF(pVM, &pVCpu->iem.s.cPotentialExits, STAMTYPE_U32, STAMVISIBILITY_ALWAYS, STAMUNIT_COUNT,
76 "Potential exits", "/IEM/CPU%u/cPotentialExits", idCpu);
77 STAMR3RegisterF(pVM, &pVCpu->iem.s.cRetAspectNotImplemented, STAMTYPE_U32_RESET, STAMVISIBILITY_ALWAYS, STAMUNIT_COUNT,
78 "VERR_IEM_ASPECT_NOT_IMPLEMENTED", "/IEM/CPU%u/cRetAspectNotImplemented", idCpu);
79 STAMR3RegisterF(pVM, &pVCpu->iem.s.cRetInstrNotImplemented, STAMTYPE_U32_RESET, STAMVISIBILITY_ALWAYS, STAMUNIT_COUNT,
80 "VERR_IEM_INSTR_NOT_IMPLEMENTED", "/IEM/CPU%u/cRetInstrNotImplemented", idCpu);
81 STAMR3RegisterF(pVM, &pVCpu->iem.s.cRetInfStatuses, STAMTYPE_U32_RESET, STAMVISIBILITY_ALWAYS, STAMUNIT_COUNT,
82 "Informational statuses returned", "/IEM/CPU%u/cRetInfStatuses", idCpu);
83 STAMR3RegisterF(pVM, &pVCpu->iem.s.cRetErrStatuses, STAMTYPE_U32_RESET, STAMVISIBILITY_ALWAYS, STAMUNIT_COUNT,
84 "Error statuses returned", "/IEM/CPU%u/cRetErrStatuses", idCpu);
85 STAMR3RegisterF(pVM, &pVCpu->iem.s.cbWritten, STAMTYPE_U32, STAMVISIBILITY_ALWAYS, STAMUNIT_BYTES,
86 "Approx bytes written", "/IEM/CPU%u/cbWritten", idCpu);
87 STAMR3RegisterF(pVM, &pVCpu->iem.s.cPendingCommit, STAMTYPE_U32, STAMVISIBILITY_ALWAYS, STAMUNIT_BYTES,
88 "Times RC/R0 had to postpone instruction committing to ring-3", "/IEM/CPU%u/cPendingCommit", idCpu);
89
90 /*
91 * Host and guest CPU information.
92 */
93 if (idCpu == 0)
94 {
95 pVCpu->iem.s.enmCpuVendor = CPUMGetGuestCpuVendor(pVM);
96 pVCpu->iem.s.enmHostCpuVendor = CPUMGetHostCpuVendor(pVM);
97#if IEM_CFG_TARGET_CPU == IEMTARGETCPU_DYNAMIC
98 switch (pVM->cpum.ro.GuestFeatures.enmMicroarch)
99 {
100 case kCpumMicroarch_Intel_8086: pVCpu->iem.s.uTargetCpu = IEMTARGETCPU_8086; break;
101 case kCpumMicroarch_Intel_80186: pVCpu->iem.s.uTargetCpu = IEMTARGETCPU_186; break;
102 case kCpumMicroarch_Intel_80286: pVCpu->iem.s.uTargetCpu = IEMTARGETCPU_286; break;
103 case kCpumMicroarch_Intel_80386: pVCpu->iem.s.uTargetCpu = IEMTARGETCPU_386; break;
104 case kCpumMicroarch_Intel_80486: pVCpu->iem.s.uTargetCpu = IEMTARGETCPU_486; break;
105 case kCpumMicroarch_Intel_P5: pVCpu->iem.s.uTargetCpu = IEMTARGETCPU_PENTIUM; break;
106 case kCpumMicroarch_Intel_P6: pVCpu->iem.s.uTargetCpu = IEMTARGETCPU_PPRO; break;
107 case kCpumMicroarch_NEC_V20: pVCpu->iem.s.uTargetCpu = IEMTARGETCPU_V20; break;
108 case kCpumMicroarch_NEC_V30: pVCpu->iem.s.uTargetCpu = IEMTARGETCPU_V20; break;
109 default: pVCpu->iem.s.uTargetCpu = IEMTARGETCPU_CURRENT; break;
110 }
111 LogRel(("IEM: TargetCpu=%s, Microarch=%s\n", iemGetTargetCpuName(pVCpu->iem.s.uTargetCpu), CPUMR3MicroarchName(pVM->cpum.ro.GuestFeatures.enmMicroarch)));
112#endif
113 }
114 else
115 {
116 pVCpu->iem.s.enmCpuVendor = pVM->aCpus[0].iem.s.enmCpuVendor;
117 pVCpu->iem.s.enmHostCpuVendor = pVM->aCpus[0].iem.s.enmHostCpuVendor;
118#if IEM_CFG_TARGET_CPU == IEMTARGETCPU_DYNAMIC
119 pVCpu->iem.s.uTargetCpu = pVM->aCpus[0].iem.s.uTargetCpu;
120#endif
121 }
122
123 /*
124 * Mark all buffers free.
125 */
126 uint32_t iMemMap = RT_ELEMENTS(pVCpu->iem.s.aMemMappings);
127 while (iMemMap-- > 0)
128 pVCpu->iem.s.aMemMappings[iMemMap].fAccess = IEM_ACCESS_INVALID;
129 }
130 return VINF_SUCCESS;
131}
132
133
134VMMR3DECL(int) IEMR3Term(PVM pVM)
135{
136 NOREF(pVM);
137 return VINF_SUCCESS;
138}
139
140
141VMMR3DECL(void) IEMR3Relocate(PVM pVM)
142{
143 for (VMCPUID idCpu = 0; idCpu < pVM->cCpus; idCpu++)
144 pVM->aCpus[idCpu].iem.s.pCtxRC = VM_RC_ADDR(pVM, pVM->aCpus[idCpu].iem.s.pCtxR3);
145}
146
注意: 瀏覽 TracBrowser 來幫助您使用儲存庫瀏覽器

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