File: DNBArch.h

package info (click to toggle)
llvm-toolchain-13 1%3A13.0.1-6~deb11u1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 1,418,812 kB
  • sloc: cpp: 5,290,827; ansic: 996,570; asm: 544,593; python: 188,212; objc: 72,027; lisp: 30,291; f90: 25,395; sh: 24,900; javascript: 9,780; pascal: 9,398; perl: 7,484; ml: 5,432; awk: 3,523; makefile: 2,892; xml: 953; cs: 573; fortran: 539
file content (130 lines) | stat: -rw-r--r-- 4,904 bytes parent folder | download | duplicates (9)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
//===-- DNBArch.h -----------------------------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
//  Created by Greg Clayton on 6/24/07.
//
//===----------------------------------------------------------------------===//

#ifndef LLDB_TOOLS_DEBUGSERVER_SOURCE_DNBARCH_H
#define LLDB_TOOLS_DEBUGSERVER_SOURCE_DNBARCH_H

#include "DNBDefs.h"
#include "MacOSX/MachException.h"

#include <cstdio>
#include <mach/mach.h>

struct DNBRegisterValue;
struct DNBRegisterSetInfo;
class DNBArchProtocol;
class MachThread;

typedef DNBArchProtocol *(*DNBArchCallbackCreate)(MachThread *thread);
typedef const DNBRegisterSetInfo *(*DNBArchCallbackGetRegisterSetInfo)(
    nub_size_t *num_reg_sets);
typedef const uint8_t *(*DNBArchCallbackGetBreakpointOpcode)(
    nub_size_t byte_size);

typedef struct DNBArchPluginInfoTag {
  uint32_t cpu_type;
  DNBArchCallbackCreate Create;
  DNBArchCallbackGetRegisterSetInfo GetRegisterSetInfo;
  DNBArchCallbackGetBreakpointOpcode GetBreakpointOpcode;
} DNBArchPluginInfo;

class DNBArchProtocol {
public:
  static DNBArchProtocol *Create(MachThread *thread);

  static uint32_t GetRegisterCPUType();

  static const DNBRegisterSetInfo *GetRegisterSetInfo(nub_size_t *num_reg_sets);

  static const uint8_t *GetBreakpointOpcode(nub_size_t byte_size);

  static void RegisterArchPlugin(const DNBArchPluginInfo &arch_info);

  static uint32_t GetCPUType();
  static uint32_t GetCPUSubType();

  static bool SetArchitecture(uint32_t cpu_type, uint32_t cpu_subtype = 0);

  DNBArchProtocol() : m_save_id(0) {}

  virtual ~DNBArchProtocol() {}
  virtual bool GetRegisterValue(uint32_t set, uint32_t reg,
                                DNBRegisterValue *value) = 0;
  virtual bool SetRegisterValue(uint32_t set, uint32_t reg,
                                const DNBRegisterValue *value) = 0;
  virtual nub_size_t GetRegisterContext(void *buf, nub_size_t buf_len) = 0;
  virtual nub_size_t SetRegisterContext(const void *buf,
                                        nub_size_t buf_len) = 0;
  virtual uint32_t SaveRegisterState() = 0;
  virtual bool RestoreRegisterState(uint32_t save_id) = 0;

  virtual kern_return_t GetRegisterState(int set, bool force) = 0;
  virtual kern_return_t SetRegisterState(int set) = 0;
  virtual bool RegisterSetStateIsValid(int set) const = 0;

  virtual uint64_t GetPC(uint64_t failValue) = 0; // Get program counter
  virtual kern_return_t SetPC(uint64_t value) = 0;
  virtual uint64_t GetSP(uint64_t failValue) = 0; // Get stack pointer
  virtual void ThreadWillResume() = 0;
  virtual bool ThreadDidStop() = 0;
  virtual bool NotifyException(MachException::Data &exc) { return false; }
  virtual uint32_t NumSupportedHardwareBreakpoints() { return 0; }
  virtual uint32_t NumSupportedHardwareWatchpoints() { return 0; }
  virtual uint32_t EnableHardwareBreakpoint(nub_addr_t addr, nub_size_t size,
                                            bool also_set_on_task) {
    return INVALID_NUB_HW_INDEX;
  }
  virtual uint32_t EnableHardwareWatchpoint(nub_addr_t addr, nub_size_t size,
                                            bool read, bool write,
                                            bool also_set_on_task) {
    return INVALID_NUB_HW_INDEX;
  }
  virtual bool DisableHardwareBreakpoint(uint32_t hw_index,
                                         bool also_set_on_task) {
    return false;
  }
  virtual bool DisableHardwareWatchpoint(uint32_t hw_index,
                                         bool also_set_on_task) {
    return false;
  }
  virtual uint32_t GetHardwareWatchpointHit(nub_addr_t &addr) {
    return INVALID_NUB_HW_INDEX;
  }
  virtual bool StepNotComplete() { return false; }

protected:
  friend class MachThread;

  uint32_t GetNextRegisterStateSaveID() { return ++m_save_id; }

  enum {
    Trans_Pending =
        0, // Transaction is pending, and checkpoint state has been snapshotted.
    Trans_Done = 1, // Transaction is done, the current state is committed, and
                    // checkpoint state is irrelevant.
    Trans_Rolled_Back = 2 // Transaction is done, the current state has been
                          // rolled back to the checkpoint state.
  };
  virtual bool StartTransForHWP() { return true; }
  virtual bool RollbackTransForHWP() { return true; }
  virtual bool FinishTransForHWP() { return true; }

  uint32_t m_save_id; // An always incrementing integer ID used with
                      // SaveRegisterState/RestoreRegisterState
};

#include "MacOSX/arm/DNBArchImpl.h"
#include "MacOSX/arm64/DNBArchImplARM64.h"
#include "MacOSX/i386/DNBArchImplI386.h"
#include "MacOSX/x86_64/DNBArchImplX86_64.h"

#endif