blob: 52722735b034f7d0c3d619c661c55c6008e567bc [file] [log] [blame]
// 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 <optional>
#include <vector>
#include "src/developer/debug/debug_agent/arch.h"
#include "src/developer/debug/shared/register_id.h"
#include "src/developer/debug/shared/register_value.h"
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 arch::PlatformGeneralRegisters& 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::RegisterValue>& dest) const;
arch::PlatformGeneralRegisters& GetNativeRegisters() { return regs_; }
const arch::PlatformGeneralRegisters& GetNativeRegisters() const { return regs_; }
// TODO: Maintain a better id <-> platform register mapping and use here and in the arch files to
// avoid this unnecessary std::vector creation and unify with the arch::SaveGeneralRegisters()
// implementation.
std::optional<uint64_t> GetRegister(debug::RegisterID reg_id) const;
private:
arch::PlatformGeneralRegisters regs_;
};
} // namespace debug_agent
#endif // SRC_DEVELOPER_DEBUG_DEBUG_AGENT_GENERAL_REGISTERS_H_