i386 removal, part 11/x: Remove wrong machine/ setup in the boot Makefiles.
[dragonfly.git] / sys / platform / pc32 / i386 / exception.s
1 /*-
2  * Copyright (c) 1990 The Regents of the University of California.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. All advertising materials mentioning features or use of this software
14  *    must display the following acknowledgement:
15  *      This product includes software developed by the University of
16  *      California, Berkeley and its contributors.
17  * 4. Neither the name of the University nor the names of its contributors
18  *    may be used to endorse or promote products derived from this software
19  *    without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31  * SUCH DAMAGE.
32  *
33  * $FreeBSD: src/sys/i386/i386/exception.s,v 1.65.2.3 2001/08/15 01:23:49 peter Exp $
34  */
35
36 #include "use_npx.h"
37
38 #include <machine/asmacros.h>
39 #include <machine/segments.h>
40 #include <machine/lock.h>
41 #include <machine/psl.h>
42 #include <machine/trap.h>
43
44 #include "assym.s"
45
46         .text
47
48         .globl  lwkt_switch_return
49
50 #ifdef DEBUG_INTERRUPTS
51         .globl  Xrsvdary
52
53 Xrsvdary:
54  .long  Xrsvd0
55  .long  Xrsvd1  , Xrsvd2  , Xrsvd3  , Xrsvd4  , Xrsvd5  , Xrsvd6  , Xrsvd7  , Xrsvd8
56  .long  Xrsvd9  , Xrsvd10 , Xrsvd11 , Xrsvd12 , Xrsvd13 , Xrsvd14 , Xrsvd15 , Xrsvd16
57  .long  Xrsvd17 , Xrsvd18 , Xrsvd19 , Xrsvd20 , Xrsvd21 , Xrsvd22 , Xrsvd23 , Xrsvd24
58  .long  Xrsvd25 , Xrsvd26 , Xrsvd27 , Xrsvd28 , Xrsvd29 , Xrsvd30 , Xrsvd31 , Xrsvd32
59  .long  Xrsvd33 , Xrsvd34 , Xrsvd35 , Xrsvd36 , Xrsvd37 , Xrsvd38 , Xrsvd39 , Xrsvd40
60  .long  Xrsvd41 , Xrsvd42 , Xrsvd43 , Xrsvd44 , Xrsvd45 , Xrsvd46 , Xrsvd47 , Xrsvd48
61  .long  Xrsvd49 , Xrsvd50 , Xrsvd51 , Xrsvd52 , Xrsvd53 , Xrsvd54 , Xrsvd55 , Xrsvd56
62  .long  Xrsvd57 , Xrsvd58 , Xrsvd59 , Xrsvd60 , Xrsvd61 , Xrsvd62 , Xrsvd63 , Xrsvd64
63  .long  Xrsvd65 , Xrsvd66 , Xrsvd67 , Xrsvd68 , Xrsvd69 , Xrsvd70 , Xrsvd71 , Xrsvd72
64  .long  Xrsvd73 , Xrsvd74 , Xrsvd75 , Xrsvd76 , Xrsvd77 , Xrsvd78 , Xrsvd79 , Xrsvd80
65  .long  Xrsvd81 , Xrsvd82 , Xrsvd83 , Xrsvd84 , Xrsvd85 , Xrsvd86 , Xrsvd87 , Xrsvd88
66  .long  Xrsvd89 , Xrsvd90 , Xrsvd91 , Xrsvd92 , Xrsvd93 , Xrsvd94 , Xrsvd95 , Xrsvd96
67  .long  Xrsvd97 , Xrsvd98 , Xrsvd99 , Xrsvd100, Xrsvd101, Xrsvd102, Xrsvd103, Xrsvd104
68  .long  Xrsvd105, Xrsvd106, Xrsvd107, Xrsvd108, Xrsvd109, Xrsvd110, Xrsvd111, Xrsvd112
69  .long  Xrsvd113, Xrsvd114, Xrsvd115, Xrsvd116, Xrsvd117, Xrsvd118, Xrsvd119, Xrsvd120
70  .long  Xrsvd121, Xrsvd122, Xrsvd123, Xrsvd124, Xrsvd125, Xrsvd126, Xrsvd127, Xrsvd128
71  .long  Xrsvd129, Xrsvd130, Xrsvd131, Xrsvd132, Xrsvd133, Xrsvd134, Xrsvd135, Xrsvd136
72  .long  Xrsvd137, Xrsvd138, Xrsvd139, Xrsvd140, Xrsvd141, Xrsvd142, Xrsvd143, Xrsvd144
73  .long  Xrsvd145, Xrsvd146, Xrsvd147, Xrsvd148, Xrsvd149, Xrsvd150, Xrsvd151, Xrsvd152
74  .long  Xrsvd153, Xrsvd154, Xrsvd155, Xrsvd156, Xrsvd157, Xrsvd158, Xrsvd159, Xrsvd160
75  .long  Xrsvd161, Xrsvd162, Xrsvd163, Xrsvd164, Xrsvd165, Xrsvd166, Xrsvd167, Xrsvd168
76  .long  Xrsvd169, Xrsvd170, Xrsvd171, Xrsvd172, Xrsvd173, Xrsvd174, Xrsvd175, Xrsvd176
77  .long  Xrsvd177, Xrsvd178, Xrsvd179, Xrsvd180, Xrsvd181, Xrsvd182, Xrsvd183, Xrsvd184
78  .long  Xrsvd185, Xrsvd186, Xrsvd187, Xrsvd188, Xrsvd189, Xrsvd190, Xrsvd191, Xrsvd192
79  .long  Xrsvd193, Xrsvd194, Xrsvd195, Xrsvd196, Xrsvd197, Xrsvd198, Xrsvd199, Xrsvd200
80  .long  Xrsvd201, Xrsvd202, Xrsvd203, Xrsvd204, Xrsvd205, Xrsvd206, Xrsvd207, Xrsvd208
81  .long  Xrsvd209, Xrsvd210, Xrsvd211, Xrsvd212, Xrsvd213, Xrsvd214, Xrsvd215, Xrsvd216
82  .long  Xrsvd217, Xrsvd218, Xrsvd219, Xrsvd220, Xrsvd221, Xrsvd222, Xrsvd223, Xrsvd224
83  .long  Xrsvd225, Xrsvd226, Xrsvd227, Xrsvd228, Xrsvd229, Xrsvd230, Xrsvd231, Xrsvd232
84  .long  Xrsvd233, Xrsvd234, Xrsvd235, Xrsvd236, Xrsvd237, Xrsvd238, Xrsvd239, Xrsvd240
85  .long  Xrsvd241, Xrsvd242, Xrsvd243, Xrsvd244, Xrsvd245, Xrsvd246, Xrsvd247, Xrsvd248
86  .long  Xrsvd249, Xrsvd250, Xrsvd251, Xrsvd252, Xrsvd253, Xrsvd254, Xrsvd255
87
88 #endif
89
90 /*****************************************************************************/
91 /* Trap handling                                                             */
92 /*****************************************************************************/
93 /*
94  * Trap and fault vector routines.
95  *
96  * Most traps are 'trap gates', SDT_SYS386TGT.  A trap gate pushes state on
97  * the stack that mostly looks like an interrupt, but does not disable 
98  * interrupts.  A few of the traps we are use are interrupt gates, 
99  * SDT_SYS386IGT, which are nearly the same thing except interrupts are
100  * disabled on entry.
101  *
102  * The cpu will push a certain amount of state onto the kernel stack for
103  * the current process.  The amount of state depends on the type of trap 
104  * and whether the trap crossed rings or not.  See i386/include/frame.h.  
105  * At the very least the current EFLAGS (status register, which includes 
106  * the interrupt disable state prior to the trap), the code segment register,
107  * and the return instruction pointer are pushed by the cpu.  The cpu 
108  * will also push an 'error' code for certain traps.  We push a dummy 
109  * error code for those traps where the cpu doesn't in order to maintain 
110  * a consistent frame.  We also push a contrived 'trap number'.
111  *
112  * The cpu does not push the general registers, we must do that, and we 
113  * must restore them prior to calling 'iret'.  The cpu adjusts the %cs and
114  * %ss segment registers, but does not mess with %ds, %es, %fs, or %gs.
115  * Thus we must load the ones we use (which is most of them) with appropriate
116  * values for supervisor mode operation.
117  *
118  * On entry to a trap or interrupt WE DO NOT OWN THE MP LOCK.  This means
119  * that we must be careful in regards to accessing global variables.  We
120  * save (push) the current cpl (our software interrupt disable mask), call
121  * the trap function, then jump to doreti to restore the cpl and deal with
122  * ASTs (software interrupts).  doreti will determine if the restoration
123  * of the cpl unmasked any pending interrupts and will issue those interrupts
124  * synchronously prior to doing the iret.
125  */
126
127 #define TRAP(a)         pushl $(a) ; jmp alltraps
128 #define BPTTRAP(a)      testl $PSL_I,4+8(%esp) ; je 1f ; sti ; 1: ; TRAP(a)
129
130 MCOUNT_LABEL(user)
131 MCOUNT_LABEL(btrap)
132
133 IDTVEC(div)
134         pushl $0; TRAP(T_DIVIDE)
135 IDTVEC(dbg)
136         pushl $0; BPTTRAP(T_TRCTRAP)
137 IDTVEC(nmi)
138         pushl $0; TRAP(T_NMI)
139 IDTVEC(bpt)
140         pushl $0; BPTTRAP(T_BPTFLT)
141 IDTVEC(ofl)
142         pushl $0; TRAP(T_OFLOW)
143 IDTVEC(bnd)
144         pushl $0; TRAP(T_BOUND)
145 IDTVEC(ill)
146         pushl $0; TRAP(T_PRIVINFLT)
147 IDTVEC(dna)
148         pushl $0; TRAP(T_DNA)
149 IDTVEC(fpusegm)
150         pushl $0; TRAP(T_FPOPFLT)
151 IDTVEC(tss)
152         TRAP(T_TSSFLT)
153 IDTVEC(missing)
154         TRAP(T_SEGNPFLT)
155 IDTVEC(stk)
156         TRAP(T_STKFLT)
157 IDTVEC(prot)
158         TRAP(T_PROTFLT)
159 IDTVEC(page)
160         TRAP(T_PAGEFLT)
161 IDTVEC(mchk)
162         pushl $0; TRAP(T_MCHK)
163
164 IDTVEC(rsvd0)
165         pushl $0; TRAP(T_RESERVED)
166
167 #ifdef DEBUG_INTERRUPTS
168
169 IDTVEC(rsvd1)
170         pushl $1; TRAP(T_RESERVED)
171 IDTVEC(rsvd2)
172         pushl $2; TRAP(T_RESERVED)
173 IDTVEC(rsvd3)
174         pushl $3; TRAP(T_RESERVED)
175 IDTVEC(rsvd4)
176         pushl $4; TRAP(T_RESERVED)
177 IDTVEC(rsvd5)
178         pushl $5; TRAP(T_RESERVED)
179 IDTVEC(rsvd6)
180         pushl $6; TRAP(T_RESERVED)
181 IDTVEC(rsvd7)
182         pushl $7; TRAP(T_RESERVED)
183 IDTVEC(rsvd8)
184         pushl $8; TRAP(T_RESERVED)
185 IDTVEC(rsvd9)
186         pushl $9; TRAP(T_RESERVED)
187 IDTVEC(rsvd10)
188         pushl $10; TRAP(T_RESERVED)
189 IDTVEC(rsvd11)
190         pushl $11; TRAP(T_RESERVED)
191 IDTVEC(rsvd12)
192         pushl $12; TRAP(T_RESERVED)
193 IDTVEC(rsvd13)
194         pushl $13; TRAP(T_RESERVED)
195 IDTVEC(rsvd14)
196         pushl $14; TRAP(T_RESERVED)
197 IDTVEC(rsvd15)
198         pushl $15; TRAP(T_RESERVED)
199 IDTVEC(rsvd16)
200         pushl $16; TRAP(T_RESERVED)
201 IDTVEC(rsvd17)
202         pushl $17; TRAP(T_RESERVED)
203 IDTVEC(rsvd18)
204         pushl $18; TRAP(T_RESERVED)
205 IDTVEC(rsvd19)
206         pushl $19; TRAP(T_RESERVED)
207 IDTVEC(rsvd20)
208         pushl $20; TRAP(T_RESERVED)
209 IDTVEC(rsvd21)
210         pushl $21; TRAP(T_RESERVED)
211 IDTVEC(rsvd22)
212         pushl $22; TRAP(T_RESERVED)
213 IDTVEC(rsvd23)
214         pushl $23; TRAP(T_RESERVED)
215 IDTVEC(rsvd24)
216         pushl $24; TRAP(T_RESERVED)
217 IDTVEC(rsvd25)
218         pushl $25; TRAP(T_RESERVED)
219 IDTVEC(rsvd26)
220         pushl $26; TRAP(T_RESERVED)
221 IDTVEC(rsvd27)
222         pushl $27; TRAP(T_RESERVED)
223 IDTVEC(rsvd28)
224         pushl $28; TRAP(T_RESERVED)
225 IDTVEC(rsvd29)
226         pushl $29; TRAP(T_RESERVED)
227 IDTVEC(rsvd30)
228         pushl $30; TRAP(T_RESERVED)
229 IDTVEC(rsvd31)
230         pushl $31; TRAP(T_RESERVED)
231 IDTVEC(rsvd32)
232         pushl $32; TRAP(T_RESERVED)
233 IDTVEC(rsvd33)
234         pushl $33; TRAP(T_RESERVED)
235 IDTVEC(rsvd34)
236         pushl $34; TRAP(T_RESERVED)
237 IDTVEC(rsvd35)
238         pushl $35; TRAP(T_RESERVED)
239 IDTVEC(rsvd36)
240         pushl $36; TRAP(T_RESERVED)
241 IDTVEC(rsvd37)
242         pushl $37; TRAP(T_RESERVED)
243 IDTVEC(rsvd38)
244         pushl $38; TRAP(T_RESERVED)
245 IDTVEC(rsvd39)
246         pushl $39; TRAP(T_RESERVED)
247 IDTVEC(rsvd40)
248         pushl $40; TRAP(T_RESERVED)
249 IDTVEC(rsvd41)
250         pushl $41; TRAP(T_RESERVED)
251 IDTVEC(rsvd42)
252         pushl $42; TRAP(T_RESERVED)
253 IDTVEC(rsvd43)
254         pushl $43; TRAP(T_RESERVED)
255 IDTVEC(rsvd44)
256         pushl $44; TRAP(T_RESERVED)
257 IDTVEC(rsvd45)
258         pushl $45; TRAP(T_RESERVED)
259 IDTVEC(rsvd46)
260         pushl $46; TRAP(T_RESERVED)
261 IDTVEC(rsvd47)
262         pushl $47; TRAP(T_RESERVED)
263 IDTVEC(rsvd48)
264         pushl $48; TRAP(T_RESERVED)
265 IDTVEC(rsvd49)
266         pushl $49; TRAP(T_RESERVED)
267 IDTVEC(rsvd50)
268         pushl $50; TRAP(T_RESERVED)
269 IDTVEC(rsvd51)
270         pushl $51; TRAP(T_RESERVED)
271 IDTVEC(rsvd52)
272         pushl $52; TRAP(T_RESERVED)
273 IDTVEC(rsvd53)
274         pushl $53; TRAP(T_RESERVED)
275 IDTVEC(rsvd54)
276         pushl $54; TRAP(T_RESERVED)
277 IDTVEC(rsvd55)
278         pushl $55; TRAP(T_RESERVED)
279 IDTVEC(rsvd56)
280         pushl $56; TRAP(T_RESERVED)
281 IDTVEC(rsvd57)
282         pushl $57; TRAP(T_RESERVED)
283 IDTVEC(rsvd58)
284         pushl $58; TRAP(T_RESERVED)
285 IDTVEC(rsvd59)
286         pushl $59; TRAP(T_RESERVED)
287 IDTVEC(rsvd60)
288         pushl $60; TRAP(T_RESERVED)
289 IDTVEC(rsvd61)
290         pushl $61; TRAP(T_RESERVED)
291 IDTVEC(rsvd62)
292         pushl $62; TRAP(T_RESERVED)
293 IDTVEC(rsvd63)
294         pushl $63; TRAP(T_RESERVED)
295 IDTVEC(rsvd64)
296         pushl $64; TRAP(T_RESERVED)
297 IDTVEC(rsvd65)
298         pushl $65; TRAP(T_RESERVED)
299 IDTVEC(rsvd66)
300         pushl $66; TRAP(T_RESERVED)
301 IDTVEC(rsvd67)
302         pushl $67; TRAP(T_RESERVED)
303 IDTVEC(rsvd68)
304         pushl $68; TRAP(T_RESERVED)
305 IDTVEC(rsvd69)
306         pushl $69; TRAP(T_RESERVED)
307 IDTVEC(rsvd70)
308         pushl $70; TRAP(T_RESERVED)
309 IDTVEC(rsvd71)
310         pushl $71; TRAP(T_RESERVED)
311 IDTVEC(rsvd72)
312         pushl $72; TRAP(T_RESERVED)
313 IDTVEC(rsvd73)
314         pushl $73; TRAP(T_RESERVED)
315 IDTVEC(rsvd74)
316         pushl $74; TRAP(T_RESERVED)
317 IDTVEC(rsvd75)
318         pushl $75; TRAP(T_RESERVED)
319 IDTVEC(rsvd76)
320         pushl $76; TRAP(T_RESERVED)
321 IDTVEC(rsvd77)
322         pushl $77; TRAP(T_RESERVED)
323 IDTVEC(rsvd78)
324         pushl $78; TRAP(T_RESERVED)
325 IDTVEC(rsvd79)
326         pushl $79; TRAP(T_RESERVED)
327 IDTVEC(rsvd80)
328         pushl $80; TRAP(T_RESERVED)
329 IDTVEC(rsvd81)
330         pushl $81; TRAP(T_RESERVED)
331 IDTVEC(rsvd82)
332         pushl $82; TRAP(T_RESERVED)
333 IDTVEC(rsvd83)
334         pushl $83; TRAP(T_RESERVED)
335 IDTVEC(rsvd84)
336         pushl $84; TRAP(T_RESERVED)
337 IDTVEC(rsvd85)
338         pushl $85; TRAP(T_RESERVED)
339 IDTVEC(rsvd86)
340         pushl $86; TRAP(T_RESERVED)
341 IDTVEC(rsvd87)
342         pushl $87; TRAP(T_RESERVED)
343 IDTVEC(rsvd88)
344         pushl $88; TRAP(T_RESERVED)
345 IDTVEC(rsvd89)
346         pushl $89; TRAP(T_RESERVED)
347 IDTVEC(rsvd90)
348         pushl $90; TRAP(T_RESERVED)
349 IDTVEC(rsvd91)
350         pushl $91; TRAP(T_RESERVED)
351 IDTVEC(rsvd92)
352         pushl $92; TRAP(T_RESERVED)
353 IDTVEC(rsvd93)
354         pushl $93; TRAP(T_RESERVED)
355 IDTVEC(rsvd94)
356         pushl $94; TRAP(T_RESERVED)
357 IDTVEC(rsvd95)
358         pushl $95; TRAP(T_RESERVED)
359 IDTVEC(rsvd96)
360         pushl $96; TRAP(T_RESERVED)
361 IDTVEC(rsvd97)
362         pushl $97; TRAP(T_RESERVED)
363 IDTVEC(rsvd98)
364         pushl $98; TRAP(T_RESERVED)
365 IDTVEC(rsvd99)
366         pushl $99; TRAP(T_RESERVED)
367 IDTVEC(rsvd100)
368         pushl $100; TRAP(T_RESERVED)
369 IDTVEC(rsvd101)
370         pushl $101; TRAP(T_RESERVED)
371 IDTVEC(rsvd102)
372         pushl $102; TRAP(T_RESERVED)
373 IDTVEC(rsvd103)
374         pushl $103; TRAP(T_RESERVED)
375 IDTVEC(rsvd104)
376         pushl $104; TRAP(T_RESERVED)
377 IDTVEC(rsvd105)
378         pushl $105; TRAP(T_RESERVED)
379 IDTVEC(rsvd106)
380         pushl $106; TRAP(T_RESERVED)
381 IDTVEC(rsvd107)
382         pushl $107; TRAP(T_RESERVED)
383 IDTVEC(rsvd108)
384         pushl $108; TRAP(T_RESERVED)
385 IDTVEC(rsvd109)
386         pushl $109; TRAP(T_RESERVED)
387 IDTVEC(rsvd110)
388         pushl $110; TRAP(T_RESERVED)
389 IDTVEC(rsvd111)
390         pushl $111; TRAP(T_RESERVED)
391 IDTVEC(rsvd112)
392         pushl $112; TRAP(T_RESERVED)
393 IDTVEC(rsvd113)
394         pushl $113; TRAP(T_RESERVED)
395 IDTVEC(rsvd114)
396         pushl $114; TRAP(T_RESERVED)
397 IDTVEC(rsvd115)
398         pushl $115; TRAP(T_RESERVED)
399 IDTVEC(rsvd116)
400         pushl $116; TRAP(T_RESERVED)
401 IDTVEC(rsvd117)
402         pushl $117; TRAP(T_RESERVED)
403 IDTVEC(rsvd118)
404         pushl $118; TRAP(T_RESERVED)
405 IDTVEC(rsvd119)
406         pushl $119; TRAP(T_RESERVED)
407 IDTVEC(rsvd120)
408         pushl $120; TRAP(T_RESERVED)
409 IDTVEC(rsvd121)
410         pushl $121; TRAP(T_RESERVED)
411 IDTVEC(rsvd122)
412         pushl $122; TRAP(T_RESERVED)
413 IDTVEC(rsvd123)
414         pushl $123; TRAP(T_RESERVED)
415 IDTVEC(rsvd124)
416         pushl $124; TRAP(T_RESERVED)
417 IDTVEC(rsvd125)
418         pushl $125; TRAP(T_RESERVED)
419 IDTVEC(rsvd126)
420         pushl $126; TRAP(T_RESERVED)
421 IDTVEC(rsvd127)
422         pushl $127; TRAP(T_RESERVED)
423 IDTVEC(rsvd128)
424         pushl $128; TRAP(T_RESERVED)
425 IDTVEC(rsvd129)
426         pushl $129; TRAP(T_RESERVED)
427 IDTVEC(rsvd130)
428         pushl $130; TRAP(T_RESERVED)
429 IDTVEC(rsvd131)
430         pushl $131; TRAP(T_RESERVED)
431 IDTVEC(rsvd132)
432         pushl $132; TRAP(T_RESERVED)
433 IDTVEC(rsvd133)
434         pushl $133; TRAP(T_RESERVED)
435 IDTVEC(rsvd134)
436         pushl $134; TRAP(T_RESERVED)
437 IDTVEC(rsvd135)
438         pushl $135; TRAP(T_RESERVED)
439 IDTVEC(rsvd136)
440         pushl $136; TRAP(T_RESERVED)
441 IDTVEC(rsvd137)
442         pushl $137; TRAP(T_RESERVED)
443 IDTVEC(rsvd138)
444         pushl $138; TRAP(T_RESERVED)
445 IDTVEC(rsvd139)
446         pushl $139; TRAP(T_RESERVED)
447 IDTVEC(rsvd140)
448         pushl $140; TRAP(T_RESERVED)
449 IDTVEC(rsvd141)
450         pushl $141; TRAP(T_RESERVED)
451 IDTVEC(rsvd142)
452         pushl $142; TRAP(T_RESERVED)
453 IDTVEC(rsvd143)
454         pushl $143; TRAP(T_RESERVED)
455 IDTVEC(rsvd144)
456         pushl $144; TRAP(T_RESERVED)
457 IDTVEC(rsvd145)
458         pushl $145; TRAP(T_RESERVED)
459 IDTVEC(rsvd146)
460         pushl $146; TRAP(T_RESERVED)
461 IDTVEC(rsvd147)
462         pushl $147; TRAP(T_RESERVED)
463 IDTVEC(rsvd148)
464         pushl $148; TRAP(T_RESERVED)
465 IDTVEC(rsvd149)
466         pushl $149; TRAP(T_RESERVED)
467 IDTVEC(rsvd150)
468         pushl $150; TRAP(T_RESERVED)
469 IDTVEC(rsvd151)
470         pushl $151; TRAP(T_RESERVED)
471 IDTVEC(rsvd152)
472         pushl $152; TRAP(T_RESERVED)
473 IDTVEC(rsvd153)
474         pushl $153; TRAP(T_RESERVED)
475 IDTVEC(rsvd154)
476         pushl $154; TRAP(T_RESERVED)
477 IDTVEC(rsvd155)
478         pushl $155; TRAP(T_RESERVED)
479 IDTVEC(rsvd156)
480         pushl $156; TRAP(T_RESERVED)
481 IDTVEC(rsvd157)
482         pushl $157; TRAP(T_RESERVED)
483 IDTVEC(rsvd158)
484         pushl $158; TRAP(T_RESERVED)
485 IDTVEC(rsvd159)
486         pushl $159; TRAP(T_RESERVED)
487 IDTVEC(rsvd160)
488         pushl $160; TRAP(T_RESERVED)
489 IDTVEC(rsvd161)
490         pushl $161; TRAP(T_RESERVED)
491 IDTVEC(rsvd162)
492         pushl $162; TRAP(T_RESERVED)
493 IDTVEC(rsvd163)
494         pushl $163; TRAP(T_RESERVED)
495 IDTVEC(rsvd164)
496         pushl $164; TRAP(T_RESERVED)
497 IDTVEC(rsvd165)
498         pushl $165; TRAP(T_RESERVED)
499 IDTVEC(rsvd166)
500         pushl $166; TRAP(T_RESERVED)
501 IDTVEC(rsvd167)
502         pushl $167; TRAP(T_RESERVED)
503 IDTVEC(rsvd168)
504         pushl $168; TRAP(T_RESERVED)
505 IDTVEC(rsvd169)
506         pushl $169; TRAP(T_RESERVED)
507 IDTVEC(rsvd170)
508         pushl $170; TRAP(T_RESERVED)
509 IDTVEC(rsvd171)
510         pushl $171; TRAP(T_RESERVED)
511 IDTVEC(rsvd172)
512         pushl $172; TRAP(T_RESERVED)
513 IDTVEC(rsvd173)
514         pushl $173; TRAP(T_RESERVED)
515 IDTVEC(rsvd174)
516         pushl $174; TRAP(T_RESERVED)
517 IDTVEC(rsvd175)
518         pushl $175; TRAP(T_RESERVED)
519 IDTVEC(rsvd176)
520         pushl $176; TRAP(T_RESERVED)
521 IDTVEC(rsvd177)
522         pushl $177; TRAP(T_RESERVED)
523 IDTVEC(rsvd178)
524         pushl $178; TRAP(T_RESERVED)
525 IDTVEC(rsvd179)
526         pushl $179; TRAP(T_RESERVED)
527 IDTVEC(rsvd180)
528         pushl $180; TRAP(T_RESERVED)
529 IDTVEC(rsvd181)
530         pushl $181; TRAP(T_RESERVED)
531 IDTVEC(rsvd182)
532         pushl $182; TRAP(T_RESERVED)
533 IDTVEC(rsvd183)
534         pushl $183; TRAP(T_RESERVED)
535 IDTVEC(rsvd184)
536         pushl $184; TRAP(T_RESERVED)
537 IDTVEC(rsvd185)
538         pushl $185; TRAP(T_RESERVED)
539 IDTVEC(rsvd186)
540         pushl $186; TRAP(T_RESERVED)
541 IDTVEC(rsvd187)
542         pushl $187; TRAP(T_RESERVED)
543 IDTVEC(rsvd188)
544         pushl $188; TRAP(T_RESERVED)
545 IDTVEC(rsvd189)
546         pushl $189; TRAP(T_RESERVED)
547 IDTVEC(rsvd190)
548         pushl $190; TRAP(T_RESERVED)
549 IDTVEC(rsvd191)
550         pushl $191; TRAP(T_RESERVED)
551 IDTVEC(rsvd192)
552         pushl $192; TRAP(T_RESERVED)
553 IDTVEC(rsvd193)
554         pushl $193; TRAP(T_RESERVED)
555 IDTVEC(rsvd194)
556         pushl $194; TRAP(T_RESERVED)
557 IDTVEC(rsvd195)
558         pushl $195; TRAP(T_RESERVED)
559 IDTVEC(rsvd196)
560         pushl $196; TRAP(T_RESERVED)
561 IDTVEC(rsvd197)
562         pushl $197; TRAP(T_RESERVED)
563 IDTVEC(rsvd198)
564         pushl $198; TRAP(T_RESERVED)
565 IDTVEC(rsvd199)
566         pushl $199; TRAP(T_RESERVED)
567 IDTVEC(rsvd200)
568         pushl $200; TRAP(T_RESERVED)
569 IDTVEC(rsvd201)
570         pushl $201; TRAP(T_RESERVED)
571 IDTVEC(rsvd202)
572         pushl $202; TRAP(T_RESERVED)
573 IDTVEC(rsvd203)
574         pushl $203; TRAP(T_RESERVED)
575 IDTVEC(rsvd204)
576         pushl $204; TRAP(T_RESERVED)
577 IDTVEC(rsvd205)
578         pushl $205; TRAP(T_RESERVED)
579 IDTVEC(rsvd206)
580         pushl $206; TRAP(T_RESERVED)
581 IDTVEC(rsvd207)
582         pushl $207; TRAP(T_RESERVED)
583 IDTVEC(rsvd208)
584         pushl $208; TRAP(T_RESERVED)
585 IDTVEC(rsvd209)
586         pushl $209; TRAP(T_RESERVED)
587 IDTVEC(rsvd210)
588         pushl $210; TRAP(T_RESERVED)
589 IDTVEC(rsvd211)
590         pushl $211; TRAP(T_RESERVED)
591 IDTVEC(rsvd212)
592         pushl $212; TRAP(T_RESERVED)
593 IDTVEC(rsvd213)
594         pushl $213; TRAP(T_RESERVED)
595 IDTVEC(rsvd214)
596         pushl $214; TRAP(T_RESERVED)
597 IDTVEC(rsvd215)
598         pushl $215; TRAP(T_RESERVED)
599 IDTVEC(rsvd216)
600         pushl $216; TRAP(T_RESERVED)
601 IDTVEC(rsvd217)
602         pushl $217; TRAP(T_RESERVED)
603 IDTVEC(rsvd218)
604         pushl $218; TRAP(T_RESERVED)
605 IDTVEC(rsvd219)
606         pushl $219; TRAP(T_RESERVED)
607 IDTVEC(rsvd220)
608         pushl $220; TRAP(T_RESERVED)
609 IDTVEC(rsvd221)
610         pushl $221; TRAP(T_RESERVED)
611 IDTVEC(rsvd222)
612         pushl $222; TRAP(T_RESERVED)
613 IDTVEC(rsvd223)
614         pushl $223; TRAP(T_RESERVED)
615 IDTVEC(rsvd224)
616         pushl $224; TRAP(T_RESERVED)
617 IDTVEC(rsvd225)
618         pushl $225; TRAP(T_RESERVED)
619 IDTVEC(rsvd226)
620         pushl $226; TRAP(T_RESERVED)
621 IDTVEC(rsvd227)
622         pushl $227; TRAP(T_RESERVED)
623 IDTVEC(rsvd228)
624         pushl $228; TRAP(T_RESERVED)
625 IDTVEC(rsvd229)
626         pushl $229; TRAP(T_RESERVED)
627 IDTVEC(rsvd230)
628         pushl $230; TRAP(T_RESERVED)
629 IDTVEC(rsvd231)
630         pushl $231; TRAP(T_RESERVED)
631 IDTVEC(rsvd232)
632         pushl $232; TRAP(T_RESERVED)
633 IDTVEC(rsvd233)
634         pushl $233; TRAP(T_RESERVED)
635 IDTVEC(rsvd234)
636         pushl $234; TRAP(T_RESERVED)
637 IDTVEC(rsvd235)
638         pushl $235; TRAP(T_RESERVED)
639 IDTVEC(rsvd236)
640         pushl $236; TRAP(T_RESERVED)
641 IDTVEC(rsvd237)
642         pushl $237; TRAP(T_RESERVED)
643 IDTVEC(rsvd238)
644         pushl $238; TRAP(T_RESERVED)
645 IDTVEC(rsvd239)
646         pushl $239; TRAP(T_RESERVED)
647 IDTVEC(rsvd240)
648         pushl $240; TRAP(T_RESERVED)
649 IDTVEC(rsvd241)
650         pushl $241; TRAP(T_RESERVED)
651 IDTVEC(rsvd242)
652         pushl $242; TRAP(T_RESERVED)
653 IDTVEC(rsvd243)
654         pushl $243; TRAP(T_RESERVED)
655 IDTVEC(rsvd244)
656         pushl $244; TRAP(T_RESERVED)
657 IDTVEC(rsvd245)
658         pushl $245; TRAP(T_RESERVED)
659 IDTVEC(rsvd246)
660         pushl $246; TRAP(T_RESERVED)
661 IDTVEC(rsvd247)
662         pushl $247; TRAP(T_RESERVED)
663 IDTVEC(rsvd248)
664         pushl $248; TRAP(T_RESERVED)
665 IDTVEC(rsvd249)
666         pushl $249; TRAP(T_RESERVED)
667 IDTVEC(rsvd250)
668         pushl $250; TRAP(T_RESERVED)
669 IDTVEC(rsvd251)
670         pushl $251; TRAP(T_RESERVED)
671 IDTVEC(rsvd252)
672         pushl $252; TRAP(T_RESERVED)
673 IDTVEC(rsvd253)
674         pushl $253; TRAP(T_RESERVED)
675 IDTVEC(rsvd254)
676         pushl $254; TRAP(T_RESERVED)
677 IDTVEC(rsvd255)
678         pushl $255; TRAP(T_RESERVED)
679
680 #endif
681
682 IDTVEC(fpu)
683 #if NNPX > 0
684         /*
685          * Handle like an interrupt (except for accounting) so that we can
686          * call npx_intr to clear the error.  It would be better to handle
687          * npx interrupts as traps.  Nested interrupts would probably have
688          * to be converted to ASTs.
689          *
690          * Convert everything to a full trapframe
691          */
692         pushl   $0                      /* dummy error code */
693         pushl   $0                      /* dummy trap type */
694         pushl   $0                      /* dummy xflags */
695         pushal
696         pushl   %ds
697         pushl   %es
698         pushl   %fs
699         pushl   %gs
700         cld
701         mov     $KDSEL,%ax
702         mov     %ax,%ds
703         mov     %ax,%es
704         mov     %ax,%gs
705         mov     $KPSEL,%ax
706         mov     %ax,%fs
707         FAKE_MCOUNT(15*4(%esp))
708
709         incl    PCPU(cnt)+V_TRAP
710
711         /* additional dummy pushes to fake an interrupt frame */
712         pushl   $0                      /* ppl */
713         pushl   $0                      /* vector */
714
715         /* warning, trap frame dummy arg, no extra reg pushes */
716         call    npx_intr                /* note: call might mess w/ argument */
717
718         /* convert back to a trapframe for doreti */
719         addl    $4,%esp
720         movl    $0,(%esp)               /* DUMMY CPL FOR DORETI */
721         MEXITCOUNT
722         jmp     doreti
723 #else   /* NNPX > 0 */
724         pushl $0; TRAP(T_ARITHTRAP)
725 #endif  /* NNPX > 0 */
726
727 IDTVEC(align)
728         TRAP(T_ALIGNFLT)
729
730 IDTVEC(xmm)
731         pushl $0; TRAP(T_XMMFLT)
732         
733         /*
734          * _alltraps entry point.  Interrupts are enabled if this was a trap
735          * gate (TGT), else disabled if this was an interrupt gate (IGT).
736          * Note that int0x80_syscall is a trap gate.  Only page faults
737          * use an interrupt gate.
738          *
739          * Note that we are MP through to the call to trap().
740          */
741
742         SUPERALIGN_TEXT
743         .globl  alltraps
744         .type   alltraps,@function
745 alltraps:
746         pushl   $0      /* xflags (inherits hardware err on pagefault) */
747         pushal
748         pushl   %ds
749         pushl   %es
750         pushl   %fs
751         pushl   %gs
752         .globl  alltraps_with_regs_pushed
753 alltraps_with_regs_pushed:
754         mov     $KDSEL,%ax
755         mov     %ax,%ds
756         mov     %ax,%es
757         mov     %ax,%gs
758         mov     $KPSEL,%ax
759         mov     %ax,%fs
760         FAKE_MCOUNT(15*4(%esp))
761 calltrap:
762         FAKE_MCOUNT(btrap)              /* init "from" _btrap -> calltrap */
763         incl    PCPU(cnt)+V_TRAP
764         /* warning, trap frame dummy arg, no extra reg pushes */
765         cld
766         pushl   %esp                    /* pass frame by reference */
767         call    trap
768         addl    $4,%esp
769
770         /*
771          * Return via doreti to handle ASTs.  Have to change trap frame
772          * to interrupt frame.
773          */
774         pushl   $0                      /* DUMMY CPL FOR DORETI */
775         MEXITCOUNT
776         jmp     doreti
777
778 /*
779  * SYSCALL CALL GATE (old entry point for a.out binaries)
780  *
781  * The intersegment call has been set up to specify one dummy parameter.
782  *
783  * This leaves a place to put eflags so that the call frame can be
784  * converted to a trap frame. Note that the eflags is (semi-)bogusly
785  * pushed into (what will be) tf_err and then copied later into the
786  * final spot. It has to be done this way because esp can't be just
787  * temporarily altered for the pushfl - an interrupt might come in
788  * and clobber the saved cs/eip.
789  *
790  * We do not obtain the MP lock, but the call to syscall2 might.  If it
791  * does it will release the lock prior to returning.
792  */
793         SUPERALIGN_TEXT
794 IDTVEC(syscall)
795         pushfl                          /* save eflags in tf_err for now */
796         pushl   $T_SYSCALL80            /* tf_trapno */
797         pushl   $0                      /* tf_xflags */
798         pushal
799         pushl   %ds
800         pushl   %es
801         pushl   %fs
802         pushl   %gs
803         cld
804         mov     $KDSEL,%ax              /* switch to kernel segments */
805         mov     %ax,%ds
806         mov     %ax,%es
807         mov     %ax,%gs
808         mov     $KPSEL,%ax
809         mov     %ax,%fs
810         movl    TF_ERR(%esp),%eax       /* copy saved eflags to final spot */
811         movl    %eax,TF_EFLAGS(%esp)
812         movl    $7,TF_ERR(%esp)         /* sizeof "lcall 7,0" */
813         FAKE_MCOUNT(15*4(%esp))
814         incl    PCPU(cnt)+V_SYSCALL     /* YYY per-cpu */
815         /* warning, trap frame dummy arg, no extra reg pushes */
816         push    %esp                    /* pass frame by reference */
817         call    syscall2
818         addl    $4,%esp
819         MEXITCOUNT
820         cli                             /* atomic reqflags interlock w/iret */
821         cmpl    $0,PCPU(reqflags)
822         je      doreti_syscall_ret
823         pushl   $0                      /* cpl to restore */
824         jmp     doreti
825
826 /*
827  * Trap gate entry for FreeBSD ELF and Linux/NetBSD syscall (int 0x80)
828  *
829  * Even though the name says 'int0x80', this is actually a TGT (trap gate)
830  * rather then an IGT (interrupt gate).  Thus interrupts are enabled on
831  * entry just as they are for a normal syscall.
832  *
833  * We do not obtain the MP lock, but the call to syscall2 might.  If it
834  * does it will release the lock prior to returning.
835  */
836         SUPERALIGN_TEXT
837 IDTVEC(int0x80_syscall)
838         pushl   $0                      /* tf_err */
839         pushl   $T_SYSCALL80            /* tf_trapno */
840         pushl   $0                      /* tf_xflags */
841         pushal
842         pushl   %ds
843         pushl   %es
844         pushl   %fs
845         pushl   %gs
846         cld
847         mov     $KDSEL,%ax              /* switch to kernel segments */
848         mov     %ax,%ds
849         mov     %ax,%es
850         mov     %ax,%gs
851         mov     $KPSEL,%ax
852         mov     %ax,%fs
853         movl    $2,TF_ERR(%esp)         /* sizeof "int 0x80" */
854         FAKE_MCOUNT(15*4(%esp))
855         incl    PCPU(cnt)+V_SYSCALL
856         /* warning, trap frame dummy arg, no extra reg pushes */
857         push    %esp                    /* pass frame by reference */
858         call    syscall2
859         addl    $4,%esp
860         MEXITCOUNT
861         cli                             /* atomic reqflags interlock w/irq */
862         cmpl    $0,PCPU(reqflags)
863         je      doreti_syscall_ret
864         pushl   $0                      /* cpl to restore */
865         jmp     doreti
866
867 /*
868  * This function is what cpu_heavy_restore jumps to after a new process
869  * is created.  The LWKT subsystem switches while holding a critical
870  * section and we maintain that abstraction here (e.g. because 
871  * cpu_heavy_restore needs it due to PCB_*() manipulation), then get out of
872  * it before calling the initial function (typically fork_return()) and/or
873  * returning to user mode.
874  *
875  * The MP lock is not held at any point but the critcount is bumped
876  * on entry to prevent interruption of the trampoline at a bad point.
877  *
878  * This is effectively what td->td_switch() returns to.  It 'returns' the
879  * old thread in %eax and since this is not returning to a td->td_switch()
880  * call from lwkt_switch() we must handle the cleanup for the old thread
881  * by calling lwkt_switch_return().
882  *
883  * fork_trampoline(%eax:otd, %esi:func, %ebx:arg)
884  */
885 ENTRY(fork_trampoline)
886         pushl   %eax
887         call    lwkt_switch_return
888         addl    $4,%esp
889         movl    PCPU(curthread),%eax
890         decl    TD_CRITCOUNT(%eax)
891
892         /*
893          * cpu_set_fork_handler intercepts this function call to
894          * have this call a non-return function to stay in kernel mode.
895          *
896          * initproc has its own fork handler, start_init(), which DOES
897          * return.
898          *
899          * The function (set in pcb_esi) gets passed two arguments,
900          * the primary parameter set in pcb_ebx and a pointer to the
901          * trapframe.
902          *   void (func)(int arg, struct trapframe *frame);
903          */
904         pushl   %esp                    /* pass frame by reference */
905         pushl   %ebx                    /* arg1 */
906         call    *%esi                   /* function */
907         addl    $8,%esp
908         /* cut from syscall */
909
910         sti
911         call    splz
912
913         /*
914          * Return via doreti to handle ASTs.
915          */
916         pushl   $0                      /* cpl to restore */
917         MEXITCOUNT
918         jmp     doreti
919
920
921 /*
922  * Include vm86 call routines, which want to call doreti.
923  */
924 #include "vm86bios.s"
925