ReactOS 0.4.16-dev-732-g2d1144a
ke.h
Go to the documentation of this file.
1#pragma once
2
3#ifndef __ASM__
4
5#include "intrin_i.h"
6
7#ifdef __cplusplus
8extern "C"
9{
10#endif
11
12//
13// Thread Dispatcher Header DebugActive Mask
14//
15#define DR_MASK(x) (1 << (x))
16#define DR_REG_MASK 0x4F
17
18//
19// INT3 is 1 byte long
20//
21#define KD_BREAKPOINT_TYPE UCHAR
22#define KD_BREAKPOINT_SIZE sizeof(UCHAR)
23#define KD_BREAKPOINT_VALUE 0xCC
24
25/* CPUID 1 - ECX flags */
26#define X86_FEATURE_SSE3 0x00000001
27#define X86_FEATURE_SSSE3 0x00000200
28#define X86_FEATURE_SSE4_1 0x00080000
29#define X86_FEATURE_SSE4_2 0x00100000
30#define X86_FEATURE_XSAVE 0x04000000
31#define X86_FEATURE_RDRAND 0x40000000
32
33/* CPUID 1 - EDX flags */
34#define X86_FEATURE_FPU 0x00000001 /* x87 FPU is present */
35#define X86_FEATURE_VME 0x00000002 /* Virtual 8086 Extensions are present */
36#define X86_FEATURE_DBG 0x00000004 /* Debugging extensions are present */
37#define X86_FEATURE_PSE 0x00000008 /* Page Size Extension is present */
38#define X86_FEATURE_TSC 0x00000010 /* Time Stamp Counters are present */
39#define X86_FEATURE_PAE 0x00000040 /* Physical Address Extension is present */
40#define X86_FEATURE_CX8 0x00000100 /* CMPXCHG8B instruction present */
41#define X86_FEATURE_APIC 0x00000200 /* APIC is present */
42#define X86_FEATURE_SYSCALL 0x00000800 /* SYSCALL/SYSRET support present */
43#define X86_FEATURE_MTTR 0x00001000 /* Memory type range registers are present */
44#define X86_FEATURE_PGE 0x00002000 /* Page Global Enable */
45#define X86_FEATURE_CMOV 0x00008000 /* "Conditional move" instruction supported */
46#define X86_FEATURE_PAT 0x00010000 /* Page Attribute Table is supported */
47#define X86_FEATURE_DS 0x00200000 /* Debug Store is present */
48#define X86_FEATURE_MMX 0x00800000 /* MMX extension present */
49#define X86_FEATURE_FXSR 0x01000000 /* FXSAVE/FXRSTOR instructions present */
50#define X86_FEATURE_SSE 0x02000000 /* SSE extension present */
51#define X86_FEATURE_SSE2 0x04000000 /* SSE2 extension present */
52#define X86_FEATURE_HT 0x10000000 /* Hyper-Threading present */
53
54/* CPUID 0x80000001 - EDX extended flags */
55#define X86_FEATURE_NX 0x00100000 /* NX support present */
56
57//
58// One-liners for getting and setting special purpose registers in portable code
59//
63{
64 return Context->Eip;
65}
66
68VOID
70{
71 Context->Eip = ProgramCounter;
72}
73
77{
78 return Context->Eax;
79}
80
82VOID
84{
85 Context->Eax = ReturnValue;
86}
87
91{
92 return Context->Ebp;
93}
94
96VOID
98{
99 Context->Ebp = Frame;
100}
101
105{
106 return TrapFrame->Eip;
107}
108
112{
113 return (PKTRAP_FRAME)TrapFrame->Edx;
114}
115
116
120{
121 if (TrapFrame->PreviousPreviousMode == KernelMode)
122 return TrapFrame->TempEsp;
123 return TrapFrame->HardwareEsp;
124}
125
129{
130 return TrapFrame->Ebp;
131}
132
133//
134// Macro to get trap and exception frame from a thread stack
135//
136#define KeGetTrapFrame(Thread) \
137 (PKTRAP_FRAME)((ULONG_PTR)((Thread)->InitialStack) - \
138 sizeof(KTRAP_FRAME) - \
139 sizeof(FX_SAVE_AREA))
140
141#define KeGetExceptionFrame(Thread) \
142 NULL
143
144//
145// Macro to get context switches from the PRCB
146// All architectures but x86 have it in the PRCB's KeContextSwitches
147//
148#define KeGetContextSwitches(Prcb) \
149 CONTAINING_RECORD(Prcb, KIPCR, PrcbData)->ContextSwitches
150
151//
152// Macro to get the second level cache size field name which differs between
153// CISC and RISC architectures, as the former has unified I/D cache
154//
155#define KiGetSecondLevelDCacheSize() ((PKIPCR)KeGetPcr())->SecondLevelCacheSize
156
157//
158// Returns the Interrupt State from a Trap Frame.
159// ON = TRUE, OFF = FALSE
160//
161#define KeGetTrapFrameInterruptState(TrapFrame) \
162 BooleanFlagOn((TrapFrame)->EFlags, EFLAGS_INTERRUPT_MASK)
163
164//
165// Flags for exiting a trap
166//
167#define KTE_SKIP_PM_BIT (((KTRAP_EXIT_SKIP_BITS) { { .SkipPreviousMode = TRUE } }).Bits)
168#define KTE_SKIP_SEG_BIT (((KTRAP_EXIT_SKIP_BITS) { { .SkipSegments = TRUE } }).Bits)
169#define KTE_SKIP_VOL_BIT (((KTRAP_EXIT_SKIP_BITS) { { .SkipVolatiles = TRUE } }).Bits)
170
172{
173 struct
174 {
179 };
182
183
184//
185// Flags used by the VDM/V8086 emulation engine for determining instruction prefixes
186//
187#define PFX_FLAG_ES 0x00000100
188#define PFX_FLAG_CS 0x00000200
189#define PFX_FLAG_SS 0x00000400
190#define PFX_FLAG_DS 0x00000800
191#define PFX_FLAG_FS 0x00001000
192#define PFX_FLAG_GS 0x00002000
193#define PFX_FLAG_OPER32 0x00004000
194#define PFX_FLAG_ADDR32 0x00008000
195#define PFX_FLAG_LOCK 0x00010000
196#define PFX_FLAG_REPNE 0x00020000
197#define PFX_FLAG_REP 0x00040000
198
199//
200// VDM Helper Macros
201//
202// All VDM/V8086 opcode emulators have the same FASTCALL function definition.
203// We need to keep 2 parameters while the original ASM implementation uses 4:
204// TrapFrame, PrefixFlags, Eip, InstructionSize;
205//
206// We pass the trap frame, and prefix flags, in our two parameters.
207//
208// We then realize that since the smallest prefix flag is 0x100, this gives us
209// a count of up to 0xFF. So we OR in the instruction size with the prefix flags
210//
211// We further realize that we always have access to EIP from the trap frame, and
212// that if we want the *current instruction* EIP, we simply have to add the
213// instruction size *MINUS ONE*, and that gives us the EIP we should be looking
214// at now, so we don't need to use the stack to push this parameter.
215//
216// We actually only care about the *current instruction* EIP in one location,
217// so although it may be slightly more expensive to re-calculate the EIP one
218// more time, this way we don't redefine ALL opcode handlers to have 3 parameters,
219// which would be forcing stack usage in all other scenarios.
220//
221#define KiVdmSetVdmEFlags(x) InterlockedOr((PLONG)KiNtVdmState, (x));
222#define KiVdmClearVdmEFlags(x) InterlockedAnd((PLONG)KiNtVdmState, ~(x))
223#define KiCallVdmHandler(x) KiVdmOpcode##x(TrapFrame, Flags)
224#define KiCallVdmPrefixHandler(x) KiVdmOpcodePrefix(TrapFrame, Flags | x)
225#define KiVdmUnhandledOpcode(x) \
226 BOOLEAN \
227 FASTCALL \
228 KiVdmOpcode##x(IN PKTRAP_FRAME TrapFrame, \
229 IN ULONG Flags) \
230 { \
231 /* Not yet handled */ \
232 UNIMPLEMENTED_DBGBREAK(); \
233 return FALSE; \
234 }
235
237
238//
239// Local parameters
240//
241typedef struct _KV86_FRAME
242{
247
248//
249// Virtual Stack Frame
250//
252{
257
258//
259// Large Pages Support
260//
262{
269
270//
271// Floating Point Internal Context Structure
272//
274{
280
281/* Diable interrupts and return whether they were enabled before */
285{
286 ULONG Flags;
287 BOOLEAN Return;
288
289 /* Get EFLAGS and check if the interrupt bit is set */
291 Return = (Flags & EFLAGS_INTERRUPT_MASK) ? TRUE: FALSE;
292
293 /* Disable interrupts */
294 _disable();
295 return Return;
296}
297
298/* Restore previous interrupt state */
300VOID
302{
303 if (WereEnabled) _enable();
304}
305
306//
307// Registers an interrupt handler with an IDT vector
308//
310VOID
313{
314 UCHAR Entry;
316 PKIPCR Pcr = (PKIPCR)KeGetPcr();
317
318 //
319 // Get the entry from the HAL
320 //
323
324 //
325 // Now set the data
326 //
327 Pcr->IDT[Entry].ExtendedOffset = (USHORT)(Address >> 16);
328 Pcr->IDT[Entry].Offset = (USHORT)Address;
329}
330
331//
332// Returns the registered interrupt handler for a given IDT vector
333//
335PVOID
337{
338 PKIPCR Pcr = (PKIPCR)KeGetPcr();
339 UCHAR Entry;
340
341 //
342 // Get the entry from the HAL
343 //
345
346 //
347 // Read the entry from the IDT
348 //
349 return (PVOID)(((Pcr->IDT[Entry].ExtendedOffset << 16) & 0xFFFF0000) |
350 (Pcr->IDT[Entry].Offset & 0xFFFF));
351}
352
353//
354// Invalidates the TLB entry for a specified address
355//
357VOID
359{
360 /* Invalidate the TLB entry for this address */
362}
363
365VOID
367{
368 /* Flush the TLB by resetting CR3 */
370}
371
373VOID
375 IN SIZE_T FlushSize)
376{
377 //
378 // Always sweep the whole cache
379 //
381 UNREFERENCED_PARAMETER(FlushSize);
382 __wbinvd();
383}
384
388{
389 /* Return the current thread */
390 return ((PKIPCR)KeGetPcr())->PrcbData.CurrentThread;
391}
392
394VOID
396{
397 /* Check if this is the NPX Thread */
398 if (KeGetCurrentPrcb()->NpxThread == Thread)
399 {
400 /* Clear it */
401 KeGetCurrentPrcb()->NpxThread = NULL;
402 Ke386FnInit();
403 }
404}
405
406CODE_SEG("INIT")
407VOID
408NTAPI
409KiInitializePcr(IN ULONG ProcessorNumber,
410 IN PKIPCR Pcr,
411 IN PKIDTENTRY Idt,
412 IN PKGDTENTRY Gdt,
413 IN PKTSS Tss,
414 IN PKTHREAD IdleThread,
415 IN PVOID DpcStack);
416
418VOID
420{
421 GdtEntry->BaseLow = (USHORT)((ULONG_PTR)BaseAddress & 0xFFFF);
422 GdtEntry->HighWord.Bytes.BaseMid = (UCHAR)((ULONG_PTR)BaseAddress >> 16);
423 GdtEntry->HighWord.Bytes.BaseHi = (UCHAR)((ULONG_PTR)BaseAddress >> 24);
424}
425
427VOID
428KiSetTebBase(PKPCR Pcr, PNT_TIB TebAddress)
429{
430 Pcr->NtTib.Self = TebAddress;
431 Ke386SetGdtEntryBase(&Pcr->GDT[KGDT_R3_TEB / sizeof(KGDTENTRY)], TebAddress);
432}
433
434CODE_SEG("INIT")
435VOID
438 IN PKTSS Tss,
439 IN PKIDTENTRY Idt,
440 IN PKGDTENTRY Gdt
441);
442
443CODE_SEG("INIT")
444VOID
445NTAPI
447
448CODE_SEG("INIT")
449VOID
450NTAPI
452
453CODE_SEG("INIT")
455NTAPI
457 VOID
458);
459
460CODE_SEG("INIT")
462NTAPI
464 VOID
465);
466
467CODE_SEG("INIT")
468VOID
469NTAPI
471
472CODE_SEG("INIT")
474NTAPI
476
477#if DBG
478CODE_SEG("INIT")
479VOID
480KiReportCpuFeatures(VOID);
481#endif
482
483VOID
484NTAPI
486
488NTAPI
493);
494
495VOID
496NTAPI
498 IN FLOATING_SAVE_AREA *SaveArea
499);
500
501VOID
502NTAPI
504 IN PKTRAP_FRAME TrapFrame
505);
506
507VOID
508NTAPI
510 OUT PTEB VdmTeb
511);
512
513CODE_SEG("INIT")
514VOID
515NTAPI
517 VOID
518);
519
520CODE_SEG("INIT")
522NTAPI
525);
526
527CODE_SEG("INIT")
529NTAPI
532);
533
535NTAPI
537 IN PLARGE_IDENTITY_MAP IdentityMap,
538 IN PVOID StartPtr,
540);
541
542VOID
543NTAPI
545 IN PLARGE_IDENTITY_MAP IdentityMap
546);
547
548VOID
549NTAPI
551 IN ULONG_PTR StartAddress,
552 IN ULONG Cr3
553);
554
555CODE_SEG("INIT")
556VOID
557NTAPI
559 VOID
560);
561
562CODE_SEG("INIT")
563VOID
564NTAPI
566 VOID
567);
568
569CODE_SEG("INIT")
570VOID
571NTAPI
573 IN BOOLEAN FinalCpu
574);
575
576CODE_SEG("INIT")
577VOID
578NTAPI
580 VOID
581);
582
583CODE_SEG("INIT")
584VOID
585NTAPI
587 VOID
588);
589
590CODE_SEG("INIT")
592NTAPI
595);
596
597CODE_SEG("INIT")
599NTAPI
602);
603
604CODE_SEG("INIT")
606NTAPI
609);
610
612NTAPI
614 IN PKTRAP_FRAME TrapFrame
615);
616
618NTAPI
620 _In_ PKTRAP_FRAME TrapFrame
621);
622
626 IN PKTRAP_FRAME TrapFrame,
628);
629
633 IN PKTRAP_FRAME TrapFrame
634);
635
637VOID
640 IN PKTRAP_FRAME TrapFrame
641);
642
643VOID
646 IN PKTRAP_FRAME TrapFrame
647);
648
652 IN PKTRAP_FRAME TrapFrame
653);
654
656VOID
657NTAPI
660 IN ULONG Flags,
662 IN ULONG ParameterCount,
663 IN ULONG_PTR Parameter1,
664 IN ULONG_PTR Parameter2,
665 IN ULONG_PTR Parameter3,
666 IN PKTRAP_FRAME TrapFrame
667);
668
670NTAPI
672 VOID
673);
674
676VOID
679 IN PKTRAP_FRAME TrapFrame,
681);
682
684VOID
687 IN PKTRAP_FRAME TrapFrame
688);
689
692VOID
694 _In_ PKTRAP_FRAME TrapFrame,
695 _In_ PKEXCEPTION_FRAME ExceptionFrame)
696{
697 KiServiceExit2(TrapFrame);
698}
699
700//
701// Global x86 only Kernel data
702//
713extern ULONG KiMXCsrMask;
714extern ULONG KeI386CpuType;
715extern ULONG KeI386CpuStep;
728extern CHAR KiSystemCallExit[];
729extern CHAR KiSystemCallExit2[];
730
731//
732// Trap Macros
733//
734#include "trap_x.h"
735
736//
737// Returns a thread's FPU save area
738//
742{
743 ASSERT((ULONG_PTR)Thread->InitialStack % 16 == 0);
744 return (PFX_SAVE_AREA)((ULONG_PTR)Thread->InitialStack - sizeof(FX_SAVE_AREA));
745}
746
747//
748// Sanitizes a selector
749//
751ULONG
754{
755 //
756 // Check if we're in kernel-mode, and force CPL 0 if so.
757 // Otherwise, force CPL 3.
758 //
759 return ((Mode == KernelMode) ?
760 (Cs & (0xFFFF & ~RPL_MASK)) :
761 (RPL_MASK | (Cs & 0xFFFF)));
762}
763
764//
765// Sanitizes EFLAGS
766//
768ULONG
771{
772 //
773 // Check if we're in kernel-mode, and sanitize EFLAGS if so.
774 // Otherwise, also force interrupt mask on.
775 //
776 return ((Mode == KernelMode) ?
779}
780
781//
782// Sanitizes a Debug Register
783//
785PVOID
788{
789 //
790 // Check if we're in kernel-mode, and return the address directly if so.
791 // Otherwise, make sure it's not inside the kernel-mode address space.
792 // If it is, then clear the address.
793 //
794 return ((Mode == KernelMode) ? DrAddress :
795 (DrAddress <= MM_HIGHEST_USER_ADDRESS) ? DrAddress : 0);
796}
797
798//
799// Exception with no arguments
800//
803VOID
806 IN PKTRAP_FRAME TrapFrame)
807{
808 /* Helper for exceptions with no arguments */
809 KiDispatchExceptionFromTrapFrame(Code, 0, Address, 0, 0, 0, 0, TrapFrame);
810}
811
812//
813// Exception with one argument
814//
817VOID
820 IN ULONG P1,
821 IN PKTRAP_FRAME TrapFrame)
822{
823 /* Helper for exceptions with no arguments */
824 KiDispatchExceptionFromTrapFrame(Code, 0, Address, 1, P1, 0, 0, TrapFrame);
825}
826
827//
828// Exception with two arguments
829//
832VOID
835 IN ULONG P1,
836 IN ULONG P2,
837 IN PKTRAP_FRAME TrapFrame)
838{
839 /* Helper for exceptions with no arguments */
840 KiDispatchExceptionFromTrapFrame(Code, 0, Address, 2, P1, P2, 0, TrapFrame);
841}
842
843//
844// Performs a system call
845//
847NTAPI
849 _In_ PVOID Arguments,
850 _In_ ULONG StackBytes);
851
852
853//
854// Checks for pending APCs
855//
857VOID
859{
862
863 /* Check for V8086 or user-mode trap */
864 if ((TrapFrame->EFlags & EFLAGS_V86_MASK) || (KiUserTrap(TrapFrame)))
865 {
866 /* Get the thread */
868 while (TRUE)
869 {
870 /* Turn off the alerted state for kernel mode */
871 Thread->Alerted[KernelMode] = FALSE;
872
873 /* Are there pending user APCs? */
874 if (!Thread->ApcState.UserApcPending) break;
875
876 /* Raise to APC level and enable interrupts */
878 _enable();
879
880 /* Deliver APCs */
881 KiDeliverApc(UserMode, NULL, TrapFrame);
882
883 /* Restore IRQL and disable interrupts once again */
885 _disable();
886 }
887 }
888}
889
890//
891// Switches from boot loader to initial kernel stack
892//
893CODE_SEG("INIT")
896VOID
898{
900
901 /* We have to switch to a new stack before continuing kernel initialization */
902#ifdef __GNUC__
903 __asm__
904 (
905 "movl %0, %%esp\n\t"
906 "subl %1, %%esp\n\t"
907 "pushl %2\n\t"
908 "jmp _KiSystemStartupBootStack@0"
909 :
910 : "c"(InitialStack),
912 "i"(CR0_EM | CR0_TS | CR0_MP),
914 : "%esp"
915 );
916#elif defined(_MSC_VER)
917 __asm
918 {
919 mov esp, InitialStack
923 }
924#else
925#error Unknown Compiler
926#endif
927
929}
930
931//
932// Emits the iret instruction for C code
933//
936VOID
938{
939#if defined(__GNUC__)
940 __asm__ __volatile__
941 (
942 "iret"
943 );
944#elif defined(_MSC_VER)
945 __asm
946 {
947 iretd
948 }
949#else
950#error Unsupported compiler
951#endif
953}
954
955//
956// Normally this is done by the HAL, but on x86 as an optimization, the kernel
957// initiates the end by calling back into the HAL and exiting the trap here.
958//
960VOID
962 IN PKTRAP_FRAME TrapFrame)
963{
964 /* Disable interrupts and end the interrupt */
965 _disable();
966 HalEndSystemInterrupt(Irql, TrapFrame);
967
968 /* Exit the interrupt */
969 KiEoiHelper(TrapFrame);
970}
971
972//
973// PERF Code
974//
976VOID
978{
981 DbgPrint("Boot took %I64u cycles!\n", BootCyclesEnd - BootCycles);
982 DbgPrint("Interrupts: %u System Calls: %u Context Switches: %u\n",
983 KeGetCurrentPrcb()->InterruptCount,
984 KeGetCurrentPrcb()->KeSystemCalls,
986}
987
989PULONG
991{
992 return &(KeGetCurrentThread()->TrapFrame->HardwareEsp);
993}
994
995#ifdef __cplusplus
996} // extern "C"
997#endif
998
999#endif
#define CODE_SEG(...)
unsigned char BOOLEAN
#define EFLAGS_INTERRUPT_MASK
Definition: SystemCall.c:11
#define __cdecl
Definition: accygwin.h:79
UINT32 void void ** ReturnValue
Definition: acevents.h:216
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn UINT32 *TableIdx UINT32 ACPI_TABLE_HEADER *OutTableHeader ACPI_TABLE_HEADER **OutTable ACPI_HANDLE UINT32 ACPI_WALK_CALLBACK ACPI_WALK_CALLBACK void void **ReturnValue UINT32 ACPI_BUFFER *RetPathPtr ACPI_OBJECT_HANDLER Handler
Definition: acpixf.h:672
DECLSPEC_NORETURN VOID NTAPI KiSystemStartupBootStack(VOID)
Definition: krnlinit.c:142
#define MM_HIGHEST_USER_ADDRESS
Definition: armddk.h:17
LONG NTSTATUS
Definition: precomp.h:26
_Out_ PKIRQL Irql
Definition: csq.h:179
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define ULONG_PTR
Definition: config.h:101
#define PtrToUlong(u)
Definition: config.h:107
UCHAR KIRQL
Definition: env_spec_w32.h:591
#define APC_LEVEL
Definition: env_spec_w32.h:695
_In_opt_ PFILE_OBJECT _In_opt_ PETHREAD Thread
Definition: fltkernel.h:2653
Status
Definition: gdiplustypes.h:25
VOID NTAPI HalEndSystemInterrupt(IN KIRQL OldIrql, IN PKTRAP_FRAME TrapFrame)
Definition: pic.c:335
VOID FASTCALL KfLowerIrql(IN KIRQL NewIrql)
Definition: pic.c:232
KIRQL FASTCALL KfRaiseIrql(IN KIRQL NewIrql)
Definition: pic.c:187
#define DbgPrint
Definition: hal.h:12
#define KeGetCurrentThread
Definition: hal.h:55
_In_ ULONG Mode
Definition: hubbusif.h:303
void __cdecl _disable(void)
Definition: intrin_arm.h:365
void __cdecl _enable(void)
Definition: intrin_arm.h:373
PPC_QUAL void __wbinvd(void)
Definition: intrin_ppc.h:759
PPC_QUAL unsigned long long __rdtsc(void)
Definition: intrin_ppc.h:688
__INTRIN_INLINE unsigned long __readcr3(void)
Definition: intrin_x86.h:1832
__INTRIN_INLINE uintptr_t __readeflags(void)
Definition: intrin_x86.h:1688
__INTRIN_INLINE void __invlpg(void *Address)
Definition: intrin_x86.h:1982
__INTRIN_INLINE void __writecr3(unsigned int Data)
Definition: intrin_x86.h:1808
#define C_ASSERT(e)
Definition: intsafe.h:73
#define ASSERT(a)
Definition: mode.c:44
unsigned __int64 ULONG64
Definition: imports.h:198
#define EFLAGS_USER_SANITIZE
Definition: ketypes.h:202
#define EFLAGS_V86_MASK
Definition: ketypes.h:197
#define CR0_MP
Definition: ketypes.h:135
#define CR0_EM
Definition: ketypes.h:136
FORCEINLINE struct _KPRCB * KeGetCurrentPrcb(VOID)
Definition: ketypes.h:1182
struct _KIPCR * PKIPCR
#define MAXIMUM_IDTVECTOR
Definition: ketypes.h:341
#define RPL_MASK
Definition: ketypes.h:119
#define CR0_TS
Definition: ketypes.h:137
#define HalVectorToIDTEntry
Definition: halfuncs.h:51
#define KernelMode
Definition: asm.h:38
#define NPX_FRAME_LENGTH
Definition: asm.h:247
#define UserMode
Definition: asm.h:39
#define KTRAP_FRAME_LENGTH
Definition: asm.h:316
#define KTRAP_FRAME_ALIGN
Definition: asm.h:317
#define KGDT_R3_TEB
Definition: ketypes.h:129
#define KeGetPcr()
Definition: ketypes.h:81
_In_ HANDLE _Outptr_result_bytebuffer_ ViewSize PVOID * BaseAddress
Definition: mmfuncs.h:404
#define _In_
Definition: no_sal2.h:158
#define FASTCALL
Definition: nt_native.h:50
#define UNREACHABLE
#define DECLSPEC_NORETURN
Definition: ntbasedef.h:176
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:325
_In_ ULONG _In_ ULONG Offset
Definition: ntddpcm.h:101
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
FORCEINLINE ULONG_PTR KeGetTrapFrameFrameRegister(PKTRAP_FRAME TrapFrame)
Definition: ke.h:200
DECLSPEC_NORETURN VOID KiSwitchToBootStack(IN ULONG_PTR InitialStack)
Definition: ke.h:897
ULONG KeI386NpxPresent
Definition: cpu.c:27
#define KeGetContextSwitches(Prcb)
Definition: ke.h:216
FORCEINLINE ULONG_PTR KeGetContextFrameRegister(PCONTEXT Context)
Definition: ke.h:165
ULONG KeI386XMMIPresent
Definition: cpu.c:32
FORCEINLINE VOID KeInvalidateTlbEntry(IN PVOID Address)
Definition: ke.h:264
FORCEINLINE VOID KeFlushProcessTb(VOID)
Definition: ke.h:272
FORCEINLINE VOID KeSetContextFrameRegister(PCONTEXT Context, ULONG_PTR Frame)
Definition: ke.h:172
DECLSPEC_NORETURN VOID KiExceptionExit(_In_ PKTRAP_FRAME TrapFrame, _In_ PKEXCEPTION_FRAME ExceptionFrame)
Definition: ke.h:693
FORCEINLINE ULONG_PTR KeGetTrapFrameStackRegister(PKTRAP_FRAME TrapFrame)
Definition: ke.h:193
VOID KiGetCacheInformation(VOID)
Definition: cpu.c:419
FORCEINLINE BOOLEAN KeDisableInterrupts(VOID)
Definition: ke.h:239
ULONG64 KiGetFeatureBits(VOID)
Evaluates the KeFeatureFlag bits for the current CPU.
Definition: cpu.c:165
FORCEINLINE PVOID KeQueryInterruptHandler(IN ULONG Vector)
Definition: ke.h:327
FORCEINLINE VOID KeRestoreInterrupts(BOOLEAN WereEnabled)
Definition: ke.h:254
ULONG KeI386CpuType
Definition: cpu.c:24
VOID KiSetProcessorType(VOID)
Definition: cpu.c:99
FORCEINLINE VOID KiRundownThread(IN PKTHREAD Thread)
Definition: ke.h:293
ULONG KeI386FxsrPresent
Definition: cpu.c:33
FORCEINLINE BOOLEAN KiUserTrap(IN PKTRAP_FRAME TrapFrame)
Definition: ke.h:367
FORCEINLINE VOID KeSweepICache(IN PVOID BaseAddress, IN SIZE_T FlushSize)
Definition: ke.h:280
FORCEINLINE VOID KeRegisterInterruptHandler(IN ULONG Vector, IN PVOID Handler)
Definition: ke.h:301
FORCEINLINE PULONG_PTR KiGetUserModeStackAddress(void)
Definition: ke.h:469
ULONG KeI386CpuStep
Definition: cpu.c:25
#define KeSetContextReturnRegister(Context, ReturnValue)
Definition: ke.h:43
#define Ki386PerfEnd()
Definition: ke.h:174
#define KiGetLinkedTrapFrame(x)
Definition: ke.h:177
#define KeSetContextPc(Context, ProgramCounter)
Definition: ke.h:34
#define KiServiceExit2
Definition: ke.h:5
#define KeGetContextPc(Context)
Definition: ke.h:31
#define KeGetContextReturnRegister(Context)
Definition: ke.h:40
#define KeGetTrapFramePc(TrapFrame)
Definition: ke.h:37
#define KiEndInterrupt(x, y)
Definition: ke.h:175
struct _LARGE_IDENTITY_MAP LARGE_IDENTITY_MAP
BOOLEAN NTAPI VdmDispatchPageFault(_In_ PKTRAP_FRAME TrapFrame)
Definition: vdmexec.c:367
PVOID Ki386IopmSaveArea
Definition: v86vdm.c:23
BOOLEAN NTAPI VdmDispatchBop(IN PKTRAP_FRAME TrapFrame)
Definition: vdmexec.c:313
FORCEINLINE ULONG Ke386SanitizeFlags(IN ULONG Eflags, IN KPROCESSOR_MODE Mode)
Definition: ke.h:769
FORCEINLINE DECLSPEC_NORETURN VOID KiDispatchException2Args(IN NTSTATUS Code, IN ULONG_PTR Address, IN ULONG P1, IN ULONG P2, IN PKTRAP_FRAME TrapFrame)
Definition: ke.h:833
VOID NTAPI KiInitializePAT(VOID)
Definition: patpge.c:61
VOID NTAPI ExpInterlockedPopEntrySListResume(VOID)
BOOLEAN FASTCALL KiVdmOpcodePrefix(IN PKTRAP_FRAME TrapFrame, IN ULONG Flags)
Definition: v86vdm.c:442
DECLSPEC_NORETURN VOID NTAPI KiDispatchExceptionFromTrapFrame(IN NTSTATUS Code, IN ULONG Flags, IN ULONG_PTR Address, IN ULONG ParameterCount, IN ULONG_PTR Parameter1, IN ULONG_PTR Parameter2, IN ULONG_PTR Parameter3, IN PKTRAP_FRAME TrapFrame)
Definition: exp.c:1055
VOID FASTCALL Ki386InitializeTss(IN PKTSS Tss, IN PKIDTENTRY Idt, IN PKGDTENTRY Gdt)
Definition: cpu.c:827
BOOLEAN FASTCALL Ki386HandleOpcodeV86(IN PKTRAP_FRAME TrapFrame)
Definition: v86vdm.c:456
ULONG_PTR NTAPI Ki386EnableTargetLargePage(IN ULONG_PTR Context)
Definition: patpge.c:70
VOID NTAPI KiFlushNPXState(IN FLOATING_SAVE_AREA *SaveArea)
ULONG KiFastSystemCallDisable
Definition: cpu.c:28
struct _KV86_FRAME KV86_FRAME
VOID __cdecl KiTrap13(VOID)
UCHAR KiDebugRegisterContextOffsets[9]
VOID __cdecl KiTrap02(VOID)
UCHAR KiDebugRegisterTrapOffsets[9]
VOID __cdecl KiTrap08(VOID)
struct _KV8086_STACK_FRAME KV8086_STACK_FRAME
union _KTRAP_EXIT_SKIP_BITS * PKTRAP_EXIT_SKIP_BITS
BOOLEAN KeI386VirtualIntExtensions
Definition: v86vdm.c:24
struct _LARGE_IDENTITY_MAP * PLARGE_IDENTITY_MAP
ULONG KeI386EFlagsAndMaskV86
Definition: v86vdm.c:21
struct _FLOATING_SAVE_CONTEXT * PFLOATING_SAVE_CONTEXT
NTSTATUS NTAPI Ke386GetGdtEntryThread(IN PKTHREAD Thread, IN ULONG Offset, IN PKGDTENTRY Descriptor)
Definition: ldt.c:26
DECLSPEC_NORETURN VOID FASTCALL KiEoiHelper(IN PKTRAP_FRAME TrapFrame)
Definition: traphdlr.c:126
union _KTRAP_EXIT_SKIP_BITS KTRAP_EXIT_SKIP_BITS
VOID __cdecl KiFastCallEntry(VOID)
VOID NTAPI KiI386PentiumLockErrataFixup(VOID)
Definition: cpu.c:1116
BOOLEAN NTAPI KiIsNpxErrataPresent(VOID)
Definition: cpu.c:1187
CHAR KiSystemCallExitBranch[]
struct _KV86_FRAME * PKV86_FRAME
ULONG_PTR NTAPI Ki386EnableXMMIExceptions(IN ULONG_PTR Context)
Definition: cpu.c:1093
VOID NTAPI KiAmdK6InitializeMTRR(VOID)
Definition: mtrr.c:31
ULONG_PTR NTAPI Ki386EnableFxsr(IN ULONG_PTR Context)
Definition: cpu.c:1083
VOID __cdecl ReadBatch(VOID)
BOOLEAN NTAPI Ki386CreateIdentityMap(IN PLARGE_IDENTITY_MAP IdentityMap, IN PVOID StartPtr, IN ULONG Length)
FORCEINLINE DECLSPEC_NORETURN VOID KiDispatchException0Args(IN NTSTATUS Code, IN ULONG_PTR Address, IN PKTRAP_FRAME TrapFrame)
Definition: ke.h:804
ULONG KeI386EFlagsOrMaskV86
Definition: v86vdm.c:22
CHAR KiSystemCallExit[]
VOID NTAPI Ki386EnableCurrentLargePage(IN ULONG_PTR StartAddress, IN ULONG Cr3)
VOID NTAPI KiRestoreFastSyscallReturnState(VOID)
Definition: cpu.c:1039
FORCEINLINE VOID KiSetTebBase(PKPCR Pcr, PNT_TIB TebAddress)
Definition: ke.h:428
BOOLEAN KiI386PentiumLockErrataPresent
Definition: cpu.c:42
VOID __cdecl CopyParams(VOID)
ULONG_PTR NTAPI Ki386EnableGlobalPage(IN ULONG_PTR Context)
Definition: patpge.c:23
VOID NTAPI Ki386FreeIdentityMap(IN PLARGE_IDENTITY_MAP IdentityMap)
ULONG KiMXCsrMask
Definition: cpu.c:30
VOID NTAPI KiInitializeMTRR(IN BOOLEAN FinalCpu)
Definition: mtrr.c:22
NTSTATUS NTAPI KiSystemCallTrampoline(_In_ PVOID Handler, _In_ PVOID Arguments, _In_ ULONG StackBytes)
VOID NTAPI KiSetCR0Bits(VOID)
Definition: cpu.c:756
VOID NTAPI Ki386SetupAndExitToV86Mode(OUT PTEB VdmTeb)
FORCEINLINE DECLSPEC_NORETURN VOID KiDispatchException1Args(IN NTSTATUS Code, IN ULONG_PTR Address, IN ULONG P1, IN PKTRAP_FRAME TrapFrame)
Definition: ke.h:818
KIDTENTRY KiIdt[MAXIMUM_IDTVECTOR+1]
Definition: except.c:50
VOID NTAPI Ki386AdjustEsp0(IN PKTRAP_FRAME TrapFrame)
Definition: exp.c:280
FORCEINLINE PFX_SAVE_AREA KiGetThreadNpxArea(IN PKTHREAD Thread)
Definition: ke.h:741
VOID NTAPI KiInitializePcr(IN ULONG ProcessorNumber, IN PKIPCR Pcr, IN PKIDTENTRY Idt, IN PKGDTENTRY Gdt, IN PKTSS Tss, IN PKTHREAD IdleThread, IN PVOID DpcStack)
Definition: kiinit.c:284
FORCEINLINE PVOID Ke386SanitizeDr(IN PVOID DrAddress, IN KPROCESSOR_MODE Mode)
Definition: ke.h:786
ULONG_PTR FASTCALL KiExitV86Mode(IN PKTRAP_FRAME TrapFrame)
Definition: v86vdm.c:468
NTSTATUS NTAPI KiConvertToGuiThread(VOID)
struct _FLOATING_SAVE_CONTEXT FLOATING_SAVE_CONTEXT
FORCEINLINE DECLSPEC_NORETURN VOID KiIret(VOID)
Definition: ke.h:937
struct _KV8086_STACK_FRAME * PKV8086_STACK_FRAME
FORCEINLINE VOID Ke386SetGdtEntryBase(PKGDTENTRY GdtEntry, PVOID BaseAddress)
Definition: ke.h:419
DECLSPEC_NORETURN VOID FASTCALL KiServiceExit(IN PKTRAP_FRAME TrapFrame, IN NTSTATUS Status)
Definition: traphdlr.c:150
CHAR KiSystemCallExit2[]
BOOLEAN NTAPI KiIsNpxPresent(VOID)
VOID FASTCALL Ki386BiosCallReturnAddress(IN PKTRAP_FRAME TrapFrame)
KDESCRIPTOR KiIdtDescriptor
Definition: except.c:51
ULONG_PTR NTAPI Ki386EnableDE(IN ULONG_PTR Context)
Definition: cpu.c:1073
FORCEINLINE ULONG Ke386SanitizeSeg(IN ULONG Cs, IN KPROCESSOR_MODE Mode)
Definition: ke.h:752
VOID NTAPI KeI386VdmInitialize(VOID)
Definition: vdmmain.c:42
FORCEINLINE VOID KiCheckForApcDelivery(IN PKTRAP_FRAME TrapFrame)
Definition: ke.h:858
VOID NTAPI ExpInterlockedPopEntrySListFault(VOID)
VOID NTAPI KiThreadStartup(VOID)
Definition: thrdini.c:63
ULONGLONG BootCyclesEnd
Definition: ke.h:152
ULONGLONG BootCycles
Definition: kiinit.c:37
VOID NTAPI KiDeliverApc(IN KPROCESSOR_MODE DeliveryMode, IN PKEXCEPTION_FRAME ExceptionFrame, IN PKTRAP_FRAME TrapFrame)
Definition: apc.c:302
unsigned short USHORT
Definition: pedump.c:61
static WCHAR Address[46]
Definition: ping.c:68
__asm__(".p2align 4, 0x90\n" ".seh_proc __seh2_global_filter_func\n" "__seh2_global_filter_func:\n" "\tsub %rbp, %rax\n" "\tpush %rbp\n" "\t.seh_pushreg %rbp\n" "\tsub $32, %rsp\n" "\t.seh_stackalloc 32\n" "\t.seh_endprologue\n" "\tsub %rax, %rdx\n" "\tmov %rdx, %rbp\n" "\tjmp *%r8\n" "__seh2_global_filter_func_exit:\n" "\t.p2align 4\n" "\tadd $32, %rsp\n" "\tpop %rbp\n" "\tret\n" "\t.seh_endproc")
static void push(calc_node_t *op)
Definition: rpn_ieee.c:113
base of all file and directory entries
Definition: entries.h:83
PKTHREAD CurrentThread
Definition: ke.h:275
PFX_SAVE_AREA PfxSaveArea
Definition: ke.h:278
PFX_SAVE_AREA Buffer
Definition: ke.h:277
KIRQL OldNpxIrql
Definition: ke.h:276
USHORT Offset
Definition: ketypes.h:440
USHORT ExtendedOffset
Definition: ketypes.h:443
PKIDTENTRY IDT
Definition: ketypes.h:818
Definition: ke.h:294
NT_TIB NtTib
Definition: ke.h:297
PUSHORT GDT
Definition: ke.h:54
ULONG TempEsp
Definition: ketypes.h:300
ULONG Ebp
Definition: ketypes.h:319
ULONG PreviousPreviousMode
Definition: ketypes.h:313
ULONG HardwareEsp
Definition: ketypes.h:324
ULONG Eip
Definition: ketypes.h:321
ULONG Edx
Definition: ketypes.h:310
Definition: ketypes.h:850
KTRAP_FRAME TrapFrame
Definition: ke.h:253
KV86_FRAME V86Frame
Definition: ke.h:255
FX_SAVE_AREA NpxArea
Definition: ke.h:254
PVOID ThreadTeb
Definition: ke.h:244
PVOID PcrTeb
Definition: ke.h:245
PVOID ThreadStack
Definition: ke.h:243
ULONG_PTR StartAddress
Definition: ke.h:265
PVOID PagesList[30]
Definition: ke.h:267
PHARDWARE_PTE TopLevelDirectory
Definition: ke.h:263
ULONG PagesCount
Definition: ke.h:266
struct _NT_TIB * Self
Definition: compat.h:720
Definition: compat.h:836
uint32_t * PULONG
Definition: typedefs.h:59
#define NTAPI
Definition: typedefs.h:36
ULONG_PTR SIZE_T
Definition: typedefs.h:80
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define IN
Definition: typedefs.h:39
uint32_t ULONG
Definition: typedefs.h:59
uint64_t ULONGLONG
Definition: typedefs.h:67
#define OUT
Definition: typedefs.h:40
UCHAR SkipSegments
Definition: ke.h:176
UCHAR SkipPreviousMode
Definition: ke.h:175
UCHAR Reserved
Definition: ke.h:178
UCHAR SkipVolatiles
Definition: ke.h:177
_In_ UCHAR _In_ UCHAR _In_ ULONG Code
Definition: wdfdevice.h:1701
_Must_inspect_result_ _In_ WDFIORESLIST _In_ PIO_RESOURCE_DESCRIPTOR Descriptor
Definition: wdfresource.h:342
#define FORCEINLINE
Definition: wdftypes.h:67
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
Definition: kefuncs.h:778
CCHAR KPROCESSOR_MODE
Definition: ketypes.h:7
unsigned char UCHAR
Definition: xmlstorage.h:181
char CHAR
Definition: xmlstorage.h:175