Changeset 89932 in vbox for trunk/src/VBox/ValidationKit/bootsectors
- Timestamp:
- Jun 28, 2021 2:15:23 PM (4 years ago)
- svn:sync-xref-src-repo-rev:
- 145390
- Location:
- trunk/src/VBox/ValidationKit/bootsectors
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-basic-2-pf.c32
r82968 r89932 1 1 /* $Id$ */ 2 2 /** @file 3 * BS3Kit - bs3-cpu-basic-2, 32-bit C code .3 * BS3Kit - bs3-cpu-basic-2, 32-bit C code for testing \#PF. 4 4 */ 5 5 … … 1805 1805 if (RT_SUCCESS(rc)) 1806 1806 { 1807 if (bMode & BS3_MODE_CODE_64) ASMHalt();1807 //if (bMode & BS3_MODE_CODE_64) ASMHalt(); 1808 1808 /* Set values that derives from the test memory size and paging info. */ 1809 1809 if (State.PgInfo.cEntries == 2) -
trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-basic-2-template.mac
r82968 r89932 33 33 34 34 ;********************************************************************************************************************************* 35 ;* Defined Constants And Macros * 36 ;********************************************************************************************************************************* 37 %ifndef BS3_CPUBAS2_UD_OFF_DEFINED 38 %define BS3_CPUBAS2_UD_OFF_DEFINED 39 %macro BS3_CPUBAS2_UD_OFF 1 40 BS3_GLOBAL_NAME_EX BS3_CMN_NM(%1) %+ _offUD, , 1 41 db BS3_CMN_NM(%1).again - BS3_CMN_NM(%1) 42 %endmacro 43 %endif 44 45 46 ;********************************************************************************************************************************* 35 47 ;* External Symbols * 36 48 ;********************************************************************************************************************************* 37 49 TMPL_BEGIN_TEXT 50 38 51 39 52 … … 47 60 ; SIDT 48 61 ; 62 BS3_CPUBAS2_UD_OFF bs3CpuBasic2_sidt_bx_ud2 49 63 BS3_PROC_BEGIN_CMN bs3CpuBasic2_sidt_bx_ud2, BS3_PBC_NEAR 50 64 sidt [xBX] … … 54 68 BS3_PROC_END_CMN bs3CpuBasic2_sidt_bx_ud2 55 69 70 BS3_CPUBAS2_UD_OFF bs3CpuBasic2_sidt_opsize_bx_ud2 56 71 BS3_PROC_BEGIN_CMN bs3CpuBasic2_sidt_opsize_bx_ud2, BS3_PBC_NEAR 57 72 db X86_OP_PRF_SIZE_OP … … 63 78 64 79 %if TMPL_BITS == 64 80 BS3_CPUBAS2_UD_OFF bs3CpuBasic2_sidt_rexw_bx_ud2 65 81 BS3_PROC_BEGIN_CMN bs3CpuBasic2_sidt_rexw_bx_ud2, BS3_PBC_NEAR 66 82 db X86_OP_REX_W … … 71 87 BS3_PROC_END_CMN bs3CpuBasic2_sidt_rexw_bx_ud2 72 88 89 BS3_CPUBAS2_UD_OFF bs3CpuBasic2_sidt_opsize_rexw_bx_ud2 73 90 BS3_PROC_BEGIN_CMN bs3CpuBasic2_sidt_opsize_rexw_bx_ud2, BS3_PBC_NEAR 74 91 db X86_OP_PRF_SIZE_OP … … 82 99 83 100 %if TMPL_BITS != 64 101 BS3_CPUBAS2_UD_OFF bs3CpuBasic2_sidt_ss_bx_ud2 84 102 BS3_PROC_BEGIN_CMN bs3CpuBasic2_sidt_ss_bx_ud2, BS3_PBC_NEAR 85 103 sidt [ss:xBX] … … 89 107 BS3_PROC_END_CMN bs3CpuBasic2_sidt_ss_bx_ud2 90 108 109 BS3_CPUBAS2_UD_OFF bs3CpuBasic2_sidt_opsize_ss_bx_ud2 91 110 BS3_PROC_BEGIN_CMN bs3CpuBasic2_sidt_opsize_ss_bx_ud2, BS3_PBC_NEAR 92 111 db X86_OP_PRF_SIZE_OP … … 102 121 ; SGDT 103 122 ; 123 BS3_CPUBAS2_UD_OFF bs3CpuBasic2_sgdt_bx_ud2 104 124 BS3_PROC_BEGIN_CMN bs3CpuBasic2_sgdt_bx_ud2, BS3_PBC_NEAR 105 125 sgdt [xBX] … … 109 129 BS3_PROC_END_CMN bs3CpuBasic2_sgdt_bx_ud2 110 130 131 BS3_CPUBAS2_UD_OFF bs3CpuBasic2_sgdt_opsize_bx_ud2 111 132 BS3_PROC_BEGIN_CMN bs3CpuBasic2_sgdt_opsize_bx_ud2, BS3_PBC_NEAR 112 133 db X86_OP_PRF_SIZE_OP … … 118 139 119 140 %if TMPL_BITS == 64 141 BS3_CPUBAS2_UD_OFF bs3CpuBasic2_sgdt_rexw_bx_ud2 120 142 BS3_PROC_BEGIN_CMN bs3CpuBasic2_sgdt_rexw_bx_ud2, BS3_PBC_NEAR 121 143 db X86_OP_REX_W … … 126 148 BS3_PROC_END_CMN bs3CpuBasic2_sgdt_rexw_bx_ud2 127 149 150 BS3_CPUBAS2_UD_OFF bs3CpuBasic2_sgdt_opsize_rexw_bx_ud2 128 151 BS3_PROC_BEGIN_CMN bs3CpuBasic2_sgdt_opsize_rexw_bx_ud2, BS3_PBC_NEAR 129 152 db X86_OP_PRF_SIZE_OP … … 137 160 138 161 %if TMPL_BITS != 64 162 BS3_CPUBAS2_UD_OFF bs3CpuBasic2_sgdt_ss_bx_ud2 139 163 BS3_PROC_BEGIN_CMN bs3CpuBasic2_sgdt_ss_bx_ud2, BS3_PBC_NEAR 140 164 sgdt [ss:xBX] … … 144 168 BS3_PROC_END_CMN bs3CpuBasic2_sgdt_ss_bx_ud2 145 169 170 BS3_CPUBAS2_UD_OFF bs3CpuBasic2_sgdt_opsize_ss_bx_ud2 146 171 BS3_PROC_BEGIN_CMN bs3CpuBasic2_sgdt_opsize_ss_bx_ud2, BS3_PBC_NEAR 147 172 db X86_OP_PRF_SIZE_OP … … 157 182 ; LIDT 158 183 ; 184 BS3_CPUBAS2_UD_OFF bs3CpuBasic2_lidt_bx__sidt_es_di__lidt_es_si__ud2 159 185 BS3_PROC_BEGIN_CMN bs3CpuBasic2_lidt_bx__sidt_es_di__lidt_es_si__ud2, BS3_PBC_NEAR 160 186 lidt [xBX] … … 167 193 BS3_PROC_END_CMN bs3CpuBasic2_lidt_bx__sidt_es_di__lidt_es_si__ud2 168 194 195 BS3_CPUBAS2_UD_OFF bs3CpuBasic2_lidt_opsize_bx__sidt_es_di__lidt_es_si__ud2 169 196 BS3_PROC_BEGIN_CMN bs3CpuBasic2_lidt_opsize_bx__sidt_es_di__lidt_es_si__ud2, BS3_PBC_NEAR 170 197 db X86_OP_PRF_SIZE_OP … … 179 206 180 207 %if TMPL_BITS == 16 208 BS3_CPUBAS2_UD_OFF bs3CpuBasic2_lidt_opsize_bx__sidt32_es_di__lidt_es_si__ud2 181 209 BS3_PROC_BEGIN_CMN bs3CpuBasic2_lidt_opsize_bx__sidt32_es_di__lidt_es_si__ud2, BS3_PBC_NEAR 182 210 db X86_OP_PRF_SIZE_OP … … 197 225 198 226 %if TMPL_BITS == 64 227 BS3_CPUBAS2_UD_OFF bs3CpuBasic2_lidt_rexw_bx__sidt_es_di__lidt_es_si__ud2 199 228 BS3_PROC_BEGIN_CMN bs3CpuBasic2_lidt_rexw_bx__sidt_es_di__lidt_es_si__ud2, BS3_PBC_NEAR 200 229 db X86_OP_REX_W … … 208 237 BS3_PROC_END_CMN bs3CpuBasic2_lidt_rexw_bx__sidt_es_di__lidt_es_si__ud2 209 238 239 BS3_CPUBAS2_UD_OFF bs3CpuBasic2_lidt_opsize_rexw_bx__sidt_es_di__lidt_es_si__ud2 210 240 BS3_PROC_BEGIN_CMN bs3CpuBasic2_lidt_opsize_rexw_bx__sidt_es_di__lidt_es_si__ud2, BS3_PBC_NEAR 211 241 db X86_OP_PRF_SIZE_OP … … 222 252 223 253 %if TMPL_BITS != 64 254 BS3_CPUBAS2_UD_OFF bs3CpuBasic2_lidt_ss_bx__sidt_es_di__lidt_es_si__ud2 224 255 BS3_PROC_BEGIN_CMN bs3CpuBasic2_lidt_ss_bx__sidt_es_di__lidt_es_si__ud2, BS3_PBC_NEAR 225 256 lidt [ss:xBX] … … 232 263 BS3_PROC_END_CMN bs3CpuBasic2_lidt_ss_bx__sidt_es_di__lidt_es_si__ud2 233 264 265 BS3_CPUBAS2_UD_OFF bs3CpuBasic2_lidt_opsize_ss_bx__sidt_es_di__lidt_es_si__ud2 234 266 BS3_PROC_BEGIN_CMN bs3CpuBasic2_lidt_opsize_ss_bx__sidt_es_di__lidt_es_si__ud2, BS3_PBC_NEAR 235 267 db X86_OP_PRF_SIZE_OP … … 248 280 ; LGDT 249 281 ; 282 BS3_CPUBAS2_UD_OFF bs3CpuBasic2_lgdt_bx__sgdt_es_di__lgdt_es_si__ud2 250 283 BS3_PROC_BEGIN_CMN bs3CpuBasic2_lgdt_bx__sgdt_es_di__lgdt_es_si__ud2, BS3_PBC_NEAR 251 284 lgdt [xBX] … … 258 291 BS3_PROC_END_CMN bs3CpuBasic2_lgdt_bx__sgdt_es_di__lgdt_es_si__ud2 259 292 293 BS3_CPUBAS2_UD_OFF bs3CpuBasic2_lgdt_opsize_bx__sgdt_es_di__lgdt_es_si__ud2 260 294 BS3_PROC_BEGIN_CMN bs3CpuBasic2_lgdt_opsize_bx__sgdt_es_di__lgdt_es_si__ud2, BS3_PBC_NEAR 261 295 db X86_OP_PRF_SIZE_OP … … 270 304 271 305 %if TMPL_BITS == 64 306 BS3_CPUBAS2_UD_OFF bs3CpuBasic2_lgdt_rexw_bx__sgdt_es_di__lgdt_es_si__ud2 272 307 BS3_PROC_BEGIN_CMN bs3CpuBasic2_lgdt_rexw_bx__sgdt_es_di__lgdt_es_si__ud2, BS3_PBC_NEAR 273 308 db X86_OP_REX_W … … 281 316 BS3_PROC_END_CMN bs3CpuBasic2_lgdt_rexw_bx__sgdt_es_di__lgdt_es_si__ud2 282 317 318 BS3_CPUBAS2_UD_OFF bs3CpuBasic2_lgdt_opsize_rexw_bx__sgdt_es_di__lgdt_es_si__ud2 283 319 BS3_PROC_BEGIN_CMN bs3CpuBasic2_lgdt_opsize_rexw_bx__sgdt_es_di__lgdt_es_si__ud2, BS3_PBC_NEAR 284 320 db X86_OP_PRF_SIZE_OP … … 295 331 296 332 %if TMPL_BITS != 64 333 BS3_CPUBAS2_UD_OFF bs3CpuBasic2_lgdt_ss_bx__sgdt_es_di__lgdt_es_si__ud2 297 334 BS3_PROC_BEGIN_CMN bs3CpuBasic2_lgdt_ss_bx__sgdt_es_di__lgdt_es_si__ud2, BS3_PBC_NEAR 298 335 lgdt [ss:xBX] … … 305 342 BS3_PROC_END_CMN bs3CpuBasic2_lgdt_ss_bx__sgdt_es_di__lgdt_es_si__ud2 306 343 344 BS3_CPUBAS2_UD_OFF bs3CpuBasic2_lgdt_opsize_ss_bx__sgdt_es_di__lgdt_es_si__ud2 307 345 BS3_PROC_BEGIN_CMN bs3CpuBasic2_lgdt_opsize_ss_bx__sgdt_es_di__lgdt_es_si__ud2, BS3_PBC_NEAR 308 346 db X86_OP_PRF_SIZE_OP … … 322 360 323 361 ; For testing read access. 362 BS3_CPUBAS2_UD_OFF bs3CpuBasic2_mov_ax_ds_bx__ud2 324 363 BS3_PROC_BEGIN_CMN bs3CpuBasic2_mov_ax_ds_bx__ud2, BS3_PBC_NEAR 325 364 mov xAX, [xBX] … … 331 370 332 371 ; For testing write access. 372 BS3_CPUBAS2_UD_OFF bs3CpuBasic2_mov_ds_bx_ax__ud2 333 373 BS3_PROC_BEGIN_CMN bs3CpuBasic2_mov_ds_bx_ax__ud2, BS3_PBC_NEAR 334 374 mov [xBX], xAX … … 340 380 341 381 ; For testing read+write access. 382 BS3_CPUBAS2_UD_OFF bs3CpuBasic2_xchg_ds_bx_ax__ud2 342 383 BS3_PROC_BEGIN_CMN bs3CpuBasic2_xchg_ds_bx_ax__ud2, BS3_PBC_NEAR 343 384 xchg [xBX], xAX … … 349 390 350 391 ; Another read+write access test. 392 BS3_CPUBAS2_UD_OFF bs3CpuBasic2_cmpxchg_ds_bx_cx__ud2 351 393 BS3_PROC_BEGIN_CMN bs3CpuBasic2_cmpxchg_ds_bx_cx__ud2, BS3_PBC_NEAR 352 394 cmpxchg [xBX], xCX … … 358 400 359 401 ; For testing read access from an aborted instruction: DIV by zero 402 BS3_CPUBAS2_UD_OFF bs3CpuBasic2_div_ds_bx__ud2 360 403 BS3_PROC_BEGIN_CMN bs3CpuBasic2_div_ds_bx__ud2, BS3_PBC_NEAR 361 404 div xPRE [xBX] … … 367 410 368 411 ; Two memory operands: push [mem] 412 BS3_CPUBAS2_UD_OFF bs3CpuBasic2_push_ds_bx__ud2 369 413 BS3_PROC_BEGIN_CMN bs3CpuBasic2_push_ds_bx__ud2, BS3_PBC_NEAR 370 414 push xPRE [xBX] … … 375 419 376 420 ; Two memory operands: pop [mem] 421 BS3_CPUBAS2_UD_OFF bs3CpuBasic2_push_ax__pop_ds_bx__ud2 377 422 BS3_PROC_BEGIN_CMN bs3CpuBasic2_push_ax__pop_ds_bx__ud2, BS3_PBC_NEAR 378 423 push xAX … … 384 429 385 430 ; Two memory operands: call [mem] 431 BS3_CPUBAS2_UD_OFF bs3CpuBasic2_call_ds_bx__ud2 386 432 BS3_PROC_BEGIN_CMN bs3CpuBasic2_call_ds_bx__ud2, BS3_PBC_NEAR 387 433 call xPRE [xBX] … … 392 438 393 439 ; For testing #GP vs #PF write 440 BS3_CPUBAS2_UD_OFF bs3CpuBasic2_insb__ud2 394 441 BS3_PROC_BEGIN_CMN bs3CpuBasic2_insb__ud2, BS3_PBC_NEAR 395 442 insb -
trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-basic-2-x0.c
r82968 r89932 53 53 54 54 55 /** @name MYOP_XXX - Values for FNBS3CPUBASIC2ACTSTCODE::fOp. 56 * @{ */ 57 #define MYOP_LD 0x1 58 #define MYOP_ST 0x2 59 #define MYOP_LD_ST 0x3 60 #define MYOP_EFL 0x4 61 #define MYOP_LD_DIV 0x5 62 /** @} */ 63 64 55 65 /********************************************************************************************************************************* 56 66 * Structures and Typedefs * … … 71 81 uint8_t fFlags; 72 82 } BS3CB2SIDTSGDT; 83 84 85 typedef void BS3_CALL FNBS3CPUBASIC2ACSNIPPET(void); 86 87 typedef struct FNBS3CPUBASIC2ACTSTCODE 88 { 89 FNBS3CPUBASIC2ACSNIPPET BS3_FAR *pfn; 90 uint8_t fOp; 91 uint8_t cbMem; 92 } FNBS3CPUBASIC2ACTSTCODE; 93 typedef FNBS3CPUBASIC2ACTSTCODE const *PCFNBS3CPUBASIC2ACTSTCODE; 94 95 typedef struct BS3CPUBASIC2ACTTSTCMNMODE 96 { 97 uint8_t bMode; 98 uint16_t cEntries; 99 PCFNBS3CPUBASIC2ACTSTCODE paEntries; 100 } BS3CPUBASIC2PFTTSTCMNMODE; 101 typedef BS3CPUBASIC2PFTTSTCMNMODE const *PCBS3CPUBASIC2PFTTSTCMNMODE; 73 102 74 103 … … 142 171 extern FNBS3FAR bs3CpuBasic2_lgdt_opsize_rexw_bx__sgdt_es_di__lgdt_es_si__ud2_c64; 143 172 173 174 /* bs3-cpu-basic-2-template.mac: */ 175 FNBS3CPUBASIC2ACSNIPPET bs3CpuBasic2_mov_ax_ds_bx__ud2_c16; 176 FNBS3CPUBASIC2ACSNIPPET bs3CpuBasic2_mov_ds_bx_ax__ud2_c16; 177 FNBS3CPUBASIC2ACSNIPPET bs3CpuBasic2_xchg_ds_bx_ax__ud2_c16; 178 FNBS3CPUBASIC2ACSNIPPET bs3CpuBasic2_cmpxchg_ds_bx_cx__ud2_c16; 179 FNBS3CPUBASIC2ACSNIPPET bs3CpuBasic2_div_ds_bx__ud2_c16; 180 181 FNBS3CPUBASIC2ACSNIPPET bs3CpuBasic2_mov_ax_ds_bx__ud2_c32; 182 FNBS3CPUBASIC2ACSNIPPET bs3CpuBasic2_mov_ds_bx_ax__ud2_c32; 183 FNBS3CPUBASIC2ACSNIPPET bs3CpuBasic2_xchg_ds_bx_ax__ud2_c32; 184 FNBS3CPUBASIC2ACSNIPPET bs3CpuBasic2_cmpxchg_ds_bx_cx__ud2_c32; 185 FNBS3CPUBASIC2ACSNIPPET bs3CpuBasic2_div_ds_bx__ud2_c32; 186 187 FNBS3CPUBASIC2ACSNIPPET bs3CpuBasic2_mov_ax_ds_bx__ud2_c64; 188 FNBS3CPUBASIC2ACSNIPPET bs3CpuBasic2_mov_ds_bx_ax__ud2_c64; 189 FNBS3CPUBASIC2ACSNIPPET bs3CpuBasic2_xchg_ds_bx_ax__ud2_c64; 190 FNBS3CPUBASIC2ACSNIPPET bs3CpuBasic2_cmpxchg_ds_bx_cx__ud2_c64; 191 FNBS3CPUBASIC2ACSNIPPET bs3CpuBasic2_div_ds_bx__ud2_c64; 144 192 145 193 … … 284 332 285 333 334 static const FNBS3CPUBASIC2ACTSTCODE g_aCmn16[] = 335 { 336 { bs3CpuBasic2_mov_ax_ds_bx__ud2_c16, MYOP_LD, 2 }, 337 { bs3CpuBasic2_mov_ds_bx_ax__ud2_c16, MYOP_ST, 2 }, 338 { bs3CpuBasic2_xchg_ds_bx_ax__ud2_c16, MYOP_LD_ST, 2 }, 339 { bs3CpuBasic2_cmpxchg_ds_bx_cx__ud2_c16, MYOP_LD_ST | MYOP_EFL, 2 }, 340 { bs3CpuBasic2_div_ds_bx__ud2_c16, MYOP_LD_DIV, 2 }, 341 }; 342 343 static const FNBS3CPUBASIC2ACTSTCODE g_aCmn32[] = 344 { 345 { bs3CpuBasic2_mov_ax_ds_bx__ud2_c32, MYOP_LD, 4 }, 346 { bs3CpuBasic2_mov_ds_bx_ax__ud2_c32, MYOP_ST, 4 }, 347 { bs3CpuBasic2_xchg_ds_bx_ax__ud2_c32, MYOP_LD_ST, 4 }, 348 { bs3CpuBasic2_cmpxchg_ds_bx_cx__ud2_c32, MYOP_LD_ST | MYOP_EFL, 4 }, 349 { bs3CpuBasic2_div_ds_bx__ud2_c32, MYOP_LD_DIV, 4 }, 350 }; 351 352 static const FNBS3CPUBASIC2ACTSTCODE g_aCmn64[] = 353 { 354 { bs3CpuBasic2_mov_ax_ds_bx__ud2_c64, MYOP_LD, 8 }, 355 { bs3CpuBasic2_mov_ds_bx_ax__ud2_c64, MYOP_ST, 8 }, 356 { bs3CpuBasic2_xchg_ds_bx_ax__ud2_c64, MYOP_LD_ST, 8 }, 357 { bs3CpuBasic2_cmpxchg_ds_bx_cx__ud2_c64, MYOP_LD_ST | MYOP_EFL, 8 }, 358 { bs3CpuBasic2_div_ds_bx__ud2_c64, MYOP_LD_DIV, 8 }, 359 }; 360 361 static const BS3CPUBASIC2PFTTSTCMNMODE g_aCmnModes[] = 362 { 363 { BS3_MODE_CODE_16, RT_ELEMENTS(g_aCmn16), g_aCmn16 }, 364 { BS3_MODE_CODE_V86, RT_ELEMENTS(g_aCmn16), g_aCmn16 }, 365 { BS3_MODE_CODE_32, RT_ELEMENTS(g_aCmn32), g_aCmn32 }, 366 { BS3_MODE_CODE_64, RT_ELEMENTS(g_aCmn64), g_aCmn64 }, 367 }; 368 369 286 370 /** 287 371 * Sets globals according to the mode. … … 450 534 { 451 535 bs3CpuBasic2_CompareCpuTrapCtx(pTrapCtx, pStartCtx, 0 /*no error code*/, X86_XCPT_UD, true /*f486ResumeFlagHint*/); 536 } 537 538 /** 539 * Compares \#AC trap. 540 */ 541 static void bs3CpuBasic2_CompareAcCtx(PCBS3TRAPFRAME pTrapCtx, PCBS3REGCTX pStartCtx) 542 { 543 bs3CpuBasic2_CompareCpuTrapCtx(pTrapCtx, pStartCtx, 0 /*always zero*/, X86_XCPT_AC, true /*f486ResumeFlagHint*/); 452 544 } 453 545 … … 1424 1516 } 1425 1517 #endif /* convert me */ 1518 1519 1520 static void bs3CpuBasic2_RaiseXcpt11Worker(uint8_t bMode, uint8_t *pbBuf, bool fAm, 1521 BS3CPUBASIC2PFTTSTCMNMODE const BS3_FAR *pCmn) 1522 { 1523 BS3TRAPFRAME TrapCtx; 1524 BS3REGCTX Ctx; 1525 BS3REGCTX CtxUdExpected; 1526 uint8_t const cRings = bMode == BS3_MODE_RM ? 1 : 4; 1527 uint8_t iRing; 1528 uint16_t iTest; 1529 1530 /* make sure they're allocated */ 1531 Bs3MemZero(&TrapCtx, sizeof(TrapCtx)); 1532 Bs3MemZero(&Ctx, sizeof(Ctx)); 1533 Bs3MemZero(&CtxUdExpected, sizeof(CtxUdExpected)); 1534 1535 /* 1536 * Test all relevant rings. 1537 * 1538 * The memory operand is ds:xBX, so point it to pbBuf. 1539 * The test snippets mostly use xAX as operand, with the div 1540 * one also using xDX, so make sure they make some sense. 1541 */ 1542 Bs3RegCtxSaveEx(&Ctx, bMode, 0); 1543 1544 for (iRing = 0; iRing < cRings; iRing++) 1545 { 1546 uint32_t uEbx; 1547 uint8_t fAc; 1548 1549 Bs3RegCtxConvertToRingX(&Ctx, iRing); 1550 1551 Bs3RegCtxSetGrpDsFromCurPtr(&Ctx, &Ctx.rbx, pbBuf); 1552 uEbx = Ctx.rbx.u32; 1553 1554 Ctx.rax.u = (bMode & BS3_MODE_CODE_MASK) == BS3_MODE_CODE_64 1555 ? UINT64_C(0x80868028680386fe) : UINT32_C(0x65020686); 1556 Ctx.rdx.u = UINT32_C(0x00100100); /* careful with range due to div */ 1557 1558 Bs3MemCpy(&CtxUdExpected, &Ctx, sizeof(Ctx)); 1559 1560 /* 1561 * AC flag loop. 1562 */ 1563 for (fAc = 0; fAc < 2; fAc++) 1564 { 1565 if (fAc) 1566 Ctx.rflags.u32 |= X86_EFL_AC; 1567 else 1568 Ctx.rflags.u32 &= ~X86_EFL_AC; 1569 1570 /* 1571 * Loop over the test snippets. 1572 */ 1573 for (iTest = 0; iTest < pCmn->cEntries; iTest++) 1574 { 1575 uint8_t const cbMem = pCmn->paEntries[iTest].cbMem; 1576 uint8_t const fOp = pCmn->paEntries[iTest].fOp; 1577 uint8_t offMem; 1578 uint8_t BS3_FAR *poffUd = (uint8_t BS3_FAR *)Bs3SelLnkPtrToCurPtr(pCmn->paEntries[iTest].pfn); 1579 Bs3RegCtxSetRipCsFromLnkPtr(&Ctx, pCmn->paEntries[iTest].pfn); 1580 CtxUdExpected.rip = Ctx.rip; 1581 CtxUdExpected.rip.u = Ctx.rip.u + poffUd[-1]; 1582 CtxUdExpected.cs = Ctx.cs; 1583 CtxUdExpected.rflags = Ctx.rflags; 1584 if (bMode == BS3_MODE_RM) CtxUdExpected.rflags.u32 &= ~X86_EFL_AC; /** @todo investigate. automatically cleared, or is it just our code? */ 1585 CtxUdExpected.rdx = Ctx.rdx; 1586 CtxUdExpected.rax = Ctx.rax; 1587 if (fOp & MYOP_LD) 1588 { 1589 switch (cbMem) 1590 { 1591 case 2: 1592 CtxUdExpected.rax.u16 = 0x0101; 1593 break; 1594 case 4: 1595 CtxUdExpected.rax.u32 = UINT32_C(0x01010101); 1596 break; 1597 case 8: 1598 CtxUdExpected.rax.u64 = UINT64_C(0x0101010101010101); 1599 break; 1600 } 1601 } 1602 1603 /* 1604 * Buffer misalignment loop. 1605 */ 1606 for (offMem = 0; offMem < cbMem; offMem++) 1607 { 1608 unsigned offBuf = cbMem * 2 + cbMem; 1609 while (offBuf-- > 0) 1610 pbBuf[offBuf] = 1; /* byte-by-byte to make sure it doesn't trigger AC. */ 1611 1612 CtxUdExpected.rbx.u32 = Ctx.rbx.u32 = uEbx + offMem; /* ASSUMES memory in first 4GB (cur stack, so okay). */ 1613 if (BS3_MODE_IS_16BIT_SYS(bMode)) 1614 g_uBs3TrapEipHint = Ctx.rip.u32; 1615 1616 //Bs3TestPrintf("iRing=%d iTest=%d cs:rip=%04RX16:%08RX32 ds:rbx=%04RX16:%08RX32\n", 1617 // iRing, iTest, Ctx.cs, Ctx.rip.u32, Ctx.ds, Ctx.rbx.u32); 1618 1619 Bs3TrapSetJmpAndRestore(&Ctx, &TrapCtx); 1620 1621 if (!fAm || iRing != 3 || !fAc || !(offMem & (cbMem - 1))) /** @todo assumes cbMem is a power of two! */ 1622 { 1623 if (fOp & MYOP_EFL) 1624 { 1625 CtxUdExpected.rflags.u16 &= ~X86_EFL_STATUS_BITS; 1626 CtxUdExpected.rflags.u16 |= TrapCtx.Ctx.rflags.u16 & X86_EFL_STATUS_BITS; 1627 } 1628 if (fOp == MYOP_LD_DIV) 1629 { 1630 CtxUdExpected.rax = TrapCtx.Ctx.rax; 1631 CtxUdExpected.rdx = TrapCtx.Ctx.rdx; 1632 } 1633 bs3CpuBasic2_CompareUdCtx(&TrapCtx, &CtxUdExpected); 1634 } 1635 else 1636 { 1637 bs3CpuBasic2_CompareAcCtx(&TrapCtx, &Ctx); 1638 } 1639 1640 g_usBs3TestStep++; 1641 } 1642 } 1643 } 1644 } 1645 } 1646 1647 1648 /** 1649 * Entrypoint for \#AC tests. 1650 * 1651 * @returns 0 or BS3TESTDOMODE_SKIPPED. 1652 * @param bMode The CPU mode we're testing. 1653 * 1654 * @note When testing v8086 code, we'll be running in v8086 mode. So, careful 1655 * with control registers and such. 1656 */ 1657 BS3_DECL_FAR(uint8_t) BS3_CMN_FAR_NM(bs3CpuBasic2_RaiseXcpt11)(uint8_t bMode) 1658 { 1659 uint8_t abBuf[4096 /** @todo 128 - but that went crazy in real mode; now it's long mode going wrong. */]; 1660 uint8_t BS3_FAR *pbBuf; 1661 unsigned idxCmnModes; 1662 uint32_t fCr0; 1663 Bs3MemZero(&abBuf, sizeof(abBuf)); 1664 1665 /* 1666 * Skip if 386 or older. 1667 */ 1668 if ((g_uBs3CpuDetected & BS3CPU_TYPE_MASK) < BS3CPU_80486) 1669 { 1670 Bs3TestSkipped("#AC test requires 486 or later"); 1671 return BS3TESTDOMODE_SKIPPED; 1672 } 1673 1674 bs3CpuBasic2_SetGlobals(bMode); 1675 1676 /* Get us a 64-byte aligned buffer. */ 1677 pbBuf = abBuf; 1678 if (BS3_FP_OFF(pbBuf) & 63) 1679 pbBuf = &abBuf[64 - BS3_FP_OFF(pbBuf) & 63]; 1680 //Bs3TestPrintf("pbBuf=%p\n", pbBuf); 1681 1682 /* Find the g_aCmnModes entry. */ 1683 idxCmnModes = 0; 1684 while (g_aCmnModes[idxCmnModes].bMode != (bMode & BS3_MODE_CODE_MASK)) 1685 idxCmnModes++; 1686 //Bs3TestPrintf("idxCmnModes=%d bMode=%#x\n", idxCmnModes, bMode); 1687 1688 /* First round is w/o aligment checks enabled. */ 1689 fCr0 = Bs3RegGetCr0(); 1690 BS3_ASSERT(!(fCr0 & X86_CR0_AM)); 1691 Bs3RegSetCr0(fCr0 & ~X86_CR0_AM); 1692 bs3CpuBasic2_RaiseXcpt11Worker(bMode, pbBuf, false /*fAm*/, &g_aCmnModes[idxCmnModes]); 1693 1694 #if 1 1695 /* The second round is with aligment checks enabled. */ 1696 Bs3RegSetCr0(Bs3RegGetCr0() | X86_CR0_AM); 1697 bs3CpuBasic2_RaiseXcpt11Worker(bMode, pbBuf, true /*fAm*/, &g_aCmnModes[idxCmnModes]); 1698 #endif 1699 1700 Bs3RegSetCr0(fCr0); 1701 return 0; 1702 } 1426 1703 1427 1704 -
trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-basic-2.c
r83021 r89932 39 39 BS3TESTMODE_PROTOTYPES_MODE(bs3CpuBasic2_RaiseXcpt1); 40 40 41 FNBS3TESTDOMODE bs3CpuBasic2_RaiseXcpt11_f16; 41 42 FNBS3TESTDOMODE bs3CpuBasic2_sidt_f16; 42 43 FNBS3TESTDOMODE bs3CpuBasic2_sgdt_f16; … … 59 60 static const BS3TESTMODEBYONEENTRY g_aModeByOneTests[] = 60 61 { 62 { "#ac", bs3CpuBasic2_RaiseXcpt11_f16, 0 }, 63 #if 1 61 64 { "iret", bs3CpuBasic2_iret_f16, 0 }, 62 65 { "sidt", bs3CpuBasic2_sidt_f16, 0 }, … … 64 67 { "lidt", bs3CpuBasic2_lidt_f16, 0 }, 65 68 { "lgdt", bs3CpuBasic2_lgdt_f16, 0 }, 69 #endif 66 70 }; 67 71 … … 77 81 */ 78 82 NOREF(g_aModeTest); NOREF(g_aModeByOneTests); /* for when commenting out bits */ 79 #if 180 83 Bs3TestDoModes_rm(g_aModeTest, RT_ELEMENTS(g_aModeTest)); 81 84 Bs3TestDoModesByOne_rm(g_aModeByOneTests, RT_ELEMENTS(g_aModeByOneTests), 0); 82 # endif85 #if 1 83 86 84 87 /* … … 86 89 */ 87 90 Bs3SwitchTo32BitAndCallC_rm(bs3CpuBasic2_Do32BitTests_pe32, 0); 91 #endif 88 92 89 93 Bs3TestTerm(); 94 Bs3Shutdown(); 90 95 for (;;) { ASMHalt(); } 91 96 }
Note:
See TracChangeset
for help on using the changeset viewer.