[ARMDDK]: Oh, right, forgot how this was laid out. should fix ARM build.
[reactos.git] / reactos / include / reactos / arm / armddk.h
index 178bb50..e068e5c 100644 (file)
 //
 // FIXME: mmtypes.h?
 //
-#define KIPCR                   0xFFFFF000
-#define KI_USER_SHARED_DATA     0xFFFFE000
+#define KIP0PCRADDRESS          0xFFDFF000
+#define KI_USER_SHARED_DATA     0xFFDF0000
 #define USPCR                   0x7FFF0000
-#define PCR                     ((volatile KPCR * const)KIPCR)
+#define PCR                     ((KPCR * const)KIP0PCRADDRESS)
 #define USERPCR                 ((volatile KPCR * const)USPCR)
 #define KeGetPcr()              PCR
 #ifndef _WINNT_H
@@ -47,32 +47,23 @@ extern ULONG_PTR MmUserProbeAddress;
 #define MM_SYSTEM_RANGE_START             MmSystemRangeStart
 #define MM_USER_PROBE_ADDRESS             MmUserProbeAddress
 #define MM_LOWEST_USER_ADDRESS            (PVOID)0x10000
-#define MM_LOWEST_SYSTEM_ADDRESS          (PVOID)0xC1400000
+#define MM_LOWEST_SYSTEM_ADDRESS          (PVOID)0xC0800000
 
 //
 // Maximum IRQs
 //
 #define MAXIMUM_VECTOR          16
 
-//
-// Just read it from the PCR
-//
-#define KeGetCurrentProcessorNumber()  (int)PCR->Number
-#define KeGetCurrentIrql()             PCR->CurrentIrql
-#define _KeGetCurrentThread()          PCR->CurrentThread
-#define _KeGetPreviousMode()           PCR->CurrentThread->PreviousMode
-#define _KeIsExecutingDpc()            (PCR->DpcRoutineActive != 0)
-#define KeGetCurrentThread()           _KeGetCurrentThread()
-#define KeGetPreviousMode()            _KeGetPreviousMode()
-#define KeGetDcacheFillSize()          PCR->DcacheFillSize
-
+#define KERNEL_STACK_SIZE                   12288
+#define KERNEL_LARGE_STACK_SIZE             61440
+#define KERNEL_LARGE_STACK_COMMIT           12288
 
 //
 // Used to contain PFNs and PFN counts
 //
-typedef ULONG PFN_COUNT;
-typedef ULONG PFN_NUMBER, *PPFN_NUMBER;
-typedef LONG SPFN_NUMBER, *PSPFN_NUMBER;
+//typedef ULONG PFN_COUNT;
+//typedef ULONG PFN_NUMBER, *PPFN_NUMBER;
+//typedef LONG SPFN_NUMBER, *PSPFN_NUMBER;
 
 //
 // Stub
