blob: 0d0055bad72261d77670865edb2340cafe64c7bc [file]
// Copyright 2026 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// This file contains the definition of the RiscVGdbDebugInfo class. The
// RiscVGdbDebugInfo class is used to provide information about the registers
// and target XML to gdbserver.
#ifndef THIRD_PARTY_MPACT_RISCV_RISCV_GDB_DEBUG_INFO_H_
#define THIRD_PARTY_MPACT_RISCV_RISCV_GDB_DEBUG_INFO_H_
#include <string>
#include <string_view>
#include "absl/strings/string_view.h"
#include "mpact/sim/generic/debug_info.h"
namespace mpact::sim::riscv {
enum class RiscVGdbRegisterEnum : int {
// Integer registers.
kGprFirst = 0,
kGprX0 = kGprFirst,
kGprX1,
kGprX2,
kGprX3,
kGprX4,
kGprX5,
kGprX6,
kGprX7,
kGprX8,
kGprX9,
kGprX10,
kGprX11,
kGprX12,
kGprX13,
kGprX14,
kGprX15,
kGprX16,
kGprX17,
kGprX18,
kGprX19,
kGprX20,
kGprX21,
kGprX22,
kGprX23,
kGprX24,
kGprX25,
kGprX26,
kGprX27,
kGprX28,
kGprX29,
kGprX30,
kGprX31,
kGprPc,
kGprLast = kGprPc,
// Floating point registers.
kFprFirst = kGprLast + 1,
kFprF0 = kFprFirst,
kFprF1,
kFprF2,
kFprF3,
kFprF4,
kFprF5,
kFprF6,
kFprF7,
kFprF8,
kFprF9,
kFprF10,
kFprF11,
kFprF12,
kFprF13,
kFprF14,
kFprF15,
kFprF16,
kFprF17,
kFprF18,
kFprF19,
kFprF20,
kFprF21,
kFprF22,
kFprF23,
kFprF24,
kFprF25,
kFprF26,
kFprF27,
kFprF28,
kFprF29,
kFprF30,
kFprF31,
kFprLast = kFprF31,
kFprFcsr,
// Vector registers.
kVprFirst = kFprFcsr + 1,
kVprV0 = kVprFirst,
kVprV1,
kVprV2,
kVprV3,
kVprV4,
kVprV5,
kVprV6,
kVprV7,
kVprV8,
kVprV9,
kVprV10,
kVprV11,
kVprV12,
kVprV13,
kVprV14,
kVprV15,
kVprV16,
kVprV17,
kVprV18,
kVprV19,
kVprV20,
kVprV21,
kVprV22,
kVprV23,
kVprV24,
kVprV25,
kVprV26,
kVprV27,
kVprV28,
kVprV29,
kVprV30,
kVprV31,
kVprLast = kVprV31,
kVprVstart,
kVprVxsat,
kVprVxrm,
kVprVcsr,
kVprVl,
kVprVtype,
kVprVlenb,
};
class RiscVGdbDebugInfo : public generic::DebugInfo {
public:
using DebugRegisterMap = generic::DebugInfo::DebugRegisterMap;
static RiscVGdbDebugInfo* Instance(int gpr_width, int fp_width,
int vec_width);
const DebugRegisterMap& debug_register_map() const override {
return debug_register_map_;
}
int GetFirstGpr() const override {
return static_cast<int>(RiscVGdbRegisterEnum::kGprFirst);
};
int GetLastGpr() const override {
return static_cast<int>(RiscVGdbRegisterEnum::kGprLast);
}
int GetGprWidth() const override { return gpr_width_; };
// For now assume that all registers have the same width as the GPRs.
int GetRegisterByteWidth(int register_number) const override {
return gpr_width_ / 8;
}
std::string_view GetLLDBHostInfo() const override {
return absl::string_view(host_info_);
}
std::string_view GetGdbTargetXml() const override {
return absl::string_view(gdb_target_xml_);
}
private:
RiscVGdbDebugInfo(int gpr_width, int fp_width, int vec_width);
int gpr_width_;
int fp_width_;
int vec_width_;
std::string host_info_;
DebugRegisterMap debug_register_map_;
// "Escaped" GDB target XML string.
std::string gdb_target_xml_;
};
} // namespace mpact::sim::riscv
#endif // THIRD_PARTY_MPACT_RISCV_RISCV_GDB_DEBUG_INFO_H_