1 #ifndef __ASM_SH_PTRACE_H 2 #define __ASM_SH_PTRACE_H 3 4 /* 5 * Copyright (C) 1999, 2000 Niibe Yutaka 6 * 7 */ 8 #if defined(__SH5__) 9 struct pt_regs { 10 unsigned long long pc; 11 unsigned long long sr; 12 unsigned long long syscall_nr; 13 unsigned long long regs[63]; 14 unsigned long long tregs[8]; 15 unsigned long long pad[2]; 16 }; 17 #else 18 /* 19 * GCC defines register number like this: 20 * ----------------------------- 21 * 0 - 15 are integer registers 22 * 17 - 22 are control/special registers 23 * 24 - 39 fp registers 24 * 40 - 47 xd registers 25 * 48 - fpscr register 26 * ----------------------------- 27 * 28 * We follows above, except: 29 * 16 --- program counter (PC) 30 * 22 --- syscall # 31 * 23 --- floating point communication register 32 */ 33 #define REG_REG0 0 34 #define REG_REG15 15 35 36 #define REG_PC 16 37 38 #define REG_PR 17 39 #define REG_SR 18 40 #define REG_GBR 19 41 #define REG_MACH 20 42 #define REG_MACL 21 43 44 #define REG_SYSCALL 22 45 46 #define REG_FPREG0 23 47 #define REG_FPREG15 38 48 #define REG_XFREG0 39 49 #define REG_XFREG15 54 50 51 #define REG_FPSCR 55 52 #define REG_FPUL 56 53 54 /* 55 * This struct defines the way the registers are stored on the 56 * kernel stack during a system call or other kernel entry. 57 */ 58 struct pt_regs { 59 unsigned long regs[16]; 60 unsigned long pc; 61 unsigned long pr; 62 unsigned long sr; 63 unsigned long gbr; 64 unsigned long mach; 65 unsigned long macl; 66 long tra; 67 }; 68 69 /* 70 * This struct defines the way the DSP registers are stored on the 71 * kernel stack during a system call or other kernel entry. 72 */ 73 struct pt_dspregs { 74 unsigned long a1; 75 unsigned long a0g; 76 unsigned long a1g; 77 unsigned long m0; 78 unsigned long m1; 79 unsigned long a0; 80 unsigned long x0; 81 unsigned long x1; 82 unsigned long y0; 83 unsigned long y1; 84 unsigned long dsr; 85 unsigned long rs; 86 unsigned long re; 87 unsigned long mod; 88 }; 89 90 #define PTRACE_GETREGS 12 /* General registers */ 91 #define PTRACE_SETREGS 13 92 93 #define PTRACE_GETFPREGS 14 /* FPU registers */ 94 #define PTRACE_SETFPREGS 15 95 96 #define PTRACE_GETFDPIC 31 /* get the ELF fdpic loadmap address */ 97 98 #define PTRACE_GETFDPIC_EXEC 0 /* [addr] request the executable loadmap */ 99 #define PTRACE_GETFDPIC_INTERP 1 /* [addr] request the interpreter loadmap */ 100 101 #define PTRACE_GETDSPREGS 55 /* DSP registers */ 102 #define PTRACE_SETDSPREGS 56 103 #endif 104 105 #ifdef __KERNEL__ 106 #include <asm/addrspace.h> 107 108 #define user_mode(regs) (((regs)->sr & 0x40000000)==0) 109 #define instruction_pointer(regs) ((unsigned long)(regs)->pc) 110 111 extern void show_regs(struct pt_regs *); 112 113 /* 114 * These are defined as per linux/ptrace.h. 115 */ 116 struct task_struct; 117 118 #define arch_has_single_step() (1) 119 extern void user_enable_single_step(struct task_struct *); 120 extern void user_disable_single_step(struct task_struct *); 121 122 #ifdef CONFIG_SH_DSP 123 #define task_pt_regs(task) \ 124 ((struct pt_regs *) (task_stack_page(task) + THREAD_SIZE \ 125 - sizeof(struct pt_dspregs) - sizeof(unsigned long)) - 1) 126 #define task_pt_dspregs(task) \ 127 ((struct pt_dspregs *) (task_stack_page(task) + THREAD_SIZE \ 128 - sizeof(unsigned long)) - 1) 129 #else 130 #define task_pt_regs(task) \ 131 ((struct pt_regs *) (task_stack_page(task) + THREAD_SIZE \ 132 - sizeof(unsigned long)) - 1) 133 #endif 134 135 static inline unsigned long profile_pc(struct pt_regs *regs) 136 { 137 unsigned long pc = instruction_pointer(regs); 138 139 #ifdef P2SEG 140 if (pc >= P2SEG && pc < P3SEG) 141 pc -= 0x20000000; 142 #endif 143 144 return pc; 145 } 146 #endif /* __KERNEL__ */ 147 148 #endif /* __ASM_SH_PTRACE_H */ 149