ReactOS 0.4.16-dev-2491-g3dc6630
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_MTRR 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 State Pointer
201//
202extern const PULONG KiNtVdmState;
203
204//
205// VDM Helper Macros
206//
207// All VDM/V8086 opcode emulators have the same FASTCALL function definition.
208// We need to keep 2 parameters while the original ASM implementation uses 4:
209// TrapFrame, PrefixFlags, Eip, InstructionSize;
210//
211// We pass the trap frame, and prefix flags, in our two parameters.
212//
213// We then realize that since the smallest prefix flag is 0x100, this gives us
214// a count of up to 0xFF. So we OR in the instruction size with the prefix flags
215//
216// We further realize that we always have access to EIP from the trap frame, and
217// that if we want the *current instruction* EIP, we simply have to add the
218// instruction size *MINUS ONE*, and that gives us the EIP we should be looking
219// at now, so we don't need to use the stack to push this parameter.
220//
221// We actually only care about the *current instruction* EIP in one location,
222// so although it may be slightly more expensive to re-calculate the EIP one
223// more time, this way we don't redefine ALL opcode handlers to have 3 parameters,
224// which would be forcing stack usage in all other scenarios.
225//
226#ifdef __GNUC__
227#pragma GCC diagnostic push
228#pragma GCC diagnostic ignored "-Wstringop-overflow"
229#endif
231{
232 return InterlockedOr((PLONG)KiNtVdmState, EFlags);
233}
235{
236 return InterlockedAnd((PLONG)KiNtVdmState, ~EFlags);
237}
238#ifdef __GNUC__
239#pragma GCC diagnostic pop
240#endif
241
242#define KiCallVdmHandler(x) KiVdmOpcode##x(TrapFrame, Flags)
243#define KiCallVdmPrefixHandler(x) KiVdmOpcodePrefix(TrapFrame, Flags | x)
244#define KiVdmUnhandledOpcode(x) \
245 BOOLEAN \
246 FASTCALL \
247 KiVdmOpcode##x(IN PKTRAP_FRAME TrapFrame, \
248 IN ULONG Flags) \
249 { \
250 /* Not yet handled */ \
251 UNIMPLEMENTED_DBGBREAK(); \
252 return FALSE; \
253 }
254
256
257//
258// Local parameters
259//
260typedef struct _KV86_FRAME
261{
266
267//
268// Virtual Stack Frame
269//
271{
276
277//
278// Large Pages Support
279//
281{
288
289//
290// Floating Point Internal Context Structure
291//
293{
299
300/* Diable interrupts and return whether they were enabled before */
304{
305 ULONG Flags;
306 BOOLEAN Return;
307
308 /* Get EFLAGS and check if the interrupt bit is set */
310 Return = (Flags & EFLAGS_INTERRUPT_MASK) ? TRUE: FALSE;
311
312 /* Disable interrupts */
313 _disable();
314 return Return;
315}
316
317/* Restore previous interrupt state */
319VOID
321{
322 if (WereEnabled) _enable();
323}
324
325//
326// Registers an interrupt handler with an IDT vector
327//
329VOID
332{
333 UCHAR Entry;
335 PKIPCR Pcr = (PKIPCR)KeGetPcr();
336
337 //
338 // Get the entry from the HAL
339 //
342
343 //
344 // Now set the data
345 //
346 Pcr->IDT[Entry].ExtendedOffset = (USHORT)(Address >> 16);
347 Pcr->IDT[Entry].Offset = (USHORT)Address;
348}
349
350//
351// Returns the registered interrupt handler for a given IDT vector
352//
354PVOID
356{
357 PKIPCR Pcr = (PKIPCR)KeGetPcr();
358 UCHAR Entry;
359
360 //
361 // Get the entry from the HAL
362 //
364
365 //
366 // Read the entry from the IDT
367 //
368 return (PVOID)(((Pcr->IDT[Entry].ExtendedOffset << 16) & 0xFFFF0000) |
369 (Pcr->IDT[Entry].Offset & 0xFFFF));
370}
371
372//
373// Invalidates the TLB entry for a specified address
374//
376VOID
378{
379 /* Invalidate the TLB entry for this address */
381}
382
384VOID
386{
387 /* Flush the TLB by resetting CR3 */
389}
390
392VOID
394 IN SIZE_T FlushSize)
395{
396 //
397 // Always sweep the whole cache
398 //
400 UNREFERENCED_PARAMETER(FlushSize);
401 __wbinvd();
402}
403
407{
408 /* Return the current thread */
409 return ((PKIPCR)KeGetPcr())->PrcbData.CurrentThread;
410}
411
413VOID
415{
416 /* Check if this is the NPX Thread */
417 if (KeGetCurrentPrcb()->NpxThread == Thread)
418 {
419 /* Clear it */
420 KeGetCurrentPrcb()->NpxThread = NULL;
421 Ke386FnInit();
422 }
423}
424
425CODE_SEG("INIT")
426VOID
427NTAPI
428KiInitializePcr(IN ULONG ProcessorNumber,
429 IN PKIPCR Pcr,
430 IN PKIDTENTRY Idt,
431 IN PKGDTENTRY Gdt,
432 IN PKTSS Tss,
433 IN PKTHREAD IdleThread,
434 IN PVOID DpcStack);
435
437VOID
439{
440 GdtEntry->BaseLow = (USHORT)((ULONG_PTR)BaseAddress & 0xFFFF);
441 GdtEntry->HighWord.Bytes.BaseMid = (UCHAR)((ULONG_PTR)BaseAddress >> 16);
442 GdtEntry->HighWord.Bytes.BaseHi = (UCHAR)((ULONG_PTR)BaseAddress >> 24);
443}
444
446VOID
447KiSetTebBase(PKPCR Pcr, PNT_TIB TebAddress)
448{
449 Pcr->NtTib.Self = TebAddress;
450 Ke386SetGdtEntryBase(&Pcr->GDT[KGDT_R3_TEB / sizeof(KGDTENTRY)], TebAddress);
451}
452
453CODE_SEG("INIT")
454VOID
457 IN PKTSS Tss,
458 IN PKIDTENTRY Idt,
459 IN PKGDTENTRY Gdt
460);
461
462CODE_SEG("INIT")
463VOID
464NTAPI
466
467CODE_SEG("INIT")
468VOID
469NTAPI
471
472CODE_SEG("INIT")
474NTAPI
476 VOID
477);
478
479CODE_SEG("INIT")
481NTAPI
483 VOID
484);
485
486CODE_SEG("INIT")
487VOID
488NTAPI
490
491CODE_SEG("INIT")
493NTAPI
495
496#if DBG
497CODE_SEG("INIT")
498VOID
499KiReportCpuFeatures(VOID);
500#endif
501
502VOID
503NTAPI
505
507NTAPI
512);
513
514VOID
515NTAPI
517 IN FLOATING_SAVE_AREA *SaveArea
518);
519
520VOID
521NTAPI
523 IN PKTRAP_FRAME TrapFrame
524);
525
526VOID
527NTAPI
529 OUT PTEB VdmTeb
530);
531
532CODE_SEG("INIT")
533VOID
534NTAPI
536 VOID
537);
538
539CODE_SEG("INIT")
541NTAPI
544);
545
546CODE_SEG("INIT")
548NTAPI
551);
552
554NTAPI
556 IN PLARGE_IDENTITY_MAP IdentityMap,
557 IN PVOID StartPtr,
559);
560
561VOID
562NTAPI
564 IN PLARGE_IDENTITY_MAP IdentityMap
565);
566
567VOID
568NTAPI
570 IN ULONG_PTR StartAddress,
571 IN ULONG Cr3
572);
573
574CODE_SEG("INIT")
575VOID
576NTAPI
578 VOID
579);
580
581CODE_SEG("INIT")
582VOID
583NTAPI
585 VOID
586);
587
588CODE_SEG("INIT")
589VOID
590NTAPI
592 IN BOOLEAN FinalCpu
593);
594
595CODE_SEG("INIT")
596VOID
597NTAPI
599 VOID
600);
601
602CODE_SEG("INIT")
603VOID
604NTAPI
606 VOID
607);
608
609CODE_SEG("INIT")
611NTAPI
614);
615
616CODE_SEG("INIT")
618NTAPI
621);
622
623CODE_SEG("INIT")
625NTAPI
628);
629
631NTAPI
633 IN PKTRAP_FRAME TrapFrame
634);
635
637NTAPI
639 _In_ PKTRAP_FRAME TrapFrame
640);
641
645 IN PKTRAP_FRAME TrapFrame,
647);
648
652 IN PKTRAP_FRAME TrapFrame
653);
654
656VOID
659 IN PKTRAP_FRAME TrapFrame
660);
661
662VOID
665 IN PKTRAP_FRAME TrapFrame
666);
667
671 IN PKTRAP_FRAME TrapFrame
672);
673
675VOID
676NTAPI
679 IN ULONG Flags,
681 IN ULONG ParameterCount,
682 IN ULONG_PTR Parameter1,
683 IN ULONG_PTR Parameter2,
684 IN ULONG_PTR Parameter3,
685 IN PKTRAP_FRAME TrapFrame
686);
687
689NTAPI
691 VOID
692);
693
695VOID
698 IN PKTRAP_FRAME TrapFrame,
700);
701
703VOID
706 IN PKTRAP_FRAME TrapFrame
707);
708
711VOID
713 _In_ PKTRAP_FRAME TrapFrame,
714 _In_ PKEXCEPTION_FRAME ExceptionFrame)
715{
716 KiServiceExit2(TrapFrame);
717}
718
719//
720// Global x86 only Kernel data
721//
732extern ULONG KiMXCsrMask;
733extern ULONG KeI386CpuType;
734extern ULONG KeI386CpuStep;
747extern CHAR KiSystemCallExit[];
748extern CHAR KiSystemCallExit2[];
749
750//
751// Trap Macros
752//
753#include "trap_x.h"
754
755//
756// Returns a thread's FPU save area
757//
761{
762 ASSERT((ULONG_PTR)Thread->InitialStack % 16 == 0);
763 return (PFX_SAVE_AREA)((ULONG_PTR)Thread->InitialStack - sizeof(FX_SAVE_AREA));
764}
765
766//
767// Sanitizes a selector
768//
770ULONG
773{
774 //
775 // Check if we're in kernel-mode, and force CPL 0 if so.
776 // Otherwise, force CPL 3.
777 //
778 return ((Mode == KernelMode) ?
779 (Cs & (0xFFFF & ~RPL_MASK)) :
780 (RPL_MASK | (Cs & 0xFFFF)));
781}
782
783//
784// Sanitizes EFLAGS
785//
787ULONG
790{
791 //
792 // Check if we're in kernel-mode, and sanitize EFLAGS if so.
793 // Otherwise, also force interrupt mask on.
794 //
795 return ((Mode == KernelMode) ?
798}
799
800//
801// Sanitizes a Debug Register
802//
804PVOID
807{
808 //
809 // Check if we're in kernel-mode, and return the address directly if so.
810 // Otherwise, make sure it's not inside the kernel-mode address space.
811 // If it is, then clear the address.
812 //
813 return ((Mode == KernelMode) ? DrAddress :
814 (DrAddress <= MM_HIGHEST_USER_ADDRESS) ? DrAddress : 0);
815}
816
817//
818// Exception with no arguments
819//
822VOID
825 IN PKTRAP_FRAME TrapFrame)
826{
827 /* Helper for exceptions with no arguments */
828 KiDispatchExceptionFromTrapFrame(Code, 0, Address, 0, 0, 0, 0, TrapFrame);
829}
830
831//
832// Exception with one argument
833//
836VOID
839 IN ULONG P1,
840 IN PKTRAP_FRAME TrapFrame)
841{
842 /* Helper for exceptions with no arguments */
843 KiDispatchExceptionFromTrapFrame(Code, 0, Address, 1, P1, 0, 0, TrapFrame);
844}
845
846//
847// Exception with two arguments
848//
851VOID
854 IN ULONG P1,
855 IN ULONG P2,
856 IN PKTRAP_FRAME TrapFrame)
857{
858 /* Helper for exceptions with no arguments */
859 KiDispatchExceptionFromTrapFrame(Code, 0, Address, 2, P1, P2, 0, TrapFrame);
860}
861
862//
863// Performs a system call
864//
866NTAPI
868 _In_ PVOID Arguments,
869 _In_ ULONG StackBytes);
870
871
872//
873// Checks for pending APCs
874//
876VOID
878{
881
882 /* Check for V8086 or user-mode trap */
883 if ((TrapFrame->EFlags & EFLAGS_V86_MASK) || (KiUserTrap(TrapFrame)))
884 {
885 /* Get the thread */
887 while (TRUE)
888 {
889 /* Turn off the alerted state for kernel mode */
890 Thread->Alerted[KernelMode] = FALSE;
891
892 /* Are there pending user APCs? */
893 if (!Thread->ApcState.UserApcPending) break;
894
895 /* Raise to APC level and enable interrupts */
897 _enable();
898
899 /* Deliver APCs */
900 KiDeliverApc(UserMode, NULL, TrapFrame);
901
902 /* Restore IRQL and disable interrupts once again */
904 _disable();
905 }
906 }
907}
908
909//
910// Switches from boot loader to initial kernel stack
911//
912CODE_SEG("INIT")
915VOID
917{
919
920 /* We have to switch to a new stack before continuing kernel initialization */
921#ifdef __GNUC__
922 __asm__
923 (
924 "movl %0, %%esp\n\t"
925 "subl %1, %%esp\n\t"
926 "pushl %2\n\t"
927 "jmp _KiSystemStartupBootStack@0"
928 :
929 : "c"(InitialStack),
931 "i"(CR0_EM | CR0_TS | CR0_MP),
933 : "%esp"
934 );
935#elif defined(_MSC_VER)
936 __asm
937 {
938 mov esp, InitialStack
942 }
943#else
944#error Unknown Compiler
945#endif
946
948}
949
950//
951// Emits the iret instruction for C code
952//
955VOID
957{
958#if defined(__GNUC__)
959 __asm__ __volatile__
960 (
961 "iret"
962 );
963#elif defined(_MSC_VER)
964 __asm
965 {
966 iretd
967 }
968#else
969#error Unsupported compiler
970#endif
972}
973
974//
975// Normally this is done by the HAL, but on x86 as an optimization, the kernel
976// initiates the end by calling back into the HAL and exiting the trap here.
977//
979VOID
981 IN PKTRAP_FRAME TrapFrame)
982{
983 /* Disable interrupts and end the interrupt */
984 _disable();
985 HalEndSystemInterrupt(Irql, TrapFrame);
986
987 /* Exit the interrupt */
988 KiEoiHelper(TrapFrame);
989}
990
991//
992// PERF Code
993//
995VOID
997{
1000 DbgPrint("Boot took %I64u cycles!\n", BootCyclesEnd - BootCycles);
1001 DbgPrint("Interrupts: %u System Calls: %u Context Switches: %u\n",
1002 KeGetCurrentPrcb()->InterruptCount,
1003 KeGetCurrentPrcb()->KeSystemCalls,
1005}
1006
1008PULONG
1010{
1011 return &(KeGetCurrentThread()->TrapFrame->HardwareEsp);
1012}
1013
1014#ifdef __cplusplus
1015} // extern "C"
1016#endif
1017
1018#endif
#define CODE_SEG(...)
#define EFLAGS_INTERRUPT_MASK
Definition: SystemCall.c:11
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
unsigned char BOOLEAN
Definition: actypes.h:127
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 __cdecl
Definition: corecrt.h:121
#define DECLSPEC_NORETURN
Definition: corecrt.h:131
#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
#define InterlockedOr
Definition: interlocked.h:239
#define InterlockedAnd
Definition: interlocked.h:77
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:207
#define EFLAGS_V86_MASK
Definition: ketypes.h:202
#define CR0_MP
Definition: ketypes.h:140
#define CR0_EM
Definition: ketypes.h:141
FORCEINLINE struct _KPRCB * KeGetCurrentPrcb(VOID)
Definition: ketypes.h:1187
struct _KIPCR * PKIPCR
#define MAXIMUM_IDTVECTOR
Definition: ketypes.h:346
#define RPL_MASK
Definition: ketypes.h:124
#define CR0_TS
Definition: ketypes.h:142
#define HalVectorToIDTEntry
Definition: halfuncs.h:54
#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 UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:329
_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:202
DECLSPEC_NORETURN VOID KiSwitchToBootStack(IN ULONG_PTR InitialStack)
Definition: ke.h:916
ULONG KeI386NpxPresent
Definition: cpu.c:28
#define KeGetContextSwitches(Prcb)
Definition: ke.h:218
FORCEINLINE ULONG_PTR KeGetContextFrameRegister(PCONTEXT Context)
Definition: ke.h:167
ULONG KeI386XMMIPresent
Definition: cpu.c:32
FORCEINLINE VOID KeInvalidateTlbEntry(IN PVOID Address)
Definition: ke.h:266
FORCEINLINE VOID KeFlushProcessTb(VOID)
Definition: ke.h:274
FORCEINLINE VOID KeSetContextFrameRegister(PCONTEXT Context, ULONG_PTR Frame)
Definition: ke.h:174
DECLSPEC_NORETURN VOID KiExceptionExit(_In_ PKTRAP_FRAME TrapFrame, _In_ PKEXCEPTION_FRAME ExceptionFrame)
Definition: ke.h:712
FORCEINLINE ULONG_PTR KeGetTrapFrameStackRegister(PKTRAP_FRAME TrapFrame)
Definition: ke.h:195
VOID KiGetCacheInformation(VOID)
Definition: cpu.c:427
FORCEINLINE BOOLEAN KeDisableInterrupts(VOID)
Definition: ke.h:241
ULONG64 KiGetFeatureBits(VOID)
Evaluates the KeFeatureFlag bits for the current CPU.
Definition: cpu.c:166
FORCEINLINE PVOID KeQueryInterruptHandler(IN ULONG Vector)
Definition: ke.h:329
FORCEINLINE VOID KeRestoreInterrupts(BOOLEAN WereEnabled)
Definition: ke.h:256
ULONG KeI386CpuType
Definition: cpu.c:25
VOID KiSetProcessorType(VOID)
Definition: cpu.c:100
FORCEINLINE VOID KiRundownThread(IN PKTHREAD Thread)
Definition: ke.h:295
ULONG KeI386FxsrPresent
Definition: cpu.c:33
FORCEINLINE BOOLEAN KiUserTrap(IN PKTRAP_FRAME TrapFrame)
Definition: ke.h:369
FORCEINLINE VOID KeSweepICache(IN PVOID BaseAddress, IN SIZE_T FlushSize)
Definition: ke.h:282
FORCEINLINE VOID KeRegisterInterruptHandler(IN ULONG Vector, IN PVOID Handler)
Definition: ke.h:303
FORCEINLINE PULONG_PTR KiGetUserModeStackAddress(void)
Definition: ke.h:471
ULONG KeI386CpuStep
Definition: cpu.c:26
#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 KiVdmClearVdmEFlags(ULONG EFlags)
Definition: ke.h:234
FORCEINLINE ULONG Ke386SanitizeFlags(IN ULONG Eflags, IN KPROCESSOR_MODE Mode)
Definition: ke.h:788
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:852
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:456
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:470
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)
FORCEINLINE ULONG KiVdmSetVdmEFlags(ULONG EFlags)
Definition: ke.h:230
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:823
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:447
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:837
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:760
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:805
ULONG_PTR FASTCALL KiExitV86Mode(IN PKTRAP_FRAME TrapFrame)
Definition: v86vdm.c:482
NTSTATUS NTAPI KiConvertToGuiThread(VOID)
struct _FLOATING_SAVE_CONTEXT FLOATING_SAVE_CONTEXT
const PULONG KiNtVdmState
Definition: v86vdm.c:25
FORCEINLINE DECLSPEC_NORETURN VOID KiIret(VOID)
Definition: ke.h:956
struct _KV8086_STACK_FRAME * PKV8086_STACK_FRAME
FORCEINLINE VOID Ke386SetGdtEntryBase(PKGDTENTRY GdtEntry, PVOID BaseAddress)
Definition: ke.h:438
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:771
VOID NTAPI KeI386VdmInitialize(VOID)
Definition: vdmmain.c:42
FORCEINLINE VOID KiCheckForApcDelivery(IN PKTRAP_FRAME TrapFrame)
Definition: ke.h:877
VOID NTAPI ExpInterlockedPopEntrySListFault(VOID)
VOID NTAPI KiThreadStartup(VOID)
Definition: thrdini.c:63
ULONGLONG BootCyclesEnd
Definition: ke.h:157
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" "\tpush %rbx\n" "\t.seh_pushreg %rbx\n" "\tpush %rdi\n" "\t.seh_pushreg %rdi\n" "\tpush %rsi\n" "\t.seh_pushreg %rsi\n" "\tpush %r12\n" "\t.seh_pushreg %r12\n" "\tpush %r13\n" "\t.seh_pushreg %r13\n" "\tpush %r14\n" "\t.seh_pushreg %r14\n" "\tpush %r15\n" "\t.seh_pushreg %r15\n" "\tsub $40, %rsp\n" "\t.seh_stackalloc 40\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 $40, %rsp\n" "\tpop %r15\n" "\tpop %r14\n" "\tpop %r13\n" "\tpop %r12\n" "\tpop %rsi\n" "\tpop %rdi\n" "\tpop %rbx\n" "\tpop %rbp\n" "\tret\n" "\t.seh_endproc")
static void push(calc_node_t *op)
Definition: rpn_ieee.c:113
void __cdecl _disable(void)
Definition: intrin_arm.h:365
void __cdecl _enable(void)
Definition: intrin_arm.h:373
_In_ PVOID Context
Definition: storport.h:2269
base of all file and directory entries
Definition: entries.h:83
PKTHREAD CurrentThread
Definition: ke.h:294
PFX_SAVE_AREA PfxSaveArea
Definition: ke.h:297
PFX_SAVE_AREA Buffer
Definition: ke.h:296
KIRQL OldNpxIrql
Definition: ke.h:295
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:272
KV86_FRAME V86Frame
Definition: ke.h:274
FX_SAVE_AREA NpxArea
Definition: ke.h:273
PVOID ThreadTeb
Definition: ke.h:263
PVOID PcrTeb
Definition: ke.h:264
PVOID ThreadStack
Definition: ke.h:262
ULONG_PTR StartAddress
Definition: ke.h:284
PVOID PagesList[30]
Definition: ke.h:286
PHARDWARE_PTE TopLevelDirectory
Definition: ke.h:282
ULONG PagesCount
Definition: ke.h:285
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
int32_t * PLONG
Definition: typedefs.h:58
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:1707
_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