Modified CoreAccess to allow for loaders being available after initial setup. This changes the loader member from an Elf loader pointer, to a function that returns an Elf loader pointer. PiperOrigin-RevId: 639096497 Change-Id: Ia629d958b155d4e78660afb651116c36bbe35461
diff --git a/cheriot/cheriot_instrumentation_control.cc b/cheriot/cheriot_instrumentation_control.cc index 51cb100..203285f 100644 --- a/cheriot/cheriot_instrumentation_control.cc +++ b/cheriot/cheriot_instrumentation_control.cc
@@ -114,11 +114,12 @@ return true; } // Let's see if it is a symbol. - if (core_access.loader == nullptr) { + auto *loader = core_access.loader_getter(); + if (loader == nullptr) { output = "Error: cannot perform symbol lookup"; return true; } - auto result = core_access.loader->GetSymbol(where); + auto result = loader->GetSymbol(where); if (!result.ok()) { output = absl::StrCat("Error: symbol ", where, " not found"); return true;
diff --git a/cheriot/cheriot_renode.cc b/cheriot/cheriot_renode.cc index be0c484..ad96a65 100644 --- a/cheriot/cheriot_renode.cc +++ b/cheriot/cheriot_renode.cc
@@ -462,7 +462,7 @@ cmd_shell_, cheriot_top_, mem_profiler_); cmd_shell_->AddCore( {static_cast<CheriotDebugInterface *>(cheriot_cli_forwarder_), - program_loader_}); + [this]() { return program_loader_; }}); cmd_shell_->AddCommand( instrumentation_control_->Usage(), absl::bind_front(&CheriotInstrumentationControl::PerformShellCommand,
diff --git a/cheriot/cheriot_top.cc b/cheriot/cheriot_top.cc index b75b5b3..5beda12 100644 --- a/cheriot/cheriot_top.cc +++ b/cheriot/cheriot_top.cc
@@ -314,6 +314,9 @@ if (num <= 0) { return absl::InvalidArgumentError("Step count must be > 0"); } + if (halt_reason_ == *HaltReason::kProgramDone) { + return absl::FailedPreconditionError("Step: Program has completed."); + } // If the simulator is running, return with an error. if (run_status_ != RunStatus::kHalted) { return absl::FailedPreconditionError( @@ -411,6 +414,9 @@ } absl::Status CheriotTop::Run() { + if (halt_reason_ == *HaltReason::kProgramDone) { + return absl::FailedPreconditionError("Run: Program has completed."); + } // Verify that the core isn't running already. if (run_status_ == RunStatus::kRunning) { return absl::FailedPreconditionError(
diff --git a/cheriot/debug_command_shell.cc b/cheriot/debug_command_shell.cc index cdde439..46ad147 100644 --- a/cheriot/debug_command_shell.cc +++ b/cheriot/debug_command_shell.cc
@@ -84,7 +84,7 @@ clear_watch_re_{R"(\s*watch\s+clear\s+(\w+)(\s+r|\s+w|\s+rw)?\s*)"}, clear_watch_n_re_{R"(\s*watch\s+clear\s+\#(\d+)\s*)"}, clear_all_watch_re_{R"(\s*watch\s+clear-all\s*)"}, - list_action_re_{R"(\s*action\*)"}, + list_action_re_{R"(\s*action\s*)"}, enable_action_n_re_{R"(\s*action\s+enable\s+\*(\d+)\s*)"}, disable_action_n_re_{R"(\s*action\s+disable\s+\*(\d+)\s*)"}, clear_action_n_re_{R"(\s*action\s+clear\s+\*(\d+)\s*)"}, @@ -205,10 +205,10 @@ std::string prompt; if (halt_reason) { halt_reason = false; - auto halt_reason = + auto result = core_access_[current_core_].debug_interface->GetLastHaltReason(); - if (halt_reason.ok()) { - switch (halt_reason.value()) { + if (result.ok()) { + switch (result.value()) { case *HaltReason::kSoftwareBreakpoint: absl::StrAppend(&prompt, "Stopped at software breakpoint\n"); break; @@ -222,8 +222,8 @@ absl::StrAppend(&prompt, "Program done\n"); break; default: - if ((halt_reason.value() >= *HaltReason::kUserSpecifiedMin) && - (halt_reason.value() <= *HaltReason::kUserSpecifiedMax)) { + if ((result.value() >= *HaltReason::kUserSpecifiedMin) && + (result.value() <= *HaltReason::kUserSpecifiedMax)) { absl::StrAppend(&prompt, "Stopped for custom halt reason\n"); } break; @@ -231,10 +231,9 @@ } } if (pcc_result.ok()) { - if (core_access_[current_core_].loader != nullptr) { - auto symbol_result = - core_access_[current_core_].loader->GetFcnSymbolName( - pcc_result.value()); + auto *loader = core_access_[current_core_].loader_getter(); + if (loader != nullptr) { + auto symbol_result = loader->GetFcnSymbolName(pcc_result.value()); if (symbol_result.ok()) { absl::StrAppend(&prompt, symbol_result.value(), ":\n"); } @@ -262,6 +261,8 @@ } while ((is_file && RE2::FullMatch(line, *empty_re_)) && !current_is.bad() && !current_is.eof()); + if (command_streams_.empty()) return; + // If the current is at eof or gone bad, pop the stream and try the next. if (current_is.bad() || current_is.eof()) { // If it's not the only stream, delete the stream since it was allocated @@ -384,6 +385,7 @@ if (result.value() != count) { os << result.value() << " instructions executed" << std::endl; os.flush(); + halt_reason = true; } continue; } @@ -590,9 +592,9 @@ bool active = core_access_[current_core_].debug_interface->HasBreakpoint(address); std::string symbol; - if (core_access_[current_core_].loader != nullptr) { - auto res = - core_access_[current_core_].loader->GetFcnSymbolName(address); + auto *loader = core_access_[current_core_].loader_getter(); + if (loader != nullptr) { + auto res = loader->GetFcnSymbolName(address); if (res.ok()) symbol = std::move(res.value()); } absl::StrAppend(&bp_list, @@ -891,9 +893,9 @@ for (auto const &[index, info] : core_access_[current_core_].watchpoint_map) { std::string symbol; - if (core_access_[current_core_].loader != nullptr) { - auto res = core_access_[current_core_].loader->GetFcnSymbolName( - info.address); + auto *loader = core_access_[current_core_].loader_getter(); + if (loader != nullptr) { + auto res = loader->GetFcnSymbolName(info.address); if (res.ok()) symbol = std::move(res.value()); } std::string access_type; @@ -1398,9 +1400,10 @@ return convert_result.status(); } // If all else fails, let's see if it's a symbol. - if (core_access_[current_core_].loader == nullptr) - return absl::NotFoundError("Symbol not found"); - auto result = core_access_[current_core_].loader->GetSymbol(str_value); + auto *loader = core_access_[core].loader_getter(); + if (loader == nullptr) + return absl::NotFoundError("No symbol table available"); + auto result = loader->GetSymbol(str_value); if (!result.ok()) return result.status(); return result.value().first; }
diff --git a/cheriot/mpact_cheriot.cc b/cheriot/mpact_cheriot.cc index 51673c2..81b7a7f 100644 --- a/cheriot/mpact_cheriot.cc +++ b/cheriot/mpact_cheriot.cc
@@ -434,7 +434,7 @@ CheriotInstrumentationControl *cheriot_instrumentation_control = nullptr; if (interactive) { mpact::sim::cheriot::DebugCommandShell cmd_shell; - cmd_shell.AddCore({&cheriot_top, &elf_loader}); + cmd_shell.AddCore({&cheriot_top, [&elf_loader]() { return &elf_loader; }}); cheriot_instrumentation_control = new CheriotInstrumentationControl( &cmd_shell, &cheriot_top, memory_use_profiler); // Add custom command to interactive debug command shell.