2 * Copyright (C) 2005 Jakub Jermar
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
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.
29 /** @addtogroup sparc64interrupt
34 * @brief This file contains register window trap handlers.
37 #ifndef __sparc64_REGWIN_H__
38 #define __sparc64_REGWIN_H__
40 #include <arch/stack.h>
41 #include <arch/arch.h>
43 #define TT_CLEAN_WINDOW 0x24
44 #define TT_SPILL_0_NORMAL 0x80
45 #define TT_FILL_0_NORMAL 0xc0
47 #define REGWIN_HANDLER_SIZE 128
49 #define CLEAN_WINDOW_HANDLER_SIZE REGWIN_HANDLER_SIZE
50 #define SPILL_HANDLER_SIZE REGWIN_HANDLER_SIZE
51 #define FILL_HANDLER_SIZE REGWIN_HANDLER_SIZE
55 /* Window Save Area offsets. */
76 * Macro used by the nucleus and the primary context 0 during normal and other spills.
78 .macro SPILL_NORMAL_HANDLER_KERNEL
79 stx
%l0
, [%sp
+ STACK_BIAS
+ L0_OFFSET
]
80 stx
%l1
, [%sp
+ STACK_BIAS
+ L1_OFFSET
]
81 stx
%l2
, [%sp
+ STACK_BIAS
+ L2_OFFSET
]
82 stx
%l3
, [%sp
+ STACK_BIAS
+ L3_OFFSET
]
83 stx
%l4
, [%sp
+ STACK_BIAS
+ L4_OFFSET
]
84 stx
%l5
, [%sp
+ STACK_BIAS
+ L5_OFFSET
]
85 stx
%l6
, [%sp
+ STACK_BIAS
+ L6_OFFSET
]
86 stx
%l7
, [%sp
+ STACK_BIAS
+ L7_OFFSET
]
87 stx
%i0
, [%sp
+ STACK_BIAS
+ I0_OFFSET
]
88 stx
%i1
, [%sp
+ STACK_BIAS
+ I1_OFFSET
]
89 stx
%i2
, [%sp
+ STACK_BIAS
+ I2_OFFSET
]
90 stx
%i3
, [%sp
+ STACK_BIAS
+ I3_OFFSET
]
91 stx
%i4
, [%sp
+ STACK_BIAS
+ I4_OFFSET
]
92 stx
%i5
, [%sp
+ STACK_BIAS
+ I5_OFFSET
]
93 stx
%i6
, [%sp
+ STACK_BIAS
+ I6_OFFSET
]
94 stx
%i7
, [%sp
+ STACK_BIAS
+ I7_OFFSET
]
100 * Macro used by the userspace during normal spills.
102 .macro SPILL_NORMAL_HANDLER_USERSPACE
104 stxa
%l0
, [%sp
+ STACK_BIAS
+ L0_OFFSET
] %asi
105 stxa
%l1
, [%sp
+ STACK_BIAS
+ L1_OFFSET
] %asi
106 stxa
%l2
, [%sp
+ STACK_BIAS
+ L2_OFFSET
] %asi
107 stxa
%l3
, [%sp
+ STACK_BIAS
+ L3_OFFSET
] %asi
108 stxa
%l4
, [%sp
+ STACK_BIAS
+ L4_OFFSET
] %asi
109 stxa
%l5
, [%sp
+ STACK_BIAS
+ L5_OFFSET
] %asi
110 stxa
%l6
, [%sp
+ STACK_BIAS
+ L6_OFFSET
] %asi
111 stxa
%l7
, [%sp
+ STACK_BIAS
+ L7_OFFSET
] %asi
112 stxa
%i0
, [%sp
+ STACK_BIAS
+ I0_OFFSET
] %asi
113 stxa
%i1
, [%sp
+ STACK_BIAS
+ I1_OFFSET
] %asi
114 stxa
%i2
, [%sp
+ STACK_BIAS
+ I2_OFFSET
] %asi
115 stxa
%i3
, [%sp
+ STACK_BIAS
+ I3_OFFSET
] %asi
116 stxa
%i4
, [%sp
+ STACK_BIAS
+ I4_OFFSET
] %asi
117 stxa
%i5
, [%sp
+ STACK_BIAS
+ I5_OFFSET
] %asi
118 stxa
%i6
, [%sp
+ STACK_BIAS
+ I6_OFFSET
] %asi
119 stxa
%i7
, [%sp
+ STACK_BIAS
+ I7_OFFSET
] %asi
125 * Macro used by the userspace during other spills.
127 .macro SPILL_OTHER_HANDLER_USERSPACE
129 stxa
%l0
, [%sp
+ STACK_BIAS
+ L0_OFFSET
] %asi
130 stxa
%l1
, [%sp
+ STACK_BIAS
+ L1_OFFSET
] %asi
131 stxa
%l2
, [%sp
+ STACK_BIAS
+ L2_OFFSET
] %asi
132 stxa
%l3
, [%sp
+ STACK_BIAS
+ L3_OFFSET
] %asi
133 stxa
%l4
, [%sp
+ STACK_BIAS
+ L4_OFFSET
] %asi
134 stxa
%l5
, [%sp
+ STACK_BIAS
+ L5_OFFSET
] %asi
135 stxa
%l6
, [%sp
+ STACK_BIAS
+ L6_OFFSET
] %asi
136 stxa
%l7
, [%sp
+ STACK_BIAS
+ L7_OFFSET
] %asi
137 stxa
%i0
, [%sp
+ STACK_BIAS
+ I0_OFFSET
] %asi
138 stxa
%i1
, [%sp
+ STACK_BIAS
+ I1_OFFSET
] %asi
139 stxa
%i2
, [%sp
+ STACK_BIAS
+ I2_OFFSET
] %asi
140 stxa
%i3
, [%sp
+ STACK_BIAS
+ I3_OFFSET
] %asi
141 stxa
%i4
, [%sp
+ STACK_BIAS
+ I4_OFFSET
] %asi
142 stxa
%i5
, [%sp
+ STACK_BIAS
+ I5_OFFSET
] %asi
143 stxa
%i6
, [%sp
+ STACK_BIAS
+ I6_OFFSET
] %asi
144 stxa
%i7
, [%sp
+ STACK_BIAS
+ I7_OFFSET
] %asi
151 * Macro used by the nucleus and the primary context 0 during normal fills.
153 .macro FILL_NORMAL_HANDLER_KERNEL
154 ldx
[%sp
+ STACK_BIAS
+ L0_OFFSET
], %l0
155 ldx
[%sp
+ STACK_BIAS
+ L1_OFFSET
], %l1
156 ldx
[%sp
+ STACK_BIAS
+ L2_OFFSET
], %l2
157 ldx
[%sp
+ STACK_BIAS
+ L3_OFFSET
], %l3
158 ldx
[%sp
+ STACK_BIAS
+ L4_OFFSET
], %l4
159 ldx
[%sp
+ STACK_BIAS
+ L5_OFFSET
], %l5
160 ldx
[%sp
+ STACK_BIAS
+ L6_OFFSET
], %l6
161 ldx
[%sp
+ STACK_BIAS
+ L7_OFFSET
], %l7
162 ldx
[%sp
+ STACK_BIAS
+ I0_OFFSET
], %i0
163 ldx
[%sp
+ STACK_BIAS
+ I1_OFFSET
], %i1
164 ldx
[%sp
+ STACK_BIAS
+ I2_OFFSET
], %i2
165 ldx
[%sp
+ STACK_BIAS
+ I3_OFFSET
], %i3
166 ldx
[%sp
+ STACK_BIAS
+ I4_OFFSET
], %i4
167 ldx
[%sp
+ STACK_BIAS
+ I5_OFFSET
], %i5
168 ldx
[%sp
+ STACK_BIAS
+ I6_OFFSET
], %i6
169 ldx
[%sp
+ STACK_BIAS
+ I7_OFFSET
], %i7
175 * Macro used by the userspace during normal fills.
177 .macro FILL_NORMAL_HANDLER_USERSPACE
179 ldxa
[%sp
+ STACK_BIAS
+ L0_OFFSET
] %asi
, %l0
180 ldxa
[%sp
+ STACK_BIAS
+ L1_OFFSET
] %asi
, %l1
181 ldxa
[%sp
+ STACK_BIAS
+ L2_OFFSET
] %asi
, %l2
182 ldxa
[%sp
+ STACK_BIAS
+ L3_OFFSET
] %asi
, %l3
183 ldxa
[%sp
+ STACK_BIAS
+ L4_OFFSET
] %asi
, %l4
184 ldxa
[%sp
+ STACK_BIAS
+ L5_OFFSET
] %asi
, %l5
185 ldxa
[%sp
+ STACK_BIAS
+ L6_OFFSET
] %asi
, %l6
186 ldxa
[%sp
+ STACK_BIAS
+ L7_OFFSET
] %asi
, %l7
187 ldxa
[%sp
+ STACK_BIAS
+ I0_OFFSET
] %asi
, %i0
188 ldxa
[%sp
+ STACK_BIAS
+ I1_OFFSET
] %asi
, %i1
189 ldxa
[%sp
+ STACK_BIAS
+ I2_OFFSET
] %asi
, %i2
190 ldxa
[%sp
+ STACK_BIAS
+ I3_OFFSET
] %asi
, %i3
191 ldxa
[%sp
+ STACK_BIAS
+ I4_OFFSET
] %asi
, %i4
192 ldxa
[%sp
+ STACK_BIAS
+ I5_OFFSET
] %asi
, %i5
193 ldxa
[%sp
+ STACK_BIAS
+ I6_OFFSET
] %asi
, %i6
194 ldxa
[%sp
+ STACK_BIAS
+ I7_OFFSET
] %asi
, %i7
200 * Macro used by the userspace during other fills.
202 .macro FILL_OTHER_HANDLER_USERSPACE
204 ldxa
[%sp
+ STACK_BIAS
+ L0_OFFSET
] %asi
, %l0
205 ldxa
[%sp
+ STACK_BIAS
+ L1_OFFSET
] %asi
, %l1
206 ldxa
[%sp
+ STACK_BIAS
+ L2_OFFSET
] %asi
, %l2
207 ldxa
[%sp
+ STACK_BIAS
+ L3_OFFSET
] %asi
, %l3
208 ldxa
[%sp
+ STACK_BIAS
+ L4_OFFSET
] %asi
, %l4
209 ldxa
[%sp
+ STACK_BIAS
+ L5_OFFSET
] %asi
, %l5
210 ldxa
[%sp
+ STACK_BIAS
+ L6_OFFSET
] %asi
, %l6
211 ldxa
[%sp
+ STACK_BIAS
+ L7_OFFSET
] %asi
, %l7
212 ldxa
[%sp
+ STACK_BIAS
+ I0_OFFSET
] %asi
, %i0
213 ldxa
[%sp
+ STACK_BIAS
+ I1_OFFSET
] %asi
, %i1
214 ldxa
[%sp
+ STACK_BIAS
+ I2_OFFSET
] %asi
, %i2
215 ldxa
[%sp
+ STACK_BIAS
+ I3_OFFSET
] %asi
, %i3
216 ldxa
[%sp
+ STACK_BIAS
+ I4_OFFSET
] %asi
, %i4
217 ldxa
[%sp
+ STACK_BIAS
+ I5_OFFSET
] %asi
, %i5
218 ldxa
[%sp
+ STACK_BIAS
+ I6_OFFSET
] %asi
, %i6
219 ldxa
[%sp
+ STACK_BIAS
+ I7_OFFSET
] %asi
, %i7
224 .macro CLEAN_WINDOW_HANDLER
227 wrpr
%l0
, 0, %cleanwin