/*++ NDK Version: 0095

Copyright (c) Alex Ionescu.  All rights reserved.

Header Name:

    asm.h

Abstract:

    ASM Offsets for dealing with de-referencing structures in registers.
    C-compatible version of the file ks386.inc present in the newest WDK.

Author:

    Alex Ionescu (alex.ionescu@reactos.com)   06-Oct-2004

--*/

#ifndef _ASM_X86_H
#define _ASM_X86_H

//
// PCR Access
//
#ifdef __ASM__
#ifdef CONFIG_SMP
#define PCR                                     fs:
#else
#define PCR                                     ds:[0xFFDFF000]
#endif
#endif

//
// CPU Modes
//
#define KernelMode                              0x0
#define UserMode                                0x1

//
// CPU Types
//
#define CPU_NONE                                0x0
#define CPU_INTEL                               0x1
#define CPU_AMD                                 0x2
#define CPU_CYRIX                               0x3
#define CPU_TRANSMETA                           0x4
#define CPU_CENTAUR                             0x5
#define CPU_RISE                                0x6
#define CPU_UNKNOWN                             0x7

//
// Selector Names
//
#ifdef __ASM__
#define RPL_MASK                                0x0003
#define MODE_MASK                               0x0001
#define KGDT_R0_CODE                            (0x8)
#define KGDT_R0_DATA                            (0x10)
#define KGDT_R3_CODE                            (0x18)
#define KGDT_R3_DATA                            (0x20)
#define KGDT_TSS                                (0x28)
#define KGDT_R0_PCR                             (0x30)
#define KGDT_R3_TEB                             (0x38)
#define KGDT_LDT                                (0x48)
#define KGDT_DF_TSS                             (0x50)
#define KGDT_NMI_TSS                            (0x58)
#endif

//
// TSS Offsets
//
#define KTSS_ESP0                               0x4
#define KTSS_CR3                                0x1C
#define KTSS_EIP                                0x20
#define KTSS_EFLAGS                             0x24
#define KTSS_EAX                                0x28
#define KTSS_ECX                                0x2C
#define KTSS_EDX                                0x30
#define KTSS_EBX                                0x34
#define KTSS_ESP                                0x38
#define KTSS_EBP                                0x3C
#define KTSS_ESI                                0x40
#define KTSS_EDI                                0x44
#define KTSS_ES                                 0x48
#define KTSS_CS                                 0x4C
#define KTSS_SS                                 0x50
#define KTSS_DS                                 0x54
#define KTSS_FS                                 0x58
#define KTSS_GS                                 0x5C
#define KTSS_LDT                                0x60
#define KTSS_IOMAPBASE                          0x66
#define KTSS_IO_MAPS                            0x68

//
// KTHREAD Offsets
//
#define KTHREAD_DEBUG_ACTIVE                    0x03
#define KTHREAD_INITIAL_STACK                   0x18
#define KTHREAD_STACK_LIMIT                     0x1C
#define KTHREAD_TEB                             0x74
#define KTHREAD_KERNEL_STACK                    0x20
#define KTHREAD_ALERTED                         0x5E
#define KTHREAD_APCSTATE_PROCESS                0x28 + 0x10
#define KTHREAD_PENDING_USER_APC                0x28 + 0x16
#define KTHREAD_PENDING_KERNEL_APC              0x28 + 0x15
#define KTHREAD_CONTEXT_SWITCHES                0x48
#define KTHREAD_STATE_                          0x4C
#define KTHREAD_NPX_STATE                       0x4D
#define KTHREAD_WAIT_IRQL                       0x4E
#define KTHREAD_NEXT_PROCESSOR                  0x40
#define KTHREAD_WAIT_REASON                     0x5A
#define KTHREAD_PRIORITY                        0x5B
#define KTHREAD_SWAP_BUSY                       0x5D
#define KTHREAD_SERVICE_TABLE                   0x118
#define KTHREAD_PREVIOUS_MODE                   0xD7
#define KTHREAD_COMBINED_APC_DISABLE            0x70
#define KTHREAD_SPECIAL_APC_DISABLE             0x72
#define KTHREAD_LARGE_STACK                     0x107
#define KTHREAD_TRAP_FRAME                      0x110
#define KTHREAD_CALLBACK_STACK                  0x114
#define KTHREAD_APC_STATE_INDEX                 0x11C
#define KTHREAD_STACK_BASE                      0x158
#define KTHREAD_QUANTUM                         0x15D
#define KTHREAD_KERNEL_TIME                     0x160
#define KTHREAD_USER_TIME                       0x18C

