Changeset 59747 in vbox for trunk/src/VBox/Runtime/testcase/tstRTInlineAsm.cpp
- Timestamp:
- Feb 19, 2016 11:18:18 PM (9 years ago)
- svn:sync-xref-src-repo-rev:
- 105617
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Runtime/testcase/tstRTInlineAsm.cpp
r59527 r59747 47 47 # include <iprt/time.h> 48 48 #endif 49 #include <iprt/rand.h> 49 50 #include <iprt/stream.h> 50 51 #include <iprt/string.h> … … 1322 1323 RTTESTI_CHECK(!ASMMemIsZeroPage(pvPage2)); 1323 1324 ((uint8_t *)pvPage2)[off] = 0; 1325 } 1326 1327 RTTestSubDone(hTest); 1328 } 1329 1330 1331 void tstASMMemFirstMismatchingU8(RTTEST hTest) 1332 { 1333 RTTestSub(hTest, "ASMMemFirstMismatchingU8"); 1334 1335 uint8_t *pbPage1 = (uint8_t *)RTTestGuardedAllocHead(hTest, PAGE_SIZE); 1336 uint8_t *pbPage2 = (uint8_t *)RTTestGuardedAllocTail(hTest, PAGE_SIZE); 1337 RTTESTI_CHECK_RETV(pbPage1 && pbPage2); 1338 1339 memset(pbPage1, 0, PAGE_SIZE); 1340 memset(pbPage2, 0, PAGE_SIZE); 1341 RTTESTI_CHECK(ASMMemFirstMismatchingU8(pbPage1, PAGE_SIZE, 0) == NULL); 1342 RTTESTI_CHECK(ASMMemFirstMismatchingU8(pbPage2, PAGE_SIZE, 0) == NULL); 1343 RTTESTI_CHECK(ASMMemFirstMismatchingU8(pbPage1, PAGE_SIZE, 1) == pbPage1); 1344 RTTESTI_CHECK(ASMMemFirstMismatchingU8(pbPage2, PAGE_SIZE, 1) == pbPage2); 1345 RTTESTI_CHECK(ASMMemFirstMismatchingU8(pbPage1, PAGE_SIZE, 0x87) == pbPage1); 1346 RTTESTI_CHECK(ASMMemFirstMismatchingU8(pbPage2, PAGE_SIZE, 0x87) == pbPage2); 1347 RTTESTI_CHECK(ASMMemIsZero(pbPage1, PAGE_SIZE)); 1348 RTTESTI_CHECK(ASMMemIsZero(pbPage2, PAGE_SIZE)); 1349 RTTESTI_CHECK(ASMMemIsAllU8(pbPage1, PAGE_SIZE, 0)); 1350 RTTESTI_CHECK(ASMMemIsAllU8(pbPage2, PAGE_SIZE, 0)); 1351 RTTESTI_CHECK(!ASMMemIsAllU8(pbPage1, PAGE_SIZE, 0x34)); 1352 RTTESTI_CHECK(!ASMMemIsAllU8(pbPage2, PAGE_SIZE, 0x88)); 1353 unsigned cbSub = 32; 1354 while (cbSub-- > 0) 1355 { 1356 RTTESTI_CHECK(ASMMemFirstMismatchingU8(&pbPage1[PAGE_SIZE - cbSub], cbSub, 0) == NULL); 1357 RTTESTI_CHECK(ASMMemFirstMismatchingU8(&pbPage2[PAGE_SIZE - cbSub], cbSub, 0) == NULL); 1358 RTTESTI_CHECK(ASMMemFirstMismatchingU8(pbPage1, cbSub, 0) == NULL); 1359 RTTESTI_CHECK(ASMMemFirstMismatchingU8(pbPage2, cbSub, 0) == NULL); 1360 1361 RTTESTI_CHECK(ASMMemFirstMismatchingU8(&pbPage1[PAGE_SIZE - cbSub], cbSub, 0x34) == &pbPage1[PAGE_SIZE - cbSub] || !cbSub); 1362 RTTESTI_CHECK(ASMMemFirstMismatchingU8(&pbPage2[PAGE_SIZE - cbSub], cbSub, 0x99) == &pbPage2[PAGE_SIZE - cbSub] || !cbSub); 1363 RTTESTI_CHECK(ASMMemFirstMismatchingU8(pbPage1, cbSub, 0x42) == pbPage1 || !cbSub); 1364 RTTESTI_CHECK(ASMMemFirstMismatchingU8(pbPage2, cbSub, 0x88) == pbPage2 || !cbSub); 1365 } 1366 1367 memset(pbPage1, 0xff, PAGE_SIZE); 1368 memset(pbPage2, 0xff, PAGE_SIZE); 1369 RTTESTI_CHECK(ASMMemFirstMismatchingU8(pbPage1, PAGE_SIZE, 0xff) == NULL); 1370 RTTESTI_CHECK(ASMMemFirstMismatchingU8(pbPage2, PAGE_SIZE, 0xff) == NULL); 1371 RTTESTI_CHECK(ASMMemFirstMismatchingU8(pbPage1, PAGE_SIZE, 0xfe) == pbPage1); 1372 RTTESTI_CHECK(ASMMemFirstMismatchingU8(pbPage2, PAGE_SIZE, 0xfe) == pbPage2); 1373 RTTESTI_CHECK(!ASMMemIsZero(pbPage1, PAGE_SIZE)); 1374 RTTESTI_CHECK(!ASMMemIsZero(pbPage2, PAGE_SIZE)); 1375 RTTESTI_CHECK(ASMMemIsAllU8(pbPage1, PAGE_SIZE, 0xff)); 1376 RTTESTI_CHECK(ASMMemIsAllU8(pbPage2, PAGE_SIZE, 0xff)); 1377 RTTESTI_CHECK(!ASMMemIsAllU8(pbPage1, PAGE_SIZE, 0)); 1378 RTTESTI_CHECK(!ASMMemIsAllU8(pbPage2, PAGE_SIZE, 0)); 1379 cbSub = 32; 1380 while (cbSub-- > 0) 1381 { 1382 RTTESTI_CHECK(ASMMemFirstMismatchingU8(&pbPage1[PAGE_SIZE - cbSub], cbSub, 0xff) == NULL); 1383 RTTESTI_CHECK(ASMMemFirstMismatchingU8(&pbPage2[PAGE_SIZE - cbSub], cbSub, 0xff) == NULL); 1384 RTTESTI_CHECK(ASMMemFirstMismatchingU8(pbPage1, cbSub, 0xff) == NULL); 1385 RTTESTI_CHECK(ASMMemFirstMismatchingU8(pbPage2, cbSub, 0xff) == NULL); 1386 1387 RTTESTI_CHECK(ASMMemFirstMismatchingU8(&pbPage1[PAGE_SIZE - cbSub], cbSub, 0xfe) == &pbPage1[PAGE_SIZE - cbSub] || !cbSub); 1388 RTTESTI_CHECK(ASMMemFirstMismatchingU8(&pbPage2[PAGE_SIZE - cbSub], cbSub, 0xfe) == &pbPage2[PAGE_SIZE - cbSub] || !cbSub); 1389 RTTESTI_CHECK(ASMMemFirstMismatchingU8(pbPage1, cbSub, 0xfe) == pbPage1 || !cbSub); 1390 RTTESTI_CHECK(ASMMemFirstMismatchingU8(pbPage2, cbSub, 0xfe) == pbPage2 || !cbSub); 1391 } 1392 1393 1394 /* 1395 * Various alignments and sizes. 1396 */ 1397 uint8_t const bFiller1 = 0x00; 1398 uint8_t const bFiller2 = 0xf6; 1399 size_t const cbBuf = 128; 1400 uint8_t *pbBuf1 = pbPage1; 1401 uint8_t *pbBuf2 = &pbPage2[PAGE_SIZE - cbBuf]; /* Put it up against the tail guard */ 1402 memset(pbPage1, ~bFiller1, PAGE_SIZE); 1403 memset(pbPage2, ~bFiller2, PAGE_SIZE); 1404 memset(pbBuf1, bFiller1, cbBuf); 1405 memset(pbBuf2, bFiller2, cbBuf); 1406 for (size_t offNonZero = 0; offNonZero < cbBuf; offNonZero++) 1407 { 1408 uint8_t bRand = (uint8_t)RTRandU32(); 1409 pbBuf1[offNonZero] = bRand | 1; 1410 pbBuf2[offNonZero] = (0x80 | bRand) ^ 0xf6; 1411 1412 for (size_t offStart = 0; offStart < 32; offStart++) 1413 { 1414 size_t const cbMax = cbBuf - offStart; 1415 for (size_t cb = 0; cb < cbMax; cb++) 1416 { 1417 size_t const offEnd = offStart + cb; 1418 uint8_t bSaved1, bSaved2; 1419 if (offEnd < PAGE_SIZE) 1420 { 1421 bSaved1 = pbBuf1[offEnd]; 1422 bSaved2 = pbBuf2[offEnd]; 1423 pbBuf1[offEnd] = 0xff; 1424 pbBuf2[offEnd] = 0xff; 1425 } 1426 1427 uint8_t *pbRet = (uint8_t *)ASMMemFirstMismatchingU8(pbBuf1 + offStart, cb, bFiller1); 1428 RTTESTI_CHECK(offNonZero - offStart < cb ? pbRet == &pbBuf1[offNonZero] : pbRet == NULL); 1429 1430 pbRet = (uint8_t *)ASMMemFirstMismatchingU8(pbBuf2 + offStart, cb, bFiller2); 1431 if (!(offNonZero - offStart < cb ? pbRet == &pbBuf2[offNonZero] : pbRet == NULL)) 1432 __debugbreak(); 1433 RTTESTI_CHECK(offNonZero - offStart < cb ? pbRet == &pbBuf2[offNonZero] : pbRet == NULL); 1434 1435 if (offEnd < PAGE_SIZE) 1436 { 1437 pbBuf1[offEnd] = bSaved1; 1438 pbBuf2[offEnd] = bSaved2; 1439 } 1440 } 1441 } 1442 1443 pbBuf1[offNonZero] = 0; 1444 pbBuf2[offNonZero] = 0xf6; 1324 1445 } 1325 1446 … … 1791 1912 tstASMMemZeroPage(); 1792 1913 tstASMMemIsZeroPage(g_hTest); 1914 tstASMMemFirstMismatchingU8(g_hTest); 1793 1915 tstASMMemZero32(); 1794 1916 tstASMMemFill32();
Note:
See TracChangeset
for help on using the changeset viewer.