xref: /openbsd-src/gnu/llvm/lldb/tools/debugserver/source/DNBArch.h (revision be691f3bb6417f04a68938fadbcaee2d5795e764)
1061da546Spatrick //===-- DNBArch.h -----------------------------------------------*- C++ -*-===//
2061da546Spatrick //
3061da546Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4061da546Spatrick // See https://llvm.org/LICENSE.txt for license information.
5061da546Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6061da546Spatrick //
7061da546Spatrick //===----------------------------------------------------------------------===//
8061da546Spatrick //
9061da546Spatrick //  Created by Greg Clayton on 6/24/07.
10061da546Spatrick //
11061da546Spatrick //===----------------------------------------------------------------------===//
12061da546Spatrick 
13dda28197Spatrick #ifndef LLDB_TOOLS_DEBUGSERVER_SOURCE_DNBARCH_H
14dda28197Spatrick #define LLDB_TOOLS_DEBUGSERVER_SOURCE_DNBARCH_H
15061da546Spatrick 
16061da546Spatrick #include "DNBDefs.h"
17061da546Spatrick #include "MacOSX/MachException.h"
18061da546Spatrick 
19*be691f3bSpatrick #include <cstdio>
20061da546Spatrick #include <mach/mach.h>
21061da546Spatrick 
22061da546Spatrick struct DNBRegisterValue;
23061da546Spatrick struct DNBRegisterSetInfo;
24061da546Spatrick class DNBArchProtocol;
25061da546Spatrick class MachThread;
26061da546Spatrick 
27061da546Spatrick typedef DNBArchProtocol *(*DNBArchCallbackCreate)(MachThread *thread);
28061da546Spatrick typedef const DNBRegisterSetInfo *(*DNBArchCallbackGetRegisterSetInfo)(
29061da546Spatrick     nub_size_t *num_reg_sets);
30061da546Spatrick typedef const uint8_t *(*DNBArchCallbackGetBreakpointOpcode)(
31061da546Spatrick     nub_size_t byte_size);
32061da546Spatrick 
33061da546Spatrick typedef struct DNBArchPluginInfoTag {
34061da546Spatrick   uint32_t cpu_type;
35061da546Spatrick   DNBArchCallbackCreate Create;
36061da546Spatrick   DNBArchCallbackGetRegisterSetInfo GetRegisterSetInfo;
37061da546Spatrick   DNBArchCallbackGetBreakpointOpcode GetBreakpointOpcode;
38061da546Spatrick } DNBArchPluginInfo;
39061da546Spatrick 
40061da546Spatrick class DNBArchProtocol {
41061da546Spatrick public:
42061da546Spatrick   static DNBArchProtocol *Create(MachThread *thread);
43061da546Spatrick 
44061da546Spatrick   static uint32_t GetRegisterCPUType();
45061da546Spatrick 
46061da546Spatrick   static const DNBRegisterSetInfo *GetRegisterSetInfo(nub_size_t *num_reg_sets);
47061da546Spatrick 
48061da546Spatrick   static const uint8_t *GetBreakpointOpcode(nub_size_t byte_size);
49061da546Spatrick 
50061da546Spatrick   static void RegisterArchPlugin(const DNBArchPluginInfo &arch_info);
51061da546Spatrick 
52*be691f3bSpatrick   static uint32_t GetCPUType();
53*be691f3bSpatrick   static uint32_t GetCPUSubType();
54061da546Spatrick 
55*be691f3bSpatrick   static bool SetArchitecture(uint32_t cpu_type, uint32_t cpu_subtype = 0);
56061da546Spatrick 
DNBArchProtocol()57061da546Spatrick   DNBArchProtocol() : m_save_id(0) {}
58061da546Spatrick 
~DNBArchProtocol()59061da546Spatrick   virtual ~DNBArchProtocol() {}
60061da546Spatrick   virtual bool GetRegisterValue(uint32_t set, uint32_t reg,
61061da546Spatrick                                 DNBRegisterValue *value) = 0;
62061da546Spatrick   virtual bool SetRegisterValue(uint32_t set, uint32_t reg,
63061da546Spatrick                                 const DNBRegisterValue *value) = 0;
64061da546Spatrick   virtual nub_size_t GetRegisterContext(void *buf, nub_size_t buf_len) = 0;
65061da546Spatrick   virtual nub_size_t SetRegisterContext(const void *buf,
66061da546Spatrick                                         nub_size_t buf_len) = 0;
67061da546Spatrick   virtual uint32_t SaveRegisterState() = 0;
68061da546Spatrick   virtual bool RestoreRegisterState(uint32_t save_id) = 0;
69061da546Spatrick 
70061da546Spatrick   virtual kern_return_t GetRegisterState(int set, bool force) = 0;
71061da546Spatrick   virtual kern_return_t SetRegisterState(int set) = 0;
72061da546Spatrick   virtual bool RegisterSetStateIsValid(int set) const = 0;
73061da546Spatrick 
74061da546Spatrick   virtual uint64_t GetPC(uint64_t failValue) = 0; // Get program counter
75061da546Spatrick   virtual kern_return_t SetPC(uint64_t value) = 0;
76061da546Spatrick   virtual uint64_t GetSP(uint64_t failValue) = 0; // Get stack pointer
77061da546Spatrick   virtual void ThreadWillResume() = 0;
78061da546Spatrick   virtual bool ThreadDidStop() = 0;
NotifyException(MachException::Data & exc)79061da546Spatrick   virtual bool NotifyException(MachException::Data &exc) { return false; }
NumSupportedHardwareBreakpoints()80061da546Spatrick   virtual uint32_t NumSupportedHardwareBreakpoints() { return 0; }
NumSupportedHardwareWatchpoints()81061da546Spatrick   virtual uint32_t NumSupportedHardwareWatchpoints() { return 0; }
EnableHardwareBreakpoint(nub_addr_t addr,nub_size_t size,bool also_set_on_task)82dda28197Spatrick   virtual uint32_t EnableHardwareBreakpoint(nub_addr_t addr, nub_size_t size,
83dda28197Spatrick                                             bool also_set_on_task) {
84061da546Spatrick     return INVALID_NUB_HW_INDEX;
85061da546Spatrick   }
EnableHardwareWatchpoint(nub_addr_t addr,nub_size_t size,bool read,bool write,bool also_set_on_task)86061da546Spatrick   virtual uint32_t EnableHardwareWatchpoint(nub_addr_t addr, nub_size_t size,
87061da546Spatrick                                             bool read, bool write,
88061da546Spatrick                                             bool also_set_on_task) {
89061da546Spatrick     return INVALID_NUB_HW_INDEX;
90061da546Spatrick   }
DisableHardwareBreakpoint(uint32_t hw_index,bool also_set_on_task)91dda28197Spatrick   virtual bool DisableHardwareBreakpoint(uint32_t hw_index,
92dda28197Spatrick                                          bool also_set_on_task) {
93dda28197Spatrick     return false;
94dda28197Spatrick   }
DisableHardwareWatchpoint(uint32_t hw_index,bool also_set_on_task)95061da546Spatrick   virtual bool DisableHardwareWatchpoint(uint32_t hw_index,
96061da546Spatrick                                          bool also_set_on_task) {
97061da546Spatrick     return false;
98061da546Spatrick   }
GetHardwareWatchpointHit(nub_addr_t & addr)99061da546Spatrick   virtual uint32_t GetHardwareWatchpointHit(nub_addr_t &addr) {
100061da546Spatrick     return INVALID_NUB_HW_INDEX;
101061da546Spatrick   }
StepNotComplete()102061da546Spatrick   virtual bool StepNotComplete() { return false; }
103061da546Spatrick 
104061da546Spatrick protected:
105061da546Spatrick   friend class MachThread;
106061da546Spatrick 
GetNextRegisterStateSaveID()107061da546Spatrick   uint32_t GetNextRegisterStateSaveID() { return ++m_save_id; }
108061da546Spatrick 
109061da546Spatrick   enum {
110061da546Spatrick     Trans_Pending =
111061da546Spatrick         0, // Transaction is pending, and checkpoint state has been snapshotted.
112061da546Spatrick     Trans_Done = 1, // Transaction is done, the current state is committed, and
113061da546Spatrick                     // checkpoint state is irrelevant.
114061da546Spatrick     Trans_Rolled_Back = 2 // Transaction is done, the current state has been
115061da546Spatrick                           // rolled back to the checkpoint state.
116061da546Spatrick   };
StartTransForHWP()117061da546Spatrick   virtual bool StartTransForHWP() { return true; }
RollbackTransForHWP()118061da546Spatrick   virtual bool RollbackTransForHWP() { return true; }
FinishTransForHWP()119061da546Spatrick   virtual bool FinishTransForHWP() { return true; }
120061da546Spatrick 
121061da546Spatrick   uint32_t m_save_id; // An always incrementing integer ID used with
122061da546Spatrick                       // SaveRegisterState/RestoreRegisterState
123061da546Spatrick };
124061da546Spatrick 
125061da546Spatrick #include "MacOSX/arm/DNBArchImpl.h"
126061da546Spatrick #include "MacOSX/arm64/DNBArchImplARM64.h"
127061da546Spatrick #include "MacOSX/i386/DNBArchImplI386.h"
128061da546Spatrick #include "MacOSX/x86_64/DNBArchImplX86_64.h"
129061da546Spatrick 
130061da546Spatrick #endif
131