//
// KPROCESS Offsets
//
#define KPROCESS_DIRECTORY_TABLE_BASE           0x18
#define KPROCESS_LDT_DESCRIPTOR0                0x20
#define KPROCESS_LDT_DESCRIPTOR1                0x24
#define KPROCESS_INT21_DESCRIPTOR0              0x28
#define KPROCESS_INT21_DESCRIPTOR1              0x2C
#define KPROCESS_IOPM_OFFSET                    0x30
#define KPROCESS_ACTIVE_PROCESSORS              0x34
#define EPROCESS_VDM_OBJECTS                    0x144

//
// KTIMER_TABLE Offsets
//
#ifdef __ASM__
#define KTIMER_TABLE_ENTRY                      0x00
#define KTIMER_TABLE_TIME                       0x08
#define TIMER_ENTRY_SIZE                        0x10
#define TIMER_TABLE_SIZE                        0x200
#endif

//
// KPRCB Offsets
//
#define KPRCB_DR0                               0x2F8
#define KPRCB_DR1                               0x2FC
#define KPRCB_DR2                               0x300
#define KPRCB_DR3                               0x304
#define KPRCB_DR6                               0x308
#define KPRCB_DR7                               0x30C
#define KPRCB_TIMER_HAND                        0x964
#define KPRCB_TIMER_REQUEST                     0x968

//
// KPCR Offsets
//
#define KPCR_EXCEPTION_LIST                     0x0
#define KPCR_INITIAL_STACK                      0x4
#define KPCR_STACK_LIMIT                        0x8
#define KPCR_PERF_GLOBAL_GROUP_MASK             0x8
#define KPCR_CONTEXT_SWITCHES                   0x10
#define KPCR_SET_MEMBER_COPY                    0x14
#define KPCR_TEB                                0x18
#define KPCR_SELF                               0x1C
#define KPCR_PRCB                               0x20
#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_IDT                                0x38
#define KPCR_GDT                                0x3C
#define KPCR_TSS                                0x40
#define KPCR_STALL_SCALE_FACTOR                 0x4C
#define KPCR_SET_MEMBER                         0x48
#define KPCR_NUMBER                             0x51
#define KPCR_VDM_ALERT                          0x54
#define KPCR_PRCB_DATA                          0x120
#define KPCR_CURRENT_THREAD                     0x124
#define KPCR_PRCB_NEXT_THREAD                   0x128
#define KPCR_PRCB_IDLE_THREAD                   0x12C
#define KPCR_PROCESSOR_NUMBER                   0x130
#define KPCR_PRCB_SET_MEMBER                    0x134
#define KPCR_PRCB_CPU_TYPE                      0x138
#define KPCR_PRCB_PRCB_LOCK                     0xA7C
#define KPCR_NPX_THREAD                         0x640
#define KPCR_DR6                                0x428
#define KPCR_DR7                                0x42C
#define KPCR_PRCB_INTERRUPT_COUNT               0x644
#define KPCR_PRCB_KERNEL_TIME                   0x648
#define KPCR_PRCB_USER_TIME                     0x64C
#define KPCR_PRCB_DPC_TIME                      0x650
#define KPCR_PRCB_DEBUG_DPC_TIME                0x654
#define KPCR_PRCB_INTERRUPT_TIME                0x658
#define KPCR_PRCB_ADJUST_DPC_THRESHOLD          0x65C
#define KPCR_PRCB_SKIP_TICK                     0x664
#define KPCR_SYSTEM_CALLS                       0x6B8
#define KPCR_PRCB_DPC_QUEUE_DEPTH               0xA4C
#define KPCR_PRCB_DPC_COUNT                     0xA50
#define KPCR_PRCB_DPC_STACK                     0xA68
#define KPCR_PRCB_MAXIMUM_DPC_QUEUE_DEPTH       0xA6C
#define KPCR_PRCB_DPC_REQUEST_RATE              0xA70
#define KPCR_PRCB_DPC_INTERRUPT_REQUESTED       0xA78
#define KPCR_PRCB_DPC_ROUTINE_ACTIVE            0xA7A
#define KPCR_PRCB_DPC_LAST_COUNT                0xA80
#define KPCR_PRCB_TIMER_REQUEST                 0xA88
#define KPCR_PRCB_QUANTUM_END                   0xAA1
#define KPCR_PRCB_IDLE_SCHEDULE                 0xAA3
#define KPCR_PRCB_DEFERRED_READY_LIST_HEAD      0xC10
#define KPCR_PRCB_POWER_STATE_IDLE_FUNCTION     0xEC0

