Changeset 61547 in vbox for trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-decoding-1.c32
- Timestamp:
- Jun 7, 2016 4:38:07 PM (9 years ago)
- svn:sync-xref-src-repo-rev:
- 107886
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-decoding-1.c32
r61540 r61547 56 56 #define P_RN X86_OP_PRF_REPNZ 57 57 58 #define RM_EAX_EAX ((3 << X86_MODRM_MOD_SHIFT) | (X86_GREG_xAX << X86_MODRM_REG_SHIFT) | (X86_GREG_xAX)) 59 #define RM_EAX_DEREF_EBX ((0 << X86_MODRM_MOD_SHIFT) | (X86_GREG_xAX << X86_MODRM_REG_SHIFT) | (X86_GREG_xBX)) 60 61 #define F_486 0 62 #define F_SSE2 1 63 #define F_SSE3 2 64 #define F_SSE42 4 65 #define F_MOVBE 80 58 66 59 67 CPUDECODE1TST const g_aSimpleTests[] = 60 68 { 61 { 0, 2, 2, { 0x0f, 0x38, } }, 62 { 0, 3, 3, { P_LK, 0x0f, 0x38, } }, 69 /* 70 * fFlags, cbUd, cbOpcodes, abOpcodes 71 */ 72 #if 1 73 /* Using currently undefined 0x0f 0x38 sequences. */ 74 { 0, 2, 3, { 0x0f, 0x38, RM_EAX_EAX, } }, 75 { 0, 2+1, 3+1, { P_LK, 0x0f, 0x38, RM_EAX_EAX, } }, 76 { 0, 2+1, 3+1, { P_RN, 0x0f, 0x38, RM_EAX_EAX, } }, 77 { 0, 2+1, 3+1, { P_RZ, 0x0f, 0x38, RM_EAX_EAX, } }, 78 { 0, 2+2, 3+2, { P_LK, P_LK, 0x0f, 0x38, RM_EAX_EAX, } }, 79 #endif 80 #if 1 81 /* The XADD instruction has empty lines for 66, f3 and f2 prefixes. 82 AMD doesn't do anything special for XADD Ev,Gv as the intel table would indicate. */ 83 { F_486, 99, 3, { 0x0f, 0xc1, RM_EAX_EAX, } }, 84 { F_486, 99, 4, { P_OZ, 0x0f, 0xc1, RM_EAX_EAX, } }, 85 { F_486, 99, 4, { P_RN, 0x0f, 0xc1, RM_EAX_EAX, } }, 86 { F_486, 99, 5, { P_OZ, P_RN, 0x0f, 0xc1, RM_EAX_EAX, } }, 87 { F_486, 99, 5, { P_RN, P_OZ, 0x0f, 0xc1, RM_EAX_EAX, } }, 88 { F_486, 99, 4, { P_RZ, 0x0f, 0xc1, RM_EAX_EAX, } }, 89 { F_486, 99, 5, { P_OZ, P_RZ, 0x0f, 0xc1, RM_EAX_EAX, } }, 90 { F_486, 99, 5, { P_RZ, P_OZ, 0x0f, 0xc1, RM_EAX_EAX, } }, 91 #endif 92 #if 1 93 /* The movnti instruction is confined to the unprefixed lined in the intel manuals. Check how the other lines work. */ 94 { F_SSE2, 3, 3, { 0x0f, 0xc3, RM_EAX_EAX, } }, /* invalid - reg,reg */ 95 { F_SSE2, 99, 3, { 0x0f, 0xc3, RM_EAX_DEREF_EBX, } }, 96 { F_SSE2, 4, 4, { P_OZ, 0x0f, 0xc3, RM_EAX_DEREF_EBX, } }, /* invalid */ 97 { F_SSE2, 4, 4, { P_RN, 0x0f, 0xc3, RM_EAX_DEREF_EBX, } }, /* invalid */ 98 { F_SSE2, 4, 4, { P_RZ, 0x0f, 0xc3, RM_EAX_DEREF_EBX, } }, /* invalid */ 99 { F_SSE2, 4, 4, { P_LK, 0x0f, 0xc3, RM_EAX_DEREF_EBX, } }, /* invalid */ 100 { F_SSE2, 5, 5, { P_RZ, P_LK, 0x0f, 0xc3, RM_EAX_DEREF_EBX, } }, /* invalid */ 101 #endif 102 /* The lddqu instruction requires a 0xf2 prefix, intel only lists 0x66 and empty 103 prefix for it. Check what they really mean by that*/ 104 { F_SSE3, 4, 4, { P_RZ, 0x0f, 0xf0, RM_EAX_EAX, } }, /* invalid - reg, reg */ 105 { F_SSE3, 99, 4, { P_RZ, 0x0f, 0xf0, RM_EAX_DEREF_EBX, } }, 106 { F_SSE3, 99, 5, { P_RZ, P_RZ, 0x0f, 0xf0, RM_EAX_DEREF_EBX, } }, 107 { F_SSE3, 3, 3, { 0x0f, 0xf0, RM_EAX_DEREF_EBX, } }, 108 { F_SSE3, 4, 4, { P_RN, 0x0f, 0xf0, RM_EAX_DEREF_EBX, } }, 109 { F_SSE3, 4, 4, { P_OZ, 0x0f, 0xf0, RM_EAX_DEREF_EBX, } }, 110 { F_SSE3, 4, 4, { P_LK, 0x0f, 0xf0, RM_EAX_DEREF_EBX, } }, 111 { F_SSE3, 5, 5, { P_RZ, P_RN, 0x0f, 0xf0, RM_EAX_DEREF_EBX, } }, 112 { F_SSE3, 99, 5, { P_RZ, P_OZ, 0x0f, 0xf0, RM_EAX_DEREF_EBX, } }, // AMD,why? 113 { F_SSE3, 5, 5, { P_RZ, P_LK, 0x0f, 0xf0, RM_EAX_DEREF_EBX, } }, 114 { F_SSE3, 99, 5, { P_RN, P_RZ, 0x0f, 0xf0, RM_EAX_DEREF_EBX, } }, 115 { F_SSE3, 99, 5, { P_OZ, P_RZ, 0x0f, 0xf0, RM_EAX_DEREF_EBX, } }, 116 { F_SSE3, 5, 5, { P_LK, P_RZ, 0x0f, 0xf0, RM_EAX_DEREF_EBX, } }, 117 { F_SSE3, 99, 5, { P_OZ, P_RZ, 0x0f, 0xf0, RM_EAX_DEREF_EBX, } }, 118 { F_SSE3, 99, 6,{ P_OZ, P_RN, P_RZ, 0x0f, 0xf0, RM_EAX_DEREF_EBX, } }, 119 /** @todo crc32 / movbe */ 63 120 }; 64 121 … … 68 125 * Allocate and initialize a page pair 69 126 */ 70 uint8_t BS3_FAR *pbPages = Bs3MemGuardedTestPageAlloc(BS3MEMKIND_FLAT32); 127 uint8_t BS3_FAR *pbPages; 128 pbPages = Bs3MemGuardedTestPageAlloc(BS3MEMKIND_FLAT32); 71 129 if (pbPages) 72 130 { … … 75 133 BS3TRAPFRAME TrapFrame; 76 134 77 //BS3_CMN_PROTO_STUB(void, Bs3TrapSetJmpAndRestore,(PCBS3REGCTX pCtxRestore, PBS3TRAPFRAME pTrapFrame)); 135 Bs3MemZero(&Ctx, sizeof(Ctx)); 136 Bs3MemZero(&TrapFrame, sizeof(TrapFrame)); 137 138 ASMSetCR0((ASMGetCR0() & ~(X86_CR0_EM | X86_CR0_TS)) | X86_CR0_MP); 139 ASMSetCR4(ASMGetCR4() | X86_CR4_OSFXSR); 140 141 Bs3RegCtxSaveEx(&Ctx, BS3_MODE_CODE_32, 512); 142 Ctx.rbx.u64 = (uintptr_t)pbPages; 78 143 79 144 for (i = 0; i < RT_ELEMENTS(g_aSimpleTests); i++) 80 145 { 81 unsigned off= g_aSimpleTests[i].cbOpcodes;82 while ( off-- > 0)146 unsigned cb = g_aSimpleTests[i].cbOpcodes; 147 while (cb >= 1) 83 148 { 84 Bs3MemCpy(&pbPages[X86_PAGE_SIZE - off], &g_aSimpleTests[i].abOpcodes[0], off); 85 149 uint8_t BS3_FAR *pbRip = &pbPages[X86_PAGE_SIZE - cb]; 150 Bs3MemCpy(pbRip, &g_aSimpleTests[i].abOpcodes[0], cb); 151 Bs3RegCtxSetRipCsFromFlat(&Ctx, (uintptr_t)pbRip); 152 Bs3TrapSetJmpAndRestore(&Ctx, &TrapFrame); 153 #if 0 154 Bs3TestPrintf("\ni=%d cb=%#x (cbUd=%#x cbOpcodes=%#x)\n", i, cb, g_aSimpleTests[i].cbUd, g_aSimpleTests[i].cbOpcodes); 155 Bs3TrapPrintFrame(&TrapFrame); 156 #endif 157 if (cb >= g_aSimpleTests[i].cbUd) 158 { 159 if (TrapFrame.bXcpt != X86_XCPT_UD) 160 Bs3TestFailedF("i=%d cb=%d cbUd=%d cb=%d: expected #UD got %#x\n", 161 i, cb, g_aSimpleTests[i].cbUd, g_aSimpleTests[i].cbOpcodes, TrapFrame.bXcpt); 162 } 163 else if (cb < g_aSimpleTests[i].cbOpcodes) 164 { 165 if (TrapFrame.bXcpt != X86_XCPT_PF) 166 Bs3TestFailedF("i=%d cb=%d cbUd=%d cb=%d: expected #PF (on) got %#x\n", 167 i, cb, g_aSimpleTests[i].cbUd, g_aSimpleTests[i].cbOpcodes, TrapFrame.bXcpt); 168 else if (TrapFrame.Ctx.rip.u32 != (uintptr_t)pbRip) 169 Bs3TestFailedF("i=%d cb=%d cbUd=%d cb=%d: expected #PF rip of %p (on) got %#RX32\n", 170 i, cb, g_aSimpleTests[i].cbUd, g_aSimpleTests[i].cbOpcodes, 171 pbRip, TrapFrame.Ctx.rip.u32); 172 } 173 else 174 { 175 if (TrapFrame.bXcpt != X86_XCPT_PF) 176 Bs3TestFailedF("i=%d cb=%d cbUd=%d cb=%d: expected #PF (after) got %#x\n", 177 i, cb, g_aSimpleTests[i].cbUd, g_aSimpleTests[i].cbOpcodes, TrapFrame.bXcpt); 178 else if (TrapFrame.Ctx.rip.u32 != (uintptr_t)&pbPages[X86_PAGE_SIZE]) 179 Bs3TestFailedF("i=%d cb=%d cbUd=%d cb=%d: expected #PF rip of %p (after) got %#RX32\n", 180 i, cb, g_aSimpleTests[i].cbUd, g_aSimpleTests[i].cbOpcodes, 181 &pbPages[X86_PAGE_SIZE], TrapFrame.Ctx.rip.u32); 182 } 183 cb--; 86 184 } 87 185 } … … 100 198 101 199 102 BS3_DECL(void) Main_p e32()200 BS3_DECL(void) Main_pp32() 103 201 { 104 202 Bs3TestInit("bs3-cpu-decoding-1"); 105 203 Bs3TestPrintf("g_uBs3CpuDetected=%#x\n", g_uBs3CpuDetected); 106 204 107 // Bs3TestDoModes_rm(g_aModeTest, RT_ELEMENTS(g_aModeTest));205 DecodeEdgeTest(); 108 206 109 207 Bs3TestTerm(); 208 209 //for (;;) ASMHalt(); 110 210 } 111 211
Note:
See TracChangeset
for help on using the changeset viewer.