gdbstub_arch.h 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #pragma once
  4. #include <string>
  5. #include "common/common_types.h"
  6. namespace Kernel {
  7. class KThread;
  8. }
  9. namespace Core {
  10. class GDBStubArch {
  11. public:
  12. virtual ~GDBStubArch() = default;
  13. virtual std::string_view GetTargetXML() const = 0;
  14. virtual std::string RegRead(const Kernel::KThread* thread, size_t id) const = 0;
  15. virtual void RegWrite(Kernel::KThread* thread, size_t id, std::string_view value) const = 0;
  16. virtual std::string ReadRegisters(const Kernel::KThread* thread) const = 0;
  17. virtual void WriteRegisters(Kernel::KThread* thread, std::string_view register_data) const = 0;
  18. virtual std::string ThreadStatus(const Kernel::KThread* thread, u8 signal) const = 0;
  19. virtual u32 BreakpointInstruction() const = 0;
  20. };
  21. class GDBStubA64 final : public GDBStubArch {
  22. public:
  23. std::string_view GetTargetXML() const override;
  24. std::string RegRead(const Kernel::KThread* thread, size_t id) const override;
  25. void RegWrite(Kernel::KThread* thread, size_t id, std::string_view value) const override;
  26. std::string ReadRegisters(const Kernel::KThread* thread) const override;
  27. void WriteRegisters(Kernel::KThread* thread, std::string_view register_data) const override;
  28. std::string ThreadStatus(const Kernel::KThread* thread, u8 signal) const override;
  29. u32 BreakpointInstruction() const override;
  30. private:
  31. static constexpr u32 FP_REGISTER = 29;
  32. static constexpr u32 LR_REGISTER = 30;
  33. static constexpr u32 SP_REGISTER = 31;
  34. static constexpr u32 PC_REGISTER = 32;
  35. static constexpr u32 PSTATE_REGISTER = 33;
  36. static constexpr u32 Q0_REGISTER = 34;
  37. static constexpr u32 FPSR_REGISTER = 66;
  38. static constexpr u32 FPCR_REGISTER = 67;
  39. };
  40. class GDBStubA32 final : public GDBStubArch {
  41. public:
  42. std::string_view GetTargetXML() const override;
  43. std::string RegRead(const Kernel::KThread* thread, size_t id) const override;
  44. void RegWrite(Kernel::KThread* thread, size_t id, std::string_view value) const override;
  45. std::string ReadRegisters(const Kernel::KThread* thread) const override;
  46. void WriteRegisters(Kernel::KThread* thread, std::string_view register_data) const override;
  47. std::string ThreadStatus(const Kernel::KThread* thread, u8 signal) const override;
  48. u32 BreakpointInstruction() const override;
  49. private:
  50. static constexpr u32 SP_REGISTER = 13;
  51. static constexpr u32 LR_REGISTER = 14;
  52. static constexpr u32 PC_REGISTER = 15;
  53. static constexpr u32 CPSR_REGISTER = 25;
  54. static constexpr u32 D0_REGISTER = 32;
  55. static constexpr u32 Q0_REGISTER = 64;
  56. static constexpr u32 FPSCR_REGISTER = 80;
  57. };
  58. } // namespace Core