- Move machine-specific initializations to KeInit2.
[reactos.git] / reactos / ntoskrnl / include / internal / ke.h
1 #ifndef __NTOSKRNL_INCLUDE_INTERNAL_KE_H
2 #define __NTOSKRNL_INCLUDE_INTERNAL_KE_H
3
4 /* INCLUDES *****************************************************************/
5
6 #include "arch/ke.h"
7
8 /* INTERNAL KERNEL TYPES ****************************************************/
9
10 typedef struct _WOW64_PROCESS
11 {
12 PVOID Wow64;
13 } WOW64_PROCESS, *PWOW64_PROCESS;
14
15 typedef struct _KPROFILE_SOURCE_OBJECT
16 {
17 KPROFILE_SOURCE Source;
18 LIST_ENTRY ListEntry;
19 } KPROFILE_SOURCE_OBJECT, *PKPROFILE_SOURCE_OBJECT;
20
21 /* Cached modules from the loader block */
22 typedef enum _CACHED_MODULE_TYPE
23 {
24 AnsiCodepage,
25 OemCodepage,
26 UnicodeCasemap,
27 SystemRegistry,
28 HardwareRegistry,
29 MaximumCachedModuleType,
30 } CACHED_MODULE_TYPE, *PCACHED_MODULE_TYPE;
31 extern PLOADER_MODULE CachedModules[MaximumCachedModuleType];
32
33 typedef enum _CONNECT_TYPE
34 {
35 NoConnect,
36 NormalConnect,
37 ChainConnect,
38 UnknownConnect
39 } CONNECT_TYPE, *PCONNECT_TYPE;
40
41 typedef struct _DISPATCH_INFO
42 {
43 CONNECT_TYPE Type;
44 PKINTERRUPT Interrupt;
45 PKINTERRUPT_ROUTINE NoDispatch;
46 PKINTERRUPT_ROUTINE InterruptDispatch;
47 PKINTERRUPT_ROUTINE FloatingDispatch;
48 PKINTERRUPT_ROUTINE ChainedDispatch;
49 PKINTERRUPT_ROUTINE *FlatDispatch;
50 } DISPATCH_INFO, *PDISPATCH_INFO;
51
52 typedef struct _KTIMER_TABLE_ENTRY
53 {
54 LIST_ENTRY Entry;
55 ULARGE_INTEGER Time;
56 } KTIMER_TABLE_ENTRY, *PKTIMER_TABLE_ENTRY;
57
58 typedef PCHAR
59 (NTAPI *PKE_BUGCHECK_UNICODE_TO_ANSI)(
60 IN PUNICODE_STRING Unicode,
61 IN PCHAR Ansi,
62 IN ULONG Length
63 );
64
65 struct _KIRQ_TRAPFRAME;
66 struct _KPCR;
67 struct _KPRCB;
68 struct _KEXCEPTION_FRAME;
69
70 extern PVOID KeUserApcDispatcher;
71 extern PVOID KeUserCallbackDispatcher;
72 extern PVOID KeUserExceptionDispatcher;
73 extern PVOID KeRaiseUserExceptionDispatcher;
74 extern LARGE_INTEGER SystemBootTime;
75 extern ULONG_PTR KERNEL_BASE;
76 extern ULONG KeI386NpxPresent;
77 extern ULONG KeI386XMMIPresent;
78 extern ULONG KeI386FxsrPresent;
79 extern ULONG KeI386CpuType;
80 extern ULONG KeI386CpuStep;
81 extern ULONG KeProcessorArchitecture;
82 extern ULONG KeProcessorLevel;
83 extern ULONG KeProcessorRevision;
84 extern ULONG KeFeatureBits;
85 extern PKNODE KeNodeBlock[1];
86 extern UCHAR KeNumberNodes;
87 extern UCHAR KeProcessNodeSeed;
88 extern ULONG KiInterruptTemplate[KINTERRUPT_DISPATCH_CODES];
89 extern PULONG KiInterruptTemplateObject;
90 extern PULONG KiInterruptTemplateDispatch;
91 extern PULONG KiInterruptTemplate2ndDispatch;
92 extern ULONG KiUnexpectedEntrySize;
93 extern PVOID Ki386IopmSaveArea;
94 extern ULONG KeI386EFlagsAndMaskV86;
95 extern ULONG KeI386EFlagsOrMaskV86;
96 extern BOOLEAN KeI386VirtualIntExtensions;
97 extern KIDTENTRY KiIdt[];
98 extern FAST_MUTEX KernelAddressSpaceLock;
99 extern ULONG KiMaximumDpcQueueDepth;
100 extern ULONG KiMinimumDpcRate;
101 extern ULONG KiAdjustDpcThreshold;
102 extern ULONG KiIdealDpcRate;
103 extern LARGE_INTEGER KiTimeIncrementReciprocal;
104 extern UCHAR KiTimeIncrementShiftCount;
105 extern LIST_ENTRY BugcheckCallbackListHead, BugcheckReasonCallbackListHead;
106 extern KSPIN_LOCK BugCheckCallbackLock;
107 extern KDPC KiExpireTimerDpc;
108 extern KTIMER_TABLE_ENTRY KiTimerTableListHead[TIMER_TABLE_SIZE];
109 extern LIST_ENTRY KiTimerListHead;
110 extern KMUTEX KiGenericCallDpcMutex;
111 extern LIST_ENTRY KiProfileListHead, KiProfileSourceListHead;
112 extern KSPIN_LOCK KiProfileLock;
113 extern LIST_ENTRY KiProcessInSwapListHead, KiProcessOutSwapListHead;
114 extern LIST_ENTRY KiStackInSwapListHead;
115 extern KEVENT KiSwapEvent;
116
117 /* MACROS *************************************************************************/
118
119 /*
120 * On UP machines, we don't actually have a spinlock, we merely raise
121 * IRQL to DPC level.
122 */
123 #ifdef CONFIG_SMP
124 #define KeInitializeDispatcher() KeInitializeSpinLock(&DispatcherDatabaseLock);
125 #define KeAcquireDispatcherDatabaseLock() KfAcquireSpinLock(&DispatcherDatabaseLock);
126 #define KeAcquireDispatcherDatabaseLockAtDpcLevel() \
127 KeAcquireSpinLockAtDpcLevel (&DispatcherDatabaseLock);
128 #define KeReleaseDispatcherDatabaseLockFromDpcLevel() \
129 KeReleaseSpinLockFromDpcLevel(&DispatcherDatabaseLock);
130 #define KeReleaseDispatcherDatabaseLock(OldIrql) \
131 KiExitDispatcher(OldIrql);
132 #else
133 #define KeInitializeDispatcher()
134 #define KeAcquireDispatcherDatabaseLock() KeRaiseIrqlToDpcLevel();
135 #define KeReleaseDispatcherDatabaseLock(OldIrql) KiExitDispatcher(OldIrql);
136 #define KeAcquireDispatcherDatabaseLockAtDpcLevel()
137 #define KeReleaseDispatcherDatabaseLockFromDpcLevel()
138 #endif
139
140 #define AFFINITY_MASK(Id) KiMask32Array[Id]
141
142 /* The following macro initializes a dispatcher object's header */
143 #define KeInitializeDispatcherHeader(Header, t, s, State) \
144 { \
145 (Header)->Type = t; \
146 (Header)->Absolute = 0; \
147 (Header)->Inserted = 0; \
148 (Header)->Size = s; \
149 (Header)->SignalState = State; \
150 InitializeListHead(&((Header)->WaitListHead)); \
151 }
152
153 extern KSPIN_LOCK DispatcherDatabaseLock;
154
155 #define KeEnterCriticalRegion() \
156 { \
157 PKTHREAD _Thread = KeGetCurrentThread(); \
158 if (_Thread) _Thread->KernelApcDisable--; \
159 }
160
161 #define KeLeaveCriticalRegion() \
162 { \
163 PKTHREAD _Thread = KeGetCurrentThread(); \
164 if((_Thread) && (++_Thread->KernelApcDisable == 0)) \
165 { \
166 if (!IsListEmpty(&_Thread->ApcState.ApcListHead[KernelMode]) && \
167 (_Thread->SpecialApcDisable == 0)) \
168 { \
169 KiCheckForKernelApcDelivery(); \
170 } \
171 } \
172 }
173
174 #define KEBUGCHECKWITHTF(a,b,c,d,e,f) \
175 DbgPrint("KeBugCheckWithTf at %s:%i\n",__FILE__,__LINE__), \
176 KeBugCheckWithTf(a,b,c,d,e,f)
177
178 /* Tells us if the Timer or Event is a Syncronization or Notification Object */
179 #define TIMER_OR_EVENT_TYPE 0x7L
180
181 /* One of the Reserved Wait Blocks, this one is for the Thread's Timer */
182 #define TIMER_WAIT_BLOCK 0x3L
183
184 #define IOPM_OFFSET FIELD_OFFSET(KTSS, IoMaps[0].IoMap)
185
186 #define SIZE_OF_FX_REGISTERS 32
187
188 /* INTERNAL KERNEL FUNCTIONS ************************************************/
189
190 /* threadsch.c ********************************************************************/
191
192 /* Thread Scheduler Functions */
193
194 /* Readies a Thread for Execution. */
195 BOOLEAN
196 STDCALL
197 KiDispatchThreadNoLock(ULONG NewThreadStatus);
198
199 /* Readies a Thread for Execution. */
200 VOID
201 STDCALL
202 KiDispatchThread(ULONG NewThreadStatus);
203
204 /* Finds a new thread to run */
205 NTSTATUS
206 NTAPI
207 KiSwapThread(
208 VOID
209 );
210
211 VOID
212 NTAPI
213 KiReadyThread(IN PKTHREAD Thread);
214
215 NTSTATUS
216 STDCALL
217 KeSuspendThread(PKTHREAD Thread);
218
219 NTSTATUS
220 FASTCALL
221 KiSwapContext(
222 IN PKTHREAD CurrentThread,
223 IN PKTHREAD NewThread
224 );
225
226 VOID
227 STDCALL
228 KiAdjustQuantumThread(IN PKTHREAD Thread);
229
230 VOID
231 FASTCALL
232 KiExitDispatcher(KIRQL OldIrql);
233
234 /* gmutex.c ********************************************************************/
235
236 VOID
237 FASTCALL
238 KiAcquireGuardedMutexContented(PKGUARDED_MUTEX GuardedMutex);
239
240 /* gate.c **********************************************************************/
241
242 VOID
243 FASTCALL
244 KeInitializeGate(PKGATE Gate);
245
246 VOID
247 FASTCALL
248 KeSignalGateBoostPriority(PKGATE Gate);
249
250 VOID
251 FASTCALL
252 KeWaitForGate(
253 PKGATE Gate,
254 KWAIT_REASON WaitReason,
255 KPROCESSOR_MODE WaitMode
256 );
257
258 /* ipi.c ********************************************************************/
259
260 VOID
261 NTAPI
262 KiIpiSendRequest(
263 KAFFINITY TargetSet,
264 ULONG IpiRequest
265 );
266
267 /* next file ***************************************************************/
268
269 UCHAR
270 NTAPI
271 KeFindNextRightSetAffinity(
272 IN UCHAR Number,
273 IN ULONG Set
274 );
275
276 VOID
277 STDCALL
278 DbgBreakPointNoBugCheck(VOID);
279
280 VOID
281 STDCALL
282 KeInitializeProfile(
283 struct _KPROFILE* Profile,
284 struct _KPROCESS* Process,
285 PVOID ImageBase,
286 ULONG ImageSize,
287 ULONG BucketSize,
288 KPROFILE_SOURCE ProfileSource,
289 KAFFINITY Affinity
290 );
291
292 VOID
293 STDCALL
294 KeStartProfile(
295 struct _KPROFILE* Profile,
296 PVOID Buffer
297 );
298
299 BOOLEAN
300 STDCALL
301 KeStopProfile(struct _KPROFILE* Profile);
302
303 ULONG
304 STDCALL
305 KeQueryIntervalProfile(KPROFILE_SOURCE ProfileSource);
306
307 VOID
308 STDCALL
309 KeSetIntervalProfile(
310 KPROFILE_SOURCE ProfileSource,
311 ULONG Interval
312 );
313
314 VOID
315 STDCALL
316 KeProfileInterrupt(
317 PKTRAP_FRAME TrapFrame
318 );
319
320 VOID
321 STDCALL
322 KeProfileInterruptWithSource(
323 IN PKTRAP_FRAME TrapFrame,
324 IN KPROFILE_SOURCE Source
325 );
326
327 BOOLEAN
328 STDCALL
329 KiRosPrintAddress(PVOID Address);
330
331 VOID
332 STDCALL
333 KeUpdateRunTime(
334 PKTRAP_FRAME TrapFrame,
335 KIRQL Irql
336 );
337
338 VOID
339 STDCALL
340 KiExpireTimers(
341 PKDPC Dpc,
342 PVOID DeferredContext,
343 PVOID SystemArgument1,
344 PVOID SystemArgument2
345 );
346
347 VOID
348 NTAPI
349 KeInitializeThread(
350 IN PKPROCESS Process,
351 IN OUT PKTHREAD Thread,
352 IN PKSYSTEM_ROUTINE SystemRoutine,
353 IN PKSTART_ROUTINE StartRoutine,
354 IN PVOID StartContext,
355 IN PCONTEXT Context,
356 IN PVOID Teb,
357 IN PVOID KernelStack
358 );
359
360 VOID
361 NTAPI
362 KeUninitThread(
363 IN PKTHREAD Thread
364 );
365
366 NTSTATUS
367 NTAPI
368 KeInitThread(
369 IN OUT PKTHREAD Thread,
370 IN PVOID KernelStack,
371 IN PKSYSTEM_ROUTINE SystemRoutine,
372 IN PKSTART_ROUTINE StartRoutine,
373 IN PVOID StartContext,
374 IN PCONTEXT Context,
375 IN PVOID Teb,
376 IN PKPROCESS Process
377 );
378
379 VOID
380 NTAPI
381 KeStartThread(
382 IN OUT PKTHREAD Thread
383 );
384
385 BOOLEAN
386 NTAPI
387 KeAlertThread(
388 IN PKTHREAD Thread,
389 IN KPROCESSOR_MODE AlertMode
390 );
391
392 ULONG
393 NTAPI
394 KeAlertResumeThread(
395 IN PKTHREAD Thread
396 );
397
398 ULONG
399 NTAPI
400 KeResumeThread(
401 IN PKTHREAD Thread
402 );
403
404 PVOID
405 NTAPI
406 KeSwitchKernelStack(
407 IN PVOID StackBase,
408 IN PVOID StackLimit
409 );
410
411 VOID
412 STDCALL
413 KeRundownThread(VOID);
414
415 NTSTATUS
416 NTAPI
417 KeReleaseThread(PKTHREAD Thread);
418
419 LONG
420 STDCALL
421 KeQueryBasePriorityThread(IN PKTHREAD Thread);
422
423 VOID
424 STDCALL
425 KiSetPriorityThread(
426 PKTHREAD Thread,
427 KPRIORITY Priority,
428 PBOOLEAN Released
429 );
430
431 BOOLEAN
432 NTAPI
433 KiDispatcherObjectWake(
434 DISPATCHER_HEADER* hdr,
435 KPRIORITY increment
436 );
437
438 VOID
439 STDCALL
440 KeExpireTimers(
441 PKDPC Apc,
442 PVOID Arg1,
443 PVOID Arg2,
444 PVOID Arg3
445 );
446
447 VOID
448 NTAPI
449 KeDumpStackFrames(PULONG Frame);
450
451 BOOLEAN
452 NTAPI
453 KiTestAlert(VOID);
454
455 VOID
456 FASTCALL
457 KiAbortWaitThread(
458 IN PKTHREAD Thread,
459 IN NTSTATUS WaitStatus,
460 IN KPRIORITY Increment
461 );
462
463 VOID
464 STDCALL
465 KeInitializeProcess(
466 struct _KPROCESS *Process,
467 KPRIORITY Priority,
468 KAFFINITY Affinity,
469 LARGE_INTEGER DirectoryTableBase
470 );
471
472 VOID
473 NTAPI
474 KeSetQuantumProcess(
475 IN PKPROCESS Process,
476 IN UCHAR Quantum
477 );
478
479 KPRIORITY
480 NTAPI
481 KeSetPriorityAndQuantumProcess(
482 IN PKPROCESS Process,
483 IN KPRIORITY Priority,
484 IN UCHAR Quantum OPTIONAL
485 );
486
487 ULONG
488 STDCALL
489 KeForceResumeThread(IN PKTHREAD Thread);
490
491 BOOLEAN
492 STDCALL
493 KeDisableThreadApcQueueing(IN PKTHREAD Thread);
494
495 BOOLEAN
496 STDCALL
497 KiInsertTimer(
498 PKTIMER Timer,
499 LARGE_INTEGER DueTime
500 );
501
502 VOID
503 FASTCALL
504 KiWaitTest(
505 PVOID Object,
506 KPRIORITY Increment
507 );
508
509 PULONG
510 NTAPI
511 KeGetStackTopThread(struct _ETHREAD* Thread);
512
513 VOID
514 STDCALL
515 KeContextToTrapFrame(
516 PCONTEXT Context,
517 PKEXCEPTION_FRAME ExeptionFrame,
518 PKTRAP_FRAME TrapFrame,
519 ULONG ContextFlags,
520 KPROCESSOR_MODE PreviousMode
521 );
522
523 VOID
524 STDCALL
525 KiDeliverApc(
526 KPROCESSOR_MODE PreviousMode,
527 PVOID Reserved,
528 PKTRAP_FRAME TrapFrame
529 );
530
531 VOID
532 STDCALL
533 KiCheckForKernelApcDelivery(VOID);
534
535 LONG
536 STDCALL
537 KiInsertQueue(
538 IN PKQUEUE Queue,
539 IN PLIST_ENTRY Entry,
540 BOOLEAN Head
541 );
542
543 ULONG
544 STDCALL
545 KeSetProcess(
546 struct _KPROCESS* Process,
547 KPRIORITY Increment,
548 BOOLEAN InWait
549 );
550
551 VOID
552 STDCALL
553 KeInitializeEventPair(PKEVENT_PAIR EventPair);
554
555 VOID
556 STDCALL
557 KiInitializeUserApc(
558 IN PKEXCEPTION_FRAME Reserved,
559 IN PKTRAP_FRAME TrapFrame,
560 IN PKNORMAL_ROUTINE NormalRoutine,
561 IN PVOID NormalContext,
562 IN PVOID SystemArgument1,
563 IN PVOID SystemArgument2
564 );
565
566 PLIST_ENTRY
567 STDCALL
568 KeFlushQueueApc(
569 IN PKTHREAD Thread,
570 IN KPROCESSOR_MODE PreviousMode
571 );
572
573 VOID
574 STDCALL
575 KiAttachProcess(
576 struct _KTHREAD *Thread,
577 struct _KPROCESS *Process,
578 KIRQL ApcLock,
579 struct _KAPC_STATE *SavedApcState
580 );
581
582 VOID
583 STDCALL
584 KiSwapProcess(
585 struct _KPROCESS *NewProcess,
586 struct _KPROCESS *OldProcess
587 );
588
589 BOOLEAN
590 STDCALL
591 KeTestAlertThread(IN KPROCESSOR_MODE AlertMode);
592
593 BOOLEAN
594 STDCALL
595 KeRemoveQueueApc(PKAPC Apc);
596
597 VOID
598 FASTCALL
599 KiWakeQueue(IN PKQUEUE Queue);
600
601 /* INITIALIZATION FUNCTIONS *************************************************/
602
603 VOID
604 NTAPI
605 KeInitExceptions(VOID);
606
607 VOID
608 NTAPI
609 KeInitInterrupts(VOID);
610
611 VOID
612 NTAPI
613 KeInitTimer(VOID);
614
615 VOID
616 NTAPI
617 KeInitDispatcher(VOID);
618
619 VOID
620 NTAPI
621 KiInitializeSystemClock(VOID);
622
623 VOID
624 NTAPI
625 KiInitializeBugCheck(VOID);
626
627 VOID
628 NTAPI
629 Phase1Initialization(PVOID Context);
630
631 VOID
632 NTAPI
633 KiSystemStartup(
634 IN PROS_LOADER_PARAMETER_BLOCK LoaderBlock
635 );
636
637 VOID
638 NTAPI
639 KeInit2(VOID);
640
641 BOOLEAN
642 NTAPI
643 KiDeliverUserApc(PKTRAP_FRAME TrapFrame);
644
645 VOID
646 STDCALL
647 KiMoveApcState(
648 PKAPC_STATE OldState,
649 PKAPC_STATE NewState
650 );
651
652 VOID
653 NTAPI
654 KiAddProfileEvent(
655 KPROFILE_SOURCE Source,
656 ULONG Pc
657 );
658
659 VOID
660 NTAPI
661 KiDispatchException(
662 PEXCEPTION_RECORD ExceptionRecord,
663 PKEXCEPTION_FRAME ExceptionFrame,
664 PKTRAP_FRAME Tf,
665 KPROCESSOR_MODE PreviousMode,
666 BOOLEAN SearchFrames
667 );
668
669 VOID
670 NTAPI
671 KeTrapFrameToContext(
672 IN PKTRAP_FRAME TrapFrame,
673 IN PKEXCEPTION_FRAME ExceptionFrame,
674 IN OUT PCONTEXT Context
675 );
676
677 VOID
678 NTAPI
679 KeApplicationProcessorInit(VOID);
680
681 VOID
682 NTAPI
683 KePrepareForApplicationProcessorInit(ULONG id);
684
685 ULONG
686 NTAPI
687 KiUserTrapHandler(
688 PKTRAP_FRAME Tf,
689 ULONG ExceptionNr,
690 PVOID Cr2
691 );
692
693 VOID
694 STDCALL
695 KePushAndStackSwitchAndSysRet(
696 ULONG Push,
697 PVOID NewStack
698 );
699
700 VOID
701 STDCALL
702 KeStackSwitchAndRet(PVOID NewStack);
703
704 VOID
705 STDCALL
706 KeBugCheckWithTf(
707 ULONG BugCheckCode,
708 ULONG BugCheckParameter1,
709 ULONG BugCheckParameter2,
710 ULONG BugCheckParameter3,
711 ULONG BugCheckParameter4,
712 PKTRAP_FRAME Tf
713 );
714
715 VOID
716 NTAPI
717 KeFlushCurrentTb(VOID);
718
719 VOID
720 STDCALL
721 KeRosDumpStackFrames(
722 PULONG Frame,
723 ULONG FrameCount
724 );
725
726 VOID
727 NTAPI
728 KiSetSystemTime(PLARGE_INTEGER NewSystemTime);
729
730 ULONG
731 NTAPI
732 KeV86Exception(
733 ULONG ExceptionNr,
734 PKTRAP_FRAME Tf,
735 ULONG address
736 );
737
738 VOID
739 NTAPI
740 KiStartUnexpectedRange(
741 VOID
742 );
743
744 VOID
745 NTAPI
746 KiEndUnexpectedRange(
747 VOID
748 );
749
750 VOID
751 NTAPI
752 KiInterruptDispatch(
753 VOID
754 );
755
756 VOID
757 NTAPI
758 KiChainedDispatch(
759 VOID
760 );
761
762 VOID
763 NTAPI
764 Ki386AdjustEsp0(
765 IN PKTRAP_FRAME TrapFrame
766 );
767
768 VOID
769 NTAPI
770 Ki386SetupAndExitToV86Mode(
771 OUT PTEB VdmTeb
772 );
773
774 VOID
775 NTAPI
776 KeI386VdmInitialize(
777 VOID
778 );
779
780 VOID
781 NTAPI
782 KiFlushNPXState(
783 IN FLOATING_SAVE_AREA *SaveArea
784 );
785
786 #include "ke_x.h"
787
788 #endif /* __NTOSKRNL_INCLUDE_INTERNAL_KE_H */