| // Copyright 2020 The Fuchsia Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #ifndef SRC_DEVELOPER_DEBUG_DEBUG_AGENT_GENERAL_REGISTERS_H_ | |
| #define SRC_DEVELOPER_DEBUG_DEBUG_AGENT_GENERAL_REGISTERS_H_ | |
| #include <zircon/syscalls/debug.h> | |
| #include <vector> | |
| namespace debug_ipc { | |
| struct Register; | |
| } | |
| namespace debug_agent { | |
| // Wrapper around the general thread registers to allow them to be accessed uniformly regardless | |
| // of the platform. | |
| class GeneralRegisters { | |
| public: | |
| GeneralRegisters() : regs_() {} | |
| explicit GeneralRegisters(const zx_thread_state_general_regs& r) : regs_(r) {} | |
| #if defined(__x86_64__) | |
| // Instruction pointer. | |
| uint64_t ip() const { return regs_.rip; } | |
| void set_ip(uint64_t ip) { regs_.rip = ip; } | |
| // Stack pointer. | |
| uint64_t sp() const { return regs_.rsp; } | |
| void set_sp(uint64_t sp) { regs_.rsp = sp; } | |
| #elif defined(__aarch64__) | |
| uint64_t ip() const { return regs_.pc; } | |
| void set_ip(uint64_t ip) { regs_.pc = ip; } | |
| // Stack pointer. | |
| uint64_t sp() const { return regs_.sp; } | |
| void set_sp(uint64_t sp) { regs_.sp = sp; } | |
| #endif | |
| // Appends the current general registers to the given high-level register record. | |
| void CopyTo(std::vector<debug_ipc::Register>& dest) const; | |
| zx_thread_state_general_regs& GetNativeRegisters() { return regs_; } | |
| const zx_thread_state_general_regs& GetNativeRegisters() const { return regs_; } | |
| private: | |
| zx_thread_state_general_regs regs_; | |
| }; | |
| } // namespace debug_agent | |
| #endif // SRC_DEVELOPER_DEBUG_DEBUG_AGENT_GENERAL_REGISTERS_H_ |