summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xsrc/build/simics/hb-simdebug.py167
-rw-r--r--src/usr/initservice/istepdispatcher/istepdispatcher.C76
-rw-r--r--src/usr/initservice/istepdispatcher/istepdispatcher.H1
-rw-r--r--src/usr/initservice/istepdispatcher/splesscommon.H8
-rw-r--r--src/usr/initservice/test/splesstest.H2
-rw-r--r--src/usr/targeting/test/targetingtest.H67
-rw-r--r--src/usr/targeting/xmltohb/attribute_types.xml15
-rw-r--r--src/usr/targeting/xmltohb/target_types.xml3
8 files changed, 207 insertions, 132 deletions
diff --git a/src/build/simics/hb-simdebug.py b/src/build/simics/hb-simdebug.py
index 238220417..64bedad29 100755
--- a/src/build/simics/hb-simdebug.py
+++ b/src/build/simics/hb-simdebug.py
@@ -59,32 +59,31 @@ def dumpL3():
#------------------------------------------------------------------------------
def print_istep_list( inList ):
- zinList = [ "i0_sub0 0 CG F IStep0 substep0", \
- "i0_sub1 0 CG F IStep1 substep1", \
- "i1_sub0 1 CG F IStep1 substep1", \
- "i55sub55 55 CG F bogus istep", \
- ]
print
print "istep commands:."
- print " istepmode - set IStep Mode flag in SCOM reg"
+ print " istepmode - enable IStep Mode. Must be executed before simics run command"
+ print " normalmode - disable IStep Mode. "
+ print " list - list all named isteps"
+ print " sN - execute IStep N"
+ print " sN..M - execute IStep N through M"
+ print " <name1> - excute named istep name1"
+ print " <name1>..<name2> - execute named isteps name1 through name2"
print
print "-----------------------------------------------------------"
- print " StepName Num Who Mode Description "
- print "-----------------------------------------------------------"
- for line in zinList:
- print line.strip()
- print
- print " Key:"
- print " Who ---- "
- print " C = Cronus"
- print " G = GFW"
- print " Mode ---- "
- print " F = Fast Mode"
- print " S = Slow Mode (Fast Mode + more)"
- print " M = Manufacturing Mode"
- return
+ print " Supported ISteps: "
+ print " IStep\tSubStep\tStepName "
+ print "-----------------------------------------------------------"
-# normally this would be a loop to watch for the runningbit.
+ ## print len(inList)
+ for i in range(0,len(inList)) :
+ ##print len(inList[i])
+ for j in range( 0, len(inList[i])) :
+ print "%d\t%d\t%s"%( i, j, inList[i][j] )
+
+ return None
+
+
+# normally this would be a loop to watch for the runningbit.
# currently simics dumps all sorts of error lines every time a SCOM is
# read, so HostBoot only updates every 1 sec. at that rate we only
# need to sleep for 2 sec and we are sure to get it.
@@ -92,24 +91,17 @@ def print_istep_list( inList ):
def getStatusReg():
##StatusStr = "salerno_chip.regdump SCOM 0x13012685"
## -f <file> dumps the output to <file>_SCOM_0X13012685
- StatusStr = "salerno_chip.regdump SCOM 0x13012685 -f ./scom.out"
-
+ ## StatusStr = "salerno_chip.regdump SCOM 0x13012685 -f ./scom.out"
+ StatusStr = "cpu0_0_0_2->scratch"
+
## get response
- (result, statusOutput) = quiet_run_command( StatusStr, output_modes.regular )
- ## HACK: quiet_run_command() only returns the first line of a 4-line
- ## output, pipe all lines to a file and then read it back.
- file = open( "./scom.out_SCOM_0X13012685", "rU" )
- statusOutput = file.readlines()
- file.close()
+ # (result, statusOutput) = quiet_run_command( StatusStr, output_modes.regular )
+ result = conf.cpu0_0_0_2.scratch
+ print "0x%x"%(result)
- #print result
- #print "............"
- #print statusOutput[0]
- #print statusOutput[1]
- #print statusOutput[2]
- #print "..........."
-
- (j1, j2, j3, j4, hiword, loword) = statusOutput[2].split()
+ hiword = ( ( result & 0xffffffff00000000) >> 32 )
+ loword = ( result & 0x00000000ffffffff )
+
return (hiword, loword)
@@ -124,7 +116,8 @@ def runIStep( istep, substep, inList ):
print "run %s :"%( inList[istep][substep] )
print " istep # = 0x%x / substep # = 0x%x :"%(istep, substep)
- CommandStr = "salerno_chip.regwrite SCOM 0x13012684 \"0x80000000_%4.4x%4.4x\" 64"%(istep,substep)
+ ## CommandStr = "salerno_chip.regwrite SCOM 0x13012684 \"0x80000000_%4.4x%4.4x\" 64"%(istep,substep)
+ CommandStr = "cpu0_0_0_1->scratch=0x80000000_%4.4x%4.4x"%(istep,substep)
#result = run_command( "run" )
@@ -138,20 +131,23 @@ def runIStep( istep, substep, inList ):
# result = run_command( "stop" )
(hiword, loword) = getStatusReg()
- print hiword + " " + loword
- runningbit = ( ( int(hiword,16) & 0x80000000 ) >> 31 )
- readybit = ( ( int(hiword,16) & 0x40000000 ) >> 30 )
- stsIStep = ( ( int(hiword,16) & 0x3fff0000 ) >> 16 )
- stsSubstep = ( ( int(hiword,16) & 0x0000ffff ) )
- taskStatus = ( ( int(loword,16) & 0xffff0000 ) >> 16 )
- istepStatus = ( ( int(loword,16) & 0x0000ffff ) )
- print
- print "%s : returned Status : "%( inList[istep][substep] )
+
+ runningbit = ( ( hiword & 0x80000000 ) >> 31 )
+ readybit = ( ( hiword & 0x40000000 ) >> 30 )
+ stsIStep = ( ( hiword & 0x3fff0000 ) >> 16 )
+ stsSubstep = ( ( hiword & 0x0000ffff ) )
+
+ taskStatus = ( ( loword & 0xffff0000 ) >> 16 )
+ istepStatus = ( ( loword & 0x0000ffff ) )
+ print
+ print "%s : returned Status 0x%8.8x_%8.8x : "%( inList[istep][substep], hiword, loword )
print "runningbit = 0x%x, readybit=0x%x"%(runningbit, readybit)
print "Istep 0x%x / Substep 0x%x Status: 0x%x 0x%x"%( stsIStep, stsSubstep, taskStatus, istepStatus )
- print "-----------------------------------------------------------------"
-
-## run command = "sN"
+ print "-----------------------------------------------------------------"
+
+ # result = run_command( "run" )
+
+## run command = "sN"
def sCommand( inList, scommand ) :
i = int(scommand)
j = 0
@@ -182,7 +178,8 @@ def find_in_inList( inList, substepname) :
## sN..M
## <substepname1>..<substepname2>
def istepHB( str_arg1, inList):
- IStepModeStr = "salerno_chip.regwrite SCOM 0x13012686 \"0x4057b007_4057b007\" 64"
+ IStepModeStr = "cpu0_0_0_3->scratch=0x4057b007_4057b007"
+ NormalModeStr = "cpu0_0_0_3->scratch=0x700b7504_700b7504"
print "run isteps...."
@@ -195,6 +192,12 @@ def istepHB( str_arg1, inList):
(result, out) = quiet_run_command(IStepModeStr, output_modes.regular )
# print result
return
+
+ if ( str_arg1 == "normalmode" ): ## set Normal Mode in SCOM reg
+ print "Set Normal Mode"
+ (result, out) = quiet_run_command(NormalModeStr, output_modes.regular )
+ # print result
+ return
## check to see if we have an 's' command (string starts with 's')
if ( str_arg1.startswith('s') ):
@@ -211,23 +214,30 @@ def istepHB( str_arg1, inList):
for x in range( (int(M,16)), (int(N,16)+1) ) :
sCommand( inList, x )
return
- else:
- ## substep name .. substep name
- (ss_nameM, ss_nameN) = str_arg1.split("..")
- (istepM, substepM, foundit) = find_in_inList( inList, ss_nameM )
- if ( not foundit ) :
- print( "Invalid substep %s"%(ss_nameM) )
- return
-
- (istepN, substepN, foundit) = find_in_inList( inList, ss_nameN )
- if ( not foundit ) :
- print( "Invalid substep %s"%(ss_nameN) )
- return
-
- for x in range( istepM, istepN+1 ) :
+ else:
+ ## substep name
+ ## (ss_nameM, ss_nameN) = str_arg1.split("..")
+ namelist = str_arg1.split("..")
+ if ( len(namelist) == 1 ) :
+ (istepM, substepM, foundit) = find_in_inList( inList, namelist[0] )
+ if ( not foundit ) :
+ print "Invalid substep %s"%( namelist[0] )
+ return
+ runIStep( istepM, substepM, inList )
+ else:
+ ## substep name .. substep name
+ (istepM, substepM, foundit) = find_in_inList( inList, namelist[0] )
+ if ( not foundit ) :
+ print "Invalid substep %s"%( namelist[0] )
+ return
+ (istepN, substepN, foundit) = find_in_inList( inList, namelist[1] )
+ if ( not foundit ) :
+ print( "Invalid substep %s"%( namelist[1]) )
+ return
+ for x in range( istepM, istepN+1 ) :
for y in range( substepM, substepN+1) :
runIStep( x, y, inList )
- return
+ return
#===============================================================================
@@ -318,13 +328,24 @@ def hb_istep(str_arg1):
# TODO inFile.close()
## set up demo inlist
- inList = [ [ "i0_sub0", "i0_sub1" ],
- [ "i1_sub0" ],
- ]
-
- ## print flag_t
-
- if str_arg1 == None:
+ inList = [ [ "na" ], ## istep 0
+ [ "na" ], ## istep 1
+ [ "na" ], ## istep 2
+ [ "na" ], ## istep 3
+ [ "init_target_states", ## istep 4
+ "init_fsi",
+ "apply_fsi_info",
+ "apply_dd_presence",
+ "apply_pr_keyword_data",
+ "apply_partial_bad",
+ "apply_gard",
+ "testHWP"
+ ],
+ ]
+
+ ## print flag_t
+
+ if str_arg1 == None:
print_istep_list( inList )
else:
print "args=%s" % str(str_arg1)
diff --git a/src/usr/initservice/istepdispatcher/istepdispatcher.C b/src/usr/initservice/istepdispatcher/istepdispatcher.C
index 1615c1b9e..d2d889e06 100644
--- a/src/usr/initservice/istepdispatcher/istepdispatcher.C
+++ b/src/usr/initservice/istepdispatcher/istepdispatcher.C
@@ -46,8 +46,14 @@
#include <devicefw/userif.H> // targeting
#include <sys/mmio.h> // mmio_scratch_read()
#include <initservice/taskargs.H> // TaskArgs structs
+
#include <errl/errluserdetails.H> // ErrlUserDetails base class
+#include <targeting/attributes.H> // ISTEP_MODE attribute
+#include <targeting/entitypath.H>
+#include <targeting/target.H>
+#include <targeting/targetservice.H>
+
#include "istepdispatcher.H"
#include "splesscommon.H"
@@ -144,10 +150,6 @@ enum {
const uint64_t SINGLESTEP_PAUSE_S = 1;
const uint64_t SINGLESTEP_PAUSE_NS = 100000000;
-
-
-
-
/**
* @brief set up _start() task entry procedure using the macro in taskargs.H
*/
@@ -249,34 +251,64 @@ void IStepDispatcher::init( void * io_ptr )
bool IStepDispatcher::getIStepMode( ) const
{
+ using namespace TARGETING;
+ Target* l_pTopLevel = NULL;
+ bool l_istepmodeflag = false;
+ TargetService& l_targetService = targetService();
- return iv_istepmodeflag;
+ (void) l_targetService.getTopLevelTarget(l_pTopLevel);
+ if (l_pTopLevel == NULL)
+ {
+ TRACFCOMP( g_trac_initsvc, "Top level handle was NULL" );
+ l_istepmodeflag = false;
+ }
+ else
+ {
+ l_istepmodeflag = l_pTopLevel->getAttr<ATTR_ISTEP_MODE> ();
+ }
+
+
+ return l_istepmodeflag;
}
-/**
- * @todo revisit this when PNOR Driver is implemented
- *
- */
void IStepDispatcher::initIStepMode( )
{
- uint64_t l_readData = 0;
-
- l_readData = mmio_scratch_read( MMIO_SCRATCH_IPLSTEP_CONFIG );
+ using namespace TARGETING;
+ uint64_t l_readData = 0;
+ Target *l_pTopLevel = NULL;
+ TargetService& l_targetService = targetService();
- TRACDCOMP( g_trac_initsvc,
- "SCOM ScratchPad read, Offset 0x%x, Data 0x%llx",
- MMIO_SCRATCH_IPLSTEP_CONFIG,
- l_readData );
-
- // check for IStep Mode signature
- if ( l_readData == ISTEP_MODE_SIGNATURE )
+ (void) l_targetService.getTopLevelTarget(l_pTopLevel);
+ if (l_pTopLevel == NULL)
{
- iv_istepmodeflag = true;
- }
+ TRACFCOMP( g_trac_initsvc, "Top level handle was NULL" );
+ // drop through, default of attribute is is false
+ }
else
{
- iv_istepmodeflag = false;
+ // got a pointer to Targeting, complete setting the flag
+ l_readData = mmio_scratch_read( MMIO_SCRATCH_IPLSTEP_CONFIG );
+
+ TRACDCOMP( g_trac_initsvc,
+ "SCOM ScratchPad read, Offset 0x%x, Data 0x%llx",
+ MMIO_SCRATCH_IPLSTEP_CONFIG,
+ l_readData );
+
+ // check for IStep Mode signature(s)
+ if ( l_readData == ISTEP_MODE_ON_SIGNATURE )
+ {
+ l_pTopLevel->setAttr<ATTR_ISTEP_MODE> (true );
+ TRACDCOMP( g_trac_initsvc,
+ "ISTEP_MODE attribute set to TRUE." );
+ }
+
+ if ( l_readData == ISTEP_MODE_OFF_SIGNATURE )
+ {
+ l_pTopLevel->setAttr<ATTR_ISTEP_MODE> ( false );
+ TRACDCOMP( g_trac_initsvc,
+ "ISTEP_MODE attribute set to FALSE." );
+ }
}
}
diff --git a/src/usr/initservice/istepdispatcher/istepdispatcher.H b/src/usr/initservice/istepdispatcher/istepdispatcher.H
index b507cbe21..70e9f2883 100644
--- a/src/usr/initservice/istepdispatcher/istepdispatcher.H
+++ b/src/usr/initservice/istepdispatcher/istepdispatcher.H
@@ -222,7 +222,6 @@ private:
// ----- internal vars -----------------------------
- bool iv_istepmodeflag;
}; // class IStepDispatcher
diff --git a/src/usr/initservice/istepdispatcher/splesscommon.H b/src/usr/initservice/istepdispatcher/splesscommon.H
index 8602901a6..d75ee1f83 100644
--- a/src/usr/initservice/istepdispatcher/splesscommon.H
+++ b/src/usr/initservice/istepdispatcher/splesscommon.H
@@ -41,7 +41,13 @@
/******************************************************************************/
// Globals/Constants
/******************************************************************************/
-const uint64_t ISTEP_MODE_SIGNATURE = 0x4057b0074057b007;
+/**
+ * @note Since ISTEP_MODE attribute is nonvolitile (persists across boots),
+ * we must have a way to turn the attribute both ON and OFF - we
+ * cannot depend on the FSP to do it since we may not have a FSP.
+ */
+const uint64_t ISTEP_MODE_ON_SIGNATURE = 0x4057b0074057b007;
+const uint64_t ISTEP_MODE_OFF_SIGNATURE = 0x700b7504700b7504;
/******************************************************************************/
// SPLESS Command Prototypes
diff --git a/src/usr/initservice/test/splesstest.H b/src/usr/initservice/test/splesstest.H
index f89d2d4a8..d1caf006b 100644
--- a/src/usr/initservice/test/splesstest.H
+++ b/src/usr/initservice/test/splesstest.H
@@ -263,7 +263,7 @@ private:
l_readData = mmio_scratch_read( MMIO_SCRATCH_IPLSTEP_CONFIG );
// check for IStep Mode signature, this is temporary
- if ( l_readData == ISTEP_MODE_SIGNATURE )
+ if ( l_readData == ISTEP_MODE_ON_SIGNATURE )
{
l_flag = true;
}
diff --git a/src/usr/targeting/test/targetingtest.H b/src/usr/targeting/test/targetingtest.H
index c6d732cee..95f21f344 100644
--- a/src/usr/targeting/test/targetingtest.H
+++ b/src/usr/targeting/test/targetingtest.H
@@ -59,7 +59,7 @@
/**
* @brief Struct to hold pointers to a mutex / protected value
- */
+ */
struct MutexTestData_t
{
mutex_t* pMutex; // Pointer to mutex
@@ -658,8 +658,8 @@ class TargetingTestSuite: public CxxTest::TestSuite
TS_FAIL("Always true filter should have matched system");
}
-#if 0
- // Triggers NULL assertion check on push
+#if 0
+ // Triggers NULL assertion check on push
l_alwaysTrueExpr.push(NULL);
#endif
@@ -921,7 +921,7 @@ class TargetingTestSuite: public CxxTest::TestSuite
"different than the original");
}
- PredicateCTM l_ctm1(CLASS_CHIP,TYPE_PROC);
+ PredicateCTM l_ctm1(CLASS_CHIP,TYPE_PROC);
TargetRangeFilter l_f3(
targetService().begin(),
@@ -972,8 +972,8 @@ class TargetingTestSuite: public CxxTest::TestSuite
TargetService& l_targetService = targetService();
- TargetRangeFilter f(l_targetService.begin(),
- l_targetService.end(),
+ TargetRangeFilter f(l_targetService.begin(),
+ l_targetService.end(),
NULL);
int l_count = 0;
for(; f; ++f, l_count++)
@@ -995,7 +995,7 @@ class TargetingTestSuite: public CxxTest::TestSuite
{
EntityPath l_path = f->getAttr<ATTR_PHYS_PATH>();
l_path.dump();
- }
+ }
TS_TRACE(INF_MRK "Found %d targets that are chips or enclosures ",
l_count);
@@ -1073,7 +1073,7 @@ class TargetingTestSuite: public CxxTest::TestSuite
"attribute access",l_dummyRw[0][1][2]);
}
- TARGETING::CLASS l_class =
+ TARGETING::CLASS l_class =
l_pTarget->getAttr<TARGETING::ATTR_CLASS>();
if(l_class != TARGETING::CLASS_SYS)
{
@@ -1088,7 +1088,7 @@ class TargetingTestSuite: public CxxTest::TestSuite
"attribute access",l_type,TARGETING::TYPE_SYS);
}
- uint64_t l_xscom =
+ uint64_t l_xscom =
l_pTarget->getAttr<TARGETING::ATTR_XSCOM_BASE_ADDRESS>();
if(l_xscom != 0x300000000000)
{
@@ -1112,10 +1112,10 @@ class TargetingTestSuite: public CxxTest::TestSuite
l_dummyRw[0][2][4]);
}
- TS_TRACE(INF_MRK "Now using FAPI set macros");
+ TS_TRACE(INF_MRK "Now using FAPI set macros");
l_dummyRw[0][2][3] = 6;
- l_rc = FAPI_ATTR_SET(ATTR_DUMMY_SCRATCH_PLAT_INIT_UINT8, NULL,
+ l_rc = FAPI_ATTR_SET(ATTR_DUMMY_SCRATCH_PLAT_INIT_UINT8, NULL,
l_dummyRw);
if(l_rc != 0)
{
@@ -1123,7 +1123,7 @@ class TargetingTestSuite: public CxxTest::TestSuite
}
memset(l_dummyRw,0x00,sizeof(l_dummyRw));
- l_rc = FAPI_ATTR_GET(ATTR_DUMMY_SCRATCH_PLAT_INIT_UINT8, NULL,
+ l_rc = FAPI_ATTR_GET(ATTR_DUMMY_SCRATCH_PLAT_INIT_UINT8, NULL,
l_dummyRw);
if(l_rc != 0)
{
@@ -1136,7 +1136,7 @@ class TargetingTestSuite: public CxxTest::TestSuite
"prior write",l_dummyRw[0][2][3]);
}
- TS_TRACE(INF_MRK "Now using targets without the attribute");
+ TS_TRACE(INF_MRK "Now using targets without the attribute");
memset(l_dummyRw,0x00,sizeof(l_dummyRw));
EntityPath l_realPath(EntityPath::PATH_PHYSICAL);
@@ -1149,7 +1149,7 @@ class TargetingTestSuite: public CxxTest::TestSuite
fapi::Target* l_pFapiTarget = new fapi::Target(
fapi::TARGET_TYPE_PROC_CHIP, l_pTarget);
- l_rc = FAPI_ATTR_GET(ATTR_DUMMY_SCRATCH_PLAT_INIT_UINT8,
+ l_rc = FAPI_ATTR_GET(ATTR_DUMMY_SCRATCH_PLAT_INIT_UINT8,
l_pFapiTarget , l_dummyRw);
if(l_rc == 0)
{
@@ -1160,7 +1160,7 @@ class TargetingTestSuite: public CxxTest::TestSuite
{
TS_FAIL("Should have been a platform handled error");
}
- else
+ else
{
errlHndl_t l_pErrLog = static_cast<ERRORLOG::ErrlEntry*>(
l_rc.releasePlatData());
@@ -1268,7 +1268,7 @@ class TargetingTestSuite: public CxxTest::TestSuite
|| (l_pod.fsiPath.size() != 1 ) )
{
TS_FAIL("Expected physical:sys-0, got a different result");
-
+
}
if(l_pod.className != CLASS_CHIP)
{
@@ -1278,12 +1278,12 @@ class TargetingTestSuite: public CxxTest::TestSuite
if(l_pod.uint8 != 0xAB)
{
TS_FAIL("Expected uint8_t value of 0xAB, got 0x%02X",
- l_pod.uint8);
+ l_pod.uint8);
}
if (l_pod.uint16 != 0xABCD)
{
TS_FAIL("Expected uint16_t value of 0xABCD, got 0x%04X",
- l_pod.uint16);
+ l_pod.uint16);
}
if (l_pod.uint32 != 0xABCDEF01)
{
@@ -1294,16 +1294,16 @@ class TargetingTestSuite: public CxxTest::TestSuite
{
TS_FAIL("Expected uint64_t value of 0xABCDEF0123456789, got 0x%016lX",
l_pod.uint64);
- }
+ }
if(l_pod.int8 != -124)
{
TS_FAIL("Expected int8_t value of -124, got %d",
- l_pod.int8);
+ l_pod.int8);
}
if (l_pod.int16 != -32764)
{
TS_FAIL("Expected int16_t value of -32764, got %d",
- l_pod.int16);
+ l_pod.int16);
}
if (l_pod.int32 != -2147483644)
{
@@ -1314,7 +1314,7 @@ class TargetingTestSuite: public CxxTest::TestSuite
{
TS_FAIL("Expected int64_t value of -9223372036854775804, got %ld",
l_pod.int64);
- }
+ }
TS_TRACE(EXIT_MRK "testPodNumericalTypes" );
}
@@ -1330,7 +1330,7 @@ class TargetingTestSuite: public CxxTest::TestSuite
targetService().begin(),
targetService().end(),
&l_procChip);
-
+
PredicateCTM l_mbs(CLASS_UNIT,TYPE_MBS);
uint32_t l_count = 0;
uint32_t l_procs = 0;
@@ -1364,7 +1364,7 @@ class TargetingTestSuite: public CxxTest::TestSuite
TS_TRACE(EXIT_MRK "testCentaurs" );
}
-
+
void testHbMutexAttr()
{
TS_TRACE(ENTER_MRK "testHbMutexAttr" );
@@ -1386,9 +1386,9 @@ class TargetingTestSuite: public CxxTest::TestSuite
break;
}
- // Get the mutex attribute (actually a mutex_t* which points to
+ // Get the mutex attribute (actually a mutex_t* which points to
// a mutex)
- HB_MUTEX_TEST_LOCK_ATTR l_pLock
+ HB_MUTEX_TEST_LOCK_ATTR l_pLock
= l_pTarget->getHbMutexAttr<TARGETING::ATTR_HB_MUTEX_TEST_LOCK>();
// Test: Verify the value pointed to by the mutex_t* is zero
@@ -1397,7 +1397,7 @@ class TargetingTestSuite: public CxxTest::TestSuite
TS_FAIL("Mutex attribute must be initialized to zero, but got %ld",
*reinterpret_cast<uint64_t*>(l_pLock));
break;
- }
+ }
// Try to get the attribute, and ensure it's the same
HB_MUTEX_TEST_LOCK_ATTR l_pLockTry = NULL;
@@ -1424,15 +1424,15 @@ class TargetingTestSuite: public CxxTest::TestSuite
MutexTestData_t l_mutexTestData = { l_pLock, &l_var };
// Spawn off a function which tries to write the protected value to
- // something unexpected. If the mutex is working, the for loop will
+ // something unexpected. If the mutex is working, the for loop will
// always poll the expected value.
task_create(funcTestMutex, static_cast<void*>(&l_mutexTestData));
- // Guarantee the child process runs and blocks on the mutex prior to
+ // Guarantee the child process runs and blocks on the mutex prior to
// modifying the protected value. isync to ensure the processor doesn't
// speculatively perform the comparison prior to the sleep completing
nanosleep(0,TEN_CTX_SWITCHES_NS); isync();
-
+
if(l_var != 0)
{
TS_FAIL("Protected value must be 0, was %d instead",l_var);
@@ -1441,11 +1441,11 @@ class TargetingTestSuite: public CxxTest::TestSuite
// Now unlock the mutex, allowing the other thread to overwrite the
// protected value; which should happen within 100,000 reads of the
- // var. This will confirm the other thread was actively trying to
+ // var. This will confirm the other thread was actively trying to
// write the controlled value
(void)mutex_unlock(l_pLock);
- // Guarantee the child process acquires the mutex and modifies the
+ // Guarantee the child process acquires the mutex and modifies the
// protected value; isync to ensure the processor doesn't speculatively
// perform the comparison prior to the sleep completing
nanosleep(0,TEN_CTX_SWITCHES_NS); isync();
@@ -1457,9 +1457,10 @@ class TargetingTestSuite: public CxxTest::TestSuite
}
} while(0);
-
+
TS_TRACE(EXIT_MRK "testHbMutexAttr");
}
+
};
#endif // End __TESTTARGETING_H
diff --git a/src/usr/targeting/xmltohb/attribute_types.xml b/src/usr/targeting/xmltohb/attribute_types.xml
index c7f1d42c9..18615b0ef 100644
--- a/src/usr/targeting/xmltohb/attribute_types.xml
+++ b/src/usr/targeting/xmltohb/attribute_types.xml
@@ -959,7 +959,20 @@
<default>0</default>
</hbmutex>
</simpleType>
- <persistency>volatile-zeroed</persistency>
+ <persistency>volatile-zeroed</persistency>
+ <readable/>
+ <writeable/>
+</attribute>
+
+<attribute>
+ <id>ISTEP_MODE</id>
+ <description>If True, puts HostBoot into SPLess SingleStep mode.</description>
+ <simpleType>
+ <uint8_t>
+ <default>0</default>
+ </uint8_t>
+ </simpleType>
+ <persistency>non-volatile</persistency>
<readable/>
<writeable/>
</attribute>
diff --git a/src/usr/targeting/xmltohb/target_types.xml b/src/usr/targeting/xmltohb/target_types.xml
index 1b97633c3..6ad13d257 100644
--- a/src/usr/targeting/xmltohb/target_types.xml
+++ b/src/usr/targeting/xmltohb/target_types.xml
@@ -81,6 +81,9 @@
<id>VPO_MODE</id>
<default>0</default>
</attribute>
+ <attribute>
+ <id>ISTEP_MODE</id>
+ </attribute>
</targetType>
<targetType>
OpenPOWER on IntegriCloud