sim,arch: Move code that waits for a GDB connection to startup().
authorGabe Black <gabeblack@google.com>
Sat, 1 Feb 2020 00:53:46 +0000 (16:53 -0800)
committerGabe Black <gabeblack@google.com>
Thu, 27 Feb 2020 13:02:44 +0000 (13:02 +0000)
Currently the System class has a mechanism to wait for a GDB connection
for each CPU which has requested it through one of its parameters.
Unfortunately, not every thread context/CPU will be ready for GDB at
that point, particularly considering that in an FS simulation the
kernel won't have been read so there will be no symbols, none of the
registers or the entry point will have been set.

Also in the fast models, the CPUs haven't had a chance to initialize
themselves enough by that point to respond to the API calls which are
used to implement GDB support.

Change-Id: If27cb3e0259a1f67599ab0493695b2f8af640d8e
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/24963
Reviewed-by: Gabe Black <gabeblack@google.com>
Reviewed-by: Chun-Chen TK Hsu <chunchenhsu@google.com>
Reviewed-by: Jason Lowe-Power <jason@lowepower.com>
Maintainer: Gabe Black <gabeblack@google.com>
Tested-by: kokoro <noreply+kokoro@google.com>
src/arch/arm/freebsd/system.cc
src/arch/arm/freebsd/system.hh
src/arch/arm/linux/system.cc
src/sim/system.cc
src/sim/system.hh

index 3f38f2e0d029fca1fddb567d2826f7573b089d37..b77126790b1885ec9738585bf86a679a69a08d4f 100644 (file)
@@ -147,8 +147,3 @@ FreebsdArmSystemParams::create()
 {
     return new FreebsdArmSystem(this);
 }
-
-void
-FreebsdArmSystem::startup()
-{
-}
index 50c405d15ced8baca5797aca5ba75a2c399de848..f4f19a3262e4dbffcde88f384a4db14bafc2f8f6 100644 (file)
@@ -74,8 +74,6 @@ class FreebsdArmSystem : public GenericArmSystem
 
     void initState();
 
-    void startup();
-
     /** This function creates a new task Id for the given pid.
      * @param tc thread context that is currentyl executing  */
     void mapPid(ThreadContext* tc, uint32_t pid);
index 1c1ade65ff09ef10c892186ca7db0cb53d44e865..30393c43acb7c92d6ba082c75db3272b70e7a6e3 100644 (file)
@@ -223,6 +223,8 @@ LinuxArmSystemParams::create()
 void
 LinuxArmSystem::startup()
 {
+    GenericArmSystem::startup();
+
     if (enableContextSwitchStatsDump) {
         if (!highestELIs64()) {
             dumpStatsPCEvent =
index 39b9495aaa5e7c7dbf72bdc5691e939436dc945d..51e9d6dfbf209f3223308928e11e3393347d5923 100644 (file)
@@ -228,6 +228,31 @@ System::init()
         panic("System port on %s is not connected.\n", name());
 }
 
+void
+System::startup()
+{
+    SimObject::startup();
+
+    // Now that we're about to start simulation, wait for GDB connections if
+    // requested.
+#if THE_ISA != NULL_ISA
+    for (auto *tc: threadContexts) {
+        auto *cpu = tc->getCpuPtr();
+        auto id = tc->contextId();
+        if (remoteGDB.size() <= id)
+            continue;
+        auto *rgdb = remoteGDB[id];
+
+        if (cpu->waitForRemoteGDB()) {
+            inform("%s: Waiting for a remote GDB connection on port %d.\n",
+                   cpu->name(), rgdb->port());
+
+            rgdb->connect();
+        }
+    }
+#endif
+}
+
 Port &
 System::getPort(const std::string &if_name, PortID idx)
 {
@@ -276,16 +301,8 @@ System::registerThreadContext(ThreadContext *tc, ContextID assigned)
         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(), rgdb->port());
-
-            rgdb->connect();
-        }
-        if (remoteGDB.size() <= id) {
+        if (remoteGDB.size() <= id)
             remoteGDB.resize(id + 1);
-        }
 
         remoteGDB[id] = rgdb;
     }
index 3e908e01bacfc0e49f4b267b338a82b61ab0d0b3..ae96be1a02599dc5629a08af5fd1d817131da203 100644 (file)
@@ -99,11 +99,8 @@ class System : public SimObject, public PCEventScope
 
   public:
 
-    /**
-     * After all objects have been created and all ports are
-     * connected, check that the system port is connected.
-     */
     void init() override;
+    void startup() override;
 
     /**
      * Get a reference to the system port that can be used by