summaryrefslogtreecommitdiffstats
path: root/src/usr/dump
diff options
context:
space:
mode:
Diffstat (limited to 'src/usr/dump')
-rw-r--r--src/usr/dump/dumpCollect.C74
-rw-r--r--src/usr/dump/dumpCollect.H4
-rw-r--r--src/usr/dump/test/dumptest.H61
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" );
}
}
OpenPOWER on IntegriCloud