1 /* 2 * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com) 3 * 4 * This program is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License version 2 as 6 * published by the Free Software Foundation. 7 * 8 * Amit Bhor, Sameer Dhavale: Codito Technologies 2004 9 */ 10 11 #ifndef __ASM_ARC_PTRACE_H 12 #define __ASM_ARC_PTRACE_H 13 14 #ifdef __KERNEL__ 15 16 #ifndef __ASSEMBLY__ 17 18 /* THE pt_regs: Defines how regs are saved during entry into kernel */ 19 20 struct pt_regs { 21 /* 22 * 1 word gutter after reg-file has been saved 23 * Technically not needed, Since SP always points to a "full" location 24 * (vs. "empty"). But pt_regs is shared with tools.... 25 */ 26 long res; 27 28 /* Real registers */ 29 long bta; /* bta_l1, bta_l2, erbta */ 30 long lp_start; 31 long lp_end; 32 long lp_count; 33 long status32; /* status32_l1, status32_l2, erstatus */ 34 long ret; /* ilink1, ilink2 or eret */ 35 long blink; 36 long fp; 37 long r26; /* gp */ 38 long r12; 39 long r11; 40 long r10; 41 long r9; 42 long r8; 43 long r7; 44 long r6; 45 long r5; 46 long r4; 47 long r3; 48 long r2; 49 long r1; 50 long r0; 51 long sp; /* user/kernel sp depending on where we came from */ 52 long orig_r0; 53 54 /*to distinguish bet excp, syscall, irq */ 55 union { 56 #ifdef CONFIG_CPU_BIG_ENDIAN 57 /* so that assembly code is same for LE/BE */ 58 unsigned long orig_r8:16, event:16; 59 #else 60 unsigned long event:16, orig_r8:16; 61 #endif 62 long orig_r8_word; 63 }; 64 }; 65 66 /* Callee saved registers - need to be saved only when you are scheduled out */ 67 68 struct callee_regs { 69 long res; /* Again this is not needed */ 70 long r25; 71 long r24; 72 long r23; 73 long r22; 74 long r21; 75 long r20; 76 long r19; 77 long r18; 78 long r17; 79 long r16; 80 long r15; 81 long r14; 82 long r13; 83 }; 84 85 #define instruction_pointer(regs) ((regs)->ret) 86 #define profile_pc(regs) instruction_pointer(regs) 87 88 /* return 1 if user mode or 0 if kernel mode */ 89 #define user_mode(regs) (regs->status32 & STATUS_U_MASK) 90 91 #define user_stack_pointer(regs)\ 92 ({ unsigned int sp; \ 93 if (user_mode(regs)) \ 94 sp = (regs)->sp;\ 95 else \ 96 sp = -1; \ 97 sp; \ 98 }) 99 100 #define in_syscall(regs) (regs->event & orig_r8_IS_SCALL) 101 #define in_brkpt_trap(regs) (regs->event & orig_r8_IS_BRKPT) 102 103 #define syscall_wont_restart(regs) (regs->event |= orig_r8_IS_SCALL_RESTARTED) 104 #define syscall_restartable(regs) !(regs->event & orig_r8_IS_SCALL_RESTARTED) 105 106 #define current_pt_regs() \ 107 ({ \ 108 /* open-coded current_thread_info() */ \ 109 register unsigned long sp asm ("sp"); \ 110 unsigned long pg_start = (sp & ~(THREAD_SIZE - 1)); \ 111 (struct pt_regs *)(pg_start + THREAD_SIZE - 4) - 1; \ 112 }) 113 114 static inline long regs_return_value(struct pt_regs *regs) 115 { 116 return regs->r0; 117 } 118 119 #endif /* !__ASSEMBLY__ */ 120 121 #define orig_r8_IS_SCALL 0x0001 122 #define orig_r8_IS_SCALL_RESTARTED 0x0002 123 #define orig_r8_IS_BRKPT 0x0004 124 #define orig_r8_IS_EXCPN 0x0004 125 #define orig_r8_IS_IRQ1 0x0010 126 #define orig_r8_IS_IRQ2 0x0020 127 128 #endif /* __KERNEL__ */ 129 130 #ifndef __ASSEMBLY__ 131 /* 132 * Userspace ABI: Register state needed by 133 * -ptrace (gdbserver) 134 * -sigcontext (SA_SIGNINFO signal frame) 135 * 136 * This is to decouple pt_regs from user-space ABI, to be able to change it 137 * w/o affecting the ABI. 138 * Although the layout (initial padding) is similar to pt_regs to have some 139 * optimizations when copying pt_regs to/from user_regs_struct. 140 * 141 * Also, sigcontext only care about the scratch regs as that is what we really 142 * save/restore for signal handling. 143 */ 144 struct user_regs_struct { 145 146 struct scratch { 147 long pad; 148 long bta, lp_start, lp_end, lp_count; 149 long status32, ret, blink, fp, gp; 150 long r12, r11, r10, r9, r8, r7, r6, r5, r4, r3, r2, r1, r0; 151 long sp; 152 } scratch; 153 struct callee { 154 long pad; 155 long r25, r24, r23, r22, r21, r20; 156 long r19, r18, r17, r16, r15, r14, r13; 157 } callee; 158 long efa; /* break pt addr, for break points in delay slots */ 159 long stop_pc; /* give dbg stop_pc directly after checking orig_r8 */ 160 }; 161 #endif /* !__ASSEMBLY__ */ 162 163 #endif /* __ASM_PTRACE_H */ 164