//
// KINTERRUPT Offsets
//
#define KINTERRUPT_INTERRUPT_LIST_HEAD          0x04
#define KINTERRUPT_SERVICE_ROUTINE              0x0C
#define KINTERRUPT_SERVICE_CONTEXT              0x10
#define KINTERRUPT_TICK_COUNT                   0x18
#define KINTERRUPT_ACTUAL_LOCK                  0x1C
#define KINTERRUPT_DISPATCH_ADDRESS             0x20
#define KINTERRUPT_VECTOR                       0x24
#define KINTERRUPT_IRQL                         0x28
#define KINTERRUPT_SYNCHRONIZE_IRQL             0x29
#define KINTERRUPT_DISPATCH_COUNT               0x38
#define KINTERRUPT_DISPATCH_CODE                0x3C

//
// KGDTENTRY Offsets
//
#define KGDT_BASE_LOW                           0x2
#define KGDT_BASE_MID                           0x4
#define KGDT_BASE_HI                            0x7
#define KGDT_LIMIT_HI                           0x6
#define KGDT_LIMIT_LOW                          0x0

//
// FPU Save Area Offsets
//
#define FP_CONTROL_WORD                         0x0
#define FP_STATUS_WORD                          0x4
#define FP_TAG_WORD                             0x8
#define FP_ERROR_OFFSET                         0xC
#define FP_ERROR_SELECTOR                       0x10
#define FP_DATA_OFFSET                          0x14
#define FP_DATA_SELECTOR                        0x18
#define FN_CR0_NPX_STATE                        0x20C
#define SIZEOF_FX_SAVE_AREA                     528
#define NPX_FRAME_LENGTH                        0x210

//
// FX Save Area Offsets
//
#define FX_CONTROL_WORD                         0x0
#define FX_STATUS_WORD                          0x2
#define FX_TAG_WORD                             0x4
#define FX_ERROR_OPCODE                         0x6
#define FX_ERROR_OFFSET                         0x8
#define FX_ERROR_SELECTOR                       0xC
#define FX_DATA_OFFSET                          0x10
#define FX_DATA_SELECTOR                        0x14
#define FX_MXCSR                                0x18

//
// NPX States
//
#define NPX_STATE_NOT_LOADED                    0xA
#define NPX_STATE_LOADED                        0x0

//
// Trap Frame Offsets
//
#define KTRAP_FRAME_DEBUGEBP                    0x0
#define KTRAP_FRAME_DEBUGEIP                    0x4
#define KTRAP_FRAME_DEBUGARGMARK                0x8
#define KTRAP_FRAME_DEBUGPOINTER                0xC
#define KTRAP_FRAME_TEMPCS                      0x10
#define KTRAP_FRAME_TEMPESP                     0x14
#define KTRAP_FRAME_DR0                         0x18
#define KTRAP_FRAME_DR1                         0x1C
#define KTRAP_FRAME_DR2                         0x20
#define KTRAP_FRAME_DR3                         0x24
#define KTRAP_FRAME_DR6                         0x28
#define KTRAP_FRAME_DR7                         0x2C
#define KTRAP_FRAME_GS                          0x30
#define KTRAP_FRAME_RESERVED1                   0x32
#define KTRAP_FRAME_ES                          0x34
#define KTRAP_FRAME_RESERVED2                   0x36
#define KTRAP_FRAME_DS                          0x38
#define KTRAP_FRAME_RESERVED3                   0x3A
#define KTRAP_FRAME_EDX                         0x3C
#define KTRAP_FRAME_ECX                         0x40
#define KTRAP_FRAME_EAX                         0x44
#define KTRAP_FRAME_PREVIOUS_MODE               0x48
#define KTRAP_FRAME_EXCEPTION_LIST              0x4C
#define KTRAP_FRAME_FS                          0x50
#define KTRAP_FRAME_RESERVED4                   0x52
#define KTRAP_FRAME_EDI                         0x54
#define KTRAP_FRAME_ESI                         0x58
#define KTRAP_FRAME_EBX                         0x5C
#define KTRAP_FRAME_EBP                         0x60
#define KTRAP_FRAME_ERROR_CODE                  0x64
#define KTRAP_FRAME_EIP                         0x68
#define KTRAP_FRAME_CS                          0x6C
#define KTRAP_FRAME_EFLAGS                      0x70
#define KTRAP_FRAME_ESP                         0x74
#define KTRAP_FRAME_SS                          0x78
#define KTRAP_FRAME_RESERVED5                   0x7A
#define KTRAP_FRAME_V86_ES                      0x7C
#define KTRAP_FRAME_RESERVED6                   0x7E
#define KTRAP_FRAME_V86_DS                      0x80
#define KTRAP_FRAME_RESERVED7                   0x82
#define KTRAP_FRAME_V86_FS                      0x84
#define KTRAP_FRAME_RESERVED8                   0x86
#define KTRAP_FRAME_V86_GS                      0x88
#define KTRAP_FRAME_RESERVED9                   0x8A
#define KTRAP_FRAME_SIZE                        0x8C
#define KTRAP_FRAME_LENGTH                      0x8C
#define KTRAP_FRAME_ALIGN                       0x04
#define FRAME_EDITED                            0xFFF8

