1 //===-- MachThreadList.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-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 //  Created by Greg Clayton on 6/19/07.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #ifndef LLDB_TOOLS_DEBUGSERVER_SOURCE_MACOSX_MACHTHREADLIST_H
14 #define LLDB_TOOLS_DEBUGSERVER_SOURCE_MACOSX_MACHTHREADLIST_H
15 
16 #include "MachThread.h"
17 #include "ThreadInfo.h"
18 
19 class DNBThreadResumeActions;
20 
21 class MachThreadList {
22 public:
23   MachThreadList();
24   ~MachThreadList();
25 
26   void Clear();
27   void Dump() const;
28   bool GetRegisterValue(nub_thread_t tid, uint32_t set, uint32_t reg,
29                         DNBRegisterValue *reg_value) const;
30   bool SetRegisterValue(nub_thread_t tid, uint32_t set, uint32_t reg,
31                         const DNBRegisterValue *reg_value) const;
32   nub_size_t GetRegisterContext(nub_thread_t tid, void *buf, size_t buf_len);
33   nub_size_t SetRegisterContext(nub_thread_t tid, const void *buf,
34                                 size_t buf_len);
35   uint32_t SaveRegisterState(nub_thread_t tid);
36   bool RestoreRegisterState(nub_thread_t tid, uint32_t save_id);
37   const char *GetThreadInfo(nub_thread_t tid) const;
38   void ProcessWillResume(MachProcess *process,
39                          const DNBThreadResumeActions &thread_actions);
40   uint32_t ProcessDidStop(MachProcess *process);
41   bool NotifyException(MachException::Data &exc);
42   bool ShouldStop(bool &step_more);
43   const char *GetName(nub_thread_t tid);
44   nub_state_t GetState(nub_thread_t tid);
45   nub_thread_t SetCurrentThread(nub_thread_t tid);
46 
47   ThreadInfo::QoS GetRequestedQoS(nub_thread_t tid, nub_addr_t tsd,
48                                   uint64_t dti_qos_class_index);
49   nub_addr_t GetPThreadT(nub_thread_t tid);
50   nub_addr_t GetDispatchQueueT(nub_thread_t tid);
51   nub_addr_t
52   GetTSDAddressForThread(nub_thread_t tid,
53                          uint64_t plo_pthread_tsd_base_address_offset,
54                          uint64_t plo_pthread_tsd_base_offset,
55                          uint64_t plo_pthread_tsd_entry_size);
56 
57   bool GetThreadStoppedReason(nub_thread_t tid,
58                               struct DNBThreadStopInfo *stop_info) const;
59   void DumpThreadStoppedReason(nub_thread_t tid) const;
60   bool GetIdentifierInfo(nub_thread_t tid,
61                          thread_identifier_info_data_t *ident_info);
62   nub_size_t NumThreads() const;
63   nub_thread_t ThreadIDAtIndex(nub_size_t idx) const;
64   nub_thread_t CurrentThreadID();
65   void CurrentThread(MachThreadSP &threadSP);
66   void NotifyBreakpointChanged(const DNBBreakpoint *bp);
67   uint32_t EnableHardwareBreakpoint(const DNBBreakpoint *bp) const;
68   bool DisableHardwareBreakpoint(const DNBBreakpoint *bp) const;
69   uint32_t EnableHardwareWatchpoint(const DNBBreakpoint *wp) const;
70   bool DisableHardwareWatchpoint(const DNBBreakpoint *wp) const;
71   uint32_t NumSupportedHardwareWatchpoints() const;
72 
73   uint32_t GetThreadIndexForThreadStoppedWithSignal(const int signo) const;
74 
75   MachThreadSP GetThreadByID(nub_thread_t tid) const;
76 
77   MachThreadSP GetThreadByMachPortNumber(thread_t mach_port_number) const;
78   nub_thread_t GetThreadIDByMachPortNumber(thread_t mach_port_number) const;
79   thread_t GetMachPortNumberByThreadID(nub_thread_t globally_unique_id) const;
80 
81 protected:
82   typedef std::vector<MachThreadSP> collection;
83   typedef collection::iterator iterator;
84   typedef collection::const_iterator const_iterator;
85 
86   enum class HardwareBreakpointAction {
87     EnableWatchpoint,
88     DisableWatchpoint,
89     EnableBreakpoint,
90     DisableBreakpoint,
91   };
92 
93   uint32_t DoHardwareBreakpointAction(const DNBBreakpoint *bp,
94                                       HardwareBreakpointAction action) const;
95 
96   uint32_t UpdateThreadList(MachProcess *process, bool update,
97                             collection *num_threads = NULL);
98   //  const_iterator  FindThreadByID (thread_t tid) const;
99 
100   collection m_threads;
101   mutable PThreadMutex m_threads_mutex;
102   MachThreadSP m_current_thread;
103   bool m_is_64_bit;
104 };
105 
106 #endif // LLDB_TOOLS_DEBUGSERVER_SOURCE_MACOSX_MACHTHREADLIST_H
107