/*
- * Copyright (c) 2011-2014,2017 ARM Limited
+ * Copyright (c) 2011-2014,2017-2018 ARM Limited
* All rights reserved
*
* The license below extends only to copyright in the software and shall
#include "sim/system.hh"
+#include <algorithm>
+
#include "arch/remote_gdb.hh"
#include "arch/utility.hh"
#include "base/loader/object_file.hh"
System::System(Params *p)
: MemObject(p), _systemPort("system_port", this),
- _numContexts(0),
multiThread(p->multi_thread),
pagePtr(0),
init_param(p->init_param),
// Get the generic system master IDs
MasterID tmp_id M5_VAR_USED;
- tmp_id = getMasterId("writebacks");
+ tmp_id = getMasterId(this, "writebacks");
assert(tmp_id == Request::wbMasterId);
- tmp_id = getMasterId("functional");
+ tmp_id = getMasterId(this, "functional");
assert(tmp_id == Request::funcMasterId);
- tmp_id = getMasterId("interrupt");
+ tmp_id = getMasterId(this, "interrupt");
assert(tmp_id == Request::intMasterId);
if (FullSystem) {
"Cannot have two CPUs with the same id (%d)\n", id);
threadContexts[id] = tc;
- _numContexts++;
#if THE_ISA != NULL_ISA
int port = getRemoteGDBPort();
if (port) {
- RemoteGDB *rgdb = new RemoteGDB(this, tc);
- GDBListener *gdbl = new GDBListener(rgdb, port + id);
- gdbl->listen();
+ RemoteGDB *rgdb = new RemoteGDB(this, tc, port + id);
+ rgdb->listen();
BaseCPU *cpu = tc->getCpuPtr();
if (cpu->waitForRemoteGDB()) {
inform("%s: Waiting for a remote GDB connection on port %d.\n",
- cpu->name(), gdbl->getPort());
+ cpu->name(), rgdb->port());
- gdbl->accept();
+ rgdb->connect();
}
if (remoteGDB.size() <= id) {
remoteGDB.resize(id + 1);
int
System::numRunningContexts()
{
- int running = 0;
- for (int i = 0; i < _numContexts; ++i) {
- if (threadContexts[i]->status() != ThreadContext::Halted)
- ++running;
- }
- return running;
+ return std::count_if(
+ threadContexts.cbegin(),
+ threadContexts.cend(),
+ [] (ThreadContext* tc) {
+ return tc->status() != ThreadContext::Halted;
+ }
+ );
}
void
}
MasterID
-System::getMasterId(std::string master_name)
+System::getGlobalMasterId(std::string master_name)
+{
+ return _getMasterId(nullptr, master_name);
+}
+
+MasterID
+System::getMasterId(const SimObject* master, std::string submaster)
+{
+ auto master_name = leafMasterName(master, submaster);
+ return _getMasterId(master, master_name);
+}
+
+MasterID
+System::_getMasterId(const SimObject* master, std::string master_name)
{
- // strip off system name if the string starts with it
if (startswith(master_name, name()))
master_name = master_name.erase(0, name().size() + 1);
// CPUs in switch_cpus ask for ids again after switching
- for (int i = 0; i < masterIds.size(); i++) {
- if (masterIds[i] == master_name) {
+ for (int i = 0; i < masters.size(); i++) {
+ if (masters[i].masterName == master_name) {
return i;
}
}
"You must do so in init().\n");
}
- masterIds.push_back(master_name);
+ // Generate a new MasterID incrementally
+ MasterID master_id = masters.size();
+
+ // Append the new Master metadata to the group of system Masters.
+ masters.emplace_back(master, master_name, master_id);
+
+ return masters.back().masterId;
+}
- return masterIds.size() - 1;
+std::string
+System::leafMasterName(const SimObject* master, const std::string& submaster)
+{
+ if (submaster.empty()) {
+ return master->name();
+ } else {
+ // Get the full master name by appending the submaster name to
+ // the root SimObject master name
+ return master->name() + "." + submaster;
+ }
}
std::string
System::getMasterName(MasterID master_id)
{
- if (master_id >= masterIds.size())
+ if (master_id >= masters.size())
fatal("Invalid master_id passed to getMasterName()\n");
- return masterIds[master_id];
+ const auto& master_info = masters[master_id];
+ return master_info.masterName;
}
System *