xref: /openbsd-src/gnu/llvm/lldb/tools/debugserver/source/MacOSX/MachThreadList.h (revision dda2819751e49c83612958492e38917049128b41)
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