diff options
-rw-r--r-- | include/linux/ptrace.h | 2 | ||||
-rw-r--r-- | kernel/ptrace.c | 15 |
2 files changed, 15 insertions, 2 deletions
diff --git a/include/linux/ptrace.h b/include/linux/ptrace.h index 1febc541dda5..515bff053de8 100644 --- a/include/linux/ptrace.h +++ b/include/linux/ptrace.h | |||
@@ -187,7 +187,7 @@ static inline void user_disable_single_step(struct task_struct *task) | |||
187 | * supports step-until-branch for user mode. It can be a constant or it | 187 | * supports step-until-branch for user mode. It can be a constant or it |
188 | * can test a CPU feature bit. | 188 | * can test a CPU feature bit. |
189 | */ | 189 | */ |
190 | #define arch_has_single_step() (0) | 190 | #define arch_has_block_step() (0) |
191 | 191 | ||
192 | /** | 192 | /** |
193 | * user_enable_block_step - step until branch in user-mode task | 193 | * user_enable_block_step - step until branch in user-mode task |
diff --git a/kernel/ptrace.c b/kernel/ptrace.c index fad5f1e8511f..973d727f5e84 100644 --- a/kernel/ptrace.c +++ b/kernel/ptrace.c | |||
@@ -373,6 +373,12 @@ static int ptrace_setsiginfo(struct task_struct *child, siginfo_t __user * data) | |||
373 | #define is_singlestep(request) 0 | 373 | #define is_singlestep(request) 0 |
374 | #endif | 374 | #endif |
375 | 375 | ||
376 | #ifdef PTRACE_SINGLEBLOCK | ||
377 | #define is_singleblock(request) ((request) == PTRACE_SINGLEBLOCK) | ||
378 | #else | ||
379 | #define is_singleblock(request) 0 | ||
380 | #endif | ||
381 | |||
376 | #ifdef PTRACE_SYSEMU | 382 | #ifdef PTRACE_SYSEMU |
377 | #define is_sysemu_singlestep(request) ((request) == PTRACE_SYSEMU_SINGLESTEP) | 383 | #define is_sysemu_singlestep(request) ((request) == PTRACE_SYSEMU_SINGLESTEP) |
378 | #else | 384 | #else |
@@ -396,7 +402,11 @@ static int ptrace_resume(struct task_struct *child, long request, long data) | |||
396 | clear_tsk_thread_flag(child, TIF_SYSCALL_EMU); | 402 | clear_tsk_thread_flag(child, TIF_SYSCALL_EMU); |
397 | #endif | 403 | #endif |
398 | 404 | ||
399 | if (is_singlestep(request) || is_sysemu_singlestep(request)) { | 405 | if (is_singleblock(request)) { |
406 | if (unlikely(!arch_has_block_step())) | ||
407 | return -EIO; | ||
408 | user_enable_block_step(child); | ||
409 | } else if (is_singlestep(request) || is_sysemu_singlestep(request)) { | ||
400 | if (unlikely(!arch_has_single_step())) | 410 | if (unlikely(!arch_has_single_step())) |
401 | return -EIO; | 411 | return -EIO; |
402 | user_enable_single_step(child); | 412 | user_enable_single_step(child); |
@@ -438,6 +448,9 @@ int ptrace_request(struct task_struct *child, long request, | |||
438 | #ifdef PTRACE_SINGLESTEP | 448 | #ifdef PTRACE_SINGLESTEP |
439 | case PTRACE_SINGLESTEP: | 449 | case PTRACE_SINGLESTEP: |
440 | #endif | 450 | #endif |
451 | #ifdef PTRACE_SINGLEBLOCK | ||
452 | case PTRACE_SINGLEBLOCK: | ||
453 | #endif | ||
441 | #ifdef PTRACE_SYSEMU | 454 | #ifdef PTRACE_SYSEMU |
442 | case PTRACE_SYSEMU: | 455 | case PTRACE_SYSEMU: |
443 | case PTRACE_SYSEMU_SINGLESTEP: | 456 | case PTRACE_SYSEMU_SINGLESTEP: |