summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xsrc/build/citest/etc/workarounds.presimsetup7
-rw-r--r--src/include/usr/sbeio/sbeioreasoncodes.H3
-rw-r--r--src/include/usr/vmmconst.h10
-rw-r--r--src/usr/sbeio/sbe_memRegionMgr.C220
-rw-r--r--src/usr/sbeio/sbe_memRegionMgr.H19
-rw-r--r--src/usr/sbeio/sbe_psudd.C12
-rw-r--r--src/usr/sbeio/test/sbe_memregiontest.H133
7 files changed, 332 insertions, 72 deletions
diff --git a/src/build/citest/etc/workarounds.presimsetup b/src/build/citest/etc/workarounds.presimsetup
index 9e47863ae..bc7b98e21 100755
--- a/src/build/citest/etc/workarounds.presimsetup
+++ b/src/build/citest/etc/workarounds.presimsetup
@@ -35,3 +35,10 @@
#echo "WSALIAS DEFAULT FIPSLEVEL env/gfwb/simics-4.2.0/simics-4.2.83/fips/fld36/fi120201a700.42" >> $sb/simu/data/simicsInfo
#echo "WSALIAS DEFAULT SIMICSLEVEL env/vtechb/simics-4.2.0/simics-4.2.83/bin" >> $sb/simu/data/simicsInfo
+# Pull in SBE Support of Unsecure Memory Regions
+echo "Pull in SBE Support of Unsecure Memory Regions"
+sbex -t 1030098
+mkdir -p $sb/sbei/sbfw/
+cd $sb/sbei/sbfw
+chmod 777 -R .
+mk -a -k
diff --git a/src/include/usr/sbeio/sbeioreasoncodes.H b/src/include/usr/sbeio/sbeioreasoncodes.H
index 43c33395e..4746ff16e 100644
--- a/src/include/usr/sbeio/sbeioreasoncodes.H
+++ b/src/include/usr/sbeio/sbeioreasoncodes.H
@@ -102,6 +102,7 @@ enum sbeioReasonCode
// SBE Unsecure Memory Region error codes
SBEIO_MEM_REGION_DOES_NOT_EXIST = SBEIO_COMP_ID | 0x50,
+ SBEIO_EXCEEDS_MAXIMUM_MEM_REGIONS = SBEIO_COMP_ID | 0x51,
// Remove once we collect the FFDC ourselves - @todo-RTC:144313
//termination_rc
@@ -115,6 +116,6 @@ enum UserDetailsTypes
};
-}; // end SBE
+}; // end SBEIO
#endif
diff --git a/src/include/usr/vmmconst.h b/src/include/usr/vmmconst.h
index b19980941..dc422a1f9 100644
--- a/src/include/usr/vmmconst.h
+++ b/src/include/usr/vmmconst.h
@@ -214,6 +214,10 @@ enum BlockPriority
/** Block size used in remove pages test */
#define VMM_SIZE_RMVPAGE_TEST (8 * PAGESIZE)
+/**
+ * Physical Memory Constants
+ */
+
/** Physical memory location of the TCE Table */
/** - needs to be aligned on 4MB boundary */
#define TCE_TABLE_ADDR (88*MEGABYTE)
@@ -221,4 +225,10 @@ enum BlockPriority
/** The TCE Table size is 512K entries each uint64_t (8 bytes) in size */
#define TCE_TABLE_SIZE ((512*KILOBYTE)*sizeof(uint64_t))
+/** Physical memory location used for Unsecure Memory Region Testing */
+/** - place it after TCE Table */
+#define UNSECURE_MEM_REGION_ADDR_TEST (TCE_TABLE_ADDR + TCE_TABLE_SIZE)
+
+#define UNSECURE_MEM_REGION_SIZE_TEST (1*KILOBYTE)
+
#endif /* _VMMCONST_H */
diff --git a/src/usr/sbeio/sbe_memRegionMgr.C b/src/usr/sbeio/sbe_memRegionMgr.C
index b598b3cef..01c6ed5c5 100644
--- a/src/usr/sbeio/sbe_memRegionMgr.C
+++ b/src/usr/sbeio/sbe_memRegionMgr.C
@@ -36,16 +36,16 @@
#include <targeting/common/targetservice.H>
#include <vmmconst.h>
#include <sys/misc.h>
+#include <secureboot/service.H>
#include "sbe_memRegionMgr.H"
extern trace_desc_t* g_trac_sbeio;
#define SBE_TRACD(printf_string,args...) \
-TRACDCOMP(g_trac_sbeio,"memRegion: " printf_string,##args)
-
+ TRACDCOMP(g_trac_sbeio,"memRegion: " printf_string,##args)
#define SBE_TRACF(printf_string,args...) \
-TRACFCOMP(g_trac_sbeio,"memRegion: " printf_string,##args)
+ TRACFCOMP(g_trac_sbeio,"memRegion: " printf_string,##args)
namespace SBEIO
{
@@ -102,7 +102,7 @@ MemRegionMgr::MemRegionMgr()
hb_dump_region.flags = SbePsu::SBE_MEM_REGION_OPEN_READ_ONLY;
iv_memRegions.push_back(hb_dump_region);
- SBE_TRACF("MemRegionMgr Constructor: Initial region(s):");
+ SBE_TRACD("MemRegionMgr Constructor: Initial region(s):");
printIvMemRegions();
SBE_TRACD(EXIT_MRK"MemRegionMgr Constructor");
@@ -130,6 +130,7 @@ errlHndl_t MemRegionMgr::openUnsecureMemRegion(
errlHndl_t errl = nullptr;
regionData l_region;
+ uint8_t region_count = iv_memRegions.size();
bool itr_region_closed = false;
const uint8_t input_flags = i_isWritable ?
SbePsu::SBE_MEM_REGION_OPEN_READ_WRITE :
@@ -137,22 +138,19 @@ errlHndl_t MemRegionMgr::openUnsecureMemRegion(
SBE_TRACF(ENTER_MRK"openUnsecureMemRegion: i_tgt=0x%X: "
"i_start_addr=0x%.16llX, i_size=0x%.8X, i_isWritable=%d "
- "(flags=0x%.2X)",
+ "(flags=0x%.2X), count=%d",
TARGETING::get_huid(i_target), i_start_addr, i_size,
- i_isWritable, input_flags);
+ i_isWritable, input_flags, region_count);
assert(i_size!=0, "openUnsecureMemRegion: i_size=0");
do
{
// Handle 'Open' Request
- // -- Look for identical region
- // ---- if so, fail
// -- Look for possible overlap with existing regions
// ---- If overlap, close existing regions and re-open
// all regions as necessary
// ---- If no overlap, open requested region
-
- // @TODO RTC 174970 - Add checks to not exceed 8 memory regions
+ // Throughout check that no more than 8 memory regions are opened
auto itr = iv_memRegions.begin();
while (itr != iv_memRegions.end())
@@ -191,31 +189,42 @@ errlHndl_t MemRegionMgr::openUnsecureMemRegion(
}
else
{
+ // Update count
+ --region_count;
+
// This region will be removed from the cache list later
itr_region_closed = true;
}
// Re-Open Non-overlapping initial part of Existing Region
- l_region.start_addr = itr->start_addr;
+ // NOTE: skipping max count check since we already closed a
+ // region above
l_region.size = i_start_addr - itr->start_addr;
l_region.flags = itr->flags;
l_region.tgt = itr->tgt;
- errl = doUnsecureMemRegionOp(l_region);
-
- if (errl)
+ if (l_region.size > 0)
{
- SBE_TRACF(ERR_MRK "openUnsecureMemRegion: Re-Open Op "
- "Failed: err rc=0x%.4X plid=0x%.8X",
- ERRL_GETRC_SAFE(errl), ERRL_GETPLID_SAFE(errl));
+ errl = doUnsecureMemRegionOp(l_region);
- // Return error to caller ASAP
- break;
- }
- else
- {
- // Add the region to the cache list
- iv_memRegions.push_front(l_region);
+ if (errl)
+ {
+ SBE_TRACF(ERR_MRK "openUnsecureMemRegion: Re-Open Op "
+ "Failed: err rc=0x%.4X plid=0x%.8X",
+ ERRL_GETRC_SAFE(errl),
+ ERRL_GETPLID_SAFE(errl));
+
+ // Return error to caller ASAP
+ break;
+ }
+ else
+ {
+ // Update count
+ ++region_count;
+
+ // Add the region to the cache list
+ iv_memRegions.push_front(l_region);
+ }
}
}
@@ -258,7 +267,14 @@ errlHndl_t MemRegionMgr::openUnsecureMemRegion(
}
// Re-open, non-overlapping back end part of
- // Existing Region
+ // Existing Region, but first check that we're not exceeding
+ // the maximum allowed number of regions
+ errl = checkNumberOfMemRegions(region_count);
+ if (errl)
+ {
+ break;
+ }
+
l_region.start_addr = i_start_addr + i_size;
l_region.size = (itr->start_addr + itr->size) -
(i_start_addr + i_size);
@@ -279,6 +295,9 @@ errlHndl_t MemRegionMgr::openUnsecureMemRegion(
}
else
{
+ // Update count
+ ++region_count;
+
// Add the region to the cache list
iv_memRegions.push_front(l_region);
}
@@ -317,6 +336,9 @@ errlHndl_t MemRegionMgr::openUnsecureMemRegion(
}
else
{
+ // Update count
+ --region_count;
+
// This region will be removed from the cache list later
itr_region_closed = true;
}
@@ -340,8 +362,14 @@ errlHndl_t MemRegionMgr::openUnsecureMemRegion(
break;
}
+ // Open Requested Region, but first check that we're not exceeding
+ // the maximum allowed number of regions
+ errl = checkNumberOfMemRegions(region_count);
+ if (errl)
+ {
+ break;
+ }
- // Open Requested Region
l_region.start_addr = i_start_addr;
l_region.size = i_size;
l_region.flags = input_flags;
@@ -366,7 +394,6 @@ errlHndl_t MemRegionMgr::openUnsecureMemRegion(
}
while (0);
- // TODO RTC 174970 remove when base support is working
printIvMemRegions();
SBE_TRACF(EXIT_MRK "openUnsecureMemRegion: i_tgt=0x%X: "
@@ -374,6 +401,18 @@ errlHndl_t MemRegionMgr::openUnsecureMemRegion(
TARGETING::get_huid(i_target), i_start_addr,
ERRL_GETRC_SAFE(errl));
+ if(errl)
+ {
+ errl->collectTrace(SBEIO_COMP_NAME);
+
+ // If error log is informational, commit it here rather
+ // than passing back an error and risk stopping the IPL
+ if (errl->sev() == ERRORLOG::ERRL_SEV_INFORMATIONAL)
+ {
+ errlCommit(errl, SBEIO_COMP_ID);
+ }
+ }
+
return errl;
}
@@ -457,6 +496,9 @@ errlHndl_t MemRegionMgr::closeUnsecureMemRegion(
i_start_addr,
iv_memRegions.size(),
true /*Add HB SW Callout*/ );
+
+ errl->collectTrace(SBEIO_COMP_NAME);
+
break;
}
@@ -464,10 +506,22 @@ errlHndl_t MemRegionMgr::closeUnsecureMemRegion(
while (0);
SBE_TRACF(EXIT_MRK "closeUnsecureMemRegion: i_tgt: 0x%X: "
- "i_start_addr0x%.16llX: err_rc=0x%4X",
+ "i_start_addr0x%.16llX: err_rc=0x%.4X",
TARGETING::get_huid(i_target), i_start_addr,
ERRL_GETRC_SAFE(errl));
+ if(errl)
+ {
+ errl->collectTrace(SBEIO_COMP_NAME);
+
+ // If error log is informational, commit it here rather
+ // than passing back an error and risk stopping the IPL
+ if (errl->sev() == ERRORLOG::ERRL_SEV_INFORMATIONAL)
+ {
+ errlCommit(errl, SBEIO_COMP_ID);
+ }
+ }
+
return errl;
}
@@ -513,7 +567,7 @@ errlHndl_t MemRegionMgr::closeAllUnsecureMemRegions()
// commit new error with orignal err PLID
errl->plid(errl_orig->plid());
-
+ errl->collectTrace(SBEIO_COMP_NAME);
errlCommit(errl, SBEIO_COMP_ID);
// Skip region since it failed to close
@@ -547,6 +601,17 @@ errlHndl_t MemRegionMgr::closeAllUnsecureMemRegions()
"err_rc=0x%.4X",
iv_memRegions.size(),
ERRL_GETRC_SAFE(errl_orig));
+ if(errl_orig)
+ {
+ errl_orig->collectTrace(SBEIO_COMP_NAME);
+
+ // If error log is informational, commit it here rather
+ // than passing back an error and risk stopping the IPL
+ if (errl_orig->sev() == ERRORLOG::ERRL_SEV_INFORMATIONAL)
+ {
+ errlCommit(errl_orig, SBEIO_COMP_ID);
+ }
+ }
return errl_orig;
}
@@ -560,8 +625,7 @@ errlHndl_t MemRegionMgr::doUnsecureMemRegionOp(regionData & i_region)
errlHndl_t errl = nullptr;
TARGETING::Target * l_tgt = i_region.tgt;
- // @TODO RTC 174970 - make TRACD when SBE support is tested
- SBE_TRACF(ENTER_MRK"doUnsecureMemRegionOp: tgt=0x%.8X: "
+ SBE_TRACD(ENTER_MRK"doUnsecureMemRegionOp: tgt=0x%.8X: "
"start_addr=0x%.16llX, size=0x%.8X, controlFlags=0x%.2X",
TARGETING::get_huid(l_tgt), i_region.start_addr,
i_region.size, i_region.flags);
@@ -599,29 +663,43 @@ errlHndl_t MemRegionMgr::doUnsecureMemRegionOp(regionData & i_region)
l_psuCommand.cd6_memRegion_Size = i_region.size;
l_psuCommand.cd6_memRegion_Start_Addr = i_region.start_addr;
-// @TODO RTC 174970 - Activate code block when SBE support is tested
-#if 0
errl = SBEIO::SbePsu::getTheInstance().performPsuChipOp(l_tgt,
&l_psuCommand,
&l_psuResponse,
SbePsu::MAX_PSU_SHORT_TIMEOUT_NS,
- SbePsu::SBE_MEMORY_REGION_REQ_USED_REGS,
- SbePsu::SBE_MEMORY_REGION_RSP_USED_REGS);
-#endif
+ SbePsu::SBE_MEM_REGION_REQ_USED_REGS,
+ SbePsu::SBE_MEM_REGION_RSP_USED_REGS);
+
if (errl)
{
SBE_TRACF(ERR_MRK "doUnsecureMemRegionOp: PSU Cmd Failed: "
"err rc=0x%.4X plid=0x%.8X (mbxReg0=0x%.16llX)",
ERRL_GETRC_SAFE(errl), ERRL_GETPLID_SAFE(errl),
l_psuCommand.mbxReg0);
+
+ // If Secureboot is not enabled, make the error from the SBE not
+ // supporting Security Control Messages Control command class (which
+ // includes the Unsecure Memory Region commands) Informational
+ if ((!SECUREBOOT::enabled()) &&
+ (l_psuResponse.primaryStatus ==
+ SbePsu::SBE_PRI_INVALID_COMMAND) &&
+ (l_psuResponse.secondaryStatus ==
+ SbePsu::SBE_SEC_COMMAND_CLASS_NOT_SUPPORTED)
+ )
+ {
+ SBE_TRACF(ERR_MRK "doUnsecureMemRegionOp: Secureboot NOT "
+ "Enabled - Changing 'Command Class Not Supported' "
+ "Error Log To Informational.");
+ errl->setSev(ERRORLOG::ERRL_SEV_INFORMATIONAL);
+ errl->collectTrace(SBEIO_COMP_NAME);
+ }
+
break;
}
-
}
while (0);
- // @TODO RTC 174970 - make TRACD when SBE support is tested
- SBE_TRACF(EXIT_MRK "doUnsecureMemRegionOp: tgt=0x%.8X: "
+ SBE_TRACD(EXIT_MRK "doUnsecureMemRegionOp: tgt=0x%.8X: "
"start_addr=0x%.16llX, size=0x%.8X, controlFlags=0x%.2X: "
"err_rc=0x%.4X",
TARGETING::get_huid(l_tgt), i_region.start_addr, i_region.size,
@@ -631,22 +709,68 @@ errlHndl_t MemRegionMgr::doUnsecureMemRegionOp(regionData & i_region)
}
/**
+ * MemRegionMgr::checkNumberOfMemRegions
+ * - see sbe_unsecureMemRegionMgr.H for details
+ */
+errlHndl_t MemRegionMgr::checkNumberOfMemRegions(uint8_t i_count) const
+{
+ errlHndl_t errl = nullptr;
+
+ if (i_count >= SBEIO_MAX_UNSECURE_MEMORY_REGIONS)
+ {
+ SBE_TRACF(ERR_MRK"checkNumberOfMemRegions: Current count=%d, max=%d. "
+ "New Region Cannot Be Opened",
+ i_count, SBEIO_MAX_UNSECURE_MEMORY_REGIONS);
+
+ /*@
+ * @errortype
+ * @moduleid SBEIO_MEM_REGION
+ * @reasoncode SBEIO_EXCEEDS_MAXIMUM_MEM_REGIONS
+ * @userdata1 Current Count of Unsecure Memory Regions
+ * @userdata2 Maximum Number of Unsecure Memomory Regions
+ * @devdesc Attempt To Open Too Many Unsecure Memory Regions
+ * @custdesc A problem occurred during the IPL
+ */
+ errl = new ERRORLOG::ErrlEntry(
+ ERRORLOG::ERRL_SEV_UNRECOVERABLE,
+ SBEIO_MEM_REGION,
+ SBEIO_EXCEEDS_MAXIMUM_MEM_REGIONS,
+ i_count,
+ SBEIO_MAX_UNSECURE_MEMORY_REGIONS,
+ true /*Add HB SW Callout*/ );
+
+ errl->collectTrace(SBEIO_COMP_NAME);
+ }
+
+ return errl;
+}
+
+/**
* MemRegionMgr::printIvMemRegions
* - see sbe_unsecureMemRegionMgr.H for details
*/
void MemRegionMgr::printIvMemRegions(void) const
{
- SBE_TRACF("MemRegionMgr::printIvMemRegions: number of entries=%d",
- iv_memRegions.size());
+ const uint8_t size = iv_memRegions.size();
- for ( const auto& itr : iv_memRegions )
+ if ( size == 0 )
+ {
+ SBE_TRACD("MemRegionMgr::printIvMemRegions: number of entries=%d",
+ iv_memRegions.size());
+ }
+ else
{
- SBE_TRACF("printIvMemRegions: tgt=0x%.8X: start_addr=0x%.16llX, "
- "size=0x%.8X, flags=0x%.2X (%s)",
- TARGETING::get_huid(itr.tgt), itr.start_addr,
- itr.size, itr.flags,
- itr.flags == SbePsu::SBE_MEM_REGION_OPEN_READ_ONLY ?
- "Read-Only" : "Read-Write");
+ uint8_t count = 1;
+ for ( const auto& itr : iv_memRegions )
+ {
+ SBE_TRACD("printIvMemRegions: %d/%d: tgt=0x%.8X: "
+ "start_addr=0x%.16llX, size=0x%.8X, flags=0x%.2X (%s)",
+ count, size, TARGETING::get_huid(itr.tgt),
+ itr.start_addr, itr.size, itr.flags,
+ itr.flags == SbePsu::SBE_MEM_REGION_OPEN_READ_ONLY ?
+ "Read-Only" : "Read-Write");
+ ++count;
+ }
}
}
diff --git a/src/usr/sbeio/sbe_memRegionMgr.H b/src/usr/sbeio/sbe_memRegionMgr.H
index d0b3fc4b1..0fc9f27bf 100644
--- a/src/usr/sbeio/sbe_memRegionMgr.H
+++ b/src/usr/sbeio/sbe_memRegionMgr.H
@@ -32,6 +32,11 @@
namespace SBEIO
{
+/*
+ * @brief Define Specifying The Maximum Number Of Unsecure Memory Regions That
+ * the SBE Supports
+ */
+#define SBEIO_MAX_UNSECURE_MEMORY_REGIONS 8
/*
* @brief Struct containing specifics of a Unsecure Memory Region
@@ -77,6 +82,18 @@ class MemRegionMgr
*/
errlHndl_t doUnsecureMemRegionOp(regionData & i_region);
+ /**
+ * @brief Checks That The Maximum Number of Unsecure Memory Regions That The
+ * SBE Supports Is Not Exceeded If A New Region Is Opened
+ *
+ * @param[in] i_count Current count of opened unsecure memory regions
+ *
+ * @return errlHndl_t Error log handle if current size of iv_memRegions is
+ * equal to or exceeds the maximum number of regions that
+ * the SBE Supports; otherwise, returns nullptr
+ */
+ errlHndl_t checkNumberOfMemRegions(uint8_t i_count) const;
+
public:
/**
* @brief Constructor. Initializes instance variables.
@@ -120,7 +137,7 @@ class MemRegionMgr
const bool i_isWritable,
TARGETING::Target* i_target);
- /**
+ /**
* @brief Close Unsecure Memory Region
*
* @note: See closeUnsecureMemRegion() function in sbeioif.H for details
diff --git a/src/usr/sbeio/sbe_psudd.C b/src/usr/sbeio/sbe_psudd.C
index 7c24cf327..7796cd55b 100644
--- a/src/usr/sbeio/sbe_psudd.C
+++ b/src/usr/sbeio/sbe_psudd.C
@@ -164,7 +164,11 @@ errlHndl_t SbePsu::performPsuChipOp(TARGETING::Target * i_target,
mutex_unlock(&l_psuOpMux);
- if( errl && (SBEIO_PSU == errl->moduleId()) )
+ if( errl && (SBEIO_PSU == errl->moduleId())
+ // For this special case pass back errl without commiting or
+ // collecting FFDC/shutting down
+ && (SBE_PSU_SET_UNSECURE_MEMORY_REGION_CMD != i_pPsuRequest->command)
+ )
{
SBE_TRACF( "Forcing shutdown for FSP to collect FFDC" );
@@ -217,7 +221,11 @@ errlHndl_t SbePsu::writeRequest(TARGETING::Target * i_target,
{
// assign sequence ID and save to check that response matches
i_pPsuRequest->seqID = ++l_seqID;
- SBE_TRACF("Sending Req = %.16X", i_pPsuRequest->mbxReg0);
+ SBE_TRACF("Sending Req = %.16X %.16X %.16X %.16X",
+ i_pPsuRequest->mbxReg0,
+ i_pPsuRequest->mbxReg1,
+ i_pPsuRequest->mbxReg2,
+ i_pPsuRequest->mbxReg3);
// Read SBE doorbell to confirm ready to accept command.
// Since the device driver single threads the requests, we should
diff --git a/src/usr/sbeio/test/sbe_memregiontest.H b/src/usr/sbeio/test/sbe_memregiontest.H
index 2c2c87121..87cb4a040 100644
--- a/src/usr/sbeio/test/sbe_memregiontest.H
+++ b/src/usr/sbeio/test/sbe_memregiontest.H
@@ -22,11 +22,11 @@
/* permissions and limitations under the License. */
/* */
/* IBM_PROLOG_END_TAG */
-#ifndef __SBE_MEMREGION_H
-#define __SBE_MEMREGION_H
+#ifndef __SBE_MEMREGIONTEST_H
+#define __SBE_MEMREGIONTEST_H
/**
- * @file sbe_ffdctest.H
+ * @file sbe_memregiontest.H
*
* @brief Test cases for Opening/Closing SBE/HB Memory Regions
*/
@@ -35,7 +35,14 @@
#include <errl/errlentry.H>
#include <errl/errlmanager.H>
#include <sbeio/sbeioif.H>
+#include <sbeio/sbeioreasoncodes.H>
+#include <vmmconst.h>
+#include <sys/mm.h>
+#include "../sbe_memRegionMgr.H"
+
+#define SBE_TRACD_MRT(printf_string,args...) \
+ TRACDCOMP(g_trac_sbeio,"memRegionTest: " printf_string,##args)
#define SBE_TRACF_MRT(printf_string,args...) \
TRACFCOMP(g_trac_sbeio,"memRegionTest: " printf_string,##args)
@@ -57,17 +64,68 @@ class SbeMemRegionTest : public CxxTest::TestSuite
// Reserve and Open Random Overlapping Memory Regions to force
// MemRegionMgr to update regions around each other
- // Malloc memory buffer to play with
- // @TODO RTC 174970 - reserve a buffer of Physical Memory and use
- // Physical addresses so that SBEIO commands will be successful
- uint32_t mem_buf_size = 256;
- void * mem_buf = malloc(mem_buf_size);
- uint64_t mem_buf_start_addr =
- reinterpret_cast<uint64_t>(mem_buf);
+ // Reserve the Physical Memory set aside in vmmconst.h to use
+ // for this test so that the SBEIO commands will work
+ uint32_t mem_buf_size = UNSECURE_MEM_REGION_SIZE_TEST;
+ uint64_t mem_buf_start_addr = UNSECURE_MEM_REGION_ADDR_TEST;
+ void * tmp_virtual_addr = mm_block_map(
+ reinterpret_cast<void*>
+ (UNSECURE_MEM_REGION_ADDR_TEST),
+ UNSECURE_MEM_REGION_SIZE_TEST);
+ assert(tmp_virtual_addr!=nullptr, "memRegionTest1: tmp_virtual_addr is nullptr");
do
{
+ // Loop Test: Open MAX+1 to force a fail
+ for (size_t i = 1; i<=SBEIO_MAX_UNSECURE_MEMORY_REGIONS+1 ; i++)
+ {
+ errl = SBEIO::openUnsecureMemRegion(mem_buf_start_addr +
+ ((i-1)*32),
+ 16,
+ true); //true=Read-Write
+
+ if (i <= SBEIO_MAX_UNSECURE_MEMORY_REGIONS)
+ {
+ // Expect the open to succeed
+ if (errl)
+ {
+ TS_FAIL("memRegionTest1: Loop Test-%d: SBEIO::openUnsecureMemRegion() Failed: rc=0x%X, plid=0x%X",
+ i, ERRL_GETRC_SAFE(errl), ERRL_GETPLID_SAFE(errl));
+ break;
+ }
+ else
+ {
+ SBE_TRACD_MRT("memRegionTest1: Loop Test-%d: SBEIO::openUnsecureMemRegion() SUCCESSFUL", i);
+ }
+ }
+ else // i = SBEIO_MAX_UNSECURE_MEMORY_REGIONS + 1
+ {
+ // Expect the open to fail with the return code
+ // SBEIO_EXCEEDS_MAXIMUM_MEM_REGIONS
+ if (ERRL_GETRC_SAFE(errl)==SBEIO::SBEIO_EXCEEDS_MAXIMUM_MEM_REGIONS)
+ {
+ SBE_TRACF_MRT("memRegionTest1: Loop Test-%d: SBEIO::openUnsecureMemRegion() Returned Expected Fail: rc=0x%X, plid=0x%X",
+ i, ERRL_GETRC_SAFE(errl), ERRL_GETPLID_SAFE(errl));
+ delete errl;
+ errl = nullptr;
+ }
+ else
+ {
+ TS_FAIL("memRegionTest1: Loop Test-%d: SBEIO::openUnsecureMemRegion() Did NOT Return Expected Fail rc=0x%X: got rc=0x%X, plid=0x%X",
+ i, SBEIO::SBEIO_EXCEEDS_MAXIMUM_MEM_REGIONS,
+ ERRL_GETRC_SAFE(errl), ERRL_GETPLID_SAFE(errl));
+ break;
+ }
+ }
+ }
+
+ // Skip the rest of the testcase if we already have an error log
+ if(errl)
+ {
+ break;
+ }
+
// Test 1: Open Read-Write region for front half of memory buffer
errl = SBEIO::openUnsecureMemRegion(mem_buf_start_addr,
mem_buf_size/2,
@@ -80,7 +138,7 @@ class SbeMemRegionTest : public CxxTest::TestSuite
}
else
{
- SBE_TRACF_MRT("memRegionTest1: T1: SBEIO::openUnsecureMemRegion() SUCCESSFUL");
+ SBE_TRACD_MRT("memRegionTest1: T1: SBEIO::openUnsecureMemRegion() SUCCESSFUL");
}
// Test 2: Open Overlapping Read-Only region for middle chunk of
@@ -96,7 +154,7 @@ class SbeMemRegionTest : public CxxTest::TestSuite
}
else
{
- SBE_TRACF_MRT("memRegionTest1: T2: SBEIO::openUnsecureMemRegion() SUCCESSFUL");
+ SBE_TRACD_MRT("memRegionTest1: T2: SBEIO::openUnsecureMemRegion() SUCCESSFUL");
}
// Test 3: Open Overlapping Read-Write region completely enclosed by
@@ -112,7 +170,7 @@ class SbeMemRegionTest : public CxxTest::TestSuite
}
else
{
- SBE_TRACF_MRT("memRegionTest1: T3: SBEIO::openUnsecureMemRegion() SUCCESSFUL");
+ SBE_TRACD_MRT("memRegionTest1: T3: SBEIO::openUnsecureMemRegion() SUCCESSFUL");
}
// Test 4: Open Overlapping Read-Write region that completely encloses
@@ -128,7 +186,7 @@ class SbeMemRegionTest : public CxxTest::TestSuite
}
else
{
- SBE_TRACF_MRT("memRegionTest1: T4: SBEIO::openUnsecureMemRegion() SUCCESSFUL");
+ SBE_TRACD_MRT("memRegionTest1: T4: SBEIO::openUnsecureMemRegion() SUCCESSFUL");
}
// Test 5: Open Non-Overlapping Read-Only Region at the end
@@ -144,10 +202,38 @@ class SbeMemRegionTest : public CxxTest::TestSuite
}
else
{
- SBE_TRACF_MRT("memRegionTest1: T5: SBEIO::openUnsecureMemRegion() SUCCESSFUL");
+ SBE_TRACD_MRT("memRegionTest1: T5: SBEIO::openUnsecureMemRegion() SUCCESSFUL");
}
- // @TODO RTC 174970 Add testcases for open/close fail scenarios
+ // Test 6: Close Single Region That Exists
+ errl = SBEIO::closeUnsecureMemRegion(mem_buf_start_addr+(mem_buf_size/8)*7);
+ if (errl)
+ {
+ TS_FAIL("memRegionTest1: T6: SBEIO::closeUnsecureMemRegion() Failed: rc=0x%X, plid=0x%X",
+ ERRL_GETRC_SAFE(errl), ERRL_GETPLID_SAFE(errl));
+ break;
+ }
+ else
+ {
+ SBE_TRACD_MRT("memRegionTest1: T6: SBEIO::closeUnsecureMemRegion() SUCCESSFUL");
+ }
+
+ // Test 7: Re-Close Single Region and look for expected fail
+ errl = SBEIO::closeUnsecureMemRegion(mem_buf_start_addr+(mem_buf_size/8)*7);
+ if (ERRL_GETRC_SAFE(errl) == SBEIO::SBEIO_MEM_REGION_DOES_NOT_EXIST)
+ {
+ SBE_TRACF_MRT("memRegionTest1: T7: SBEIO::closeUnsecureMemRegion() Returned Expected Fail: rc=0x%X, plid=0x%X",
+ ERRL_GETRC_SAFE(errl), ERRL_GETPLID_SAFE(errl));
+ delete errl;
+ errl = nullptr;
+ }
+ else
+ {
+ TS_FAIL("memRegionTest1: T7: SBEIO::closeUnsecureMemRegion() Did NOT Return Expected Fail rc=0x%X: got rc=0x%X, plid=0x%X",
+ SBEIO::SBEIO_MEM_REGION_DOES_NOT_EXIST,
+ ERRL_GETRC_SAFE(errl), ERRL_GETPLID_SAFE(errl));
+ break;
+ }
// Test 99: Close all Memory Regions
errl = SBEIO::closeAllUnsecureMemRegions();
@@ -155,6 +241,7 @@ class SbeMemRegionTest : public CxxTest::TestSuite
{
TS_FAIL("memRegionTest1: T99: SBEIO::closeAllUnsecureMemRegions Failed: rc=0x%X, plid=0x%X",
ERRL_GETRC_SAFE(errl), ERRL_GETPLID_SAFE(errl));
+ break;
}
else
{
@@ -163,12 +250,18 @@ class SbeMemRegionTest : public CxxTest::TestSuite
}while(0);
- free (mem_buf);
- mem_buf = nullptr;
-
+ // Commit any unexpected error logs
if (errl)
{
- errlCommit(errl, SBEIO_COMP_ID);
+ errlCommit(errl, SBEIO_COMP_ID);
+ }
+
+ // Unmap the reserved memory using the virtual address
+ int rc = mm_block_unmap(tmp_virtual_addr);
+
+ if (rc)
+ {
+ TS_FAIL("memRegionTest1: mm_block_unmap failed with rc=%d", rc);
}
TS_TRACE(EXIT_MRK"memRegionTest1");
OpenPOWER on IntegriCloud