//
// KUSER_SHARED_DATA Offsets
//
#ifdef __ASM__
#define USER_SHARED_DATA                        0xFFDF0000
#endif
#define USER_SHARED_DATA_INTERRUPT_TIME         0x8
#define USER_SHARED_DATA_SYSTEM_TIME            0x14
#define USER_SHARED_DATA_TICK_COUNT             0x320

//
// KUSER_SHARED_DATA Offsets (this stuff is trash)
//
#define KERNEL_USER_SHARED_DATA                 0x7FFE0000
#define KUSER_SHARED_PROCESSOR_FEATURES         KERNEL_USER_SHARED_DATA + 0x274
#define KUSER_SHARED_SYSCALL                    KERNEL_USER_SHARED_DATA + 0x300
#define KUSER_SHARED_SYSCALL_RET                KERNEL_USER_SHARED_DATA + 0x304
#define PROCESSOR_FEATURE_FXSR                  KUSER_SHARED_PROCESSOR_FEATURES + 0x4

//
// CONTEXT Offsets
//
#define CONTEXT_FLAGS                           0x0
#define CONTEXT_DR6                             0x14
#define CONTEXT_FLOAT_SAVE                      0x1C
#define CONTEXT_SEGGS                           0x8C
#define CONTEXT_SEGFS                           0x90
#define CONTEXT_SEGES                           0x94
#define CONTEXT_SEGDS                           0x98
#define CONTEXT_EDI                             0x9C
#define CONTEXT_ESI                             0xA0
#define CONTEXT_EBX                             0xA4
#define CONTEXT_EDX                             0xA8
#define CONTEXT_ECX                             0xAC
#define CONTEXT_EAX                             0xB0
#define CONTEXT_EBP                             0xB4
#define CONTEXT_EIP                             0xB8
#define CONTEXT_SEGCS                           0xBC
#define CONTEXT_EFLAGS                          0xC0
#define CONTEXT_ESP                             0xC4
#define CONTEXT_SEGSS                           0xC8
#define CONTEXT_FLOAT_SAVE_CONTROL_WORD         CONTEXT_FLOAT_SAVE + FP_CONTROL_WORD
#define CONTEXT_FLOAT_SAVE_STATUS_WORD          CONTEXT_FLOAT_SAVE + FP_STATUS_WORD
#define CONTEXT_FLOAT_SAVE_TAG_WORD             CONTEXT_FLOAT_SAVE + FP_TAG_WORD
#define CONTEXT_ALIGNED_SIZE                    0x2CC
#define CONTEXT_FRAME_LENGTH                    0x2D0

//
// CONTEXT Flags
//
#ifdef __ASM__
#define CONTEXT_CONTROL                         0x10001
#define CONTEXT_INTEGER                         0x10002
#define CONTEXT_SEGMENTS                        0x10004
#define CONTEXT_FLOATING_POINT                  0x10008
#define CONTEXT_DEBUG_REGISTERS                 0x10010
#define CONTEXT_FULL                            0x10007
#endif

