diff options
| author | Pavel Labath <labath@google.com> | 2016-02-23 13:56:30 +0000 |
|---|---|---|
| committer | Pavel Labath <labath@google.com> | 2016-02-23 13:56:30 +0000 |
| commit | 605b51b84e622ce64ee77b066599c7b16d9d2c9d (patch) | |
| tree | 0ca0c82ebce807499af82ea3c4cd2cd23fb6ff9c /lldb/source/Plugins/Process/Linux/NativeThreadLinux.h | |
| parent | 0231f1649bd0d74828db9b41481421a67f469a6a (diff) | |
| download | llvm-605b51b84e622ce64ee77b066599c7b16d9d2c9d.zip llvm-605b51b84e622ce64ee77b066599c7b16d9d2c9d.tar.gz llvm-605b51b84e622ce64ee77b066599c7b16d9d2c9d.tar.bz2 | |
Work around a stepping bug in arm64 android M
Summary:
On arm64, linux<=4.4 and Android<=M there is a bug, which prevents single-stepping from working when
the system comes back from suspend, because of incorrectly initialized CPUs. This did not really
affect Android<M, because it did not use software suspend, but it is a problem for M, which uses
suspend (doze) quite extensively. Fortunately, it seems that the first CPU is not affected by
this bug, so this commit implements a workaround by forcing the inferior to execute on the first
cpu whenever we are doing single stepping.
While inside, I have moved the implementations of Resume() and SingleStep() to the thread class
(instead of process).
Reviewers: tberghammer, ovyalov
Subscribers: aemerson, rengolin, tberghammer, danalbert, srhines, lldb-commits
Differential Revision: http://reviews.llvm.org/D17509
llvm-svn: 261636
Diffstat (limited to 'lldb/source/Plugins/Process/Linux/NativeThreadLinux.h')
| -rw-r--r-- | lldb/source/Plugins/Process/Linux/NativeThreadLinux.h | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/lldb/source/Plugins/Process/Linux/NativeThreadLinux.h b/lldb/source/Plugins/Process/Linux/NativeThreadLinux.h index bf6b00a..f1b6a6e 100644 --- a/lldb/source/Plugins/Process/Linux/NativeThreadLinux.h +++ b/lldb/source/Plugins/Process/Linux/NativeThreadLinux.h @@ -13,6 +13,8 @@ #include "lldb/lldb-private-forward.h" #include "lldb/Host/common/NativeThreadProtocol.h" +#include <sched.h> + #include <map> #include <memory> #include <string> @@ -54,11 +56,16 @@ namespace process_linux { // --------------------------------------------------------------------- // Interface for friend classes // --------------------------------------------------------------------- - void - SetRunning (); - void - SetStepping (); + /// Resumes the thread. If @p signo is anything but + /// LLDB_INVALID_SIGNAL_NUMBER, deliver that signal to the thread. + Error + Resume(uint32_t signo); + + /// Single steps the thread. If @p signo is anything but + /// LLDB_INVALID_SIGNAL_NUMBER, deliver that signal to the thread. + Error + SingleStep(uint32_t signo); void SetStoppedBySignal(uint32_t signo, const siginfo_t *info = nullptr); @@ -102,6 +109,18 @@ namespace process_linux { void MaybeLogStateChange (lldb::StateType new_state); + NativeProcessLinux & + GetProcess(); + + void + SetStopped(); + + inline void + MaybePrepareSingleStepWorkaround(); + + inline void + MaybeCleanupSingleStepWorkaround(); + // --------------------------------------------------------------------- // Member Variables // --------------------------------------------------------------------- @@ -111,6 +130,7 @@ namespace process_linux { std::string m_stop_description; using WatchpointIndexMap = std::map<lldb::addr_t, uint32_t>; WatchpointIndexMap m_watchpoint_index_map; + cpu_set_t m_original_cpu_set; // For single-step workaround. }; typedef std::shared_ptr<NativeThreadLinux> NativeThreadLinuxSP; |
