109 lines · c
1//===-- RegisterContextThreadMemory.h ---------------------------*- C++ -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#ifndef LLDB_SOURCE_PLUGINS_PROCESS_UTILITY_REGISTERCONTEXTTHREADMEMORY_H10#define LLDB_SOURCE_PLUGINS_PROCESS_UTILITY_REGISTERCONTEXTTHREADMEMORY_H11 12#include <vector>13 14#include "lldb/Symbol/SymbolContext.h"15#include "lldb/Target/RegisterContext.h"16#include "lldb/lldb-private.h"17 18namespace lldb_private {19 20class RegisterContextThreadMemory : public lldb_private::RegisterContext {21public:22 RegisterContextThreadMemory(Thread &thread, lldb::addr_t register_data_addr);23 24 ~RegisterContextThreadMemory() override;25 26 void InvalidateAllRegisters() override;27 28 size_t GetRegisterCount() override;29 30 const RegisterInfo *GetRegisterInfoAtIndex(size_t reg) override;31 32 size_t GetRegisterSetCount() override;33 34 const RegisterSet *GetRegisterSet(size_t reg_set) override;35 36 bool ReadRegister(const RegisterInfo *reg_info,37 RegisterValue ®_value) override;38 39 bool WriteRegister(const RegisterInfo *reg_info,40 const RegisterValue ®_value) override;41 42 // These two functions are used to implement "push" and "pop" of register43 // states. They are used primarily44 // for expression evaluation, where we need to push a new state (storing the45 // old one in data_sp) and then46 // restoring the original state by passing the data_sp we got from47 // ReadAllRegisters to WriteAllRegisterValues.48 // ReadAllRegisters will do what is necessary to return a coherent set of49 // register values for this thread, which50 // may mean e.g. interrupting a thread that is sitting in a kernel trap. That51 // is a somewhat disruptive operation,52 // so these API's should only be used when this behavior is needed.53 54 bool ReadAllRegisterValues(lldb::WritableDataBufferSP &data_sp) override;55 bool ReadAllRegisterValues(56 lldb_private::RegisterCheckpoint ®_checkpoint) override;57 58 bool WriteAllRegisterValues(const lldb::DataBufferSP &data_sp) override;59 bool WriteAllRegisterValues(60 const lldb_private::RegisterCheckpoint ®_checkpoint) override;61 62 bool CopyFromRegisterContext(lldb::RegisterContextSP context);63 64 uint32_t ConvertRegisterKindToRegisterNumber(lldb::RegisterKind kind,65 uint32_t num) override;66 67 uint32_t NumSupportedHardwareBreakpoints() override;68 69 uint32_t SetHardwareBreakpoint(lldb::addr_t addr, size_t size) override;70 71 bool ClearHardwareBreakpoint(uint32_t hw_idx) override;72 73 uint32_t NumSupportedHardwareWatchpoints() override;74 75 uint32_t SetHardwareWatchpoint(lldb::addr_t addr, size_t size, bool read,76 bool write) override;77 78 bool ClearHardwareWatchpoint(uint32_t hw_index) override;79 80 bool HardwareSingleStep(bool enable) override;81 82 Status ReadRegisterValueFromMemory(const lldb_private::RegisterInfo *reg_info,83 lldb::addr_t src_addr, uint32_t src_len,84 RegisterValue ®_value) override;85 86 Status WriteRegisterValueToMemory(const lldb_private::RegisterInfo *reg_info,87 lldb::addr_t dst_addr, uint32_t dst_len,88 const RegisterValue ®_value) override;89 90protected:91 void UpdateRegisterContext();92 93 lldb::ThreadWP m_thread_wp;94 lldb::RegisterContextSP m_reg_ctx_sp;95 lldb::addr_t m_register_data_addr;96 uint32_t m_stop_id;97 98private:99 RegisterContextThreadMemory(const RegisterContextThreadMemory &) = delete;100 const RegisterContextThreadMemory &101 operator=(const RegisterContextThreadMemory &) = delete;102 103 std::mutex m_update_register_ctx_lock;104};105 106} // namespace lldb_private107 108#endif // LLDB_SOURCE_PLUGINS_PROCESS_UTILITY_REGISTERCONTEXTTHREADMEMORY_H109