• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*	$NetBSD: _regset.h,v 1.1 2006/04/07 14:21:18 cherry Exp $	*/
2 
3 /*-
4  * Copyright (c) 2002, 2003 Marcel Moolenaar
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  *
28  * $FreeBSD$
29  */
30 
31 #ifndef _MACHINE_REGSET_H_
32 #define	_MACHINE_REGSET_H_
33 
34 /*
35  * Create register sets, based on the runtime specification. This allows
36  * us to better reuse code and to copy sets around more efficiently.
37  * Contexts are defined in terms of these sets. These include trapframe,
38  * sigframe, pcb, mcontext, reg and fpreg. Other candidates are unwind
39  * and coredump related contexts.
40  *
41  * Notes:
42  * o  Constant registers (r0, f0 and f1) are not accounted for,
43  * o  The stacked registers (r32-r127) are not accounted for,
44  * o  Predicates are not split across sets.
45  */
46 
47 /* A single FP register. */
48 union _ia64_fpreg {
49 	unsigned char	fpr_bits[16];
50 	long double	fpr_flt;
51 };
52 
53 /*
54  * Special registers.
55  */
56 struct _special {
57 	unsigned long		sp;
58 	unsigned long		unat;		/* NaT before spilling */
59 	unsigned long		rp;
60 	unsigned long		pr;
61 	unsigned long		pfs;
62 	unsigned long		bspstore;
63 	unsigned long		rnat;
64 	unsigned long		__spare;
65 	/* Userland context and syscalls */
66 	unsigned long		tp;
67 	unsigned long		rsc;
68 	unsigned long		fpsr;
69 	unsigned long		psr;
70 	/* ASYNC: Interrupt specific */
71 	unsigned long		gp;
72 	unsigned long		ndirty;
73 	unsigned long		cfm;
74 	unsigned long		iip;
75 	unsigned long		ifa;
76 	unsigned long		isr;
77 };
78 
79 struct _high_fp {
80 	union _ia64_fpreg	fr32;
81 	union _ia64_fpreg	fr33;
82 	union _ia64_fpreg	fr34;
83 	union _ia64_fpreg	fr35;
84 	union _ia64_fpreg	fr36;
85 	union _ia64_fpreg	fr37;
86 	union _ia64_fpreg	fr38;
87 	union _ia64_fpreg	fr39;
88 	union _ia64_fpreg	fr40;
89 	union _ia64_fpreg	fr41;
90 	union _ia64_fpreg	fr42;
91 	union _ia64_fpreg	fr43;
92 	union _ia64_fpreg	fr44;
93 	union _ia64_fpreg	fr45;
94 	union _ia64_fpreg	fr46;
95 	union _ia64_fpreg	fr47;
96 	union _ia64_fpreg	fr48;
97 	union _ia64_fpreg	fr49;
98 	union _ia64_fpreg	fr50;
99 	union _ia64_fpreg	fr51;
100 	union _ia64_fpreg	fr52;
101 	union _ia64_fpreg	fr53;
102 	union _ia64_fpreg	fr54;
103 	union _ia64_fpreg	fr55;
104 	union _ia64_fpreg	fr56;
105 	union _ia64_fpreg	fr57;
106 	union _ia64_fpreg	fr58;
107 	union _ia64_fpreg	fr59;
108 	union _ia64_fpreg	fr60;
109 	union _ia64_fpreg	fr61;
110 	union _ia64_fpreg	fr62;
111 	union _ia64_fpreg	fr63;
112 	union _ia64_fpreg	fr64;
113 	union _ia64_fpreg	fr65;
114 	union _ia64_fpreg	fr66;
115 	union _ia64_fpreg	fr67;
116 	union _ia64_fpreg	fr68;
117 	union _ia64_fpreg	fr69;
118 	union _ia64_fpreg	fr70;
119 	union _ia64_fpreg	fr71;
120 	union _ia64_fpreg	fr72;
121 	union _ia64_fpreg	fr73;
122 	union _ia64_fpreg	fr74;
123 	union _ia64_fpreg	fr75;
124 	union _ia64_fpreg	fr76;
125 	union _ia64_fpreg	fr77;
126 	union _ia64_fpreg	fr78;
127 	union _ia64_fpreg	fr79;
128 	union _ia64_fpreg	fr80;
129 	union _ia64_fpreg	fr81;
130 	union _ia64_fpreg	fr82;
131 	union _ia64_fpreg	fr83;
132 	union _ia64_fpreg	fr84;
133 	union _ia64_fpreg	fr85;
134 	union _ia64_fpreg	fr86;
135 	union _ia64_fpreg	fr87;
136 	union _ia64_fpreg	fr88;
137 	union _ia64_fpreg	fr89;
138 	union _ia64_fpreg	fr90;
139 	union _ia64_fpreg	fr91;
140 	union _ia64_fpreg	fr92;
141 	union _ia64_fpreg	fr93;
142 	union _ia64_fpreg	fr94;
143 	union _ia64_fpreg	fr95;
144 	union _ia64_fpreg	fr96;
145 	union _ia64_fpreg	fr97;
146 	union _ia64_fpreg	fr98;
147 	union _ia64_fpreg	fr99;
148 	union _ia64_fpreg	fr100;
149 	union _ia64_fpreg	fr101;
150 	union _ia64_fpreg	fr102;
151 	union _ia64_fpreg	fr103;
152 	union _ia64_fpreg	fr104;
153 	union _ia64_fpreg	fr105;
154 	union _ia64_fpreg	fr106;
155 	union _ia64_fpreg	fr107;
156 	union _ia64_fpreg	fr108;
157 	union _ia64_fpreg	fr109;
158 	union _ia64_fpreg	fr110;
159 	union _ia64_fpreg	fr111;
160 	union _ia64_fpreg	fr112;
161 	union _ia64_fpreg	fr113;
162 	union _ia64_fpreg	fr114;
163 	union _ia64_fpreg	fr115;
164 	union _ia64_fpreg	fr116;
165 	union _ia64_fpreg	fr117;
166 	union _ia64_fpreg	fr118;
167 	union _ia64_fpreg	fr119;
168 	union _ia64_fpreg	fr120;
169 	union _ia64_fpreg	fr121;
170 	union _ia64_fpreg	fr122;
171 	union _ia64_fpreg	fr123;
172 	union _ia64_fpreg	fr124;
173 	union _ia64_fpreg	fr125;
174 	union _ia64_fpreg	fr126;
175 	union _ia64_fpreg	fr127;
176 };
177 
178 /*
179  * Preserved registers.
180  */
181 struct _callee_saved {
182 	unsigned long		unat;		/* NaT after spilling. */
183 	unsigned long		gr4;
184 	unsigned long		gr5;
185 	unsigned long		gr6;
186 	unsigned long		gr7;
187 	unsigned long		br1;
188 	unsigned long		br2;
189 	unsigned long		br3;
190 	unsigned long		br4;
191 	unsigned long		br5;
192 	unsigned long		lc;
193 	unsigned long		__spare;
194 };
195 
196 struct _callee_saved_fp {
197 	union _ia64_fpreg	fr2;
198 	union _ia64_fpreg	fr3;
199 	union _ia64_fpreg	fr4;
200 	union _ia64_fpreg	fr5;
201 	union _ia64_fpreg	fr16;
202 	union _ia64_fpreg	fr17;
203 	union _ia64_fpreg	fr18;
204 	union _ia64_fpreg	fr19;
205 	union _ia64_fpreg	fr20;
206 	union _ia64_fpreg	fr21;
207 	union _ia64_fpreg	fr22;
208 	union _ia64_fpreg	fr23;
209 	union _ia64_fpreg	fr24;
210 	union _ia64_fpreg	fr25;
211 	union _ia64_fpreg	fr26;
212 	union _ia64_fpreg	fr27;
213 	union _ia64_fpreg	fr28;
214 	union _ia64_fpreg	fr29;
215 	union _ia64_fpreg	fr30;
216 	union _ia64_fpreg	fr31;
217 };
218 
219 /*
220  * Scratch registers.
221  */
222 struct _caller_saved {
223 	unsigned long		unat;		/* NaT after spilling. */
224 	unsigned long		gr2;
225 	unsigned long		gr3;
226 	unsigned long		gr8;
227 	unsigned long		gr9;
228 	unsigned long		gr10;
229 	unsigned long		gr11;
230 	unsigned long		gr14;
231 	unsigned long		gr15;
232 	unsigned long		gr16;
233 	unsigned long		gr17;
234 	unsigned long		gr18;
235 	unsigned long		gr19;
236 	unsigned long		gr20;
237 	unsigned long		gr21;
238 	unsigned long		gr22;
239 	unsigned long		gr23;
240 	unsigned long		gr24;
241 	unsigned long		gr25;
242 	unsigned long		gr26;
243 	unsigned long		gr27;
244 	unsigned long		gr28;
245 	unsigned long		gr29;
246 	unsigned long		gr30;
247 	unsigned long		gr31;
248 	unsigned long		br6;
249 	unsigned long		br7;
250 	unsigned long		ccv;
251 	unsigned long		csd;
252 	unsigned long		ssd;
253 };
254 
255 struct _caller_saved_fp {
256 	union _ia64_fpreg	fr6;
257 	union _ia64_fpreg	fr7;
258 	union _ia64_fpreg	fr8;
259 	union _ia64_fpreg	fr9;
260 	union _ia64_fpreg	fr10;
261 	union _ia64_fpreg	fr11;
262 	union _ia64_fpreg	fr12;
263 	union _ia64_fpreg	fr13;
264 	union _ia64_fpreg	fr14;
265 	union _ia64_fpreg	fr15;
266 };
267 
268 #ifdef _KERNEL
269 void	restore_callee_saved(const struct _callee_saved *);
270 void	restore_callee_saved_fp(const struct _callee_saved_fp *);
271 void	restore_high_fp(const struct _high_fp *);
272 void	save_callee_saved(struct _callee_saved *);
273 void	save_callee_saved_fp(struct _callee_saved_fp *);
274 void	save_high_fp(struct _high_fp *);
275 #endif
276 
277 #endif	/* _MACHINE_REGSET_H_ */
278