// Copyright 2019 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 GARNET_LIB_DEBUGGER_UTILS_REGISTERS_H_
#define GARNET_LIB_DEBUGGER_UTILS_REGISTERS_H_

#include <stdint.h>
#include <zircon/types.h>
#include <zircon/syscalls/debug.h>

namespace debugger_utils {

zx_status_t ReadGeneralRegisters(zx_handle_t thread,
                                 zx_thread_state_general_regs_t* regs);

zx_status_t WriteGeneralRegisters(zx_handle_t thread,
                                  const zx_thread_state_general_regs_t* regs);

static inline zx_vaddr_t GetPcFromGeneralRegisters(
    const zx_thread_state_general_regs_t* regs) {
#if defined(__x86_64__)
  return regs->rip;
#elif defined(__aarch64__)
  return regs->pc;
#else
#error "unsupported architecture"
#endif
}

static inline void SetPcInGeneralRegisters(
    zx_thread_state_general_regs_t* regs, zx_vaddr_t pc) {
#if defined(__x86_64__)
  regs->rip = pc;
#elif defined(__aarch64__)
  regs->pc = pc;
#else
#error "unsupported architecture"
#endif
}

static inline zx_vaddr_t GetSpFromGeneralRegisters(
    const zx_thread_state_general_regs_t* regs) {
#if defined(__x86_64__)
  return regs->rsp;
#elif defined(__aarch64__)
  return regs->sp;
#else
#error "unsupported architecture"
#endif
}

static inline void SetSpInGeneralRegisters(
    zx_thread_state_general_regs_t* regs, zx_vaddr_t sp) {
#if defined(__x86_64__)
  regs->rsp = sp;
#elif defined(__aarch64__)
  regs->sp = sp;
#else
#error "unsupported architecture"
#endif
}

static inline zx_vaddr_t GetFpFromGeneralRegisters(
    const zx_thread_state_general_regs_t* regs) {
#if defined(__x86_64__)
  return regs->rbp;
#elif defined(__aarch64__)
  return regs->r[29];
#else
#error "unsupported architecture"
#endif
}

static inline void SetFpInGeneralRegisters(
    zx_thread_state_general_regs_t* regs, zx_vaddr_t fp) {
#if defined(__x86_64__)
  regs->rbp = fp;
#elif defined(__aarch64__)
  regs->r[29] = fp;
#else
#error "unsupported architecture"
#endif
}

}  // namespace debugger_utils

#endif  // GARNET_LIB_DEBUGGER_UTILS_BREAKPOINTS_H_
