|
|
@@ -7,9 +7,19 @@ static int collect_syscall(struct task_struct *target, long *callno,
|
|
|
unsigned long args[6], unsigned int maxargs,
|
|
|
unsigned long *sp, unsigned long *pc)
|
|
|
{
|
|
|
- struct pt_regs *regs = task_pt_regs(target);
|
|
|
- if (unlikely(!regs))
|
|
|
+ struct pt_regs *regs;
|
|
|
+
|
|
|
+ if (!try_get_task_stack(target)) {
|
|
|
+ /* Task has no stack, so the task isn't in a syscall. */
|
|
|
+ *callno = -1;
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ regs = task_pt_regs(target);
|
|
|
+ if (unlikely(!regs)) {
|
|
|
+ put_task_stack(target);
|
|
|
return -EAGAIN;
|
|
|
+ }
|
|
|
|
|
|
*sp = user_stack_pointer(regs);
|
|
|
*pc = instruction_pointer(regs);
|
|
|
@@ -18,6 +28,7 @@ static int collect_syscall(struct task_struct *target, long *callno,
|
|
|
if (*callno != -1L && maxargs > 0)
|
|
|
syscall_get_arguments(target, regs, 0, maxargs, args);
|
|
|
|
|
|
+ put_task_stack(target);
|
|
|
return 0;
|
|
|
}
|
|
|
|