diff options
-rwxr-xr-x | src/build/simics/hb-simdebug.py | 167 | ||||
-rw-r--r-- | src/usr/initservice/istepdispatcher/istepdispatcher.C | 76 | ||||
-rw-r--r-- | src/usr/initservice/istepdispatcher/istepdispatcher.H | 1 | ||||
-rw-r--r-- | src/usr/initservice/istepdispatcher/splesscommon.H | 8 | ||||
-rw-r--r-- | src/usr/initservice/test/splesstest.H | 2 | ||||
-rw-r--r-- | src/usr/targeting/test/targetingtest.H | 67 | ||||
-rw-r--r-- | src/usr/targeting/xmltohb/attribute_types.xml | 15 | ||||
-rw-r--r-- | src/usr/targeting/xmltohb/target_types.xml | 3 |
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> |