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