Adding a call to the gdb debug info interface.

PiperOrigin-RevId: 914280396
Change-Id: I3287a26e9ddc01589cab0670f1a720a26e5816cc
diff --git a/mpact/sim/generic/debug_info.h b/mpact/sim/generic/debug_info.h
index 3c4430b..60c2360 100644
--- a/mpact/sim/generic/debug_info.h
+++ b/mpact/sim/generic/debug_info.h
@@ -45,6 +45,8 @@
   virtual int GetPcRegister() const = 0;
   // Returns the byte width of the general purpose registers.
   virtual int GetGprWidth() const = 0;
+  // Returns the byte width of the program counter register.
+  virtual int GetPcWidth() const = 0;
   // Returns the byte width of the register with the given number.
   virtual int GetRegisterByteWidth(int) const = 0;
   // Returns the XML file describing the target for gdb (or lldb).
diff --git a/mpact/sim/util/gdbserver/gdbserver.cc b/mpact/sim/util/gdbserver/gdbserver.cc
index 173c75c..378f4e5 100644
--- a/mpact/sim/util/gdbserver/gdbserver.cc
+++ b/mpact/sim/util/gdbserver/gdbserver.cc
@@ -549,7 +549,7 @@
   }
   std::string encoded_pc =
       absl::StrCat(absl::Hex(debug_info_.GetPcRegister()), ":",
-                   HexEncodeNumberInTargetEndianness(debug_info_.GetGprWidth(),
+                   HexEncodeNumberInTargetEndianness(debug_info_.GetPcWidth(),
                                                      pc_result.value()),
                    ";");
   auto result = core_debug_interfaces_[thread_id]->GetLastHaltReason();
@@ -734,16 +734,22 @@
     return Respond("T05thread:1;");
   }
   halt_reasons_[0] = result.value();
-  uint64_t address = 0;
+  auto pc_result = core_debug_interfaces_[0]->ReadRegister("pc");
+  if (!pc_result.ok()) {
+    return Respond("E01");
+  }
+  uint64_t address = pc_result.value();
+  std::string encoded_pc = absl::StrCat(
+      absl::Hex(debug_info_.GetPcRegister()), ":",
+      HexEncodeNumberInTargetEndianness(debug_info_.GetPcWidth(), address),
+      ";");
   generic::AccessType access_type = generic::AccessType::kNone;
   switch (halt_reasons_[0]) {
     default:
-      return Respond("T05thread:1;");
+      return Respond(absl::StrCat("T05thread:1;", encoded_pc));
     case *HaltReason::kSoftwareBreakpoint:
       address = core_debug_interfaces_[0]->GetSwBreakpointInfo();
-      return Respond(absl::StrCat("T05thread:1;swbreak:;",
-                                  HexEncodeNumberInTargetEndianness(
-                                      debug_info_.GetGprWidth(), address)));
+      return Respond(absl::StrCat("T05thread:1;swbreak:;", encoded_pc));
     case *HaltReason::kHardwareBreakpoint:
       return Respond("T05thread:1;hwbreak:;");
     case *HaltReason::kDataWatchPoint: {
@@ -754,22 +760,22 @@
       // read/write (awatch) watch points.
       switch (access_type) {
         case generic::AccessType::kLoad:
-          return Respond(absl::StrCat("T05thread:1;rwatch:;", encoded_address));
+          return Respond(absl::StrCat("T05thread:1;rwatch:;", encoded_pc));
         case generic::AccessType::kStore:
-          return Respond(absl::StrCat("T05thread:1;watch:;", encoded_address));
+          return Respond(absl::StrCat("T05thread:1;watch:;", encoded_pc));
         case generic::AccessType::kLoadStore:
-          return Respond(absl::StrCat("T05thread:1;awatch:;", encoded_address));
+          return Respond(absl::StrCat("T05thread:1;awatch:;", encoded_pc));
         default:
           LOG(ERROR) << "Invalid access type: "
                      << static_cast<int>(access_type);
-          return Respond("T05thread:1;;");
+          return Respond(absl::StrCat("T05thread:1;", encoded_pc));
       }
     }
     case *HaltReason::kActionPoint:
     case *HaltReason::kSimulatorError:
-      return Respond("T06thread:1;");
+      return Respond(absl::StrCat("T06thread:1;", encoded_pc));
     case *HaltReason::kUserRequest:
-      return Respond("T03thread:1;");
+      return Respond(absl::StrCat("T03thread:1;", encoded_pc));
     case *HaltReason::kProgramDone:
       return Respond("W00");
   }
diff --git a/mpact/sim/util/gdbserver/test/gdbserver_test.cc b/mpact/sim/util/gdbserver/test/gdbserver_test.cc
index 15a8d87..4352ef0 100644
--- a/mpact/sim/util/gdbserver/test/gdbserver_test.cc
+++ b/mpact/sim/util/gdbserver/test/gdbserver_test.cc
@@ -120,6 +120,7 @@
   int GetFirstGpr() const override { return 0; }
   int GetLastGpr() const override { return 31; }
   int GetGprWidth() const override { return 64; }
+  int GetPcWidth() const override { return 64; }
   int GetPcRegister() const override { return 32; }
   int GetRegisterByteWidth(int register_number) const override {
     return 64 / 8;