| /* |
| * U-boot - ptrace.h |
| * |
| * Copyright (c) 2005 blackfin.uclinux.org |
| * |
| * See file CREDITS for list of people who contributed to this |
| * project. |
| * |
| * This program is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU General Public License as |
| * published by the Free Software Foundation; either version 2 of |
| * the License, or (at your option) any later version. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| * |
| * You should have received a copy of the GNU General Public License |
| * along with this program; if not, write to the Free Software |
| * Foundation, Inc., 59 Temple Place, Suite 330, Boston, |
| * MA 02111-1307 USA |
| */ |
| |
| #ifndef _BLACKFIN_PTRACE_H |
| #define _BLACKFIN_PTRACE_H |
| |
| #define NEW_PT_REGS |
| |
| /* |
| * GCC defines register number like this: |
| * ----------------------------- |
| * 0 - 7 are data registers R0-R7 |
| * 8 - 15 are address registers P0-P7 |
| * 16 - 31 dsp registers I/B/L0 -- I/B/L3 & M0--M3 |
| * 32 - 33 A registers A0 & A1 |
| * 34 - status register |
| * |
| * We follows above, except: |
| * 32-33 --- Low 32-bit of A0&1 |
| * 34-35 --- High 8-bit of A0&1 |
| */ |
| |
| #if defined(NEW_PT_REGS) |
| |
| #define PT_IPEND 0 |
| #define PT_SYSCFG (PT_IPEND+4) |
| #define PT_SEQSTAT (PT_SYSCFG+4) |
| #define PT_RETE (PT_SEQSTAT+4) |
| #define PT_RETN (PT_RETE+4) |
| #define PT_RETX (PT_RETN+4) |
| #define PT_RETI (PT_RETX+4) |
| #define PT_PC PT_RETI |
| #define PT_RETS (PT_RETI+4) |
| #define PT_RESERVED (PT_RETS+4) |
| #define PT_ASTAT (PT_RESERVED+4) |
| #define PT_LB1 (PT_ASTAT+4) |
| #define PT_LB0 (PT_LB1+4) |
| #define PT_LT1 (PT_LB0+4) |
| #define PT_LT0 (PT_LT1+4) |
| #define PT_LC1 (PT_LT0+4) |
| #define PT_LC0 (PT_LC1+4) |
| #define PT_A1W (PT_LC0+4) |
| #define PT_A1X (PT_A1W+4) |
| #define PT_A0W (PT_A1X+4) |
| #define PT_A0X (PT_A0W+4) |
| #define PT_B3 (PT_A0X+4) |
| #define PT_B2 (PT_B3+4) |
| #define PT_B1 (PT_B2+4) |
| #define PT_B0 (PT_B1+4) |
| #define PT_L3 (PT_B0+4) |
| #define PT_L2 (PT_L3+4) |
| #define PT_L1 (PT_L2+4) |
| #define PT_L0 (PT_L1+4) |
| #define PT_M3 (PT_L0+4) |
| #define PT_M2 (PT_M3+4) |
| #define PT_M1 (PT_M2+4) |
| #define PT_M0 (PT_M1+4) |
| #define PT_I3 (PT_M0+4) |
| #define PT_I2 (PT_I3+4) |
| #define PT_I1 (PT_I2+4) |
| #define PT_I0 (PT_I1+4) |
| #define PT_USP (PT_I0+4) |
| #define PT_FP (PT_USP+4) |
| #define PT_P5 (PT_FP+4) |
| #define PT_P4 (PT_P5+4) |
| #define PT_P3 (PT_P4+4) |
| #define PT_P2 (PT_P3+4) |
| #define PT_P1 (PT_P2+4) |
| #define PT_P0 (PT_P1+4) |
| #define PT_R7 (PT_P0+4) |
| #define PT_R6 (PT_R7+4) |
| #define PT_R5 (PT_R6+4) |
| #define PT_R4 (PT_R5+4) |
| #define PT_R3 (PT_R4+4) |
| #define PT_R2 (PT_R3+4) |
| #define PT_R1 (PT_R2+4) |
| #define PT_R0 (PT_R1+4) |
| #define PT_ORIG_R0 (PT_R0+4) |
| #define PT_SR PT_SEQSTAT |
| |
| #else |
| /* |
| * Here utilize blackfin : dpregs = [pregs + imm16s4] |
| * [pregs + imm16s4] = dpregs |
| * to access defferent saved reg in stack |
| */ |
| #define PT_R3 0 |
| #define PT_R4 4 |
| #define PT_R2 8 |
| #define PT_R1 12 |
| #define PT_P5 16 |
| #define PT_P4 20 |
| #define PT_P3 24 |
| #define PT_P2 28 |
| #define PT_P1 32 |
| #define PT_P0 36 |
| #define PT_R7 40 |
| #define PT_R6 44 |
| #define PT_R5 48 |
| #define PT_PC 52 |
| #define PT_SEQSTAT 56 /* so-called SR reg */ |
| #define PT_SR PT_SEQSTAT |
| #define PT_ASTAT 60 |
| #define PT_RETS 64 |
| #define PT_A1w 68 |
| #define PT_A0w 72 |
| #define PT_A1x 76 |
| #define PT_A0x 80 |
| #define PT_ORIG_R0 84 |
| #define PT_R0 88 |
| #define PT_USP 92 |
| #define PT_FP 96 |
| #define PT_SP 100 |
| |
| /* Added by HuTao, May26 2003 3:18PM */ |
| #define PT_IPEND 100 |
| |
| /* Add SYSCFG register for single stepping support */ |
| #define PT_SYSCFG 104 |
| |
| #endif |
| |
| #ifndef __ASSEMBLY__ |
| |
| #if defined(NEW_PT_REGS) |
| /* this struct defines the way the registers are stored on the |
| * stack during a system call. |
| */ |
| struct pt_regs { |
| long ipend; |
| long syscfg; |
| long seqstat; |
| long rete; |
| long retn; |
| long retx; |
| long pc; |
| long rets; |
| long reserved; |
| long astat; |
| long lb1; |
| long lb0; |
| long lt1; |
| long lt0; |
| long lc1; |
| long lc0; |
| long a1w; |
| long a1x; |
| long a0w; |
| long a0x; |
| long b3; |
| long b2; |
| long b1; |
| long b0; |
| long l3; |
| long l2; |
| long l1; |
| long l0; |
| long m3; |
| long m2; |
| long m1; |
| long m0; |
| long i3; |
| long i2; |
| long i1; |
| long i0; |
| long usp; |
| long fp; |
| long p5; |
| long p4; |
| long p3; |
| long p2; |
| long p1; |
| long p0; |
| long r7; |
| long r6; |
| long r5; |
| long r4; |
| long r3; |
| long r2; |
| long r1; |
| long r0; |
| long orig_r0; |
| }; |
| |
| #else |
| /* now we don't know what regs the system call will use */ |
| struct pt_regs { |
| long r3; |
| long r4; |
| long r2; |
| long r1; |
| long p5; |
| long p4; |
| long p3; |
| long p2; |
| long p1; |
| long p0; |
| long r7; |
| long r6; |
| long r5; |
| unsigned long pc; |
| unsigned long seqstat; |
| unsigned long astat; |
| unsigned long rets; |
| long a1w; |
| long a0w; |
| long a1x; |
| long a0x; |
| long orig_r0; |
| long r0; |
| long usp; |
| long fp; |
| /* |
| * Added for supervisor/user mode switch. |
| * |
| * HuTao May26 03 3:23PM |
| */ |
| long ipend; |
| long syscfg; |
| }; |
| |
| #endif |
| |
| /* Arbitrarily choose the same ptrace numbers as used by the Sparc code. */ |
| #define PTRACE_GETREGS 12 |
| #define PTRACE_SETREGS 13 /* ptrace signal */ |
| |
| #ifdef __KERNEL__ |
| |
| #ifndef PS_S |
| #define PS_S (0x0c00) |
| |
| /* Bit 11:10 of SEQSTAT defines user/supervisor/debug mode |
| * 00: user |
| * 01: supervisor |
| * 1x: debug |
| */ |
| |
| #define PS_M (0x1000) /* I am not sure why this is required here Akbar */ |
| #endif |
| |
| #define user_mode(regs) (!((regs)->seqstat & PS_S)) |
| #define instruction_pointer(regs) ((regs)->pc) |
| extern void show_regs(struct pt_regs *); |
| |
| #endif |
| #endif |
| #endif |