Changeset 39993 in vbox for trunk/src/VBox
- Timestamp:
- Feb 3, 2012 7:30:47 PM (13 years ago)
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAllInstructions.cpp.h
r39990 r39993 3266 3266 3267 3267 /** Opcode 0x0f 0xae. */ 3268 FNIEMOP_STUB(iemOp_Grp15); /** @todo next up: fxrstor */ 3268 FNIEMOP_DEF(iemOp_Grp15) 3269 { 3270 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); 3271 IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo should probably not be raised until we've fetched all the opcode bytes? */ 3272 if ((bRm & X86_MODRM_MOD_MASK) != (3 << X86_MODRM_MOD_SHIFT)) 3273 { 3274 //// 3275 } 3276 else 3277 { 3278 3279 if (pIemCpu->offOpcode == 2 || ) 3280 { 3281 } 3282 pIemCpu-> 3283 switch (pIemCpu->fPrefixes & (IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ | IEM_OP_PRF_SIZE_OP)) 3284 { 3285 case IEM_OP_PRF_SIZE_OP: 3286 3287 3288 case IEM_OP_PRF_REPZ: 3289 } 3290 } 3291 3292 3293 3294 if ((bRm & X86_MODRM_REG_MASK) != (0 << X86_MODRM_REG_SHIFT)) /* only mov Eb,Ib in this group. */ 3295 return IEMOP_RAISE_INVALID_LOCK_PREFIX(); 3296 IEMOP_MNEMONIC("mov Eb,Ib"); 3297 3298 if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT)) 3299 { 3300 /* register access */ 3301 uint8_t u8Imm; IEM_OPCODE_GET_NEXT_U8(&u8Imm); 3302 IEM_MC_BEGIN(0, 0); 3303 IEM_MC_STORE_GREG_U8((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, u8Imm); 3304 IEM_MC_ADVANCE_RIP(); 3305 IEM_MC_END(); 3306 } 3307 else 3308 { 3309 /* memory access. */ 3310 IEM_MC_BEGIN(0, 1); 3311 IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); 3312 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm); 3313 uint8_t u8Imm; IEM_OPCODE_GET_NEXT_U8(&u8Imm); 3314 IEM_MC_STORE_MEM_U8(pIemCpu->iEffSeg, GCPtrEffDst, u8Imm); 3315 IEM_MC_ADVANCE_RIP(); 3316 IEM_MC_END(); 3317 } 3318 return VINF_SUCCESS; 3319 } 3269 3320 3270 3321 -
trunk/src/VBox/VMM/testcase/tstX86-1.cpp
r39989 r39993 67 67 DECLASM(int32_t) x861_Test1(void); 68 68 DECLASM(int32_t) x861_Test2(void); 69 DECLASM(int32_t) x861_Test3(void); 69 70 70 71 … … 159 160 #endif 160 161 162 161 163 int main() 162 164 { … … 198 200 * Do the testing. 199 201 */ 200 RTTestSub(hTest, "part 1"); 201 int32_t rc = x861_Test1(); 202 int32_t rc; 203 #if 1 204 RTTestSub(hTest, "Misc 1"); 205 rc = x861_Test1(); 202 206 if (rc != 0) 203 207 RTTestFailed(hTest, "x861_Test1 -> %d", rc); 204 208 205 RTTestSub(hTest, " part 2");209 RTTestSub(hTest, "Prefixes and groups"); 206 210 rc = x861_Test2(); 207 211 if (rc != 0) 208 212 RTTestFailed(hTest, "x861_Test2 -> %d", rc); 213 214 #endif 215 RTTestSub(hTest, "fxsave / fxrstor and #PFs"); 216 rc = x861_Test3(); 217 if (rc != 0) 218 RTTestFailed(hTest, "x861_Test3 -> %d", rc); 209 219 } 210 220 -
trunk/src/VBox/VMM/testcase/tstX86-1A.asm
r39989 r39993 54 54 ; Defined Constants And Macros ; 55 55 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 56 %define X86_XCPT_UD 6 57 %define X86_XCPT_GP 13 58 %define X86_XCPT_PF 14 56 %define X86_XCPT_UD 6 57 %define X86_XCPT_GP 13 58 %define X86_XCPT_PF 14 59 60 %define PAGE_SIZE 0x1000 59 61 60 62 ;; Reference a global variable … … 75 77 %%trap_end: 76 78 mov eax, __LINE__ 77 jmp . failed79 jmp .return 78 80 BEGINDATA 79 81 %%trapinfo: istruc TRAPINFO … … 930 932 SAVE_ALL_EPILOGUE 931 933 ret 932 .failed2:933 mov eax, -1934 .failed:935 jmp .return936 934 937 935 .check_xmm0_zero_and_mm0_nz: … … 1007 1005 1008 1006 ;; 1007 ; Tests how much fxsave and fxrstor actually accesses of their 512 memory 1008 ; operand. 1009 ; 1010 BEGINPROC x861_Test3 1011 SAVE_ALL_PROLOGUE 1012 1013 call x861_LoadUniqueRegValuesSSE 1014 mov xDI, REF_GLOBAL(g_pbEfExecPage) 1015 1016 ; Check testcase preconditions. 1017 fxsave [xDI] 1018 fxrstor [xDI] 1019 1020 add xDI, PAGE_SIZE - 512 1021 mov xSI, xDI 1022 fxsave [xDI] 1023 fxrstor [xDI] 1024 1025 ; 464:511 are available to software use. Check that they are left 1026 ; untouched by fxsave. 1027 mov eax, 0aabbccddh 1028 mov ecx, 512 / 4 1029 cld 1030 rep stosd 1031 mov xDI, xSI 1032 fxsave [xDI] 1033 1034 mov ebx, 512 1035 .chech_software_area_loop: 1036 cmp [xDI + xBX - 4], eax 1037 jne .chech_software_area_done 1038 sub ebx, 4 1039 jmp .chech_software_area_loop 1040 .chech_software_area_done: 1041 cmp ebx, 464 1042 mov eax, __LINE__ 1043 ja .return 1044 1045 ; Check that a save + restore + save cycle yield the same results. 1046 mov xBX, REF_GLOBAL(g_pbEfExecPage) 1047 mov xDI, xBX 1048 mov eax, 066778899h 1049 mov ecx, 512 * 2 / 4 1050 cld 1051 rep stosd 1052 fxsave [xBX] 1053 1054 call x861_ClearRegistersSSE 1055 mov xBX, REF_GLOBAL(g_pbEfExecPage) 1056 fxrstor [xBX] 1057 1058 fxsave [xBX + 512] 1059 mov xSI, xBX 1060 lea xDI, [xBX + 512] 1061 mov ecx, 512 1062 cld 1063 repe cmpsb 1064 mov eax, __LINE__ 1065 jnz .return 1066 1067 1068 ; 464:511 are available to software use. Let see how carefully access 1069 ; to the full 512 bytes are checked... 1070 call x861_LoadUniqueRegValuesSSE 1071 mov xDI, REF_GLOBAL(g_pbEfExecPage) 1072 add xDI, PAGE_SIZE - 512 1073 ShouldTrap X86_XCPT_PF, fxsave [xDI + 16] 1074 ShouldTrap X86_XCPT_PF, fxsave [xDI + 32] 1075 ShouldTrap X86_XCPT_PF, fxsave [xDI + 48] 1076 ShouldTrap X86_XCPT_PF, fxsave [xDI + 64] 1077 ShouldTrap X86_XCPT_PF, fxsave [xDI + 80] 1078 ShouldTrap X86_XCPT_PF, fxsave [xDI + 96] 1079 ShouldTrap X86_XCPT_PF, fxsave [xDI + 128] 1080 ShouldTrap X86_XCPT_PF, fxsave [xDI + 144] 1081 ShouldTrap X86_XCPT_PF, fxsave [xDI + 160] 1082 ShouldTrap X86_XCPT_PF, fxsave [xDI + 176] 1083 ShouldTrap X86_XCPT_PF, fxsave [xDI + 192] 1084 ShouldTrap X86_XCPT_PF, fxsave [xDI + 208] 1085 ShouldTrap X86_XCPT_PF, fxsave [xDI + 224] 1086 ShouldTrap X86_XCPT_PF, fxsave [xDI + 240] 1087 ShouldTrap X86_XCPT_PF, fxsave [xDI + 256] 1088 ShouldTrap X86_XCPT_PF, fxsave [xDI + 384] 1089 ShouldTrap X86_XCPT_PF, fxsave [xDI + 432] 1090 ShouldTrap X86_XCPT_PF, fxsave [xDI + 496] 1091 1092 ShouldTrap X86_XCPT_PF, fxrstor [xDI + 16] 1093 ShouldTrap X86_XCPT_PF, fxrstor [xDI + 32] 1094 ShouldTrap X86_XCPT_PF, fxrstor [xDI + 48] 1095 ShouldTrap X86_XCPT_PF, fxrstor [xDI + 64] 1096 ShouldTrap X86_XCPT_PF, fxrstor [xDI + 80] 1097 ShouldTrap X86_XCPT_PF, fxrstor [xDI + 96] 1098 ShouldTrap X86_XCPT_PF, fxrstor [xDI + 128] 1099 ShouldTrap X86_XCPT_PF, fxrstor [xDI + 144] 1100 ShouldTrap X86_XCPT_PF, fxrstor [xDI + 160] 1101 ShouldTrap X86_XCPT_PF, fxrstor [xDI + 176] 1102 ShouldTrap X86_XCPT_PF, fxrstor [xDI + 192] 1103 ShouldTrap X86_XCPT_PF, fxrstor [xDI + 208] 1104 ShouldTrap X86_XCPT_PF, fxrstor [xDI + 224] 1105 ShouldTrap X86_XCPT_PF, fxrstor [xDI + 240] 1106 ShouldTrap X86_XCPT_PF, fxrstor [xDI + 256] 1107 ShouldTrap X86_XCPT_PF, fxrstor [xDI + 384] 1108 ShouldTrap X86_XCPT_PF, fxrstor [xDI + 432] 1109 ShouldTrap X86_XCPT_PF, fxrstor [xDI + 496] 1110 1111 ; Unaligned accesses will cause #GP(0). This takes precedence over #PF. 1112 ShouldTrap X86_XCPT_GP, fxsave [xDI + 1] 1113 ShouldTrap X86_XCPT_GP, fxsave [xDI + 2] 1114 ShouldTrap X86_XCPT_GP, fxsave [xDI + 3] 1115 ShouldTrap X86_XCPT_GP, fxsave [xDI + 4] 1116 ShouldTrap X86_XCPT_GP, fxsave [xDI + 5] 1117 ShouldTrap X86_XCPT_GP, fxsave [xDI + 6] 1118 ShouldTrap X86_XCPT_GP, fxsave [xDI + 7] 1119 ShouldTrap X86_XCPT_GP, fxsave [xDI + 8] 1120 ShouldTrap X86_XCPT_GP, fxsave [xDI + 9] 1121 ShouldTrap X86_XCPT_GP, fxsave [xDI + 10] 1122 ShouldTrap X86_XCPT_GP, fxsave [xDI + 11] 1123 ShouldTrap X86_XCPT_GP, fxsave [xDI + 12] 1124 ShouldTrap X86_XCPT_GP, fxsave [xDI + 13] 1125 ShouldTrap X86_XCPT_GP, fxsave [xDI + 14] 1126 ShouldTrap X86_XCPT_GP, fxsave [xDI + 15] 1127 1128 ShouldTrap X86_XCPT_GP, fxrstor [xDI + 1] 1129 ShouldTrap X86_XCPT_GP, fxrstor [xDI + 2] 1130 ShouldTrap X86_XCPT_GP, fxrstor [xDI + 3] 1131 ShouldTrap X86_XCPT_GP, fxrstor [xDI + 4] 1132 ShouldTrap X86_XCPT_GP, fxrstor [xDI + 5] 1133 ShouldTrap X86_XCPT_GP, fxrstor [xDI + 6] 1134 ShouldTrap X86_XCPT_GP, fxrstor [xDI + 7] 1135 ShouldTrap X86_XCPT_GP, fxrstor [xDI + 8] 1136 ShouldTrap X86_XCPT_GP, fxrstor [xDI + 9] 1137 ShouldTrap X86_XCPT_GP, fxrstor [xDI + 10] 1138 ShouldTrap X86_XCPT_GP, fxrstor [xDI + 11] 1139 ShouldTrap X86_XCPT_GP, fxrstor [xDI + 12] 1140 ShouldTrap X86_XCPT_GP, fxrstor [xDI + 13] 1141 ShouldTrap X86_XCPT_GP, fxrstor [xDI + 14] 1142 ShouldTrap X86_XCPT_GP, fxrstor [xDI + 15] 1143 1144 1145 .success: 1146 xor eax, eax 1147 .return: 1148 SAVE_ALL_EPILOGUE 1149 ret 1150 ENDPROC x861_Test3 1151 1152 1153 ;; 1009 1154 ; Terminate the trap info array with a NIL entry. 1010 1155 BEGINDATA
Note:
See TracChangeset
for help on using the changeset viewer.