1*4882a593Smuzhiyun #ifndef __ASM_SH_PTRACE_H 2*4882a593Smuzhiyun #define __ASM_SH_PTRACE_H 3*4882a593Smuzhiyun 4*4882a593Smuzhiyun /* 5*4882a593Smuzhiyun * Copyright (C) 1999, 2000 Niibe Yutaka 6*4882a593Smuzhiyun * from linux kernel code. 7*4882a593Smuzhiyun */ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun /* 10*4882a593Smuzhiyun * GCC defines register number like this: 11*4882a593Smuzhiyun * ----------------------------- 12*4882a593Smuzhiyun * 0 - 15 are integer registers 13*4882a593Smuzhiyun * 17 - 22 are control/special registers 14*4882a593Smuzhiyun * 24 - 39 fp registers 15*4882a593Smuzhiyun * 40 - 47 xd registers 16*4882a593Smuzhiyun * 48 - fpscr register 17*4882a593Smuzhiyun * ----------------------------- 18*4882a593Smuzhiyun * 19*4882a593Smuzhiyun * We follows above, except: 20*4882a593Smuzhiyun * 16 --- program counter (PC) 21*4882a593Smuzhiyun * 22 --- syscall # 22*4882a593Smuzhiyun * 23 --- floating point communication register 23*4882a593Smuzhiyun */ 24*4882a593Smuzhiyun #define REG_REG0 0 25*4882a593Smuzhiyun #define REG_REG15 15 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun #define REG_PC 16 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun #define REG_PR 17 30*4882a593Smuzhiyun #define REG_SR 18 31*4882a593Smuzhiyun #define REG_GBR 19 32*4882a593Smuzhiyun #define REG_MACH 20 33*4882a593Smuzhiyun #define REG_MACL 21 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun #define REG_SYSCALL 22 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun #define REG_FPREG0 23 38*4882a593Smuzhiyun #define REG_FPREG15 38 39*4882a593Smuzhiyun #define REG_XFREG0 39 40*4882a593Smuzhiyun #define REG_XFREG15 54 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun #define REG_FPSCR 55 43*4882a593Smuzhiyun #define REG_FPUL 56 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun /* options set using PTRACE_SETOPTIONS */ 46*4882a593Smuzhiyun #define PTRACE_O_TRACESYSGOOD 0x00000001 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun /* 49*4882a593Smuzhiyun * This struct defines the way the registers are stored on the 50*4882a593Smuzhiyun * kernel stack during a system call or other kernel entry. 51*4882a593Smuzhiyun */ 52*4882a593Smuzhiyun struct pt_regs { 53*4882a593Smuzhiyun unsigned long regs[16]; 54*4882a593Smuzhiyun unsigned long pc; 55*4882a593Smuzhiyun unsigned long pr; 56*4882a593Smuzhiyun unsigned long sr; 57*4882a593Smuzhiyun unsigned long gbr; 58*4882a593Smuzhiyun unsigned long mach; 59*4882a593Smuzhiyun unsigned long macl; 60*4882a593Smuzhiyun long tra; 61*4882a593Smuzhiyun }; 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun /* 64*4882a593Smuzhiyun * This struct defines the way the DSP registers are stored on the 65*4882a593Smuzhiyun * kernel stack during a system call or other kernel entry. 66*4882a593Smuzhiyun */ 67*4882a593Smuzhiyun struct pt_dspregs { 68*4882a593Smuzhiyun unsigned long a1; 69*4882a593Smuzhiyun unsigned long a0g; 70*4882a593Smuzhiyun unsigned long a1g; 71*4882a593Smuzhiyun unsigned long m0; 72*4882a593Smuzhiyun unsigned long m1; 73*4882a593Smuzhiyun unsigned long a0; 74*4882a593Smuzhiyun unsigned long x0; 75*4882a593Smuzhiyun unsigned long x1; 76*4882a593Smuzhiyun unsigned long y0; 77*4882a593Smuzhiyun unsigned long y1; 78*4882a593Smuzhiyun unsigned long dsr; 79*4882a593Smuzhiyun unsigned long rs; 80*4882a593Smuzhiyun unsigned long re; 81*4882a593Smuzhiyun unsigned long mod; 82*4882a593Smuzhiyun }; 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun #define PTRACE_GETDSPREGS 55 85*4882a593Smuzhiyun #define PTRACE_SETDSPREGS 56 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun #ifdef __KERNEL__ 88*4882a593Smuzhiyun #define user_mode(regs) (((regs)->sr & 0x40000000)==0) 89*4882a593Smuzhiyun #define instruction_pointer(regs) ((regs)->pc) 90*4882a593Smuzhiyun extern void show_regs(struct pt_regs *); 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun #ifdef CONFIG_SH_DSP 93*4882a593Smuzhiyun #define task_pt_regs(task) \ 94*4882a593Smuzhiyun ((struct pt_regs *) (task_stack_page(task) + THREAD_SIZE \ 95*4882a593Smuzhiyun - sizeof(struct pt_dspregs) - sizeof(unsigned long)) - 1) 96*4882a593Smuzhiyun #else 97*4882a593Smuzhiyun #define task_pt_regs(task) \ 98*4882a593Smuzhiyun ((struct pt_regs *) (task_stack_page(task) + THREAD_SIZE \ 99*4882a593Smuzhiyun - sizeof(unsigned long)) - 1) 100*4882a593Smuzhiyun #endif 101*4882a593Smuzhiyun profile_pc(struct pt_regs * regs)102*4882a593Smuzhiyunstatic inline unsigned long profile_pc(struct pt_regs *regs) 103*4882a593Smuzhiyun { 104*4882a593Smuzhiyun unsigned long pc = instruction_pointer(regs); 105*4882a593Smuzhiyun 106*4882a593Smuzhiyun if (pc >= 0xa0000000UL && pc < 0xc0000000UL) 107*4882a593Smuzhiyun pc -= 0x20000000; 108*4882a593Smuzhiyun return pc; 109*4882a593Smuzhiyun } 110*4882a593Smuzhiyun #endif 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun #endif /* __ASM_SH_PTRACE_H */ 113