11a3d19ddSKamil Rytarowski //===-- NativeThreadNetBSD.h ---------------------------------- -*- C++ -*-===//
21a3d19ddSKamil Rytarowski //
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
61a3d19ddSKamil Rytarowski //
71a3d19ddSKamil Rytarowski //===----------------------------------------------------------------------===//
81a3d19ddSKamil Rytarowski 
91a3d19ddSKamil Rytarowski #ifndef liblldb_NativeThreadNetBSD_H_
101a3d19ddSKamil Rytarowski #define liblldb_NativeThreadNetBSD_H_
111a3d19ddSKamil Rytarowski 
121a3d19ddSKamil Rytarowski #include "lldb/Host/common/NativeThreadProtocol.h"
131a3d19ddSKamil Rytarowski 
14d970d4d4SMichał Górny #include "Plugins/Process/NetBSD/NativeRegisterContextNetBSD.h"
15d970d4d4SMichał Górny 
16f40f8fc4SPavel Labath #include <csignal>
1736e23ecaSKamil Rytarowski #include <map>
1836e23ecaSKamil Rytarowski #include <string>
1936e23ecaSKamil Rytarowski 
201a3d19ddSKamil Rytarowski namespace lldb_private {
211a3d19ddSKamil Rytarowski namespace process_netbsd {
221a3d19ddSKamil Rytarowski 
231a3d19ddSKamil Rytarowski class NativeProcessNetBSD;
241a3d19ddSKamil Rytarowski 
251a3d19ddSKamil Rytarowski class NativeThreadNetBSD : public NativeThreadProtocol {
261a3d19ddSKamil Rytarowski   friend class NativeProcessNetBSD;
271a3d19ddSKamil Rytarowski 
281a3d19ddSKamil Rytarowski public:
2982abefa4SPavel Labath   NativeThreadNetBSD(NativeProcessNetBSD &process, lldb::tid_t tid);
30f07a9995SKamil Rytarowski 
31f07a9995SKamil Rytarowski   // NativeThreadProtocol Interface
32f07a9995SKamil Rytarowski   std::string GetName() override;
33f07a9995SKamil Rytarowski 
34f07a9995SKamil Rytarowski   lldb::StateType GetState() override;
35f07a9995SKamil Rytarowski 
36f07a9995SKamil Rytarowski   bool GetStopReason(ThreadStopInfo &stop_info,
37f07a9995SKamil Rytarowski                      std::string &description) override;
38f07a9995SKamil Rytarowski 
39d970d4d4SMichał Górny   NativeRegisterContextNetBSD &GetRegisterContext() override;
40f07a9995SKamil Rytarowski 
4197206d57SZachary Turner   Status SetWatchpoint(lldb::addr_t addr, size_t size, uint32_t watch_flags,
42f07a9995SKamil Rytarowski                        bool hardware) override;
43f07a9995SKamil Rytarowski 
4497206d57SZachary Turner   Status RemoveWatchpoint(lldb::addr_t addr) override;
45f07a9995SKamil Rytarowski 
4697206d57SZachary Turner   Status SetHardwareBreakpoint(lldb::addr_t addr, size_t size) override;
47f07a9995SKamil Rytarowski 
4897206d57SZachary Turner   Status RemoveHardwareBreakpoint(lldb::addr_t addr) override;
49f07a9995SKamil Rytarowski 
50f07a9995SKamil Rytarowski private:
51f07a9995SKamil Rytarowski   // Interface for friend classes
52f07a9995SKamil Rytarowski 
538d9400b6SMichał Górny   Status Resume();
548d9400b6SMichał Górny   Status SingleStep();
558d9400b6SMichał Górny   Status Suspend();
568d9400b6SMichał Górny 
57f07a9995SKamil Rytarowski   void SetStoppedBySignal(uint32_t signo, const siginfo_t *info = nullptr);
58f07a9995SKamil Rytarowski   void SetStoppedByBreakpoint();
593eef2b5eSKamil Rytarowski   void SetStoppedByTrace();
603eef2b5eSKamil Rytarowski   void SetStoppedByExec();
6136e23ecaSKamil Rytarowski   void SetStoppedByWatchpoint(uint32_t wp_index);
62*06215023SMichał Górny   void SetStoppedByFork(lldb::pid_t child_pid, lldb::tid_t child_tid);
63*06215023SMichał Górny   void SetStoppedByVFork(lldb::pid_t child_pid, lldb::tid_t child_tid);
64*06215023SMichał Górny   void SetStoppedByVForkDone();
658d9400b6SMichał Górny   void SetStoppedWithNoReason();
66f07a9995SKamil Rytarowski   void SetStopped();
67f07a9995SKamil Rytarowski   void SetRunning();
683eef2b5eSKamil Rytarowski   void SetStepping();
69f07a9995SKamil Rytarowski 
70f21e704dSMichał Górny   llvm::Error CopyWatchpointsFrom(NativeThreadNetBSD& source);
71d970d4d4SMichał Górny 
72f07a9995SKamil Rytarowski   // Member Variables
73f07a9995SKamil Rytarowski   lldb::StateType m_state;
74f07a9995SKamil Rytarowski   ThreadStopInfo m_stop_info;
75d970d4d4SMichał Górny   std::unique_ptr<NativeRegisterContextNetBSD> m_reg_context_up;
76f07a9995SKamil Rytarowski   std::string m_stop_description;
7736e23ecaSKamil Rytarowski   using WatchpointIndexMap = std::map<lldb::addr_t, uint32_t>;
7836e23ecaSKamil Rytarowski   WatchpointIndexMap m_watchpoint_index_map;
7936e23ecaSKamil Rytarowski   WatchpointIndexMap m_hw_break_index_map;
801a3d19ddSKamil Rytarowski };
811a3d19ddSKamil Rytarowski 
821a3d19ddSKamil Rytarowski typedef std::shared_ptr<NativeThreadNetBSD> NativeThreadNetBSDSP;
831a3d19ddSKamil Rytarowski } // namespace process_netbsd
841a3d19ddSKamil Rytarowski } // namespace lldb_private
851a3d19ddSKamil Rytarowski 
861a3d19ddSKamil Rytarowski #endif // #ifndef liblldb_NativeThreadNetBSD_H_
87