summaryrefslogtreecommitdiffstats
path: root/gnu/llvm/lldb/tools/debugserver/source/MacOSX/MachThread.h
diff options
context:
space:
mode:
authorpatrick <patrick@openbsd.org>2020-08-03 14:33:06 +0000
committerpatrick <patrick@openbsd.org>2020-08-03 14:33:06 +0000
commit061da546b983eb767bad15e67af1174fb0bcf31c (patch)
tree83c78b820819d70aa40c36d90447978b300078c5 /gnu/llvm/lldb/tools/debugserver/source/MacOSX/MachThread.h
parentImport LLVM 10.0.0 release including clang, lld and lldb. (diff)
downloadwireguard-openbsd-061da546b983eb767bad15e67af1174fb0bcf31c.tar.xz
wireguard-openbsd-061da546b983eb767bad15e67af1174fb0bcf31c.zip
Import LLVM 10.0.0 release including clang, lld and lldb.
ok hackroom tested by plenty
Diffstat (limited to 'gnu/llvm/lldb/tools/debugserver/source/MacOSX/MachThread.h')
-rw-r--r--gnu/llvm/lldb/tools/debugserver/source/MacOSX/MachThread.h169
1 files changed, 169 insertions, 0 deletions
diff --git a/gnu/llvm/lldb/tools/debugserver/source/MacOSX/MachThread.h b/gnu/llvm/lldb/tools/debugserver/source/MacOSX/MachThread.h
new file mode 100644
index 00000000000..1634522fde4
--- /dev/null
+++ b/gnu/llvm/lldb/tools/debugserver/source/MacOSX/MachThread.h
@@ -0,0 +1,169 @@
+//===-- MachThread.h --------------------------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// Created by Greg Clayton on 6/19/07.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef __MachThread_h__
+#define __MachThread_h__
+
+#include <string>
+#include <vector>
+
+#include <libproc.h>
+#include <mach/mach.h>
+#include <pthread.h>
+#include <sys/signal.h>
+
+#include "DNBArch.h"
+#include "DNBRegisterInfo.h"
+#include "MachException.h"
+#include "PThreadCondition.h"
+#include "PThreadMutex.h"
+
+#include "ThreadInfo.h"
+
+class DNBBreakpoint;
+class MachProcess;
+class MachThreadList;
+
+class MachThread {
+public:
+ MachThread(MachProcess *process, bool is_64_bit,
+ uint64_t unique_thread_id = 0, thread_t mach_port_number = 0);
+ ~MachThread();
+
+ MachProcess *Process() { return m_process; }
+ const MachProcess *Process() const { return m_process; }
+ nub_process_t ProcessID() const;
+ void Dump(uint32_t index);
+ uint64_t ThreadID() const { return m_unique_id; }
+ thread_t MachPortNumber() const { return m_mach_port_number; }
+ thread_t InferiorThreadID() const;
+
+ uint32_t SequenceID() const { return m_seq_id; }
+ static bool ThreadIDIsValid(
+ uint64_t thread); // The 64-bit system-wide unique thread identifier
+ static bool MachPortNumberIsValid(thread_t thread); // The mach port # for
+ // this thread in
+ // debugserver namespace
+ void Resume(bool others_stopped);
+ void Suspend();
+ bool SetSuspendCountBeforeResume(bool others_stopped);
+ bool RestoreSuspendCountAfterStop();
+
+ bool GetRegisterState(int flavor, bool force);
+ bool SetRegisterState(int flavor);
+ uint64_t
+ GetPC(uint64_t failValue = INVALID_NUB_ADDRESS); // Get program counter
+ bool SetPC(uint64_t value); // Set program counter
+ uint64_t GetSP(uint64_t failValue = INVALID_NUB_ADDRESS); // Get stack pointer
+
+ DNBBreakpoint *CurrentBreakpoint();
+ uint32_t EnableHardwareBreakpoint(const DNBBreakpoint *breakpoint);
+ uint32_t EnableHardwareWatchpoint(const DNBBreakpoint *watchpoint,
+ bool also_set_on_task);
+ bool DisableHardwareBreakpoint(const DNBBreakpoint *breakpoint);
+ bool DisableHardwareWatchpoint(const DNBBreakpoint *watchpoint,
+ bool also_set_on_task);
+ uint32_t NumSupportedHardwareWatchpoints() const;
+ bool RollbackTransForHWP();
+ bool FinishTransForHWP();
+
+ nub_state_t GetState();
+ void SetState(nub_state_t state);
+
+ void ThreadWillResume(const DNBThreadResumeAction *thread_action,
+ bool others_stopped = false);
+ bool ShouldStop(bool &step_more);
+ bool IsStepping();
+ bool ThreadDidStop();
+ bool NotifyException(MachException::Data &exc);
+ const MachException::Data &GetStopException() { return m_stop_exception; }
+
+ nub_size_t GetNumRegistersInSet(nub_size_t regSet) const;
+ const char *GetRegisterSetName(nub_size_t regSet) const;
+ const DNBRegisterInfo *GetRegisterInfo(nub_size_t regSet,
+ nub_size_t regIndex) const;
+ void DumpRegisterState(nub_size_t regSet);
+ const DNBRegisterSetInfo *GetRegisterSetInfo(nub_size_t *num_reg_sets) const;
+ bool GetRegisterValue(uint32_t reg_set_idx, uint32_t reg_idx,
+ DNBRegisterValue *reg_value);
+ bool SetRegisterValue(uint32_t reg_set_idx, uint32_t reg_idx,
+ const DNBRegisterValue *reg_value);
+ nub_size_t GetRegisterContext(void *buf, nub_size_t buf_len);
+ nub_size_t SetRegisterContext(const void *buf, nub_size_t buf_len);
+ uint32_t SaveRegisterState();
+ bool RestoreRegisterState(uint32_t save_id);
+
+ void NotifyBreakpointChanged(const DNBBreakpoint *bp) {}
+
+ bool IsUserReady();
+ struct thread_basic_info *GetBasicInfo();
+ const char *GetBasicInfoAsString() const;
+ const char *GetName();
+
+ DNBArchProtocol *GetArchProtocol() { return m_arch_up.get(); }
+
+ ThreadInfo::QoS GetRequestedQoS(nub_addr_t tsd, uint64_t dti_qos_class_index);
+ nub_addr_t GetPThreadT();
+ nub_addr_t GetDispatchQueueT();
+ nub_addr_t
+ GetTSDAddressForThread(uint64_t plo_pthread_tsd_base_address_offset,
+ uint64_t plo_pthread_tsd_base_offset,
+ uint64_t plo_pthread_tsd_entry_size);
+
+ static uint64_t GetGloballyUniqueThreadIDForMachPortID(thread_t mach_port_id);
+
+protected:
+ static bool GetBasicInfo(thread_t threadID,
+ struct thread_basic_info *basic_info);
+
+ bool GetIdentifierInfo();
+
+ // const char *
+ // GetDispatchQueueName();
+ //
+ MachProcess *m_process; // The process that owns this thread
+ uint64_t m_unique_id; // The globally unique ID for this thread (nub_thread_t)
+ thread_t m_mach_port_number; // The mach port # for this thread in debugserver
+ // namesp.
+ uint32_t m_seq_id; // A Sequential ID that increments with each new thread
+ nub_state_t m_state; // The state of our process
+ PThreadMutex m_state_mutex; // Multithreaded protection for m_state
+ struct thread_basic_info m_basic_info; // Basic information for a thread used
+ // to see if a thread is valid
+ int32_t m_suspend_count; // The current suspend count > 0 means we have
+ // suspended m_suspendCount times,
+ // < 0 means we have resumed it m_suspendCount
+ // times.
+ MachException::Data m_stop_exception; // The best exception that describes why
+ // this thread is stopped
+ std::unique_ptr<DNBArchProtocol>
+ m_arch_up; // Arch specific information for register state and more
+ const DNBRegisterSetInfo
+ *m_reg_sets; // Register set information for this thread
+ nub_size_t m_num_reg_sets;
+ thread_identifier_info_data_t m_ident_info;
+ struct proc_threadinfo m_proc_threadinfo;
+ std::string m_dispatch_queue_name;
+ bool m_is_64_bit;
+
+ // qos_class_t _pthread_qos_class_decode(pthread_priority_t priority, int *,
+ // unsigned long *);
+ unsigned int (*m_pthread_qos_class_decode)(unsigned long priority, int *,
+ unsigned long *);
+
+private:
+ friend class MachThreadList;
+};
+
+typedef std::shared_ptr<MachThread> MachThreadSP;
+
+#endif