1// Copyright 2014, VIXL authors
2// All rights reserved.
3//
4// Redistribution and use in source and binary forms, with or without
5// modification, are permitted provided that the following conditions are met:
6//
7//   * Redistributions of source code must retain the above copyright notice,
8//     this list of conditions and the following disclaimer.
9//   * Redistributions in binary form must reproduce the above copyright notice,
10//     this list of conditions and the following disclaimer in the documentation
11//     and/or other materials provided with the distribution.
12//   * Neither the name of ARM Limited nor the names of its contributors may be
13//     used to endorse or promote products derived from this software without
14//     specific prior written permission.
15//
16// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS CONTRIBUTORS "AS IS" AND
17// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
20// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
23// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26
27#ifdef VIXL_INCLUDE_SIMULATOR_AARCH64
28
29#ifndef VIXL_AARCH64_DEBUGGER_AARCH64_H_
30#define VIXL_AARCH64_DEBUGGER_AARCH64_H_
31
32#include <cctype>
33#include <cerrno>
34#include <climits>
35#include <vector>
36
37#include "../globals-vixl.h"
38#include "../utils-vixl.h"
39
40#include "constants-aarch64.h"
41#include "simulator-aarch64.h"
42
43namespace vixl {
44namespace aarch64 {
45
46// Forward declarations.
47class DebugCommand;
48class Token;
49class FormatToken;
50
51class Debugger : public Simulator {
52 public:
53  explicit Debugger(Decoder* decoder, FILE* stream = stdout);
54  ~Debugger();
55
56  virtual void Run() VIXL_OVERRIDE;
57  virtual void VisitException(const Instruction* instr) VIXL_OVERRIDE;
58
59  bool IsDebuggerActive() const { return debugger_active_; }
60  void ActivateDebugger() { debugger_active_ = true; }
61  void DeactivateDebugger() { debugger_active_ = false; }
62
63  // Numbers of instructions to execute before the debugger shell is given
64  // back control.
65  int64_t GetSteps() const { return steps_; }
66  VIXL_DEPRECATED("GetSteps", int64_t steps() const) { return GetSteps(); }
67
68  void SetSteps(int64_t value) {
69    VIXL_ASSERT(value >= 0);
70    steps_ = value;
71  }
72  VIXL_DEPRECATED("SetSteps", void set_steps(int64_t value)) {
73    return SetSteps(value);
74  }
75
76  void PrintInstructions(const void* address,
77                         int64_t count = 1,
78                         const char* prefix = "");
79  void PrintNextInstruction() { PrintInstructions(ReadPc(), 1, "Next: "); }
80  void PrintMemory(const uint8_t* address,
81                   const FormatToken* format,
82                   int64_t count = 1);
83  void PrintRegister(const Register& target_reg,
84                     const char* name,
85                     const FormatToken* format);
86  void PrintFPRegister(const FPRegister& target_fpreg,
87                       const FormatToken* format);
88
89 private:
90  char* ReadCommandLine(const char* prompt, char* buffer, int length);
91  void RunDebuggerShell();
92  void DoBreakpoint(const Instruction* instr);
93
94  bool debugger_active_;
95  int64_t steps_;
96  DebugCommand* last_command_;
97  PrintDisassembler* disasm_;
98  Decoder* printer_;
99
100  // Length of the biggest command line accepted by the debugger shell.
101  static const int kMaxDebugShellLine = 256;
102};
103
104}  // namespace aarch64
105}  // namespace vixl
106
107#endif  // VIXL_AARCH64_DEBUGGER_AARCH64_H_
108
109#endif  // VIXL_INCLUDE_SIMULATOR_AARCH64
110