From 53cdcdee663c614d134174edea57b98a15385679 Mon Sep 17 00:00:00 2001 From: Giacomo Travaglini Date: Thu, 10 May 2018 14:37:27 +0100 Subject: sim: Add System method for MasterID lookup A new method (lookupMasterId) has been added to the System. A client should use it when querying the System for the MasterID of a particular master. It changes from getMasterId since it is not registering a new MasterID if the master is not found in the master's list. Change-Id: I701158d22e235085bba9ab91154fbb702cae1467 Signed-off-by: Giacomo Travaglini Reviewed-on: https://gem5-review.googlesource.com/11969 Reviewed-by: Jason Lowe-Power Maintainer: Jason Lowe-Power --- src/sim/system.cc | 58 +++++++++++++++++++++++++++++++++++++++++++++++++------ src/sim/system.hh | 23 ++++++++++++++++++++-- 2 files changed, 73 insertions(+), 8 deletions(-) (limited to 'src/sim') diff --git a/src/sim/system.cc b/src/sim/system.cc index 74bc94ee8..fc2578f86 100644 --- a/src/sim/system.cc +++ b/src/sim/system.cc @@ -491,8 +491,55 @@ printSystems() System::printSystems(); } +std::string +System::stripSystemName(const std::string& master_name) const +{ + if (startswith(master_name, name())) { + return master_name.substr(name().size()); + } else { + return master_name; + } +} + +MasterID +System::lookupMasterId(const SimObject* obj) const +{ + MasterID id = Request::invldMasterId; + + // number of occurrences of the SimObject pointer + // in the master list. + auto obj_number = 0; + + for (int i = 0; i < masters.size(); i++) { + if (masters[i].obj == obj) { + id = i; + obj_number++; + } + } + + fatal_if(obj_number > 1, + "Cannot lookup MasterID by SimObject pointer: " + "More than one master is sharing the same SimObject\n"); + + return id; +} + +MasterID +System::lookupMasterId(const std::string& master_name) const +{ + std::string name = stripSystemName(master_name); + + for (int i = 0; i < masters.size(); i++) { + if (masters[i].masterName == name) { + return i; + } + } + + return Request::invldMasterId; +} + MasterID -System::getGlobalMasterId(std::string master_name) +System::getGlobalMasterId(const std::string& master_name) { return _getMasterId(nullptr, master_name); } @@ -505,14 +552,13 @@ System::getMasterId(const SimObject* master, std::string submaster) } MasterID -System::_getMasterId(const SimObject* master, std::string master_name) +System::_getMasterId(const SimObject* master, const std::string& master_name) { - if (startswith(master_name, name())) - master_name = master_name.erase(0, name().size() + 1); + std::string name = stripSystemName(master_name); // CPUs in switch_cpus ask for ids again after switching for (int i = 0; i < masters.size(); i++) { - if (masters[i].masterName == master_name) { + if (masters[i].masterName == name) { return i; } } @@ -530,7 +576,7 @@ System::_getMasterId(const SimObject* master, std::string master_name) MasterID master_id = masters.size(); // Append the new Master metadata to the group of system Masters. - masters.emplace_back(master, master_name, master_id); + masters.emplace_back(master, name, master_id); return masters.back().masterId; } diff --git a/src/sim/system.hh b/src/sim/system.hh index 0d26ffa0d..878c81252 100644 --- a/src/sim/system.hh +++ b/src/sim/system.hh @@ -325,6 +325,12 @@ class System : public MemObject ThermalModel * thermalModel; + protected: + /** + * Strips off the system name from a master name + */ + std::string stripSystemName(const std::string& master_name) const; + public: /** @@ -370,19 +376,32 @@ class System : public MemObject * @param masterName full name of the master * @return the master's ID. */ - MasterID getGlobalMasterId(std::string master_name); + MasterID getGlobalMasterId(const std::string& master_name); /** * Get the name of an object for a given request id. */ std::string getMasterName(MasterID master_id); + /** + * Looks up the MasterID for a given SimObject + * returns an invalid MasterID (invldMasterId) if not found. + */ + MasterID lookupMasterId(const SimObject* obj) const; + + /** + * Looks up the MasterID for a given object name string + * returns an invalid MasterID (invldMasterId) if not found. + */ + MasterID lookupMasterId(const std::string& name) const; + /** Get the number of masters registered in the system */ MasterID maxMasters() { return masters.size(); } protected: /** helper function for getMasterId */ - MasterID _getMasterId(const SimObject* master, std::string master_name); + MasterID _getMasterId(const SimObject* master, + const std::string& master_name); /** * Helper function for constructing the full (sub)master name -- cgit v1.2.3