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