130fdc8d8SChris Lattner //===-- MachThreadList.h ----------------------------------------*- C++ -*-===//
230fdc8d8SChris Lattner //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
630fdc8d8SChris Lattner //
730fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
830fdc8d8SChris Lattner //
930fdc8d8SChris Lattner //  Created by Greg Clayton on 6/19/07.
1030fdc8d8SChris Lattner //
1130fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
1230fdc8d8SChris Lattner 
13*cdc514e4SJonas Devlieghere #ifndef LLDB_TOOLS_DEBUGSERVER_SOURCE_MACOSX_MACHTHREADLIST_H
14*cdc514e4SJonas Devlieghere #define LLDB_TOOLS_DEBUGSERVER_SOURCE_MACOSX_MACHTHREADLIST_H
1530fdc8d8SChris Lattner 
1630fdc8d8SChris Lattner #include "MachThread.h"
17705b1809SJason Molenda #include "ThreadInfo.h"
1830fdc8d8SChris Lattner 
1930fdc8d8SChris Lattner class DNBThreadResumeActions;
2030fdc8d8SChris Lattner 
21b9c1b51eSKate Stone class MachThreadList {
2230fdc8d8SChris Lattner public:
2330fdc8d8SChris Lattner   MachThreadList();
2430fdc8d8SChris Lattner   ~MachThreadList();
2530fdc8d8SChris Lattner 
2630fdc8d8SChris Lattner   void Clear();
2730fdc8d8SChris Lattner   void Dump() const;
28b9c1b51eSKate Stone   bool GetRegisterValue(nub_thread_t tid, uint32_t set, uint32_t reg,
29b9c1b51eSKate Stone                         DNBRegisterValue *reg_value) const;
30b9c1b51eSKate Stone   bool SetRegisterValue(nub_thread_t tid, uint32_t set, uint32_t reg,
31b9c1b51eSKate Stone                         const DNBRegisterValue *reg_value) const;
3230fdc8d8SChris Lattner   nub_size_t GetRegisterContext(nub_thread_t tid, void *buf, size_t buf_len);
33b9c1b51eSKate Stone   nub_size_t SetRegisterContext(nub_thread_t tid, const void *buf,
34b9c1b51eSKate Stone                                 size_t buf_len);
35f74cf86bSGreg Clayton   uint32_t SaveRegisterState(nub_thread_t tid);
36f74cf86bSGreg Clayton   bool RestoreRegisterState(nub_thread_t tid, uint32_t save_id);
3730fdc8d8SChris Lattner   const char *GetThreadInfo(nub_thread_t tid) const;
38b9c1b51eSKate Stone   void ProcessWillResume(MachProcess *process,
39b9c1b51eSKate Stone                          const DNBThreadResumeActions &thread_actions);
4030fdc8d8SChris Lattner   uint32_t ProcessDidStop(MachProcess *process);
4130fdc8d8SChris Lattner   bool NotifyException(MachException::Data &exc);
4230fdc8d8SChris Lattner   bool ShouldStop(bool &step_more);
431c73911dSJason Molenda   const char *GetName(nub_thread_t tid);
441c73911dSJason Molenda   nub_state_t GetState(nub_thread_t tid);
451c73911dSJason Molenda   nub_thread_t SetCurrentThread(nub_thread_t tid);
46705b1809SJason Molenda 
47b9c1b51eSKate Stone   ThreadInfo::QoS GetRequestedQoS(nub_thread_t tid, nub_addr_t tsd,
48b9c1b51eSKate Stone                                   uint64_t dti_qos_class_index);
49705b1809SJason Molenda   nub_addr_t GetPThreadT(nub_thread_t tid);
50705b1809SJason Molenda   nub_addr_t GetDispatchQueueT(nub_thread_t tid);
51b9c1b51eSKate Stone   nub_addr_t
52b9c1b51eSKate Stone   GetTSDAddressForThread(nub_thread_t tid,
53b9c1b51eSKate Stone                          uint64_t plo_pthread_tsd_base_address_offset,
54b9c1b51eSKate Stone                          uint64_t plo_pthread_tsd_base_offset,
55b9c1b51eSKate Stone                          uint64_t plo_pthread_tsd_entry_size);
56705b1809SJason Molenda 
57b9c1b51eSKate Stone   bool GetThreadStoppedReason(nub_thread_t tid,
58b9c1b51eSKate Stone                               struct DNBThreadStopInfo *stop_info) const;
5930fdc8d8SChris Lattner   void DumpThreadStoppedReason(nub_thread_t tid) const;
60b9c1b51eSKate Stone   bool GetIdentifierInfo(nub_thread_t tid,
61b9c1b51eSKate Stone                          thread_identifier_info_data_t *ident_info);
6230fdc8d8SChris Lattner   nub_size_t NumThreads() const;
6330fdc8d8SChris Lattner   nub_thread_t ThreadIDAtIndex(nub_size_t idx) const;
6430fdc8d8SChris Lattner   nub_thread_t CurrentThreadID();
6530fdc8d8SChris Lattner   void CurrentThread(MachThreadSP &threadSP);
6630fdc8d8SChris Lattner   void NotifyBreakpointChanged(const DNBBreakpoint *bp);
6730fdc8d8SChris Lattner   uint32_t EnableHardwareBreakpoint(const DNBBreakpoint *bp) const;
6830fdc8d8SChris Lattner   bool DisableHardwareBreakpoint(const DNBBreakpoint *bp) const;
6930fdc8d8SChris Lattner   uint32_t EnableHardwareWatchpoint(const DNBBreakpoint *wp) const;
7030fdc8d8SChris Lattner   bool DisableHardwareWatchpoint(const DNBBreakpoint *wp) const;
7164637205SJohnny Chen   uint32_t NumSupportedHardwareWatchpoints() const;
7264637205SJohnny Chen 
7358d1c9a4SGreg Clayton   uint32_t GetThreadIndexForThreadStoppedWithSignal(const int signo) const;
7430fdc8d8SChris Lattner 
75e2d4f0d7SGreg Clayton   MachThreadSP GetThreadByID(nub_thread_t tid) const;
763af9ea56SGreg Clayton 
771c73911dSJason Molenda   MachThreadSP GetThreadByMachPortNumber(thread_t mach_port_number) const;
781c73911dSJason Molenda   nub_thread_t GetThreadIDByMachPortNumber(thread_t mach_port_number) const;
7907c446baSJason Molenda   thread_t GetMachPortNumberByThreadID(nub_thread_t globally_unique_id) const;
801c73911dSJason Molenda 
8130fdc8d8SChris Lattner protected:
8230fdc8d8SChris Lattner   typedef std::vector<MachThreadSP> collection;
8330fdc8d8SChris Lattner   typedef collection::iterator iterator;
8430fdc8d8SChris Lattner   typedef collection::const_iterator const_iterator;
8530fdc8d8SChris Lattner 
862981eceeSJonas Devlieghere   enum class HardwareBreakpointAction {
872981eceeSJonas Devlieghere     EnableWatchpoint,
882981eceeSJonas Devlieghere     DisableWatchpoint,
899902c8e3SJonas Devlieghere     EnableBreakpoint,
909902c8e3SJonas Devlieghere     DisableBreakpoint,
912981eceeSJonas Devlieghere   };
922981eceeSJonas Devlieghere 
939902c8e3SJonas Devlieghere   uint32_t DoHardwareBreakpointAction(const DNBBreakpoint *bp,
942981eceeSJonas Devlieghere                                       HardwareBreakpointAction action) const;
952981eceeSJonas Devlieghere 
96b9c1b51eSKate Stone   uint32_t UpdateThreadList(MachProcess *process, bool update,
97b9c1b51eSKate Stone                             collection *num_threads = NULL);
9830fdc8d8SChris Lattner   //  const_iterator  FindThreadByID (thread_t tid) const;
9930fdc8d8SChris Lattner 
10030fdc8d8SChris Lattner   collection m_threads;
101e2d4f0d7SGreg Clayton   mutable PThreadMutex m_threads_mutex;
10230fdc8d8SChris Lattner   MachThreadSP m_current_thread;
103705b1809SJason Molenda   bool m_is_64_bit;
10430fdc8d8SChris Lattner };
10530fdc8d8SChris Lattner 
106*cdc514e4SJonas Devlieghere #endif // LLDB_TOOLS_DEBUGSERVER_SOURCE_MACOSX_MACHTHREADLIST_H
107