Blame view

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