Changeset 10630 in vbox
- Timestamp:
- Jul 15, 2008 9:06:33 AM (17 years ago)
- svn:sync-xref-src-repo-rev:
- 33339
- Location:
- trunk
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/cpum.h
r10353 r10630 1045 1045 CPUMR0DECL(int) CPUMR0Init(PVM pVM); 1046 1046 1047 /** 1048 * Lazily sync in the FPU/XMM state 1049 * 1050 * @returns VBox status code. 1051 * @param pVM VM handle. 1052 * @param pCtx CPU context 1053 */ 1054 CPUMR0DECL(int) CPUMR0LoadGuestFPU(PVM pVM, PCPUMCTX pCtx); 1055 1056 /** 1057 * Save guest FPU/XMM state 1058 * 1059 * @returns VBox status code. 1060 * @param pVM VM handle. 1061 * @param pCtx CPU context 1062 */ 1063 CPUMR0DECL(int) CPUMR0SaveGuestFPU(PVM pVM, PCPUMCTX pCtx); 1064 1047 1065 /** @} */ 1048 1066 #endif -
trunk/src/VBox/VMM/CPUMInternal.h
r10569 r10630 358 358 __BEGIN_DECLS 359 359 360 DECLASM(int) CPUMHandleLazyFPUAsm(PCPUM pCPUM); 361 DECLASM(int) CPUMRestoreHostFPUStateAsm(PCPUM pCPUM); 360 DECLASM(int) CPUMHandleLazyFPUAsm(PCPUM pCPUM); 361 DECLASM(int) CPUMRestoreHostFPUStateAsm(PCPUM pCPUM); 362 DECLASM(void) CPUMLoadFPUAsm(PCPUMCTX pCtx); 363 DECLASM(void) CPUMSaveFPUAsm(PCPUMCTX pCtx); 362 364 363 365 __END_DECLS -
trunk/src/VBox/VMM/VMMAll/CPUMAllA.asm
r8155 r10630 245 245 ENDPROC CPUMRestoreHostFPUStateAsm 246 246 247 248 ;; 249 ; Restores the guest's FPU/XMM state 250 ; 251 ; @returns 0 252 ; @param pCtx x86:[esp+4] GCC:rdi MSC:rcx CPUMCTX pointer 253 ; 254 align 16 255 BEGINPROC CPUMLoadFPUAsm 256 %ifdef RT_ARCH_AMD64 257 %ifdef RT_OS_WINDOWS 258 mov xDX, rcx 259 %else 260 mov xDX, rdi 261 %endif 262 %else 263 mov xDX, dword [esp + 4] 264 %endif 265 fxrstor [xDX + CPUMCTX.fpu] 266 ret 267 ENDPROC CPUMLoadFPUAsm 268 269 ;; 270 ; Restores the host's FPU/XMM state 271 ; 272 ; @returns 0 273 ; @param pCtx x86:[esp+4] GCC:rdi MSC:rcx CPUMCTX pointer 274 ; 275 align 16 276 BEGINPROC CPUMSaveFPUAsm 277 %ifdef RT_ARCH_AMD64 278 %ifdef RT_OS_WINDOWS 279 mov xDX, rcx 280 %else 281 mov xDX, rdi 282 %endif 283 %else 284 mov xDX, dword [esp + 4] 285 %endif 286 fxsave [xDX + CPUMCTX.fpu] 287 ret 288 ENDPROC CPUMSaveFPUAsm -
trunk/src/VBox/VMM/VMMR0/CPUMR0.cpp
r8155 r10630 109 109 110 110 111 /** 112 * Lazily sync in the FPU/XMM state 113 * 114 * @returns VBox status code. 115 * @param pVM VM handle. 116 * @param pCtx CPU context 117 */ 118 CPUMR0DECL(int) CPUMR0LoadGuestFPU(PVM pVM, PCPUMCTX pCtx) 119 { 120 Assert(pVM->cpum.s.CPUFeatures.edx.u1FXSR); 121 122 /* If the FPU state has already been loaded, then it's a guest trap. */ 123 if (pVM->cpum.s.fUseFlags & CPUM_USED_FPU) 124 { 125 Assert( ((pCtx->cr0 & (X86_CR0_MP | X86_CR0_EM | X86_CR0_TS)) == (X86_CR0_MP | X86_CR0_EM | X86_CR0_TS)) 126 || ((pCtx->cr0 & (X86_CR0_MP | X86_CR0_EM | X86_CR0_TS)) == (X86_CR0_MP | X86_CR0_TS))); 127 return VINF_EM_RAW_GUEST_TRAP; 128 } 129 130 /* 131 * There are two basic actions: 132 * 1. Save host fpu and restore guest fpu. 133 * 2. Generate guest trap. 134 * 135 * When entering the hypervisor we'll always enable MP (for proper wait 136 * trapping) and TS (for intercepting all fpu/mmx/sse stuff). The EM flag 137 * is taken from the guest OS in order to get proper SSE handling. 138 * 139 * 140 * Actions taken depending on the guest CR0 flags: 141 * 142 * 3 2 1 143 * TS | EM | MP | FPUInstr | WAIT :: VMM Action 144 * ------------------------------------------------------------------------ 145 * 0 | 0 | 0 | Exec | Exec :: Clear TS & MP, Save HC, Load GC. 146 * 0 | 0 | 1 | Exec | Exec :: Clear TS, Save HC, Load GC. 147 * 0 | 1 | 0 | #NM | Exec :: Clear TS & MP, Save HC, Load GC. 148 * 0 | 1 | 1 | #NM | Exec :: Clear TS, Save HC, Load GC. 149 * 1 | 0 | 0 | #NM | Exec :: Clear MP, Save HC, Load GC. (EM is already cleared.) 150 * 1 | 0 | 1 | #NM | #NM :: Go to guest taking trap there. 151 * 1 | 1 | 0 | #NM | Exec :: Clear MP, Save HC, Load GC. (EM is already set.) 152 * 1 | 1 | 1 | #NM | #NM :: Go to guest taking trap there. 153 */ 154 155 switch(pCtx->cr0 & (X86_CR0_MP | X86_CR0_EM | X86_CR0_TS)) 156 { 157 case X86_CR0_MP | X86_CR0_TS: 158 case X86_CR0_MP | X86_CR0_EM | X86_CR0_TS: 159 return VINF_EM_RAW_GUEST_TRAP; 160 161 default: 162 break; 163 } 164 CPUMLoadFPUAsm(pCtx); 165 pVM->cpum.s.fUseFlags |= CPUM_USED_FPU; 166 return VINF_SUCCESS; 167 } 168 169 170 /** 171 * Save guest FPU/XMM state 172 * 173 * @returns VBox status code. 174 * @param pVM VM handle. 175 * @param pCtx CPU context 176 */ 177 CPUMR0DECL(int) CPUMR0SaveGuestFPU(PVM pVM, PCPUMCTX pCtx) 178 { 179 Assert(pVM->cpum.s.CPUFeatures.edx.u1FXSR); 180 AssertReturn((pVM->cpum.s.fUseFlags & CPUM_USED_FPU), VINF_SUCCESS); 181 182 CPUMSaveFPUAsm(pCtx); 183 pVM->cpum.s.fUseFlags &= ~CPUM_USED_FPU; 184 return VINF_SUCCESS; 185 }
Note:
See TracChangeset
for help on using the changeset viewer.