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.7 07/09/14 SMI" | |
50 | ||
51 | .file "traptable.s" | |
52 | ||
53 | /* | |
54 | * Niagara hypervisor trap table | |
55 | */ | |
56 | ||
57 | #include <sys/asm_linkage.h> | |
58 | #include <sys/stack.h> | |
59 | #include <hypervisor.h> | |
60 | #include <hprivregs.h> | |
61 | #include <asi.h> | |
62 | #include <mmu.h> | |
63 | #include <traps.h> | |
64 | #include <sun4v/traps.h> | |
65 | #include <sun4v/mmu.h> | |
66 | ||
67 | #include <offsets.h> | |
68 | #include <traptable.h> | |
69 | #include <util.h> | |
70 | #include <guest.h> | |
71 | #include <traptrace.h> | |
72 | #include <debug.h> | |
73 | #include <util.h> | |
74 | #include <abort.h> | |
75 | #include <error_asm.h> | |
76 | #include <error_regs.h> | |
77 | ||
78 | /* | |
79 | * The basic hypervisor trap table | |
80 | * | |
81 | * We use the linker to place this at the beginning of the hypervisor | |
82 | * binary which gets loaded at an appropriate alignment by Reset/Config. | |
83 | */ | |
84 | ||
85 | ENTRY(htraptable) | |
86 | /* | |
87 | * hardware traps | |
88 | */ | |
89 | TRAP(tt0_000, NOT) /* reserved */ | |
90 | TRAP(tt0_001, POR) /* power-on reset */ | |
91 | TRAP(tt0_002, GOTO(watchdog)) /* watchdog reset */ | |
92 | TRAP(tt0_003, GOTO(xir)) /* externally initiated reset */ | |
93 | TRAP(tt0_004, NOT) /* software initiated reset */ | |
94 | TRAP(tt0_005, NOT) /* red mode exception */ | |
95 | TRAP(tt0_006, NOT) /* reserved */ | |
96 | TRAP(tt0_007, STORE_ERROR) /* Store error */ | |
97 | TRAP(tt0_008, IMMU_ERR(MMU_FT_PRIV)) /* IAE - privilege violation */ | |
98 | TRAP(tt0_009, IMMU_MISS_HWTW) /* instruction access mmu miss */ | |
99 | TRAP(tt0_00a, IA_ERR) /* instruction access error */ | |
100 | TRAP(tt0_00b, IMMU_ERR_RV(MMU_FT_PROT)) /* IAE - unauth access */ | |
101 | TRAP(tt0_00c, IMMU_ERR_RV(MMU_FT_NFO)) /* IAE - NFO page */ | |
102 | TRAP(tt0_00d, IMMU_ERR_RV(MMU_FT_VARANGE)) /* instr address range */ | |
103 | TRAP(tt0_00e, IMMU_ERR_RV(MMU_FT_INVALIDRA)) /* instr real range */ | |
104 | TRAP(tt0_00f, NOT) /* reserved */ | |
105 | TRAP(tt0_010, REVECTOR(TT_ILLINST)) /* illegal instruction */ | |
106 | TRAP(tt0_011, REVECTOR(TT_PRIVOP)) /* privileged opcode */ | |
107 | TRAP(tt0_012, REVECTOR(TT_UNIMP_LDD)) /* unimplemented LDD */ | |
108 | TRAP(tt0_013, REVECTOR(TT_UNIMP_STD)) /* unimplemented STD */ | |
109 | TRAP(tt0_014, DMMU_ERR_RV(MMU_FT_BADASI)) /* DAE - invalid asi */ | |
110 | TRAP(tt0_015, DMMU_ERR_RV(MMU_FT_PRIV)) /* DAE - privilege violation */ | |
111 | TRAP(tt0_016, DAE_nc_page) /* DAE - NC page */ | |
112 | TRAP(tt0_017, DMMU_ERR_RV(MMU_FT_NFO)) /* DAE - NFO page */ | |
113 | TRAP(tt0_018, NOT) /* reserved */ | |
114 | TRAP(tt0_019, NOT) /* reserved */ | |
115 | TRAP(tt0_01a, NOT) /* reserved */ | |
116 | TRAP(tt0_01b, NOT) /* reserved */ | |
117 | TRAP(tt0_01c, NOT) /* reserved */ | |
118 | TRAP(tt0_01d, NOT) /* reserved */ | |
119 | TRAP(tt0_01e, NOT) /* reserved */ | |
120 | TRAP(tt0_01f, NOT) /* reserved */ | |
121 | TRAP(tt0_020, NOT) /* fp disabled */ | |
122 | TRAP(tt0_021, NOT) /* fp exception ieee 754 */ | |
123 | TRAP(tt0_022, NOT) /* fp exception other */ | |
124 | TRAP(tt0_023, NOT) /* tag overflow */ | |
125 | BIGTRAP(tt0_024, CLEAN_WINDOW) /* clean window */ | |
126 | TRAP(tt0_028, NOT) /* division by zero */ | |
127 | TRAP(tt0_029, IP_ERR) /* internal processor error */ | |
128 | TRAP(tt0_02a, ITSB_ERR) /* instr. invalid TSB entry */ | |
129 | TRAP(tt0_02b, DTSB_ERR) /* data invalid TSB entry */ | |
130 | TRAP(tt0_02c, NOT) /* reserved */ | |
131 | TRAP(tt0_02d, DMMU_ERR_RV(MMU_FT_INVALIDRA)) /* mem real range */ | |
132 | TRAP(tt0_02e, DMMU_ERR_RV(MMU_FT_VARANGE)) /* mem address range */ | |
133 | TRAP(tt0_02f, NOT) /* reserved */ | |
134 | TRAP(tt0_030, DMMU_ERR_RV(MMU_FT_SO)) /* DAE - so page */ | |
135 | TRAP(tt0_031, DMMU_MISS_HWTW) /* data access mmu miss */ | |
136 | TRAP(tt0_032, DA_ERR) /* data access error */ | |
137 | TRAP(tt0_033, NOT) /* data access protection */ | |
138 | TRAP(tt0_034, DMMU_ERR(MMU_FT_ALIGN)) /* mem address not aligned */ | |
139 | TRAP(tt0_035, DMMU_ERR(MMU_FT_ALIGN)) /* lddf mem address not aligned */ | |
140 | TRAP(tt0_036, DMMU_ERR(MMU_FT_ALIGN)) /* stdf mem address not aligned */ | |
141 | TRAP(tt0_037, DMMU_ERR(MMU_FT_PRIV)) /* privileged action */ | |
142 | TRAP(tt0_038, DMMU_ERR(MMU_FT_ALIGN)) /* ldqf mem address not aligned */ | |
143 | TRAP(tt0_039, DMMU_ERR(MMU_FT_ALIGN)) /* stqf mem address not aligned */ | |
144 | TRAP(tt0_03a, NOT) /* reserved */ | |
145 | TRAP(tt0_03b, DMMU_ERR_RV(MMU_FT_MULTIERR)) /* unsupported page size */ | |
146 | TRAP(tt0_03c, CWQINTR) /* control word queue */ | |
147 | TRAP(tt0_03d, MAUINTR) /* modular arithmetic unit */ | |
148 | TRAP(tt0_03e, RIMMU_MISS) /* HV: real immu miss */ | |
149 | TRAP(tt0_03f, RDMMU_MISS) /* HV: real dmmu miss */ | |
150 | TRAP(tt0_040, SW_RECOVERABLE_ERROR) /* s/w recoverable error */ | |
151 | TRAP(tt0_041, NOT) /* interrupt level 1 */ | |
152 | TRAP(tt0_042, NOT) /* interrupt level 2 */ | |
153 | TRAP(tt0_043, NOT) /* interrupt level 3 */ | |
154 | TRAP(tt0_044, NOT) /* interrupt level 4 */ | |
155 | TRAP(tt0_045, NOT) /* interrupt level 5 */ | |
156 | TRAP(tt0_046, NOT) /* interrupt level 6 */ | |
157 | TRAP(tt0_047, NOT) /* interrupt level 7 */ | |
158 | TRAP(tt0_048, NOT) /* interrupt level 8 */ | |
159 | TRAP(tt0_049, NOT) /* interrupt level 9 */ | |
160 | TRAP(tt0_04a, NOT) /* interrupt level a */ | |
161 | TRAP(tt0_04b, NOT) /* interrupt level b */ | |
162 | TRAP(tt0_04c, NOT) /* interrupt level c */ | |
163 | TRAP(tt0_04d, NOT) /* interrupt level d */ | |
164 | TRAP(tt0_04e, NOT) /* interrupt level e */ | |
165 | TRAP(tt0_04f, NOT) /* interrupt level f */ | |
166 | TRAP(tt0_050, NOT) /* reserved */ | |
167 | TRAP(tt0_051, NOT) /* reserved */ | |
168 | TRAP(tt0_052, NOT) /* reserved */ | |
169 | TRAP(tt0_053, NOT) /* reserved */ | |
170 | TRAP(tt0_054, NOT) /* reserved */ | |
171 | TRAP(tt0_055, NOT) /* reserved */ | |
172 | TRAP(tt0_056, NOT) /* reserved */ | |
173 | TRAP(tt0_057, NOT) /* reserved */ | |
174 | TRAP(tt0_058, NOT) /* reserved */ | |
175 | TRAP(tt0_059, NOT) /* reserved */ | |
176 | TRAP(tt0_05a, NOT) /* reserved */ | |
177 | TRAP(tt0_05b, NOT) /* reserved */ | |
178 | TRAP(tt0_05c, NOT) /* reserved */ | |
179 | TRAP(tt0_05d, NOT) /* reserved */ | |
180 | TRAP(tt0_05e, HSTICK_INTR) /* HV: hstick match */ | |
181 | TRAP(tt0_05f, NOT) /* trap level zero */ | |
182 | TRAP(tt0_060, VECINTR) /* interrupt vector */ | |
183 | TRAP(tt0_061, NOT) /* RA watchpoint */ | |
184 | TRAP(tt0_062, NOT) /* VA watchpoint */ | |
185 | TRAP(tt0_063, HW_CORRECTED_ERROR) /* H/W CORRected ECC error XXX */ | |
186 | BIGTRAP(tt0_064, IMMU_MISS) /* fast instruction access MMU miss */ | |
187 | BIGTRAP(tt0_068, DMMU_MISS) /* fast data access MMU miss */ | |
188 | BIGTRAP(tt0_06C, DMMU_PROT) /* fast data access protection */ | |
189 | TRAP(tt0_070, NOT) /* reserved */ | |
190 | TRAP(tt0_071, IAM_ERR) /* instruction access MMU error */ | |
191 | TRAP(tt0_072, DAM_ERR) /* data access MMU error */ | |
192 | TRAP(tt0_073, NOT) /* reserved */ | |
193 | TRAP(tt0_074, NOT) /* control transfer instruction */ | |
194 | TRAP(tt0_075, NOT) /* instruction VA watchpoint */ | |
195 | TRAP(tt0_076, NOT) /* instruction breakpoint */ | |
196 | TRAP(tt0_077, NOT) /* reserved */ | |
197 | TRAP(tt0_078, NOT) /* data error (disrupting) */ | |
198 | TRAP(tt0_079, NOT) /* reserved */ | |
199 | TRAP(tt0_07a, NOT) /* reserved */ | |
200 | TRAP(tt0_07b, NOT) /* reserved */ | |
201 | TRAP(tt0_07c, NOT) /* HV: cpu mondo */ | |
202 | TRAP(tt0_07d, NOT) /* HV: dev mondo */ | |
203 | TRAP(tt0_07e, NOT) /* HV: resumable error */ | |
204 | TRAP(tt0_07f, NOT) /* HV: non-resumable error */ | |
205 | BIGTRAP(tt0_080, SPILL_WINDOW) /* spill 0 normal */ | |
206 | BIGTRAP(tt0_084, SPILL_WINDOW) /* spill 1 normal */ | |
207 | BIGTRAP(tt0_088, SPILL_WINDOW) /* spill 2 normal */ | |
208 | BIGTRAP(tt0_08c, SPILL_WINDOW) /* spill 3 normal */ | |
209 | BIGTRAP(tt0_090, SPILL_WINDOW) /* spill 4 normal */ | |
210 | BIGTRAP(tt0_094, SPILL_WINDOW) /* spill 5 normal */ | |
211 | BIGTRAP(tt0_098, SPILL_WINDOW) /* spill 6 normal */ | |
212 | BIGTRAP(tt0_09c, SPILL_WINDOW) /* spill 7 normal */ | |
213 | BIGTRAP(tt0_0a0, SPILL_WINDOW) /* spill 0 other */ | |
214 | BIGTRAP(tt0_0a4, SPILL_WINDOW) /* spill 1 other */ | |
215 | BIGTRAP(tt0_0a8, SPILL_WINDOW) /* spill 2 other */ | |
216 | BIGTRAP(tt0_0ac, SPILL_WINDOW) /* spill 3 other */ | |
217 | BIGTRAP(tt0_0b0, SPILL_WINDOW) /* spill 4 other */ | |
218 | BIGTRAP(tt0_0b4, SPILL_WINDOW) /* spill 5 other */ | |
219 | BIGTRAP(tt0_0b8, SPILL_WINDOW) /* spill 6 other */ | |
220 | BIGTRAP(tt0_0bc, SPILL_WINDOW) /* spill 7 other */ | |
221 | BIGTRAP(tt0_0c0, FILL_WINDOW) /* fill 0 normal */ | |
222 | BIGTRAP(tt0_0c4, FILL_WINDOW) /* fill 1 normal */ | |
223 | BIGTRAP(tt0_0c8, FILL_WINDOW) /* fill 2 normal */ | |
224 | BIGTRAP(tt0_0cc, FILL_WINDOW) /* fill 3 normal */ | |
225 | BIGTRAP(tt0_0d0, FILL_WINDOW) /* fill 4 normal */ | |
226 | BIGTRAP(tt0_0d4, FILL_WINDOW) /* fill 5 normal */ | |
227 | BIGTRAP(tt0_0d8, FILL_WINDOW) /* fill 6 normal */ | |
228 | BIGTRAP(tt0_0dc, FILL_WINDOW) /* fill 7 normal */ | |
229 | BIGTRAP(tt0_0e0, FILL_WINDOW) /* fill 0 other */ | |
230 | BIGTRAP(tt0_0e4, FILL_WINDOW) /* fill 1 other */ | |
231 | BIGTRAP(tt0_0e8, FILL_WINDOW) /* fill 2 other */ | |
232 | BIGTRAP(tt0_0ec, FILL_WINDOW) /* fill 3 other */ | |
233 | BIGTRAP(tt0_0f0, FILL_WINDOW) /* fill 4 other */ | |
234 | BIGTRAP(tt0_0f4, FILL_WINDOW) /* fill 5 other */ | |
235 | BIGTRAP(tt0_0f8, FILL_WINDOW) /* fill 6 other */ | |
236 | BIGTRAP(tt0_0fc, FILL_WINDOW) /* fill 7 other */ | |
237 | /* | |
238 | * Software traps | |
239 | */ | |
240 | TRAP(tt0_100, NOT) /* software trap */ | |
241 | TRAP(tt0_101, NOT) /* software trap */ | |
242 | TRAP(tt0_102, NOT) /* software trap */ | |
243 | TRAP(tt0_103, NOT) /* software trap */ | |
244 | TRAP(tt0_104, NOT) /* software trap */ | |
245 | TRAP(tt0_105, NOT) /* software trap */ | |
246 | TRAP(tt0_106, NOT) /* software trap */ | |
247 | TRAP(tt0_107, NOT) /* software trap */ | |
248 | TRAP(tt0_108, NOT) /* software trap */ | |
249 | TRAP(tt0_109, NOT) /* software trap */ | |
250 | TRAP(tt0_10a, NOT) /* software trap */ | |
251 | TRAP(tt0_10b, NOT) /* software trap */ | |
252 | TRAP(tt0_10c, NOT) /* software trap */ | |
253 | TRAP(tt0_10d, NOT) /* software trap */ | |
254 | TRAP(tt0_10e, NOT) /* software trap */ | |
255 | TRAP(tt0_10f, NOT) /* software trap */ | |
256 | TRAP(tt0_110, NOT) /* software trap */ | |
257 | TRAP(tt0_111, NOT) /* software trap */ | |
258 | TRAP(tt0_112, NOT) /* software trap */ | |
259 | #ifdef DEBUG | |
260 | TRAP(tt0_113, GOTO(hprint)) /* print string */ | |
261 | TRAP(tt0_114, GOTO(hprintx)) /* print hex 64-bit */ | |
262 | #else | |
263 | TRAP(tt0_113, NOT) /* software trap */ | |
264 | TRAP(tt0_114, NOT) /* software trap */ | |
265 | #endif | |
266 | TRAP(tt0_115, NOT) /* software trap */ | |
267 | TRAP(tt0_116, NOT) /* software trap */ | |
268 | TRAP(tt0_117, NOT) /* software trap */ | |
269 | TRAP(tt0_118, NOT) /* software trap */ | |
270 | TRAP(tt0_119, NOT) /* software trap */ | |
271 | TRAP(tt0_11a, NOT) /* software trap */ | |
272 | TRAP(tt0_11b, NOT) /* software trap */ | |
273 | TRAP(tt0_11c, NOT) /* software trap */ | |
274 | TRAP(tt0_11d, NOT) /* software trap */ | |
275 | TRAP(tt0_11e, NOT) /* software trap */ | |
276 | TRAP(tt0_11f, NOT) /* software trap */ | |
277 | TRAP(tt0_120, NOT) /* software trap */ | |
278 | TRAP(tt0_121, NOT) /* software trap */ | |
279 | TRAP(tt0_122, NOT) /* software trap */ | |
280 | TRAP(tt0_123, NOT) /* software trap */ | |
281 | TRAP(tt0_124, NOT) /* software trap */ | |
282 | TRAP(tt0_125, NOT) /* software trap */ | |
283 | TRAP(tt0_126, NOT) /* software trap */ | |
284 | TRAP(tt0_127, NOT) /* software trap */ | |
285 | TRAP(tt0_128, NOT) /* software trap */ | |
286 | TRAP(tt0_129, NOT) /* software trap */ | |
287 | TRAP(tt0_12a, NOT) /* software trap */ | |
288 | TRAP(tt0_12b, NOT) /* software trap */ | |
289 | TRAP(tt0_12c, NOT) /* software trap */ | |
290 | TRAP(tt0_12d, NOT) /* software trap */ | |
291 | TRAP(tt0_12e, NOT) /* software trap */ | |
292 | TRAP(tt0_12f, NOT) /* software trap */ | |
293 | TRAP(tt0_130, NOT) /* software trap */ | |
294 | TRAP(tt0_131, NOT) /* software trap */ | |
295 | TRAP(tt0_132, NOT) /* software trap */ | |
296 | TRAP(tt0_133, NOT) /* software trap */ | |
297 | TRAP(tt0_134, NOT) /* software trap */ | |
298 | TRAP(tt0_135, NOT) /* software trap */ | |
299 | TRAP(tt0_136, NOT) /* software trap */ | |
300 | TRAP(tt0_137, NOT) /* software trap */ | |
301 | TRAP(tt0_138, NOT) /* software trap */ | |
302 | TRAP(tt0_139, NOT) /* software trap */ | |
303 | TRAP(tt0_13a, NOT) /* software trap */ | |
304 | TRAP(tt0_13b, NOT) /* software trap */ | |
305 | TRAP(tt0_13c, NOT) /* software trap */ | |
306 | TRAP(tt0_13d, NOT) /* software trap */ | |
307 | TRAP(tt0_13e, NOT) /* software trap */ | |
308 | TRAP(tt0_13f, NOT) /* software trap */ | |
309 | TRAP(tt0_140, NOT) /* software trap */ | |
310 | TRAP(tt0_141, NOT) /* software trap */ | |
311 | TRAP(tt0_142, NOT) /* software trap */ | |
312 | TRAP(tt0_143, NOT) /* software trap */ | |
313 | TRAP(tt0_144, NOT) /* software trap */ | |
314 | TRAP(tt0_145, NOT) /* software trap */ | |
315 | TRAP(tt0_146, NOT) /* software trap */ | |
316 | TRAP(tt0_147, NOT) /* software trap */ | |
317 | TRAP(tt0_148, NOT) /* software trap */ | |
318 | TRAP(tt0_149, NOT) /* software trap */ | |
319 | TRAP(tt0_14a, NOT) /* software trap */ | |
320 | TRAP(tt0_14b, NOT) /* software trap */ | |
321 | TRAP(tt0_14c, NOT) /* software trap */ | |
322 | TRAP(tt0_14d, NOT) /* software trap */ | |
323 | TRAP(tt0_14e, NOT) /* software trap */ | |
324 | TRAP(tt0_14f, NOT) /* software trap */ | |
325 | TRAP(tt0_150, NOT) /* software trap */ | |
326 | TRAP(tt0_151, NOT) /* software trap */ | |
327 | TRAP(tt0_152, NOT) /* software trap */ | |
328 | TRAP(tt0_153, NOT) /* software trap */ | |
329 | TRAP(tt0_154, NOT) /* software trap */ | |
330 | TRAP(tt0_155, NOT) /* software trap */ | |
331 | TRAP(tt0_156, NOT) /* software trap */ | |
332 | TRAP(tt0_157, NOT) /* software trap */ | |
333 | TRAP(tt0_158, NOT) /* software trap */ | |
334 | TRAP(tt0_159, NOT) /* software trap */ | |
335 | TRAP(tt0_15a, NOT) /* software trap */ | |
336 | TRAP(tt0_15b, NOT) /* software trap */ | |
337 | TRAP(tt0_15c, NOT) /* software trap */ | |
338 | TRAP(tt0_15d, NOT) /* software trap */ | |
339 | TRAP(tt0_15e, NOT) /* software trap */ | |
340 | TRAP(tt0_15f, NOT) /* software trap */ | |
341 | TRAP(tt0_160, NOT) /* software trap */ | |
342 | TRAP(tt0_161, NOT) /* software trap */ | |
343 | TRAP(tt0_162, NOT) /* software trap */ | |
344 | TRAP(tt0_163, NOT) /* software trap */ | |
345 | TRAP(tt0_164, NOT) /* software trap */ | |
346 | TRAP(tt0_165, NOT) /* software trap */ | |
347 | TRAP(tt0_166, NOT) /* software trap */ | |
348 | TRAP(tt0_167, NOT) /* software trap */ | |
349 | TRAP(tt0_168, NOT) /* software trap */ | |
350 | TRAP(tt0_169, NOT) /* software trap */ | |
351 | TRAP(tt0_16a, NOT) /* software trap */ | |
352 | TRAP(tt0_16b, NOT) /* software trap */ | |
353 | TRAP(tt0_16c, NOT) /* software trap */ | |
354 | TRAP(tt0_16d, NOT) /* software trap */ | |
355 | TRAP(tt0_16e, NOT) /* software trap */ | |
356 | TRAP(tt0_16f, NOT) /* software trap */ | |
357 | TRAP(tt0_170, NOT) /* software trap */ | |
358 | TRAP(tt0_171, NOT) /* software trap */ | |
359 | TRAP(tt0_172, NOT) /* software trap */ | |
360 | TRAP(tt0_173, NOT) /* software trap */ | |
361 | TRAP(tt0_174, NOT) /* software trap */ | |
362 | TRAP(tt0_175, NOT) /* software trap */ | |
363 | TRAP(tt0_176, NOT) /* software trap */ | |
364 | TRAP(tt0_177, NOT) /* software trap */ | |
365 | TRAP(tt0_178, NOT) /* software trap */ | |
366 | TRAP(tt0_179, NOT) /* software trap */ | |
367 | TRAP(tt0_17a, NOT) /* software trap */ | |
368 | TRAP(tt0_17b, NOT) /* software trap */ | |
369 | TRAP(tt0_17c, NOT) /* software trap */ | |
370 | TRAP(tt0_17d, NOT) /* software trap */ | |
371 | TRAP(tt0_17e, NOT) /* software trap */ | |
372 | TRAP(tt0_17f, NOT) /* software trap */ | |
373 | TRAP(tt0_180, GOTO(hcall)) /* hypervisor software trap */ | |
374 | TRAP(tt0_181, HCALL_BAD) /* hypervisor software trap */ | |
375 | TRAP(tt0_182, HCALL_BAD) /* hypervisor software trap */ | |
376 | TRAP_NOALIGN(tt0_183, HCALL(MMU_MAP_ADDR_IDX)) /* hyperfast trap */ | |
377 | TRAP_NOALIGN(tt0_184, HCALL(MMU_UNMAP_ADDR_IDX)) /* hyperfast trap */ | |
378 | TRAP_NOALIGN(tt0_185, HCALL(TTRACE_ADDENTRY_IDX)) /* hyperfast trap */ | |
379 | TRAP(tt0_186, HCALL_BAD) /* hypervisor software trap */ | |
380 | TRAP(tt0_187, HCALL_BAD) /* hypervisor software trap */ | |
381 | TRAP(tt0_188, HCALL_BAD) /* hypervisor software trap */ | |
382 | TRAP(tt0_189, HCALL_BAD) /* hypervisor software trap */ | |
383 | TRAP(tt0_18a, HCALL_BAD) /* hypervisor software trap */ | |
384 | TRAP(tt0_18b, HCALL_BAD) /* hypervisor software trap */ | |
385 | TRAP(tt0_18c, HCALL_BAD) /* hypervisor software trap */ | |
386 | TRAP(tt0_18d, HCALL_BAD) /* hypervisor software trap */ | |
387 | TRAP(tt0_18e, HCALL_BAD) /* hypervisor software trap */ | |
388 | TRAP(tt0_18f, HCALL_BAD) /* hypervisor software trap */ | |
389 | TRAP(tt0_190, HCALL_BAD) /* hypervisor software trap */ | |
390 | TRAP(tt0_191, HCALL_BAD) /* hypervisor software trap */ | |
391 | TRAP(tt0_192, HCALL_BAD) /* hypervisor software trap */ | |
392 | TRAP(tt0_193, HCALL_BAD) /* hypervisor software trap */ | |
393 | TRAP(tt0_194, HCALL_BAD) /* hypervisor software trap */ | |
394 | TRAP(tt0_195, HCALL_BAD) /* hypervisor software trap */ | |
395 | TRAP(tt0_196, HCALL_BAD) /* hypervisor software trap */ | |
396 | TRAP(tt0_197, HCALL_BAD) /* hypervisor software trap */ | |
397 | TRAP(tt0_198, HCALL_BAD) /* hypervisor software trap */ | |
398 | TRAP(tt0_199, HCALL_BAD) /* hypervisor software trap */ | |
399 | TRAP(tt0_19a, HCALL_BAD) /* hypervisor software trap */ | |
400 | TRAP(tt0_19b, HCALL_BAD) /* hypervisor software trap */ | |
401 | TRAP(tt0_19c, HCALL_BAD) /* hypervisor software trap */ | |
402 | TRAP(tt0_19d, HCALL_BAD) /* hypervisor software trap */ | |
403 | TRAP(tt0_19e, HCALL_BAD) /* hypervisor software trap */ | |
404 | TRAP(tt0_19f, HCALL_BAD) /* hypervisor software trap */ | |
405 | TRAP(tt0_1a0, HCALL_BAD) /* hypervisor software trap */ | |
406 | TRAP(tt0_1a1, HCALL_BAD) /* hypervisor software trap */ | |
407 | TRAP(tt0_1a2, HCALL_BAD) /* hypervisor software trap */ | |
408 | TRAP(tt0_1a3, HCALL_BAD) /* hypervisor software trap */ | |
409 | TRAP(tt0_1a4, HCALL_BAD) /* hypervisor software trap */ | |
410 | TRAP(tt0_1a5, HCALL_BAD) /* hypervisor software trap */ | |
411 | TRAP(tt0_1a6, HCALL_BAD) /* hypervisor software trap */ | |
412 | TRAP(tt0_1a7, HCALL_BAD) /* hypervisor software trap */ | |
413 | TRAP(tt0_1a8, HCALL_BAD) /* hypervisor software trap */ | |
414 | TRAP(tt0_1a9, HCALL_BAD) /* hypervisor software trap */ | |
415 | TRAP(tt0_1aa, HCALL_BAD) /* hypervisor software trap */ | |
416 | TRAP(tt0_1ab, HCALL_BAD) /* hypervisor software trap */ | |
417 | TRAP(tt0_1ac, HCALL_BAD) /* hypervisor software trap */ | |
418 | TRAP(tt0_1ad, HCALL_BAD) /* hypervisor software trap */ | |
419 | TRAP(tt0_1ae, HCALL_BAD) /* hypervisor software trap */ | |
420 | TRAP(tt0_1af, HCALL_BAD) /* hypervisor software trap */ | |
421 | TRAP(tt0_1b0, HCALL_BAD) /* hypervisor software trap */ | |
422 | TRAP(tt0_1b1, HCALL_BAD) /* hypervisor software trap */ | |
423 | TRAP(tt0_1b2, HCALL_BAD) /* hypervisor software trap */ | |
424 | TRAP(tt0_1b3, HCALL_BAD) /* hypervisor software trap */ | |
425 | TRAP(tt0_1b4, HCALL_BAD) /* hypervisor software trap */ | |
426 | TRAP(tt0_1b5, HCALL_BAD) /* hypervisor software trap */ | |
427 | TRAP(tt0_1b6, HCALL_BAD) /* hypervisor software trap */ | |
428 | TRAP(tt0_1b7, HCALL_BAD) /* hypervisor software trap */ | |
429 | TRAP(tt0_1b8, HCALL_BAD) /* hypervisor software trap */ | |
430 | TRAP(tt0_1b9, HCALL_BAD) /* hypervisor software trap */ | |
431 | TRAP(tt0_1ba, HCALL_BAD) /* hypervisor software trap */ | |
432 | TRAP(tt0_1bb, HCALL_BAD) /* hypervisor software trap */ | |
433 | TRAP(tt0_1bc, HCALL_BAD) /* hypervisor software trap */ | |
434 | TRAP(tt0_1bd, HCALL_BAD) /* hypervisor software trap */ | |
435 | TRAP(tt0_1be, HCALL_BAD) /* hypervisor software trap */ | |
436 | TRAP(tt0_1bf, HCALL_BAD) /* hypervisor software trap */ | |
437 | TRAP(tt0_1c0, HCALL_BAD) /* hypervisor software trap */ | |
438 | TRAP(tt0_1c1, HCALL_BAD) /* hypervisor software trap */ | |
439 | TRAP(tt0_1c2, HCALL_BAD) /* hypervisor software trap */ | |
440 | TRAP(tt0_1c3, HCALL_BAD) /* hypervisor software trap */ | |
441 | TRAP(tt0_1c4, HCALL_BAD) /* hypervisor software trap */ | |
442 | TRAP(tt0_1c5, HCALL_BAD) /* hypervisor software trap */ | |
443 | TRAP(tt0_1c6, HCALL_BAD) /* hypervisor software trap */ | |
444 | TRAP(tt0_1c7, HCALL_BAD) /* hypervisor software trap */ | |
445 | TRAP(tt0_1c8, HCALL_BAD) /* hypervisor software trap */ | |
446 | TRAP(tt0_1c9, HCALL_BAD) /* hypervisor software trap */ | |
447 | TRAP(tt0_1ca, HCALL_BAD) /* hypervisor software trap */ | |
448 | TRAP(tt0_1cb, HCALL_BAD) /* hypervisor software trap */ | |
449 | TRAP(tt0_1cc, HCALL_BAD) /* hypervisor software trap */ | |
450 | TRAP(tt0_1cd, HCALL_BAD) /* hypervisor software trap */ | |
451 | TRAP(tt0_1ce, HCALL_BAD) /* hypervisor software trap */ | |
452 | TRAP(tt0_1cf, HCALL_BAD) /* hypervisor software trap */ | |
453 | TRAP(tt0_1d0, HCALL_BAD) /* hypervisor software trap */ | |
454 | TRAP(tt0_1d1, HCALL_BAD) /* hypervisor software trap */ | |
455 | TRAP(tt0_1d2, HCALL_BAD) /* hypervisor software trap */ | |
456 | TRAP(tt0_1d3, HCALL_BAD) /* hypervisor software trap */ | |
457 | TRAP(tt0_1d4, HCALL_BAD) /* hypervisor software trap */ | |
458 | TRAP(tt0_1d5, HCALL_BAD) /* hypervisor software trap */ | |
459 | TRAP(tt0_1d6, HCALL_BAD) /* hypervisor software trap */ | |
460 | TRAP(tt0_1d7, HCALL_BAD) /* hypervisor software trap */ | |
461 | TRAP(tt0_1d8, HCALL_BAD) /* hypervisor software trap */ | |
462 | TRAP(tt0_1d9, HCALL_BAD) /* hypervisor software trap */ | |
463 | TRAP(tt0_1da, HCALL_BAD) /* hypervisor software trap */ | |
464 | TRAP(tt0_1db, HCALL_BAD) /* hypervisor software trap */ | |
465 | TRAP(tt0_1dc, HCALL_BAD) /* hypervisor software trap */ | |
466 | TRAP(tt0_1dd, HCALL_BAD) /* hypervisor software trap */ | |
467 | TRAP(tt0_1de, HCALL_BAD) /* hypervisor software trap */ | |
468 | TRAP(tt0_1df, HCALL_BAD) /* hypervisor software trap */ | |
469 | TRAP(tt0_1e0, HCALL_BAD) /* hypervisor software trap */ | |
470 | TRAP(tt0_1e1, HCALL_BAD) /* hypervisor software trap */ | |
471 | TRAP(tt0_1e2, HCALL_BAD) /* hypervisor software trap */ | |
472 | TRAP(tt0_1e3, HCALL_BAD) /* hypervisor software trap */ | |
473 | TRAP(tt0_1e4, HCALL_BAD) /* hypervisor software trap */ | |
474 | TRAP(tt0_1e5, HCALL_BAD) /* hypervisor software trap */ | |
475 | TRAP(tt0_1e6, HCALL_BAD) /* hypervisor software trap */ | |
476 | TRAP(tt0_1e7, HCALL_BAD) /* hypervisor software trap */ | |
477 | TRAP(tt0_1e8, HCALL_BAD) /* hypervisor software trap */ | |
478 | TRAP(tt0_1e9, HCALL_BAD) /* hypervisor software trap */ | |
479 | TRAP(tt0_1ea, HCALL_BAD) /* hypervisor software trap */ | |
480 | TRAP(tt0_1eb, HCALL_BAD) /* hypervisor software trap */ | |
481 | TRAP(tt0_1ec, HCALL_BAD) /* hypervisor software trap */ | |
482 | TRAP(tt0_1ed, HCALL_BAD) /* hypervisor software trap */ | |
483 | TRAP(tt0_1ee, HCALL_BAD) /* hypervisor software trap */ | |
484 | TRAP(tt0_1ef, HCALL_BAD) /* hypervisor software trap */ | |
485 | TRAP(tt0_1f0, HCALL_BAD) /* hypervisor software trap */ | |
486 | TRAP(tt0_1f1, HCALL_BAD) /* hypervisor software trap */ | |
487 | TRAP(tt0_1f2, HCALL_BAD) /* hypervisor software trap */ | |
488 | TRAP(tt0_1f3, HCALL_BAD) /* hypervisor software trap */ | |
489 | TRAP(tt0_1f4, HCALL_BAD) /* hypervisor software trap */ | |
490 | TRAP(tt0_1f5, HCALL_BAD) /* hypervisor software trap */ | |
491 | TRAP(tt0_1f6, HCALL_BAD) /* hypervisor software trap */ | |
492 | TRAP(tt0_1f7, HCALL_BAD) /* hypervisor software trap */ | |
493 | TRAP(tt0_1f8, HCALL_BAD) /* hypervisor software trap */ | |
494 | TRAP(tt0_1f9, HCALL_BAD) /* hypervisor software trap */ | |
495 | TRAP(tt0_1fa, HCALL_BAD) /* hypervisor software trap */ | |
496 | TRAP(tt0_1fb, HCALL_BAD) /* hypervisor software trap */ | |
497 | TRAP(tt0_1fc, HCALL_BAD) /* hypervisor software trap */ | |
498 | TRAP(tt0_1fd, HCALL_BAD) /* hypervisor software trap */ | |
499 | TRAP(tt0_1fe, HCALL_BAD) /* hypervisor software trap */ | |
500 | TRAP(tt0_1ff, GOTO(hcall_core)) /* hypervisor software trap */ | |
501 | ehtraptable: | |
502 | SET_SIZE(htraptable) | |
503 | ||
504 | /* | |
505 | * Sparc V9 TBA registers require that bits 14 through 0 must be zero. | |
506 | * Ensure the trap tracing table is aligned on a TRAPTABLE_SIZE boundry. | |
507 | * For additional information, refer to: | |
508 | * "The SPARC Architecture Manual", Version 9, | |
509 | * Section 5.2.8 "Trap Base Address (TBA)" | |
510 | * | |
511 | * There should be nothing in the .text segment between ehtraptable | |
512 | * and htraptracetable. | |
513 | */ | |
514 | ENTRY(htraptracetable) | |
515 | TTRACE_TRAP_TABLE | |
516 | ehtraptracetable: | |
517 | SET_SIZE(htraptracetable) | |
518 | ||
519 | ||
520 | /* | |
521 | * revector - revector a trap to the guest as if the guest received | |
522 | * it directly | |
523 | * | |
524 | * %g1 - new trap type for guest | |
525 | */ | |
526 | ENTRY_NP(revector) | |
527 | rdhpr %htstate, %g2 | |
528 | btst HTSTATE_HPRIV, %g2 | |
529 | bnz,pn %xcc, badtrap | |
530 | .empty | |
531 | ||
532 | rdpr %tba, %g2 | |
533 | wrpr %g1, %tt | |
534 | sllx %g1, 5, %g1 | |
535 | add %g1, %g2, %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 | add %g1, %g2, %g1 | |
546 | ||
547 | TRAP_GUEST(%g1, %g2, %g3) | |
548 | /*NOTREACHED*/ | |
549 | SET_SIZE(revector) | |
550 | ||
551 | ENTRY_NP(watchdog_guest) | |
552 | #ifdef DEBUG_LEGION /* { */ | |
553 | LEGION_GOT_HERE | |
554 | STRAND_STRUCT(%g1) | |
555 | ||
556 | ! Save some locals so we can use them while moving around | |
557 | ! the trap levels | |
558 | stx %l0, [%g1 + STRAND_SCR0] | |
559 | stx %l1, [%g1 + STRAND_SCR1] | |
560 | stx %l2, [%g1 + STRAND_SCR2] | |
561 | stx %l3, [%g1 + STRAND_SCR3] | |
562 | mov %g1, %l0 | |
563 | ||
564 | ! Save current %tl and %gl | |
565 | rdpr %tl, %l2 | |
566 | set STRAND_FAIL_TL, %l1 | |
567 | stx %l2, [%l0 + %l1] | |
568 | rdpr %gl, %l2 | |
569 | set STRAND_FAIL_GL, %l1 | |
570 | stx %l2, [%l0 + %l1] | |
571 | ||
572 | ! for each %tl 1..%tl | |
573 | set STRAND_FAIL_TRAPSTATE, %l1 | |
574 | add %l0, %l1, %l1 | |
575 | rdpr %tl, %l2 | |
576 | sub %l2, 1, %l3 ! tl - 1 | |
577 | mulx %l3, TRAPSTATE_SIZE, %l3 | |
578 | add %l1, %l3, %l1 ! %l1 pointer to current trapstate | |
579 | 1: wrpr %l2, %tl ! %l2 current tl | |
580 | rdhpr %htstate, %l3 | |
581 | stx %l3, [%l1 + TRAPSTATE_HTSTATE] | |
582 | rdpr %tstate, %l3 | |
583 | stx %l3, [%l1 + TRAPSTATE_TSTATE] | |
584 | rdpr %tt, %l3 | |
585 | stx %l3, [%l1 + TRAPSTATE_TT] | |
586 | rdpr %tpc, %l3 | |
587 | stx %l3, [%l1 + TRAPSTATE_TPC] | |
588 | rdpr %tnpc, %l3 | |
589 | stx %l3, [%l1 + TRAPSTATE_TNPC] | |
590 | deccc %l2 | |
591 | bnz,pt %xcc, 1b | |
592 | dec TRAPSTATE_SIZE, %l1 | |
593 | ||
594 | ! for each %gl 0..%gl-1 | |
595 | set STRAND_FAIL_TRAPGLOBALS, %l1 | |
596 | add %l0, %l1, %l1 | |
597 | rdpr %gl, %l2 | |
598 | dec %l2 ! gl - 1 | |
599 | mulx %l2, TRAPGLOBALS_SIZE, %l3 | |
600 | add %l1, %l3, %l1 ! %l1 pointer to current trapglobals | |
601 | 1: wrpr %l2, %gl ! %l2 current gl | |
602 | stx %g0, [%l1 + 0x00] | |
603 | stx %g1, [%l1 + 0x08] | |
604 | stx %g2, [%l1 + 0x10] | |
605 | stx %g3, [%l1 + 0x18] | |
606 | stx %g4, [%l1 + 0x20] | |
607 | stx %g5, [%l1 + 0x28] | |
608 | stx %g6, [%l1 + 0x30] | |
609 | stx %g7, [%l1 + 0x38] | |
610 | deccc %l2 | |
611 | bge,pt %xcc, 1b | |
612 | dec TRAPGLOBALS_SIZE, %l1 | |
613 | ||
614 | ! Restore state | |
615 | set STRAND_FAIL_TL, %l1 | |
616 | ldx [%l0 + %l1], %l2 | |
617 | wrpr %l2, %tl | |
618 | set STRAND_FAIL_GL, %l1 | |
619 | ldx [%l0 + %l1], %l2 | |
620 | wrpr %l2, %gl | |
621 | ||
622 | DEBUG_SPINLOCK_ENTER(%g1, %g2, %g3) | |
623 | ||
624 | HV_PRINT_NOTRAP("WATCHDOG: strandid: ") | |
625 | ldub [%l0 + STRAND_ID], %g1 | |
626 | HV_PRINTX_NOTRAP(%g1) | |
627 | ||
628 | HV_PRINT_NOTRAP(" tl: ") | |
629 | rdpr %tl, %g1 | |
630 | HV_PRINTX_NOTRAP(%g1) | |
631 | ||
632 | HV_PRINT_NOTRAP(" tt: ") | |
633 | rdpr %tt, %g1 | |
634 | HV_PRINTX_NOTRAP(%g1) | |
635 | ||
636 | HV_PRINT_NOTRAP(" gl: ") | |
637 | rdpr %gl, %g1 | |
638 | HV_PRINTX_NOTRAP(%g1) | |
639 | HV_PRINT_NOTRAP("\r\n") | |
640 | ||
641 | HV_PRINT_NOTRAP(" trap state:\r\n"); | |
642 | set STRAND_FAIL_TRAPSTATE, %l1 | |
643 | add %l0, %l1, %l1 | |
644 | rdpr %tl, %l2 | |
645 | mov 1, %l3 | |
646 | 1: | |
647 | HV_PRINT_NOTRAP(" tl: "); | |
648 | mov %l3, %g1 | |
649 | HV_PRINTX_NOTRAP(%g1) | |
650 | ||
651 | HV_PRINT_NOTRAP(" tt: "); | |
652 | ldx [%l1 + TRAPSTATE_TT], %g1 | |
653 | HV_PRINTX_NOTRAP(%g1) | |
654 | ||
655 | HV_PRINT_NOTRAP(" htstate: "); | |
656 | ldx [%l1 + TRAPSTATE_HTSTATE], %g1 | |
657 | HV_PRINTX_NOTRAP(%g1) | |
658 | ||
659 | HV_PRINT_NOTRAP(" tstate: "); | |
660 | ldx [%l1 + TRAPSTATE_TSTATE], %g1 | |
661 | HV_PRINTX_NOTRAP(%g1) | |
662 | ||
663 | HV_PRINT_NOTRAP("\r\n tpc: "); | |
664 | ldx [%l1 + TRAPSTATE_TPC], %g1 | |
665 | HV_PRINTX_NOTRAP(%g1) | |
666 | ||
667 | HV_PRINT_NOTRAP(" tnpc: "); | |
668 | ldx [%l1 + TRAPSTATE_TNPC], %g1 | |
669 | HV_PRINTX_NOTRAP(%g1) | |
670 | HV_PRINT_NOTRAP("\r\n"); | |
671 | inc %l3 | |
672 | cmp %l3, %l2 | |
673 | bleu,pt %xcc, 1b | |
674 | inc TRAPSTATE_SIZE, %l1 | |
675 | ||
676 | HV_PRINT_NOTRAP(" trap globals:\r\n"); | |
677 | set STRAND_FAIL_TRAPGLOBALS, %l1 | |
678 | add %l0, %l1, %l1 | |
679 | rdpr %gl, %l2 | |
680 | mov 0, %l3 | |
681 | 1: | |
682 | HV_PRINT_NOTRAP(" gl: "); | |
683 | HV_PRINTX_NOTRAP(%l3) | |
684 | ||
685 | HV_PRINT_NOTRAP("\r\n"); | |
686 | HV_PRINT_NOTRAP(" %g0-%g3: "); | |
687 | ldx [%l1 + 0x00], %g1 | |
688 | HV_PRINTX_NOTRAP(%g1) | |
689 | HV_PRINT_NOTRAP(" "); | |
690 | ldx [%l1 + 0x08], %g1 | |
691 | HV_PRINTX_NOTRAP(%g1) | |
692 | HV_PRINT_NOTRAP(" "); | |
693 | ldx [%l1 + 0x10], %g1 | |
694 | HV_PRINTX_NOTRAP(%g1) | |
695 | HV_PRINT_NOTRAP(" "); | |
696 | ldx [%l1 + 0x18], %g1 | |
697 | HV_PRINTX_NOTRAP(%g1) | |
698 | HV_PRINT_NOTRAP("\r\n"); | |
699 | HV_PRINT_NOTRAP(" %g4-%g7: "); | |
700 | ldx [%l1 + 0x20], %g1 | |
701 | HV_PRINTX_NOTRAP(%g1) | |
702 | HV_PRINT_NOTRAP(" "); | |
703 | ldx [%l1 + 0x28], %g1 | |
704 | HV_PRINTX_NOTRAP(%g1) | |
705 | HV_PRINT_NOTRAP(" "); | |
706 | ldx [%l1 + 0x30], %g1 | |
707 | HV_PRINTX_NOTRAP(%g1) | |
708 | HV_PRINT_NOTRAP(" "); | |
709 | ldx [%l1 + 0x38], %g1 | |
710 | HV_PRINTX_NOTRAP(%g1) | |
711 | HV_PRINT_NOTRAP("\r\n"); | |
712 | inc %l3 | |
713 | cmp %l3, %l2 | |
714 | blu,pt %xcc, 1b | |
715 | inc TRAPGLOBALS_SIZE, %l1 | |
716 | ||
717 | HV_PRINT_NOTRAP("\r\n current window:\r\n"); | |
718 | HV_PRINT_NOTRAP(" %o0-%o3: "); | |
719 | mov %o0, %g1 | |
720 | HV_PRINTX_NOTRAP(%g1) | |
721 | HV_PRINT_NOTRAP(" "); | |
722 | mov %o1, %g1 | |
723 | HV_PRINTX_NOTRAP(%g1) | |
724 | HV_PRINT_NOTRAP(" "); | |
725 | mov %o2, %g1 | |
726 | HV_PRINTX_NOTRAP(%g1) | |
727 | HV_PRINT_NOTRAP(" "); | |
728 | mov %o3, %g1 | |
729 | HV_PRINTX_NOTRAP(%g1) | |
730 | HV_PRINT_NOTRAP("\r\n"); | |
731 | HV_PRINT_NOTRAP(" %o4-%o7: "); | |
732 | mov %o4, %g1 | |
733 | HV_PRINTX_NOTRAP(%g1) | |
734 | HV_PRINT_NOTRAP(" "); | |
735 | mov %o5, %g1 | |
736 | HV_PRINTX_NOTRAP(%g1) | |
737 | HV_PRINT_NOTRAP(" "); | |
738 | mov %o6, %g1 | |
739 | HV_PRINTX_NOTRAP(%g1) | |
740 | HV_PRINT_NOTRAP(" "); | |
741 | mov %o7, %g1 | |
742 | HV_PRINTX_NOTRAP(%g1) | |
743 | HV_PRINT_NOTRAP("\r\n"); | |
744 | ||
745 | HV_PRINT_NOTRAP("rtba: ") | |
746 | VCPU_STRUCT(%g1) | |
747 | ldx [%g1 + CPU_RTBA], %g1 | |
748 | HV_PRINTX_NOTRAP(%g1) | |
749 | HV_PRINT_NOTRAP("\r\n"); | |
750 | ||
751 | DEBUG_SPINLOCK_EXIT(%g1) | |
752 | ||
753 | ! Restore saved locals | |
754 | ldx [%l0 + STRAND_SCR3], %l3 | |
755 | ldx [%l0 + STRAND_SCR2], %l2 | |
756 | ldx [%l0 + STRAND_SCR1], %l1 | |
757 | ldx [%l0 + STRAND_SCR0], %l0 | |
758 | #endif /* } DEBUG_LEGION */ | |
759 | ||
760 | ! Disable MMU | |
761 | ldxa [%g0]ASI_LSUCR, %g1 | |
762 | set (LSUCR_DM | LSUCR_IM), %g2 | |
763 | andn %g1, %g2, %g1 ! disable MMU | |
764 | stxa %g1, [%g0]ASI_LSUCR | |
765 | ||
766 | ! Get real-mode trap table base address | |
767 | VCPU_STRUCT(%g3) | |
768 | ldx [%g3 + CPU_RTBA], %g3 | |
769 | add %g3, (TT_WDR << TT_OFFSET_SHIFT), %g3 | |
770 | ||
771 | ! cache TT, TSTATE for when TL is changed | |
772 | rdpr %tt, %g5 | |
773 | rdpr %tstate, %g6 | |
774 | ||
775 | /* | |
776 | * We will enter the guests WDR handler at MAXPTL | |
777 | */ | |
778 | wrpr %g0, MAXPTL, %tl | |
779 | ||
780 | ! reset TT, TSTATE for TL = MAXPTL | |
781 | wrpr %g5, %tt | |
782 | wrpr %g6, %tstate | |
783 | ||
784 | mov %g3, %o0 ! clobbering %o0, can't use a global as GL changes | |
785 | wrpr %g0, MAXPGL, %gl | |
786 | ||
787 | ! %o0 Guest WDR PC | |
788 | TRAP_GUEST(%o0, %g1, %g2) | |
789 | ||
790 | /*NOTREACHED*/ | |
791 | SET_SIZE(watchdog_guest) | |
792 | ||
793 | ||
794 | ! ttrace_generic | |
795 | ! General purpose trap trace routine. | |
796 | ! | |
797 | ! Records state. (See traptrace.h for details.) | |
798 | ! Variable Fields: | |
799 | ! All fields are zeroed. | |
800 | ! | |
801 | ! Expects: %g7 to contain PC of trap table entry | |
802 | ! | |
803 | ENTRY_NP(ttrace_generic) | |
804 | TTRACE_PTR(%g1, %g2, 1f, 1f) | |
805 | TTRACE_STATE(%g2, TTRACE_TYPE_HV, %g3, %g4) | |
806 | sth %g0, [%g2 + TTRACE_ENTRY_TAG] | |
807 | stx %g0, [%g2 + TTRACE_ENTRY_F1] | |
808 | stx %g0, [%g2 + TTRACE_ENTRY_F2] | |
809 | stx %g0, [%g2 + TTRACE_ENTRY_F3] | |
810 | stx %g0, [%g2 + TTRACE_ENTRY_F4] | |
811 | TTRACE_NEXT(%g2, %g3, %g4, %g5) | |
812 | 1: TTRACE_EXIT(%g7, %g1) | |
813 | SET_SIZE(ttrace_generic) | |
814 | ||
815 | ! ttrace_dmmu | |
816 | ! Traces data mmu exceptions. | |
817 | ! | |
818 | ! Records state. (See traptrace.h for details.) | |
819 | ! Variable Fields: | |
820 | ! F1 = DMMU SFSR | |
821 | ! | |
822 | ! Expects: %g7 to contain PC of trap table entry | |
823 | ! | |
824 | ENTRY_NP(ttrace_dmmu) | |
825 | TTRACE_PTR(%g1, %g2, 1f, 1f) | |
826 | TTRACE_STATE(%g2, TTRACE_TYPE_HV, %g3, %g4) | |
827 | sth %g0, [%g2 + TTRACE_ENTRY_TAG] | |
828 | mov MMU_SFSR, %g4 | |
829 | ldxa [%g4]ASI_DMMU, %g4 | |
830 | stx %g4, [%g2 + TTRACE_ENTRY_F1] | |
831 | stx %g0, [%g2 + TTRACE_ENTRY_F2] | |
832 | stx %g0, [%g2 + TTRACE_ENTRY_F3] | |
833 | stx %g0, [%g2 + TTRACE_ENTRY_F4] | |
834 | TTRACE_NEXT(%g2, %g3, %g4, %g5) | |
835 | 1: TTRACE_EXIT(%g7, %g1) | |
836 | SET_SIZE(ttrace_dmmu) | |
837 | ||
838 | ! ttrace_hcall | |
839 | ! Traces hypervisor call traps. | |
840 | ! | |
841 | ! Records state. (See traptrace.h for details.) | |
842 | ! Variable Fields: | |
843 | ! TAG = %o5, Hypervisor Call Number | |
844 | ! F1 = %o0, Argument 0 | |
845 | ! F2 = %o1, Argument 1 | |
846 | ! F3 = %o2, Argument 2 | |
847 | ! F4 = %o3, Argument 3 | |
848 | ! | |
849 | ! Expects: %g7 to contain PC of trap table entry | |
850 | ! | |
851 | ENTRY_NP(ttrace_hcall) | |
852 | TTRACE_PTR(%g1, %g2, 1f, 1f) | |
853 | TTRACE_STATE(%g2, TTRACE_TYPE_HV, %g3, %g4) | |
854 | sth %o5, [%g2 + TTRACE_ENTRY_TAG] | |
855 | stx %o0, [%g2 + TTRACE_ENTRY_F1] | |
856 | stx %o1, [%g2 + TTRACE_ENTRY_F2] | |
857 | stx %o2, [%g2 + TTRACE_ENTRY_F3] | |
858 | stx %o3, [%g2 + TTRACE_ENTRY_F4] | |
859 | TTRACE_NEXT(%g2, %g3, %g4, %g5) | |
860 | 1: TTRACE_EXIT(%g7, %g1) | |
861 | SET_SIZE(ttrace_hcall) | |
862 | ||
863 | ! ttrace_mmu_map | |
864 | ! Traces mmu map traps. | |
865 | ! | |
866 | ! Records state. (See traptrace.h for details.) | |
867 | ! Variable Fields: | |
868 | ! F1 = vaddr | |
869 | ! F2 = ctx | |
870 | ! F3 = TTE | |
871 | ! F4 = flags | |
872 | ! | |
873 | ! Expects: %g7 to contain PC of trap table entry | |
874 | ! | |
875 | ENTRY_NP(ttrace_mmu_map) | |
876 | TTRACE_PTR(%g1, %g2, 1f, 1f) | |
877 | TTRACE_STATE(%g2, TTRACE_TYPE_HV, %g3, %g4) | |
878 | sth %g0, [%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_mmu_map) | |
886 | ||
887 | ! ttrace_mmu_unmap | |
888 | ! Traces MMU Unmap traps. | |
889 | ! | |
890 | ! Records state. (See traptrace.h for details.) | |
891 | ! Variable Fields: | |
892 | ! F1 = vaddr | |
893 | ! F2 = ctx | |
894 | ! F3 = flags | |
895 | ! | |
896 | ! Expects: %g7 to contain PC of trap table entry | |
897 | ! | |
898 | ENTRY_NP(ttrace_mmu_unmap) | |
899 | TTRACE_PTR(%g1, %g2, 1f, 1f) | |
900 | TTRACE_STATE(%g2, TTRACE_TYPE_HV, %g3, %g4) | |
901 | sth %g0, [%g2 + TTRACE_ENTRY_TAG] | |
902 | stx %o0, [%g2 + TTRACE_ENTRY_F1] | |
903 | stx %o1, [%g2 + TTRACE_ENTRY_F2] | |
904 | stx %o2, [%g2 + TTRACE_ENTRY_F3] | |
905 | stx %g0, [%g2 + TTRACE_ENTRY_F4] | |
906 | TTRACE_NEXT(%g2, %g3, %g4, %g5) | |
907 | 1: TTRACE_EXIT(%g7, %g1) | |
908 | SET_SIZE(ttrace_mmu_unmap) |