1061da546Spatrick //===-- MachThreadList.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/19/07. 10061da546Spatrick // 11061da546Spatrick //===----------------------------------------------------------------------===// 12061da546Spatrick 13*dda28197Spatrick #ifndef LLDB_TOOLS_DEBUGSERVER_SOURCE_MACOSX_MACHTHREADLIST_H 14*dda28197Spatrick #define LLDB_TOOLS_DEBUGSERVER_SOURCE_MACOSX_MACHTHREADLIST_H 15061da546Spatrick 16061da546Spatrick #include "MachThread.h" 17061da546Spatrick #include "ThreadInfo.h" 18061da546Spatrick 19061da546Spatrick class DNBThreadResumeActions; 20061da546Spatrick 21061da546Spatrick class MachThreadList { 22061da546Spatrick public: 23061da546Spatrick MachThreadList(); 24061da546Spatrick ~MachThreadList(); 25061da546Spatrick 26061da546Spatrick void Clear(); 27061da546Spatrick void Dump() const; 28061da546Spatrick bool GetRegisterValue(nub_thread_t tid, uint32_t set, uint32_t reg, 29061da546Spatrick DNBRegisterValue *reg_value) const; 30061da546Spatrick bool SetRegisterValue(nub_thread_t tid, uint32_t set, uint32_t reg, 31061da546Spatrick const DNBRegisterValue *reg_value) const; 32061da546Spatrick nub_size_t GetRegisterContext(nub_thread_t tid, void *buf, size_t buf_len); 33061da546Spatrick nub_size_t SetRegisterContext(nub_thread_t tid, const void *buf, 34061da546Spatrick size_t buf_len); 35061da546Spatrick uint32_t SaveRegisterState(nub_thread_t tid); 36061da546Spatrick bool RestoreRegisterState(nub_thread_t tid, uint32_t save_id); 37061da546Spatrick const char *GetThreadInfo(nub_thread_t tid) const; 38061da546Spatrick void ProcessWillResume(MachProcess *process, 39061da546Spatrick const DNBThreadResumeActions &thread_actions); 40061da546Spatrick uint32_t ProcessDidStop(MachProcess *process); 41061da546Spatrick bool NotifyException(MachException::Data &exc); 42061da546Spatrick bool ShouldStop(bool &step_more); 43061da546Spatrick const char *GetName(nub_thread_t tid); 44061da546Spatrick nub_state_t GetState(nub_thread_t tid); 45061da546Spatrick nub_thread_t SetCurrentThread(nub_thread_t tid); 46061da546Spatrick 47061da546Spatrick ThreadInfo::QoS GetRequestedQoS(nub_thread_t tid, nub_addr_t tsd, 48061da546Spatrick uint64_t dti_qos_class_index); 49061da546Spatrick nub_addr_t GetPThreadT(nub_thread_t tid); 50061da546Spatrick nub_addr_t GetDispatchQueueT(nub_thread_t tid); 51061da546Spatrick nub_addr_t 52061da546Spatrick GetTSDAddressForThread(nub_thread_t tid, 53061da546Spatrick uint64_t plo_pthread_tsd_base_address_offset, 54061da546Spatrick uint64_t plo_pthread_tsd_base_offset, 55061da546Spatrick uint64_t plo_pthread_tsd_entry_size); 56061da546Spatrick 57061da546Spatrick bool GetThreadStoppedReason(nub_thread_t tid, 58061da546Spatrick struct DNBThreadStopInfo *stop_info) const; 59061da546Spatrick void DumpThreadStoppedReason(nub_thread_t tid) const; 60061da546Spatrick bool GetIdentifierInfo(nub_thread_t tid, 61061da546Spatrick thread_identifier_info_data_t *ident_info); 62061da546Spatrick nub_size_t NumThreads() const; 63061da546Spatrick nub_thread_t ThreadIDAtIndex(nub_size_t idx) const; 64061da546Spatrick nub_thread_t CurrentThreadID(); 65061da546Spatrick void CurrentThread(MachThreadSP &threadSP); 66061da546Spatrick void NotifyBreakpointChanged(const DNBBreakpoint *bp); 67061da546Spatrick uint32_t EnableHardwareBreakpoint(const DNBBreakpoint *bp) const; 68061da546Spatrick bool DisableHardwareBreakpoint(const DNBBreakpoint *bp) const; 69061da546Spatrick uint32_t EnableHardwareWatchpoint(const DNBBreakpoint *wp) const; 70061da546Spatrick bool DisableHardwareWatchpoint(const DNBBreakpoint *wp) const; 71061da546Spatrick uint32_t NumSupportedHardwareWatchpoints() const; 72061da546Spatrick 73061da546Spatrick uint32_t GetThreadIndexForThreadStoppedWithSignal(const int signo) const; 74061da546Spatrick 75061da546Spatrick MachThreadSP GetThreadByID(nub_thread_t tid) const; 76061da546Spatrick 77061da546Spatrick MachThreadSP GetThreadByMachPortNumber(thread_t mach_port_number) const; 78061da546Spatrick nub_thread_t GetThreadIDByMachPortNumber(thread_t mach_port_number) const; 79061da546Spatrick thread_t GetMachPortNumberByThreadID(nub_thread_t globally_unique_id) const; 80061da546Spatrick 81061da546Spatrick protected: 82061da546Spatrick typedef std::vector<MachThreadSP> collection; 83061da546Spatrick typedef collection::iterator iterator; 84061da546Spatrick typedef collection::const_iterator const_iterator; 85061da546Spatrick 86*dda28197Spatrick enum class HardwareBreakpointAction { 87*dda28197Spatrick EnableWatchpoint, 88*dda28197Spatrick DisableWatchpoint, 89*dda28197Spatrick EnableBreakpoint, 90*dda28197Spatrick DisableBreakpoint, 91*dda28197Spatrick }; 92*dda28197Spatrick 93*dda28197Spatrick uint32_t DoHardwareBreakpointAction(const DNBBreakpoint *bp, 94*dda28197Spatrick HardwareBreakpointAction action) const; 95*dda28197Spatrick 96061da546Spatrick uint32_t UpdateThreadList(MachProcess *process, bool update, 97061da546Spatrick collection *num_threads = NULL); 98061da546Spatrick // const_iterator FindThreadByID (thread_t tid) const; 99061da546Spatrick 100061da546Spatrick collection m_threads; 101061da546Spatrick mutable PThreadMutex m_threads_mutex; 102061da546Spatrick MachThreadSP m_current_thread; 103061da546Spatrick bool m_is_64_bit; 104061da546Spatrick }; 105061da546Spatrick 106*dda28197Spatrick #endif // LLDB_TOOLS_DEBUGSERVER_SOURCE_MACOSX_MACHTHREADLIST_H 107