//
// EXCEPTION_RECORD Offsets
//
#define EXCEPTION_RECORD_EXCEPTION_CODE         0x0
#define EXCEPTION_RECORD_EXCEPTION_FLAGS        0x4
#define EXCEPTION_RECORD_EXCEPTION_RECORD       0x8
#define EXCEPTION_RECORD_EXCEPTION_ADDRESS      0xC
#define EXCEPTION_RECORD_NUMBER_PARAMETERS      0x10
#define SIZEOF_EXCEPTION_RECORD                 0x14
#define EXCEPTION_RECORD_LENGTH                 0x50

//
// Exception types
//
#ifdef __ASM__
#define EXCEPTION_NONCONTINUABLE                0x0001
#define EXCEPTION_UNWINDING                     0x0002
#define EXCEPTION_EXIT_UNWIND                   0x0004
#define EXCEPTION_STACK_INVALID                 0x0008
#define EXCEPTION_NESTED_CALL                   0x00010
#define EXCEPTION_TARGET_UNWIND                 0x00020
#define EXCEPTION_COLLIDED_UNWIND               0x00040
#define EXCEPTION_UNWIND                        0x00066
#define EXCEPTION_EXECUTE_HANDLER               0x00001
#define EXCEPTION_CONTINUE_SEARCH               0x00000
#define EXCEPTION_CONTINUE_EXECUTION            0xFFFFFFFF
#define EXCEPTION_CHAIN_END                     0xFFFFFFFF
#endif

//
// TEB Offsets
//
#define TEB_EXCEPTION_LIST                      0x0
#define TEB_STACK_BASE                          0x4
#define TEB_STACK_LIMIT                         0x8
#define TEB_FIBER_DATA                          0x10
#define TEB_SELF                                0x18
#define TEB_PEB                                 0x30
#define TEB_EXCEPTION_CODE                      0x1A4
#define TEB_ACTIVATION_CONTEXT_STACK_POINTER    0x1A8
#define TEB_DEALLOCATION_STACK                  0xE0C
#define TEB_GDI_BATCH_COUNT                     0xF70
#define TEB_GUARANTEED_STACK_BYTES              0xF78
#define TEB_FLS_DATA                            0xFB4

//
// PEB Offsets
//
#define PEB_KERNEL_CALLBACK_TABLE               0x2C

//
// FIBER Offsets
//
#define FIBER_PARAMETER                         0x0
#define FIBER_EXCEPTION_LIST                    0x4
#define FIBER_STACK_BASE                        0x8
#define FIBER_STACK_LIMIT                       0xC
#define FIBER_DEALLOCATION_STACK                0x10
#define FIBER_CONTEXT                           0x14
#define FIBER_GUARANTEED_STACK_BYTES            0x2E0
#define FIBER_FLS_DATA                          0x2E4
#define FIBER_ACTIVATION_CONTEXT_STACK          0x2E8
#define FIBER_CONTEXT_FLAGS                     FIBER_CONTEXT + CONTEXT_FLAGS
#define FIBER_CONTEXT_EAX                       FIBER_CONTEXT + CONTEXT_EAX
#define FIBER_CONTEXT_EBX                       FIBER_CONTEXT + CONTEXT_EBX
#define FIBER_CONTEXT_ECX                       FIBER_CONTEXT + CONTEXT_ECX
#define FIBER_CONTEXT_EDX                       FIBER_CONTEXT + CONTEXT_EDX
#define FIBER_CONTEXT_ESI                       FIBER_CONTEXT + CONTEXT_ESI
#define FIBER_CONTEXT_EDI                       FIBER_CONTEXT + CONTEXT_EDI
#define FIBER_CONTEXT_EBP                       FIBER_CONTEXT + CONTEXT_EBP
#define FIBER_CONTEXT_EIP                       FIBER_CONTEXT + CONTEXT_EIP
#define FIBER_CONTEXT_ESP                       FIBER_CONTEXT + CONTEXT_ESP
#define FIBER_CONTEXT_DR6                       FIBER_CONTEXT + CONTEXT_DR6
#define FIBER_CONTEXT_FLOAT_SAVE_STATUS_WORD    FIBER_CONTEXT + CONTEXT_FLOAT_SAVE_STATUS_WORD
#define FIBER_CONTEXT_FLOAT_SAVE_CONTROL_WORD   FIBER_CONTEXT + CONTEXT_FLOAT_SAVE_CONTROL_WORD
#define FIBER_CONTEXT_FLOAT_SAVE_TAG_WORD       FIBER_CONTEXT + CONTEXT_FLOAT_SAVE_TAG_WORD

