more changes for subtick labels.
[gem5.git] / base / remote_gdb.cc
index 17331fcd9b2776182ba5246d98429e16a228dbdc..67d745d437305fe84c896c68ed5e863b8952c3b8 100644 (file)
 
 using namespace std;
 
-#ifdef DEBUG
-RemoteGDB *theDebugger = NULL;
+#ifndef NDEBUG
+vector<RemoteGDB *> debuggers;
+int current_debugger = -1;
 
 void
 debugger()
 {
-    if (theDebugger)
-        theDebugger->trap(ALPHA_KENTRY_IF);
+    if (current_debugger >= 0 && current_debugger < debuggers.size()) {
+        RemoteGDB *gdb = debuggers[current_debugger];
+        if (!gdb->isattached())
+            gdb->listener->accept();
+        if (gdb->isattached())
+            gdb->trap(ALPHA_KENTRY_IF);
+    }
 }
 #endif
 
@@ -161,7 +167,10 @@ GDBListener::Event::process(int revent)
 
 GDBListener::GDBListener(RemoteGDB *g, int p)
     : event(NULL), gdb(g), port(p)
-{}
+{
+    assert(!gdb->listener);
+    gdb->listener = this;
+}
 
 GDBListener::~GDBListener()
 {
@@ -183,9 +192,21 @@ GDBListener::listen()
         port++;
     }
 
-    cerr << "Listening for remote gdb connection on port " << port << endl;
     event = new Event(this, listener.getfd(), POLLIN);
     pollQueue.schedule(event);
+
+#ifndef NDEBUG
+    gdb->number = debuggers.size();
+    debuggers.push_back(gdb);
+#endif
+
+#ifndef NDEBUG
+    ccprintf(cerr, "%d: %s: listening for remote gdb #%d on port %d\n",
+             curTick, name(), gdb->number, port);
+#else
+    ccprintf(cerr, "%d: %s: listening for remote gdb on port %d\n",
+             curTick, name(), port);
+#endif
 }
 
 void
@@ -228,7 +249,8 @@ RemoteGDB::Event::process(int revent)
 }
 
 RemoteGDB::RemoteGDB(System *_system, ExecContext *c)
-    : event(NULL), fd(-1), active(false), attached(false),
+    : event(NULL), listener(NULL), number(-1), fd(-1),
+      active(false), attached(false),
       system(_system), pmem(_system->physmem), context(c)
 {
     memset(gdbregs, 0, sizeof(gdbregs));
@@ -260,9 +282,6 @@ RemoteGDB::attach(int f)
 
     attached = true;
     DPRINTFN("remote gdb attached\n");
-#ifdef DEBUG
-    theDebugger = this;
-#endif
 }
 
 void
@@ -713,7 +732,6 @@ RemoteGDB::HardBreakpoint::HardBreakpoint(RemoteGDB *_gdb, Addr pc)
       gdb(_gdb), refcount(0)
 {
     DPRINTF(GDBMisc, "creating hardware breakpoint at %#x\n", evpc);
-    schedule();
 }
 
 void