No public description

PiperOrigin-RevId: 899582553
Change-Id: I570baeb5b1769a45d60c56afc01642ed5c790267
diff --git a/mpact/sim/util/gdbserver/gdbserver.cc b/mpact/sim/util/gdbserver/gdbserver.cc
index b4d9ee9..7cf1dbf 100644
--- a/mpact/sim/util/gdbserver/gdbserver.cc
+++ b/mpact/sim/util/gdbserver/gdbserver.cc
@@ -95,6 +95,29 @@
   for (int i = 0; i < core_debug_interfaces_.size(); ++i) {
     halt_reasons_.push_back(*generic::CoreDebugInterface::HaltReason::kNone);
   }
+  // Get register widths for each register number.
+  auto xml_data = absl::StrSplit(debug_info_.GetGdbTargetXml(), '\n');
+  RE2 bitsize_re{R"re2(<reg\s.*bitsize\s*=\s*"(\d+)")re2"};
+  RE2 regnum_re{R"re2(<reg\s.*regnum\s*=\s*"(\d+)")re2"};
+  for (const auto& line : xml_data) {
+    std::string regnum_str;
+    int reg_num;
+    if (RE2::PartialMatch(line, regnum_re, &regnum_str)) {
+      if (!absl::SimpleAtoi(regnum_str, &reg_num)) {
+        continue;  // Skip line if no valid register number is found in the
+                   // line.
+      }
+    } else {
+      continue;  // Skip line if no register number is found in the line.
+    }
+    std::string bitsize_str;
+    int reg_bitsize;
+    if (RE2::PartialMatch(line, bitsize_re, &bitsize_str)) {
+      if (absl::SimpleAtoi(bitsize_str, &reg_bitsize)) {
+        reg_bitsize_map_[reg_num] = reg_bitsize;
+      }
+    }
+  }
 }
 
 GdbServer::~GdbServer() {
@@ -944,9 +967,16 @@
     return SendError(result.status().message());
   }
   std::string response;
+  int bitsize = result.value()->size<uint8_t>() * 8;
   for (const auto& byte : result.value()->Get<uint8_t>()) {
     absl::StrAppend(&response, absl::Hex(byte, absl::kZeroPad2));
   }
+  if (reg_bitsize_map_.contains(register_number) &&
+      reg_bitsize_map_[register_number] > bitsize) {
+    for (int i = 0; i < (reg_bitsize_map_[register_number] - bitsize); i += 8) {
+      absl::StrAppend(&response, "00");
+    }
+  }
   Respond(response);
 }
 
diff --git a/mpact/sim/util/gdbserver/gdbserver.h b/mpact/sim/util/gdbserver/gdbserver.h
index d2f90ad..c1e3b4d 100644
--- a/mpact/sim/util/gdbserver/gdbserver.h
+++ b/mpact/sim/util/gdbserver/gdbserver.h
@@ -181,6 +181,7 @@
   absl::flat_hash_map<char, int> thread_select_;
   absl::Span<generic::CoreDebugInterface*> core_debug_interfaces_;
   std::vector<int> halt_reasons_;
+  absl::flat_hash_map<int, int> reg_bitsize_map_;
   const DebugInfo& debug_info_;
   // Regular expressions used to parse GDB commands.
   // These are static since they are immutable once initialized.