[NTOS:KE/x64][SDK] Add some trap handling support asm macros

This commit is contained in:
Timo Kreuzer 2024-03-24 18:58:44 +02:00
parent 5329e475db
commit 88e24bc463
2 changed files with 43 additions and 39 deletions

View file

@ -848,12 +848,7 @@ GLOBAL_LABEL KiSystemCall64Again
GLOBAL_LABEL KiSystemServiceExit GLOBAL_LABEL KiSystemServiceExit
#if DBG ASSERT_TRAP_FRAME_INTS_ENABLED rsp + MAX_SYSCALL_PARAM_SIZE
test dword ptr [rsp + MAX_SYSCALL_PARAM_SIZE + KTRAP_FRAME_EFlags], HEX(200)
jnz IntsEnabled
int 3
IntsEnabled:
#endif
/* Check for pending user APC */ /* Check for pending user APC */
mov rcx, gs:qword ptr [PcCurrentThread] mov rcx, gs:qword ptr [PcCurrentThread]

View file

@ -1,3 +1,41 @@
/*
* PROJECT: ReactOS SDK
* LICENSE: MIT (https://spdx.org/licenses/MIT)
* PURPOSE: ASM macros for x64 trap handling
* COPYRIGHT: Copyright 2011-2024 Timo Kreuzer (timo.kreuzer@reactos.org)
*/
MACRO(ASSERT_TRAP_FRAME_INTS_ENABLED, Register)
#if DBG
LOCAL IntsAreEnabled
test dword ptr [Register + KTRAP_FRAME_EFlags], HEX(200)
jnz IntsAreEnabled
int HEX(2C)
IntsAreEnabled:
#endif
ENDM
MACRO(ASSERT_TRAP_FRAME_IRQL_VALID, Register)
#if DBG
LOCAL IrqlIsValid
mov rax, cr8
cmp byte ptr [Register + KTRAP_FRAME_PreviousIrql], al
je IrqlIsValid
int HEX(2C)
IrqlIsValid:
#endif
ENDM
MACRO(ASSERT_IRQL_PASSIVE)
#if DBG
LOCAL IrqlIsPassive
mov rax, cr8
test rax, rax
jz IrqlIsPassive
int HEX(2C)
IrqlIsPassive:
#endif
ENDM
APIC_EOI = HEX(0FFFFFFFFFFFE00B0) APIC_EOI = HEX(0FFFFFFFFFFFE00B0)
@ -122,13 +160,7 @@ MACRO(EnterTrap, Flags)
/* Load kernel MXCSR */ /* Load kernel MXCSR */
ldmxcsr gs:[PcMxCsr] ldmxcsr gs:[PcMxCsr]
#if DBG ASSERT_IRQL_PASSIVE
/* Check IRQL */
mov rax, cr8
test rax, rax
jz kernel_mode_entry
int HEX(2c)
#endif
kernel_mode_entry: kernel_mode_entry:
@ -163,19 +195,9 @@ ENDM
*/ */
MACRO(ExitTrap, Flags) MACRO(ExitTrap, Flags)
LOCAL kernel_mode_return LOCAL kernel_mode_return
LOCAL IntsEnabled
LOCAL NoUserApc LOCAL NoUserApc
LOCAL IrqlPassive
LOCAL irql_ok
#if DBG ASSERT_TRAP_FRAME_IRQL_VALID rbp
/* Check previous irql */
mov rax, cr8
cmp [rbp + KTRAP_FRAME_PreviousIrql], al
je irql_ok
int HEX(2c)
irql_ok:
#endif
if (Flags AND TF_SEGMENTS) if (Flags AND TF_SEGMENTS)
/* Restore segment selectors */ /* Restore segment selectors */
@ -203,21 +225,8 @@ MACRO(ExitTrap, Flags)
NoUserApc: NoUserApc:
endif endif
#if DBG ASSERT_TRAP_FRAME_INTS_ENABLED rbp
/*Make sure interrupts are enabled */ ASSERT_IRQL_PASSIVE
test dword ptr [rbp + KTRAP_FRAME_EFlags], HEX(200)
jnz IntsEnabled
int HEX(2c)
IntsEnabled:
/* Make sure we are at passive level */
mov rax, cr8
test rax, rax
jz IrqlPassive
int HEX(2C)
IrqlPassive:
#endif
cli cli