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
26
27
28
29
30
31
32
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
60
61
62
63
64
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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
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
|
/*
* Copyright (c) 2002, 2003 Marcel Moolenaar
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $FreeBSD$
*/
#ifndef _MACHINE_REGSET_H_
#define _MACHINE_REGSET_H_
/*
* Create register sets, based on the runtime specification. This allows
* us to better reuse code and to copy sets around more efficiently.
* Contexts are defined in terms of these sets. These include trapframe,
* sigframe, pcb, mcontext, reg and fpreg. Other candidates are unwind
* and coredump related contexts.
*
* Notes:
* o Constant registers (r0, f0 and f1) are not accounted for,
* o The stacked registers (r32-r127) are not accounted for,
* o Predicates are not split across sets.
*/
/* A single FP register. */
struct _ia64_fpreg {
unsigned char fpr_bits[16];
} __aligned(16);
/*
* Special registers.
*/
struct _special {
unsigned long sp;
unsigned long unat; /* NaT before spilling */
unsigned long rp;
unsigned long pr;
unsigned long pfs;
unsigned long bspstore;
unsigned long rnat;
unsigned long __spare;
/* Userland context and syscalls */
unsigned long tp;
unsigned long rsc;
unsigned long fpsr;
unsigned long psr;
/* ASYNC: Interrupt specific */
unsigned long gp;
unsigned long ndirty;
unsigned long cfm;
unsigned long iip;
unsigned long ifa;
unsigned long isr;
};
struct _high_fp {
struct _ia64_fpreg fr[96]; /* High FP register set. */
/* Can't be bothered to name them seperately. They are fr32-fr127. */
};
/*
* Preserved registers.
*/
struct _callee_saved {
unsigned long unat; /* NaT after spilling. */
unsigned long gr4;
unsigned long gr5;
unsigned long gr6;
unsigned long gr7;
unsigned long br1;
unsigned long br2;
unsigned long br3;
unsigned long br4;
unsigned long br5;
unsigned long lc;
unsigned long __spare;
};
struct _callee_saved_fp {
struct _ia64_fpreg fr2;
struct _ia64_fpreg fr3;
struct _ia64_fpreg fr4;
struct _ia64_fpreg fr5;
struct _ia64_fpreg fr16;
struct _ia64_fpreg fr17;
struct _ia64_fpreg fr18;
struct _ia64_fpreg fr19;
struct _ia64_fpreg fr20;
struct _ia64_fpreg fr21;
struct _ia64_fpreg fr22;
struct _ia64_fpreg fr23;
struct _ia64_fpreg fr24;
struct _ia64_fpreg fr25;
struct _ia64_fpreg fr26;
struct _ia64_fpreg fr27;
struct _ia64_fpreg fr28;
struct _ia64_fpreg fr29;
struct _ia64_fpreg fr30;
struct _ia64_fpreg fr31;
};
/*
* Scratch registers.
*/
struct _caller_saved {
unsigned long unat; /* NaT after spilling. */
unsigned long gr2;
unsigned long gr3;
unsigned long gr8;
unsigned long gr9;
unsigned long gr10;
unsigned long gr11;
unsigned long gr14;
unsigned long gr15;
unsigned long gr16;
unsigned long gr17;
unsigned long gr18;
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;
unsigned long gr28;
unsigned long gr29;
unsigned long gr30;
unsigned long gr31;
unsigned long br6;
unsigned long br7;
unsigned long ccv;
unsigned long csd;
unsigned long ssd;
};
struct _caller_saved_fp {
struct _ia64_fpreg fr6;
struct _ia64_fpreg fr7;
struct _ia64_fpreg fr8;
struct _ia64_fpreg fr9;
struct _ia64_fpreg fr10;
struct _ia64_fpreg fr11;
struct _ia64_fpreg fr12;
struct _ia64_fpreg fr13;
struct _ia64_fpreg fr14;
struct _ia64_fpreg fr15;
};
#ifdef _KERNEL
void restore_callee_saved(const struct _callee_saved *);
void restore_callee_saved_fp(const struct _callee_saved_fp *);
void restore_high_fp(const struct _high_fp *);
void save_callee_saved(struct _callee_saved *);
void save_callee_saved_fp(struct _callee_saved_fp *);
void save_high_fp(struct _high_fp *);
#endif
#endif /* _MACHINE_REGSET_H_ */
|