Added freeldr and hal from PPC branch, along with needed headers and
[reactos.git] / reactos / include / ndk / powerpc / ketypes.h
1 /*++ NDK Version: 0095
2
3 Copyright (c) Alex Ionescu. All rights reserved.
4
5 Header Name:
6
7 ketypes.h (PPC)
8
9 Abstract:
10
11 PowerPC Type definitions for the Kernel services.
12
13 Author:
14
15 Alex Ionescu (alex.ionescu@reactos.com) 06-Oct-2004
16
17 --*/
18
19 #ifndef _POWERPC_KETYPES_H
20 #define _POWERPC_KETYPES_H
21
22 //
23 // Dependencies
24 //
25
26 //
27 // IPI Types
28 //
29 #define IPI_APC 1
30 #define IPI_DPC 2
31 #define IPI_FREEZE 3
32 #define IPI_PACKET_READY 4
33 #define IPI_SYNCH_REQUEST 10
34 #define MAXIMUM_VECTOR 0x100
35
36 #define KSEG0_BASE 0x80000000
37
38 #define PRCB_MAJOR_VERSION 1
39 #define PRCB_BUILD_DEBUG 1
40
41 #ifndef ROUND_UP
42 #define ROUND_UP(x,y) (((x) + ((y)-1)) & ~((y)-1))
43 #endif
44
45 typedef double DOUBLE;
46
47 typedef struct _FX_SAVE_AREA {
48 ULONG Fr[32];
49 } FX_SAVE_AREA;
50
51 typedef struct _LDT_ENTRY {
52 USHORT LimitLow;
53 USHORT BaseLow;
54 union
55 {
56 struct
57 {
58 UCHAR BaseMid;
59 UCHAR Flags1;
60 UCHAR Flags2;
61 UCHAR BaseHi;
62 } Bytes;
63 struct
64 {
65 ULONG BaseMid : 8;
66 ULONG Type : 5;
67 ULONG Dpl : 2;
68 ULONG Pres : 1;
69 ULONG LimitHi : 4;
70 ULONG Sys : 1;
71 ULONG Reserved_0 : 1;
72 ULONG Default_Big : 1;
73 ULONG Granularity : 1;
74 ULONG BaseHi : 8;
75 } Bits;
76 } HighWord;
77 } LDT_ENTRY;
78
79 #ifndef CONFIG_SMP
80 #define SYNCH_LEVEL DISPATCH_LEVEL
81 #else
82 #define SYNCH_LEVEL (IPI_LEVEL - 1)
83 #endif
84
85 //
86 // Trap Frame Definition
87 //
88 typedef struct _KTRAP_FRAME
89 {
90 PVOID TrapFrame;
91 UCHAR OldIrql;
92 UCHAR PreviousMode;
93 UCHAR SavedApcStateIndex;
94 UCHAR SavedKernelApcDisable;
95 UCHAR ExceptionRecord[ROUND_UP(sizeof(EXCEPTION_RECORD), sizeof(ULONGLONG))];
96 ULONG FILL2;
97 ULONG Gpr0;
98 ULONG Gpr1;
99 ULONG Gpr2;
100 ULONG Gpr3;
101 ULONG Gpr4;
102 ULONG Gpr5;
103 ULONG Gpr6;
104 ULONG Gpr7;
105 ULONG Gpr8;
106 ULONG Gpr9;
107 ULONG Gpr10;
108 ULONG Gpr11;
109 ULONG Gpr12;
110 DOUBLE Fpr0;
111 DOUBLE Fpr1;
112 DOUBLE Fpr2;
113 DOUBLE Fpr3;
114 DOUBLE Fpr4;
115 DOUBLE Fpr5;
116 DOUBLE Fpr6;
117 DOUBLE Fpr7;
118 DOUBLE Fpr8;
119 DOUBLE Fpr9;
120 DOUBLE Fpr10;
121 DOUBLE Fpr11;
122 DOUBLE Fpr12;
123 DOUBLE Fpr13;
124 DOUBLE Fpscr;
125 ULONG Cr;
126 ULONG Xer;
127 ULONG Msr;
128 ULONG Iar;
129 ULONG Lr;
130 ULONG Ctr;
131 ULONG Dr0;
132 ULONG Dr1;
133 ULONG Dr2;
134 ULONG Dr3;
135 ULONG Dr4;
136 ULONG Dr5;
137 ULONG Dr6;
138 ULONG Dr7;
139 } KTRAP_FRAME, *PKTRAP_FRAME;
140
141 //
142 // GDT Entry Definition
143 //
144 typedef struct _KGDTENTRY
145 {
146 USHORT LimitLow;
147 USHORT BaseLow;
148 union
149 {
150 struct
151 {
152 UCHAR BaseMid;
153 UCHAR Flags1;
154 UCHAR Flags2;
155 UCHAR BaseHi;
156 } Bytes;
157 struct
158 {
159 ULONG BaseMid:8;
160 ULONG Type:5;
161 ULONG Dpl:2;
162 ULONG Pres:1;
163 ULONG LimitHi:4;
164 ULONG Sys:1;
165 ULONG Reserved_0:1;
166 ULONG Default_Big:1;
167 ULONG Granularity:1;
168 ULONG BaseHi:8;
169 } Bits;
170 } HighWord;
171 } KGDTENTRY, *PKGDTENTRY;
172
173 //
174 // IDT Entry Definition
175 //
176 typedef struct _KIDTENTRY
177 {
178 USHORT Offset;
179 USHORT Selector;
180 USHORT Access;
181 USHORT ExtendedOffset;
182 } KIDTENTRY, *PKIDTENTRY;
183
184 typedef struct _DESCRIPTOR
185 {
186 USHORT Pad;
187 USHORT Limit;
188 ULONG Base;
189 } KDESCRIPTOR, *PKDESCRIPTOR;
190
191 //
192 // Special Registers Structure (outside of CONTEXT)
193 //
194 typedef struct _KSPECIAL_REGISTERS
195 {
196 ULONG KernelDr0;
197 ULONG KernelDr1;
198 ULONG KernelDr2;
199 ULONG KernelDr3;
200 ULONG KernelDr4;
201 ULONG KernelDr5;
202 ULONG KernelDr6;
203 ULONG KernelDr7;
204 ULONG Sprg0;
205 ULONG Sprg1;
206 ULONG Sr0;
207 ULONG Sr1;
208 ULONG Sr2;
209 ULONG Sr3;
210 ULONG Sr4;
211 ULONG Sr5;
212 ULONG Sr6;
213 ULONG Sr7;
214 ULONG Sr8;
215 ULONG Sr9;
216 ULONG Sr10;
217 ULONG Sr11;
218 ULONG Sr12;
219 ULONG Sr13;
220 ULONG Sr14;
221 ULONG Sr15;
222 ULONG DBAT0L;
223 ULONG DBAT0U;
224 ULONG DBAT1L;
225 ULONG DBAT1U;
226 ULONG DBAT2L;
227 ULONG DBAT2U;
228 ULONG DBAT3L;
229 ULONG DBAT3U;
230 ULONG IBAT0L;
231 ULONG IBAT0U;
232 ULONG IBAT1L;
233 ULONG IBAT1U;
234 ULONG IBAT2L;
235 ULONG IBAT2U;
236 ULONG IBAT3L;
237 ULONG IBAT3U;
238 ULONG Sdr1;
239 ULONG Reserved[9];
240 } KSPECIAL_REGISTERS, *PKSPECIAL_REGISTERS;
241
242 //
243 // Processor State Data
244 //
245 #pragma pack(push,4)
246 typedef struct _KPROCESSOR_STATE
247 {
248 CONTEXT ContextFrame;
249 KSPECIAL_REGISTERS SpecialRegisters;
250 } KPROCESSOR_STATE, *PKPROCESSOR_STATE;
251
252 //
253 // Processor Region Control Block
254 //
255 typedef struct _KPRCB
256 {
257 USHORT MinorVersion;
258 USHORT MajorVersion;
259 struct _KTHREAD *CurrentThread;
260 struct _KTHREAD *NextThread;
261 struct _KTHREAD *IdleThread;
262 UCHAR Number;
263 UCHAR Reserved;
264 USHORT BuildType;
265 KAFFINITY SetMember;
266 UCHAR CpuType;
267 UCHAR CpuID;
268 USHORT CpuStep;
269 KPROCESSOR_STATE ProcessorState;
270 ULONG KernelReserved[16];
271 ULONG HalReserved[16];
272 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
273 ULONG CFlushSize;
274 UCHAR PrcbPad0[88];
275 #else
276 UCHAR PrcbPad0[92];
277 #endif
278 KSPIN_LOCK_QUEUE LockQueue[LockQueueMaximumLock];
279 struct _KTHREAD *NpxThread;
280 ULONG InterruptCount;
281 ULONG KernelTime;
282 ULONG UserTime;
283 ULONG DpcTime;
284 ULONG DebugDpcTime;
285 ULONG InterruptTime;
286 ULONG AdjustDpcThreshold;
287 ULONG PageColor;
288 UCHAR SkipTick;
289 UCHAR DebuggerSavedIRQL;
290 #if (NTDDI_VERSION >= NTDDI_WS03)
291 UCHAR NodeColor;
292 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
293 UCHAR PollSlot;
294 #else
295 UCHAR Spare1;
296 #endif
297 ULONG NodeShiftedColor;
298 #else
299 UCHAR Spare1[6];
300 #endif
301 struct _KNODE *ParentNode;
302 ULONG MultiThreadProcessorSet;
303 struct _KPRCB *MultiThreadSetMaster;
304 #if (NTDDI_VERSION >= NTDDI_WS03)
305 ULONG SecondaryColorMask;
306 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
307 ULONG DpcTimeLimit;
308 #else
309 LONG Sleeping;
310 #endif
311 #else
312 ULONG ThreadStartCount[2];
313 #endif
314 ULONG CcFastReadNoWait;
315 ULONG CcFastReadWait;
316 ULONG CcFastReadNotPossible;
317 ULONG CcCopyReadNoWait;
318 ULONG CcCopyReadWait;
319 ULONG CcCopyReadNoWaitMiss;
320 #if (NTDDI_VERSION < NTDDI_LONGHORN)
321 ULONG KeAlignmentFixupCount;
322 #endif
323 ULONG SpareCounter0;
324 #if (NTDDI_VERSION < NTDDI_LONGHORN)
325 ULONG KeDcacheFlushCount;
326 ULONG KeExceptionDispatchCount;
327 ULONG KeFirstLevelTbFills;
328 ULONG KeFloatingEmulationCount;
329 ULONG KeIcacheFlushCount;
330 ULONG KeSecondLevelTbFills;
331 ULONG KeSystemCalls;
332 #endif
333 volatile ULONG IoReadOperationCount;
334 volatile ULONG IoWriteOperationCount;
335 volatile ULONG IoOtherOperationCount;
336 LARGE_INTEGER IoReadTransferCount;
337 LARGE_INTEGER IoWriteTransferCount;
338 LARGE_INTEGER IoOtherTransferCount;
339 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
340 ULONG CcFastMdlReadNoWait;
341 ULONG CcFastMdlReadWait;
342 ULONG CcFastMdlReadNotPossible;
343 ULONG CcMapDataNoWait;
344 ULONG CcMapDataWait;
345 ULONG CcPinMappedDataCount;
346 ULONG CcPinReadNoWait;
347 ULONG CcPinReadWait;
348 ULONG CcMdlReadNoWait;
349 ULONG CcMdlReadWait;
350 ULONG CcLazyWriteHotSpots;
351 ULONG CcLazyWriteIos;
352 ULONG CcLazyWritePages;
353 ULONG CcDataFlushes;
354 ULONG CcDataPages;
355 ULONG CcLostDelayedWrites;
356 ULONG CcFastReadResourceMiss;
357 ULONG CcCopyReadWaitMiss;
358 ULONG CcFastMdlReadResourceMiss;
359 ULONG CcMapDataNoWaitMiss;
360 ULONG CcMapDataWaitMiss;
361 ULONG CcPinReadNoWaitMiss;
362 ULONG CcPinReadWaitMiss;
363 ULONG CcMdlReadNoWaitMiss;
364 ULONG CcMdlReadWaitMiss;
365 ULONG CcReadAheadIos;
366 ULONG KeAlignmentFixupCount;
367 ULONG KeExceptionDispatchCount;
368 ULONG KeSystemCalls;
369 ULONG PrcbPad1[3];
370 #else
371 ULONG SpareCounter1[8];
372 #endif
373 PP_LOOKASIDE_LIST PPLookasideList[16];
374 PP_LOOKASIDE_LIST PPNPagedLookasideList[32];
375 PP_LOOKASIDE_LIST PPPagedLookasideList[32];
376 volatile ULONG PacketBarrier;
377 volatile ULONG ReverseStall;
378 PVOID IpiFrame;
379 UCHAR PrcbPad2[52];
380 volatile PVOID CurrentPacket[3];
381 volatile ULONG TargetSet;
382 volatile PKIPI_WORKER WorkerRoutine;
383 volatile ULONG IpiFrozen;
384 UCHAR PrcbPad3[40];
385 volatile ULONG RequestSummary;
386 volatile struct _KPRCB *SignalDone;
387 UCHAR PrcbPad4[56];
388 struct _KDPC_DATA DpcData[2];
389 PVOID DpcStack;
390 ULONG MaximumDpcQueueDepth;
391 ULONG DpcRequestRate;
392 ULONG MinimumDpcRate;
393 volatile UCHAR DpcInterruptRequested;
394 volatile UCHAR DpcThreadRequested;
395 volatile UCHAR DpcRoutineActive;
396 volatile UCHAR DpcThreadActive;
397 ULONG PrcbLock;
398 ULONG DpcLastCount;
399 volatile ULONG TimerHand;
400 volatile ULONG TimerRequest;
401 PVOID DpcThread;
402 KEVENT DpcEvent;
403 UCHAR ThreadDpcEnable;
404 volatile BOOLEAN QuantumEnd;
405 UCHAR PrcbPad50;
406 volatile UCHAR IdleSchedule;
407 LONG DpcSetEventRequest;
408 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
409 LONG Sleeping;
410 ULONG PeriodicCount;
411 ULONG PeriodicBias;
412 UCHAR PrcbPad5[6];
413 #else
414 UCHAR PrcbPad5[18];
415 #endif
416 LONG TickOffset;
417 KDPC CallDpc;
418 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
419 LONG ClockKeepAlive;
420 UCHAR ClockCheckSlot;
421 UCHAR ClockPollCycle;
422 UCHAR PrcbPad6[2];
423 LONG DpcWatchdogPeriod;
424 LONG DpcWatchDogCount;
425 LONG ThreadWatchdogPeriod;
426 LONG ThreadWatchDogCount;
427 ULONG PrcbPad70[2];
428 #else
429 ULONG PrcbPad7[8];
430 #endif
431 LIST_ENTRY WaitListHead;
432 ULONG ReadySummary;
433 ULONG QueueIndex;
434 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
435 SINGLE_LIST_ENTRY DeferredReadyListHead;
436 ULONGLONG StartCycles;
437 ULONGLONG CycleTime;
438 ULONGLONG PrcbPad71[3];
439 LIST_ENTRY DispatcherReadyListHead[32];
440 #else
441 LIST_ENTRY DispatcherReadyListHead[32];
442 SINGLE_LIST_ENTRY DeferredReadyListHead;
443 ULONG PrcbPad72[11];
444 #endif
445 PVOID ChainedInterruptList;
446 LONG LookasideIrpFloat;
447 volatile LONG MmPageFaultCount;
448 volatile LONG MmCopyOnWriteCount;
449 volatile LONG MmTransitionCount;
450 volatile LONG MmCacheTransitionCount;
451 volatile LONG MmDemandZeroCount;
452 volatile LONG MmPageReadCount;
453 volatile LONG MmPageReadIoCount;
454 volatile LONG MmCacheReadCount;
455 volatile LONG MmCacheIoCount;
456 volatile LONG MmDirtyPagesWriteCount;
457 volatile LONG MmDirtyWriteIoCount;
458 volatile LONG MmMappedPagesWriteCount;
459 volatile LONG MmMappedWriteIoCount;
460 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
461 ULONG CachedCommit;
462 ULONG CachedResidentAvailable;
463 PVOID HyperPte;
464 UCHAR CpuVendor;
465 UCHAR PrcbPad9[3];
466 #else
467 ULONG SpareFields0[1];
468 #endif
469 CHAR VendorString[13];
470 UCHAR InitialApicId;
471 UCHAR LogicalProcessorsPerPhysicalProcessor;
472 ULONG MHz;
473 ULONG FeatureBits;
474 LARGE_INTEGER UpdateSignature;
475 volatile LARGE_INTEGER IsrTime;
476 LARGE_INTEGER SpareField1;
477 FX_SAVE_AREA NpxSaveArea;
478 PROCESSOR_POWER_STATE PowerState;
479 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
480 KDPC DpcWatchdogDoc;
481 KTIMER DpcWatchdogTimer;
482 PVOID WheaInfo;
483 PVOID EtwSupport;
484 SLIST_HEADER InterruptObjectPool;
485 LARGE_INTEGER HyperCallPagePhysical;
486 LARGE_INTEGER HyperCallPageVirtual;
487 PVOID RateControl;
488 CACHE_DESCRIPTOR Cache[5];
489 ULONG CacheCount;
490 ULONG CacheProcessorMask[5];
491 UCHAR LogicalProcessorsPerCore;
492 UCHAR PrcbPad8[3];
493 ULONG PackageProcessorSet;
494 ULONG CoreProcessorSet;
495 #endif
496 } KPRCB, *PKPRCB;
497
498 //
499 // Processor Control Region
500 //
501 typedef struct _KIPCR
502 {
503 USHORT MinorVersion;
504 USHORT MajorVersion;
505 PKINTERRUPT_ROUTINE InterruptRoutine[MAXIMUM_VECTOR];
506 ULONG PcrPage2;
507 ULONG Kseg0Top;
508 ULONG Spare7[30];
509 ULONG FirstLevelDcacheSize;
510 ULONG FirstLevelDcacheFillSize;
511 ULONG FirstLevelIcacheSize;
512 ULONG FirstLevelIcacheFillSize;
513 ULONG SecondLevelDcacheSize;
514 ULONG SecondLevelDcacheFillSize;
515 ULONG SecondLevelIcacheSize;
516 ULONG SecondLevelIcacheFillSize;
517 struct _KPRCB *PrcbData;
518 PVOID Teb;
519 ULONG DcacheAlignment;
520 ULONG DcacheFillSize;
521 ULONG IcacheAlignment;
522 ULONG IcacheFillSize;
523 ULONG ProcessorVersion;
524 ULONG ProcessorRevision;
525 ULONG ProfileInterval;
526 ULONG ProfileCount;
527 ULONG StallExecutionCount;
528 ULONG StallScaleFactor;
529 ULONG Spare;
530 union
531 {
532 ULONG CachePolicy;
533 struct
534 {
535 UCHAR IcacheMode;
536 UCHAR DcacheMode;
537 USHORT ModeSpare;
538 };
539 };
540 UCHAR IrqlMask[32];
541 UCHAR IrqlTable[9];
542 UCHAR CurrentIrql;
543 CCHAR Number;
544 KAFFINITY SetMember;
545 ULONG ReservedVectors;
546 struct _KTHREAD *CurrentThread;
547 ULONG AlignedCachePolicy;
548 union
549 {
550 ULONG SoftwareInterrupt;
551 struct
552 {
553 UCHAR ApcInterrupt;
554 UCHAR DispatchInterrupt;
555 UCHAR Spare4;
556 UCHAR Spare5;
557 };
558 };
559 KAFFINITY NotMember;
560 ULONG SystemReserved[16];
561 ULONG HalReserved[16];
562 ULONG FirstLevelActive;
563 ULONG SystemServiceDispatchStart;
564 ULONG SystemServiceDispatchEnd;
565 ULONG InterruptStack;
566 ULONG QuantumEnd;
567 PVOID InitialStack;
568 PVOID PanicStack;
569 ULONG BadVaddr;
570 PVOID StackLimit;
571 PVOID SavedStackLimit;
572 ULONG SavedV0;
573 ULONG SavedV1;
574 UCHAR DebugActive;
575 UCHAR Spare6[3];
576 ULONG GprSave[6];
577 ULONG SiR0;
578 ULONG SiR2;
579 ULONG SiR3;
580 ULONG SiR4;
581 ULONG SiR5;
582 ULONG Spare0;
583 ULONG Spare8;
584 ULONG PgDirRa;
585 ULONG OnInterruptStack;
586 ULONG SavedInitialStack;
587 } KIPCR, *PKIPCR;
588 #pragma pack(pop)
589
590 //
591 // TSS Definition
592 //
593 typedef struct _KTSS {
594 } KTSS, *PKTSS;
595
596 //
597 // PowerPC Exception Frame
598 //
599 typedef struct _KEXCEPTION_FRAME
600 {
601 ULONG Fill1;
602 ULONG Gpr13;
603 ULONG Gpr14;
604 ULONG Gpr15;
605 ULONG Gpr16;
606 ULONG Gpr17;
607 ULONG Gpr18;
608 ULONG Gpr19;
609 ULONG Gpr20;
610 ULONG Gpr21;
611 ULONG Gpr22;
612 ULONG Gpr23;
613 ULONG Gpr24;
614 ULONG Gpr25;
615 ULONG Gpr26;
616 ULONG Gpr27;
617 ULONG Gpr28;
618 ULONG Gpr29;
619 ULONG Gpr30;
620 ULONG Gpr31;
621 DOUBLE Fpr14;
622 DOUBLE Fpr15;
623 DOUBLE Fpr16;
624 DOUBLE Fpr17;
625 DOUBLE Fpr18;
626 DOUBLE Fpr19;
627 DOUBLE Fpr20;
628 DOUBLE Fpr21;
629 DOUBLE Fpr22;
630 DOUBLE Fpr23;
631 DOUBLE Fpr24;
632 DOUBLE Fpr25;
633 DOUBLE Fpr26;
634 DOUBLE Fpr27;
635 DOUBLE Fpr28;
636 DOUBLE Fpr29;
637 DOUBLE Fpr30;
638 DOUBLE Fpr31;
639 } KEXCEPTION_FRAME, *PKEXCEPTION_FRAME;
640
641 FORCEINLINE
642 struct _KPRCB *
643 KeGetCurrentPrcb(VOID)
644 {
645 return (struct _KPRCB *)(ULONG_PTR)__readfsdword(FIELD_OFFSET(KIPCR, PrcbData));
646 }
647
648 #endif