xref: /titanic_50/usr/src/uts/intel/ia32/ml/exception.s (revision 753a6d457b330b1b29b2d3eefcd0831116ce950d)
1/*
2 * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
3 * Use is subject to license terms.
4 */
5
6/*
7 * Copyright (c) 1989, 1990 William F. Jolitz.
8 * Copyright (c) 1990 The Regents of the University of California.
9 * All rights reserved.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * 1. Redistributions of source code must retain the above copyright
15 *    notice, this list of conditions and the following disclaimer.
16 * 2. Redistributions in binary form must reproduce the above copyright
17 *    notice, this list of conditions and the following disclaimer in the
18 *    documentation and/or other materials provided with the distribution.
19 * 3. All advertising materials mentioning features or use of this software
20 *    must display the following acknowledgement:
21 *	This product includes software developed by the University of
22 *	California, Berkeley and its contributors.
23 * 4. Neither the name of the University nor the names of its contributors
24 *    may be used to endorse or promote products derived from this software
25 *    without specific prior written permission.
26 *
27 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
28 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
29 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
30 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
31 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
32 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
33 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
34 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
35 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
36 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
37 * SUCH DAMAGE.
38 *
39 * $FreeBSD: src/sys/amd64/amd64/exception.S,v 1.113 2003/10/15 02:04:52 peter Exp $
40 */
41
42#pragma ident	"%Z%%M%	%I%	%E% SMI"
43
44#include <sys/asm_linkage.h>
45#include <sys/asm_misc.h>
46#include <sys/trap.h>
47#include <sys/psw.h>
48#include <sys/regset.h>
49#include <sys/privregs.h>
50#include <sys/dtrace.h>
51#include <sys/x86_archext.h>
52#include <sys/traptrace.h>
53#include <sys/machparam.h>
54
55/*
56 * only one routine in this file is interesting to lint
57 */
58
59#if defined(__lint)
60
61void
62ndptrap_frstor(void)
63{}
64
65#else
66
67#include "assym.h"
68
69/*
70 * push $0 on stack for traps that do not
71 * generate an error code. This is so the rest
72 * of the kernel can expect a consistent stack
73 * from from any exception.
74 *
75 * Note that for all exceptions for amd64
76 * %r11 and %rcx are on the stack. Just pop
77 * them back into their appropriate registers and let
78 * it get saved as is running native.
79 */
80
81#if defined(__xpv) && defined(__amd64)
82
83#define	NPTRAP_NOERR(trapno)	\
84	pushq	$0;		\
85	pushq	$trapno
86
87#define	TRAP_NOERR(trapno)	\
88	XPV_TRAP_POP;		\
89	NPTRAP_NOERR(trapno)
90
91/*
92 * error code already pushed by hw
93 * onto stack.
94 */
95#define	TRAP_ERR(trapno)	\
96	XPV_TRAP_POP;		\
97	pushq	$trapno
98
99#else /* __xpv && __amd64 */
100
101#define	TRAP_NOERR(trapno)	\
102	push	$0;		\
103	push	$trapno
104
105#define	NPTRAP_NOERR(trapno) TRAP_NOERR(trapno)
106
107/*
108 * error code already pushed by hw
109 * onto stack.
110 */
111#define	TRAP_ERR(trapno)	\
112	push	$trapno
113
114#endif	/* __xpv && __amd64 */
115
116
117	/*
118	 * #DE
119	 */
120	ENTRY_NP(div0trap)
121	TRAP_NOERR(T_ZERODIV)	/* $0 */
122	jmp	cmntrap
123	SET_SIZE(div0trap)
124
125	/*
126	 * #DB
127	 *
128	 * Fetch %dr6 and clear it, handing off the value to the
129	 * cmntrap code in %r15/%esi
130	 */
131	ENTRY_NP(dbgtrap)
132	TRAP_NOERR(T_SGLSTP)	/* $1 */
133
134#if defined(__amd64)
135#if !defined(__xpv)		/* no sysenter support yet */
136	/*
137	 * If we get here as a result of single-stepping a sysenter
138	 * instruction, we suddenly find ourselves taking a #db
139	 * in kernel mode -before- we've swapgs'ed.  So before we can
140	 * take the trap, we do the swapgs here, and fix the return
141	 * %rip in trap() so that we return immediately after the
142	 * swapgs in the sysenter handler to avoid doing the swapgs again.
143	 *
144	 * Nobody said that the design of sysenter was particularly
145	 * elegant, did they?
146	 */
147
148	pushq	%r11
149
150	/*
151	 * At this point the stack looks like this:
152	 *
153	 * (high address) 	r_ss
154	 *			r_rsp
155	 *			r_rfl
156	 *			r_cs
157	 *			r_rip		<-- %rsp + 24
158	 *			r_err		<-- %rsp + 16
159	 *			r_trapno	<-- %rsp + 8
160	 * (low address)	%r11		<-- %rsp
161	 */
162	leaq	sys_sysenter(%rip), %r11
163	cmpq	%r11, 24(%rsp)	/* Compare to saved r_rip on the stack */
164	jne	1f
165	SWAPGS
1661:	popq	%r11
167#endif	/* !__xpv */
168
169	INTR_PUSH
170#if defined(__xpv)
171	movl	$6, %edi
172	call	kdi_dreg_get
173	movq	%rax, %r15		/* %db6 -> %r15 */
174	movl	$6, %edi
175	movl	$0, %esi
176	call	kdi_dreg_set		/* 0 -> %db6 */
177#else
178	movq	%db6, %r15
179	xorl	%eax, %eax
180	movq	%rax, %db6
181#endif
182
183#elif defined(__i386)
184
185	INTR_PUSH
186#if defined(__xpv)
187	pushl	$6
188	call	kdi_dreg_get
189	addl	$4, %esp
190	movl	%eax, %esi		/* %dr6 -> %esi */
191	pushl	$0
192	pushl	$6
193	call	kdi_dreg_set		/* 0 -> %dr6 */
194	addl	$8, %esp
195#else
196	movl	%db6, %esi
197	xorl	%eax, %eax
198	movl	%eax, %db6
199#endif
200#endif	/* __i386 */
201
202	jmp	cmntrap_pushed
203	SET_SIZE(dbgtrap)
204
205#if defined(__amd64)
206#if !defined(__xpv)
207
208/*
209 * Macro to set the gsbase or kgsbase to the address of the struct cpu
210 * for this processor.  If we came from userland, set kgsbase else
211 * set gsbase.  We find the proper cpu struct by looping through
212 * the cpu structs for all processors till we find a match for the gdt
213 * of the trapping processor.  The stack is expected to be pointing at
214 * the standard regs pushed by hardware on a trap (plus error code and trapno).
215 */
216#define	SET_CPU_GSBASE							\
217	subq	$REGOFF_TRAPNO, %rsp;	/* save regs */			\
218	movq	%rax, REGOFF_RAX(%rsp);					\
219	movq	%rbx, REGOFF_RBX(%rsp);					\
220	movq	%rcx, REGOFF_RCX(%rsp);					\
221	movq	%rdx, REGOFF_RDX(%rsp);					\
222	movq	%rbp, REGOFF_RBP(%rsp);					\
223	movq	%rsp, %rbp;						\
224	subq	$16, %rsp;		/* space for gdt */		\
225	sgdt	6(%rsp);						\
226	movq	8(%rsp), %rcx;		/* %rcx has gdt to match */	\
227	xorl	%ebx, %ebx;		/* loop index */		\
228	leaq	cpu(%rip), %rdx;	/* cpu pointer array */		\
2291:									\
230	movq	(%rdx, %rbx, CLONGSIZE), %rax;	/* get cpu[i] */	\
231	cmpq	$0x0, %rax;		/* cpu[i] == NULL ? */		\
232	je	2f;			/* yes, continue */		\
233	cmpq	%rcx, CPU_GDT(%rax);	/* gdt == cpu[i]->cpu_gdt ? */	\
234	je	3f;			/* yes, go set gsbase */	\
2352:									\
236	incl	%ebx;			/* i++ */			\
237	cmpl	$NCPU, %ebx;		/* i < NCPU ? */		\
238	jb	1b;			/* yes, loop */			\
239/* XXX BIG trouble if we fall thru here.  We didn't find a gdt match */	\
2403:									\
241	movl	$MSR_AMD_KGSBASE, %ecx;					\
242	cmpw	$KCS_SEL, REGOFF_CS(%rbp); /* trap from kernel? */	\
243	jne	4f;			/* no, go set KGSBASE */	\
244	movl	$MSR_AMD_GSBASE, %ecx;	/* yes, set GSBASE */		\
245        mfence;				/* OPTERON_ERRATUM_88 */	\
2464:									\
247	movq	%rax, %rdx;		/* write base register */	\
248	shrq	$32, %rdx;						\
249	wrmsr;								\
250	movq	REGOFF_RDX(%rbp), %rdx;	/* restore regs */		\
251	movq	REGOFF_RCX(%rbp), %rcx;					\
252	movq	REGOFF_RBX(%rbp), %rbx;					\
253	movq	REGOFF_RAX(%rbp), %rax;					\
254	movq	%rbp, %rsp;						\
255	movq	REGOFF_RBP(%rsp), %rbp;					\
256	addq	$REGOFF_TRAPNO, %rsp	/* pop stack */
257
258#else	/* __xpv */
259
260#define	SET_CPU_GSBASE	/* noop on the hypervisor */
261
262#endif	/* __xpv */
263#endif	/* __amd64 */
264
265
266#if defined(__amd64)
267
268	/*
269	 * #NMI
270	 *
271	 * XXPV: See 6532669.
272	 */
273	ENTRY_NP(nmiint)
274	TRAP_NOERR(T_NMIFLT)	/* $2 */
275
276	SET_CPU_GSBASE
277
278	/*
279	 * Save all registers and setup segment registers
280	 * with kernel selectors.
281	 */
282	INTR_PUSH
283	INTGATE_INIT_KERNEL_FLAGS
284
285	TRACE_PTR(%r12, %rax, %eax, %rdx, $TT_TRAP)
286	TRACE_REGS(%r12, %rsp, %rax, %rbx)
287	TRACE_STAMP(%r12)
288
289	movq	%rsp, %rbp
290
291	movq	%rbp, %rdi
292	call	av_dispatch_nmivect
293
294	INTR_POP
295	IRET
296	/*NOTREACHED*/
297	SET_SIZE(nmiint)
298
299#elif defined(__i386)
300
301	/*
302	 * #NMI
303	 */
304	ENTRY_NP(nmiint)
305	TRAP_NOERR(T_NMIFLT)	/* $2 */
306
307	/*
308	 * Save all registers and setup segment registers
309	 * with kernel selectors.
310	 */
311	INTR_PUSH
312	INTGATE_INIT_KERNEL_FLAGS
313
314	TRACE_PTR(%edi, %ebx, %ebx, %ecx, $TT_TRAP)
315	TRACE_REGS(%edi, %esp, %ebx, %ecx)
316	TRACE_STAMP(%edi)
317
318	movl	%esp, %ebp
319
320	pushl	%ebp
321	call	av_dispatch_nmivect
322	addl	$4, %esp
323
324	INTR_POP_USER
325	IRET
326	SET_SIZE(nmiint)
327
328#endif	/* __i386 */
329
330	/*
331	 * #BP
332	 */
333	ENTRY_NP(brktrap)
334
335#if defined(__amd64)
336	XPV_TRAP_POP
337	cmpw	$KCS_SEL, 8(%rsp)
338	jne	bp_user
339
340	/*
341	 * This is a breakpoint in the kernel -- it is very likely that this
342	 * is DTrace-induced.  To unify DTrace handling, we spoof this as an
343	 * invalid opcode (#UD) fault.  Note that #BP is a trap, not a fault --
344	 * we must decrement the trapping %rip to make it appear as a fault.
345	 * We then push a non-zero error code to indicate that this is coming
346	 * from #BP.
347	 */
348	decq	(%rsp)
349	push	$1			/* error code -- non-zero for #BP */
350	jmp	ud_kernel
351
352bp_user:
353#endif /* __amd64 */
354
355	NPTRAP_NOERR(T_BPTFLT)	/* $3 */
356	jmp	dtrace_trap
357
358	SET_SIZE(brktrap)
359
360	/*
361	 * #OF
362	 */
363	ENTRY_NP(ovflotrap)
364	TRAP_NOERR(T_OVFLW)	/* $4 */
365	jmp	cmntrap
366	SET_SIZE(ovflotrap)
367
368	/*
369	 * #BR
370	 */
371	ENTRY_NP(boundstrap)
372	TRAP_NOERR(T_BOUNDFLT)	/* $5 */
373	jmp	cmntrap
374	SET_SIZE(boundstrap)
375
376#if defined(__amd64)
377
378	ENTRY_NP(invoptrap)
379
380	XPV_TRAP_POP
381
382	cmpw	$KCS_SEL, 8(%rsp)
383	jne	ud_user
384
385#if defined(__xpv)
386	movb	$0, 12(%rsp)		/* clear saved upcall_mask from %cs */
387#endif
388	push	$0			/* error code -- zero for #UD */
389ud_kernel:
390	push	$0xdddd			/* a dummy trap number */
391	INTR_PUSH
392	movq	REGOFF_RIP(%rsp), %rdi
393	movq	REGOFF_RSP(%rsp), %rsi
394	movq	REGOFF_RAX(%rsp), %rdx
395	pushq	(%rsi)
396	movq	%rsp, %rsi
397	call	dtrace_invop
398	ALTENTRY(dtrace_invop_callsite)
399	addq	$8, %rsp
400	cmpl	$DTRACE_INVOP_PUSHL_EBP, %eax
401	je	ud_push
402	cmpl	$DTRACE_INVOP_LEAVE, %eax
403	je	ud_leave
404	cmpl	$DTRACE_INVOP_NOP, %eax
405	je	ud_nop
406	cmpl	$DTRACE_INVOP_RET, %eax
407	je	ud_ret
408	jmp	ud_trap
409
410ud_push:
411	/*
412	 * We must emulate a "pushq %rbp".  To do this, we pull the stack
413	 * down 8 bytes, and then store the base pointer.
414	 */
415	INTR_POP
416	subq	$16, %rsp		/* make room for %rbp */
417	pushq	%rax			/* push temp */
418	movq	24(%rsp), %rax		/* load calling RIP */
419	addq	$1, %rax		/* increment over trapping instr */
420	movq	%rax, 8(%rsp)		/* store calling RIP */
421	movq	32(%rsp), %rax		/* load calling CS */
422	movq	%rax, 16(%rsp)		/* store calling CS */
423	movq	40(%rsp), %rax		/* load calling RFLAGS */
424	movq	%rax, 24(%rsp)		/* store calling RFLAGS */
425	movq	48(%rsp), %rax		/* load calling RSP */
426	subq	$8, %rax		/* make room for %rbp */
427	movq	%rax, 32(%rsp)		/* store calling RSP */
428	movq	56(%rsp), %rax		/* load calling SS */
429	movq	%rax, 40(%rsp)		/* store calling SS */
430	movq	32(%rsp), %rax		/* reload calling RSP */
431	movq	%rbp, (%rax)		/* store %rbp there */
432	popq	%rax			/* pop off temp */
433	IRET				/* return from interrupt */
434	/*NOTREACHED*/
435
436ud_leave:
437	/*
438	 * We must emulate a "leave", which is the same as a "movq %rbp, %rsp"
439	 * followed by a "popq %rbp".  This is quite a bit simpler on amd64
440	 * than it is on i386 -- we can exploit the fact that the %rsp is
441	 * explicitly saved to effect the pop without having to reshuffle
442	 * the other data pushed for the trap.
443	 */
444	INTR_POP
445	pushq	%rax			/* push temp */
446	movq	8(%rsp), %rax		/* load calling RIP */
447	addq	$1, %rax		/* increment over trapping instr */
448	movq	%rax, 8(%rsp)		/* store calling RIP */
449	movq	(%rbp), %rax		/* get new %rbp */
450	addq	$8, %rbp		/* adjust new %rsp */
451	movq	%rbp, 32(%rsp)		/* store new %rsp */
452	movq	%rax, %rbp		/* set new %rbp */
453	popq	%rax			/* pop off temp */
454	IRET				/* return from interrupt */
455	/*NOTREACHED*/
456
457ud_nop:
458	/*
459	 * We must emulate a "nop".  This is obviously not hard:  we need only
460	 * advance the %rip by one.
461	 */
462	INTR_POP
463	incq	(%rsp)
464	IRET
465	/*NOTREACHED*/
466
467ud_ret:
468	INTR_POP
469	pushq	%rax			/* push temp */
470	movq	32(%rsp), %rax		/* load %rsp */
471	movq	(%rax), %rax		/* load calling RIP */
472	movq	%rax, 8(%rsp)		/* store calling RIP */
473	addq	$8, 32(%rsp)		/* adjust new %rsp */
474	popq	%rax			/* pop off temp */
475	IRET				/* return from interrupt */
476	/*NOTREACHED*/
477
478ud_trap:
479	/*
480	 * We're going to let the kernel handle this as a normal #UD.  If,
481	 * however, we came through #BP and are spoofing #UD (in this case,
482	 * the stored error value will be non-zero), we need to de-spoof
483	 * the trap by incrementing %rip and pushing T_BPTFLT.
484	 */
485	cmpq	$0, REGOFF_ERR(%rsp)
486	je	ud_ud
487	incq	REGOFF_RIP(%rsp)
488	addq	$REGOFF_RIP, %rsp
489	NPTRAP_NOERR(T_BPTFLT)	/* $3 */
490	jmp	cmntrap
491
492ud_ud:
493	addq	$REGOFF_RIP, %rsp
494ud_user:
495	NPTRAP_NOERR(T_ILLINST)
496	jmp	cmntrap
497	SET_SIZE(invoptrap)
498
499#elif defined(__i386)
500
501	/*
502	 * #UD
503	 */
504	ENTRY_NP(invoptrap)
505	/*
506	 * If we are taking an invalid opcode trap while in the kernel, this
507	 * is likely an FBT probe point.
508	 */
509	pushl   %gs
510	cmpw	$KGS_SEL, (%esp)
511	jne	8f
512
513	addl	$4, %esp
514#if defined(__xpv)
515	movb	$0, 6(%esp)		/* clear saved upcall_mask from %cs */
516#endif	/* __xpv */
517	pusha
518	pushl	%eax			/* push %eax -- may be return value */
519	pushl	%esp			/* push stack pointer */
520	addl	$48, (%esp)		/* adjust to incoming args */
521	pushl	40(%esp)		/* push calling EIP */
522	call	dtrace_invop
523	ALTENTRY(dtrace_invop_callsite)
524	addl	$12, %esp
525	cmpl	$DTRACE_INVOP_PUSHL_EBP, %eax
526	je	1f
527	cmpl	$DTRACE_INVOP_POPL_EBP, %eax
528	je	2f
529	cmpl	$DTRACE_INVOP_LEAVE, %eax
530	je	3f
531	cmpl	$DTRACE_INVOP_NOP, %eax
532	je	4f
533	jmp	7f
5341:
535	/*
536	 * We must emulate a "pushl %ebp".  To do this, we pull the stack
537	 * down 4 bytes, and then store the base pointer.
538	 */
539	popa
540	subl	$4, %esp		/* make room for %ebp */
541	pushl	%eax			/* push temp */
542	movl	8(%esp), %eax		/* load calling EIP */
543	incl	%eax			/* increment over LOCK prefix */
544	movl	%eax, 4(%esp)		/* store calling EIP */
545	movl	12(%esp), %eax		/* load calling CS */
546	movl	%eax, 8(%esp)		/* store calling CS */
547	movl	16(%esp), %eax		/* load calling EFLAGS */
548	movl	%eax, 12(%esp)		/* store calling EFLAGS */
549	movl	%ebp, 16(%esp)		/* push %ebp */
550	popl	%eax			/* pop off temp */
551	jmp	_emul_done
5522:
553	/*
554	 * We must emulate a "popl %ebp".  To do this, we do the opposite of
555	 * the above:  we remove the %ebp from the stack, and squeeze up the
556	 * saved state from the trap.
557	 */
558	popa
559	pushl	%eax			/* push temp */
560	movl	16(%esp), %ebp		/* pop %ebp */
561	movl	12(%esp), %eax		/* load calling EFLAGS */
562	movl	%eax, 16(%esp)		/* store calling EFLAGS */
563	movl	8(%esp), %eax		/* load calling CS */
564	movl	%eax, 12(%esp)		/* store calling CS */
565	movl	4(%esp), %eax		/* load calling EIP */
566	incl	%eax			/* increment over LOCK prefix */
567	movl	%eax, 8(%esp)		/* store calling EIP */
568	popl	%eax			/* pop off temp */
569	addl	$4, %esp		/* adjust stack pointer */
570	jmp	_emul_done
5713:
572	/*
573	 * We must emulate a "leave", which is the same as a "movl %ebp, %esp"
574	 * followed by a "popl %ebp".  This looks similar to the above, but
575	 * requires two temporaries:  one for the new base pointer, and one
576	 * for the staging register.
577	 */
578	popa
579	pushl	%eax			/* push temp */
580	pushl	%ebx			/* push temp */
581	movl	%ebp, %ebx		/* set temp to old %ebp */
582	movl	(%ebx), %ebp		/* pop %ebp */
583	movl	16(%esp), %eax		/* load calling EFLAGS */
584	movl	%eax, (%ebx)		/* store calling EFLAGS */
585	movl	12(%esp), %eax		/* load calling CS */
586	movl	%eax, -4(%ebx)		/* store calling CS */
587	movl	8(%esp), %eax		/* load calling EIP */
588	incl	%eax			/* increment over LOCK prefix */
589	movl	%eax, -8(%ebx)		/* store calling EIP */
590	movl	%ebx, -4(%esp)		/* temporarily store new %esp */
591	popl	%ebx			/* pop off temp */
592	popl	%eax			/* pop off temp */
593	movl	-12(%esp), %esp		/* set stack pointer */
594	subl	$8, %esp		/* adjust for three pushes, one pop */
595	jmp	_emul_done
5964:
597	/*
598	 * We must emulate a "nop".  This is obviously not hard:  we need only
599	 * advance the %eip by one.
600	 */
601	popa
602	incl	(%esp)
603_emul_done:
604	IRET				/* return from interrupt */
6057:
606	popa
607	pushl	$0
608	pushl	$T_ILLINST	/* $6 */
609	jmp	cmntrap
6108:
611	addl	$4, %esp
612	pushl	$0
613	pushl	$T_ILLINST	/* $6 */
614	jmp	cmntrap
615	SET_SIZE(invoptrap)
616
617#endif	/* __i386 */
618
619#if defined(__amd64)
620
621	/*
622	 * #NM
623	 */
624#if defined(__xpv)
625
626	ENTRY_NP(ndptrap)
627	/*
628	 * (On the hypervisor we must make a hypercall so we might as well
629	 * save everything and handle as in a normal trap.)
630	 */
631	TRAP_NOERR(T_NOEXTFLT)	/* $7 */
632	INTR_PUSH
633
634	/*
635	 * We want to do this quickly as every lwp using fp will take this
636	 * after a context switch -- we do the frequent path in ndptrap_frstor
637	 * below; for all other cases, we let the trap code handle it
638	 */
639	LOADCPU(%rbx)			/* swapgs handled in hypervisor */
640	cmpl	$0, fpu_exists(%rip)
641	je	.handle_in_trap		/* let trap handle no fp case */
642	movq	CPU_THREAD(%rbx), %r15	/* %r15 = curthread */
643	movl	$FPU_EN, %ebx
644	movq	T_LWP(%r15), %r15	/* %r15 = lwp */
645	testq	%r15, %r15
646	jz	.handle_in_trap		/* should not happen? */
647#if LWP_PCB_FPU	!= 0
648	addq	$LWP_PCB_FPU, %r15	/* &lwp->lwp_pcb.pcb_fpu */
649#endif
650	testl	%ebx, PCB_FPU_FLAGS(%r15)
651	jz	.handle_in_trap		/* must be the first fault */
652	CLTS
653	andl	$_BITNOT(FPU_VALID), PCB_FPU_FLAGS(%r15)
654#if FPU_CTX_FPU_REGS != 0
655	addq	$FPU_CTX_FPU_REGS, %r15
656#endif
657	/*
658	 * the label below is used in trap.c to detect FP faults in
659	 * kernel due to user fault.
660	 */
661	ALTENTRY(ndptrap_frstor)
662	FXRSTORQ	((%r15))
663	cmpw	$KCS_SEL, REGOFF_CS(%rsp)
664	je	.return_to_kernel
665
666	ASSERT_UPCALL_MASK_IS_SET
667	USER_POP
668	IRET				/* return to user mode */
669	/*NOTREACHED*/
670
671.return_to_kernel:
672	INTR_POP
673	IRET
674	/*NOTREACHED*/
675
676.handle_in_trap:
677	INTR_POP
678	pushq	$0			/* can not use TRAP_NOERR */
679	pushq	$T_NOEXTFLT
680	jmp	cmninttrap
681	SET_SIZE(ndptrap_frstor)
682	SET_SIZE(ndptrap)
683
684#else	/* __xpv */
685
686	ENTRY_NP(ndptrap)
687	/*
688	 * We want to do this quickly as every lwp using fp will take this
689	 * after a context switch -- we do the frequent path in ndptrap_frstor
690	 * below; for all other cases, we let the trap code handle it
691	 */
692	pushq	%rax
693	pushq	%rbx
694	cmpw    $KCS_SEL, 24(%rsp)	/* did we come from kernel mode? */
695	jne     1f
696	LOADCPU(%rbx)			/* if yes, don't swapgs */
697	jmp	2f
6981:
699	SWAPGS				/* if from user, need swapgs */
700	LOADCPU(%rbx)
701	SWAPGS
7022:
703	cmpl	$0, fpu_exists(%rip)
704	je	.handle_in_trap		/* let trap handle no fp case */
705	movq	CPU_THREAD(%rbx), %rax	/* %rax = curthread */
706	movl	$FPU_EN, %ebx
707	movq	T_LWP(%rax), %rax	/* %rax = lwp */
708	testq	%rax, %rax
709	jz	.handle_in_trap		/* should not happen? */
710#if LWP_PCB_FPU	!= 0
711	addq	$LWP_PCB_FPU, %rax	/* &lwp->lwp_pcb.pcb_fpu */
712#endif
713	testl	%ebx, PCB_FPU_FLAGS(%rax)
714	jz	.handle_in_trap		/* must be the first fault */
715	clts
716	andl	$_BITNOT(FPU_VALID), PCB_FPU_FLAGS(%rax)
717#if FPU_CTX_FPU_REGS != 0
718	addq	$FPU_CTX_FPU_REGS, %rax
719#endif
720	/*
721	 * the label below is used in trap.c to detect FP faults in
722	 * kernel due to user fault.
723	 */
724	ALTENTRY(ndptrap_frstor)
725	FXRSTORQ	((%rax))
726	popq	%rbx
727	popq	%rax
728	IRET
729	/*NOTREACHED*/
730
731.handle_in_trap:
732	popq	%rbx
733	popq	%rax
734	TRAP_NOERR(T_NOEXTFLT)	/* $7 */
735	jmp	cmninttrap
736	SET_SIZE(ndptrap_frstor)
737	SET_SIZE(ndptrap)
738
739#endif	/* __xpv */
740
741#elif defined(__i386)
742
743	ENTRY_NP(ndptrap)
744	/*
745	 * We want to do this quickly as every lwp using fp will take this
746	 * after a context switch -- we do the frequent path in fpnoextflt
747	 * below; for all other cases, we let the trap code handle it
748	 */
749	pushl	%eax
750	pushl	%ebx
751	pushl	%ds
752	pushl	%gs
753	movl	$KDS_SEL, %ebx
754	movw	%bx, %ds
755	movl	$KGS_SEL, %eax
756	movw	%ax, %gs
757	LOADCPU(%eax)
758	cmpl	$0, fpu_exists
759	je	.handle_in_trap		/* let trap handle no fp case */
760	movl	CPU_THREAD(%eax), %ebx	/* %ebx = curthread */
761	movl	$FPU_EN, %eax
762	movl	T_LWP(%ebx), %ebx	/* %ebx = lwp */
763	testl	%ebx, %ebx
764	jz	.handle_in_trap		/* should not happen? */
765#if LWP_PCB_FPU != 0
766	addl	$LWP_PCB_FPU, %ebx 	/* &lwp->lwp_pcb.pcb_fpu */
767#endif
768	testl	%eax, PCB_FPU_FLAGS(%ebx)
769	jz	.handle_in_trap		/* must be the first fault */
770	CLTS
771	andl	$_BITNOT(FPU_VALID), PCB_FPU_FLAGS(%ebx)
772#if FPU_CTX_FPU_REGS != 0
773	addl	$FPU_CTX_FPU_REGS, %ebx
774#endif
775	/*
776	 * the label below is used in trap.c to detect FP faults in kernel
777	 * due to user fault.
778	 */
779	ALTENTRY(ndptrap_frstor)
780	.globl	_patch_fxrstor_ebx
781_patch_fxrstor_ebx:
782	frstor	(%ebx)		/* may be patched to fxrstor */
783	nop			/* (including this byte) */
784	popl	%gs
785	popl	%ds
786	popl	%ebx
787	popl	%eax
788	IRET
789
790.handle_in_trap:
791	popl	%gs
792	popl	%ds
793	popl	%ebx
794	popl	%eax
795	TRAP_NOERR(T_NOEXTFLT)	/* $7 */
796	jmp	cmninttrap
797	SET_SIZE(ndptrap_frstor)
798	SET_SIZE(ndptrap)
799
800#endif	/* __i386 */
801
802#if !defined(__xpv)
803#if defined(__amd64)
804
805	/*
806	 * #DF
807	 */
808	ENTRY_NP(syserrtrap)
809	pushq	$T_DBLFLT
810	SET_CPU_GSBASE
811
812	/*
813	 * We share this handler with kmdb (if kmdb is loaded).  As such, we
814	 * may have reached this point after encountering a #df in kmdb.  If
815	 * that happens, we'll still be on kmdb's IDT.  We need to switch back
816	 * to this CPU's IDT before proceeding.  Furthermore, if we did arrive
817	 * here from kmdb, kmdb is probably in a very sickly state, and
818	 * shouldn't be entered from the panic flow.  We'll suppress that
819	 * entry by setting nopanicdebug.
820	 */
821	pushq	%rax
822	subq	$DESCTBR_SIZE, %rsp
823	sidt	(%rsp)
824	movq	%gs:CPU_IDT, %rax
825	cmpq	%rax, DTR_BASE(%rsp)
826	je	1f
827
828	movq	%rax, DTR_BASE(%rsp)
829	movw	$_MUL(NIDT, GATE_DESC_SIZE), DTR_LIMIT(%rsp)
830	lidt	(%rsp)
831
832	movl	$1, nopanicdebug
833
8341:	addq	$DESCTBR_SIZE, %rsp
835	popq	%rax
836
837	DFTRAP_PUSH
838
839	/*
840	 * freeze trap trace.
841	 */
842#ifdef TRAPTRACE
843	leaq	trap_trace_freeze(%rip), %r11
844	incl	(%r11)
845#endif
846
847	ENABLE_INTR_FLAGS
848
849	movq	%rsp, %rdi	/* &regs */
850	xorl	%esi, %esi	/* clear address */
851	xorl	%edx, %edx	/* cpuid = 0 */
852	call	trap
853
854	SET_SIZE(syserrtrap)
855
856#elif defined(__i386)
857
858	/*
859	 * #DF
860	 */
861	ENTRY_NP(syserrtrap)
862	cli				/* disable interrupts */
863
864	/*
865	 * We share this handler with kmdb (if kmdb is loaded).  As such, we
866	 * may have reached this point after encountering a #df in kmdb.  If
867	 * that happens, we'll still be on kmdb's IDT.  We need to switch back
868	 * to this CPU's IDT before proceeding.  Furthermore, if we did arrive
869	 * here from kmdb, kmdb is probably in a very sickly state, and
870	 * shouldn't be entered from the panic flow.  We'll suppress that
871	 * entry by setting nopanicdebug.
872	 */
873
874	subl	$DESCTBR_SIZE, %esp
875	movl	%gs:CPU_IDT, %eax
876	sidt	(%esp)
877	cmpl	DTR_BASE(%esp), %eax
878	je	1f
879
880	movl	%eax, DTR_BASE(%esp)
881	movw	$_MUL(NIDT, GATE_DESC_SIZE), DTR_LIMIT(%esp)
882	lidt	(%esp)
883
884	movl	$1, nopanicdebug
885
8861:	addl	$DESCTBR_SIZE, %esp
887
888	/*
889	 * Check the CPL in the TSS to see what mode
890	 * (user or kernel) we took the fault in.  At this
891	 * point we are running in the context of the double
892	 * fault task (dftss) but the CPU's task points to
893	 * the previous task (ktss) where the process context
894	 * has been saved as the result of the task switch.
895	 */
896	movl	%gs:CPU_TSS, %eax	/* get the TSS */
897	movl	TSS_SS(%eax), %ebx	/* save the fault SS */
898	movl	TSS_ESP(%eax), %edx	/* save the fault ESP */
899	testw	$CPL_MASK, TSS_CS(%eax)	/* user mode ? */
900	jz	make_frame
901	movw	TSS_SS0(%eax), %ss	/* get on the kernel stack */
902	movl	TSS_ESP0(%eax), %esp
903
904	/*
905	 * Clear the NT flag to avoid a task switch when the process
906	 * finally pops the EFL off the stack via an iret.  Clear
907	 * the TF flag since that is what the processor does for
908	 * a normal exception. Clear the IE flag so that interrupts
909	 * remain disabled.
910	 */
911	movl	TSS_EFL(%eax), %ecx
912	andl	$_BITNOT(PS_NT|PS_T|PS_IE), %ecx
913	pushl	%ecx
914	popfl				/* restore the EFL */
915	movw	TSS_LDT(%eax), %cx	/* restore the LDT */
916	lldt	%cx
917
918	/*
919	 * Restore process segment selectors.
920	 */
921	movw	TSS_DS(%eax), %ds
922	movw	TSS_ES(%eax), %es
923	movw	TSS_FS(%eax), %fs
924	movw	TSS_GS(%eax), %gs
925
926	/*
927	 * Restore task segment selectors.
928	 */
929	movl	$KDS_SEL, TSS_DS(%eax)
930	movl	$KDS_SEL, TSS_ES(%eax)
931	movl	$KDS_SEL, TSS_SS(%eax)
932	movl	$KFS_SEL, TSS_FS(%eax)
933	movl	$KGS_SEL, TSS_GS(%eax)
934
935	/*
936	 * Clear the TS bit, the busy bits in both task
937	 * descriptors, and switch tasks.
938	 */
939	clts
940	leal	gdt0, %ecx
941	movl	DFTSS_SEL+4(%ecx), %esi
942	andl	$_BITNOT(0x200), %esi
943	movl	%esi, DFTSS_SEL+4(%ecx)
944	movl	KTSS_SEL+4(%ecx), %esi
945	andl	$_BITNOT(0x200), %esi
946	movl	%esi, KTSS_SEL+4(%ecx)
947	movw	$KTSS_SEL, %cx
948	ltr	%cx
949
950	/*
951	 * Restore part of the process registers.
952	 */
953	movl	TSS_EBP(%eax), %ebp
954	movl	TSS_ECX(%eax), %ecx
955	movl	TSS_ESI(%eax), %esi
956	movl	TSS_EDI(%eax), %edi
957
958make_frame:
959	/*
960	 * Make a trap frame.  Leave the error code (0) on
961	 * the stack since the first word on a trap stack is
962	 * unused anyway.
963	 */
964	pushl	%ebx			/ fault SS
965	pushl	%edx			/ fault ESP
966	pushl	TSS_EFL(%eax)		/ fault EFL
967	pushl	TSS_CS(%eax)		/ fault CS
968	pushl	TSS_EIP(%eax)		/ fault EIP
969	pushl	$0			/ error code
970	pushl	$T_DBLFLT		/ trap number 8
971	movl	TSS_EBX(%eax), %ebx	/ restore EBX
972	movl	TSS_EDX(%eax), %edx	/ restore EDX
973	movl	TSS_EAX(%eax), %eax	/ restore EAX
974	sti				/ enable interrupts
975	jmp	cmntrap
976	SET_SIZE(syserrtrap)
977
978#endif	/* __i386 */
979#endif	/* !__xpv */
980
981	ENTRY_NP(overrun)
982	push	$0
983	TRAP_NOERR(T_EXTOVRFLT)	/* $9 i386 only - not generated */
984	jmp	cmninttrap
985	SET_SIZE(overrun)
986
987	/*
988	 * #TS
989	 */
990	ENTRY_NP(invtsstrap)
991	TRAP_ERR(T_TSSFLT)	/* $10 already have error code on stack */
992	jmp	cmntrap
993	SET_SIZE(invtsstrap)
994
995	/*
996	 * #NP
997	 */
998	ENTRY_NP(segnptrap)
999	TRAP_ERR(T_SEGFLT)	/* $11 already have error code on stack */
1000#if defined(__amd64)
1001	SET_CPU_GSBASE
1002#endif
1003	jmp	cmntrap
1004	SET_SIZE(segnptrap)
1005
1006	/*
1007	 * #SS
1008	 */
1009	ENTRY_NP(stktrap)
1010	TRAP_ERR(T_STKFLT)	/* $12 already have error code on stack */
1011	jmp	cmntrap
1012	SET_SIZE(stktrap)
1013
1014	/*
1015	 * #GP
1016	 */
1017	ENTRY_NP(gptrap)
1018	TRAP_ERR(T_GPFLT)	/* $13 already have error code on stack */
1019#if defined(__amd64)
1020	SET_CPU_GSBASE
1021#endif
1022	jmp	cmntrap
1023	SET_SIZE(gptrap)
1024
1025	/*
1026	 * #PF
1027	 */
1028	ENTRY_NP(pftrap)
1029	TRAP_ERR(T_PGFLT)	/* $14 already have error code on stack */
1030	INTR_PUSH
1031#if defined(__xpv)
1032
1033#if defined(__amd64)
1034	movq	%gs:CPU_VCPU_INFO, %r15
1035	movq	VCPU_INFO_ARCH_CR2(%r15), %r15	/* vcpu[].arch.cr2 */
1036#elif defined(__i386)
1037	movl	%gs:CPU_VCPU_INFO, %esi
1038	movl	VCPU_INFO_ARCH_CR2(%esi), %esi	/* vcpu[].arch.cr2 */
1039#endif	/* __i386 */
1040
1041#else	/* __xpv */
1042
1043#if defined(__amd64)
1044	movq	%cr2, %r15
1045#elif defined(__i386)
1046	movl	%cr2, %esi
1047#endif	/* __i386 */
1048
1049#endif	/* __xpv */
1050	jmp	cmntrap_pushed
1051	SET_SIZE(pftrap)
1052
1053#if !defined(__amd64)
1054
1055	.globl	idt0_default_r
1056
1057	/*
1058	 * #PF pentium bug workaround
1059	 */
1060	ENTRY_NP(pentium_pftrap)
1061	pushl	%eax
1062	movl	%cr2, %eax
1063	andl	$MMU_STD_PAGEMASK, %eax
1064
1065	cmpl	%eax, %cs:idt0_default_r+2	/* fixme */
1066
1067	je	check_for_user_address
1068user_mode:
1069	popl	%eax
1070	pushl	$T_PGFLT	/* $14 */
1071	jmp	cmntrap
1072check_for_user_address:
1073	/*
1074	 * Before we assume that we have an unmapped trap on our hands,
1075	 * check to see if this is a fault from user mode.  If it is,
1076	 * we'll kick back into the page fault handler.
1077	 */
1078	movl	4(%esp), %eax	/* error code */
1079	andl	$PF_ERR_USER, %eax
1080	jnz	user_mode
1081
1082	/*
1083	 * We now know that this is the invalid opcode trap.
1084	 */
1085	popl	%eax
1086	addl	$4, %esp	/* pop error code */
1087	jmp	invoptrap
1088	SET_SIZE(pentium_pftrap)
1089
1090#endif	/* !__amd64 */
1091
1092	ENTRY_NP(resvtrap)
1093	TRAP_NOERR(15)		/* (reserved)  */
1094	jmp	cmntrap
1095	SET_SIZE(resvtrap)
1096
1097	/*
1098	 * #MF
1099	 */
1100	ENTRY_NP(ndperr)
1101	TRAP_NOERR(T_EXTERRFLT)	/* $16 */
1102	jmp	cmninttrap
1103	SET_SIZE(ndperr)
1104
1105	/*
1106	 * #AC
1107	 */
1108	ENTRY_NP(achktrap)
1109	TRAP_ERR(T_ALIGNMENT)	/* $17 */
1110	jmp	cmntrap
1111	SET_SIZE(achktrap)
1112
1113	/*
1114	 * #MC
1115	 */
1116	.globl	cmi_mca_trap	/* see uts/i86pc/os/cmi.c */
1117
1118#if defined(__amd64)
1119
1120	ENTRY_NP(mcetrap)
1121	TRAP_NOERR(T_MCE)	/* $18 */
1122
1123	SET_CPU_GSBASE
1124
1125	INTR_PUSH
1126	INTGATE_INIT_KERNEL_FLAGS
1127
1128	TRACE_PTR(%rdi, %rbx, %ebx, %rcx, $TT_TRAP)
1129	TRACE_REGS(%rdi, %rsp, %rbx, %rcx)
1130	TRACE_STAMP(%rdi)
1131
1132	movq	%rsp, %rbp
1133
1134	movq	%rsp, %rdi	/* arg0 = struct regs *rp */
1135	call	cmi_mca_trap	/* cmi_mca_trap(rp); */
1136
1137	jmp	_sys_rtt
1138	SET_SIZE(mcetrap)
1139
1140#else
1141
1142	ENTRY_NP(mcetrap)
1143	TRAP_NOERR(T_MCE)	/* $18 */
1144
1145	INTR_PUSH
1146	INTGATE_INIT_KERNEL_FLAGS
1147
1148	TRACE_PTR(%edi, %ebx, %ebx, %ecx, $TT_TRAP)
1149	TRACE_REGS(%edi, %esp, %ebx, %ecx)
1150	TRACE_STAMP(%edi)
1151
1152	movl	%esp, %ebp
1153
1154	movl	%esp, %ecx
1155	pushl	%ecx		/* arg0 = struct regs *rp */
1156	call	cmi_mca_trap	/* cmi_mca_trap(rp) */
1157	addl	$4, %esp	/* pop arg0 */
1158
1159	jmp	_sys_rtt
1160	SET_SIZE(mcetrap)
1161
1162#endif
1163
1164	/*
1165	 * #XF
1166	 */
1167	ENTRY_NP(xmtrap)
1168	TRAP_NOERR(T_SIMDFPE)	/* $19 */
1169	jmp	cmninttrap
1170	SET_SIZE(xmtrap)
1171
1172	ENTRY_NP(invaltrap)
1173	TRAP_NOERR(30)		/* very invalid */
1174	jmp	cmntrap
1175	SET_SIZE(invaltrap)
1176
1177	ENTRY_NP(invalint)
1178	TRAP_NOERR(31)		/* even more so */
1179	jmp	cmnint
1180	SET_SIZE(invalint)
1181
1182	.globl	fasttable
1183
1184#if defined(__amd64)
1185
1186	ENTRY_NP(fasttrap)
1187	cmpl	$T_LASTFAST, %eax
1188	ja	1f
1189	orl	%eax, %eax	/* (zero extend top 32-bits) */
1190	leaq	fasttable(%rip), %r11
1191	leaq	(%r11, %rax, CLONGSIZE), %r11
1192	jmp	*(%r11)
11931:
1194	/*
1195	 * Fast syscall number was illegal.  Make it look
1196	 * as if the INT failed.  Modify %rip to point before the
1197	 * INT, push the expected error code and fake a GP fault.
1198	 *
1199	 * XXX Why make the error code be offset into idt + 1?
1200	 * Instead we should push a real (soft?) error code
1201	 * on the stack and #gp handler could know about fasttraps?
1202	 */
1203	XPV_TRAP_POP
1204
1205	subq	$2, (%rsp)	/* XXX int insn 2-bytes */
1206	pushq	$_CONST(_MUL(T_FASTTRAP, GATE_DESC_SIZE) + 2)
1207
1208#if defined(__xpv)
1209	pushq	%r11
1210	pushq	%rcx
1211#endif
1212	jmp	gptrap
1213	SET_SIZE(fasttrap)
1214
1215#elif defined(__i386)
1216
1217	ENTRY_NP(fasttrap)
1218	cmpl	$T_LASTFAST, %eax
1219	ja	1f
1220	jmp	*%cs:fasttable(, %eax, CLONGSIZE)
12211:
1222	/*
1223	 * Fast syscall number was illegal.  Make it look
1224	 * as if the INT failed.  Modify %eip to point before the
1225	 * INT, push the expected error code and fake a GP fault.
1226	 *
1227	 * XXX Why make the error code be offset into idt + 1?
1228	 * Instead we should push a real (soft?) error code
1229	 * on the stack and #gp handler could know about fasttraps?
1230	 */
1231	subl	$2, (%esp)	/* XXX int insn 2-bytes */
1232	pushl	$_CONST(_MUL(T_FASTTRAP, GATE_DESC_SIZE) + 2)
1233	jmp	gptrap
1234	SET_SIZE(fasttrap)
1235
1236#endif	/* __i386 */
1237
1238	ENTRY_NP(dtrace_ret)
1239	TRAP_NOERR(T_DTRACE_RET)
1240	jmp	dtrace_trap
1241	SET_SIZE(dtrace_ret)
1242
1243#if defined(__amd64)
1244
1245	/*
1246	 * RFLAGS 24 bytes up the stack from %rsp.
1247	 * XXX a constant would be nicer.
1248	 */
1249	ENTRY_NP(fast_null)
1250	XPV_TRAP_POP
1251	orq	$PS_C, 24(%rsp)	/* set carry bit in user flags */
1252	IRET
1253	/*NOTREACHED*/
1254	SET_SIZE(fast_null)
1255
1256#elif defined(__i386)
1257
1258	ENTRY_NP(fast_null)
1259	orw	$PS_C, 8(%esp)	/* set carry bit in user flags */
1260	IRET
1261	SET_SIZE(fast_null)
1262
1263#endif	/* __i386 */
1264
1265	/*
1266	 * Interrupts start at 32
1267	 */
1268#define MKIVCT(n)			\
1269	ENTRY_NP(ivct/**/n)		\
1270	push	$0;			\
1271	push	$n - 0x20;		\
1272	jmp	cmnint;			\
1273	SET_SIZE(ivct/**/n)
1274
1275	MKIVCT(32)
1276	MKIVCT(33)
1277	MKIVCT(34)
1278	MKIVCT(35)
1279	MKIVCT(36)
1280	MKIVCT(37)
1281	MKIVCT(38)
1282	MKIVCT(39)
1283	MKIVCT(40)
1284	MKIVCT(41)
1285	MKIVCT(42)
1286	MKIVCT(43)
1287	MKIVCT(44)
1288	MKIVCT(45)
1289	MKIVCT(46)
1290	MKIVCT(47)
1291	MKIVCT(48)
1292	MKIVCT(49)
1293	MKIVCT(50)
1294	MKIVCT(51)
1295	MKIVCT(52)
1296	MKIVCT(53)
1297	MKIVCT(54)
1298	MKIVCT(55)
1299	MKIVCT(56)
1300	MKIVCT(57)
1301	MKIVCT(58)
1302	MKIVCT(59)
1303	MKIVCT(60)
1304	MKIVCT(61)
1305	MKIVCT(62)
1306	MKIVCT(63)
1307	MKIVCT(64)
1308	MKIVCT(65)
1309	MKIVCT(66)
1310	MKIVCT(67)
1311	MKIVCT(68)
1312	MKIVCT(69)
1313	MKIVCT(70)
1314	MKIVCT(71)
1315	MKIVCT(72)
1316	MKIVCT(73)
1317	MKIVCT(74)
1318	MKIVCT(75)
1319	MKIVCT(76)
1320	MKIVCT(77)
1321	MKIVCT(78)
1322	MKIVCT(79)
1323	MKIVCT(80)
1324	MKIVCT(81)
1325	MKIVCT(82)
1326	MKIVCT(83)
1327	MKIVCT(84)
1328	MKIVCT(85)
1329	MKIVCT(86)
1330	MKIVCT(87)
1331	MKIVCT(88)
1332	MKIVCT(89)
1333	MKIVCT(90)
1334	MKIVCT(91)
1335	MKIVCT(92)
1336	MKIVCT(93)
1337	MKIVCT(94)
1338	MKIVCT(95)
1339	MKIVCT(96)
1340	MKIVCT(97)
1341	MKIVCT(98)
1342	MKIVCT(99)
1343	MKIVCT(100)
1344	MKIVCT(101)
1345	MKIVCT(102)
1346	MKIVCT(103)
1347	MKIVCT(104)
1348	MKIVCT(105)
1349	MKIVCT(106)
1350	MKIVCT(107)
1351	MKIVCT(108)
1352	MKIVCT(109)
1353	MKIVCT(110)
1354	MKIVCT(111)
1355	MKIVCT(112)
1356	MKIVCT(113)
1357	MKIVCT(114)
1358	MKIVCT(115)
1359	MKIVCT(116)
1360	MKIVCT(117)
1361	MKIVCT(118)
1362	MKIVCT(119)
1363	MKIVCT(120)
1364	MKIVCT(121)
1365	MKIVCT(122)
1366	MKIVCT(123)
1367	MKIVCT(124)
1368	MKIVCT(125)
1369	MKIVCT(126)
1370	MKIVCT(127)
1371	MKIVCT(128)
1372	MKIVCT(129)
1373	MKIVCT(130)
1374	MKIVCT(131)
1375	MKIVCT(132)
1376	MKIVCT(133)
1377	MKIVCT(134)
1378	MKIVCT(135)
1379	MKIVCT(136)
1380	MKIVCT(137)
1381	MKIVCT(138)
1382	MKIVCT(139)
1383	MKIVCT(140)
1384	MKIVCT(141)
1385	MKIVCT(142)
1386	MKIVCT(143)
1387	MKIVCT(144)
1388	MKIVCT(145)
1389	MKIVCT(146)
1390	MKIVCT(147)
1391	MKIVCT(148)
1392	MKIVCT(149)
1393	MKIVCT(150)
1394	MKIVCT(151)
1395	MKIVCT(152)
1396	MKIVCT(153)
1397	MKIVCT(154)
1398	MKIVCT(155)
1399	MKIVCT(156)
1400	MKIVCT(157)
1401	MKIVCT(158)
1402	MKIVCT(159)
1403	MKIVCT(160)
1404	MKIVCT(161)
1405	MKIVCT(162)
1406	MKIVCT(163)
1407	MKIVCT(164)
1408	MKIVCT(165)
1409	MKIVCT(166)
1410	MKIVCT(167)
1411	MKIVCT(168)
1412	MKIVCT(169)
1413	MKIVCT(170)
1414	MKIVCT(171)
1415	MKIVCT(172)
1416	MKIVCT(173)
1417	MKIVCT(174)
1418	MKIVCT(175)
1419	MKIVCT(176)
1420	MKIVCT(177)
1421	MKIVCT(178)
1422	MKIVCT(179)
1423	MKIVCT(180)
1424	MKIVCT(181)
1425	MKIVCT(182)
1426	MKIVCT(183)
1427	MKIVCT(184)
1428	MKIVCT(185)
1429	MKIVCT(186)
1430	MKIVCT(187)
1431	MKIVCT(188)
1432	MKIVCT(189)
1433	MKIVCT(190)
1434	MKIVCT(191)
1435	MKIVCT(192)
1436	MKIVCT(193)
1437	MKIVCT(194)
1438	MKIVCT(195)
1439	MKIVCT(196)
1440	MKIVCT(197)
1441	MKIVCT(198)
1442	MKIVCT(199)
1443	MKIVCT(200)
1444	MKIVCT(201)
1445	MKIVCT(202)
1446	MKIVCT(203)
1447	MKIVCT(204)
1448	MKIVCT(205)
1449	MKIVCT(206)
1450	MKIVCT(207)
1451	MKIVCT(208)
1452	MKIVCT(209)
1453	MKIVCT(210)
1454	MKIVCT(211)
1455	MKIVCT(212)
1456	MKIVCT(213)
1457	MKIVCT(214)
1458	MKIVCT(215)
1459	MKIVCT(216)
1460	MKIVCT(217)
1461	MKIVCT(218)
1462	MKIVCT(219)
1463	MKIVCT(220)
1464	MKIVCT(221)
1465	MKIVCT(222)
1466	MKIVCT(223)
1467	MKIVCT(224)
1468	MKIVCT(225)
1469	MKIVCT(226)
1470	MKIVCT(227)
1471	MKIVCT(228)
1472	MKIVCT(229)
1473	MKIVCT(230)
1474	MKIVCT(231)
1475	MKIVCT(232)
1476	MKIVCT(233)
1477	MKIVCT(234)
1478	MKIVCT(235)
1479	MKIVCT(236)
1480	MKIVCT(237)
1481	MKIVCT(238)
1482	MKIVCT(239)
1483	MKIVCT(240)
1484	MKIVCT(241)
1485	MKIVCT(242)
1486	MKIVCT(243)
1487	MKIVCT(244)
1488	MKIVCT(245)
1489	MKIVCT(246)
1490	MKIVCT(247)
1491	MKIVCT(248)
1492	MKIVCT(249)
1493	MKIVCT(250)
1494	MKIVCT(251)
1495	MKIVCT(252)
1496	MKIVCT(253)
1497	MKIVCT(254)
1498	MKIVCT(255)
1499
1500#endif	/* __lint */
1501