Merge tag 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost
[cris-mirror.git] / arch / frv / include / uapi / asm / registers.h
blob4caf09b6c193fbeeb1bc148077ae0101213a99bc
1 /* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
2 /* registers.h: register frame declarations
4 * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved.
5 * Written by David Howells (dhowells@redhat.com)
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.
14 * notes:
16 * (1) that the members of all these structures are carefully aligned to permit
17 * usage of STD/STDF instructions
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}
23 * the kernel stack space block looks like this:
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);
54 * note that GR28 points to the current exception frame
57 #ifndef _ASM_REGISTERS_H
58 #define _ASM_REGISTERS_H
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
68 /*****************************************************************************/
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
75 #ifndef __ASSEMBLY__
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)));
125 #endif
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) */
133 #define REG_GR(R) __OFFSET(REG_GR0, (R))
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 */
140 /*****************************************************************************/
142 * debugging registers
144 #ifndef __ASSEMBLY__
146 struct frv_debug_regs
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)));
155 #endif
157 /*****************************************************************************/
159 * userspace registers
161 #ifndef __ASSEMBLY__
163 struct user_int_regs
165 /* integer registers
166 * - up to gr[31] mirror pt_regs
167 * - total size must be multiple of 8 bytes
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];
182 union {
183 unsigned long tbr;
184 unsigned long gr[64];
188 struct user_fpmedia_regs
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];
199 struct user_context
201 struct user_int_regs i;
202 struct user_fpmedia_regs f;
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
207 void *extension;
208 } __attribute__((aligned(8)));
210 struct frv_frame0 {
211 union {
212 struct pt_regs regs;
213 struct user_context uc;
216 struct frv_debug_regs debug;
218 } __attribute__((aligned(32)));
220 #endif
222 #define __INT_GR(R) __OFFSET(__INT_GR0, (R))
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))
231 #define __THREAD_GR(R) __OFFSET(__THREAD_GR16, (R) - 16)
233 #endif /* _ASM_REGISTERS_H */