本文整理汇总了C++中TargetHandleList::size方法的典型用法代码示例。如果您正苦于以下问题:C++ TargetHandleList::size方法的具体用法?C++ TargetHandleList::size怎么用?C++ TargetHandleList::size使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类TargetHandleList
的用法示例。
在下文中一共展示了TargetHandleList::size方法的12个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: getMcs
TargetHandle_t TargetServiceImpl::getMcs(
TargetHandle_t i_proc,
uint64_t i_pos)
{
PredicateCTM classTypeMatch(CLASS_UNIT, TYPE_MCS);
PredicateIsFunctional functionalMatch;
PredicatePostfixExpr pred;
class ChipUnitMatch : public PredicateBase
{
uint8_t iv_pos;
public:
bool operator()(const Target * i_target) const
{
uint8_t pos;
bool match = false;
if(i_target->tryGetAttr<ATTR_CHIP_UNIT>(pos))
{
match = iv_pos == pos;
}
return match;
}
explicit ChipUnitMatch(uint8_t i_pos)
: iv_pos(i_pos) {}
} chipUnitMatch(i_pos);
pred.push(&classTypeMatch).push(
&functionalMatch).And();
pred.push(&chipUnitMatch).And();
TargetHandleList list;
TargetHandle_t mcs = NULL;
targetService().getAssociated(
list,
i_proc,
TARGETING::TargetService::CHILD_BY_AFFINITY,
TARGETING::TargetService::ALL,
&pred);
if(list.size() == 1)
{
mcs = list[0];
}
return mcs;
}
示例2: PllPostAnalysis
/**
* @brief Optional plugin function called after analysis is complete but
* before PRD exits.
* @param i_cenChip A Centaur MBA chip.
* @param i_sc The step code data struct.
* @note This is especially useful for any analysis that still needs to be
* done after the framework clears the FIR bits that were at attention.
* @return SUCCESS.
*/
int32_t PllPostAnalysis( ExtensibleChip * i_cenChip,
STEP_CODE_DATA_STRUCT & i_sc )
{
#define PRDF_FUNC "[Membuf::PllPostAnalysis] "
int32_t o_rc = SUCCESS;
TargetHandle_t cenTrgt = i_cenChip->GetChipHandle();
do
{
// need to clear associated bits in the MCIFIR bits.
o_rc = MemUtils::mcifirCleanup( i_cenChip, i_sc );
if( SUCCESS != o_rc )
{
PRDF_ERR( PRDF_FUNC"mcifirCleanup() failed");
break;
}
// Check to make sure we are at threshold and have something garded.
if ( !i_sc.service_data->IsAtThreshold() ||
(GardAction::NoGard == i_sc.service_data->QueryGard()) )
{
break; // nothing to do
}
TargetHandleList list = getConnected( cenTrgt, TYPE_MBA );
if ( 0 == list.size() )
{
PRDF_ERR( PRDF_FUNC"getConnected(0x%08x, TYPE_MBA) failed",
getHuid(cenTrgt) );
o_rc = FAIL; break;
}
// Send SKIP_MBA message for each MBA.
for ( TargetHandleList::iterator mbaIt = list.begin();
mbaIt != list.end(); ++mbaIt )
{
int32_t l_rc = mdiaSendEventMsg( *mbaIt, MDIA::SKIP_MBA );
if ( SUCCESS != l_rc )
{
PRDF_ERR( PRDF_FUNC"mdiaSendEventMsg(0x%08x, SKIP_MBA) failed",
getHuid(*mbaIt) );
o_rc |= FAIL;
continue; // keep going
}
}
} while(0);
return o_rc;
#undef PRDF_FUNC
}
示例3: getMembuf
TargetHandle_t TargetServiceImpl::getMembuf(
TargetHandle_t i_mcs)
{
TargetHandle_t membuf = NULL;
TargetHandleList list;
getChildAffinityTargets(list, i_mcs, CLASS_CHIP, TYPE_MEMBUF);
if(list.size() == 1)
{
membuf = list[0];
}
return membuf;
}
示例4: getProc
TargetHandle_t TargetServiceImpl::getProc(
TargetHandle_t i_membuf)
{
TargetHandle_t proc = NULL;
TargetHandleList list;
PredicateCTM pred(CLASS_CHIP, TYPE_PROC);
targetService().getAssociated(
list,
i_membuf,
TARGETING::TargetService::PARENT_BY_AFFINITY,
TARGETING::TargetService::ALL,
&pred);
if(list.size() == 1)
{
proc = list[0];
}
return proc;
}
示例5: startScrub
errlHndl_t startScrub()
{
#define PRDF_FUNC "[PRDF::startScrub] "
PRDF_ENTER( PRDF_FUNC );
errlHndl_t o_errl = NULL;
int32_t l_rc = SUCCESS;
HUID nodeId = INVALID_HUID;
// will unlock when going out of scope
PRDF_SYSTEM_SCOPELOCK;
do
{
// Since the last refresh is in istep10 host_prd_hwreconfig,
// it may be good to call it again here at istep16 mss_scrub
// to remove any non-functional MBAs from PRD system model.
o_errl = noLock_refresh();
// This shouldn't return any error but if it does, break out
if(NULL != o_errl)
{
PRDF_ERR( PRDF_FUNC"noLock_refresh() failed" );
break;
}
// This is run in Hostboot so there should only be one node.
TargetHandleList list = getFunctionalTargetList( TYPE_NODE );
if ( 1 != list.size() )
{
PRDF_ERR( PRDF_FUNC"getFunctionalTargetList(TYPE_NODE) failed" );
l_rc = FAIL; break;
}
nodeId = getHuid(list[0]);
PRDF_ENTER( PRDF_FUNC"HUID=0x%08x", nodeId );
// Start scrubbing on all MBAs.
MbaDomain * domain = (MbaDomain *)systemPtr->GetDomain(MBA_DOMAIN);
if ( NULL == domain )
{
PRDF_ERR( PRDF_FUNC"MBA_DOMAIN not found. nodeId=0x%08x", nodeId );
l_rc = FAIL; break;
}
l_rc = domain->startScrub();
PRDF_EXIT( PRDF_FUNC"HUID=0x%08x", nodeId );
} while (0);
if (( SUCCESS != l_rc ) && (NULL == o_errl))
{
// Get user data
uint64_t ud12 = PRDF_GET_UINT64_FROM_UINT32( nodeId, __LINE__ );
uint64_t ud34 = PRDF_GET_UINT64_FROM_UINT32( 0, 0 );
// Create error log
o_errl = new ERRORLOG::ErrlEntry(
ERRORLOG::ERRL_SEV_UNRECOVERABLE, // severity
PRDF_START_SCRUB, // module ID
PRDF_DETECTED_FAIL_SOFTWARE, // reason code
ud12, ud34 ); // user data 1-4
// Add 2nd level support
o_errl->addProcedureCallout( EPUB_PRC_LVL_SUPP, SRCI_PRIORITY_HIGH );
// Add traces
o_errl->collectTrace( PRDF_COMP_NAME, 512 );
}
PRDF_EXIT( PRDF_FUNC );
return o_errl;
#undef PRDF_FUNC
}
示例6: addDomainChips
errlHndl_t PegasusConfigurator::addDomainChips( TARGETING::TYPE i_type,
RuleChipDomain * io_domain,
PllDomainList * io_pllDomains,
PllDomainList * io_pllDomains2)
{
using namespace TARGETING;
errlHndl_t l_errl = NULL ;
// Get references to factory objects.
ScanFacility & scanFac = ScanFacility::Access();
ResolutionFactory & resFac = ResolutionFactory::Access();
// Get all targets of specified type and add to given domain.
TargetHandleList list = PlatServices::getFunctionalTargetList( i_type );
if ( 0 == list.size() )
{
PRDF_ERR( "[addDomainChips] getFunctionalTargetList "
"returned empty list for i_type=%d", i_type );
}
else
{
// Get rule filename based on type.
const char * fileName = "";
switch ( i_type )
{
case TYPE_PROC:
// Check which Proc chip type
if (MODEL_NAPLES == getProcModel(list[0]))
fileName = NaplesProc;
else
fileName = MuranoVeniceProc;
break;
case TYPE_EX: fileName = Ex; break;
case TYPE_MCS: fileName = Mcs; break;
case TYPE_MEMBUF: fileName = Membuf; break;
case TYPE_MBA: fileName = Mba; break;
default:
// Print a trace statement, but do not fail the build.
PRDF_ERR( "[addDomainChips] Unsupported target type: %d",
i_type );
}
for ( TargetHandleList::const_iterator itr = list.begin();
itr != list.end(); ++itr )
{
if ( NULL == *itr ) continue;
RuleChip * chip = new RuleChip( fileName, *itr,
scanFac, resFac,l_errl );
if( NULL != l_errl )
{
delete chip;
break;
}
sysChipLst.push_back( chip );
io_domain->AddChip( chip );
// PLL domains
switch ( i_type )
{
case TYPE_PROC:
addChipsToPllDomain(CLOCK_DOMAIN_FAB,
io_pllDomains,
chip,
*itr,
scanFac,
resFac);
addChipsToPllDomain(CLOCK_DOMAIN_IO,
io_pllDomains2,
chip,
*itr,
scanFac,
resFac);
break;
case TYPE_MEMBUF:
addChipsToPllDomain(CLOCK_DOMAIN_MEMBUF,
io_pllDomains,
chip,
*itr,
scanFac,
resFac);
break;
default:
break;
}
}
// Flush rule table cache since objects are all built.
Prdr::LoadChipCache::flushCache();
}
return l_errl;
}
示例7: handleUE
int32_t CenMbaTdCtlr::handleUE( STEP_CODE_DATA_STRUCT & io_sc )
{
#define PRDF_FUNC "[CenMbaTdCtlr::handleUE] "
using namespace CalloutUtil;
int32_t o_rc = SUCCESS;
iv_tdState = NO_OP; // Abort the TD procedure.
setTdSignature( io_sc, PRDFSIG_MaintUE );
io_sc.service_data->SetServiceCall();
CenMbaDataBundle * mbadb = getMbaDataBundle( iv_mbaChip );
do
{
// Clean up the maintenance command. This is needed just in case the UE
// isolation procedure is modified to use maintenance commands.
o_rc = cleanupPrevCmd();
if ( SUCCESS != o_rc )
{
PRDF_ERR( PRDF_FUNC"cleanupPrevCmd() failed" );
break;
}
// Look for all failing bits on this rank.
CenDqBitmap bitmap;
o_rc = mssIplUeIsolation( iv_mbaTrgt, iv_rank, bitmap );
if ( SUCCESS != o_rc )
{
PRDF_ERR( PRDF_FUNC"mssIplUeIsolation() failed" );
break;
}
// Add UE data to capture data.
bitmap.getCaptureData( io_sc.service_data->GetCaptureData() );
// Callout the failing DIMMs.
TargetHandleList callouts;
for ( int32_t ps = 0; ps < PORT_SLCT_PER_MBA; ps++ )
{
bool badDqs = false;
o_rc = bitmap.badDqs( ps, badDqs );
if ( SUCCESS != o_rc )
{
PRDF_ERR( PRDF_FUNC"badDqs(%d) failed", ps );
break;
}
if ( !badDqs ) continue; // nothing to do.
TargetHandleList dimms = getConnectedDimms(iv_mbaTrgt, iv_rank, ps);
if ( 0 == dimms.size() )
{
PRDF_ERR( PRDF_FUNC"getConnectedDimms(%d) failed", ps );
o_rc = FAIL; break;
}
callouts.insert( callouts.end(), dimms.begin(), dimms.end() );
if ( isMfgCeCheckingEnabled() )
{
// As we are doing callout for UE, we dont need to do callout
// during CE for this rank on given port
mbadb->getIplCeStats()->banAnalysis( iv_rank, ps );
}
}
if ( SUCCESS != o_rc ) break;
if ( 0 == callouts.size() )
{
// It is possible the scrub counters have rolled over to zero due to
// a known DD1.0 hardware bug. In this case, the best we can do is
// callout both DIMMs, because at minimum we know there was a UE, we
// just don't know where.
// NOTE: If this condition happens because of a DD2.0+ bug, the
// mssIplUeIsolation procedure will callout the Centaur.
callouts = getConnectedDimms( iv_mbaTrgt, iv_rank );
if ( 0 == callouts.size() )
{
PRDF_ERR( PRDF_FUNC"getConnectedDimms() failed" );
o_rc = FAIL; break;
}
if ( isMfgCeCheckingEnabled() )
{
// As we are doing callout for UE, we dont need to do callout
// during CE for this rank on both port
mbadb->getIplCeStats()->banAnalysis( iv_rank);
}
}
// Callout all DIMMs in the list.
for ( TargetHandleList::iterator i = callouts.begin();
i != callouts.end(); i++ )
{
io_sc.service_data->SetCallout( *i, MRU_HIGH );
}
//.........这里部分代码省略.........
示例8: discoverTargets
errlHndl_t discoverTargets()
{
HWAS_INF("discoverTargets entry");
errlHndl_t errl = NULL;
// loop through all the targets and set HWAS_STATE to a known default
for (TargetIterator target = targetService().begin();
target != targetService().end();
++target)
{
HwasState hwasState = target->getAttr<ATTR_HWAS_STATE>();
hwasState.deconfiguredByEid = 0;
hwasState.poweredOn = false;
hwasState.present = false;
hwasState.functional = false;
hwasState.dumpfunctional = false;
target->setAttr<ATTR_HWAS_STATE>(hwasState);
}
// Assumptions and actions:
// CLASS_SYS (exactly 1) - mark as present
// CLASS_ENC, TYPE_PROC, TYPE_MEMBUF, TYPE_DIMM
// (ALL require hardware query) - call platPresenceDetect
// \->children: CLASS_* (NONE require hardware query) - mark as present
do
{
// find CLASS_SYS (the top level target)
Target* pSys;
targetService().getTopLevelTarget(pSys);
HWAS_ASSERT(pSys,
"HWAS discoverTargets: no CLASS_SYS TopLevelTarget found");
// mark this as present
enableHwasState(pSys, true, true, 0);
HWAS_DBG("pSys %.8X - marked present",
pSys->getAttr<ATTR_HUID>());
// find list of all we need to call platPresenceDetect against
PredicateCTM predEnc(CLASS_ENC);
PredicateCTM predChip(CLASS_CHIP);
PredicateCTM predDimm(CLASS_LOGICAL_CARD, TYPE_DIMM);
PredicatePostfixExpr checkExpr;
checkExpr.push(&predChip).push(&predDimm).Or().push(&predEnc).Or();
TargetHandleList pCheckPres;
targetService().getAssociated( pCheckPres, pSys,
TargetService::CHILD, TargetService::ALL, &checkExpr );
// pass this list to the hwas platform-specific api where
// pCheckPres will be modified to only have present targets
HWAS_DBG("pCheckPres size: %d", pCheckPres.size());
errl = platPresenceDetect(pCheckPres);
HWAS_DBG("pCheckPres size: %d", pCheckPres.size());
if (errl != NULL)
{
break; // break out of the do/while so that we can return
}
// for each, read their ID/EC level. if that works,
// mark them and their descendants as present
// read the partialGood vector to determine if any are not functional
// and read and store values from the PR keyword
// list of procs and data that we'll need to look at the PR keyword
procRestrict_t l_procEntry;
std::vector <procRestrict_t> l_procPRList;
// sort the list by ATTR_HUID to ensure that we
// start at the same place each time
std::sort(pCheckPres.begin(), pCheckPres.end(),
compareTargetHuid);
for (TargetHandleList::const_iterator pTarget_it = pCheckPres.begin();
pTarget_it != pCheckPres.end();
++pTarget_it
)
{
TargetHandle_t pTarget = *pTarget_it;
// if CLASS_ENC is still in this list, mark as present
if (pTarget->getAttr<ATTR_CLASS>() == CLASS_ENC)
{
enableHwasState(pTarget, true, true, 0);
HWAS_DBG("pTarget %.8X - CLASS_ENC marked present",
pTarget->getAttr<ATTR_HUID>());
// on to the next target
continue;
}
bool chipPresent = true;
bool chipFunctional = true;
uint32_t errlEid = 0;
uint16_t pgData[VPD_CP00_PG_DATA_LENGTH / sizeof(uint16_t)];
bzero(pgData, sizeof(pgData));
if (pTarget->getAttr<ATTR_CLASS>() == CLASS_CHIP)
{
//.........这里部分代码省略.........
示例9: runStep
errlHndl_t runStep(const TargetHandleList & i_targetList)
{
MDIA_FAST("memory diagnostics entry with %d target(s)",
i_targetList.size());
// memory diagnostics ipl step entry point
errlHndl_t err = 0;
Globals globals;
TargetHandle_t top = 0;
targetService().getTopLevelTarget(top);
if(top)
{
globals.mfgPolicy = top->getAttr<ATTR_MNFG_FLAGS>();
uint8_t maxMemPatterns =
top->getAttr<ATTR_RUN_MAX_MEM_PATTERNS>();
// This registry / attr is the same as the
// exhaustive mnfg one
if(maxMemPatterns)
{
globals.mfgPolicy |=
MNFG_FLAG_ENABLE_EXHAUSTIVE_PATTERN_TEST;
}
globals.simicsRunning = Util::isSimicsRunning();
globals.disableScrubs =
top->getAttr<ATTR_DISABLE_SCRUB_AFTER_PATTERN_TEST>();
}
// get the workflow for each target mba passed in.
// associate each workflow with the target handle.
WorkFlowAssocMap list;
TargetHandleList::const_iterator tit;
DiagMode mode;
for(tit = i_targetList.begin(); tit != i_targetList.end(); ++tit)
{
err = getMbaDiagnosticMode(globals, *tit, mode);
if(err)
{
break;
}
err = getMbaWorkFlow(mode, list[*tit], globals);
if(err)
{
break;
}
}
if(!err)
{
// set global data
Singleton<StateMachine>::instance().setGlobals(globals);
// TODO...run the workflow through the state machine
err = Singleton<StateMachine>::instance().run(list);
}
// ensure threads and pools are shutdown when finished
doStepCleanup(globals);
return err;
}
示例10: GenerateSrcPfa
errlHndl_t ErrDataService::GenerateSrcPfa( ATTENTION_TYPE i_attnType,
ServiceDataCollector & io_sdc,
bool & o_initiateHwudump,
TargetHandle_t & o_dumpTrgt,
errlHndl_t & o_dumpErrl,
uint32_t & o_dumpErrlActions)
{
#define PRDF_FUNC "[ErrDataService::GenerateSrcPfa] "
o_initiateHwudump = false;
o_dumpTrgt = NULL;
o_dumpErrl = NULL;
o_dumpErrlActions = 0;
// First, check if an error log should be committed. Note that there should
// always be an error log if there was a system or unit checkstop.
if ( io_sdc.queryDontCommitErrl() &&
MACHINE_CHECK != i_attnType && !io_sdc.IsUnitCS() )
{
// User did not want this error log committed. No need to continue. So
// delete it and exit.
delete iv_errl; iv_errl = NULL;
return NULL;
}
#ifdef __HOSTBOOT_MODULE
using namespace ERRORLOG;
using namespace HWAS;
#else
uint8_t sdcSaveFlags = SDC_NO_SAVE_FLAGS;
size_t sz_uint8 = sizeof(uint8_t);
#endif
epubProcedureID thisProcedureID;
bool ForceTerminate = false;
bool iplDiagMode = false;
++iv_serviceActionCounter;
uint16_t PRD_Reason_Code = 0;
//**************************************************************
// Callout loop to set up Reason code and SRC word 9
//**************************************************************
// Must go thru callout list to look for RIOPORT procedure callouts,
// since they require the port info to be in SRC Word 9
bool HW = false;
bool SW = false;
bool SW_High = false;
bool SecondLevel = false;
uint32_t SrcWord7 = 0;
uint32_t SrcWord9 = 0;
// Should not gard hardware if there is a hardware callout at LOW priority
// and a symbolic FRU indicating a possibility of a software error at MED or
// HIGH priority.
bool sappSwNoGardReq = false, sappHwNoGardReq = false;
const SDC_MRU_LIST & mruList = io_sdc.getMruList();
int32_t calloutsPlusDimms = mruList.size();
for ( SDC_MRU_LIST::const_iterator it = mruList.begin();
it < mruList.end(); ++it )
{
PRDcallout thiscallout = it->callout;
if ( PRDcalloutData::TYPE_SYMFRU == thiscallout.getType() )
{
if ( (SP_CODE == thiscallout.flatten()) ||
(SYS_SW_CODE == thiscallout.flatten()) )
{
SW = true;
if ( MRU_LOW != it->priority )
{
sappSwNoGardReq = true;
}
if ( MRU_MED == it->priority )
{
SW_High = true;
}
}
else if ( LEVEL2_SUPPORT == thiscallout.flatten())
{
SecondLevel = true;
if ( MRU_LOW != it->priority )
{
sappSwNoGardReq = true;
}
}
}
else if ( PRDcalloutData::TYPE_MEMMRU == thiscallout.getType() )
{
MemoryMru memMru (thiscallout.flatten());
SrcWord9 = memMru.toUint32(); // Get MemMru value
//.........这里部分代码省略.........
示例11: stopAllOCCs
/**
* @brief Stops OCCs on all Processors in the node
*/
errlHndl_t stopAllOCCs()
{
TRACFCOMP( g_fapiTd,ENTER_MRK"stopAllOCCs" );
errlHndl_t l_errl = NULL;
bool winkle_loaded = false;
do {
#ifndef __HOSTBOOT_RUNTIME
//OCC requires the build_winkle_images library
if ( !VFS::module_is_loaded( "libbuild_winkle_images.so" ) )
{
l_errl = VFS::module_load( "libbuild_winkle_images.so" );
if ( l_errl )
{
// load module returned with errl set
TRACFCOMP( g_fapiTd,ERR_MRK"loadnStartAllOccs: Could not load build_winkle module" );
// break from do loop if error occured
break;
}
winkle_loaded = true;
}
#endif
TargetHandleList procChips;
getAllChips(procChips, TYPE_PROC, true);
if(procChips.size() == 0)
{
TRACFCOMP( g_fapiTd,INFO_MRK"loadnStartAllOccs: No processors found" );
//We'll never get this far in the IPL without any processors,
// so just exit.
break;
}
TRACFCOMP( g_fapiTd,
INFO_MRK"loadnStartAllOccs: %d procs found",
procChips.size());
//The OCC Procedures require processors within a DCM be
//setup together. If DCM installed is set, we work under
//the assumption that each nodeID is a DCM. So sort the
//list by NodeID then call OCC Procedures on NodeID pairs.
std::sort(procChips.begin(),
procChips.end(),
orderByNodeAndPosition);
//The OCC master for the node must be reset last. For all
//OP systems there is only a single OCC that can be the
//master so it is safe to look at the MASTER_CAPABLE flag.
Target* masterProc0 = NULL;
Target* masterProc1 = NULL;
TargetHandleList::iterator itr1 = procChips.begin();
if(0 == (*itr1)->getAttr<ATTR_PROC_DCM_INSTALLED>())
{
TRACUCOMP( g_fapiTd,
INFO_MRK"stopAllOCCs: non-dcm path entered");
for (TargetHandleList::iterator itr = procChips.begin();
itr != procChips.end();
++itr)
{
TargetHandleList pOccs;
getChildChiplets(pOccs, *itr, TYPE_OCC);
if (pOccs.size() > 0)
{
if( pOccs[0]->getAttr<ATTR_OCC_MASTER_CAPABLE>() )
{
masterProc0 = *itr;
continue;
}
}
l_errl = HBOCC::stopOCC( *itr, NULL );
if (l_errl)
{
TRACFCOMP( g_fapiImpTd, ERR_MRK"stopAllOCCs: stop failed");
errlCommit (l_errl, HWPF_COMP_ID);
// just commit and try the next chip
}
}
if (l_errl)
{
break;
}
}
else
{
TRACFCOMP( g_fapiTd,
INFO_MRK"stopAllOCCs: Following DCM Path");
for (TargetHandleList::iterator itr = procChips.begin();
itr != procChips.end();
++itr)
//.........这里部分代码省略.........
示例12: loadnStartAllOccs
/**
* @brief Starts OCCs on all Processors in the node
* This is intended to be used for AVP testing.
*
* @param[out] o_failedOccTarget: Pointer to the target failing
* loadnStartAllOccs
* @param[in] i_useSRAM: bool - use SRAM for OCC image, ie during IPL
* true if during IPL, false if at end of IPL (default)
* @return errlHndl_t Error log if OCC load failed
*/
errlHndl_t loadnStartAllOccs(TARGETING::Target *& o_failedOccTarget,
bool i_useSRAM)
{
errlHndl_t l_errl = NULL;
void* homerVirtAddrBase = NULL;
uint64_t homerPhysAddrBase = VMM_HOMER_REGION_START_ADDR;
bool winkle_loaded = false;
TRACUCOMP( g_fapiTd,
ENTER_MRK"loadnStartAllOccs(%d)", i_useSRAM);
do {
#ifndef __HOSTBOOT_RUNTIME
//OCC requires the build_winkle_images library
if ( !VFS::module_is_loaded( "libbuild_winkle_images.so" ) )
{
l_errl = VFS::module_load( "libbuild_winkle_images.so" );
if ( l_errl )
{
// load module returned with errl set
TRACFCOMP( g_fapiTd,ERR_MRK"loadnStartAllOccs: Could not load build_winkle module" );
// break from do loop if error occured
break;
}
winkle_loaded = true;
}
assert(VMM_HOMER_REGION_SIZE <= THIRTYTWO_GB,
"loadnStartAllOccs: Unsupported HOMER Region size");
if (!i_useSRAM)
{
//If running Sapphire need to place this at the top of memory
if(TARGETING::is_sapphire_load())
{
homerPhysAddrBase = TARGETING::get_top_mem_addr();
assert (homerPhysAddrBase != 0,
"loadnStartAllOccs: Top of memory was 0!");
homerPhysAddrBase -= VMM_ALL_HOMER_OCC_MEMORY_SIZE;
}
TRACFCOMP( g_fapiTd, "HOMER is at %.16X", homerPhysAddrBase );
//Map entire homer region into virtual memory
homerVirtAddrBase =
mm_block_map(reinterpret_cast<void*>(homerPhysAddrBase),
VMM_HOMER_REGION_SIZE);
TRACFCOMP( g_fapiTd, "HOMER virtaddrbase %.16X", homerVirtAddrBase );
}
else
{
// malloc space big enough for all of OCC
homerVirtAddrBase = (void *)malloc(1 * MEGABYTE);
homerPhysAddrBase = mm_virt_to_phys(homerVirtAddrBase);
}
#endif
if (i_useSRAM)
{
// OCC is going into L3 and SRAM so only need 1 prime and load
// into the Master Proc
TargetService & tS = targetService();
Target * sysTarget = NULL;
tS.getTopLevelTarget( sysTarget );
assert( sysTarget != NULL );
Target* masterproc = NULL;
tS.masterProcChipTargetHandle( masterproc );
/******* SETUP AND LOAD **************/
l_errl = primeAndLoadOcc (masterproc,
homerVirtAddrBase,
homerPhysAddrBase,
i_useSRAM);
if(l_errl)
{
o_failedOccTarget = masterproc;
TRACFCOMP( g_fapiImpTd, ERR_MRK
"loadnStartAllOccs:primeAndLoadOcc failed");
free(homerVirtAddrBase);
break;
}
/********* START OCC *************/
l_errl = HBOCC::startOCC (masterproc, NULL, o_failedOccTarget);
// it either started or errored; either way, free the memory
free(homerVirtAddrBase);
if (l_errl)
{
//.........这里部分代码省略.........