2007-10-24 00:37:24 +04:00
# ifndef _ASM_X86_PTRACE_H
# define _ASM_X86_PTRACE_H
# include <linux/compiler.h> /* For __user */
# include <asm/ptrace-abi.h>
# ifndef __ASSEMBLY__
# ifdef __i386__
/* this struct defines the way the registers are stored on the
stack during a system call . */
struct pt_regs {
long ebx ;
long ecx ;
long edx ;
long esi ;
long edi ;
long ebp ;
long eax ;
int xds ;
int xes ;
int xfs ;
/* int xgs; */
long orig_eax ;
long eip ;
int xcs ;
long eflags ;
long esp ;
int xss ;
} ;
2007-10-11 13:20:03 +04:00
# ifdef __KERNEL__
2007-10-24 00:37:24 +04:00
# include <asm/vm86.h>
# include <asm/segment.h>
struct task_struct ;
extern void send_sigtrap ( struct task_struct * tsk , struct pt_regs * regs , int error_code ) ;
/*
* user_mode_vm ( regs ) determines whether a register set came from user mode .
* This is true if V8086 mode was enabled OR if the register set was from
* protected mode with RPL - 3 CS value . This tricky test checks that with
* one comparison . Many places in the kernel can bypass this full check
* if they have already ruled out V8086 mode , so user_mode ( regs ) can be used .
*/
static inline int user_mode ( struct pt_regs * regs )
{
return ( regs - > xcs & SEGMENT_RPL_MASK ) = = USER_RPL ;
}
static inline int user_mode_vm ( struct pt_regs * regs )
{
return ( ( regs - > xcs & SEGMENT_RPL_MASK ) | ( regs - > eflags & VM_MASK ) ) > = USER_RPL ;
}
static inline int v8086_mode ( struct pt_regs * regs )
{
return ( regs - > eflags & VM_MASK ) ;
}
# define instruction_pointer(regs) ((regs)->eip)
# define frame_pointer(regs) ((regs)->ebp)
2007-11-15 04:00:42 +03:00
# define stack_pointer(regs) ((unsigned long)(regs))
2007-10-24 00:37:24 +04:00
# define regs_return_value(regs) ((regs)->eax)
extern unsigned long profile_pc ( struct pt_regs * regs ) ;
# endif /* __KERNEL__ */
# else /* __i386__ */
struct pt_regs {
unsigned long r15 ;
unsigned long r14 ;
unsigned long r13 ;
unsigned long r12 ;
unsigned long rbp ;
unsigned long rbx ;
/* arguments: non interrupts/non tracing syscalls only save upto here*/
unsigned long r11 ;
unsigned long r10 ;
unsigned long r9 ;
unsigned long r8 ;
unsigned long rax ;
unsigned long rcx ;
unsigned long rdx ;
unsigned long rsi ;
unsigned long rdi ;
unsigned long orig_rax ;
/* end of arguments */
/* cpu exception frame or undefined */
unsigned long rip ;
unsigned long cs ;
unsigned long eflags ;
unsigned long rsp ;
unsigned long ss ;
/* top of stack page */
} ;
# ifdef __KERNEL__
# define user_mode(regs) (!!((regs)->cs & 3))
# define user_mode_vm(regs) user_mode(regs)
# define instruction_pointer(regs) ((regs)->rip)
# define frame_pointer(regs) ((regs)->rbp)
# define stack_pointer(regs) ((regs)->rsp)
# define regs_return_value(regs) ((regs)->rax)
extern unsigned long profile_pc ( struct pt_regs * regs ) ;
void signal_fault ( struct pt_regs * regs , void __user * frame , char * where ) ;
struct task_struct ;
extern unsigned long
convert_rip_to_linear ( struct task_struct * child , struct pt_regs * regs ) ;
enum {
EF_CF = 0x00000001 ,
EF_PF = 0x00000004 ,
EF_AF = 0x00000010 ,
EF_ZF = 0x00000040 ,
EF_SF = 0x00000080 ,
EF_TF = 0x00000100 ,
EF_IE = 0x00000200 ,
EF_DF = 0x00000400 ,
EF_OF = 0x00000800 ,
EF_IOPL = 0x00003000 ,
EF_IOPL_RING0 = 0x00000000 ,
EF_IOPL_RING1 = 0x00001000 ,
EF_IOPL_RING2 = 0x00002000 ,
EF_NT = 0x00004000 , /* nested task */
EF_RF = 0x00010000 , /* resume */
EF_VM = 0x00020000 , /* virtual mode */
EF_AC = 0x00040000 , /* alignment */
EF_VIF = 0x00080000 , /* virtual interrupt */
EF_VIP = 0x00100000 , /* virtual interrupt pending */
EF_ID = 0x00200000 , /* id */
} ;
# endif /* __KERNEL__ */
# endif /* !__i386__ */
# endif /* !__ASSEMBLY__ */
2007-10-11 13:20:03 +04:00
# endif