summaryrefslogtreecommitdiffstats
path: root/src/usr/dump/test/dumptest.H
diff options
context:
space:
mode:
Diffstat (limited to 'src/usr/dump/test/dumptest.H')
-rw-r--r--src/usr/dump/test/dumptest.H1198
1 files changed, 1198 insertions, 0 deletions
diff --git a/src/usr/dump/test/dumptest.H b/src/usr/dump/test/dumptest.H
new file mode 100644
index 000000000..a0fa852d1
--- /dev/null
+++ b/src/usr/dump/test/dumptest.H
@@ -0,0 +1,1198 @@
+/* IBM_PROLOG_BEGIN_TAG */
+/* This is an automatically generated prolog. */
+/* */
+/* $Source: src/usr/dump/test/dumptest.H $ */
+/* */
+/* IBM CONFIDENTIAL */
+/* */
+/* COPYRIGHT International Business Machines Corp. 2012,2013 */
+/* */
+/* p1 */
+/* */
+/* Object Code Only (OCO) source materials */
+/* Licensed Internal Code Source Materials */
+/* IBM HostBoot Licensed Internal Code */
+/* */
+/* The source code for this program is not published or otherwise */
+/* divested of its trade secrets, irrespective of what has been */
+/* deposited with the U.S. Copyright Office. */
+/* */
+/* Origin: 30 */
+/* */
+/* IBM_PROLOG_END_TAG */
+
+#ifndef __DUMPTEST_H
+#define __DUMPTEST_H
+
+/**
+ * @file dumptest.H
+ *
+ * @brief Test case for dump code
+*/
+
+#include <cxxtest/TestSuite.H>
+#include <errl/errlmanager.H>
+#include <errl/errlentry.H>
+#include <devicefw/userif.H>
+#include <targeting/common/util.H>
+#include "../dumpCollect.H"
+#include <runtime/runtime.H>
+#include <usr/vmmconst.h>
+#include <sys/mmio.h>
+#include <util/align.H>
+#include <sys/mm.h>
+
+
+extern trace_desc_t* g_trac_dump;
+
+class DumpTest: public CxxTest::TestSuite
+{
+ public:
+
+
+ /**
+ * @brief Basic dump test that has sequential src addresses to
+ * equivalent destination locations and sizes.
+ *
+ */
+
+ void test_DumpCollect(void)
+ {
+
+ TRACFCOMP( g_trac_dump, "DumpTest::test_dumpCollect START" );
+
+ errlHndl_t l_err = NULL;
+
+ uint64_t srcTableAddr = 0;
+ uint64_t srcTableSize = 0;
+
+ uint64_t dstTableAddr = 0;
+ uint64_t dstTableSize = 0;
+
+ uint64_t resultsTableAddr = 0;
+ uint64_t resultsTableSize = 0;
+
+ DUMP::dumpEntry *srcTableEntry = NULL;
+ DUMP::dumpEntry *destTableEntry = NULL;
+ DUMP::resultsEntry *resultsTableEntry = NULL;
+
+ // For testing I am using my own data pointers and setting it up
+ // to look like PHYP would have to test the copy function.
+ srcTableAddr = DUMP_TEST_SRC_MEM_ADDR;
+ srcTableSize = DUMP_TEST_SRC_MEM_SIZE;
+ dstTableAddr = DUMP_TEST_DST_MEM_ADDR;
+ dstTableSize = DUMP_TEST_DST_MEM_SIZE;
+ resultsTableAddr = DUMP_TEST_RESULTS_MEM_ADDR;
+ resultsTableSize = DUMP_TEST_RESULTS_MEM_SIZE;
+
+
+ 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};
+
+
+ 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};
+
+
+ // Point to the location of the src Data pointer.
+ uint64_t *srcTablePtr = reinterpret_cast<uint64_t *>(srcTableAddr);
+
+ // Point to the location of the dest Data pointer.
+ uint64_t *dstTablePtr = reinterpret_cast<uint64_t *>(dstTableAddr);
+
+ uint64_t *resultTablePtr = reinterpret_cast<uint64_t *>(resultsTableAddr);
+
+ // Put the src addresses defined above into the MDST
+ memcpy(srcTablePtr, src_data, sizeof(src_data));
+
+ // Put the src addresses defined above into the MDDT
+ memcpy(dstTablePtr, dst_data, sizeof(dst_data));
+
+ // Need to memory map
+ uint64_t src_Inputdata[4][8] = {
+ {0x1111111111111111, 0x1111111111111111,
+ 0x1111111111111111, 0x1111111111111111,
+ 0x1111111111111111, 0x1111111111111111,
+ 0x1111111111111111, 0x1111111111111111},
+
+ {0x2222222222222222, 0x2222222222222222,
+ 0x2222222222222222, 0x2222222222222222,
+ 0x2222222222222222, 0x2222222222222222,
+ 0x2222222222222222, 0x2222222222222222},
+
+ {0x3333333333333333, 0x3333333333333333,
+ 0x3333333333333333, 0x3333333333333333,
+ 0x3333333333333333, 0x3333333333333333,
+ 0x3333333333333333,0x3333333333333333},
+
+ {0x4444444444444444, 0x4444444444444444,
+ 0x4444444444444444, 0x4444444444444444,
+ 0x4444444444444444, 0x4444444444444444,
+ 0x4444444444444444, 0x4444444444444444}
+ };
+
+
+ // results output data expected
+ uint64_t result_data[12] = {
+ DUMP_TEST_SRC_DATA_AREA, DUMP_TEST_DST_DATA_AREA, 64,
+ DUMP_TEST_SRC_DATA_AREA+64, DUMP_TEST_DST_DATA_AREA+64, 64,
+ DUMP_TEST_SRC_DATA_AREA+128, DUMP_TEST_DST_DATA_AREA+128, 64,
+ DUMP_TEST_SRC_DATA_AREA+192, DUMP_TEST_DST_DATA_AREA+192, 64,
+ };
+
+ uint64_t *va_mapsrcTableAddr = 0;
+ uint64_t *va_srcTableAddr = 0;
+ uint64_t offset = 0;
+ int index = 0;
+
+ for (int i = 0; i<4; i++)
+ {
+
+ // Get the Va for the page aligned Physical address
+ va_mapsrcTableAddr =
+ static_cast<uint64_t*>(mmio_dev_map(reinterpret_cast<void*>(ALIGN_PAGE_DOWN(src_data[index])),
+ THIRTYTWO_GB));
+
+ // copy the mapped VA to a VA pointer we will
+ va_srcTableAddr = va_mapsrcTableAddr;
+
+ // calculate offset based on page alignment.
+ offset = src_data[index] - ALIGN_PAGE_DOWN(src_data[index]);
+
+ // increment the offset to correct VA offset.
+ va_srcTableAddr += (offset/(sizeof (uint64_t)));
+
+ memcpy(va_srcTableAddr, src_Inputdata[i], sizeof(src_Inputdata[i]));
+
+ // unmap the previous src entry
+ int rc =
+ mmio_dev_unmap(reinterpret_cast<void*>(va_mapsrcTableAddr));
+
+ if (rc != 0)
+ {
+ TRACFCOMP(g_trac_dump, "DumpTest:test_DumpCollect> got an error back from unmap : RC=%X",rc);
+ TS_FAIL( "DumpTest::CollectDump ERROR : BAD Rc from mmio_dev_unmap" );
+ break;
+ }
+ index+=2;
+ }
+
+
+ srcTableEntry = reinterpret_cast<DUMP::dumpEntry *>(srcTableAddr);
+ destTableEntry = reinterpret_cast<DUMP::dumpEntry *>(dstTableAddr);
+ resultsTableEntry = reinterpret_cast<DUMP::resultsEntry *>(resultsTableAddr);
+
+
+ l_err = DUMP::copySrcToDest(srcTableEntry,srcTableSize,
+ destTableEntry,dstTableSize,
+ resultsTableEntry,resultsTableSize);
+
+ if( l_err )
+ {
+ TRACFCOMP(g_trac_dump, "DumpTest:test_DumpCollect> got an error back from dumpcollect : RC=%X",l_err->reasonCode() );
+ TS_FAIL( "DumpTest::CollectDump ERROR : Unexpected error log from dumpcollect" );
+ errlCommit(l_err,DUMP_COMP_ID);
+ }
+
+
+ // Verify that the data and the VA mapping is correct.
+ uint64_t *va_mapdestTableAddr = 0;
+ uint64_t *va_destTableAddr = 0;
+ offset = 0;
+ index = 0;
+
+ for (int i = 0; i<4; i++)
+ {
+ // Get the Va for the page aligned Physical address
+ va_mapdestTableAddr =
+ static_cast<uint64_t*>(mmio_dev_map(reinterpret_cast<void*>(ALIGN_PAGE_DOWN(dst_data[index])),
+ THIRTYTWO_GB));
+
+ // copy the mapped VA to a VA pointer we will
+ va_destTableAddr = va_mapdestTableAddr;
+
+ // calculate offset based on page alignment.
+ offset = dst_data[index] - ALIGN_PAGE_DOWN(dst_data[index]);
+
+ // increment the offset to correct VA offset.
+ va_destTableAddr += (offset/(sizeof (uint64_t)));
+
+ uint64_t paddr = mm_virt_to_phys(va_destTableAddr);
+
+ if (paddr != dst_data[index])
+ {
+ TRACFCOMP(g_trac_dump,
+ "DumpTest:test_DumpCollect:1> mapping mismatch actual paddr = %lx, expected paddr = %lx", paddr, dst_data[index]);
+ TS_FAIL( "DumpTest:test_DumpCollect:1 ERROR : Unexpected error physical address mismatch" );
+ }
+
+
+ // Check the destination table.
+ int src_rc = memcmp(va_destTableAddr,src_Inputdata[i],sizeof(src_Inputdata[i]));
+
+ 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" );
+ }
+
+
+ // unmap the previous src entry
+ int rc =
+ mmio_dev_unmap(reinterpret_cast<void*>(va_mapsrcTableAddr));
+
+ if (rc != 0)
+ {
+ TRACFCOMP(g_trac_dump,
+ "DumpTest::DumpCollect got an error back from unmap : RC=%X",rc);
+ TS_FAIL( "DumpTest::DumpCollect ERROR : BAD Rc from mmio_dev_unmap" );
+ break;
+ }
+ index+=2;
+ }
+
+
+ // Check the results table.
+ int result_rc = memcmp(resultTablePtr,result_data,sizeof (result_data));
+
+ 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 COMPLETE" );
+
+ }
+
+ /**
+ * @brief Basic dump test that has sequential src addresses to
+ * imbalanced destination locations and sizes.
+ *
+ */
+ void test_DumpCollectUnevenDest(void)
+ {
+
+ TRACFCOMP( g_trac_dump, "DumpTest::DumpCollectUnevenDest START" );
+ errlHndl_t l_err = NULL;
+ uint64_t srcTableAddr = 0;
+ uint64_t srcTableSize = 0;
+ uint64_t dstTableAddr = 0;
+ uint64_t dstTableSize = 0;
+ uint64_t resultsTableAddr = 0;
+ uint64_t resultsTableSize = 0;
+
+ DUMP::dumpEntry *srcTableEntry = NULL;
+ DUMP::dumpEntry *destTableEntry = NULL;
+ DUMP::resultsEntry *resultsTableEntry = NULL;
+
+ // Setting up TESt version of the MDST, MDDT and MDRT.
+ srcTableAddr = DUMP_TEST_SRC_MEM_ADDR;
+ srcTableSize = DUMP_TEST_SRC_MEM_SIZE;
+ dstTableAddr = DUMP_TEST_DST_MEM_ADDR;
+ dstTableSize = DUMP_TEST_DST_MEM_SIZE;
+ resultsTableAddr = DUMP_TEST_RESULTS_MEM_ADDR;
+ resultsTableSize = DUMP_TEST_RESULTS_MEM_SIZE;
+
+
+ uint64_t src_data[8] = {DUMP_TEST_SRC_DATA_AREA+256, 64, // 4500100
+ DUMP_TEST_SRC_DATA_AREA+256 + 64,64, // 4500140
+ 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 *srcTablePtr = reinterpret_cast<uint64_t *>(srcTableAddr);
+ uint64_t *dstTablePtr = reinterpret_cast<uint64_t *>(dstTableAddr);
+ uint64_t *resultTablePtr = reinterpret_cast<uint64_t *>(resultsTableAddr);
+
+ memcpy(srcTablePtr, src_data, sizeof(src_data));
+ memcpy(dstTablePtr, dst_data, sizeof(dst_data));
+
+
+ // Need to memory map
+ uint64_t src_Inputdata[4][8] = {
+ {0xaaaaaaaaaaaaaaaa, 0xaaaaaaaaaaaaaaaa,
+ 0xaaaaaaaaaaaaaaaa, 0xaaaaaaaaaaaaaaaa,
+ 0xaaaaaaaaaaaaaaaa, 0xaaaaaaaaaaaaaaaa,
+ 0xaaaaaaaaaaaaaaaa, 0xaaaaaaaaaaaaaaaa},
+
+ {0xbbbbbbbbbbbbbbbb, 0xbbbbbbbbbbbbbbbb,
+ 0xbbbbbbbbbbbbbbbb, 0xbbbbbbbbbbbbbbbb,
+ 0xbbbbbbbbbbbbbbbb, 0xbbbbbbbbbbbbbbbb,
+ 0xbbbbbbbbbbbbbbbb, 0xbbbbbbbbbbbbbbbb},
+
+ {0xcccccccccccccccc, 0xcccccccccccccccc,
+ 0xcccccccccccccccc, 0xcccccccccccccccc,
+ 0xcccccccccccccccc, 0xcccccccccccccccc,
+ 0xcccccccccccccccc, 0xcccccccccccccccc},
+
+ {0xdddddddddddddddd, 0xdddddddddddddddd,
+ 0xdddddddddddddddd, 0xdddddddddddddddd,
+ 0xdddddddddddddddd, 0xdddddddddddddddd,
+ 0xdddddddddddddddd, 0xdddddddddddddddd},
+ };
+
+ // results output data expected
+ uint64_t result_data[15] = {
+ DUMP_TEST_SRC_DATA_AREA+256, DUMP_TEST_DST_DATA_AREA+1024, 64,
+ DUMP_TEST_SRC_DATA_AREA+256+64, DUMP_TEST_DST_DATA_AREA+1024+64, 32,
+ DUMP_TEST_SRC_DATA_AREA+256+64+32, DUMP_TEST_DST_DATA_AREA+1024+64+32, 32,
+ DUMP_TEST_SRC_DATA_AREA+256+128,DUMP_TEST_DST_DATA_AREA+1024+128, 64,
+ DUMP_TEST_SRC_DATA_AREA+256+192, DUMP_TEST_DST_DATA_AREA+1024+128+64, 64,
+ };
+
+ uint64_t *va_mapsrcTableAddr = 0;
+ uint64_t *va_srcTableAddr = 0;
+ uint64_t offset = 0;
+ int index = 0;
+
+ for (int i = 0; i<4; i++)
+ {
+ // Get the Va for the page aligned Physical address
+ va_mapsrcTableAddr =
+ static_cast<uint64_t*>(mmio_dev_map(reinterpret_cast<void*>(ALIGN_PAGE_DOWN(src_data[index])),
+ THIRTYTWO_GB));
+
+ // copy the mapped VA to a VA pointer
+ va_srcTableAddr = va_mapsrcTableAddr;
+
+ // calculate offset based on page alignment.
+ offset = src_data[index] - ALIGN_PAGE_DOWN(src_data[index]);
+
+ // increment the offset to correct VA offset.
+ va_srcTableAddr += (offset/(sizeof (uint64_t)));
+
+ memcpy(va_srcTableAddr, src_Inputdata[i], sizeof(src_Inputdata[i]));
+
+ // unmap the previous src entry
+ int rc =
+ mmio_dev_unmap(reinterpret_cast<void*>(va_mapsrcTableAddr));
+
+ if (rc != 0)
+ {
+ TRACFCOMP(g_trac_dump,
+ "DumpTest::DumpCollectUnevenDest> got an error back from unmap : RC=%X",rc);
+ TS_FAIL( "DumpTest::CollectDumpUnevenDest ERROR : BAD Rc from mmio_dev_unmap" );
+ break;
+ }
+ index+=2;
+ }
+
+ srcTableEntry = reinterpret_cast<DUMP::dumpEntry *>(srcTableAddr);
+ destTableEntry = reinterpret_cast<DUMP::dumpEntry *>(dstTableAddr);
+ resultsTableEntry = reinterpret_cast<DUMP::resultsEntry *>(resultsTableAddr);
+
+
+ l_err = DUMP::copySrcToDest(srcTableEntry,srcTableSize,
+ destTableEntry,dstTableSize,
+ resultsTableEntry,resultsTableSize);
+
+
+ if( l_err )
+ {
+ TRACFCOMP(g_trac_dump, "DumpTest::DumpCollectUnevenDest got an error back from dumpcollect : RC=%X",l_err->reasonCode() );
+ TS_FAIL( "DumpTest::CollectDumpUnevenDest ERROR : Unexpected error log from dumpcollect" );
+ errlCommit(l_err,DUMP_COMP_ID);
+ }
+
+ //----------------------------------------------------------------
+ // !!!!! VERIFYING RESULTS
+ // Verify that the data and the VA mapping is correct.
+ //--------------------------------------------------------------
+ do
+ {
+
+ uint64_t *va_mapdestTableAddr = 0;
+ uint64_t *va_destTableAddr = 0;
+ offset = 0;
+ index = 0;
+
+ int src_rc = 0;
+ uint64_t paddr = 0;
+
+ // Looping throught the first 3 destinations
+ for (int i = 0; i<3; i++)
+ {
+
+ // Get the Va for the page aligned Physical address
+ va_mapdestTableAddr = static_cast<uint64_t*>(mmio_dev_map(reinterpret_cast<void*>(ALIGN_PAGE_DOWN(dst_data[index])),THIRTYTWO_GB));
+
+ // copy the mapped VA to a VA pointer we will
+ va_destTableAddr = va_mapdestTableAddr;
+
+ // calculate offset based on page alignment.
+ offset = dst_data[index] - ALIGN_PAGE_DOWN(dst_data[index]);
+
+ // increment the offset to correct VA offset.
+ va_destTableAddr += (offset/(sizeof (uint64_t)));
+
+ paddr = mm_virt_to_phys(va_destTableAddr);
+
+ if (paddr != dst_data[index])
+ {
+ TRACFCOMP(g_trac_dump,
+ "DumpTest::DumpCollectUnevenDest:1> mapping mismatch actual paddr = %lx, expected paddr = %lx",
+ paddr, dst_data[index]);
+ TS_FAIL( "DumpTest::DumpCollectUnevenDest ERROR : Unexpected error physical address mismatch" );
+ }
+
+ //if entry need to compare destination data to second portion of previous src
+ if (i == 2)
+ {
+ src_rc = memcmp(va_destTableAddr, &src_Inputdata[1][4], dst_data[index+1]);
+ }
+ else
+ {
+ // Check the destination table.
+ src_rc = memcmp(va_destTableAddr,src_Inputdata[i],dst_data[index+1]);
+ }
+
+ // If got a memcmp fail
+ 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" );
+ }
+
+
+ // unmap the previous src entry
+ int rc =
+ mmio_dev_unmap(reinterpret_cast<void*>(va_mapsrcTableAddr));
+
+ if (rc != 0)
+ {
+ TRACFCOMP(g_trac_dump,
+ "DumpTest::DumpCollectUnevenDest got an error back from unmap : RC=%X",rc);
+ TS_FAIL( "DumpTest::DumpCollectUnevenDest ERROR : BAD Rc from mmio_dev_unmap" );
+ break;
+ }
+ index+=2;
+ }
+
+
+ // checking the 4th entry as it crosses through 2 source entries
+
+ // Get the Va for the page aligned Physical address
+ va_mapdestTableAddr = static_cast<uint64_t*>(mmio_dev_map(reinterpret_cast<void*>(ALIGN_PAGE_DOWN(dst_data[index])),THIRTYTWO_GB));
+
+ // copy the mapped VA to a VA pointer we will
+ va_destTableAddr = va_mapdestTableAddr;
+
+ // calculate offset based on page alignment.
+ offset = dst_data[index] - ALIGN_PAGE_DOWN(dst_data[index]);
+
+ // increment the offset to correct VA offset.
+ va_destTableAddr += (offset/(sizeof (uint64_t)));
+
+ paddr = mm_virt_to_phys(va_destTableAddr);
+
+ if (paddr != dst_data[index])
+ {
+ TRACFCOMP(g_trac_dump,
+ "DumpTest::DumpCollectUnevenDest:2> mapping mismatch actual paddr = %lx, expected paddr = %lx",
+ paddr, dst_data[index]);
+ TS_FAIL( "DumpTest::DumpCollectUnevenDest:2 ERROR : Unexpected error physical address mismatch" );
+ }
+
+ int dataentries = (dst_data[index+1]/16);
+
+ // start with 3rd src index..
+ int i = 2;
+ // Src Data input.
+ int dataIndex = 0;
+
+ // Now loop through the data at this memory address and compare it to the data
+ for (int j = 0; j<dataentries; j++)
+ {
+ if (va_destTableAddr[j] != src_Inputdata[i][dataIndex])
+ {
+ // error
+ TRACFCOMP(g_trac_dump,
+ "DumpTest::DumpCollectUnevenDest:3 : Data mismatch input data = %lX, outputdata = %lx",
+ src_Inputdata[i][dataIndex], va_destTableAddr[j]);
+ TS_FAIL( "DumpTest::DumpCollectUnevenDest:3 ERROR : Unexpected error data mismatch" );
+ break;
+ }
+
+ dataIndex++;
+
+ if (j == 7)
+ {
+ i++;
+ dataIndex = 0;
+ }
+
+ }
+
+
+ // unmap the previous src entry
+ int rc =
+ mmio_dev_unmap(reinterpret_cast<void*>(va_mapdestTableAddr));
+
+ if (rc != 0)
+ {
+ TRACFCOMP(g_trac_dump,
+ "DumpTest::DumpCollectUnevenDest got an error back from unmap : RC=%X",rc);
+ TS_FAIL( "DumpTest::CollectDumpUnevenDest ERROR : BAD Rc from mmio_dev_unmap" );
+ break;
+ }
+ index+=2;
+
+ }while(0);
+
+ // Check the results table.
+ int result_rc = memcmp(resultTablePtr,result_data,sizeof (result_data));
+
+ 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::test_dumpCollectUnevenDest COMPLETE" );
+ }
+
+
+ /**
+ * @brief Basic dump test that has non sequential src addresses with varying
+ * sizes to non sequential destination locations and uneven src
+ *
+ */
+
+ void test_DumpCollectUnevenSrc(void)
+ {
+
+ TRACFCOMP( g_trac_dump, "dumpTest::test_dumpCollectUnevenSrc START" );
+
+ errlHndl_t l_err = NULL;
+
+ uint64_t srcTableAddr = 0;
+ uint64_t srcTableSize = 0;
+
+ uint64_t dstTableAddr = 0;
+ uint64_t dstTableSize = 0;
+
+ uint64_t resultsTableAddr = 0;
+ uint64_t resultsTableSize = 0;
+
+ uint64_t offset = 0;
+
+ DUMP::dumpEntry *srcTableEntry = NULL;
+ DUMP::dumpEntry *destTableEntry = NULL;
+ DUMP::resultsEntry *resultsTableEntry = NULL;
+
+ // Setting up TESt version of the MDST, MDDT and MDRT.
+ srcTableAddr = DUMP_TEST_SRC_MEM_ADDR;
+ srcTableSize = DUMP_TEST_SRC_MEM_SIZE;
+ dstTableAddr = DUMP_TEST_DST_MEM_ADDR;
+ dstTableSize = DUMP_TEST_DST_MEM_SIZE;
+ resultsTableAddr = DUMP_TEST_RESULTS_MEM_ADDR;
+ resultsTableSize = DUMP_TEST_RESULTS_MEM_SIZE;
+
+ uint64_t src_data[8] = {DUMP_TEST_SRC_DATA_AREA+1024, 16, // 4500400
+ DUMP_TEST_SRC_DATA_AREA+2048, 48, // 4500800
+ DUMP_TEST_SRC_DATA_AREA+3072, 32, // 4500C00
+ DUMP_TEST_SRC_DATA_AREA+4096, 160}; // 4501000
+
+
+ uint64_t dst_data[8] = {DUMP_TEST_DST_DATA_AREA+2048, 64, // 4600800
+ DUMP_TEST_DST_DATA_AREA+2048+128, 32, // 4600880
+ DUMP_TEST_DST_DATA_AREA+3072, 32, // 4600C00
+ DUMP_TEST_DST_DATA_AREA+3072+64, 128}; // 4600C40
+
+
+ uint64_t *srcTablePtr = reinterpret_cast<uint64_t *>(srcTableAddr);
+ uint64_t *dstTablePtr = reinterpret_cast<uint64_t *>(dstTableAddr);
+ uint64_t *resultTablePtr = reinterpret_cast<uint64_t *>(resultsTableAddr);
+
+ memcpy(srcTablePtr, src_data, sizeof(src_data));
+ memcpy(dstTablePtr, dst_data, sizeof(dst_data));
+
+
+ // Need to memory map
+ uint64_t src_data0[2] = {0x1212121212121212, 0x1212121212121212};
+
+ uint64_t src_data1[6] = {0x3434343434343434, 0x3434343434343434,
+ 0x3434343434343434, 0x3434343434343434,
+ 0x3434343434343434, 0x3434343434343434};
+
+ uint64_t src_data2[4] = {0x5656565656565656, 0x5656565656565656,
+ 0x5656565656565656, 0x5656565656565656};
+
+ uint64_t src_data3[20] = {0x7878787878787878, 0x7878787878787878,
+ 0x7878787878787878, 0x7878787878787878,
+ 0x7878787878787878, 0x7878787878787878,
+ 0x7878787878787878, 0x7878787878787878,
+ 0x7878787878787878, 0x7878787878787878,
+ 0x7878787878787878, 0x7878787878787878,
+ 0x7878787878787878, 0x7878787878787878,
+ 0x7878787878787878, 0x7878787878787878,
+ 0x7878787878787878, 0x7878787878787878,
+ 0x7878787878787878, 0x7878787878787878};
+
+
+ // results output data expected
+ uint64_t result_data[15] = {
+ DUMP_TEST_SRC_DATA_AREA+1024, DUMP_TEST_DST_DATA_AREA+2048, 16,
+ DUMP_TEST_SRC_DATA_AREA+2048, DUMP_TEST_DST_DATA_AREA+2048+16, 48,
+ DUMP_TEST_SRC_DATA_AREA+3072, DUMP_TEST_DST_DATA_AREA+2048+128, 32,
+ DUMP_TEST_SRC_DATA_AREA+4096, DUMP_TEST_DST_DATA_AREA+3072, 32,
+ DUMP_TEST_SRC_DATA_AREA+4096+32, DUMP_TEST_DST_DATA_AREA+3072+64, 128,
+ };
+
+ do
+ {
+ uint64_t *va_mapsrcTableAddr =
+ static_cast<uint64_t*>(mmio_dev_map(reinterpret_cast<void*>(ALIGN_PAGE_DOWN(src_data[0])),
+ THIRTYTWO_GB));
+
+ uint64_t *va_srcTableAddr = va_mapsrcTableAddr;
+
+ offset = src_data[0] - ALIGN_PAGE_DOWN(src_data[0]);
+
+ // increment the offset to correct VA offset.
+ va_srcTableAddr += (offset/(sizeof (uint64_t)));
+
+ memcpy(va_srcTableAddr, src_data0, sizeof(src_data0));
+
+ // unmap the previous src entry
+ int rc = mmio_dev_unmap(reinterpret_cast<void*>(va_mapsrcTableAddr));
+
+ if (rc != 0)
+ {
+ TRACFCOMP(g_trac_dump,
+ "DumpTest::DumpCollectUnevenSrc mmio_dev_map (1) bad RC=%X for addr %llx",rc, va_mapsrcTableAddr);
+ TS_FAIL( "DumpTest::DumpCollectUnevenSrc ERROR : BAD Rc from mmio_dev_unmap" );
+ break;
+
+ }
+
+ va_mapsrcTableAddr =
+ static_cast<uint64_t*>(mmio_dev_map(reinterpret_cast<void*>(ALIGN_PAGE_DOWN(src_data[2])),
+ THIRTYTWO_GB));
+
+ va_srcTableAddr = va_mapsrcTableAddr;
+
+ // calculate offset based on page alignment.
+ offset = src_data[2] - ALIGN_PAGE_DOWN(src_data[2]);
+
+ // increment the offset to correct VA offset.
+ va_srcTableAddr += (offset/(sizeof (uint64_t)));
+
+ memcpy(va_srcTableAddr, src_data1, sizeof(src_data1));
+
+ // unmap the previous src entry
+ rc = mmio_dev_unmap(reinterpret_cast<void*>(va_mapsrcTableAddr));
+
+ if (rc != 0)
+ {
+ TRACFCOMP(g_trac_dump,
+ "DumpTest::DumpCollectUnevenSrc mmio_dev_map (2) bad RC=%X for addr %llx",rc, va_mapsrcTableAddr);
+ TS_FAIL( "DumpTest::DumpCollectUnevenSrc ERROR : BAD Rc from mmio_dev_unmap" );
+ break;
+ }
+
+
+ va_mapsrcTableAddr =
+ static_cast<uint64_t*>(mmio_dev_map(reinterpret_cast<void*>(ALIGN_PAGE_DOWN(src_data[4])),
+ THIRTYTWO_GB));
+
+ va_srcTableAddr = va_mapsrcTableAddr;
+
+ // calculate offset based on page alignment.
+ offset = src_data[4] - ALIGN_PAGE_DOWN(src_data[4]);
+
+ // increment the offset to correct VA offset.
+ va_srcTableAddr += (offset/(sizeof (uint64_t)));
+
+ memcpy(va_srcTableAddr, src_data2, sizeof(src_data2));
+
+ // unmap the previous src entry
+ rc = mmio_dev_unmap(reinterpret_cast<void*>(va_mapsrcTableAddr));
+
+ if (rc != 0)
+ {
+ TRACFCOMP(g_trac_dump,
+ "DumpTest::DumpCollectUnevenSrc mmio_dev_map (3) bad RC=%X for addr %llx",rc, va_mapsrcTableAddr);
+ TS_FAIL( "DumpTest::DumpCollectUnevenSrc ERROR : BAD Rc from mmio_dev_unmap" );
+ break;
+
+ }
+
+ va_mapsrcTableAddr =
+ static_cast<uint64_t*>(mmio_dev_map(reinterpret_cast<void*>(ALIGN_PAGE_DOWN(src_data[6])),
+ THIRTYTWO_GB));
+
+ va_srcTableAddr = va_mapsrcTableAddr;
+
+ // calculate offset based on page alignment.
+ offset = src_data[6] - ALIGN_PAGE_DOWN(src_data[6]);
+
+ // increment the offset to correct VA offset.
+ va_srcTableAddr += (offset/(sizeof (uint64_t)));
+
+ memcpy(va_srcTableAddr, src_data3, sizeof(src_data3));
+
+
+ // unmap the previous src entry
+ rc = mmio_dev_unmap(reinterpret_cast<void*>(va_mapsrcTableAddr));
+
+ if (rc != 0)
+ {
+ TRACFCOMP(g_trac_dump,
+ "DumpTest::DumpCollectUnevenSrc mmio_dev_map (4) bad RC=%X for addr %llx",rc, va_mapsrcTableAddr);
+ TS_FAIL( "DumpTest::DumpCollectUnevenSrc ERROR : BAD Rc from mmio_dev_unmap" );
+ break;
+ }
+ }while(0);
+
+
+ srcTableEntry = reinterpret_cast<DUMP::dumpEntry *>(srcTableAddr);
+ destTableEntry = reinterpret_cast<DUMP::dumpEntry *>(dstTableAddr);
+ resultsTableEntry = reinterpret_cast<DUMP::resultsEntry *>(resultsTableAddr);
+
+
+ l_err = DUMP::copySrcToDest(srcTableEntry,srcTableSize,
+ destTableEntry,dstTableSize,
+ resultsTableEntry,resultsTableSize);
+
+ if( l_err )
+ {
+ TRACFCOMP(g_trac_dump,
+ "DumpTest::DumpCollectUnevenSrc got an error back from copySrcToDest : RC=%X",
+ l_err->reasonCode() );
+ TS_FAIL( "DumpTest::DumpCollectUnevenSrc ERROR : Unexpected error log from copySrcToDest" );
+ errlCommit(l_err,DUMP_COMP_ID);
+ }
+
+
+ //----------------------------------------------------------------
+ // !!!!! VERIFYING RESULTS
+ // Verify that the data and the VA mapping is correct.
+ //----------------------------------------------------------------
+
+ do
+ {
+
+ uint64_t *va_mapdestTableAddr = 0;
+ uint64_t *va_destTableAddr = 0;
+ offset = 0;
+ int index = 0;
+ int i = 0;
+
+
+ // FIRST Destination ENTRY source entires 0 and 1 !!!!
+ // Get the Va for the page aligned Physical address
+ va_mapdestTableAddr =
+ static_cast<uint64_t*>(mmio_dev_map(reinterpret_cast<void*>(ALIGN_PAGE_DOWN(dst_data[index])),
+ THIRTYTWO_GB));
+
+ // copy the mapped VA to a VA pointer we will
+ va_destTableAddr = va_mapdestTableAddr;
+
+ // calculate offset based on page alignment.
+ offset = dst_data[index] - ALIGN_PAGE_DOWN(dst_data[index]);
+
+ // increment the offset to correct VA offset.
+ va_destTableAddr += (offset/(sizeof (uint64_t)));
+
+ uint64_t paddr = mm_virt_to_phys(va_destTableAddr);
+
+ if (paddr != dst_data[index])
+ {
+ TRACFCOMP(g_trac_dump,
+ "DumpTest::DumpCollectUnevenSrc:1 mapping mismatch actual paddr = %lx, expected paddr = %lx",
+ paddr, dst_data[index]);
+ TS_FAIL( "DumpTest::DumpCollectUnevenSrc ERROR : Unexpected error log from dumpcollect" );
+ }
+
+ int dataentries = (dst_data[index+1]/16);
+
+ int curSrcEntry = 0;
+
+ // Now loop through the data at this memory address and compare it to the data
+ for (int j = 0; j<2; j++)
+ {
+ if (va_destTableAddr[j] != src_data0[j])
+ {
+ // error
+ TRACFCOMP(g_trac_dump,
+ "DumpTest::DumpCollectUnevenSrc:1 : Data mismatch input data = %lX, outputdata = %lx",
+ src_data0[j], va_destTableAddr[j]);
+ TS_FAIL( "DumpTest::DumpCollectUnevenSrc ERROR : Unexpected error data mismatch" );
+ break;
+ }
+ dataentries = dataentries-1;
+ curSrcEntry++;
+ }
+
+
+ // Now loop through the remainder of this destination to a new src data entry
+ for (int j = 0; j<dataentries; j++)
+ {
+ if (va_destTableAddr[curSrcEntry] != src_data1[j])
+ {
+ // error
+ TRACFCOMP(g_trac_dump,
+ "DumpTest::DumpCollectUnevenSrc:2 : Data mismatch input data = %lX, outputdata = %lx",
+ src_data1[j], va_destTableAddr[j]);
+ TS_FAIL( "DumpTest::DumpCollectUnevenSrc ERROR : Unexpected error data mismatch" );
+ break;
+ }
+
+ }
+
+ // unmap the previous src entry
+ int rc =
+ mmio_dev_unmap(reinterpret_cast<void*>(va_mapdestTableAddr));
+
+ if (rc != 0)
+ {
+ TRACFCOMP(g_trac_dump,
+ "DumpTest::DumpCollectUnevenSrc:5 got an error back from unmap : RC=%X",rc);
+ TS_FAIL( "DumpTest::DumpCollectUnevenSrc:5 ERROR : BAD Rc from mmio_dev_unmap" );
+ break;
+ }
+ index+=2;
+
+
+ // SECOND DEStination ENTRY third source entry!!!!
+
+ // Get the Va for the page aligned Physical address
+ va_mapdestTableAddr =
+ static_cast<uint64_t*>(mmio_dev_map(reinterpret_cast<void*>(ALIGN_PAGE_DOWN(dst_data[index])),
+ THIRTYTWO_GB));
+
+ // copy the mapped VA to a VA pointer we will
+ va_destTableAddr = va_mapdestTableAddr;
+
+ // calculate offset based on page alignment.
+ offset = dst_data[index] - ALIGN_PAGE_DOWN(dst_data[index]);
+
+ // increment the offset to correct VA offset.
+ va_destTableAddr += (offset/(sizeof (uint64_t)));
+
+ paddr = mm_virt_to_phys(va_destTableAddr);
+
+ if (paddr != dst_data[index])
+ {
+ TRACFCOMP(g_trac_dump, "DumpTest::DumpCollectUnevenSrc:2 mapping mismatch actual paddr = %lx, expected paddr = %lx", paddr, dst_data[index]);
+ TS_FAIL( "DumpTest::DumpCollectUnevenSrc:2 ERROR : Unexpected error log from dumpcollect" );
+ }
+
+ dataentries = (dst_data[index+1]/16);
+ i = 0;
+
+ // Now loop through the data at this memory address and compare it to the data
+ for (int j = 0; j<dataentries; j++)
+ {
+ if (va_destTableAddr[j] != src_data2[j])
+ {
+ // error
+ TRACFCOMP(g_trac_dump, "DumpTest::DumpCollectUnevenSrc:3 : Data mismatch input data = %lX, outputdata = %lx", src_data2[j], va_destTableAddr[j]);
+ TS_FAIL( "DumpTest::DumpCollectUnevenSrc:3 ERROR : Unexpected error data mismatch" );
+ break;
+ }
+ }
+
+ // unmap the previous src entry
+ rc =
+ mmio_dev_unmap(reinterpret_cast<void*>(va_mapdestTableAddr));
+
+ if (rc != 0)
+ {
+ TRACFCOMP(g_trac_dump,
+ "DumpTest::DumpCollectUnevenSrc:6 got an error back from unmap : RC=%X",rc);
+ TS_FAIL( "DumpTest::DumpCollectUnevenSrc:6 ERROR : BAD Rc from mmio_dev_unmap" );
+ break;
+ }
+
+ index+=2;
+
+ // THIRD destination entry - part of last source!!!!
+
+ // Get the Va for the page aligned Physical address
+ va_mapdestTableAddr = static_cast<uint64_t*>(mmio_dev_map(reinterpret_cast<void*>(ALIGN_PAGE_DOWN(dst_data[index])),THIRTYTWO_GB));
+
+ // copy the mapped VA to a VA pointer we will
+ va_destTableAddr = va_mapdestTableAddr;
+
+ // calculate offset based on page alignment.
+ offset = dst_data[index] - ALIGN_PAGE_DOWN(dst_data[index]);
+
+ // increment the offset to correct VA offset.
+ va_destTableAddr += (offset/(sizeof (uint64_t)));
+
+ paddr = mm_virt_to_phys(va_destTableAddr);
+
+ if (paddr != dst_data[index])
+ {
+ TRACFCOMP(g_trac_dump, "DumpTest::DumpCollectUnevenSrc:3 mapping mismatch actual paddr = %lx, expected paddr = %lx", paddr, dst_data[index]);
+ TS_FAIL( "DumpTest::DumpCollectUnevenSrc:3 ERROR : Unexpected error log from dumpcollect" );
+ }
+
+ dataentries = (dst_data[index+1]/16);
+
+ curSrcEntry = 0;
+
+
+ // Now loop through the data at this memory address and compare it to the data
+ for (int j = 0; j<dataentries; j++)
+ {
+ if (va_destTableAddr[j] != src_data3[j])
+ {
+ // error
+ TRACFCOMP(g_trac_dump, "DumpTest::DumpCollectUnevenSrc:4: Data mismatch input data = %lX, outputdata = %lx", src_data3[j], va_destTableAddr[j]);
+ TS_FAIL( "DumpTest::DumpCollectUnevenSrc ERROR : Unexpected error data mismatch" );
+ break;
+ }
+ curSrcEntry++;
+ }
+
+
+ // unmap the previous src entry
+ rc =
+ mmio_dev_unmap(reinterpret_cast<void*>(va_mapdestTableAddr));
+
+ if (rc != 0)
+ {
+ TRACFCOMP(g_trac_dump,
+ "DumpTest::DumpCollectUnevenSrc:7 got an error back from unmap : RC=%X",rc);
+ TS_FAIL( "DumpTest::DumpCollectUnevenSrc:7 ERROR : BAD Rc from mmio_dev_unmap" );
+ break;
+ }
+ index+=2;
+
+
+ // FOURTH SRC ENTRY !!!!
+
+ // Get the Va for the page aligned Physical address
+ va_mapdestTableAddr =
+ static_cast<uint64_t*>(mmio_dev_map(reinterpret_cast<void*>(ALIGN_PAGE_DOWN(dst_data[index])),
+ THIRTYTWO_GB));
+
+ // copy the mapped VA to a VA pointer we will
+ va_destTableAddr = va_mapdestTableAddr;
+
+ // calculate offset based on page alignment.
+ offset = dst_data[index] - ALIGN_PAGE_DOWN(dst_data[index]);
+
+ // increment the offset to correct VA offset.
+ va_destTableAddr += (offset/(sizeof (uint64_t)));
+
+ paddr = mm_virt_to_phys(va_destTableAddr);
+
+ if (paddr != dst_data[index])
+ {
+ TRACFCOMP(g_trac_dump,
+ "DumpTest::DumpCollectUnevenSrc:5 mapping mismatch actual paddr = %lx, expected paddr = %lx",
+ paddr, dst_data[index]);
+ TS_FAIL( "DumpTest::DumpCollectUnevenSrc:4 ERROR : Unexpected error log from dumpcollect" );
+ }
+
+ dataentries = (dst_data[index+1]/16);
+
+ // Now loop through the data at this memory address and compare it to the data
+ for (int j = 0; j<dataentries; j++)
+ {
+ if (va_destTableAddr[j] != src_data3[curSrcEntry])
+ {
+ // error
+ TRACFCOMP(g_trac_dump,
+ "DumpTest::DumpCollectUnevenSrc:5 : Data mismatch input data = %lX, outputdata = %lx",
+ src_data3[curSrcEntry], va_destTableAddr[j]);
+ TS_FAIL( "DumpTest::DumpCollectUnevenSrc ERROR : Unexpected error data mismatch" );
+ break;
+ }
+
+ curSrcEntry++;
+ }
+
+ // unmap the previous src entry
+ rc =
+ mmio_dev_unmap(reinterpret_cast<void*>(va_mapdestTableAddr));
+
+ if (rc != 0)
+ {
+ TRACFCOMP(g_trac_dump,
+ "DumpTest::DumpCollectUnevenSrc:8 got an error back from unmap : RC=%X",rc);
+ TS_FAIL( "DumpTest::DumpCollectUnevenSrc:8 ERROR : BAD Rc from mmio_dev_unmap" );
+ break;
+ }
+ index+=2;
+
+ }while(0);
+
+
+ // Check the results table.
+ int result_rc = memcmp(resultTablePtr,result_data,sizeof (result_data));
+
+ 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::test_dumpCollectUnevenSrc COMPLETE" );
+ }
+
+
+ /**
+ * @brief Basic dump test that forces an error condition that does not have
+ * enough destination space to hold the src size
+ *
+ */
+
+ void test_DumpCollectNotEnoughDest(void)
+ {
+
+ TRACFCOMP( g_trac_dump, "dumpTest::test_dumpCollectNotEnoughDest START" );
+
+ errlHndl_t l_err = NULL;
+
+ uint64_t srcTableAddr = 0;
+ uint64_t srcTableSize = 0;
+
+ uint64_t dstTableAddr = 0;
+ uint64_t dstTableSize = 0;
+
+ uint64_t resultsTableAddr = 0;
+ uint64_t resultsTableSize = 0;
+
+ DUMP::dumpEntry *srcTableEntry = NULL;
+ DUMP::dumpEntry *destTableEntry = NULL;
+ DUMP::resultsEntry *resultsTableEntry = NULL;
+
+ // Test locations of the MDST, MDDT, MDRT
+ srcTableAddr = DUMP_TEST_SRC_MEM_ADDR;
+ srcTableSize = DUMP_TEST_SRC_MEM_SIZE;
+ dstTableAddr = DUMP_TEST_DST_MEM_ADDR;
+ dstTableSize = DUMP_TEST_DST_MEM_SIZE;
+ resultsTableAddr = DUMP_TEST_RESULTS_MEM_ADDR;
+ resultsTableSize = DUMP_TEST_RESULTS_MEM_SIZE;
+
+ 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};
+
+
+ uint64_t dst_data[8] = {DUMP_TEST_DST_DATA_AREA+4096, 64, // 4601000
+ DUMP_TEST_DST_DATA_AREA + 4096 + 64, 64,
+ DUMP_TEST_DST_DATA_AREA + 4096 + 128, 64,
+ DUMP_TEST_DST_DATA_AREA + 4096 + 192, 32}; // NOTE>> TOO SMALL of a space..
+
+
+ // Point to the location of the src Data pointer.
+ uint64_t *srcTablePtr = reinterpret_cast<uint64_t *>(srcTableAddr);
+
+ // Point to the location of the dest Data pointer.
+ uint64_t *dstTablePtr = reinterpret_cast<uint64_t *>(dstTableAddr);
+
+ // Put the src addresses defined above into the MDST
+ memcpy(srcTablePtr, src_data, sizeof(src_data));
+
+ // Put the src addresses defined above into the MDDT
+ memcpy(dstTablePtr, dst_data, sizeof(dst_data));
+
+
+ // Need to memory map
+ uint64_t src_Inputdata[4][8] = {
+ {0x1111111111111111, 0x1111111111111111,
+ 0x1111111111111111, 0x1111111111111111,
+ 0x1111111111111111, 0x1111111111111111,
+ 0x1111111111111111, 0x1111111111111111},
+
+ {0x2222222222222222, 0x2222222222222222,
+ 0x2222222222222222, 0x2222222222222222,
+ 0x2222222222222222, 0x2222222222222222,
+ 0x2222222222222222, 0x2222222222222222},
+
+ {0x3333333333333333, 0x3333333333333333,
+ 0x3333333333333333, 0x3333333333333333,
+ 0x3333333333333333, 0x3333333333333333,
+ 0x3333333333333333,0x3333333333333333},
+
+ {0x4444444444444444, 0x4444444444444444,
+ 0x4444444444444444, 0x4444444444444444,
+ 0x4444444444444444, 0x4444444444444444,
+ 0x4444444444444444, 0x4444444444444444}
+ };
+
+ uint64_t *va_mapsrcTableAddr = 0;
+ uint64_t *va_srcTableAddr = 0;
+ uint64_t offset = 0;
+ int index = 0;
+
+ for (int i = 0; i<4; i++)
+ {
+
+ // Get the Va for the page aligned Physical address
+ va_mapsrcTableAddr = static_cast<uint64_t*>(mmio_dev_map(reinterpret_cast<void*>(ALIGN_PAGE_DOWN(src_data[index])),THIRTYTWO_GB));
+
+ // copy the mapped VA to a VA pointer we will
+ va_srcTableAddr = va_mapsrcTableAddr;
+
+ // calculate offset based on page alignment.
+ offset = src_data[index] - ALIGN_PAGE_DOWN(src_data[index]);
+
+ // increment the offset to correct VA offset.
+ va_srcTableAddr += (offset/(sizeof (uint64_t)));
+
+ memcpy(va_srcTableAddr, src_Inputdata[i], sizeof(src_Inputdata[i]));
+
+ // unmap the previous src entry
+ int rc =
+ mmio_dev_unmap(reinterpret_cast<void*>(va_mapsrcTableAddr));
+
+ if (rc != 0)
+ {
+ TRACFCOMP(g_trac_dump, "DumpTest::DumpCollectNotEnoughDest ERROR..got an error back from unmap : RC=%X",rc);
+ TS_FAIL( "DumpTest::DumpCollectNotEnoughDest ERROR : BAD Rc from mmio_dev_unmap" );
+ break;
+ }
+ index+=2;
+ }
+
+
+ srcTableEntry = reinterpret_cast<DUMP::dumpEntry *>(srcTableAddr);
+ destTableEntry = reinterpret_cast<DUMP::dumpEntry *>(dstTableAddr);
+ resultsTableEntry = reinterpret_cast<DUMP::resultsEntry *>(resultsTableAddr);
+
+
+ l_err = DUMP::copySrcToDest(srcTableEntry,srcTableSize,
+ destTableEntry,dstTableSize,
+ resultsTableEntry,resultsTableSize);
+
+
+ // this testcase expects an error returned.
+ if( l_err )
+ {
+ TRACFCOMP(g_trac_dump,
+ "DumpTest::DumpCollectNotEnoughDest got an EXPECTED error back from copySrcToDest : RC=%X",l_err->reasonCode() );
+ delete l_err;
+ }
+ else
+ {
+ TRACFCOMP(g_trac_dump,
+ "DumpTest::DumpCollectNotEnoughDest ERROR : Did NOT get errorlog back from copySrcToDest");
+ TS_FAIL( "DumpTest::DumpCollectNotEnoughDest ERROR : DID not get expected error on too small dest entry" );
+ }
+
+
+ TRACFCOMP( g_trac_dump, "dumpTest::test_dumpCollectNotEnoughDest COMPLETE" );
+
+ }
+};
+
+#endif
OpenPOWER on IntegriCloud