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