mirror of
https://github.com/FEX-Emu/linux.git
synced 2024-12-27 20:07:09 +00:00
fd341abba6
Use the generic ptrace_resume code for PTRACE_SYSCALL, PTRACE_CONT, PTRACE_KILL and PTRACE_SINGLESTEP. This implies defining arch_has_single_step in <asm/ptrace.h> and implementing the user_enable_single_step and user_disable_single_step functions, which also causes the breakpoint information to be cleared on fork, which could be considered a bug fix. Also the TIF_SYSCALL_TRACE thread flag is now cleared on PTRACE_KILL which it previously wasn't, which is consistent with all architectures using the modern ptrace code. Signed-off-by: Christoph Hellwig <hch@lst.de> Cc: Oleg Nesterov <oleg@redhat.com> Cc: Roland McGrath <roland@redhat.com> Acked-by: Matt Turner <mattst88@gmail.com> Cc: Ivan Kokshaysky <ink@jurassic.park.msu.ru> Cc: Richard Henderson <rth@twiddle.net> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
85 lines
2.0 KiB
C
85 lines
2.0 KiB
C
#ifndef _ASMAXP_PTRACE_H
|
|
#define _ASMAXP_PTRACE_H
|
|
|
|
|
|
/*
|
|
* This struct defines the way the registers are stored on the
|
|
* kernel stack during a system call or other kernel entry
|
|
*
|
|
* NOTE! I want to minimize the overhead of system calls, so this
|
|
* struct has as little information as possible. I does not have
|
|
*
|
|
* - floating point regs: the kernel doesn't change those
|
|
* - r9-15: saved by the C compiler
|
|
*
|
|
* This makes "fork()" and "exec()" a bit more complex, but should
|
|
* give us low system call latency.
|
|
*/
|
|
|
|
struct pt_regs {
|
|
unsigned long r0;
|
|
unsigned long r1;
|
|
unsigned long r2;
|
|
unsigned long r3;
|
|
unsigned long r4;
|
|
unsigned long r5;
|
|
unsigned long r6;
|
|
unsigned long r7;
|
|
unsigned long r8;
|
|
unsigned long r19;
|
|
unsigned long r20;
|
|
unsigned long r21;
|
|
unsigned long r22;
|
|
unsigned long r23;
|
|
unsigned long r24;
|
|
unsigned long r25;
|
|
unsigned long r26;
|
|
unsigned long r27;
|
|
unsigned long r28;
|
|
unsigned long hae;
|
|
/* JRP - These are the values provided to a0-a2 by PALcode */
|
|
unsigned long trap_a0;
|
|
unsigned long trap_a1;
|
|
unsigned long trap_a2;
|
|
/* These are saved by PAL-code: */
|
|
unsigned long ps;
|
|
unsigned long pc;
|
|
unsigned long gp;
|
|
unsigned long r16;
|
|
unsigned long r17;
|
|
unsigned long r18;
|
|
};
|
|
|
|
/*
|
|
* This is the extended stack used by signal handlers and the context
|
|
* switcher: it's pushed after the normal "struct pt_regs".
|
|
*/
|
|
struct switch_stack {
|
|
unsigned long r9;
|
|
unsigned long r10;
|
|
unsigned long r11;
|
|
unsigned long r12;
|
|
unsigned long r13;
|
|
unsigned long r14;
|
|
unsigned long r15;
|
|
unsigned long r26;
|
|
unsigned long fp[32]; /* fp[31] is fpcr */
|
|
};
|
|
|
|
#ifdef __KERNEL__
|
|
|
|
#define arch_has_single_step() (1)
|
|
#define user_mode(regs) (((regs)->ps & 8) != 0)
|
|
#define instruction_pointer(regs) ((regs)->pc)
|
|
#define profile_pc(regs) instruction_pointer(regs)
|
|
extern void show_regs(struct pt_regs *);
|
|
|
|
#define task_pt_regs(task) \
|
|
((struct pt_regs *) (task_stack_page(task) + 2*PAGE_SIZE) - 1)
|
|
|
|
#define force_successful_syscall_return() (task_pt_regs(current)->r0 = 0)
|
|
|
|
#endif
|
|
|
|
#endif
|