//
// EFLAGS
//
#ifdef __ASM__
#define EFLAGS_TF                               0x100
#define EFLAGS_INTERRUPT_MASK                   0x200
#define EFLAGS_IOPL                             0x3000
#define EFLAGS_NESTED_TASK                      0x4000
#define EFLAGS_V86_MASK                         0x20000
#define EFLAGS_ALIGN_CHECK                      0x40000
#define EFLAGS_VIF                              0x80000
#define EFLAGS_VIP                              0x100000
#define EFLAG_SIGN                              0x8000
#define EFLAG_ZERO                              0x4000
#define EFLAG_SELECT                            (EFLAG_SIGN + EFLAG_ZERO)
#endif
#define EFLAGS_USER_SANITIZE                    0x3F4DD7

//
// CR0
//
#define CR0_PE                                  0x1
#define CR0_MP                                  0x2
#define CR0_EM                                  0x4
#define CR0_TS                                  0x8
#define CR0_ET                                  0x10
#define CR0_NE                                  0x20
#define CR0_WP                                  0x10000
#define CR0_AM                                  0x40000
#define CR0_NW                                  0x20000000
#define CR0_CD                                  0x40000000
#define CR0_PG                                  0x80000000

//
// CR4
//
#ifdef __ASM__
#define CR4_VME                                 0x1
#define CR4_PVI                                 0x2
#define CR4_TSD                                 0x4
#define CR4_DE                                  0x8
#define CR4_PSE                                 0x10
#define CR4_PAE                                 0x20
#define CR4_MCE                                 0x40
#define CR4_PGE                                 0x80
#define CR4_FXSR                                0x200
#define CR4_XMMEXCPT                            0x400
#endif

//
// DR6 and 7 Masks
//
#define DR6_LEGAL                               0xE00F
#define DR7_LEGAL                               0xFFFF0155
#define DR7_ACTIVE                              0x55
#define DR7_OVERRIDE_V                          0x04
#define DR7_RESERVED_MASK                       0xDC00
#define DR7_OVERRIDE_MASK                       0xF0000

//
// Usermode callout frame definitions
//
#define CBSTACK_STACK                           0x0
#define CBSTACK_TRAP_FRAME                      0x4
#define CBSTACK_CALLBACK_STACK                  0x8
#define CBSTACK_EBP                             0x18
#define CBSTACK_RESULT                          0x20
#define CBSTACK_RESULT_LENGTH                   0x24

//
// NTSTATUS, Bugcheck Codes and Debug Codes
//
#ifdef __ASM__
#define STATUS_ACCESS_VIOLATION                 0xC0000005
#define STATUS_IN_PAGE_ERROR                    0xC0000006
#define STATUS_GUARD_PAGE_VIOLATION             0x80000001
#define STATUS_PRIVILEGED_INSTRUCTION           0xC0000096
#define STATUS_STACK_OVERFLOW                   0xC00000FD
#define KI_EXCEPTION_ACCESS_VIOLATION           0x10000004
#define STATUS_INVALID_SYSTEM_SERVICE           0xC000001C
#define STATUS_NO_CALLBACK_ACTIVE               0xC0000258
#define STATUS_CALLBACK_POP_STACK               0xC0000423
#define STATUS_ARRAY_BOUNDS_EXCEEDED            0xC000008C
#define STATUS_ILLEGAL_INSTRUCTION              0xC000001D
#define STATUS_INVALID_LOCK_SEQUENCE            0xC000001E
#define STATUS_BREAKPOINT                       0x80000003
#define STATUS_SINGLE_STEP                      0x80000004
#define STATUS_INTEGER_DIVIDE_BY_ZERO           0xC0000094
#define STATUS_INTEGER_OVERFLOW                 0xC0000095
#define STATUS_FLOAT_DENORMAL_OPERAND           0xC000008D
#define STATUS_FLOAT_DIVIDE_BY_ZERO             0xC000008E
#define STATUS_FLOAT_INEXACT_RESULT             0xC000008F
#define STATUS_FLOAT_INVALID_OPERATION          0xC0000090
#define STATUS_FLOAT_OVERFLOW                   0xC0000091
#define STATUS_FLOAT_STACK_CHECK                0xC0000092
#define STATUS_FLOAT_UNDERFLOW                  0xC0000093
#define STATUS_FLOAT_MULTIPLE_FAULTS            0xC00002B4
#define STATUS_FLOAT_MULTIPLE_TRAPS             0xC00002B5
#define STATUS_ASSERTION_FAILURE                0xC0000420
#define APC_INDEX_MISMATCH                      0x01
#define IRQL_NOT_GREATER_OR_EQUAL               0x09
#define IRQL_NOT_LESS_OR_EQUAL                  0x0A
#define TRAP_CAUSE_UNKNOWN                      0x12
#define KMODE_EXCEPTION_NOT_HANDLED             0x13
#define IRQL_GT_ZERO_AT_SYSTEM_SERVICE          0x4A
#define UNEXPECTED_KERNEL_MODE_TRAP             0x7F
#define ATTEMPTED_SWITCH_FROM_DPC               0xB8
#define HARDWARE_INTERRUPT_STORM                0xF2
#define DBG_STATUS_CONTROL_C                    0x01

