Commit | Line | Data |
---|---|---|
8fc37f2c TG |
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 | ||
96a388de | 33 | #ifdef __KERNEL__ |
8fc37f2c TG |
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) | |
77f2878b | 63 | #define stack_pointer(regs) ((unsigned long)(regs)) |
8fc37f2c TG |
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 | ||
96a388de | 142 | #endif |