diff options
Diffstat (limited to 'arch/x86')
-rw-r--r-- | arch/x86/kernel/step.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/arch/x86/kernel/step.c b/arch/x86/kernel/step.c index 9d406cdc847f..071ff4798236 100644 --- a/arch/x86/kernel/step.c +++ b/arch/x86/kernel/step.c | |||
@@ -140,6 +140,9 @@ static int enable_single_step(struct task_struct *child) | |||
140 | */ | 140 | */ |
141 | static void write_debugctlmsr(struct task_struct *child, unsigned long val) | 141 | static void write_debugctlmsr(struct task_struct *child, unsigned long val) |
142 | { | 142 | { |
143 | if (child->thread.debugctlmsr == val) | ||
144 | return; | ||
145 | |||
143 | child->thread.debugctlmsr = val; | 146 | child->thread.debugctlmsr = val; |
144 | 147 | ||
145 | if (child != current) | 148 | if (child != current) |
@@ -165,11 +168,11 @@ static void enable_step(struct task_struct *child, bool block) | |||
165 | write_debugctlmsr(child, | 168 | write_debugctlmsr(child, |
166 | child->thread.debugctlmsr | DEBUGCTLMSR_BTF); | 169 | child->thread.debugctlmsr | DEBUGCTLMSR_BTF); |
167 | } else { | 170 | } else { |
168 | write_debugctlmsr(child, | 171 | write_debugctlmsr(child, |
169 | child->thread.debugctlmsr & ~DEBUGCTLMSR_BTF); | 172 | child->thread.debugctlmsr & ~DEBUGCTLMSR_BTF); |
170 | 173 | ||
171 | if (!child->thread.debugctlmsr) | 174 | if (!child->thread.debugctlmsr) |
172 | clear_tsk_thread_flag(child, TIF_DEBUGCTLMSR); | 175 | clear_tsk_thread_flag(child, TIF_DEBUGCTLMSR); |
173 | } | 176 | } |
174 | } | 177 | } |
175 | 178 | ||