diff options
Diffstat (limited to 'src/usr/dump')
-rw-r--r-- | src/usr/dump/dumpCollect.C | 74 | ||||
-rw-r--r-- | src/usr/dump/dumpCollect.H | 4 | ||||
-rw-r--r-- | src/usr/dump/test/dumptest.H | 61 |
3 files changed, 92 insertions, 47 deletions
diff --git a/src/usr/dump/dumpCollect.C b/src/usr/dump/dumpCollect.C index 8f85f44a9..f0089311c 100644 --- a/src/usr/dump/dumpCollect.C +++ b/src/usr/dump/dumpCollect.C @@ -113,6 +113,9 @@ errlHndl_t doDumpCollect(void) int rc = 0; bool invalidSrcSize = false; bool invalidDestSize = false; + bool l_contiguous = false; + uint64_t l_prevSrcAddr = 0xFFFFFFFFFFFFFFFF; + uint32_t l_resultCount = 0x0; // local src table info uint64_t *vaSrcTableAddr = 0; @@ -190,14 +193,18 @@ errlHndl_t doDumpCollect(void) } vaMapSrcTableAddr = - (static_cast<uint64_t*>(mmio_dev_map(reinterpret_cast<void*>(ALIGN_PAGE_DOWN(curSrcTableAddr)), - THIRTYTWO_GB))); + (static_cast<uint64_t*>(mm_block_map( + reinterpret_cast<void*>(ALIGN_PAGE_DOWN + (curSrcTableAddr & RM_TOP_NIBBLE_MASK)), + THIRTYTWO_GB))); vaSrcTableAddr = vaMapSrcTableAddr; vaMapDestTableAddr = - (static_cast<uint64_t*>(mmio_dev_map(reinterpret_cast<void*>(ALIGN_PAGE_DOWN(curDestTableAddr)), - THIRTYTWO_GB))); + (static_cast<uint64_t*>(mm_block_map( + reinterpret_cast<void*>(ALIGN_PAGE_DOWN + (curDestTableAddr & RM_TOP_NIBBLE_MASK)), + THIRTYTWO_GB))); vaDestTableAddr = vaMapDestTableAddr; @@ -212,6 +219,7 @@ errlHndl_t doDumpCollect(void) // Current Destination physical and Va address TRACFCOMP(g_trac_dump, "HBDumpCopySrcToDest DestTableIndex = %d, DestTableAddr = %.16X, VA = %.16X", curDestIndex, curDestTableAddr, vaDestTableAddr); + resultsTableEntry->dataSize = 0x0; while(1) { @@ -219,7 +227,8 @@ errlHndl_t doDumpCollect(void) if (bytesLeftInSrc == 0) { // unmap the previous src entry - rc = mmio_dev_unmap(reinterpret_cast<void*>(vaMapSrcTableAddr)); + rc = mm_block_unmap( + reinterpret_cast<void*>(vaMapSrcTableAddr)); if (rc != 0) { @@ -275,8 +284,10 @@ errlHndl_t doDumpCollect(void) // map the MDST entry to a device such that we can read and write from that memory // address vaMapSrcTableAddr = - (static_cast<uint64_t*>(mmio_dev_map(reinterpret_cast<void*>(ALIGN_PAGE_DOWN(curSrcTableAddr)), - THIRTYTWO_GB))); + (static_cast<uint64_t*>(mm_block_map( + reinterpret_cast<void*>(ALIGN_PAGE_DOWN + (curSrcTableAddr & RM_TOP_NIBBLE_MASK)), + THIRTYTWO_GB))); vaSrcTableAddr = vaMapSrcTableAddr; @@ -291,8 +302,8 @@ errlHndl_t doDumpCollect(void) if (bytesLeftInDest == 0) { // unmap the previous dest entry - rc = mmio_dev_unmap(reinterpret_cast<void*>(vaMapDestTableAddr)); - + rc = mm_block_unmap( + reinterpret_cast<void*>(vaMapDestTableAddr)); if (rc != 0) { /*@ @@ -358,6 +369,20 @@ errlHndl_t doDumpCollect(void) curDestTableAddr = destTableEntry[curDestIndex].dataAddr; bytesLeftInDest = destTableEntry[curDestIndex].dataSize; + //check to see if this destination addr is contiguous + l_contiguous = false; + if(curDestIndex !=0) + { + if(((destTableEntry[curDestIndex-1].dataAddr + + destTableEntry[curDestIndex-1].dataSize) + == curDestTableAddr) + && (l_prevSrcAddr == curSrcTableAddr)) + { + l_contiguous = true; + + } + } + // If the current dest addr or the size to copy are zero. if ((curDestTableAddr == 0) || (bytesLeftInDest == 0)) { @@ -410,8 +435,10 @@ errlHndl_t doDumpCollect(void) // map the MDDT to a VA addresss vaMapDestTableAddr = - (static_cast<uint64_t*>(mmio_dev_map(reinterpret_cast<void*>(ALIGN_PAGE_DOWN(curDestTableAddr)), - THIRTYTWO_GB))); + (static_cast<uint64_t*>(mm_block_map( + reinterpret_cast<void*>(ALIGN_PAGE_DOWN + (curDestTableAddr & RM_TOP_NIBBLE_MASK)), + THIRTYTWO_GB))); vaDestTableAddr = vaMapDestTableAddr; @@ -434,11 +461,23 @@ errlHndl_t doDumpCollect(void) if (curResultIndex < maxResultEntries) { // Update the results table - resultsTableEntry->srcAddr = curSrcTableAddr; - resultsTableEntry->destAddr = curDestTableAddr; - resultsTableEntry->dataSize = sizeToCopy; - resultsTableEntry++; - curResultIndex++; + if(l_contiguous) + { + (resultsTableEntry-1)->dataSize +=sizeToCopy; + } + else + { + resultsTableEntry->srcAddr = curSrcTableAddr; + resultsTableEntry->destAddr = curDestTableAddr; + resultsTableEntry->dataSize = sizeToCopy; + resultsTableEntry++; + l_resultCount++; + curResultIndex++; + if (curResultIndex < maxResultEntries) + { + resultsTableEntry->dataSize = 0x0; + } + } } else { @@ -476,6 +515,7 @@ errlHndl_t doDumpCollect(void) curDestTableAddr += sizeToCopy; vaSrcTableAddr += addrOffset; vaDestTableAddr += addrOffset; + l_prevSrcAddr = curSrcTableAddr; //src address last used } // end of while loop @@ -525,6 +565,8 @@ errlHndl_t doDumpCollect(void) break; } + //Update actual count in RUNTIME + RUNTIME::update_MDRT_Count(l_resultCount); }while(0);// end of do-while loop // Got an errorlog back from get_host_data_sections diff --git a/src/usr/dump/dumpCollect.H b/src/usr/dump/dumpCollect.H index 09816848b..b7bf59c6f 100644 --- a/src/usr/dump/dumpCollect.H +++ b/src/usr/dump/dumpCollect.H @@ -32,6 +32,10 @@ namespace DUMP { + enum + { + RM_TOP_NIBBLE_MASK = 0x0FFFFFFFFFFFFFFFULL, + }; /** * @brief This routine retrieves first entry of the MDST, MDDT and diff --git a/src/usr/dump/test/dumptest.H b/src/usr/dump/test/dumptest.H index 022fecd64..fbd4523aa 100644 --- a/src/usr/dump/test/dumptest.H +++ b/src/usr/dump/test/dumptest.H @@ -122,14 +122,14 @@ class DumpTest: public CxxTest::TestSuite uint64_t src_data[8] = {DUMP_TEST_SRC_DATA_AREA, 64, // 450000 DUMP_TEST_SRC_DATA_AREA + 64, 64, - DUMP_TEST_SRC_DATA_AREA + 128, 64, - DUMP_TEST_SRC_DATA_AREA + 192, 64}; + DUMP_TEST_SRC_DATA_AREA + 192, 64, + DUMP_TEST_SRC_DATA_AREA + 256, 64}; uint64_t dst_data[8] = {DUMP_TEST_DST_DATA_AREA, 64, // 460000 DUMP_TEST_DST_DATA_AREA + 64, 64, - DUMP_TEST_DST_DATA_AREA + 128, 64, - DUMP_TEST_DST_DATA_AREA + 192, 64}; + DUMP_TEST_DST_DATA_AREA + 256, 64, + DUMP_TEST_DST_DATA_AREA + 512, 64}; // Put the src addresses defined above into the MDST @@ -166,18 +166,14 @@ class DumpTest: public CxxTest::TestSuite uint64_t result_data[] = { DUMP_TEST_SRC_DATA_AREA, DUMP_TEST_DST_DATA_AREA, - 64, 0, - - DUMP_TEST_SRC_DATA_AREA+64, - DUMP_TEST_DST_DATA_AREA+64, - 64, 0, + 64 *2, 0, - DUMP_TEST_SRC_DATA_AREA+128, - DUMP_TEST_DST_DATA_AREA+128, + DUMP_TEST_SRC_DATA_AREA+192, + DUMP_TEST_DST_DATA_AREA+256, 64, 0, - DUMP_TEST_SRC_DATA_AREA+192, - DUMP_TEST_DST_DATA_AREA+192, + DUMP_TEST_SRC_DATA_AREA+256, + DUMP_TEST_DST_DATA_AREA+512, 64, 0, }; @@ -268,7 +264,7 @@ class DumpTest: public CxxTest::TestSuite if (src_rc!=0) { TRACFCOMP(g_trac_dump, "DumpTest::DumpCollect:1 : Results Data mismatch rc = %d", src_rc); - TS_FAIL( "DumpTest::DumpCollect ERROR : Unexpected error data mismatch in results table" ); + TS_FAIL( "DumpTest::DumpCollect ERROR : Unexpected error DATA mismatch in results" ); } @@ -303,8 +299,10 @@ class DumpTest: public CxxTest::TestSuite if (result_rc!=0) { - TRACFCOMP(g_trac_dump, "DumpTest::DumpCollect:1 : Results Data mismatch rc = %d", result_rc); - TS_FAIL( "DumpTest::DumpCollect ERROR : Unexpected error data mismatch in results table" ); + TRACFCOMP(g_trac_dump, "DumpTest::DumpCollect:1 : Results Table mismatch rc = %d", result_rc); + TRACFBIN( g_trac_dump, "MDRT=", resultTablePtr, sizeof(result_data) ); + TRACFBIN( g_trac_dump, "expected=", result_data, sizeof(result_data) ); + TS_FAIL( "DumpTest::DumpCollect ERROR : Unexpected mismatch in results table" ); } } @@ -353,10 +351,10 @@ class DumpTest: public CxxTest::TestSuite DUMP_TEST_SRC_DATA_AREA+256 + 128,64, // 4500180 DUMP_TEST_SRC_DATA_AREA+256 + 192, 64}; // 45001C0 - uint64_t dst_data[8] = {DUMP_TEST_DST_DATA_AREA+1024, 64, // 4600400 - DUMP_TEST_DST_DATA_AREA+1024 + 64, 32, // 4600440 - DUMP_TEST_DST_DATA_AREA+1024 + 96, 32, // 4600480 - DUMP_TEST_DST_DATA_AREA+1024+ 128, 128}; // 46004C0 + uint64_t dst_data[8] = {DUMP_TEST_DST_DATA_AREA+1024, 64, //4600400 + DUMP_TEST_DST_DATA_AREA+1024 + 64, 32, //4600440 + DUMP_TEST_DST_DATA_AREA+1024 + 256, 32, //4600500 + DUMP_TEST_DST_DATA_AREA+1024 + 128, 128};//4600520 memcpy(srcTablePtr, src_data, sizeof(src_data)); memcpy(dstTablePtr, dst_data, sizeof(dst_data)); @@ -388,18 +386,15 @@ class DumpTest: public CxxTest::TestSuite // results output data expected uint64_t result_data[] = { DUMP_TEST_SRC_DATA_AREA+256, - DUMP_TEST_DST_DATA_AREA+1024, 64, 0, - - DUMP_TEST_SRC_DATA_AREA+256+64, - DUMP_TEST_DST_DATA_AREA+1024+64, 32, 0, + DUMP_TEST_DST_DATA_AREA+1024, 96, 0, DUMP_TEST_SRC_DATA_AREA+256+64+32, - DUMP_TEST_DST_DATA_AREA+1024+64+32, 32, 0, + DUMP_TEST_DST_DATA_AREA+1024+256, 32, 0, DUMP_TEST_SRC_DATA_AREA+256+128, DUMP_TEST_DST_DATA_AREA+1024+128, 64, 0, - DUMP_TEST_SRC_DATA_AREA+256+192, + DUMP_TEST_SRC_DATA_AREA+256+128+64, DUMP_TEST_DST_DATA_AREA+1024+128+64, 64, 0, }; @@ -509,7 +504,7 @@ class DumpTest: public CxxTest::TestSuite if (src_rc!=0) { TRACFCOMP(g_trac_dump, "DumpTest::DumpCollectUnevenDest:1 : Results Data mismatch rc = %d for index = %d", src_rc, i); - TS_FAIL( "DumpTest::DumpCollectUnevenDest ERROR : Unexpected error data mismatch in results table" ); + TS_FAIL( "DumpTest::DumpCollectUnevenDest ERROR : Unexpected error data mismatch in results data" ); } @@ -618,8 +613,10 @@ class DumpTest: public CxxTest::TestSuite if (result_rc!=0) { - TRACFCOMP(g_trac_dump, "DumpTest::DumpCollectUnevenDest : Results Data mismatch rc = %d", result_rc); - TS_FAIL( "DumpTest::DumpCollectUnevenDest ERROR : Unexpected error data mismatch in results table" ); + TRACFCOMP(g_trac_dump, "DumpTest::DumpCollectUnevenDest : Results Table mismatch rc = %d", result_rc); + TRACFBIN( g_trac_dump, "MDRT=", resultTablePtr, sizeof(result_data) ); + TRACFBIN( g_trac_dump, "expected=", result_data, sizeof(result_data) ); + TS_FAIL( "DumpTest::DumpCollectUnevenDest ERROR : Unexpected error TABLE mismatch in results table" ); } } @@ -1128,8 +1125,10 @@ class DumpTest: public CxxTest::TestSuite if (result_rc!=0) { - TRACFCOMP(g_trac_dump, "DumpTest::DumpCollectUnevenSRC:1 : Results Data mismatch rc = %d", result_rc); - TS_FAIL( "DumpTest::DumpCollectUnevenSrc ERROR : Unexpected error data mismatch in results table" ); + TRACFCOMP(g_trac_dump, "DumpTest::DumpCollectUnevenSRC:1 : Results Table mismatch rc = %d", result_rc); + TRACFBIN( g_trac_dump, "MDRT=", resultTablePtr, sizeof(result_data) ); + TRACFBIN( g_trac_dump, "expected=", result_data, sizeof(result_data) ); + TS_FAIL( "DumpTest::DumpCollectUnevenSrc ERROR : Unexpected error TABLE mismatch in results table" ); } } |