Commit | Line | Data |
---|---|---|
920dae64 AT |
1 | /* |
2 | * ========== Copyright Header Begin ========================================== | |
3 | * | |
4 | * Hypervisor Software File: traptable.s | |
5 | * | |
6 | * Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved. | |
7 | * | |
8 | * - Do no alter or remove copyright notices | |
9 | * | |
10 | * - Redistribution and use of this software in source and binary forms, with | |
11 | * or without modification, are permitted provided that the following | |
12 | * conditions are met: | |
13 | * | |
14 | * - Redistribution of source code must retain the above copyright notice, | |
15 | * this list of conditions and the following disclaimer. | |
16 | * | |
17 | * - Redistribution in binary form must reproduce the above copyright notice, | |
18 | * this list of conditions and the following disclaimer in the | |
19 | * documentation and/or other materials provided with the distribution. | |
20 | * | |
21 | * Neither the name of Sun Microsystems, Inc. or the names of contributors | |
22 | * may be used to endorse or promote products derived from this software | |
23 | * without specific prior written permission. | |
24 | * | |
25 | * This software is provided "AS IS," without a warranty of any kind. | |
26 | * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, | |
27 | * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A | |
28 | * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN | |
29 | * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR | |
30 | * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR | |
31 | * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN | |
32 | * OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR | |
33 | * FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE | |
34 | * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, | |
35 | * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF | |
36 | * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. | |
37 | * | |
38 | * You acknowledge that this software is not designed, licensed or | |
39 | * intended for use in the design, construction, operation or maintenance of | |
40 | * any nuclear facility. | |
41 | * | |
42 | * ========== Copyright Header End ============================================ | |
43 | */ | |
44 | /* | |
45 | * Copyright 2007 Sun Microsystems, Inc. All rights reserved. | |
46 | * Use is subject to license terms. | |
47 | */ | |
48 | ||
49 | .ident "@(#)traptable.s 1.43 07/09/14 SMI" | |
50 | ||
51 | /* | |
52 | * Niagara hypervisor trap table | |
53 | */ | |
54 | ||
55 | #include <sys/htypes.h> | |
56 | #include <sys/asm_linkage.h> | |
57 | #include <sys/stack.h> | |
58 | #include <hypervisor.h> | |
59 | #include <hprivregs.h> | |
60 | #include <asi.h> | |
61 | #include <mmu.h> | |
62 | #include <sun4v/traps.h> | |
63 | #include <sun4v/mmu.h> | |
64 | ||
65 | #include <traps.h> | |
66 | #include <traptable.h> | |
67 | #include <offsets.h> | |
68 | #include <util.h> | |
69 | #include <guest.h> | |
70 | #include <traptrace.h> | |
71 | #include <debug.h> | |
72 | #include <abort.h> | |
73 | #include <util.h> | |
74 | ||
75 | /* | |
76 | * The basic hypervisor trap table | |
77 | * | |
78 | * We use the linker to place this at the beginning of the hypervisor | |
79 | * binary which gets loaded at an appropriate alignment by Reset/Config. | |
80 | */ | |
81 | ||
82 | ENTRY(htraptable) | |
83 | /* | |
84 | * hardware traps | |
85 | */ | |
86 | TRAP(tt0_000, NOT) /* reserved */ | |
87 | TRAP(tt0_001, POR) /* power-on reset */ | |
88 | TRAP(tt0_002, GOTO(watchdog)) /* watchdog reset */ | |
89 | TRAP(tt0_003, GOTO(xir)) /* externally initiated reset */ | |
90 | TRAP(tt0_004, NOT) /* software initiated reset */ | |
91 | TRAP(tt0_005, NOT) /* red mode exception */ | |
92 | TRAP(tt0_006, NOT) /* reserved */ | |
93 | TRAP(tt0_007, NOT) /* reserved */ | |
94 | TRAP(tt0_008, GOTO(immu_err)) /* instruction access exception */ | |
95 | TRAP(tt0_009, NOT) /* instruction access mmu miss */ | |
96 | TRAP(tt0_00a, UE_ERR) /* instruction access error */ | |
97 | TRAP(tt0_00b, NOT) /* reserved */ | |
98 | TRAP(tt0_00c, NOT) /* reserved */ | |
99 | TRAP(tt0_00d, NOT) /* reserved */ | |
100 | TRAP(tt0_00e, NOT) /* reserved */ | |
101 | TRAP(tt0_00f, NOT) /* reserved */ | |
102 | TRAP(tt0_010, REVECTOR(TT_ILLINST)) /* illegal instruction */ | |
103 | TRAP(tt0_011, REVECTOR(TT_PRIVOP)) /* privileged opcode */ | |
104 | TRAP(tt0_012, REVECTOR(TT_UNIMP_LDD)) /* unimplemented LDD */ | |
105 | TRAP(tt0_013, REVECTOR(TT_UNIMP_STD)) /* unimplemented STD */ | |
106 | TRAP(tt0_014, NOT) /* reserved */ | |
107 | TRAP(tt0_015, NOT) /* reserved */ | |
108 | TRAP(tt0_016, NOT) /* reserved */ | |
109 | TRAP(tt0_017, NOT) /* reserved */ | |
110 | TRAP(tt0_018, NOT) /* reserved */ | |
111 | TRAP(tt0_019, NOT) /* reserved */ | |
112 | TRAP(tt0_01a, NOT) /* reserved */ | |
113 | TRAP(tt0_01b, NOT) /* reserved */ | |
114 | TRAP(tt0_01c, NOT) /* reserved */ | |
115 | TRAP(tt0_01d, NOT) /* reserved */ | |
116 | TRAP(tt0_01e, NOT) /* reserved */ | |
117 | TRAP(tt0_01f, NOT) /* reserved */ | |
118 | TRAP(tt0_020, NOT) /* fp disabled */ | |
119 | TRAP(tt0_021, NOT) /* fp exception ieee 754 */ | |
120 | TRAP(tt0_022, NOT) /* fp exception other */ | |
121 | TRAP(tt0_023, NOT) /* tag overflow */ | |
122 | BIGTRAP(tt0_024, CLEAN_WINDOW) /* clean window */ | |
123 | TRAP(tt0_028, NOT) /* division by zero */ | |
124 | TRAP(tt0_029, UE_ERR) /* internal processor error */ | |
125 | TRAP(tt0_02a, NOT) /* reserved */ | |
126 | TRAP(tt0_02b, NOT) /* reserved */ | |
127 | TRAP(tt0_02c, NOT) /* reserved */ | |
128 | TRAP(tt0_02d, NOT) /* reserved */ | |
129 | TRAP(tt0_02e, NOT) /* reserved */ | |
130 | TRAP(tt0_02f, NOT) /* reserved */ | |
131 | TRAP(tt0_030, GOTO(dmmu_err)) /* data access exception */ | |
132 | TRAP(tt0_031, NOT) /* data access mmu miss */ | |
133 | TRAP(tt0_032, UE_ERR) /* data access error */ | |
134 | TRAP(tt0_033, UE_ERR) /* data access protection */ | |
135 | TRAP(tt0_034, GOTO(dmmu_err)) /* mem address not aligned */ | |
136 | TRAP(tt0_035, GOTO(dmmu_err)) /* lddf mem address not aligned */ | |
137 | TRAP(tt0_036, GOTO(dmmu_err)) /* stdf mem address not aligned */ | |
138 | TRAP(tt0_037, GOTO(dmmu_err)) /* privileged action */ | |
139 | TRAP(tt0_038, GOTO(dmmu_err)) /* ldqf mem address not aligned */ | |
140 | TRAP(tt0_039, GOTO(dmmu_err)) /* stqf mem address not aligned */ | |
141 | TRAP(tt0_03a, NOT) /* reserved */ | |
142 | TRAP(tt0_03b, NOT) /* reserved */ | |
143 | TRAP(tt0_03c, NOT) /* reserved */ | |
144 | TRAP(tt0_03d, NOT) /* reserved */ | |
145 | TRAP(tt0_03e, RIMMU_MISS) /* HV: real immu miss */ | |
146 | TRAP(tt0_03f, RDMMU_MISS) /* HV: real dmmu miss */ | |
147 | TRAP(tt0_040, NOT) /* async data error */ | |
148 | TRAP(tt0_041, NOT) /* interrupt level 1 */ | |
149 | TRAP(tt0_042, NOT) /* interrupt level 2 */ | |
150 | TRAP(tt0_043, NOT) /* interrupt level 3 */ | |
151 | TRAP(tt0_044, NOT) /* interrupt level 4 */ | |
152 | TRAP(tt0_045, NOT) /* interrupt level 5 */ | |
153 | TRAP(tt0_046, NOT) /* interrupt level 6 */ | |
154 | TRAP(tt0_047, NOT) /* interrupt level 7 */ | |
155 | TRAP(tt0_048, NOT) /* interrupt level 8 */ | |
156 | TRAP(tt0_049, NOT) /* interrupt level 9 */ | |
157 | TRAP(tt0_04a, NOT) /* interrupt level a */ | |
158 | TRAP(tt0_04b, NOT) /* interrupt level b */ | |
159 | TRAP(tt0_04c, NOT) /* interrupt level c */ | |
160 | TRAP(tt0_04d, NOT) /* interrupt level d */ | |
161 | TRAP(tt0_04e, NOT) /* interrupt level e */ | |
162 | TRAP(tt0_04f, NOT) /* interrupt level f */ | |
163 | TRAP(tt0_050, NOT) /* reserved */ | |
164 | TRAP(tt0_051, NOT) /* reserved */ | |
165 | TRAP(tt0_052, NOT) /* reserved */ | |
166 | TRAP(tt0_053, NOT) /* reserved */ | |
167 | TRAP(tt0_054, NOT) /* reserved */ | |
168 | TRAP(tt0_055, NOT) /* reserved */ | |
169 | TRAP(tt0_056, NOT) /* reserved */ | |
170 | TRAP(tt0_057, NOT) /* reserved */ | |
171 | TRAP(tt0_058, NOT) /* reserved */ | |
172 | TRAP(tt0_059, NOT) /* reserved */ | |
173 | TRAP(tt0_05a, NOT) /* reserved */ | |
174 | TRAP(tt0_05b, NOT) /* reserved */ | |
175 | TRAP(tt0_05c, NOT) /* reserved */ | |
176 | TRAP(tt0_05d, NOT) /* reserved */ | |
177 | TRAP(tt0_05e, HSTICK_INTR) /* HV: hstick match */ | |
178 | TRAP(tt0_05f, NOT) /* reserved */ | |
179 | TRAP(tt0_060, VECINTR) /* interrupt vector */ | |
180 | TRAP(tt0_061, NOT) /* RA watchpoint */ | |
181 | TRAP(tt0_062, NOT) /* VA watchpoint */ | |
182 | TRAP(tt0_063, CE_ERR) /* corrected ECC error XXX */ | |
183 | BIGTRAP(tt0_064, IMMU_MISS) /* fast instruction access MMU miss */ | |
184 | BIGTRAP(tt0_068, DMMU_MISS) /* fast data access MMU miss */ | |
185 | BIGTRAP(tt0_06C, DMMU_PROT) /* fast data access protection */ | |
186 | TRAP(tt0_070, NOT) /* reserved */ | |
187 | TRAP(tt0_071, NOT) /* reserved */ | |
188 | TRAP(tt0_072, NOT) /* reserved */ | |
189 | TRAP(tt0_073, NOT) /* reserved */ | |
190 | TRAP(tt0_074, MAUINTR) /* modular arithmetic unit */ | |
191 | TRAP(tt0_075, NOT) /* reserved */ | |
192 | TRAP(tt0_076, NOT) /* reserved */ | |
193 | TRAP(tt0_077, NOT) /* reserved */ | |
194 | TRAP(tt0_078, DIS_UE_ERR) /* data error (disrupting) */ | |
195 | TRAP(tt0_079, NOT) /* reserved */ | |
196 | TRAP(tt0_07a, NOT) /* reserved */ | |
197 | TRAP(tt0_07b, NOT) /* reserved */ | |
198 | TRAP(tt0_07c, NOT) /* HV: cpu mondo */ | |
199 | TRAP(tt0_07d, NOT) /* HV: dev mondo */ | |
200 | TRAP(tt0_07e, NOT) /* HV: resumable error */ | |
201 | TRAP(tt0_07f, NOT) /* HV: non-resumable error */ | |
202 | BIGTRAP(tt0_080, SPILL_WINDOW) /* spill 0 normal */ | |
203 | BIGTRAP(tt0_084, SPILL_WINDOW) /* spill 1 normal */ | |
204 | BIGTRAP(tt0_088, SPILL_WINDOW) /* spill 2 normal */ | |
205 | BIGTRAP(tt0_08c, SPILL_WINDOW) /* spill 3 normal */ | |
206 | BIGTRAP(tt0_090, SPILL_WINDOW) /* spill 4 normal */ | |
207 | BIGTRAP(tt0_094, SPILL_WINDOW) /* spill 5 normal */ | |
208 | BIGTRAP(tt0_098, SPILL_WINDOW) /* spill 6 normal */ | |
209 | BIGTRAP(tt0_09c, SPILL_WINDOW) /* spill 7 normal */ | |
210 | BIGTRAP(tt0_0a0, SPILL_WINDOW) /* spill 0 other */ | |
211 | BIGTRAP(tt0_0a4, SPILL_WINDOW) /* spill 1 other */ | |
212 | BIGTRAP(tt0_0a8, SPILL_WINDOW) /* spill 2 other */ | |
213 | BIGTRAP(tt0_0ac, SPILL_WINDOW) /* spill 3 other */ | |
214 | BIGTRAP(tt0_0b0, SPILL_WINDOW) /* spill 4 other */ | |
215 | BIGTRAP(tt0_0b4, SPILL_WINDOW) /* spill 5 other */ | |
216 | BIGTRAP(tt0_0b8, SPILL_WINDOW) /* spill 6 other */ | |
217 | BIGTRAP(tt0_0bc, SPILL_WINDOW) /* spill 7 other */ | |
218 | BIGTRAP(tt0_0c0, FILL_WINDOW) /* fill 0 normal */ | |
219 | BIGTRAP(tt0_0c4, FILL_WINDOW) /* fill 1 normal */ | |
220 | BIGTRAP(tt0_0c8, FILL_WINDOW) /* fill 2 normal */ | |
221 | BIGTRAP(tt0_0cc, FILL_WINDOW) /* fill 3 normal */ | |
222 | BIGTRAP(tt0_0d0, FILL_WINDOW) /* fill 4 normal */ | |
223 | BIGTRAP(tt0_0d4, FILL_WINDOW) /* fill 5 normal */ | |
224 | BIGTRAP(tt0_0d8, FILL_WINDOW) /* fill 6 normal */ | |
225 | BIGTRAP(tt0_0dc, FILL_WINDOW) /* fill 7 normal */ | |
226 | BIGTRAP(tt0_0e0, FILL_WINDOW) /* fill 0 other */ | |
227 | BIGTRAP(tt0_0e4, FILL_WINDOW) /* fill 1 other */ | |
228 | BIGTRAP(tt0_0e8, FILL_WINDOW) /* fill 2 other */ | |
229 | BIGTRAP(tt0_0ec, FILL_WINDOW) /* fill 3 other */ | |
230 | BIGTRAP(tt0_0f0, FILL_WINDOW) /* fill 4 other */ | |
231 | BIGTRAP(tt0_0f4, FILL_WINDOW) /* fill 5 other */ | |
232 | BIGTRAP(tt0_0f8, FILL_WINDOW) /* fill 6 other */ | |
233 | BIGTRAP(tt0_0fc, FILL_WINDOW) /* fill 7 other */ | |
234 | /* | |
235 | * Software traps | |
236 | */ | |
237 | TRAP(tt0_100, NOT) /* software trap */ | |
238 | TRAP(tt0_101, NOT) /* software trap */ | |
239 | TRAP(tt0_102, NOT) /* software trap */ | |
240 | TRAP(tt0_103, NOT) /* software trap */ | |
241 | TRAP(tt0_104, NOT) /* software trap */ | |
242 | TRAP(tt0_105, NOT) /* software trap */ | |
243 | TRAP(tt0_106, NOT) /* software trap */ | |
244 | TRAP(tt0_107, NOT) /* software trap */ | |
245 | TRAP(tt0_108, NOT) /* software trap */ | |
246 | TRAP(tt0_109, NOT) /* software trap */ | |
247 | TRAP(tt0_10a, NOT) /* software trap */ | |
248 | TRAP(tt0_10b, NOT) /* software trap */ | |
249 | TRAP(tt0_10c, NOT) /* software trap */ | |
250 | TRAP(tt0_10d, NOT) /* software trap */ | |
251 | TRAP(tt0_10e, NOT) /* software trap */ | |
252 | TRAP(tt0_10f, NOT) /* software trap */ | |
253 | TRAP(tt0_110, NOT) /* software trap */ | |
254 | TRAP(tt0_111, NOT) /* software trap */ | |
255 | TRAP(tt0_112, NOT) /* software trap */ | |
256 | #ifdef DEBUG | |
257 | TRAP(tt0_113, GOTO(hprint)) /* print string */ | |
258 | TRAP(tt0_114, GOTO(hprintx)) /* print hex 64-bit */ | |
259 | #else | |
260 | TRAP(tt0_113, NOT) /* software trap */ | |
261 | TRAP(tt0_114, NOT) /* software trap */ | |
262 | #endif | |
263 | TRAP(tt0_115, NOT) /* software trap */ | |
264 | TRAP(tt0_116, NOT) /* software trap */ | |
265 | TRAP(tt0_117, NOT) /* software trap */ | |
266 | TRAP(tt0_118, NOT) /* software trap */ | |
267 | TRAP(tt0_119, NOT) /* software trap */ | |
268 | TRAP(tt0_11a, NOT) /* software trap */ | |
269 | TRAP(tt0_11b, NOT) /* software trap */ | |
270 | TRAP(tt0_11c, NOT) /* software trap */ | |
271 | TRAP(tt0_11d, NOT) /* software trap */ | |
272 | TRAP(tt0_11e, NOT) /* software trap */ | |
273 | TRAP(tt0_11f, NOT) /* software trap */ | |
274 | TRAP(tt0_120, NOT) /* software trap */ | |
275 | TRAP(tt0_121, NOT) /* software trap */ | |
276 | TRAP(tt0_122, NOT) /* software trap */ | |
277 | TRAP(tt0_123, NOT) /* software trap */ | |
278 | TRAP(tt0_124, NOT) /* software trap */ | |
279 | TRAP(tt0_125, NOT) /* software trap */ | |
280 | TRAP(tt0_126, NOT) /* software trap */ | |
281 | TRAP(tt0_127, NOT) /* software trap */ | |
282 | TRAP(tt0_128, NOT) /* software trap */ | |
283 | TRAP(tt0_129, NOT) /* software trap */ | |
284 | TRAP(tt0_12a, NOT) /* software trap */ | |
285 | TRAP(tt0_12b, NOT) /* software trap */ | |
286 | TRAP(tt0_12c, NOT) /* software trap */ | |
287 | TRAP(tt0_12d, NOT) /* software trap */ | |
288 | TRAP(tt0_12e, NOT) /* software trap */ | |
289 | TRAP(tt0_12f, NOT) /* software trap */ | |
290 | TRAP(tt0_130, NOT) /* software trap */ | |
291 | TRAP(tt0_131, NOT) /* software trap */ | |
292 | TRAP(tt0_132, NOT) /* software trap */ | |
293 | TRAP(tt0_133, NOT) /* software trap */ | |
294 | TRAP(tt0_134, NOT) /* software trap */ | |
295 | TRAP(tt0_135, NOT) /* software trap */ | |
296 | TRAP(tt0_136, NOT) /* software trap */ | |
297 | TRAP(tt0_137, NOT) /* software trap */ | |
298 | TRAP(tt0_138, NOT) /* software trap */ | |
299 | TRAP(tt0_139, NOT) /* software trap */ | |
300 | TRAP(tt0_13a, NOT) /* software trap */ | |
301 | TRAP(tt0_13b, NOT) /* software trap */ | |
302 | TRAP(tt0_13c, NOT) /* software trap */ | |
303 | TRAP(tt0_13d, NOT) /* software trap */ | |
304 | TRAP(tt0_13e, NOT) /* software trap */ | |
305 | TRAP(tt0_13f, NOT) /* software trap */ | |
306 | TRAP(tt0_140, NOT) /* software trap */ | |
307 | TRAP(tt0_141, NOT) /* software trap */ | |
308 | TRAP(tt0_142, NOT) /* software trap */ | |
309 | TRAP(tt0_143, NOT) /* software trap */ | |
310 | TRAP(tt0_144, NOT) /* software trap */ | |
311 | TRAP(tt0_145, NOT) /* software trap */ | |
312 | TRAP(tt0_146, NOT) /* software trap */ | |
313 | TRAP(tt0_147, NOT) /* software trap */ | |
314 | TRAP(tt0_148, NOT) /* software trap */ | |
315 | TRAP(tt0_149, NOT) /* software trap */ | |
316 | TRAP(tt0_14a, NOT) /* software trap */ | |
317 | TRAP(tt0_14b, NOT) /* software trap */ | |
318 | TRAP(tt0_14c, NOT) /* software trap */ | |
319 | TRAP(tt0_14d, NOT) /* software trap */ | |
320 | TRAP(tt0_14e, NOT) /* software trap */ | |
321 | TRAP(tt0_14f, NOT) /* software trap */ | |
322 | TRAP(tt0_150, NOT) /* software trap */ | |
323 | TRAP(tt0_151, NOT) /* software trap */ | |
324 | TRAP(tt0_152, NOT) /* software trap */ | |
325 | TRAP(tt0_153, NOT) /* software trap */ | |
326 | TRAP(tt0_154, NOT) /* software trap */ | |
327 | TRAP(tt0_155, NOT) /* software trap */ | |
328 | TRAP(tt0_156, NOT) /* software trap */ | |
329 | TRAP(tt0_157, NOT) /* software trap */ | |
330 | TRAP(tt0_158, NOT) /* software trap */ | |
331 | TRAP(tt0_159, NOT) /* software trap */ | |
332 | TRAP(tt0_15a, NOT) /* software trap */ | |
333 | TRAP(tt0_15b, NOT) /* software trap */ | |
334 | TRAP(tt0_15c, NOT) /* software trap */ | |
335 | TRAP(tt0_15d, NOT) /* software trap */ | |
336 | TRAP(tt0_15e, NOT) /* software trap */ | |
337 | TRAP(tt0_15f, NOT) /* software trap */ | |
338 | TRAP(tt0_160, NOT) /* software trap */ | |
339 | TRAP(tt0_161, NOT) /* software trap */ | |
340 | TRAP(tt0_162, NOT) /* software trap */ | |
341 | TRAP(tt0_163, NOT) /* software trap */ | |
342 | TRAP(tt0_164, NOT) /* software trap */ | |
343 | TRAP(tt0_165, NOT) /* software trap */ | |
344 | TRAP(tt0_166, NOT) /* software trap */ | |
345 | TRAP(tt0_167, NOT) /* software trap */ | |
346 | TRAP(tt0_168, NOT) /* software trap */ | |
347 | TRAP(tt0_169, NOT) /* software trap */ | |
348 | TRAP(tt0_16a, NOT) /* software trap */ | |
349 | TRAP(tt0_16b, NOT) /* software trap */ | |
350 | TRAP(tt0_16c, NOT) /* software trap */ | |
351 | TRAP(tt0_16d, NOT) /* software trap */ | |
352 | TRAP(tt0_16e, NOT) /* software trap */ | |
353 | TRAP(tt0_16f, NOT) /* software trap */ | |
354 | TRAP(tt0_170, NOT) /* software trap */ | |
355 | TRAP(tt0_171, NOT) /* software trap */ | |
356 | TRAP(tt0_172, NOT) /* software trap */ | |
357 | TRAP(tt0_173, NOT) /* software trap */ | |
358 | TRAP(tt0_174, NOT) /* software trap */ | |
359 | TRAP(tt0_175, NOT) /* software trap */ | |
360 | TRAP(tt0_176, NOT) /* software trap */ | |
361 | TRAP(tt0_177, NOT) /* software trap */ | |
362 | TRAP(tt0_178, NOT) /* software trap */ | |
363 | TRAP(tt0_179, NOT) /* software trap */ | |
364 | TRAP(tt0_17a, NOT) /* software trap */ | |
365 | TRAP(tt0_17b, NOT) /* software trap */ | |
366 | TRAP(tt0_17c, NOT) /* software trap */ | |
367 | TRAP(tt0_17d, NOT) /* software trap */ | |
368 | TRAP(tt0_17e, NOT) /* software trap */ | |
369 | TRAP(tt0_17f, NOT) /* software trap */ | |
370 | TRAP(tt0_180, GOTO(hcall)) /* hypervisor software trap */ | |
371 | TRAP(tt0_181, HCALL_BAD) /* hypervisor software trap */ | |
372 | TRAP(tt0_182, HCALL_BAD) /* hypervisor software trap */ | |
373 | TRAP_NOALIGN(tt0_183, HCALL(MMU_MAP_ADDR_IDX)) /* hyperfast trap */ | |
374 | TRAP_NOALIGN(tt0_184, HCALL(MMU_UNMAP_ADDR_IDX)) /* hyperfast trap */ | |
375 | TRAP_NOALIGN(tt0_185, HCALL(TTRACE_ADDENTRY_IDX)) /* hyperfast trap */ | |
376 | TRAP(tt0_186, HCALL_BAD) /* hypervisor software trap */ | |
377 | TRAP(tt0_187, HCALL_BAD) /* hypervisor software trap */ | |
378 | TRAP(tt0_188, HCALL_BAD) /* hypervisor software trap */ | |
379 | TRAP(tt0_189, HCALL_BAD) /* hypervisor software trap */ | |
380 | TRAP(tt0_18a, HCALL_BAD) /* hypervisor software trap */ | |
381 | TRAP(tt0_18b, HCALL_BAD) /* hypervisor software trap */ | |
382 | TRAP(tt0_18c, HCALL_BAD) /* hypervisor software trap */ | |
383 | TRAP(tt0_18d, HCALL_BAD) /* hypervisor software trap */ | |
384 | TRAP(tt0_18e, HCALL_BAD) /* hypervisor software trap */ | |
385 | TRAP(tt0_18f, HCALL_BAD) /* hypervisor software trap */ | |
386 | TRAP(tt0_190, HCALL_BAD) /* hypervisor software trap */ | |
387 | TRAP(tt0_191, HCALL_BAD) /* hypervisor software trap */ | |
388 | TRAP(tt0_192, HCALL_BAD) /* hypervisor software trap */ | |
389 | TRAP(tt0_193, HCALL_BAD) /* hypervisor software trap */ | |
390 | TRAP(tt0_194, HCALL_BAD) /* hypervisor software trap */ | |
391 | TRAP(tt0_195, HCALL_BAD) /* hypervisor software trap */ | |
392 | TRAP(tt0_196, HCALL_BAD) /* hypervisor software trap */ | |
393 | TRAP(tt0_197, HCALL_BAD) /* hypervisor software trap */ | |
394 | TRAP(tt0_198, HCALL_BAD) /* hypervisor software trap */ | |
395 | TRAP(tt0_199, HCALL_BAD) /* hypervisor software trap */ | |
396 | TRAP(tt0_19a, HCALL_BAD) /* hypervisor software trap */ | |
397 | TRAP(tt0_19b, HCALL_BAD) /* hypervisor software trap */ | |
398 | TRAP(tt0_19c, HCALL_BAD) /* hypervisor software trap */ | |
399 | TRAP(tt0_19d, HCALL_BAD) /* hypervisor software trap */ | |
400 | TRAP(tt0_19e, HCALL_BAD) /* hypervisor software trap */ | |
401 | TRAP(tt0_19f, HCALL_BAD) /* hypervisor software trap */ | |
402 | TRAP(tt0_1a0, HCALL_BAD) /* hypervisor software trap */ | |
403 | TRAP(tt0_1a1, HCALL_BAD) /* hypervisor software trap */ | |
404 | TRAP(tt0_1a2, HCALL_BAD) /* hypervisor software trap */ | |
405 | TRAP(tt0_1a3, HCALL_BAD) /* hypervisor software trap */ | |
406 | TRAP(tt0_1a4, HCALL_BAD) /* hypervisor software trap */ | |
407 | TRAP(tt0_1a5, HCALL_BAD) /* hypervisor software trap */ | |
408 | TRAP(tt0_1a6, HCALL_BAD) /* hypervisor software trap */ | |
409 | TRAP(tt0_1a7, HCALL_BAD) /* hypervisor software trap */ | |
410 | TRAP(tt0_1a8, HCALL_BAD) /* hypervisor software trap */ | |
411 | TRAP(tt0_1a9, HCALL_BAD) /* hypervisor software trap */ | |
412 | TRAP(tt0_1aa, HCALL_BAD) /* hypervisor software trap */ | |
413 | TRAP(tt0_1ab, HCALL_BAD) /* hypervisor software trap */ | |
414 | TRAP(tt0_1ac, HCALL_BAD) /* hypervisor software trap */ | |
415 | TRAP(tt0_1ad, HCALL_BAD) /* hypervisor software trap */ | |
416 | TRAP(tt0_1ae, HCALL_BAD) /* hypervisor software trap */ | |
417 | TRAP(tt0_1af, HCALL_BAD) /* hypervisor software trap */ | |
418 | TRAP(tt0_1b0, HCALL_BAD) /* hypervisor software trap */ | |
419 | TRAP(tt0_1b1, HCALL_BAD) /* hypervisor software trap */ | |
420 | TRAP(tt0_1b2, HCALL_BAD) /* hypervisor software trap */ | |
421 | TRAP(tt0_1b3, HCALL_BAD) /* hypervisor software trap */ | |
422 | TRAP(tt0_1b4, HCALL_BAD) /* hypervisor software trap */ | |
423 | TRAP(tt0_1b5, HCALL_BAD) /* hypervisor software trap */ | |
424 | TRAP(tt0_1b6, HCALL_BAD) /* hypervisor software trap */ | |
425 | TRAP(tt0_1b7, HCALL_BAD) /* hypervisor software trap */ | |
426 | TRAP(tt0_1b8, HCALL_BAD) /* hypervisor software trap */ | |
427 | TRAP(tt0_1b9, HCALL_BAD) /* hypervisor software trap */ | |
428 | TRAP(tt0_1ba, HCALL_BAD) /* hypervisor software trap */ | |
429 | TRAP(tt0_1bb, HCALL_BAD) /* hypervisor software trap */ | |
430 | TRAP(tt0_1bc, HCALL_BAD) /* hypervisor software trap */ | |
431 | TRAP(tt0_1bd, HCALL_BAD) /* hypervisor software trap */ | |
432 | TRAP(tt0_1be, HCALL_BAD) /* hypervisor software trap */ | |
433 | TRAP(tt0_1bf, HCALL_BAD) /* hypervisor software trap */ | |
434 | TRAP(tt0_1c0, HCALL_BAD) /* hypervisor software trap */ | |
435 | TRAP(tt0_1c1, HCALL_BAD) /* hypervisor software trap */ | |
436 | TRAP(tt0_1c2, HCALL_BAD) /* hypervisor software trap */ | |
437 | TRAP(tt0_1c3, HCALL_BAD) /* hypervisor software trap */ | |
438 | TRAP(tt0_1c4, HCALL_BAD) /* hypervisor software trap */ | |
439 | TRAP(tt0_1c5, HCALL_BAD) /* hypervisor software trap */ | |
440 | TRAP(tt0_1c6, HCALL_BAD) /* hypervisor software trap */ | |
441 | TRAP(tt0_1c7, HCALL_BAD) /* hypervisor software trap */ | |
442 | TRAP(tt0_1c8, HCALL_BAD) /* hypervisor software trap */ | |
443 | TRAP(tt0_1c9, HCALL_BAD) /* hypervisor software trap */ | |
444 | TRAP(tt0_1ca, HCALL_BAD) /* hypervisor software trap */ | |
445 | TRAP(tt0_1cb, HCALL_BAD) /* hypervisor software trap */ | |
446 | TRAP(tt0_1cc, HCALL_BAD) /* hypervisor software trap */ | |
447 | TRAP(tt0_1cd, HCALL_BAD) /* hypervisor software trap */ | |
448 | TRAP(tt0_1ce, HCALL_BAD) /* hypervisor software trap */ | |
449 | TRAP(tt0_1cf, HCALL_BAD) /* hypervisor software trap */ | |
450 | TRAP(tt0_1d0, HCALL_BAD) /* hypervisor software trap */ | |
451 | TRAP(tt0_1d1, HCALL_BAD) /* hypervisor software trap */ | |
452 | TRAP(tt0_1d2, HCALL_BAD) /* hypervisor software trap */ | |
453 | TRAP(tt0_1d3, HCALL_BAD) /* hypervisor software trap */ | |
454 | TRAP(tt0_1d4, HCALL_BAD) /* hypervisor software trap */ | |
455 | TRAP(tt0_1d5, HCALL_BAD) /* hypervisor software trap */ | |
456 | TRAP(tt0_1d6, HCALL_BAD) /* hypervisor software trap */ | |
457 | TRAP(tt0_1d7, HCALL_BAD) /* hypervisor software trap */ | |
458 | TRAP(tt0_1d8, HCALL_BAD) /* hypervisor software trap */ | |
459 | TRAP(tt0_1d9, HCALL_BAD) /* hypervisor software trap */ | |
460 | TRAP(tt0_1da, HCALL_BAD) /* hypervisor software trap */ | |
461 | TRAP(tt0_1db, HCALL_BAD) /* hypervisor software trap */ | |
462 | TRAP(tt0_1dc, HCALL_BAD) /* hypervisor software trap */ | |
463 | TRAP(tt0_1dd, HCALL_BAD) /* hypervisor software trap */ | |
464 | TRAP(tt0_1de, HCALL_BAD) /* hypervisor software trap */ | |
465 | TRAP(tt0_1df, HCALL_BAD) /* hypervisor software trap */ | |
466 | TRAP(tt0_1e0, HCALL_BAD) /* hypervisor software trap */ | |
467 | TRAP(tt0_1e1, HCALL_BAD) /* hypervisor software trap */ | |
468 | TRAP(tt0_1e2, HCALL_BAD) /* hypervisor software trap */ | |
469 | TRAP(tt0_1e3, HCALL_BAD) /* hypervisor software trap */ | |
470 | TRAP(tt0_1e4, HCALL_BAD) /* hypervisor software trap */ | |
471 | TRAP(tt0_1e5, HCALL_BAD) /* hypervisor software trap */ | |
472 | TRAP(tt0_1e6, HCALL_BAD) /* hypervisor software trap */ | |
473 | TRAP(tt0_1e7, HCALL_BAD) /* hypervisor software trap */ | |
474 | TRAP(tt0_1e8, HCALL_BAD) /* hypervisor software trap */ | |
475 | TRAP(tt0_1e9, HCALL_BAD) /* hypervisor software trap */ | |
476 | TRAP(tt0_1ea, HCALL_BAD) /* hypervisor software trap */ | |
477 | TRAP(tt0_1eb, HCALL_BAD) /* hypervisor software trap */ | |
478 | TRAP(tt0_1ec, HCALL_BAD) /* hypervisor software trap */ | |
479 | TRAP(tt0_1ed, HCALL_BAD) /* hypervisor software trap */ | |
480 | TRAP(tt0_1ee, HCALL_BAD) /* hypervisor software trap */ | |
481 | TRAP(tt0_1ef, HCALL_BAD) /* hypervisor software trap */ | |
482 | TRAP(tt0_1f0, HCALL_BAD) /* hypervisor software trap */ | |
483 | TRAP(tt0_1f1, HCALL_BAD) /* hypervisor software trap */ | |
484 | TRAP(tt0_1f2, HCALL_BAD) /* hypervisor software trap */ | |
485 | TRAP(tt0_1f3, HCALL_BAD) /* hypervisor software trap */ | |
486 | TRAP(tt0_1f4, HCALL_BAD) /* hypervisor software trap */ | |
487 | TRAP(tt0_1f5, HCALL_BAD) /* hypervisor software trap */ | |
488 | TRAP(tt0_1f6, HCALL_BAD) /* hypervisor software trap */ | |
489 | TRAP(tt0_1f7, HCALL_BAD) /* hypervisor software trap */ | |
490 | TRAP(tt0_1f8, HCALL_BAD) /* hypervisor software trap */ | |
491 | TRAP(tt0_1f9, HCALL_BAD) /* hypervisor software trap */ | |
492 | TRAP(tt0_1fa, HCALL_BAD) /* hypervisor software trap */ | |
493 | TRAP(tt0_1fb, HCALL_BAD) /* hypervisor software trap */ | |
494 | TRAP(tt0_1fc, HCALL_BAD) /* hypervisor software trap */ | |
495 | TRAP(tt0_1fd, HCALL_BAD) /* hypervisor software trap */ | |
496 | TRAP(tt0_1fe, HCALL_BAD) /* hypervisor software trap */ | |
497 | TRAP(tt0_1ff, GOTO(hcall_core)) /* hypervisor software trap */ | |
498 | ehtraptable: | |
499 | SET_SIZE(htraptable) | |
500 | ||
501 | /* | |
502 | * Sparc V9 TBA registers require that bits 14 through 0 must be zero. | |
503 | * Ensure the trap tracing table is aligned on a TRAPTABLE_SIZE boundry. | |
504 | * For additional information, refer to: | |
505 | * "The SPARC Architecture Manual", Version 9, | |
506 | * Section 5.2.8 "Trap Base Address (TBA)" | |
507 | * | |
508 | * There should be nothing in the .text segment between ehtraptable | |
509 | * and htraptracetable. | |
510 | */ | |
511 | ENTRY(htraptracetable) | |
512 | TTRACE_TRAP_TABLE | |
513 | ehtraptracetable: | |
514 | SET_SIZE(htraptracetable) | |
515 | ||
516 | /* | |
517 | * revector - revector a trap to the guest as if the guest received | |
518 | * it directly | |
519 | * | |
520 | * %g1 - new trap type for guest | |
521 | */ | |
522 | ENTRY_NP(revector) | |
523 | rdhpr %htstate, %g2 | |
524 | btst HTSTATE_HPRIV, %g2 | |
525 | bnz,pn %xcc, badtrap | |
526 | .empty | |
527 | ||
528 | rdpr %pstate, %g2 | |
529 | or %g2, PSTATE_PRIV, %g2 | |
530 | wrpr %g2, %pstate | |
531 | ||
532 | rdpr %tba, %g2 | |
533 | wrpr %g1, %tt | |
534 | sllx %g1, 5, %g1 | |
535 | add %g2, %g1, %g1 | |
536 | !! %g1 tba offset to branch to in tt0 | |
537 | ||
538 | rdpr %tl, %g3 | |
539 | cmp %g3, MAXPTL | |
540 | bgu,pn %xcc, watchdog_guest | |
541 | sub %g3, 1, %g2 ! %g3 is either 1 or 2 | |
542 | sllx %g2, 14, %g2 | |
543 | !! %g2 tt1 offset for trap vector for traps at tl>0 | |
544 | ||
545 | mov HPSTATE_GUEST, %g3 | |
546 | jmp %g1 + %g2 | |
547 | wrhpr %g3, %hpstate ! keep ENB bit | |
548 | SET_SIZE(revector) | |
549 | ||
550 | ENTRY_NP(watchdog_guest) | |
551 | #ifdef DEBUG /* { */ | |
552 | LEGION_GOT_HERE | |
553 | STRAND_STRUCT(%g1) | |
554 | ||
555 | ! Save some locals so we can use them while moving around | |
556 | ! the trap levels | |
557 | stx %l0, [%g1 + STRAND_SCR0] | |
558 | stx %l1, [%g1 + STRAND_SCR1] | |
559 | stx %l2, [%g1 + STRAND_SCR2] | |
560 | stx %l3, [%g1 + STRAND_SCR3] | |
561 | mov %g1, %l0 | |
562 | ||
563 | ! Save current %tl and %gl | |
564 | rdpr %tl, %l2 | |
565 | set STRAND_FAIL_TL, %l1 | |
566 | stx %l2, [%l0 + %l1] | |
567 | rdpr %gl, %l2 | |
568 | set STRAND_FAIL_GL, %l1 | |
569 | stx %l2, [%l0 + %l1] | |
570 | ||
571 | ! for each %tl 1..%tl | |
572 | set STRAND_FAIL_TRAPSTATE, %l1 | |
573 | add %l0, %l1, %l1 | |
574 | rdpr %tl, %l2 | |
575 | sub %l2, 1, %l3 ! tl - 1 | |
576 | mulx %l3, TRAPSTATE_SIZE, %l3 | |
577 | add %l1, %l3, %l1 ! %l1 pointer to current trapstate | |
578 | 1: wrpr %l2, %tl ! %l2 current tl | |
579 | rdhpr %htstate, %l3 | |
580 | stx %l3, [%l1 + TRAPSTATE_HTSTATE] | |
581 | rdpr %tstate, %l3 | |
582 | stx %l3, [%l1 + TRAPSTATE_TSTATE] | |
583 | rdpr %tt, %l3 | |
584 | stx %l3, [%l1 + TRAPSTATE_TT] | |
585 | rdpr %tpc, %l3 | |
586 | stx %l3, [%l1 + TRAPSTATE_TPC] | |
587 | rdpr %tnpc, %l3 | |
588 | stx %l3, [%l1 + TRAPSTATE_TNPC] | |
589 | deccc %l2 | |
590 | bnz,pt %xcc, 1b | |
591 | dec TRAPSTATE_SIZE, %l1 | |
592 | ||
593 | ! for each %gl 0..%gl-1 | |
594 | set STRAND_FAIL_TRAPGLOBALS, %l1 | |
595 | add %l0, %l1, %l1 | |
596 | rdpr %gl, %l2 | |
597 | dec %l2 ! gl - 1 | |
598 | mulx %l2, TRAPGLOBALS_SIZE, %l3 | |
599 | add %l1, %l3, %l1 ! %l1 pointer to current trapglobals | |
600 | 1: wrpr %l2, %gl ! %l2 current gl | |
601 | stx %g0, [%l1 + 0x00] | |
602 | stx %g1, [%l1 + 0x08] | |
603 | stx %g2, [%l1 + 0x10] | |
604 | stx %g3, [%l1 + 0x18] | |
605 | stx %g4, [%l1 + 0x20] | |
606 | stx %g5, [%l1 + 0x28] | |
607 | stx %g6, [%l1 + 0x30] | |
608 | stx %g7, [%l1 + 0x38] | |
609 | deccc %l2 | |
610 | bge,pt %xcc, 1b | |
611 | dec TRAPGLOBALS_SIZE, %l1 | |
612 | ||
613 | ! Restore state | |
614 | set STRAND_FAIL_TL, %l1 | |
615 | ldx [%l0 + %l1], %l2 | |
616 | wrpr %l2, %tl | |
617 | set STRAND_FAIL_GL, %l1 | |
618 | ldx [%l0 + %l1], %l2 | |
619 | wrpr %l2, %gl | |
620 | ||
621 | !! %l0 = strand struct | |
622 | ||
623 | DEBUG_SPINLOCK_ENTER(%g1, %g2, %g3) | |
624 | ||
625 | HV_PRINT_NOTRAP("WATCHDOG: strand: ") | |
626 | ldub [%l0 + STRAND_ID], %g1 | |
627 | HV_PRINTX_NOTRAP(%g1) | |
628 | HV_PRINT_NOTRAP(" vcpu: ") | |
629 | VCPU_STRUCT(%l1) | |
630 | ldub [%l1 + CPU_VID], %g1 /* FIXME : VCPU_ID */ | |
631 | HV_PRINTX_NOTRAP(%g1) | |
632 | ||
633 | HV_PRINT_NOTRAP(" tl: ") | |
634 | rdpr %tl, %g1 | |
635 | HV_PRINTX_NOTRAP(%g1) | |
636 | ||
637 | HV_PRINT_NOTRAP(" tt: ") | |
638 | rdpr %tt, %g1 | |
639 | HV_PRINTX_NOTRAP(%g1) | |
640 | ||
641 | HV_PRINT_NOTRAP(" gl: ") | |
642 | rdpr %gl, %g1 | |
643 | HV_PRINTX_NOTRAP(%g1) | |
644 | HV_PRINT_NOTRAP("\r\n") | |
645 | ||
646 | HV_PRINT_NOTRAP(" trap state:\r\n"); | |
647 | set STRAND_FAIL_TRAPSTATE, %l1 | |
648 | add %l0, %l1, %l1 | |
649 | rdpr %tl, %l2 | |
650 | mov 1, %l3 | |
651 | 1: | |
652 | HV_PRINT_NOTRAP(" tl: "); | |
653 | mov %l3, %g1 | |
654 | HV_PRINTX_NOTRAP(%g1) | |
655 | ||
656 | HV_PRINT_NOTRAP(" tt: "); | |
657 | ldx [%l1 + TRAPSTATE_TT], %g1 | |
658 | HV_PRINTX_NOTRAP(%g1) | |
659 | ||
660 | HV_PRINT_NOTRAP(" htstate: "); | |
661 | ldx [%l1 + TRAPSTATE_HTSTATE], %g1 | |
662 | HV_PRINTX_NOTRAP(%g1) | |
663 | ||
664 | HV_PRINT_NOTRAP(" tstate: "); | |
665 | ldx [%l1 + TRAPSTATE_TSTATE], %g1 | |
666 | HV_PRINTX_NOTRAP(%g1) | |
667 | ||
668 | HV_PRINT_NOTRAP("\r\n tpc: "); | |
669 | ldx [%l1 + TRAPSTATE_TPC], %g1 | |
670 | HV_PRINTX_NOTRAP(%g1) | |
671 | ||
672 | HV_PRINT_NOTRAP(" tnpc: "); | |
673 | ldx [%l1 + TRAPSTATE_TNPC], %g1 | |
674 | HV_PRINTX_NOTRAP(%g1) | |
675 | HV_PRINT_NOTRAP("\r\n"); | |
676 | inc %l3 | |
677 | cmp %l3, %l2 | |
678 | bleu,pt %xcc, 1b | |
679 | inc TRAPSTATE_SIZE, %l1 | |
680 | ||
681 | HV_PRINT_NOTRAP(" trap globals:\r\n"); | |
682 | set STRAND_FAIL_TRAPGLOBALS, %l1 | |
683 | add %l0, %l1, %l1 | |
684 | rdpr %gl, %l2 | |
685 | mov 0, %l3 | |
686 | 1: | |
687 | HV_PRINT_NOTRAP(" gl: "); | |
688 | HV_PRINTX_NOTRAP(%l3) | |
689 | ||
690 | HV_PRINT_NOTRAP("\r\n"); | |
691 | HV_PRINT_NOTRAP(" %g0-%g3: "); | |
692 | ldx [%l1 + 0x00], %g1 | |
693 | HV_PRINTX_NOTRAP(%g1) | |
694 | HV_PRINT_NOTRAP(" "); | |
695 | ldx [%l1 + 0x08], %g1 | |
696 | HV_PRINTX_NOTRAP(%g1) | |
697 | HV_PRINT_NOTRAP(" "); | |
698 | ldx [%l1 + 0x10], %g1 | |
699 | HV_PRINTX_NOTRAP(%g1) | |
700 | HV_PRINT_NOTRAP(" "); | |
701 | ldx [%l1 + 0x18], %g1 | |
702 | HV_PRINTX_NOTRAP(%g1) | |
703 | HV_PRINT_NOTRAP("\r\n"); | |
704 | HV_PRINT_NOTRAP(" %g4-%g7: "); | |
705 | ldx [%l1 + 0x20], %g1 | |
706 | HV_PRINTX_NOTRAP(%g1) | |
707 | HV_PRINT_NOTRAP(" "); | |
708 | ldx [%l1 + 0x28], %g1 | |
709 | HV_PRINTX_NOTRAP(%g1) | |
710 | HV_PRINT_NOTRAP(" "); | |
711 | ldx [%l1 + 0x30], %g1 | |
712 | HV_PRINTX_NOTRAP(%g1) | |
713 | HV_PRINT_NOTRAP(" "); | |
714 | ldx [%l1 + 0x38], %g1 | |
715 | HV_PRINTX_NOTRAP(%g1) | |
716 | HV_PRINT_NOTRAP("\r\n"); | |
717 | inc %l3 | |
718 | cmp %l3, %l2 | |
719 | blu,pt %xcc, 1b | |
720 | inc TRAPGLOBALS_SIZE, %l1 | |
721 | ||
722 | HV_PRINT_NOTRAP("\r\n current window:\r\n"); | |
723 | HV_PRINT_NOTRAP(" %o0-%o3: "); | |
724 | mov %o0, %g1 | |
725 | HV_PRINTX_NOTRAP(%g1) | |
726 | HV_PRINT_NOTRAP(" "); | |
727 | mov %o1, %g1 | |
728 | HV_PRINTX_NOTRAP(%g1) | |
729 | HV_PRINT_NOTRAP(" "); | |
730 | mov %o2, %g1 | |
731 | HV_PRINTX_NOTRAP(%g1) | |
732 | HV_PRINT_NOTRAP(" "); | |
733 | mov %o3, %g1 | |
734 | HV_PRINTX_NOTRAP(%g1) | |
735 | HV_PRINT_NOTRAP("\r\n"); | |
736 | HV_PRINT_NOTRAP(" %o4-%o7: "); | |
737 | mov %o4, %g1 | |
738 | HV_PRINTX_NOTRAP(%g1) | |
739 | HV_PRINT_NOTRAP(" "); | |
740 | mov %o5, %g1 | |
741 | HV_PRINTX_NOTRAP(%g1) | |
742 | HV_PRINT_NOTRAP(" "); | |
743 | mov %o6, %g1 | |
744 | HV_PRINTX_NOTRAP(%g1) | |
745 | HV_PRINT_NOTRAP(" "); | |
746 | mov %o7, %g1 | |
747 | HV_PRINTX_NOTRAP(%g1) | |
748 | HV_PRINT_NOTRAP("\r\n"); | |
749 | ||
750 | HV_PRINT_NOTRAP("rtba: ") | |
751 | VCPU_STRUCT(%g1) | |
752 | ldx [%g1 + CPU_RTBA], %g1 | |
753 | HV_PRINTX_NOTRAP(%g1) | |
754 | HV_PRINT_NOTRAP("\r\n"); | |
755 | ||
756 | DEBUG_SPINLOCK_EXIT(%g1) | |
757 | ||
758 | #ifdef T1_FPGA | |
759 | HV_PRINT_NOTRAP("Entering infinite loop in the Hypervisor. \r\n") | |
760 | watchdog_inf_loop: | |
761 | brz,pt %g0, watchdog_inf_loop | |
762 | nop | |
763 | #endif | |
764 | ||
765 | ! Restore saved locals | |
766 | ldx [%l0 + STRAND_SCR3], %l3 | |
767 | ldx [%l0 + STRAND_SCR2], %l2 | |
768 | ldx [%l0 + STRAND_SCR1], %l1 | |
769 | ldx [%l0 + STRAND_SCR0], %l0 | |
770 | #endif /* } DEBUG */ | |
771 | ! Disable MMU | |
772 | ldxa [%g0]ASI_LSUCR, %g1 | |
773 | set (LSUCR_DM | LSUCR_IM), %g2 | |
774 | andn %g1, %g2, %g1 ! disable MMU | |
775 | stxa %g1, [%g0]ASI_LSUCR | |
776 | ||
777 | ! Get real-mode trap table base address | |
778 | VCPU_STRUCT(%g3) | |
779 | ldx [%g3 + CPU_RTBA], %g3 | |
780 | add %g3, (TT_GUEST_WATCHDOG << TT_OFFSET_SHIFT), %g3 | |
781 | rdpr %tt, %g5 | |
782 | wrpr %g0, MAXPTL, %tl | |
783 | wrpr %g5, %tt | |
784 | mov %g3, %o0 ! XXX clobbering %o0 | |
785 | wrpr %g0, MAXPGL, %gl | |
786 | mov HPSTATE_GUEST, %g1 ! XXX clobbering %g1 | |
787 | jmp %o0 | |
788 | wrhpr %g1, %hpstate ! set ENB bit | |
789 | SET_SIZE(watchdog_guest) | |
790 | ||
791 | ||
792 | ! ttrace_generic | |
793 | ! General purpose trap trace routine. | |
794 | ! | |
795 | ! Records state. (See traptrace.h for details.) | |
796 | ! Variable Fields: | |
797 | ! All fields are zeroed. | |
798 | ! | |
799 | ! Expects: %g7 to contain PC of trap table entry | |
800 | ! | |
801 | ENTRY_NP(ttrace_generic) | |
802 | TTRACE_PTR(%g1, %g2, 1f, 1f) | |
803 | TTRACE_STATE(%g2, TTRACE_TYPE_HV, %g3, %g4) | |
804 | sth %g0, [%g2 + TTRACE_ENTRY_TAG] | |
805 | stx %g0, [%g2 + TTRACE_ENTRY_F1] | |
806 | stx %g0, [%g2 + TTRACE_ENTRY_F2] | |
807 | stx %g0, [%g2 + TTRACE_ENTRY_F3] | |
808 | stx %g0, [%g2 + TTRACE_ENTRY_F4] | |
809 | TTRACE_NEXT(%g2, %g3, %g4, %g5) | |
810 | 1: TTRACE_EXIT(%g7, %g1) | |
811 | SET_SIZE(ttrace_generic) | |
812 | ||
813 | ! ttrace_immu | |
814 | ! Traces instruction access exceptions. | |
815 | ! | |
816 | ! Records state. (See traptrace.h for details.) | |
817 | ! Variable Fields: | |
818 | ! F1 = IMMU SFSR | |
819 | ! | |
820 | ! Expects: %g7 to contain PC of trap table entry | |
821 | ! | |
822 | ENTRY_NP(ttrace_immu) | |
823 | TTRACE_PTR(%g1, %g2, 1f, 1f) | |
824 | TTRACE_STATE(%g2, TTRACE_TYPE_HV, %g3, %g4) | |
825 | sth %g0, [%g2 + TTRACE_ENTRY_TAG] | |
826 | mov MMU_SFSR, %g4 | |
827 | ldxa [%g4]ASI_IMMU, %g4 | |
828 | stx %g4, [%g2 + TTRACE_ENTRY_F1] | |
829 | stx %g0, [%g2 + TTRACE_ENTRY_F2] | |
830 | stx %g0, [%g2 + TTRACE_ENTRY_F3] | |
831 | stx %g0, [%g2 + TTRACE_ENTRY_F4] | |
832 | TTRACE_NEXT(%g2, %g3, %g4, %g5) | |
833 | 1: TTRACE_EXIT(%g7, %g1) | |
834 | SET_SIZE(ttrace_immu) | |
835 | ||
836 | ! ttrace_dmmu | |
837 | ! Traces data mmu exceptions. | |
838 | ! | |
839 | ! Records state. (See traptrace.h for details.) | |
840 | ! Variable Fields: | |
841 | ! F1 = DMMU SFSR | |
842 | ! F2 = DMMU SFAR | |
843 | ! | |
844 | ! Expects: %g7 to contain PC of trap table entry | |
845 | ! | |
846 | ENTRY_NP(ttrace_dmmu) | |
847 | TTRACE_PTR(%g1, %g2, 1f, 1f) | |
848 | TTRACE_STATE(%g2, TTRACE_TYPE_HV, %g3, %g4) | |
849 | sth %g0, [%g2 + TTRACE_ENTRY_TAG] | |
850 | mov MMU_SFSR, %g4 | |
851 | ldxa [%g4]ASI_DMMU, %g4 | |
852 | stx %g4, [%g2 + TTRACE_ENTRY_F1] | |
853 | mov MMU_SFAR, %g4 | |
854 | ldxa [%g4]ASI_DMMU, %g4 | |
855 | stx %g4, [%g2 + TTRACE_ENTRY_F2] | |
856 | stx %g0, [%g2 + TTRACE_ENTRY_F3] | |
857 | stx %g0, [%g2 + TTRACE_ENTRY_F4] | |
858 | TTRACE_NEXT(%g2, %g3, %g4, %g5) | |
859 | 1: TTRACE_EXIT(%g7, %g1) | |
860 | SET_SIZE(ttrace_dmmu) | |
861 | ||
862 | ! ttrace_hcall | |
863 | ! Traces hypervisor call traps. | |
864 | ! | |
865 | ! Records state. (See traptrace.h for details.) | |
866 | ! Variable Fields: | |
867 | ! TAG = %o5, Hypervisor Call Number | |
868 | ! F1 = %o0, Argument 0 | |
869 | ! F2 = %o1, Argument 1 | |
870 | ! F3 = %o2, Argument 2 | |
871 | ! F4 = %o3, Argument 3 | |
872 | ! | |
873 | ! Expects: %g7 to contain PC of trap table entry | |
874 | ! | |
875 | ENTRY_NP(ttrace_hcall) | |
876 | TTRACE_PTR(%g1, %g2, 1f, 1f) | |
877 | TTRACE_STATE(%g2, TTRACE_TYPE_HV, %g3, %g4) | |
878 | sth %o5, [%g2 + TTRACE_ENTRY_TAG] | |
879 | stx %o0, [%g2 + TTRACE_ENTRY_F1] | |
880 | stx %o1, [%g2 + TTRACE_ENTRY_F2] | |
881 | stx %o2, [%g2 + TTRACE_ENTRY_F3] | |
882 | stx %o3, [%g2 + TTRACE_ENTRY_F4] | |
883 | TTRACE_NEXT(%g2, %g3, %g4, %g5) | |
884 | 1: TTRACE_EXIT(%g7, %g1) | |
885 | SET_SIZE(ttrace_hcall) | |
886 | ||
887 | ! ttrace_mmu_map | |
888 | ! Traces mmu map traps. | |
889 | ! | |
890 | ! Records state. (See traptrace.h for details.) | |
891 | ! Variable Fields: | |
892 | ! F1 = vaddr | |
893 | ! F2 = ctx | |
894 | ! F3 = TTE | |
895 | ! F4 = flags | |
896 | ! | |
897 | ! Expects: %g7 to contain PC of trap table entry | |
898 | ! | |
899 | ENTRY_NP(ttrace_mmu_map) | |
900 | TTRACE_PTR(%g1, %g2, 1f, 1f) | |
901 | TTRACE_STATE(%g2, TTRACE_TYPE_HV, %g3, %g4) | |
902 | sth %g0, [%g2 + TTRACE_ENTRY_TAG] | |
903 | stx %o0, [%g2 + TTRACE_ENTRY_F1] | |
904 | stx %o1, [%g2 + TTRACE_ENTRY_F2] | |
905 | stx %o2, [%g2 + TTRACE_ENTRY_F3] | |
906 | stx %o3, [%g2 + TTRACE_ENTRY_F4] | |
907 | TTRACE_NEXT(%g2, %g3, %g4, %g5) | |
908 | 1: TTRACE_EXIT(%g7, %g1) | |
909 | SET_SIZE(ttrace_mmu_map) | |
910 | ||
911 | ! ttrace_mmu_unmap | |
912 | ! Traces MMU Unmap traps. | |
913 | ! | |
914 | ! Records state. (See traptrace.h for details.) | |
915 | ! Variable Fields: | |
916 | ! F1 = vaddr | |
917 | ! F2 = ctx | |
918 | ! F3 = flags | |
919 | ! | |
920 | ! Expects: %g7 to contain PC of trap table entry | |
921 | ! | |
922 | ENTRY_NP(ttrace_mmu_unmap) | |
923 | TTRACE_PTR(%g1, %g2, 1f, 1f) | |
924 | TTRACE_STATE(%g2, TTRACE_TYPE_HV, %g3, %g4) | |
925 | sth %g0, [%g2 + TTRACE_ENTRY_TAG] | |
926 | stx %o0, [%g2 + TTRACE_ENTRY_F1] | |
927 | stx %o1, [%g2 + TTRACE_ENTRY_F2] | |
928 | stx %o2, [%g2 + TTRACE_ENTRY_F3] | |
929 | stx %g0, [%g2 + TTRACE_ENTRY_F4] | |
930 | TTRACE_NEXT(%g2, %g3, %g4, %g5) | |
931 | 1: TTRACE_EXIT(%g7, %g1) | |
932 | SET_SIZE(ttrace_mmu_unmap) | |
933 | ||
934 | ! ttrace_ce | |
935 | ! Trace CE error traps | |
936 | ! | |
937 | ! Records state. (See traptrace.h for details.) | |
938 | ! Variable Fields: | |
939 | ! F1 = ce esr | |
940 | ! F2 = ce asr | |
941 | ! | |
942 | ! Expects: %g7 to contain PC of trap table entry | |
943 | ! | |
944 | ENTRY_NP(ttrace_ce) | |
945 | TTRACE_PTR(%g1, %g2, 1f, 1f) | |
946 | TTRACE_STATE(%g2, TTRACE_TYPE_HV, %g3, %g4) | |
947 | sth %g0, [%g2 + TTRACE_ENTRY_TAG] | |
948 | ldxa [%g0]ASI_SPARC_ERR_STATUS, %g4 | |
949 | ldxa [%g0]ASI_SPARC_ERR_ADDR, %g5 | |
950 | stx %g4, [%g2 + TTRACE_ENTRY_F1] | |
951 | stx %g5, [%g2 + TTRACE_ENTRY_F2] | |
952 | stx %g0, [%g2 + TTRACE_ENTRY_F3] | |
953 | stx %g0, [%g2 + TTRACE_ENTRY_F4] | |
954 | TTRACE_NEXT(%g2, %g3, %g4, %g5) | |
955 | 1: TTRACE_EXIT(%g7, %g1) | |
956 | SET_SIZE(ttrace_ce) | |
957 | ||
958 | ! ttrace_ue | |
959 | ! Trace UE error traps | |
960 | ! | |
961 | ! Records state. (See traptrace.h for details.) | |
962 | ! Variable Fields: | |
963 | ! F1 = ue esr | |
964 | ! F2 = ue asr | |
965 | ! | |
966 | ! Expects: %g7 to contain PC of trap table entry | |
967 | ! | |
968 | ENTRY_NP(ttrace_ue) | |
969 | TTRACE_PTR(%g1, %g2, 1f, 1f) | |
970 | TTRACE_STATE(%g2, TTRACE_TYPE_HV, %g3, %g4) | |
971 | sth %g0, [%g2 + TTRACE_ENTRY_TAG] | |
972 | ldxa [%g0]ASI_SPARC_ERR_STATUS, %g4 | |
973 | ldxa [%g0]ASI_SPARC_ERR_ADDR, %g5 | |
974 | stx %g4, [%g2 + TTRACE_ENTRY_F1] | |
975 | stx %g5, [%g2 + TTRACE_ENTRY_F2] | |
976 | stx %g0, [%g2 + TTRACE_ENTRY_F3] | |
977 | stx %g0, [%g2 + TTRACE_ENTRY_F4] | |
978 | TTRACE_NEXT(%g2, %g3, %g4, %g5) | |
979 | 1: TTRACE_EXIT(%g7, %g1) | |
980 | SET_SIZE(ttrace_ue) |