1 #ifndef _ASM_X86_PTRACE_H 2 #define _ASM_X86_PTRACE_H 3 4 #include <linux/compiler.h> /* For __user */ 5 #include <asm/ptrace-abi.h> 6 7 #ifndef __ASSEMBLY__ 8 9 #ifdef __i386__ 10 /* this struct defines the way the registers are stored on the 11 stack during a system call. */ 12 13 struct pt_regs { 14 long ebx; 15 long ecx; 16 long edx; 17 long esi; 18 long edi; 19 long ebp; 20 long eax; 21 int xds; 22 int xes; 23 int xfs; 24 /* int xgs; */ 25 long orig_eax; 26 long eip; 27 int xcs; 28 long eflags; 29 long esp; 30 int xss; 31 }; 32 33 #ifdef __KERNEL__ 34 35 #include <asm/vm86.h> 36 #include <asm/segment.h> 37 38 struct task_struct; 39 extern void send_sigtrap(struct task_struct *tsk, struct pt_regs *regs, int error_code); 40 41 /* 42 * user_mode_vm(regs) determines whether a register set came from user mode. 43 * This is true if V8086 mode was enabled OR if the register set was from 44 * protected mode with RPL-3 CS value. This tricky test checks that with 45 * one comparison. Many places in the kernel can bypass this full check 46 * if they have already ruled out V8086 mode, so user_mode(regs) can be used. 47 */ 48 static inline int user_mode(struct pt_regs *regs) 49 { 50 return (regs->xcs & SEGMENT_RPL_MASK) == USER_RPL; 51 } 52 static inline int user_mode_vm(struct pt_regs *regs) 53 { 54 return ((regs->xcs & SEGMENT_RPL_MASK) | (regs->eflags & VM_MASK)) >= USER_RPL; 55 } 56 static inline int v8086_mode(struct pt_regs *regs) 57 { 58 return (regs->eflags & VM_MASK); 59 } 60 61 #define instruction_pointer(regs) ((regs)->eip) 62 #define frame_pointer(regs) ((regs)->ebp) 63 #define stack_pointer(regs) ((unsigned long)(regs)) 64 #define regs_return_value(regs) ((regs)->eax) 65 66 extern unsigned long profile_pc(struct pt_regs *regs); 67 #endif /* __KERNEL__ */ 68 69 #else /* __i386__ */ 70 71 struct pt_regs { 72 unsigned long r15; 73 unsigned long r14; 74 unsigned long r13; 75 unsigned long r12; 76 unsigned long rbp; 77 unsigned long rbx; 78 /* arguments: non interrupts/non tracing syscalls only save upto here*/ 79 unsigned long r11; 80 unsigned long r10; 81 unsigned long r9; 82 unsigned long r8; 83 unsigned long rax; 84 unsigned long rcx; 85 unsigned long rdx; 86 unsigned long rsi; 87 unsigned long rdi; 88 unsigned long orig_rax; 89 /* end of arguments */ 90 /* cpu exception frame or undefined */ 91 unsigned long rip; 92 unsigned long cs; 93 unsigned long eflags; 94 unsigned long rsp; 95 unsigned long ss; 96 /* top of stack page */ 97 }; 98 99 #ifdef __KERNEL__ 100 101 #define user_mode(regs) (!!((regs)->cs & 3)) 102 #define user_mode_vm(regs) user_mode(regs) 103 #define instruction_pointer(regs) ((regs)->rip) 104 #define frame_pointer(regs) ((regs)->rbp) 105 #define stack_pointer(regs) ((regs)->rsp) 106 #define regs_return_value(regs) ((regs)->rax) 107 108 extern unsigned long profile_pc(struct pt_regs *regs); 109 void signal_fault(struct pt_regs *regs, void __user *frame, char *where); 110 111 struct task_struct; 112 113 extern unsigned long 114 convert_rip_to_linear(struct task_struct *child, struct pt_regs *regs); 115 116 enum { 117 EF_CF = 0x00000001, 118 EF_PF = 0x00000004, 119 EF_AF = 0x00000010, 120 EF_ZF = 0x00000040, 121 EF_SF = 0x00000080, 122 EF_TF = 0x00000100, 123 EF_IE = 0x00000200, 124 EF_DF = 0x00000400, 125 EF_OF = 0x00000800, 126 EF_IOPL = 0x00003000, 127 EF_IOPL_RING0 = 0x00000000, 128 EF_IOPL_RING1 = 0x00001000, 129 EF_IOPL_RING2 = 0x00002000, 130 EF_NT = 0x00004000, /* nested task */ 131 EF_RF = 0x00010000, /* resume */ 132 EF_VM = 0x00020000, /* virtual mode */ 133 EF_AC = 0x00040000, /* alignment */ 134 EF_VIF = 0x00080000, /* virtual interrupt */ 135 EF_VIP = 0x00100000, /* virtual interrupt pending */ 136 EF_ID = 0x00200000, /* id */ 137 }; 138 #endif /* __KERNEL__ */ 139 #endif /* !__i386__ */ 140 #endif /* !__ASSEMBLY__ */ 141 142 #endif 143