sim: Ensure GDB interrupts the simulation at an instruction boundary.
authorGabe Black <gabeblack@google.com>
Fri, 5 Dec 2014 09:51:49 +0000 (01:51 -0800)
committerGabe Black <gabeblack@google.com>
Fri, 5 Dec 2014 09:51:49 +0000 (01:51 -0800)
Use the comInstEventQueue to ensure GDB interrupts the simulation at an
instruction boundary and not in the middle of a macroop, memory access, etc.

src/base/remote_gdb.cc
src/base/remote_gdb.hh

index 42b94b5f9c8baf030568d5195368965d841c8016..7143763ddabfbbafca34f0fb065f8c241055ddfd 100644 (file)
@@ -1,4 +1,5 @@
 /*
+ * Copyright 2014 Google, Inc.
  * Copyright (c) 2002-2005 The Regents of The University of Michigan
  * All rights reserved.
  *
 #include "base/socket.hh"
 #include "base/trace.hh"
 #include "config/the_isa.hh"
+#include "cpu/base.hh"
 #include "cpu/static_inst.hh"
 #include "cpu/thread_context.hh"
 #include "debug/GDBAll.hh"
@@ -246,14 +248,28 @@ BaseRemoteGDB::Event::Event(BaseRemoteGDB *g, int fd, int e)
 void
 BaseRemoteGDB::Event::process(int revent)
 {
-    if (revent & POLLIN)
-        gdb->trap(SIGILL);
-    else if (revent & POLLNVAL)
+    BaseCPU *cpu = gdb->context->getCpuPtr();
+    EventQueue *eq = cpu->comInstEventQueue[gdb->context->threadId()];
+    if (revent & POLLIN) {
+        gdb->trapEvent.type(SIGILL);
+        // Here "ticks" aren't simulator ticks which measure time, they're
+        // instructions committed by the CPU.
+        eq->schedule(&gdb->trapEvent, eq->getCurTick());
+    } else if (revent & POLLNVAL) {
+        if (gdb->trapEvent.scheduled())
+            eq->deschedule(&gdb->trapEvent);
         gdb->detach();
+    }
+}
+
+void
+BaseRemoteGDB::TrapEvent::process()
+{
+    gdb->trap(_type);
 }
 
 BaseRemoteGDB::BaseRemoteGDB(System *_system, ThreadContext *c, size_t cacheSize)
-    : event(NULL), listener(NULL), number(-1), fd(-1),
+    : event(NULL), trapEvent(this), listener(NULL), number(-1), fd(-1),
       active(false), attached(false),
       system(_system), context(c),
       gdbregs(cacheSize)
index ef414f09bb923ef5ade51d0e058e2b1d2d42bfdd..110059141e86d48346d11af2ea25400c7ddab9b7 100644 (file)
@@ -115,8 +115,23 @@ class BaseRemoteGDB
         void process(int revent);
     };
 
+    class TrapEvent : public ::Event
+    {
+      protected:
+        int _type;
+        BaseRemoteGDB *gdb;
+
+      public:
+        TrapEvent(BaseRemoteGDB *g) : gdb(g)
+        {}
+
+        void type(int t) { _type = t; }
+        void process();
+    };
+
     friend class Event;
     Event *event;
+    TrapEvent trapEvent;
     GDBListener *listener;
     int number;