Added a disassembly format 'i' to command line interface mem get command. Updated prompt to include the name of the function the current instruction is in the range of. PiperOrigin-RevId: 642020787 Change-Id: I71d4c358f705ec7a92d7fc48182a2dde27a2da34
diff --git a/cheriot/debug_command_shell.cc b/cheriot/debug_command_shell.cc index 46ad147..cbb9ff9 100644 --- a/cheriot/debug_command_shell.cc +++ b/cheriot/debug_command_shell.cc
@@ -67,8 +67,8 @@ write_reg_re_{R"(\s*reg\s+set\s+(\$?\w+)\s+(\w+)\s*)"}, rd_vreg_re_{R"(\s*vreg(?:\s+get)?\s+(\$?\w+)(?:(?:\s*\:(\d+))?)" R"((?:\s+(?:([oduxX])(8|16|32|64))?)?)?\s*)"}, - read_mem_re_{R"(\s*mem\s+get\s+(\w+)(?:\s+([foduxX]\d+)?)?\s*)"}, - read_mem2_re_{R"(\s*mem\s+(\w+)(?:\s+([foduxX]\d+)?)?\s*)"}, + read_mem_re_{R"(\s*mem\s+get\s+(\w+)(?:\s+([foduxX]\d+|i)?)?\s*)"}, + read_mem2_re_{R"(\s*mem\s+(\w+)(?:\s+([foduxX]\d+|i)?)?\s*)"}, write_mem_re_{R"(\s*mem\s+set\s+(\w+)\s+([oduxX]\d+)?\s+(\w+)\s*)"}, set_break_re_{R"(\s*break\s+set\s+(\$?\w+)\s*)"}, set_break2_re_{R"(\s*break\s+(\$?\w+)\s*)"}, @@ -233,6 +233,10 @@ if (pcc_result.ok()) { auto *loader = core_access_[current_core_].loader_getter(); if (loader != nullptr) { + auto fcn_result = loader->GetFunctionName(pcc_result.value()); + if (fcn_result.ok()) { + absl::StrAppend(&prompt, "[", fcn_result.value(), "]:\n"); + } auto symbol_result = loader->GetFcnSymbolName(pcc_result.value()); if (symbol_result.ok()) { absl::StrAppend(&prompt, symbol_result.value(), ":\n"); @@ -1201,18 +1205,23 @@ char format_char = 'x'; int bit_width = 32; + // Get the bit width, but only if the format is not 'i'. if (!format.empty()) { - // Check the format specification. - auto pos = format.find_first_not_of(' '); - format_char = format[pos]; - auto status = absl::SimpleAtoi(format.substr(pos + 1), &bit_width); - if (!status) { - return absl::StrCat("Error '", format.substr(pos + 1), - "': ", "unable to convert to int"); - } - if ((bit_width != 8) && (bit_width != 16) && (bit_width != 32) && - (bit_width != 64)) { - return absl::StrCat("Illegal bit width specification: ", bit_width); + if (format[0] == 'i') { + format_char = 'i'; + } else { + // Check the format specification. + auto pos = format.find_first_not_of(' '); + format_char = format[pos]; + auto status = absl::SimpleAtoi(format.substr(pos + 1), &bit_width); + if (!status) { + return absl::StrCat("Error '", format.substr(pos + 1), + "': ", "unable to convert to int"); + } + if ((bit_width != 8) && (bit_width != 16) && (bit_width != 32) && + (bit_width != 64)) { + return absl::StrCat("Illegal bit width specification: ", bit_width); + } } } @@ -1223,6 +1232,17 @@ } auto address = result.value(); + // If format is 'i', then we are getting a disassembled instruction. Ignore + // bitwidth. + if (format_char == 'i') { + auto disasm_result = + core_access_[current_core_].debug_interface->GetDisassembly(address); + if (!disasm_result.ok()) { + return absl::StrCat("Error: ", disasm_result.status().message()); + } + return absl::StrCat(" ", disasm_result.value()); + } + // Perform the memory access. size = bit_width / 8; if (size > kMemBufferSize) size = kMemBufferSize;