Changed display of interrupt information in the debug command shell.
Now a new interrupt is shown only the cycle it occurs (while stepping).
The full interrupt stack is shown in the reg $all view.

PiperOrigin-RevId: 707251125
Change-Id: I44261d5f4cf2c956bcef6139bcaacb9b40880ce0
diff --git a/cheriot/debug_command_shell.cc b/cheriot/debug_command_shell.cc
index 7e4c236..cd2f0d4 100644
--- a/cheriot/debug_command_shell.cc
+++ b/cheriot/debug_command_shell.cc
@@ -195,6 +195,7 @@
   exec    NAME                     - load commands from file 'NAME' and execute
                                      each line as a command. Lines starting with
                                      a '#' are treated as comments.
+  status                           - display current status.
   help                             - display this message.
 
   Special names:
@@ -260,6 +261,7 @@
   current_core_ = 0;
   absl::string_view line_view;
   bool halt_reason = false;
+  int last_info_list_size = 0;
   while (true) {
     // Prompt and read in the next command.
     auto pcc_result =
@@ -330,14 +332,14 @@
     auto cheriot_state =
         static_cast<CheriotState *>(core_access_[current_core_].state);
     auto &info_list = cheriot_state->interrupt_info_list();
-    int count = 0;
-    for (auto iter = info_list.rbegin(); iter != info_list.rend(); ++iter) {
-      auto const &info = *iter;
-      absl::StrAppend(&prompt, "[", count++, "] ",
-                      info.is_interrupt ? "interrupt" : "exception", " ",
+    // Check if there is a new interrupt, if so print the info.
+    if (info_list.size() > last_info_list_size) {
+      auto const &info = *info_list.rbegin();
+      absl::StrAppend(&prompt, info.is_interrupt ? "interrupt " : "exception ",
                       info.is_interrupt ? GetInterruptDescription(info)
                                         : GetExceptionDescription(info));
     }
+    last_info_list_size = info_list.size();
     absl::StrAppend(&prompt, "[", current_core_, "] > ");
     while (!command_streams_.empty()) {
       auto &current_is = *command_streams_.back();
@@ -1643,6 +1645,23 @@
 
 std::string DebugCommandShell::FormatAllRegisters(int core) const {
   std::string output;
+  // Interrupt stack.
+  auto cheriot_state =
+      static_cast<CheriotState *>(core_access_[current_core_].state);
+  auto &info_list = cheriot_state->interrupt_info_list();
+  int count = 0;
+  if (!info_list.empty()) {
+    absl::StrAppend(&output, "Interrupt stack:\n");
+    for (auto iter = info_list.rbegin(); iter != info_list.rend(); ++iter) {
+      auto const &info = *iter;
+      absl::StrAppend(&output, "[", count++, "] ",
+                      info.is_interrupt ? "interrupt" : "exception", " ",
+                      info.is_interrupt ? GetInterruptDescription(info)
+                                        : GetExceptionDescription(info));
+    }
+    absl::StrAppend(&output, "\n");
+  }
+  // Registers.
   for (auto const &reg_name : reg_vector_) {
     absl::StrAppend(&output, FormatRegister(current_core_, reg_name), "\n");
   }
@@ -1766,7 +1785,7 @@
 }
 
 std::string DebugCommandShell::GetInterruptDescription(
-    const InterruptInfo &info) {
+    const InterruptInfo &info) const {
   std::string output;
   if (!info.is_interrupt) return output;
   switch (info.cause & 0x7fff'ffff) {
@@ -1806,7 +1825,7 @@
 }
 
 std::string DebugCommandShell::GetExceptionDescription(
-    const InterruptInfo &info) {
+    const InterruptInfo &info) const {
   std::string output;
   if (info.is_interrupt) return output;
   absl::StrAppend(&output, " Exception taken at ", absl::Hex(info.epc), ": ");
diff --git a/cheriot/debug_command_shell.h b/cheriot/debug_command_shell.h
index b58b1fe..b32545f 100644
--- a/cheriot/debug_command_shell.h
+++ b/cheriot/debug_command_shell.h
@@ -134,8 +134,8 @@
   };
 
   // Helper method to get the interrupt description.
-  std::string GetInterruptDescription(const InterruptInfo &info);
-  std::string GetExceptionDescription(const InterruptInfo &info);
+  std::string GetInterruptDescription(const InterruptInfo &info) const;
+  std::string GetExceptionDescription(const InterruptInfo &info) const;
 
   // Helper method for formatting single data buffer value.
   std::string FormatSingleDbValue(generic::DataBuffer *db,