1139790Simp/*-
2115019Smarcel * Copyright (c) 2002, 2003 Marcel Moolenaar
3115019Smarcel * All rights reserved.
4115019Smarcel *
5115019Smarcel * Redistribution and use in source and binary forms, with or without
6115019Smarcel * modification, are permitted provided that the following conditions
7115019Smarcel * are met:
8115019Smarcel *
9115019Smarcel * 1. Redistributions of source code must retain the above copyright
10115019Smarcel *    notice, this list of conditions and the following disclaimer.
11115019Smarcel * 2. Redistributions in binary form must reproduce the above copyright
12115019Smarcel *    notice, this list of conditions and the following disclaimer in the
13115019Smarcel *    documentation and/or other materials provided with the distribution.
14115019Smarcel *
15115019Smarcel * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16115019Smarcel * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17115019Smarcel * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18115019Smarcel * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19115019Smarcel * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20115019Smarcel * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21115019Smarcel * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22115019Smarcel * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23115019Smarcel * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24115019Smarcel * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25115019Smarcel *
26115019Smarcel * $FreeBSD: releng/10.3/sys/ia64/include/_regset.h 139790 2005-01-06 22:18:23Z imp $
27115019Smarcel */
28115019Smarcel
29115019Smarcel#ifndef _MACHINE_REGSET_H_
30115019Smarcel#define	_MACHINE_REGSET_H_
31115019Smarcel
32115019Smarcel/*
33115019Smarcel * Create register sets, based on the runtime specification. This allows
34115019Smarcel * us to better reuse code and to copy sets around more efficiently.
35115019Smarcel * Contexts are defined in terms of these sets. These include trapframe,
36115019Smarcel * sigframe, pcb, mcontext, reg and fpreg. Other candidates are unwind
37115019Smarcel * and coredump related contexts.
38115019Smarcel *
39115019Smarcel * Notes:
40115019Smarcel * o  Constant registers (r0, f0 and f1) are not accounted for,
41115019Smarcel * o  The stacked registers (r32-r127) are not accounted for,
42115019Smarcel * o  Predicates are not split across sets.
43115019Smarcel */
44115019Smarcel
45115019Smarcel/* A single FP register. */
46117999Smarcelunion _ia64_fpreg {
47115019Smarcel	unsigned char	fpr_bits[16];
48117999Smarcel	long double	fpr_flt;
49117999Smarcel};
50115019Smarcel
51115019Smarcel/*
52115019Smarcel * Special registers.
53115019Smarcel */
54115019Smarcelstruct _special {
55115019Smarcel	unsigned long		sp;
56115019Smarcel	unsigned long		unat;		/* NaT before spilling */
57115019Smarcel	unsigned long		rp;
58115019Smarcel	unsigned long		pr;
59115019Smarcel	unsigned long		pfs;
60115019Smarcel	unsigned long		bspstore;
61115019Smarcel	unsigned long		rnat;
62115019Smarcel	unsigned long		__spare;
63115019Smarcel	/* Userland context and syscalls */
64115019Smarcel	unsigned long		tp;
65115019Smarcel	unsigned long		rsc;
66115019Smarcel	unsigned long		fpsr;
67115019Smarcel	unsigned long		psr;
68115019Smarcel	/* ASYNC: Interrupt specific */
69115019Smarcel	unsigned long		gp;
70115019Smarcel	unsigned long		ndirty;
71115019Smarcel	unsigned long		cfm;
72115019Smarcel	unsigned long		iip;
73115019Smarcel	unsigned long		ifa;
74115019Smarcel	unsigned long		isr;
75115019Smarcel};
76115019Smarcel
77115019Smarcelstruct _high_fp {
78117999Smarcel	union _ia64_fpreg	fr32;
79117999Smarcel	union _ia64_fpreg	fr33;
80117999Smarcel	union _ia64_fpreg	fr34;
81117999Smarcel	union _ia64_fpreg	fr35;
82117999Smarcel	union _ia64_fpreg	fr36;
83117999Smarcel	union _ia64_fpreg	fr37;
84117999Smarcel	union _ia64_fpreg	fr38;
85117999Smarcel	union _ia64_fpreg	fr39;
86117999Smarcel	union _ia64_fpreg	fr40;
87117999Smarcel	union _ia64_fpreg	fr41;
88117999Smarcel	union _ia64_fpreg	fr42;
89117999Smarcel	union _ia64_fpreg	fr43;
90117999Smarcel	union _ia64_fpreg	fr44;
91117999Smarcel	union _ia64_fpreg	fr45;
92117999Smarcel	union _ia64_fpreg	fr46;
93117999Smarcel	union _ia64_fpreg	fr47;
94117999Smarcel	union _ia64_fpreg	fr48;
95117999Smarcel	union _ia64_fpreg	fr49;
96117999Smarcel	union _ia64_fpreg	fr50;
97117999Smarcel	union _ia64_fpreg	fr51;
98117999Smarcel	union _ia64_fpreg	fr52;
99117999Smarcel	union _ia64_fpreg	fr53;
100117999Smarcel	union _ia64_fpreg	fr54;
101117999Smarcel	union _ia64_fpreg	fr55;
102117999Smarcel	union _ia64_fpreg	fr56;
103117999Smarcel	union _ia64_fpreg	fr57;
104117999Smarcel	union _ia64_fpreg	fr58;
105117999Smarcel	union _ia64_fpreg	fr59;
106117999Smarcel	union _ia64_fpreg	fr60;
107117999Smarcel	union _ia64_fpreg	fr61;
108117999Smarcel	union _ia64_fpreg	fr62;
109117999Smarcel	union _ia64_fpreg	fr63;
110117999Smarcel	union _ia64_fpreg	fr64;
111117999Smarcel	union _ia64_fpreg	fr65;
112117999Smarcel	union _ia64_fpreg	fr66;
113117999Smarcel	union _ia64_fpreg	fr67;
114117999Smarcel	union _ia64_fpreg	fr68;
115117999Smarcel	union _ia64_fpreg	fr69;
116117999Smarcel	union _ia64_fpreg	fr70;
117117999Smarcel	union _ia64_fpreg	fr71;
118117999Smarcel	union _ia64_fpreg	fr72;
119117999Smarcel	union _ia64_fpreg	fr73;
120117999Smarcel	union _ia64_fpreg	fr74;
121117999Smarcel	union _ia64_fpreg	fr75;
122117999Smarcel	union _ia64_fpreg	fr76;
123117999Smarcel	union _ia64_fpreg	fr77;
124117999Smarcel	union _ia64_fpreg	fr78;
125117999Smarcel	union _ia64_fpreg	fr79;
126117999Smarcel	union _ia64_fpreg	fr80;
127117999Smarcel	union _ia64_fpreg	fr81;
128117999Smarcel	union _ia64_fpreg	fr82;
129117999Smarcel	union _ia64_fpreg	fr83;
130117999Smarcel	union _ia64_fpreg	fr84;
131117999Smarcel	union _ia64_fpreg	fr85;
132117999Smarcel	union _ia64_fpreg	fr86;
133117999Smarcel	union _ia64_fpreg	fr87;
134117999Smarcel	union _ia64_fpreg	fr88;
135117999Smarcel	union _ia64_fpreg	fr89;
136117999Smarcel	union _ia64_fpreg	fr90;
137117999Smarcel	union _ia64_fpreg	fr91;
138117999Smarcel	union _ia64_fpreg	fr92;
139117999Smarcel	union _ia64_fpreg	fr93;
140117999Smarcel	union _ia64_fpreg	fr94;
141117999Smarcel	union _ia64_fpreg	fr95;
142117999Smarcel	union _ia64_fpreg	fr96;
143117999Smarcel	union _ia64_fpreg	fr97;
144117999Smarcel	union _ia64_fpreg	fr98;
145117999Smarcel	union _ia64_fpreg	fr99;
146117999Smarcel	union _ia64_fpreg	fr100;
147117999Smarcel	union _ia64_fpreg	fr101;
148117999Smarcel	union _ia64_fpreg	fr102;
149117999Smarcel	union _ia64_fpreg	fr103;
150117999Smarcel	union _ia64_fpreg	fr104;
151117999Smarcel	union _ia64_fpreg	fr105;
152117999Smarcel	union _ia64_fpreg	fr106;
153117999Smarcel	union _ia64_fpreg	fr107;
154117999Smarcel	union _ia64_fpreg	fr108;
155117999Smarcel	union _ia64_fpreg	fr109;
156117999Smarcel	union _ia64_fpreg	fr110;
157117999Smarcel	union _ia64_fpreg	fr111;
158117999Smarcel	union _ia64_fpreg	fr112;
159117999Smarcel	union _ia64_fpreg	fr113;
160117999Smarcel	union _ia64_fpreg	fr114;
161117999Smarcel	union _ia64_fpreg	fr115;
162117999Smarcel	union _ia64_fpreg	fr116;
163117999Smarcel	union _ia64_fpreg	fr117;
164117999Smarcel	union _ia64_fpreg	fr118;
165117999Smarcel	union _ia64_fpreg	fr119;
166117999Smarcel	union _ia64_fpreg	fr120;
167117999Smarcel	union _ia64_fpreg	fr121;
168117999Smarcel	union _ia64_fpreg	fr122;
169117999Smarcel	union _ia64_fpreg	fr123;
170117999Smarcel	union _ia64_fpreg	fr124;
171117999Smarcel	union _ia64_fpreg	fr125;
172117999Smarcel	union _ia64_fpreg	fr126;
173117999Smarcel	union _ia64_fpreg	fr127;
174115019Smarcel};
175115019Smarcel
176115019Smarcel/*
177115019Smarcel * Preserved registers.
178115019Smarcel */
179115019Smarcelstruct _callee_saved {
180115019Smarcel	unsigned long		unat;		/* NaT after spilling. */
181115019Smarcel	unsigned long		gr4;
182115019Smarcel	unsigned long		gr5;
183115019Smarcel	unsigned long		gr6;
184115019Smarcel	unsigned long		gr7;
185115019Smarcel	unsigned long		br1;
186115019Smarcel	unsigned long		br2;
187115019Smarcel	unsigned long		br3;
188115019Smarcel	unsigned long		br4;
189115019Smarcel	unsigned long		br5;
190115019Smarcel	unsigned long		lc;
191115019Smarcel	unsigned long		__spare;
192115019Smarcel};
193115019Smarcel
194115019Smarcelstruct _callee_saved_fp {
195117999Smarcel	union _ia64_fpreg	fr2;
196117999Smarcel	union _ia64_fpreg	fr3;
197117999Smarcel	union _ia64_fpreg	fr4;
198117999Smarcel	union _ia64_fpreg	fr5;
199117999Smarcel	union _ia64_fpreg	fr16;
200117999Smarcel	union _ia64_fpreg	fr17;
201117999Smarcel	union _ia64_fpreg	fr18;
202117999Smarcel	union _ia64_fpreg	fr19;
203117999Smarcel	union _ia64_fpreg	fr20;
204117999Smarcel	union _ia64_fpreg	fr21;
205117999Smarcel	union _ia64_fpreg	fr22;
206117999Smarcel	union _ia64_fpreg	fr23;
207117999Smarcel	union _ia64_fpreg	fr24;
208117999Smarcel	union _ia64_fpreg	fr25;
209117999Smarcel	union _ia64_fpreg	fr26;
210117999Smarcel	union _ia64_fpreg	fr27;
211117999Smarcel	union _ia64_fpreg	fr28;
212117999Smarcel	union _ia64_fpreg	fr29;
213117999Smarcel	union _ia64_fpreg	fr30;
214117999Smarcel	union _ia64_fpreg	fr31;
215115019Smarcel};
216115019Smarcel
217115019Smarcel/*
218115019Smarcel * Scratch registers.
219115019Smarcel */
220115019Smarcelstruct _caller_saved {
221115019Smarcel	unsigned long		unat;		/* NaT after spilling. */
222115019Smarcel	unsigned long		gr2;
223115019Smarcel	unsigned long		gr3;
224115019Smarcel	unsigned long		gr8;
225115019Smarcel	unsigned long		gr9;
226115019Smarcel	unsigned long		gr10;
227115019Smarcel	unsigned long		gr11;
228115019Smarcel	unsigned long		gr14;
229115019Smarcel	unsigned long		gr15;
230115019Smarcel	unsigned long		gr16;
231115019Smarcel	unsigned long		gr17;
232115019Smarcel	unsigned long		gr18;
233115019Smarcel	unsigned long		gr19;
234115019Smarcel	unsigned long		gr20;
235115019Smarcel	unsigned long		gr21;
236115019Smarcel	unsigned long		gr22;
237115019Smarcel	unsigned long		gr23;
238115019Smarcel	unsigned long		gr24;
239115019Smarcel	unsigned long		gr25;
240115019Smarcel	unsigned long		gr26;
241115019Smarcel	unsigned long		gr27;
242115019Smarcel	unsigned long		gr28;
243115019Smarcel	unsigned long		gr29;
244115019Smarcel	unsigned long		gr30;
245115019Smarcel	unsigned long		gr31;
246115019Smarcel	unsigned long		br6;
247115019Smarcel	unsigned long		br7;
248115019Smarcel	unsigned long		ccv;
249115019Smarcel	unsigned long		csd;
250115019Smarcel	unsigned long		ssd;
251115019Smarcel};
252115019Smarcel
253115019Smarcelstruct _caller_saved_fp {
254117999Smarcel	union _ia64_fpreg	fr6;
255117999Smarcel	union _ia64_fpreg	fr7;
256117999Smarcel	union _ia64_fpreg	fr8;
257117999Smarcel	union _ia64_fpreg	fr9;
258117999Smarcel	union _ia64_fpreg	fr10;
259117999Smarcel	union _ia64_fpreg	fr11;
260117999Smarcel	union _ia64_fpreg	fr12;
261117999Smarcel	union _ia64_fpreg	fr13;
262117999Smarcel	union _ia64_fpreg	fr14;
263117999Smarcel	union _ia64_fpreg	fr15;
264115019Smarcel};
265115019Smarcel
266115019Smarcel#ifdef _KERNEL
267115564Smarcelvoid	restore_callee_saved(const struct _callee_saved *);
268115564Smarcelvoid	restore_callee_saved_fp(const struct _callee_saved_fp *);
269115564Smarcelvoid	restore_high_fp(const struct _high_fp *);
270115019Smarcelvoid	save_callee_saved(struct _callee_saved *);
271115019Smarcelvoid	save_callee_saved_fp(struct _callee_saved_fp *);
272115019Smarcelvoid	save_high_fp(struct _high_fp *);
273115019Smarcel#endif
274115019Smarcel
275115019Smarcel#endif	/* _MACHINE_REGSET_H_ */
276