2005-04-17 06:20:36 +08:00
|
|
|
#ifndef _I386_PTRACE_H
|
|
|
|
#define _I386_PTRACE_H
|
|
|
|
|
[PATCH] Split i386 and x86_64 ptrace.h
The use of SEGMENT_RPL_MASK in the i386 ptrace.h introduced by
x86-allow-a-kernel-to-not-be-in-ring-0.patch broke the UML build, as UML
includes the underlying architecture's ptrace.h, but has no easy access to the
x86 segment definitions.
Rather than kludging around this, as in the past, this patch splits the
userspace-usable parts, which are the bits that UML needs, of ptrace.h into
ptrace-abi.h, which is included back into ptrace.h. Thus, there is no net
effect on i386.
As a side-effect, this creates a ptrace header which is close to being usable
in /usr/include.
x86_64 is also treated in this way for consistency. There was some trailing
whitespace there, which is cleaned up.
Signed-off-by: Jeff Dike <jdike@addtoit.com>
Cc: David Woodhouse <dwmw2@infradead.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
2006-09-26 14:33:09 +08:00
|
|
|
#include <asm/ptrace-abi.h>
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
/* 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;
|
2007-02-13 20:26:20 +08:00
|
|
|
int xfs;
|
|
|
|
/* int xgs; */
|
2005-04-17 06:20:36 +08:00
|
|
|
long orig_eax;
|
|
|
|
long eip;
|
|
|
|
int xcs;
|
|
|
|
long eflags;
|
|
|
|
long esp;
|
|
|
|
int xss;
|
|
|
|
};
|
|
|
|
|
|
|
|
#ifdef __KERNEL__
|
2005-07-28 02:43:25 +08:00
|
|
|
|
|
|
|
#include <asm/vm86.h>
|
2006-09-26 16:52:39 +08:00
|
|
|
#include <asm/segment.h>
|
2005-07-28 02:43:25 +08:00
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
struct task_struct;
|
|
|
|
extern void send_sigtrap(struct task_struct *tsk, struct pt_regs *regs, int error_code);
|
2005-07-27 09:57:24 +08:00
|
|
|
|
2005-09-04 06:56:43 +08:00
|
|
|
/*
|
|
|
|
* 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.
|
|
|
|
*/
|
2005-07-27 09:57:24 +08:00
|
|
|
static inline int user_mode(struct pt_regs *regs)
|
|
|
|
{
|
2006-09-26 16:52:39 +08:00
|
|
|
return (regs->xcs & SEGMENT_RPL_MASK) == USER_RPL;
|
2005-07-27 09:57:24 +08:00
|
|
|
}
|
|
|
|
static inline int user_mode_vm(struct pt_regs *regs)
|
|
|
|
{
|
2006-09-26 16:52:39 +08:00
|
|
|
return ((regs->xcs & SEGMENT_RPL_MASK) | (regs->eflags & VM_MASK)) >= USER_RPL;
|
2005-07-27 09:57:24 +08:00
|
|
|
}
|
2007-02-13 20:26:21 +08:00
|
|
|
static inline int v8086_mode(struct pt_regs *regs)
|
|
|
|
{
|
|
|
|
return (regs->eflags & VM_MASK);
|
|
|
|
}
|
2006-10-02 17:17:31 +08:00
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
#define instruction_pointer(regs) ((regs)->eip)
|
2006-10-02 17:17:31 +08:00
|
|
|
#define regs_return_value(regs) ((regs)->eax)
|
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
extern unsigned long profile_pc(struct pt_regs *regs);
|
2005-07-27 09:57:24 +08:00
|
|
|
#endif /* __KERNEL__ */
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
#endif
|