1 /* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */ 2 /* registers.h: register frame declarations 3 * 4 * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. 5 * Written by David Howells (dhowells@redhat.com) 6 * 7 * This program is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU General Public License 9 * as published by the Free Software Foundation; either version 10 * 2 of the License, or (at your option) any later version. 11 */ 12 13 /* 14 * notes: 15 * 16 * (1) that the members of all these structures are carefully aligned to permit 17 * usage of STD/STDF instructions 18 * 19 * (2) if you change these structures, you must change the code in 20 * arch/frvnommu/kernel/{break.S,entry.S,switch_to.S,gdb-stub.c} 21 * 22 * 23 * the kernel stack space block looks like this: 24 * 25 * +0x2000 +---------------------- 26 * | union { 27 * | struct frv_frame0 { 28 * | struct user_context { 29 * | struct user_int_regs 30 * | struct user_fpmedia_regs 31 * | } 32 * | struct frv_debug_regs 33 * | } 34 * | struct pt_regs [user exception] 35 * | } 36 * +---------------------- <-- __kernel_frame0_ptr (maybe GR28) 37 * | 38 * | kernel stack 39 * | 40 * |...................... 41 * | struct pt_regs [kernel exception] 42 * |...................... <-- __kernel_frame0_ptr (maybe GR28) 43 * | 44 * | kernel stack 45 * | 46 * |...................... <-- stack pointer (GR1) 47 * | 48 * | unused stack space 49 * | 50 * +---------------------- 51 * | struct thread_info 52 * +0x0000 +---------------------- <-- __current_thread_info (GR15); 53 * 54 * note that GR28 points to the current exception frame 55 */ 56 57 #ifndef _ASM_REGISTERS_H 58 #define _ASM_REGISTERS_H 59 60 #ifndef __ASSEMBLY__ 61 #define __OFFSET(X,N) ((X)+(N)*4) 62 #define __OFFSETC(X,N) xxxxxxxxxxxxxxxxxxxxxxxx 63 #else 64 #define __OFFSET(X,N) ((X)+(N)*4) 65 #define __OFFSETC(X,N) ((X)+(N)) 66 #endif 67 68 /*****************************************************************************/ 69 /* 70 * Exception/Interrupt frame 71 * - held on kernel stack 72 * - 8-byte aligned on stack (old SP is saved in frame) 73 * - GR0 is fixed 0, so we don't save it 74 */ 75 #ifndef __ASSEMBLY__ 76 77 struct pt_regs { 78 unsigned long psr; /* Processor Status Register */ 79 unsigned long isr; /* Integer Status Register */ 80 unsigned long ccr; /* Condition Code Register */ 81 unsigned long cccr; /* Condition Code for Conditional Insns Register */ 82 unsigned long lr; /* Link Register */ 83 unsigned long lcr; /* Loop Count Register */ 84 unsigned long pc; /* Program Counter Register */ 85 unsigned long __status; /* exception status */ 86 unsigned long syscallno; /* syscall number or -1 */ 87 unsigned long orig_gr8; /* original syscall arg #1 */ 88 unsigned long gner0; 89 unsigned long gner1; 90 unsigned long long iacc0; 91 unsigned long tbr; /* GR0 is fixed zero, so we use this for TBR */ 92 unsigned long sp; /* GR1: USP/KSP */ 93 unsigned long fp; /* GR2: FP */ 94 unsigned long gr3; 95 unsigned long gr4; 96 unsigned long gr5; 97 unsigned long gr6; 98 unsigned long gr7; /* syscall number */ 99 unsigned long gr8; /* 1st syscall param; syscall return */ 100 unsigned long gr9; /* 2nd syscall param */ 101 unsigned long gr10; /* 3rd syscall param */ 102 unsigned long gr11; /* 4th syscall param */ 103 unsigned long gr12; /* 5th syscall param */ 104 unsigned long gr13; /* 6th syscall param */ 105 unsigned long gr14; 106 unsigned long gr15; 107 unsigned long gr16; /* GP pointer */ 108 unsigned long gr17; /* small data */ 109 unsigned long gr18; /* PIC/PID */ 110 unsigned long gr19; 111 unsigned long gr20; 112 unsigned long gr21; 113 unsigned long gr22; 114 unsigned long gr23; 115 unsigned long gr24; 116 unsigned long gr25; 117 unsigned long gr26; 118 unsigned long gr27; 119 struct pt_regs *next_frame; /* GR28 - next exception frame */ 120 unsigned long gr29; /* GR29 - OS reserved */ 121 unsigned long gr30; /* GR30 - OS reserved */ 122 unsigned long gr31; /* GR31 - OS reserved */ 123 } __attribute__((aligned(8))); 124 125 #endif 126 127 #define REG__STATUS_STEP 0x00000001 /* - reenable single stepping on return */ 128 #define REG__STATUS_STEPPED 0x00000002 /* - single step caused exception */ 129 #define REG__STATUS_BROKE 0x00000004 /* - BREAK insn caused exception */ 130 #define REG__STATUS_SYSC_ENTRY 0x40000000 /* - T on syscall entry (ptrace.c only) */ 131 #define REG__STATUS_SYSC_EXIT 0x80000000 /* - T on syscall exit (ptrace.c only) */ 132 133 #define REG_GR(R) __OFFSET(REG_GR0, (R)) 134 135 #define REG_SP REG_GR(1) 136 #define REG_FP REG_GR(2) 137 #define REG_PREV_FRAME REG_GR(28) /* previous exception frame pointer (old gr28 value) */ 138 #define REG_CURR_TASK REG_GR(29) /* current task */ 139 140 /*****************************************************************************/ 141 /* 142 * debugging registers 143 */ 144 #ifndef __ASSEMBLY__ 145 146 struct frv_debug_regs 147 { 148 unsigned long dcr; 149 unsigned long ibar[4] __attribute__((aligned(8))); 150 unsigned long dbar[4] __attribute__((aligned(8))); 151 unsigned long dbdr[4][4] __attribute__((aligned(8))); 152 unsigned long dbmr[4][4] __attribute__((aligned(8))); 153 } __attribute__((aligned(8))); 154 155 #endif 156 157 /*****************************************************************************/ 158 /* 159 * userspace registers 160 */ 161 #ifndef __ASSEMBLY__ 162 163 struct user_int_regs 164 { 165 /* integer registers 166 * - up to gr[31] mirror pt_regs 167 * - total size must be multiple of 8 bytes 168 */ 169 unsigned long psr; /* Processor Status Register */ 170 unsigned long isr; /* Integer Status Register */ 171 unsigned long ccr; /* Condition Code Register */ 172 unsigned long cccr; /* Condition Code for Conditional Insns Register */ 173 unsigned long lr; /* Link Register */ 174 unsigned long lcr; /* Loop Count Register */ 175 unsigned long pc; /* Program Counter Register */ 176 unsigned long __status; /* exception status */ 177 unsigned long syscallno; /* syscall number or -1 */ 178 unsigned long orig_gr8; /* original syscall arg #1 */ 179 unsigned long gner[2]; 180 unsigned long long iacc[1]; 181 182 union { 183 unsigned long tbr; 184 unsigned long gr[64]; 185 }; 186 }; 187 188 struct user_fpmedia_regs 189 { 190 /* FP/Media registers */ 191 unsigned long fr[64]; 192 unsigned long fner[2]; 193 unsigned long msr[2]; 194 unsigned long acc[8]; 195 unsigned char accg[8]; 196 unsigned long fsr[1]; 197 }; 198 199 struct user_context 200 { 201 struct user_int_regs i; 202 struct user_fpmedia_regs f; 203 204 /* we provide a context extension so that we can save the regs for CPUs that 205 * implement many more of Fujitsu's lavish register spec 206 */ 207 void *extension; 208 } __attribute__((aligned(8))); 209 210 struct frv_frame0 { 211 union { 212 struct pt_regs regs; 213 struct user_context uc; 214 }; 215 216 struct frv_debug_regs debug; 217 218 } __attribute__((aligned(32))); 219 220 #endif 221 222 #define __INT_GR(R) __OFFSET(__INT_GR0, (R)) 223 224 #define __FPMEDIA_FR(R) __OFFSET(__FPMEDIA_FR0, (R)) 225 #define __FPMEDIA_FNER(R) __OFFSET(__FPMEDIA_FNER0, (R)) 226 #define __FPMEDIA_MSR(R) __OFFSET(__FPMEDIA_MSR0, (R)) 227 #define __FPMEDIA_ACC(R) __OFFSET(__FPMEDIA_ACC0, (R)) 228 #define __FPMEDIA_ACCG(R) __OFFSETC(__FPMEDIA_ACCG0, (R)) 229 #define __FPMEDIA_FSR(R) __OFFSET(__FPMEDIA_FSR0, (R)) 230 231 #define __THREAD_GR(R) __OFFSET(__THREAD_GR16, (R) - 16) 232 233 #endif /* _ASM_REGISTERS_H */ 234