//
// DebugService Control Types
//
#define BREAKPOINT_BREAK                        0x0

//
// IRQL Levels
//
#define PASSIVE_LEVEL                           0x0
#define APC_LEVEL                               0x1
#define DISPATCH_LEVEL                          0x2
#define PROFILE_LEVEL                           0x1B
#define CLOCK2_LEVEL                            0x1C
#define IPI_LEVEL                               0x1D
#define HIGH_LEVEL                              0x1F

//
// Synchronization-level IRQL
//
#ifndef CONFIG_SMP
#define SYNCH_LEVEL                             DISPATCH_LEVEL
#else
#if (NTDDI_VERSION < NTDDI_WS03)
#define SYNCH_LEVEL                             (IPI_LEVEL - 0x1)
#else
#define SYNCH_LEVEL                             (IPI_LEVEL - 0x2)
#endif
#endif

//
// Quantum Decrements
//
#define CLOCK_QUANTUM_DECREMENT                 0x3
#endif

//
// System Call Table definitions
//
#define NUMBER_SERVICE_TABLES                   0x0002
#define SERVICE_NUMBER_MASK                     0x0FFF
#define SERVICE_TABLE_SHIFT                     0x0008
#define SERVICE_TABLE_MASK                      0x0010
#define SERVICE_TABLE_TEST                      0x0010
#define SERVICE_DESCRIPTOR_BASE                 0x0000
#define SERVICE_DESCRIPTOR_COUNT                0x0004
#define SERVICE_DESCRIPTOR_LIMIT                0x0008
#define SERVICE_DESCRIPTOR_NUMBER               0x000C
#define SERVICE_DESCRIPTOR_LENGTH               0x0010

//
// Exception codes
//
#define EXCEPTION_DIVIDED_BY_ZERO               0
#define EXCEPTION_DEBUG                         1
#define EXCEPTION_NMI                           2
#define EXCEPTION_INT3                          3
#define EXCEPTION_BOUND_CHECK                   5
#define EXCEPTION_INVALID_OPCODE                6
#define EXCEPTION_NPX_NOT_AVAILABLE             7
#define EXCEPTION_DOUBLE_FAULT                  8
#define EXCEPTION_NPX_OVERRUN                   9
#define EXCEPTION_INVALID_TSS                   0x0A
#define EXCEPTION_SEGMENT_NOT_PRESENT           0x0B
#define EXCEPTION_STACK_FAULT                   0x0C
#define EXCEPTION_GP_FAULT                      0x0D
#define EXCEPTION_RESERVED_TRAP                 0x0F
#define EXCEPTION_NPX_ERROR                     0x010
#define EXCEPTION_ALIGNMENT_CHECK               0x011

//
// VDM State Pointer
//
#define FIXED_NTVDMSTATE_LINEAR_PC_AT           0x714

//
// Machine types
//
#ifdef __ASM__
#define MACHINE_TYPE_ISA                        0x0000
#define MACHINE_TYPE_EISA                       0x0001
#define MACHINE_TYPE_MCA                        0x0002

//
// Kernel Feature Bits
//
#define KF_RDTSC                                0x00000002

//
// Kernel Stack Size
//
#define KERNEL_STACK_SIZE                       0x3000
#endif

//
// Generic Definitions
//
#define PRIMARY_VECTOR_BASE                     0x30 // FIXME: HACK
#define MAXIMUM_IDTVECTOR                       0xFF
#endif // !_ASM_X86_H
