#ifndef _ARMDDK_
#define _ARMDDK_
+//
+// Page size
+//
+#ifndef PAGE_SIZE
+#define PAGE_SIZE 0x1000
+#endif
+
+#ifndef _WINNT_H
//
// IRQLs
//
#define IPI_LEVEL 29
#define POWER_LEVEL 30
#define HIGH_LEVEL 31
+#endif
//
// 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
+#define SharedUserData ((KUSER_SHARED_DATA * const)KI_USER_SHARED_DATA)
//
-// Maximum IRQs
+// Address space layout
//
-#define MAXIMUM_VECTOR 16
+extern PVOID MmHighestUserAddress;
+extern PVOID MmSystemRangeStart;
+extern ULONG_PTR MmUserProbeAddress;
+#define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress
+#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)0xC0800000
//
-// Just read it from the PCR
+// Maximum IRQs
//
-#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 MAXIMUM_VECTOR 16
+#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
ULONG Pc;
ULONG Psr;
} CONTEXT;
+#endif
//
// 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[MAXIMUM_VECTOR];
- 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[HIGH_LEVEL + 1];
- ULONG IrqlTable[HIGH_LEVEL + 1];
- 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;
//
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
//
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
+
+//
+// Intrinsics
+//
+#define InterlockedDecrement _InterlockedDecrement
+#define InterlockedIncrement _InterlockedIncrement
+#define InterlockedExchange _InterlockedExchange
#endif