[NTOS] Push vector as error code on the stack in KiUnexpectedInterrupt* instead of...
[reactos.git] / reactos / ntoskrnl / ke / i386 / trap.s
1 /*
2 * FILE: ntoskrnl/ke/i386/trap.S
3 * COPYRIGHT: See COPYING in the top level directory
4 * PURPOSE: System Traps, Entrypoints and Exitpoints
5 * PROGRAMMER: Alex Ionescu (alex@relsoft.net)
6 * Timo Kreuzer (timo.kreuzer@reactos.org)
7 * NOTE: See asmmacro.S for the shared entry/exit code.
8 */
9
10 /* INCLUDES ******************************************************************/
11
12 #include <reactos/asm.h>
13 #include <ndk/i386/asm.h>
14 #include <internal/i386/asmmacro.S>
15
16 MACRO(GENERATE_IDT_STUB, Number)
17 idt _KiUnexpectedInterrupt&Number, INT_32_DPL0
18 ENDM
19
20 MACRO(GENERATE_INT_HANDLER, Number)
21 .func KiUnexpectedInterrupt&Number
22 _KiUnexpectedInterrupt&Number:
23 push PRIMARY_VECTOR_BASE + Number
24 jmp _KiEndUnexpectedRange@0
25 .endfunc
26 ENDM
27
28 /* GLOBALS *******************************************************************/
29
30 .data
31
32 PUBLIC _KiIdt
33 _KiIdt:
34 /* This is the Software Interrupt Table that we handle in this file: */
35 idt _KiTrap00, INT_32_DPL0 /* INT 00: Divide Error (#DE) */
36 idt _KiTrap01, INT_32_DPL0 /* INT 01: Debug Exception (#DB) */
37 idt _KiTrap02, INT_32_DPL0 /* INT 02: NMI Interrupt */
38 idt _KiTrap03, INT_32_DPL3 /* INT 03: Breakpoint Exception (#BP) */
39 idt _KiTrap04, INT_32_DPL3 /* INT 04: Overflow Exception (#OF) */
40 idt _KiTrap05, INT_32_DPL0 /* INT 05: BOUND Range Exceeded (#BR) */
41 idt _KiTrap06, INT_32_DPL0 /* INT 06: Invalid Opcode Code (#UD) */
42 idt _KiTrap07, INT_32_DPL0 /* INT 07: Device Not Available (#NM) */
43 idt _KiTrap08, INT_32_DPL0 /* INT 08: Double Fault Exception (#DF) */
44 idt _KiTrap09, INT_32_DPL0 /* INT 09: RESERVED */
45 idt _KiTrap0A, INT_32_DPL0 /* INT 0A: Invalid TSS Exception (#TS) */
46 idt _KiTrap0B, INT_32_DPL0 /* INT 0B: Segment Not Present (#NP) */
47 idt _KiTrap0C, INT_32_DPL0 /* INT 0C: Stack Fault Exception (#SS) */
48 idt _KiTrap0D, INT_32_DPL0 /* INT 0D: General Protection (#GP) */
49 idt _KiTrap0E, INT_32_DPL0 /* INT 0E: Page-Fault Exception (#PF) */
50 idt _KiTrap0F, INT_32_DPL0 /* INT 0F: RESERVED */
51 idt _KiTrap10, INT_32_DPL0 /* INT 10: x87 FPU Error (#MF) */
52 idt _KiTrap11, INT_32_DPL0 /* INT 11: Align Check Exception (#AC) */
53 idt _KiTrap0F, INT_32_DPL0 /* INT 12: Machine Check Exception (#MC)*/
54 idt _KiTrap0F, INT_32_DPL0 /* INT 13: SIMD FPU Exception (#XF) */
55 .rept 22
56 idt _KiTrap0F, INT_32_DPL0 /* INT 14-29: UNDEFINED INTERRUPTS */
57 .endr
58 idt _KiGetTickCount, INT_32_DPL3 /* INT 2A: Get Tick Count Handler */
59 idt _KiCallbackReturn, INT_32_DPL3 /* INT 2B: User-Mode Callback Return */
60 idt _KiRaiseAssertion, INT_32_DPL3 /* INT 2C: Debug Assertion Handler */
61 idt _KiDebugService, INT_32_DPL3 /* INT 2D: Debug Service Handler */
62 idt _KiSystemService, INT_32_DPL3 /* INT 2E: System Call Service Handler */
63 idt _KiTrap0F, INT_32_DPL0 /* INT 2F: RESERVED */
64 i = 0
65 .rept 208
66 GENERATE_IDT_STUB %i
67 i = i + 1
68 .endr
69
70 PUBLIC _KiIdtDescriptor
71 _KiIdtDescriptor:
72 .short 0
73 .short 0x7FF
74 .long _KiIdt
75
76 PUBLIC _KiUnexpectedEntrySize
77 _KiUnexpectedEntrySize:
78 .long _KiUnexpectedInterrupt1 - _KiUnexpectedInterrupt0
79
80 /******************************************************************************/
81 .code32
82 .text
83
84 TRAP_ENTRY KiTrap00, KI_PUSH_FAKE_ERROR_CODE
85 TRAP_ENTRY KiTrap01, KI_PUSH_FAKE_ERROR_CODE
86 TRAP_ENTRY KiTrap03, KI_PUSH_FAKE_ERROR_CODE
87 TRAP_ENTRY KiTrap04, KI_PUSH_FAKE_ERROR_CODE
88 TRAP_ENTRY KiTrap05, KI_PUSH_FAKE_ERROR_CODE
89 TRAP_ENTRY KiTrap06, KI_PUSH_FAKE_ERROR_CODE
90 TRAP_ENTRY KiTrap07, KI_PUSH_FAKE_ERROR_CODE
91 TRAP_ENTRY KiTrap08, 0
92 TRAP_ENTRY KiTrap09, KI_PUSH_FAKE_ERROR_CODE
93 TRAP_ENTRY KiTrap0A, 0
94 TRAP_ENTRY KiTrap0B, 0
95 TRAP_ENTRY KiTrap0C, 0
96 TRAP_ENTRY KiTrap0D, 0
97 TRAP_ENTRY KiTrap0E, 0
98 TRAP_ENTRY KiTrap0F, KI_PUSH_FAKE_ERROR_CODE
99 TRAP_ENTRY KiTrap10, KI_PUSH_FAKE_ERROR_CODE
100 TRAP_ENTRY KiTrap11, KI_PUSH_FAKE_ERROR_CODE
101 TRAP_ENTRY KiTrap13, KI_PUSH_FAKE_ERROR_CODE
102 TRAP_ENTRY KiGetTickCount, KI_PUSH_FAKE_ERROR_CODE
103 TRAP_ENTRY KiCallbackReturn, KI_PUSH_FAKE_ERROR_CODE
104 TRAP_ENTRY KiRaiseAssertion, KI_PUSH_FAKE_ERROR_CODE
105 TRAP_ENTRY KiDebugService, KI_PUSH_FAKE_ERROR_CODE
106 TRAP_ENTRY KiUnexpectedInterruptTail, 0
107
108 ALIGN 4
109 EXTERN @KiInterruptTemplateHandler@8
110 PUBLIC _KiInterruptTemplate
111 _KiInterruptTemplate:
112 KiEnterTrap KI_PUSH_FAKE_ERROR_CODE
113 PUBLIC _KiInterruptTemplate2ndDispatch
114 _KiInterruptTemplate2ndDispatch:
115 mov edx, 0
116 PUBLIC _KiInterruptTemplateObject
117 _KiInterruptTemplateObject:
118 mov eax, offset @KiInterruptTemplateHandler@8
119 jmp eax
120 PUBLIC _KiInterruptTemplateDispatch
121 _KiInterruptTemplateDispatch:
122
123 EXTERN @KiSystemServiceHandler@8:PROC
124 PUBLIC _KiSystemService
125 _KiSystemService:
126 KiEnterTrap (KI_PUSH_FAKE_ERROR_CODE OR KI_NONVOLATILES_ONLY OR KI_DONT_SAVE_SEGS)
127 jmp @KiSystemServiceHandler@8
128
129 EXTERN @KiFastCallEntryHandler@8:PROC
130 PUBLIC _KiFastCallEntry
131 _KiFastCallEntry:
132 KiEnterTrap (KI_FAST_SYSTEM_CALL OR KI_NONVOLATILES_ONLY OR KI_DONT_SAVE_SEGS)
133 jmp @KiFastCallEntryHandler@8
134
135 PUBLIC _KiStartUnexpectedRange@0
136 _KiStartUnexpectedRange@0:
137 i = 0
138 .rept 208
139 GENERATE_INT_HANDLER %i
140 i = i + 1
141 .endr
142 PUBLIC _KiEndUnexpectedRange@0
143 _KiEndUnexpectedRange@0:
144 jmp _KiUnexpectedInterruptTail
145
146 END