mirror of
https://github.com/reactos/reactos.git
synced 2024-10-06 01:13:38 +00:00
- Implement GENERATE_IDT_STUBS/GENERATE_INT_HANDLERS
- Generate actual Unexpected Interrupt entries in the IDT for INTs > 0x30 (basically IRQs). - Generated all 208 Unexpected Interrupt Handlers for all INTs (using a single macro line) and implement a "Tail" function to handle them instead of bugchecking like before (they're now sent to HAL properly). - Implement INT_PROLOG macro to create KTRAP_FRAME for interrupts (similar to traps). - Part 1 of major changes to come.... svn path=/trunk/; revision=23645
This commit is contained in:
parent
9281b0c841
commit
67096f53f5
|
@ -135,6 +135,9 @@ Author:
|
||||||
#define KPCR_SELF 0x1C
|
#define KPCR_SELF 0x1C
|
||||||
#define KPCR_PRCB 0x20
|
#define KPCR_PRCB 0x20
|
||||||
#define KPCR_IRQL 0x24
|
#define KPCR_IRQL 0x24
|
||||||
|
#define KPCR_IRR 0x28
|
||||||
|
#define KPCR_IRR_ACTIVE 0x2C
|
||||||
|
#define KPCR_IDR 0x30
|
||||||
#define KPCR_KD_VERSION_BLOCK 0x34
|
#define KPCR_KD_VERSION_BLOCK 0x34
|
||||||
#define KPCR_IDT 0x38
|
#define KPCR_IDT 0x38
|
||||||
#define KPCR_GDT 0x3C
|
#define KPCR_GDT 0x3C
|
||||||
|
@ -148,6 +151,7 @@ Author:
|
||||||
#define KPCR_NPX_THREAD 0x640
|
#define KPCR_NPX_THREAD 0x640
|
||||||
#define KPCR_DR6 0x428
|
#define KPCR_DR6 0x428
|
||||||
#define KPCR_DR7 0x42C
|
#define KPCR_DR7 0x42C
|
||||||
|
#define KPCR_PRCB_INTERRUPT_COUNT 0x644
|
||||||
#define KPCR_SYSTEM_CALLS 0x6B8
|
#define KPCR_SYSTEM_CALLS 0x6B8
|
||||||
#define KPCR_PRCB_DPC_ROUTINE_ACTIVE 0x994
|
#define KPCR_PRCB_DPC_ROUTINE_ACTIVE 0x994
|
||||||
|
|
||||||
|
@ -400,6 +404,9 @@ Author:
|
||||||
//
|
//
|
||||||
#define PASSIVE_LEVEL 0x0
|
#define PASSIVE_LEVEL 0x0
|
||||||
#define APC_LEVEL 0x1
|
#define APC_LEVEL 0x1
|
||||||
|
#define DISPATCH_LEVEL 0x2
|
||||||
|
#define CLOCK2_LEVEL 0x1C
|
||||||
|
#define HIGH_LEVEL 0x1F
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -424,6 +431,11 @@ Author:
|
||||||
#define MACHINE_TYPE_EISA 0x0001
|
#define MACHINE_TYPE_EISA 0x0001
|
||||||
#define MACHINE_TYPE_MCA 0x0002
|
#define MACHINE_TYPE_MCA 0x0002
|
||||||
|
|
||||||
|
//
|
||||||
|
// Vector base
|
||||||
|
//
|
||||||
|
#define PRIMARY_VECTOR_BASE 0x30
|
||||||
|
|
||||||
//
|
//
|
||||||
// Kernel Feature Bits
|
// Kernel Feature Bits
|
||||||
//
|
//
|
||||||
|
|
|
@ -64,14 +64,17 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//
|
//
|
||||||
// @name SET_TF_DEBUG_HEADER
|
// @name IDT
|
||||||
//
|
//
|
||||||
// This macro sets up the debug header in the trap frame.
|
// This macro creates an IDT entry for the given handler
|
||||||
//
|
//
|
||||||
// @param None.
|
// @param Handler
|
||||||
|
// Pointer to the IDT handler
|
||||||
//
|
//
|
||||||
// @remark ebp = PKTRAP_FRAME.
|
// @param Bits
|
||||||
// edi/ebx = Have been saved and can be used.
|
// Descriptor Bits to associate
|
||||||
|
//
|
||||||
|
// @remark None.
|
||||||
//
|
//
|
||||||
.macro idt Handler, Bits
|
.macro idt Handler, Bits
|
||||||
.long \Handler
|
.long \Handler
|
||||||
|
@ -79,6 +82,70 @@
|
||||||
.short KGDT_R0_CODE
|
.short KGDT_R0_CODE
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
|
//
|
||||||
|
// @name GENERATE_IDT_STUB
|
||||||
|
//
|
||||||
|
// This macro creates an IDT entry for an unexpected interrupt handler.
|
||||||
|
//
|
||||||
|
// @param None.
|
||||||
|
//
|
||||||
|
// @remark None.
|
||||||
|
//
|
||||||
|
.macro GENERATE_IDT_STUB Number
|
||||||
|
idt _KiUnexpectedInterrupt&Number, INT_32_DPL0
|
||||||
|
.endm
|
||||||
|
|
||||||
|
//
|
||||||
|
// @name GENERATE_IDT_STUBS
|
||||||
|
//
|
||||||
|
// This macro creates unexpected interrupt IDT entries.
|
||||||
|
//
|
||||||
|
// @param None.
|
||||||
|
//
|
||||||
|
// @remark None.
|
||||||
|
//
|
||||||
|
.altmacro
|
||||||
|
.macro GENERATE_IDT_STUBS
|
||||||
|
.set i, 0
|
||||||
|
.rept 208
|
||||||
|
GENERATE_IDT_STUB %i
|
||||||
|
.set i, i + 1
|
||||||
|
.endr
|
||||||
|
.endm
|
||||||
|
|
||||||
|
//
|
||||||
|
// @name GENERATE_INT_HANDLER
|
||||||
|
//
|
||||||
|
// This macro creates an unexpected interrupt handler.
|
||||||
|
//
|
||||||
|
// @param None.
|
||||||
|
//
|
||||||
|
// @remark None.
|
||||||
|
//
|
||||||
|
.macro GENERATE_INT_HANDLER Number
|
||||||
|
_KiUnexpectedInterrupt&Number:
|
||||||
|
push PRIMARY_VECTOR_BASE + Number
|
||||||
|
jmp _KiEndUnexpected
|
||||||
|
.endm
|
||||||
|
|
||||||
|
//
|
||||||
|
// @name GENERATE_INT_HANDLERS
|
||||||
|
//
|
||||||
|
// This macro creates the unexpected interrupt handlers.
|
||||||
|
//
|
||||||
|
// @param None.
|
||||||
|
//
|
||||||
|
// @remark None.
|
||||||
|
//
|
||||||
|
.altmacro
|
||||||
|
.macro GENERATE_INT_HANDLERS
|
||||||
|
.set i, 0
|
||||||
|
.rept 208
|
||||||
|
GENERATE_INT_HANDLER %i
|
||||||
|
.set i, i + 1
|
||||||
|
.endr
|
||||||
|
.endm
|
||||||
|
|
||||||
//
|
//
|
||||||
// @name SET_TF_DEBUG_HEADER
|
// @name SET_TF_DEBUG_HEADER
|
||||||
//
|
//
|
||||||
|
@ -253,6 +320,93 @@
|
||||||
/* Set the Trap Frame Debug Header */ \
|
/* Set the Trap Frame Debug Header */ \
|
||||||
SET_TF_DEBUG_HEADER
|
SET_TF_DEBUG_HEADER
|
||||||
|
|
||||||
|
//
|
||||||
|
// @name INT_PROLOG
|
||||||
|
//
|
||||||
|
// This macro creates a standard interrupt entry prologue.
|
||||||
|
// It should be used for entry into any interrupt, including software.
|
||||||
|
//
|
||||||
|
// @param Label
|
||||||
|
// Identifying name of the caller function; will be used to append
|
||||||
|
// to the name V86, ABIOS and DR helper functions, which must exist.
|
||||||
|
//
|
||||||
|
// @remark For software interrupts, make sure that a fake INT stack is created.
|
||||||
|
//
|
||||||
|
.macro INT_PROLOG Label
|
||||||
|
/* Save fake error code */
|
||||||
|
push esp
|
||||||
|
|
||||||
|
/* Save the non-volatiles */
|
||||||
|
push ebp
|
||||||
|
push ebx
|
||||||
|
push esi
|
||||||
|
push edi
|
||||||
|
|
||||||
|
/* Skip debug registers and other stuff */
|
||||||
|
sub esp, 0x54
|
||||||
|
|
||||||
|
/* Set up frame */
|
||||||
|
mov ebp, esp
|
||||||
|
|
||||||
|
/* Save volatiles */
|
||||||
|
mov [esp+KTRAP_FRAME_EAX], eax
|
||||||
|
mov [esp+KTRAP_FRAME_ECX], ecx
|
||||||
|
mov [esp+KTRAP_FRAME_EDX], edx
|
||||||
|
mov dword ptr [esp+KTRAP_FRAME_EXCEPTION_LIST], -1
|
||||||
|
|
||||||
|
/* Check if this was from V86 Mode */
|
||||||
|
/* test dword ptr [ebp+KTRAP_FRAME_EFLAGS], EFLAGS_V86_MASK */
|
||||||
|
/* jnz V86_&Label*/
|
||||||
|
|
||||||
|
/* Check if this was kernel mode */
|
||||||
|
cmp dword ptr [esp+KTRAP_FRAME_CS], KGDT_R0_CODE
|
||||||
|
jz 1f
|
||||||
|
|
||||||
|
/* Set segments */
|
||||||
|
mov word ptr [esp+KTRAP_FRAME_FS], fs
|
||||||
|
mov word ptr [esp+KTRAP_FRAME_DS], ds
|
||||||
|
mov word ptr [esp+KTRAP_FRAME_ES], es
|
||||||
|
mov word ptr [esp+KTRAP_FRAME_GS], gs
|
||||||
|
|
||||||
|
/* Load the segment registers */
|
||||||
|
mov ebx, KGDT_R0_PCR
|
||||||
|
mov eax, KGDT_R3_DATA | RPL_MASK
|
||||||
|
mov fs, bx
|
||||||
|
mov ds, ax
|
||||||
|
mov es, ax
|
||||||
|
|
||||||
|
1:
|
||||||
|
/* Save the previous exception list */
|
||||||
|
mov ebx, [fs:KPCR_EXCEPTION_LIST]
|
||||||
|
mov [esp+KTRAP_FRAME_EXCEPTION_LIST], ebx
|
||||||
|
|
||||||
|
/* Set the exception handler chain terminator */
|
||||||
|
mov dword ptr [fs:KPCR_EXCEPTION_LIST], -1
|
||||||
|
|
||||||
|
/* Check if this is the ABIOS stack */
|
||||||
|
/* cmp esp, 0x10000*/
|
||||||
|
/* jb Abios_Label*/
|
||||||
|
|
||||||
|
/* Delete error code */
|
||||||
|
and dword ptr [esp+KTRAP_FRAME_ERROR_CODE], 0
|
||||||
|
|
||||||
|
/* Get the current thread and clear direction flag */
|
||||||
|
mov ecx, [fs:KPCR_CURRENT_THREAD]
|
||||||
|
cld
|
||||||
|
|
||||||
|
/* Flush DR7 */
|
||||||
|
and dword ptr [ebp+KTRAP_FRAME_DR7], 0
|
||||||
|
|
||||||
|
/* Check if the thread was being debugged */
|
||||||
|
test byte ptr [ecx+KTHREAD_DEBUG_ACTIVE], 0xFF
|
||||||
|
|
||||||
|
/* Save DR registers if needed */
|
||||||
|
//jnz Dr_&Label
|
||||||
|
|
||||||
|
/* Set the trap frame debug header */
|
||||||
|
SET_TF_DEBUG_HEADER
|
||||||
|
.endm
|
||||||
|
|
||||||
//
|
//
|
||||||
// @name SYSCALL_PROLOG
|
// @name SYSCALL_PROLOG
|
||||||
//
|
//
|
||||||
|
|
|
@ -46,9 +46,7 @@ idt _KiRaiseAssertion, INT_32_DPL3 /* INT 2C: Debug Assertion Handler */
|
||||||
idt _KiDebugService, INT_32_DPL3 /* INT 2D: Debug Service Handler */
|
idt _KiDebugService, INT_32_DPL3 /* INT 2D: Debug Service Handler */
|
||||||
idt _KiSystemService, INT_32_DPL3 /* INT 2E: System Call Service Handler */
|
idt _KiSystemService, INT_32_DPL3 /* INT 2E: System Call Service Handler */
|
||||||
idt _KiTrap0F, INT_32_DPL0 /* INT 2F: RESERVED */
|
idt _KiTrap0F, INT_32_DPL0 /* INT 2F: RESERVED */
|
||||||
.rept 220
|
GENERATE_IDT_STUBS /* INT 30-FF: UNEXPECTED INTERRUPTS */
|
||||||
idt _KiTrap0F, INT_32_DPL0 /* INT 30-FF: UNDEFINED INTERRUPTS */
|
|
||||||
.endr
|
|
||||||
|
|
||||||
/* System call entrypoints: */
|
/* System call entrypoints: */
|
||||||
.globl _KiFastCallEntry
|
.globl _KiFastCallEntry
|
||||||
|
@ -62,13 +60,14 @@ idt _KiTrap0F, INT_32_DPL0 /* INT 30-FF: UNDEFINED INTERRUPTS */
|
||||||
.globl _KiServiceExit /* Exit from syscall */
|
.globl _KiServiceExit /* Exit from syscall */
|
||||||
.globl _KiServiceExit2 /* Exit from syscall with complete frame*/
|
.globl _KiServiceExit2 /* Exit from syscall with complete frame*/
|
||||||
.globl _Kei386EoiHelper@0 /* Exit from interrupt or H/W trap */
|
.globl _Kei386EoiHelper@0 /* Exit from interrupt or H/W trap */
|
||||||
|
.globl _Kei386EoiHelper2ndEntry /* Exit from unexpected interrupt */
|
||||||
|
|
||||||
.globl _KiIdtDescriptor
|
.globl _KiIdtDescriptor
|
||||||
_KiIdtDescriptor:
|
_KiIdtDescriptor:
|
||||||
.short 0x800
|
.short 0x800
|
||||||
.long _KiIdt
|
.long _KiIdt
|
||||||
|
|
||||||
/* FUNCTIONS ****************************************************************/
|
/* SOFTWARE INTERRUPT SERVICES ***********************************************/
|
||||||
|
|
||||||
_KiGetTickCount:
|
_KiGetTickCount:
|
||||||
_KiCallbackReturn:
|
_KiCallbackReturn:
|
||||||
|
@ -490,6 +489,7 @@ _Kei386EoiHelper@0:
|
||||||
CHECK_FOR_APC_DELIVER 0
|
CHECK_FOR_APC_DELIVER 0
|
||||||
|
|
||||||
/* Exit and cleanup */
|
/* Exit and cleanup */
|
||||||
|
_Kei386EoiHelper2ndEntry:
|
||||||
TRAP_EPILOG NotFromSystemCall, DoNotRestorePreviousMode, DoRestoreSegments, DoRestoreVolatiles, DoNotRestoreEverything
|
TRAP_EPILOG NotFromSystemCall, DoNotRestorePreviousMode, DoRestoreSegments, DoRestoreVolatiles, DoNotRestoreEverything
|
||||||
.endfunc
|
.endfunc
|
||||||
|
|
||||||
|
@ -670,6 +670,8 @@ Error:
|
||||||
jmp _KiServiceExit
|
jmp _KiServiceExit
|
||||||
.endfunc
|
.endfunc
|
||||||
|
|
||||||
|
/* EXCEPTION DISPATCHERS *****************************************************/
|
||||||
|
|
||||||
.func CommonDispatchException
|
.func CommonDispatchException
|
||||||
_CommonDispatchException:
|
_CommonDispatchException:
|
||||||
|
|
||||||
|
@ -747,6 +749,8 @@ _DispatchTwoParam:
|
||||||
call _CommonDispatchException
|
call _CommonDispatchException
|
||||||
.endfunc
|
.endfunc
|
||||||
|
|
||||||
|
/* HARDWARE TRAP HANDLERS ****************************************************/
|
||||||
|
|
||||||
.func KiTrap0
|
.func KiTrap0
|
||||||
_KiTrap0:
|
_KiTrap0:
|
||||||
/* Push error code */
|
/* Push error code */
|
||||||
|
@ -1291,4 +1295,54 @@ _KiSystemFatalException:
|
||||||
ret
|
ret
|
||||||
.endfunc
|
.endfunc
|
||||||
|
|
||||||
|
/* INTERRUPT HANDLERS ********************************************************/
|
||||||
|
|
||||||
|
.globl _KiStartUnexpected
|
||||||
|
_KiStartUnexpected:
|
||||||
|
|
||||||
|
GENERATE_INT_HANDLERS
|
||||||
|
|
||||||
|
_KiEndUnexpected:
|
||||||
|
jmp _KiUnexpectedInterruptTail
|
||||||
|
|
||||||
|
.func KiUnexpectedInterruptTail
|
||||||
|
_KiUnexpectedInterruptTail:
|
||||||
|
|
||||||
|
/* Enter interrupt trap */
|
||||||
|
INT_PROLOG(kui)
|
||||||
|
|
||||||
|
/* Increase interrupt count */
|
||||||
|
inc dword ptr [fs:KPCR_PRCB_INTERRUPT_COUNT]
|
||||||
|
|
||||||
|
/* Put vector in EBX and make space for KIRQL */
|
||||||
|
mov ebx, [esp]
|
||||||
|
sub esp, 4
|
||||||
|
|
||||||
|
/* Begin interrupt */
|
||||||
|
push esp
|
||||||
|
push ebx
|
||||||
|
push HIGH_LEVEL
|
||||||
|
call _HalBeginSystemInterrupt@12
|
||||||
|
|
||||||
|
/* Check if it was spurious or not */
|
||||||
|
or eax, eax
|
||||||
|
jnz Handled
|
||||||
|
|
||||||
|
/* Spurious, ignore it */
|
||||||
|
add esp, 8
|
||||||
|
jmp _Kei386EoiHelper2ndEntry
|
||||||
|
|
||||||
|
Handled:
|
||||||
|
/* Unexpected, exit the interrupt */
|
||||||
|
mov esi, $
|
||||||
|
cli
|
||||||
|
call _HalEndSystemInterrupt@8
|
||||||
|
jmp _Kei386EoiHelper@0
|
||||||
|
.endfunc
|
||||||
|
|
||||||
|
.globl _KiUnexpectedInterrupt
|
||||||
|
_KiUnexpectedInterrupt:
|
||||||
|
|
||||||
|
/* Bugcheck with invalid interrupt code */
|
||||||
|
push 0x12
|
||||||
|
call _KeBugCheck@4
|
||||||
|
|
|
@ -656,7 +656,7 @@ KeWaitForMutexObject@20=KeWaitForSingleObject@20
|
||||||
KeWaitForSingleObject@20
|
KeWaitForSingleObject@20
|
||||||
@KefAcquireSpinLockAtDpcLevel@4
|
@KefAcquireSpinLockAtDpcLevel@4
|
||||||
@KefReleaseSpinLockFromDpcLevel@4
|
@KefReleaseSpinLockFromDpcLevel@4
|
||||||
;Kei386EoiHelper
|
Kei386EoiHelper@0
|
||||||
@KiAcquireSpinLock@4
|
@KiAcquireSpinLock@4
|
||||||
;KiBugCheckData DATA
|
;KiBugCheckData DATA
|
||||||
KiCoprocessorError@0
|
KiCoprocessorError@0
|
||||||
|
@ -667,7 +667,7 @@ KiEnableTimerWatchdog
|
||||||
KiInterruptDispatch2@8
|
KiInterruptDispatch2@8
|
||||||
KiIpiServiceRoutine@8
|
KiIpiServiceRoutine@8
|
||||||
@KiReleaseSpinLock@4
|
@KiReleaseSpinLock@4
|
||||||
KiUnexpectedInterrupt@0
|
KiUnexpectedInterrupt
|
||||||
;Kii386SpinOnSpinLock
|
;Kii386SpinOnSpinLock
|
||||||
KiRawTicks DATA
|
KiRawTicks DATA
|
||||||
LdrAccessResource@16
|
LdrAccessResource@16
|
||||||
|
|
Loading…
Reference in a new issue