blob: 528d6bd77fdcfeede0724ff21e5139aff7266eb5 [file]
#ifndef MPACT_SIM_GENERIC_DEBUG_COMMAND_SHELL_INTERFACE_H_
#define MPACT_SIM_GENERIC_DEBUG_COMMAND_SHELL_INTERFACE_H_
#include <cstddef>
#include <cstdint>
#include <functional>
#include <iostream>
#include <string>
#include <vector>
#include "absl/container/btree_map.h"
#include "absl/functional/any_invocable.h"
#include "absl/strings/string_view.h"
#include "mpact/sim/generic/arch_state.h"
#include "mpact/sim/generic/core_debug_interface.h"
#include "mpact/sim/util/program_loader/elf_program_loader.h"
namespace mpact::sim::generic {
class DebugCommandShellInterface {
public:
static constexpr int kMemBufferSize = 32;
struct WatchpointInfo {
uint64_t address;
size_t length;
AccessType access_type;
bool active;
};
// Each core must provide the debug interface and the elf loader.
struct CoreAccess {
CoreDebugInterface* debug_interface = nullptr;
std::function<util::ElfProgramLoader*()> loader_getter;
ArchState* state = nullptr;
absl::btree_map<int, uint64_t> breakpoint_map;
int breakpoint_index = 0;
absl::btree_map<int, WatchpointInfo> watchpoint_map;
int watchpoint_index = 0;
};
virtual ~DebugCommandShellInterface() = default;
// Type of custom command processing invocables. It takes a string_view of
// the current text input, the current core access structure, and a string
// to be written to the command shell output. The invocable should return
// true if the command input string was successfully matched, regardless of
// any error while executing the command, in which case the output string
// should be set to an appropriate error message.
using CommandFunction = absl::AnyInvocable<bool(
absl::string_view, const CoreAccess&, std::string&)>;
// Add core access to the system.
virtual void AddCore(const CoreAccess& core_access) = 0;
virtual void AddCores(const std::vector<CoreAccess>& core_access) = 0;
// This adds a custom command to the command interpreter. Usage will be added
// to the standard command usage. The callable will be called before the
// standard commands are processed. Must be called before Run() is called.
virtual void AddCommand(absl::string_view usage,
CommandFunction command_function) = 0;
// The run method is the command interpreter. It parses the command strings,
// executes the corresponding commands, displays results and error messages.
virtual void Run(std::istream& is, std::ostream& os) = 0;
};
} // namespace mpact::sim::generic
#endif // MPACT_SIM_GENERIC_DEBUG_COMMAND_SHELL_INTERFACE_H_