mirror of
https://github.com/reactos/reactos.git
synced 2024-08-19 18:02:55 +00:00
![Timo Kreuzer](/assets/img/avatar_default.png)
KiSetTrapContext is an asm wrapper around RtlSetUnwindContext, which first stores an exception frame to assure that all non-volatile registers were put on the stack, then calls RtlSetUnwindContext to update their first saving positions on the stack and finally restore the exception frame to potentially load any updated registers, that haven't been saved elsewhere on the stack.
419 lines
14 KiB
C
419 lines
14 KiB
C
/*++ NDK Version: 0095
|
|
|
|
Copyright (c) Alex Ionescu. All rights reserved.
|
|
|
|
Header Name:
|
|
|
|
amd64/asm.h
|
|
|
|
Abstract:
|
|
|
|
ASM Offsets for dealing with de-referencing structures in registers.
|
|
|
|
Author:
|
|
|
|
Timo Kreuzer (timo.kreuzer@reactos.org) 06-Sep-2008
|
|
|
|
--*/
|
|
#ifndef _ASM_AMD64_H
|
|
#define _ASM_AMD64_H
|
|
|
|
#ifndef HEX
|
|
#ifdef _USE_ML
|
|
#define HEX(x) x##h
|
|
#else
|
|
#define HEX(val) 0x0##val
|
|
#endif
|
|
#endif
|
|
|
|
#define SIZEOF_FX_SAVE_AREA 528 // HACK
|
|
|
|
//
|
|
// CPU Modes
|
|
//
|
|
#define KernelMode HEX(0)
|
|
#define UserMode HEX(1)
|
|
|
|
//
|
|
// KTSS Offsets
|
|
//
|
|
#define KTSS64_RSP0 HEX(04)
|
|
#define KTSS64_RSP1 HEX(0c)
|
|
#define KTSS64_RSP2 HEX(14)
|
|
#define KTSS64_IST HEX(1c)
|
|
#define KTSS64_IO_MAP_BASE HEX(66)
|
|
|
|
//
|
|
// KTHREAD Offsets
|
|
//
|
|
#define KTHREAD_DEBUG_ACTIVE HEX(03)
|
|
#define KTHREAD_INITIAL_STACK HEX(28)
|
|
#define KTHREAD_STACK_LIMIT HEX(30)
|
|
#define KTHREAD_WAIT_IRQL HEX(156)
|
|
|
|
//
|
|
// KPRCB Offsets
|
|
//
|
|
#define KPRCB_CurrentThread HEX(08)
|
|
|
|
|
|
//
|
|
// KPCR Offsets
|
|
//
|
|
#define KPCR_TSS_BASE HEX(08)
|
|
#define KPCR_SELF HEX(18)
|
|
#define KPCR_STALL_SCALE_FACTOR HEX(64)
|
|
#define KPCR_PRCB HEX(180
|
|
|
|
//
|
|
// KTRAP_FRAME Offsets
|
|
//
|
|
#define KTRAP_FRAME_P1Home HEX(00)
|
|
#define KTRAP_FRAME_P2Home HEX(08)
|
|
#define KTRAP_FRAME_P3Home HEX(10)
|
|
#define KTRAP_FRAME_P4Home HEX(18)
|
|
#define KTRAP_FRAME_P5 HEX(20)
|
|
#define KTRAP_FRAME_PreviousMode HEX(28)
|
|
#define KTRAP_FRAME_PreviousIrql HEX(29)
|
|
#define KTRAP_FRAME_FaultIndicator HEX(2A)
|
|
#define KTRAP_FRAME_ExceptionActive HEX(2B)
|
|
#define KTRAP_FRAME_MxCsr HEX(2C)
|
|
#define KTRAP_FRAME_Rax HEX(30)
|
|
#define KTRAP_FRAME_Rcx HEX(38)
|
|
#define KTRAP_FRAME_Rdx HEX(40)
|
|
#define KTRAP_FRAME_R8 HEX(48)
|
|
#define KTRAP_FRAME_R9 HEX(50)
|
|
#define KTRAP_FRAME_R10 HEX(58)
|
|
#define KTRAP_FRAME_R11 HEX(60)
|
|
#define KTRAP_FRAME_GsBase HEX(68)
|
|
#define KTRAP_FRAME_Xmm0 HEX(70)
|
|
#define KTRAP_FRAME_Xmm1 HEX(80)
|
|
#define KTRAP_FRAME_Xmm2 HEX(90)
|
|
#define KTRAP_FRAME_Xmm3 HEX(A0)
|
|
#define KTRAP_FRAME_Xmm4 HEX(B0)
|
|
#define KTRAP_FRAME_Xmm5 HEX(C0)
|
|
#define KTRAP_FRAME_FaultAddress HEX(D0)
|
|
#define KTRAP_FRAME_Dr0 HEX(D8)
|
|
#define KTRAP_FRAME_Dr1 HEX(E0)
|
|
#define KTRAP_FRAME_Dr2 HEX(E8)
|
|
#define KTRAP_FRAME_Dr3 HEX(F0)
|
|
#define KTRAP_FRAME_Dr6 HEX(F8)
|
|
#define KTRAP_FRAME_Dr7 HEX(100)
|
|
#define KTRAP_FRAME_DebugControl HEX(108)
|
|
#define KTRAP_FRAME_LastBranchToRip HEX(110)
|
|
#define KTRAP_FRAME_LastBranchFromRip HEX(118)
|
|
#define KTRAP_FRAME_LastExceptionToRip HEX(120)
|
|
#define KTRAP_FRAME_LastExceptionFromRip HEX(128)
|
|
#define KTRAP_FRAME_SegDs HEX(130)
|
|
#define KTRAP_FRAME_SegEs HEX(132)
|
|
#define KTRAP_FRAME_SegFs HEX(134)
|
|
#define KTRAP_FRAME_SegGs HEX(136)
|
|
#define KTRAP_FRAME_TrapFrame HEX(138)
|
|
#define KTRAP_FRAME_Rbx HEX(140)
|
|
#define KTRAP_FRAME_Rdi HEX(148)
|
|
#define KTRAP_FRAME_Rsi HEX(150)
|
|
#define KTRAP_FRAME_Rbp HEX(158)
|
|
#define KTRAP_FRAME_ErrorCode HEX(160)
|
|
#define KTRAP_FRAME_Rip HEX(168)
|
|
#define KTRAP_FRAME_SegCs HEX(170)
|
|
#define KTRAP_FRAME_Logging HEX(173)
|
|
#define KTRAP_FRAME_EFlags HEX(178)
|
|
#define KTRAP_FRAME_Rsp HEX(180)
|
|
#define KTRAP_FRAME_SegSs HEX(188)
|
|
#define KTRAP_FRAME_CodePatchCycle HEX(18c)
|
|
#define SIZE_KTRAP_FRAME HEX(190)
|
|
#define KTRAP_FRAME_ALIGN HEX(10)
|
|
#define KTRAP_FRAME_LENGTH HEX(190)
|
|
|
|
//
|
|
// CONTEXT Offsets
|
|
//
|
|
#define CONTEXT_P1Home 0
|
|
#define CONTEXT_P2Home HEX(08)
|
|
#define CONTEXT_P3Home HEX(10)
|
|
#define CONTEXT_P4Home HEX(18)
|
|
#define CONTEXT_P5Home HEX(20)
|
|
#define CONTEXT_P6Home HEX(28)
|
|
#define CONTEXT_ContextFlags HEX(30)
|
|
#define CONTEXT_MxCsr HEX(34)
|
|
#define CONTEXT_SegCs HEX(38)
|
|
#define CONTEXT_SegDs HEX(3a)
|
|
#define CONTEXT_SegEs HEX(3c)
|
|
#define CONTEXT_SegFs HEX(3e)
|
|
#define CONTEXT_SegGs HEX(40)
|
|
#define CONTEXT_SegSs HEX(42)
|
|
#define CONTEXT_EFlags HEX(44)
|
|
#define CONTEXT_Dr0 HEX(48)
|
|
#define CONTEXT_Dr1 HEX(50)
|
|
#define CONTEXT_Dr2 HEX(58)
|
|
#define CONTEXT_Dr3 HEX(60)
|
|
#define CONTEXT_Dr6 HEX(68)
|
|
#define CONTEXT_Dr7 HEX(70)
|
|
#define CONTEXT_Rax HEX(78)
|
|
#define CONTEXT_Rcx HEX(80)
|
|
#define CONTEXT_Rdx HEX(88)
|
|
#define CONTEXT_Rbx HEX(90)
|
|
#define CONTEXT_Rsp HEX(98)
|
|
#define CONTEXT_Rbp HEX(a0)
|
|
#define CONTEXT_Rsi HEX(a8)
|
|
#define CONTEXT_Rdi HEX(b0)
|
|
#define CONTEXT_R8 HEX(b8)
|
|
#define CONTEXT_R9 HEX(c0)
|
|
#define CONTEXT_R10 HEX(c8)
|
|
#define CONTEXT_R11 HEX(d0)
|
|
#define CONTEXT_R12 HEX(d8)
|
|
#define CONTEXT_R13 HEX(e0)
|
|
#define CONTEXT_R14 HEX(e8)
|
|
#define CONTEXT_R15 HEX(f0)
|
|
#define CONTEXT_Rip HEX(f8)
|
|
#define CONTEXT_Header HEX(100)
|
|
#define CONTEXT_Legacy HEX(120)
|
|
#define CONTEXT_Xmm0 HEX(1a0)
|
|
#define CONTEXT_Xmm1 HEX(1b0)
|
|
#define CONTEXT_Xmm2 HEX(1c0)
|
|
#define CONTEXT_Xmm3 HEX(1d0)
|
|
#define CONTEXT_Xmm4 HEX(1e0)
|
|
#define CONTEXT_Xmm5 HEX(1f0)
|
|
#define CONTEXT_Xmm6 HEX(200)
|
|
#define CONTEXT_Xmm7 HEX(210)
|
|
#define CONTEXT_Xmm8 HEX(220)
|
|
#define CONTEXT_Xmm9 HEX(230)
|
|
#define CONTEXT_Xmm10 HEX(240)
|
|
#define CONTEXT_Xmm11 HEX(250)
|
|
#define CONTEXT_Xmm12 HEX(260)
|
|
#define CONTEXT_Xmm13 HEX(270)
|
|
#define CONTEXT_Xmm14 HEX(280)
|
|
#define CONTEXT_Xmm15 HEX(290)
|
|
#define CONTEXT_VectorRegister HEX(300)
|
|
#define CONTEXT_VectorControl HEX(4a0)
|
|
#define CONTEXT_DebugControl HEX(4a8)
|
|
#define CONTEXT_LastBranchToRip HEX(4b0)
|
|
#define CONTEXT_LastBranchFromRip HEX(4b8)
|
|
#define CONTEXT_LastExceptionToRip HEX(4c0)
|
|
#define CONTEXT_LastExceptionFromRip HEX(4c8)
|
|
|
|
//
|
|
// KEXCEPTION_FRAME offsets
|
|
//
|
|
#define KEXCEPTION_FRAME_P1Home HEX(000)
|
|
#define KEXCEPTION_FRAME_P2Home HEX(008)
|
|
#define KEXCEPTION_FRAME_P3Home HEX(010)
|
|
#define KEXCEPTION_FRAME_P4Home HEX(018)
|
|
#define KEXCEPTION_FRAME_P5 HEX(020)
|
|
#define KEXCEPTION_FRAME_InitialStack HEX(028)
|
|
#define KEXCEPTION_FRAME_Xmm6 HEX(030)
|
|
#define KEXCEPTION_FRAME_Xmm7 HEX(040)
|
|
#define KEXCEPTION_FRAME_Xmm8 HEX(050)
|
|
#define KEXCEPTION_FRAME_Xmm9 HEX(060)
|
|
#define KEXCEPTION_FRAME_Xmm10 HEX(070)
|
|
#define KEXCEPTION_FRAME_Xmm11 HEX(080)
|
|
#define KEXCEPTION_FRAME_Xmm12 HEX(090)
|
|
#define KEXCEPTION_FRAME_Xmm13 HEX(0A0)
|
|
#define KEXCEPTION_FRAME_Xmm14 HEX(0B0)
|
|
#define KEXCEPTION_FRAME_Xmm15 HEX(0C0)
|
|
#define KEXCEPTION_FRAME_TrapFrame HEX(0D0)
|
|
#define KEXCEPTION_FRAME_CallbackStack HEX(0D8)
|
|
#define KEXCEPTION_FRAME_OutputBuffer HEX(0E0)
|
|
#define KEXCEPTION_FRAME_OutputLength HEX(0E8)
|
|
#define KEXCEPTION_FRAME_MxCsr HEX(0F0)
|
|
#define KEXCEPTION_FRAME_Rbp HEX(0F8)
|
|
#define KEXCEPTION_FRAME_Rbx HEX(100)
|
|
#define KEXCEPTION_FRAME_Rdi HEX(108)
|
|
#define KEXCEPTION_FRAME_Rsi HEX(110)
|
|
#define KEXCEPTION_FRAME_R12 HEX(118)
|
|
#define KEXCEPTION_FRAME_R13 HEX(120)
|
|
#define KEXCEPTION_FRAME_R14 HEX(128)
|
|
#define KEXCEPTION_FRAME_R15 HEX(130)
|
|
#define KEXCEPTION_FRAME_Return HEX(138)
|
|
#define SIZE_KEXCEPTION_FRAME HEX(140)
|
|
|
|
|
|
//
|
|
// EXCEPTION_RECORD Offsets
|
|
//
|
|
#define EXCEPTION_RECORD_ExceptionCode HEX(00)
|
|
#define EXCEPTION_RECORD_ExceptionFlags HEX(04)
|
|
#define EXCEPTION_RECORD_ExceptionRecord HEX(08)
|
|
#define EXCEPTION_RECORD_ExceptionAddress HEX(10)
|
|
#define EXCEPTION_RECORD_NumberParameters HEX(18)
|
|
#define EXCEPTION_RECORD_ExceptionInformation HEX(20)
|
|
#define SIZE_EXCEPTION_RECORD HEX(98)
|
|
|
|
//
|
|
// CR0
|
|
//
|
|
#define CR0_PE HEX(1)
|
|
#define CR0_MP HEX(2)
|
|
#define CR0_EM HEX(4)
|
|
#define CR0_TS HEX(8)
|
|
#define CR0_ET HEX(10)
|
|
#define CR0_NE HEX(20)
|
|
#define CR0_WP HEX(10000)
|
|
#define CR0_AM HEX(40000)
|
|
#define CR0_NW HEX(20000000)
|
|
#define CR0_CD HEX(40000000)
|
|
#define CR0_PG HEX(80000000)
|
|
|
|
/* Number of bytes reserved for syscall parameters */
|
|
#define MAX_SYSCALL_PARAM_SIZE (16 * 8)
|
|
|
|
#ifdef _ASM_
|
|
//
|
|
// CR4
|
|
//
|
|
#define CR4_VME HEX(1)
|
|
#define CR4_PVI HEX(2)
|
|
#define CR4_TSD HEX(4)
|
|
#define CR4_DE HEX(8)
|
|
#define CR4_PSE HEX(10)
|
|
#define CR4_PAE HEX(20)
|
|
#define CR4_MCE HEX(40)
|
|
#define CR4_PGE HEX(80)
|
|
#define CR4_FXSR HEX(200)
|
|
#define CR4_XMMEXCPT HEX(400)
|
|
#endif
|
|
|
|
//
|
|
// Generic Definitions
|
|
//
|
|
#define PRIMARY_VECTOR_BASE HEX(30)
|
|
#define MAXIMUM_IDTVECTOR HEX(FF)
|
|
|
|
//
|
|
// Usermode callout frame definitions
|
|
//
|
|
#define CBSTACK_STACK HEX(0)
|
|
#define CBSTACK_TRAP_FRAME HEX(8)
|
|
#define CBSTACK_CALLBACK_STACK HEX(10)
|
|
#define CBSTACK_RBP HEX(18)
|
|
#define CBSTACK_RESULT HEX(20)
|
|
#define CBSTACK_RESULT_LENGTH HEX(28)
|
|
|
|
|
|
/* Following ones are ASM only! ***********************************************/
|
|
|
|
#ifdef __ASM__
|
|
|
|
//
|
|
// PCR Access
|
|
//
|
|
#define PCR gs:
|
|
|
|
//
|
|
// EFLAGS
|
|
//
|
|
#define EFLAGS_TF HEX(100)
|
|
#define EFLAGS_INTERRUPT_MASK HEX(200)
|
|
#define EFLAGS_NESTED_TASK HEX(4000)
|
|
#define EFLAGS_V86_MASK HEX(20000)
|
|
#define EFLAGS_ALIGN_CHECK HEX(40000)
|
|
#define EFLAGS_VIF HEX(80000)
|
|
#define EFLAGS_VIP HEX(100000)
|
|
#define EFLAG_SIGN HEX(8000)
|
|
#define EFLAG_ZERO HEX(4000)
|
|
#define EFLAG_SELECT (EFLAG_SIGN + EFLAG_ZERO)
|
|
#define EFLAGS_USER_SANITIZE HEX(3F4DD7)
|
|
|
|
//
|
|
// Exception codes
|
|
//
|
|
#define EXCEPTION_DIVIDED_BY_ZERO HEX(00000)
|
|
#define EXCEPTION_DEBUG HEX(00001)
|
|
#define EXCEPTION_NMI HEX(00002)
|
|
#define EXCEPTION_INT3 HEX(00003)
|
|
#define EXCEPTION_BOUND_CHECK HEX(00005)
|
|
#define EXCEPTION_INVALID_OPCODE HEX(00006)
|
|
#define EXCEPTION_NPX_NOT_AVAILABLE HEX(00007)
|
|
#define EXCEPTION_DOUBLE_FAULT HEX(00008)
|
|
#define EXCEPTION_NPX_OVERRUN HEX(00009)
|
|
#define EXCEPTION_INVALID_TSS HEX(0000A)
|
|
#define EXCEPTION_SEGMENT_NOT_PRESENT HEX(0000B)
|
|
#define EXCEPTION_STACK_FAULT HEX(0000C)
|
|
#define EXCEPTION_GP_FAULT HEX(0000D)
|
|
#define EXCEPTION_RESERVED_TRAP HEX(0000F)
|
|
#define EXCEPTION_NPX_ERROR HEX(00010)
|
|
#define EXCEPTION_ALIGNMENT_CHECK HEX(00011)
|
|
|
|
//
|
|
// NTSTATUS values
|
|
//
|
|
#define STATUS_ACCESS_VIOLATION HEX(C0000005)
|
|
#define STATUS_IN_PAGE_ERROR HEX(C0000006)
|
|
#define STATUS_GUARD_PAGE_VIOLATION HEX(80000001)
|
|
#define STATUS_PRIVILEGED_INSTRUCTION HEX(C0000096)
|
|
#define STATUS_STACK_OVERFLOW HEX(C00000FD)
|
|
#define KI_EXCEPTION_ACCESS_VIOLATION HEX(10000004)
|
|
#define STATUS_INVALID_SYSTEM_SERVICE HEX(C000001C)
|
|
#define STATUS_NO_CALLBACK_ACTIVE HEX(C0000258)
|
|
#define STATUS_CALLBACK_POP_STACK HEX(C0000423)
|
|
#define STATUS_ARRAY_BOUNDS_EXCEEDED HEX(C000008C)
|
|
#define STATUS_ILLEGAL_INSTRUCTION HEX(C000001D)
|
|
#define STATUS_INVALID_LOCK_SEQUENCE HEX(C000001E)
|
|
#define STATUS_BREAKPOINT HEX(80000003)
|
|
#define STATUS_SINGLE_STEP HEX(80000004)
|
|
#define STATUS_INTEGER_DIVIDE_BY_ZERO HEX(C0000094)
|
|
#define STATUS_INTEGER_OVERFLOW HEX(C0000095)
|
|
#define STATUS_FLOAT_DENORMAL_OPERAND HEX(C000008D)
|
|
#define STATUS_FLOAT_DIVIDE_BY_ZERO HEX(C000008E)
|
|
#define STATUS_FLOAT_INEXACT_RESULT HEX(C000008F)
|
|
#define STATUS_FLOAT_INVALID_OPERATION HEX(C0000090)
|
|
#define STATUS_FLOAT_OVERFLOW HEX(C0000091)
|
|
#define STATUS_FLOAT_STACK_CHECK HEX(C0000092)
|
|
#define STATUS_FLOAT_UNDERFLOW HEX(C0000093)
|
|
#define STATUS_FLOAT_MULTIPLE_FAULTS HEX(C00002B4)
|
|
#define STATUS_FLOAT_MULTIPLE_TRAPS HEX(C00002B5)
|
|
#define STATUS_ASSERTION_FAILURE HEX(C0000420)
|
|
|
|
//
|
|
// Bugcheck Codes
|
|
//
|
|
#define APC_INDEX_MISMATCH HEX(01)
|
|
#define IRQL_NOT_GREATER_OR_EQUAL HEX(09)
|
|
#define IRQL_NOT_LESS_OR_EQUAL HEX(0A)
|
|
#define TRAP_CAUSE_UNKNOWN HEX(12)
|
|
#define KMODE_EXCEPTION_NOT_HANDLED HEX(13)
|
|
#define IRQL_GT_ZERO_AT_SYSTEM_SERVICE HEX(4A)
|
|
#define UNEXPECTED_KERNEL_MODE_TRAP HEX(7F)
|
|
#define ATTEMPTED_SWITCH_FROM_DPC HEX(B8)
|
|
#define HARDWARE_INTERRUPT_STORM HEX(F2)
|
|
|
|
//
|
|
// IRQL Levels
|
|
//
|
|
#define PASSIVE_LEVEL 0
|
|
#define LOW_LEVEL 0
|
|
#define APC_LEVEL 1
|
|
#define DISPATCH_LEVEL 2
|
|
#define CLOCK_LEVEL 13
|
|
#define IPI_LEVEL 14
|
|
#define POWER_LEVEL 14
|
|
#define PROFILE_LEVEL 15
|
|
#define HIGH_LEVEL 15
|
|
|
|
//
|
|
// Quantum Decrements
|
|
//
|
|
#define CLOCK_QUANTUM_DECREMENT HEX(3)
|
|
|
|
//
|
|
// Machine types
|
|
//
|
|
#define MACHINE_TYPE_ISA HEX(0000)
|
|
#define MACHINE_TYPE_EISA HEX(0001)
|
|
#define MACHINE_TYPE_MCA HEX(0002)
|
|
|
|
//
|
|
// Kernel Feature Bits
|
|
//
|
|
#define KF_RDTSC HEX(00000002)
|
|
|
|
//
|
|
// Kernel Stack Size
|
|
//
|
|
#define KERNEL_STACK_SIZE HEX(6000)
|
|
|
|
#endif // __ASM__
|
|
|
|
#endif // !_ASM_AMD64_H
|
|
|