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