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