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 long orig_r8; /*to distinguish bet excp, sys call, int1 or int2 */ 54 }; 55 56 /* Callee saved registers - need to be saved only when you are scheduled out */ 57 58 struct callee_regs { 59 long res; /* Again this is not needed */ 60 long r25; 61 long r24; 62 long r23; 63 long r22; 64 long r21; 65 long r20; 66 long r19; 67 long r18; 68 long r17; 69 long r16; 70 long r15; 71 long r14; 72 long r13; 73 }; 74 75 #define instruction_pointer(regs) ((regs)->ret) 76 #define profile_pc(regs) instruction_pointer(regs) 77 78 /* return 1 if user mode or 0 if kernel mode */ 79 #define user_mode(regs) (regs->status32 & STATUS_U_MASK) 80 81 #define user_stack_pointer(regs)\ 82 ({ unsigned int sp; \ 83 if (user_mode(regs)) \ 84 sp = (regs)->sp;\ 85 else \ 86 sp = -1; \ 87 sp; \ 88 }) 89 90 /* return 1 if in syscall, 0 if Intr or Exception */ 91 #define in_syscall(regs) (((regs->orig_r8) >= 0 && \ 92 (regs->orig_r8 <= NR_syscalls)) ? 1 : 0) 93 94 #define current_pt_regs() \ 95 ({ \ 96 /* open-coded current_thread_info() */ \ 97 register unsigned long sp asm ("sp"); \ 98 unsigned long pg_start = (sp & ~(THREAD_SIZE - 1)); \ 99 (struct pt_regs *)(pg_start + THREAD_SIZE - 4) - 1; \ 100 }) 101 102 #endif /* !__ASSEMBLY__ */ 103 104 #endif /* __KERNEL__ */ 105 106 #ifndef __ASSEMBLY__ 107 /* 108 * Userspace ABI: Register state needed by 109 * -ptrace (gdbserver) 110 * -sigcontext (SA_SIGNINFO signal frame) 111 * 112 * This is to decouple pt_regs from user-space ABI, to be able to change it 113 * w/o affecting the ABI. 114 * Although the layout (initial padding) is similar to pt_regs to have some 115 * optimizations when copying pt_regs to/from user_regs_struct. 116 * 117 * Also, sigcontext only care about the scratch regs as that is what we really 118 * save/restore for signal handling. 119 */ 120 struct user_regs_struct { 121 122 struct scratch { 123 long pad; 124 long bta, lp_start, lp_end, lp_count; 125 long status32, ret, blink, fp, gp; 126 long r12, r11, r10, r9, r8, r7, r6, r5, r4, r3, r2, r1, r0; 127 long sp; 128 } scratch; 129 struct callee { 130 long pad; 131 long r25, r24, r23, r22, r21, r20; 132 long r19, r18, r17, r16, r15, r14, r13; 133 } callee; 134 long efa; /* break pt addr, for break points in delay slots */ 135 long stop_pc; /* give dbg stop_pc directly after checking orig_r8 */ 136 }; 137 #endif /* !__ASSEMBLY__ */ 138 139 #endif /* __ASM_PTRACE_H */ 140