@@ -132,69 +123,62 @@ typedef struct _CONTEXT {
 
 //
 // Processor Control Region
-// On ARM, it's actually readable from user-mode, much like KUSER_SHARED_DATA
 //
 #ifdef _WINNT_H
-typedef
-VOID
-(*PKINTERRUPT_ROUTINE)(VOID);
+#define KIRQL ULONG
 #endif
+
+typedef struct _NT_TIB_KPCR {
+       struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList;
+       PVOID StackBase;
+       PVOID StackLimit;
+       PVOID SubSystemTib;
+       _ANONYMOUS_UNION union {
+               PVOID FiberData;
+               ULONG Version;
+       } DUMMYUNIONNAME;
+       PVOID ArbitraryUserPointer;
+       struct _NT_TIB_KPCR *Self;
+} NT_TIB_KPCR,*PNT_TIB_KPCR;
+
 typedef struct _KPCR
 {
-    ULONG MinorVersion;
-    ULONG MajorVersion;
-    PKINTERRUPT_ROUTINE InterruptRoutine[32];
-    PVOID XcodeDispatch;
-    ULONG FirstLevelDcacheSize;
-    ULONG FirstLevelDcacheFillSize;
-    ULONG FirstLevelIcacheSize;
-    ULONG FirstLevelIcacheFillSize;
-    ULONG SecondLevelDcacheSize;
-    ULONG SecondLevelDcacheFillSize;
-    ULONG SecondLevelIcacheSize;
-    ULONG SecondLevelIcacheFillSize;
+    union
+    {
+        NT_TIB_KPCR NtTib;
+        struct
+        {
+            struct _EXCEPTION_REGISTRATION_RECORD *Used_ExceptionList; // Unused
+            PVOID Used_StackBase; // Unused
+            PVOID PerfGlobalGroupMask;
+            PVOID TssCopy; // Unused
+            ULONG ContextSwitches;
+            KAFFINITY SetMemberCopy; // Unused
+            PVOID Used_Self;
+        };
+    };
+    struct _KPCR *Self;
     struct _KPRCB *Prcb;
-    struct _TEB *Teb;
-    PVOID TlsArray;
-    ULONG DcacheFillSize;
-    ULONG IcacheAlignment;
-    ULONG IcacheFillSize;
-    ULONG ProcessorId;
-    ULONG ProfileInterval;
-    ULONG ProfileCount;
-    ULONG StallExecutionCount;
-    ULONG StallScaleFactor;
-    CCHAR Number;
-    PVOID DataBusError;
-    PVOID InstructionBusError;
-    ULONG CachePolicy;
-    ULONG AlignedCachePolicy;
-    UCHAR IrqlMask[32];
-    ULONG IrqlTable[32];
-    UCHAR CurrentIrql;
+    KIRQL Irql;
+    ULONG IRR; // Unused
+    ULONG IrrActive; // Unused
+    ULONG IDR; // Unused
+    PVOID KdVersionBlock;
+    PVOID IDT; // Unused
+    PVOID GDT; // Unused
+    PVOID TSS; // Unused
+    USHORT MajorVersion;
+    USHORT MinorVersion;
     KAFFINITY SetMember;
-    struct _KTHREAD *CurrentThread;
-    ULONG ReservedVectors;
-    KAFFINITY NotMember;
-    ULONG SystemReserved[6];
-    ULONG DcacheAlignment;
-    ULONG HalReserved[64];
-    BOOLEAN FirstLevelActive;
-    BOOLEAN DpcRoutineActive;
-    ULONG CurrentPid;
-    BOOLEAN OnInterruptStack;
-    PVOID SavedInitialStack;
-    PVOID SavedStackLimit;
-    PVOID SystemServiceDispatchStart;
-    PVOID SystemServiceDispatchEnd;
-    PVOID InterruptStack;
-    PVOID PanicStack;
-    PVOID BadVaddr;
-    PVOID InitialStack;
-    PVOID StackLimit;
-    ULONG QuantumEnd;
-    PVOID PerfGlobalGroupMask;
-    ULONG ContextSwitches;
+    ULONG StallScaleFactor;
+    UCHAR SpareUnused;
+    UCHAR Number;
+    UCHAR Spare0;
+    UCHAR SecondLevelCacheAssociativity;
+    ULONG VdmAlert;
+    ULONG KernelReserved[14];
+    ULONG SecondLevelCacheSize;
+    ULONG HalReserved[16];
 } KPCR, *PKPCR;
 
 //
@@ -203,9 +187,44 @@ typedef struct _KPCR
 FORCEINLINE
 struct _TEB* NtCurrentTeb(VOID)
 {
-    return (struct _TEB*)USERPCR->Teb;
+    return (struct _TEB*)USERPCR->Used_Self;
 }
 
+NTSYSAPI
+struct _KTHREAD*
+NTAPI
+KeGetCurrentThread(VOID);
+
+extern volatile struct _KSYSTEM_TIME KeTickCount;
+
+#ifndef YieldProcessor
+#define YieldProcessor __yield
+#endif
+
+#define ASSERT_BREAKPOINT BREAKPOINT_COMMAND_STRING + 1
+
+#define DbgRaiseAssertionFailure() __break(ASSERT_BREAKPOINT)
+
+#define PCR_MINOR_VERSION 1
+#define PCR_MAJOR_VERSION 1
+
+#define RESULT_ZERO     0
+#define RESULT_NEGATIVE 1
+#define RESULT_POSITIVE 2
+
+DECLSPEC_IMPORT
+VOID
+__fastcall
+KfReleaseSpinLock(
+  IN OUT ULONG_PTR* SpinLock,
+  IN KIRQL NewIrql);
+
+DECLSPEC_IMPORT
+KIRQL
+__fastcall
+KfAcquireSpinLock(
+  IN OUT ULONG_PTR* SpinLock);
+
 #ifndef _WINNT_H
 //
 // IRQL Support on ARM is similar to MIPS/ALPHA
@@ -245,6 +264,26 @@ VOID
 HalSweepIcache(
     VOID
 );
+
+FORCEINLINE
+VOID
+_KeQueryTickCount(
+  OUT PLARGE_INTEGER CurrentCount)
+{
+  for (;;) {
+#ifdef NONAMELESSUNION
+    CurrentCount->s.HighPart = KeTickCount.High1Time;
+    CurrentCount->s.LowPart = KeTickCount.LowPart;
+    if (CurrentCount->s.HighPart == KeTickCount.High2Time) break;
+#else
+    CurrentCount->HighPart = KeTickCount.High1Time;
+    CurrentCount->LowPart = KeTickCount.LowPart;
+    if (CurrentCount->HighPart == KeTickCount.High2Time) break;
+#endif
+    YieldProcessor();
+  }
+}
+#define KeQueryTickCount(CurrentCount) _KeQueryTickCount(CurrentCount)
 #endif
 
 //