$if (_WDMDDK_) /** Kernel definitions for ARM **/ /* Interrupt request levels */ #define PASSIVE_LEVEL 0 #define LOW_LEVEL 0 #define APC_LEVEL 1 #define DISPATCH_LEVEL 2 #define CLOCK_LEVEL 13 #define IPI_LEVEL 14 #define DRS_LEVEL 14 #define POWER_LEVEL 14 #define PROFILE_LEVEL 15 #define HIGH_LEVEL 15 #define KIP0PCRADDRESS 0xFFDFF000 #define KI_USER_SHARED_DATA 0xFFFF9000 #define SharedUserData ((KUSER_SHARED_DATA * const)KI_USER_SHARED_DATA) #define PAGE_SIZE 0x1000 #define PAGE_SHIFT 12L typedef struct _KFLOATING_SAVE { ULONG Reserved; } KFLOATING_SAVE, *PKFLOATING_SAVE; extern NTKERNELAPI volatile KSYSTEM_TIME KeTickCount; FORCEINLINE VOID YieldProcessor( VOID) { __dmb(_ARM_BARRIER_ISHST); __yield(); } #define MemoryBarrier() __dmb(_ARM_BARRIER_SY) #define PreFetchCacheLine(l,a) __prefetch((const void *) (a)) #define PrefetchForWrite(p) __prefetch((const void *) (p)) #define ReadForWriteAccess(p) (*(p)) FORCEINLINE VOID KeMemoryBarrier( VOID) { _ReadWriteBarrier(); MemoryBarrier(); } #define KeMemoryBarrierWithoutFence() _ReadWriteBarrier() _IRQL_requires_max_(HIGH_LEVEL) _IRQL_saves_ NTHALAPI KIRQL NTAPI KeGetCurrentIrql( VOID); _IRQL_requires_max_(HIGH_LEVEL) NTHALAPI VOID FASTCALL KfLowerIrql( _In_ _IRQL_restores_ _Notliteral_ KIRQL NewIrql); #define KeLowerIrql(a) KfLowerIrql(a) _IRQL_requires_max_(HIGH_LEVEL) _IRQL_raises_(NewIrql) _IRQL_saves_ NTHALAPI KIRQL FASTCALL KfRaiseIrql( _In_ KIRQL NewIrql); #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a) _IRQL_requires_max_(DISPATCH_LEVEL) _IRQL_saves_ _IRQL_raises_(DISPATCH_LEVEL) NTHALAPI KIRQL NTAPI KeRaiseIrqlToDpcLevel(VOID); NTHALAPI KIRQL NTAPI KeRaiseIrqlToSynchLevel(VOID); _Requires_lock_not_held_(*SpinLock) _Acquires_lock_(*SpinLock) _IRQL_requires_max_(DISPATCH_LEVEL) _IRQL_saves_ _IRQL_raises_(DISPATCH_LEVEL) NTHALAPI KIRQL FASTCALL KfAcquireSpinLock( _Inout_ PKSPIN_LOCK SpinLock); #define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a) _Requires_lock_held_(*SpinLock) _Releases_lock_(*SpinLock) _IRQL_requires_(DISPATCH_LEVEL) NTHALAPI VOID FASTCALL KfReleaseSpinLock( _Inout_ PKSPIN_LOCK SpinLock, _In_ _IRQL_restores_ KIRQL NewIrql); #define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b) _Requires_lock_not_held_(*SpinLock) _Acquires_lock_(*SpinLock) _IRQL_requires_min_(DISPATCH_LEVEL) NTKERNELAPI VOID FASTCALL KefAcquireSpinLockAtDpcLevel( _Inout_ PKSPIN_LOCK SpinLock); #define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock) _Requires_lock_held_(*SpinLock) _Releases_lock_(*SpinLock) _IRQL_requires_min_(DISPATCH_LEVEL) NTKERNELAPI VOID FASTCALL KefReleaseSpinLockFromDpcLevel( _Inout_ PKSPIN_LOCK SpinLock); #define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock) NTSYSAPI PKTHREAD NTAPI KeGetCurrentThread(VOID); _Always_(_Post_satisfies_(return<=0)) _Must_inspect_result_ _IRQL_requires_max_(DISPATCH_LEVEL) _Kernel_float_saved_ _At_(*FloatSave, _Kernel_requires_resource_not_held_(FloatState) _Kernel_acquires_resource_(FloatState)) FORCEINLINE NTSTATUS KeSaveFloatingPointState( _Out_ PKFLOATING_SAVE FloatSave) { UNREFERENCED_PARAMETER(FloatSave); return STATUS_SUCCESS; } _Success_(1) _Kernel_float_restored_ _At_(*FloatSave, _Kernel_requires_resource_held_(FloatState) _Kernel_releases_resource_(FloatState)) FORCEINLINE NTSTATUS KeRestoreFloatingPointState( _In_ PKFLOATING_SAVE FloatSave) { UNREFERENCED_PARAMETER(FloatSave); return STATUS_SUCCESS; } VOID KeFlushIoBuffers( _In_ PMDL Mdl, _In_ BOOLEAN ReadOperation, _In_ BOOLEAN DmaOperation); #define DbgRaiseAssertionFailure() __emit(0xdefc) 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) #define CP15_PMSELR 15, 0, 9, 12, 5 /* Event Counter Selection Register */ #define CP15_PMXEVCNTR 15, 0, 9, 13, 2 /* Event Count Register */ #define CP15_TPIDRURW 15, 0, 13, 0, 2 /* Software Thread ID Register, UsRW */ #define CP15_TPIDRURO 15, 0, 13, 0, 3 /* Software Thread ID Register, UsRO */ #define CP15_TPIDRPRW 15, 0, 13, 0, 4 /* Software Thread ID Register, Kernel */ $endif (_WDMDDK_) $if (_NTDDK_) #define PAUSE_PROCESSOR __yield(); #define KERNEL_STACK_SIZE 0x3000 #define KERNEL_LARGE_STACK_SIZE 0xF000 #define KERNEL_LARGE_STACK_COMMIT KERNEL_STACK_SIZE #define KERNEL_MCA_EXCEPTION_STACK_SIZE 0x2000 #define EXCEPTION_READ_FAULT 0 #define EXCEPTION_WRITE_FAULT 1 #define EXCEPTION_EXECUTE_FAULT 8 /* The following flags control the contents of the CONTEXT structure. */ #define CONTEXT_ARM 0x200000L #define CONTEXT_CONTROL (CONTEXT_ARM | 0x00000001L) #define CONTEXT_INTEGER (CONTEXT_ARM | 0x00000002L) #define CONTEXT_FLOATING_POINT (CONTEXT_ARM | 0x00000004L) #define CONTEXT_DEBUG_REGISTERS (CONTEXT_ARM | 0x00000008L) #define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT) typedef struct _NEON128 { ULONGLONG Low; LONGLONG High; } NEON128, *PNEON128; #define ARM_MAX_BREAKPOINTS 8 #define ARM_MAX_WATCHPOINTS 1 typedef struct _CONTEXT { /* The flags values within this flag control the contents of a CONTEXT record. If the context record is used as an input parameter, then for each portion of the context record controlled by a flag whose value is set, it is assumed that that portion of the context record contains valid context. If the context record is being used to modify a thread's context, then only that portion of the threads context will be modified. If the context record is used as an IN OUT parameter to capture the context of a thread, then only those portions of the thread's context corresponding to set flags will be returned. The context record is never used as an OUT only parameter. */ ULONG ContextFlags; /* This section is specified/returned if the ContextFlags word contains the flag CONTEXT_INTEGER. */ ULONG R0; ULONG R1; ULONG R2; ULONG R3; ULONG R4; ULONG R5; ULONG R6; ULONG R7; ULONG R8; ULONG R9; ULONG R10; ULONG R11; ULONG R12; ULONG Sp; ULONG Lr; ULONG Pc; ULONG Cpsr; /* Floating Point/NEON Registers */ ULONG Fpscr; ULONG Padding; union { NEON128 Q[16]; ULONGLONG D[32]; ULONG S[32]; } DUMMYUNIONNAME; /* Debug registers */ ULONG Bvr[ARM_MAX_BREAKPOINTS]; ULONG Bcr[ARM_MAX_BREAKPOINTS]; ULONG Wvr[ARM_MAX_WATCHPOINTS]; ULONG Wcr[ARM_MAX_WATCHPOINTS]; ULONG Padding2[2]; } CONTEXT; #define PCR_MINOR_VERSION 1 #define PCR_MAJOR_VERSION 1 typedef struct _KPCR { _ANONYMOUS_UNION union { NT_TIB NtTib; _ANONYMOUS_STRUCT struct { ULONG TibPad0[2]; PVOID Spare1; struct _KPCR *Self; struct _KPRCB *CurrentPrcb; PKSPIN_LOCK_QUEUE LockArray; PVOID Used_Self; }; }; KIRQL CurrentIrql; UCHAR SecondLevelCacheAssociativity; ULONG Unused0[3]; USHORT MajorVersion; USHORT MinorVersion; ULONG StallScaleFactor; PVOID Unused1[3]; ULONG KernelReserved[15]; ULONG SecondLevelCacheSize; _ANONYMOUS_UNION union { USHORT SoftwareInterruptPending; // Software Interrupt Pending Flag struct { UCHAR ApcInterrupt; // 0x01 if APC int pending UCHAR DispatchInterrupt; // 0x01 if dispatch int pending }; }; USHORT InterruptPad; ULONG HalReserved[32]; PVOID KdVersionBlock; PVOID Unused3; ULONG PcrAlign1[8]; } KPCR, *PKPCR; #define CP15_PCR_RESERVED_MASK 0xFFF #define KIPCR() (((ULONG_PTR)_MoveFromCoprocessor(CP15_TPIDRPRW)) & ~CP15_PCR_RESERVED_MASK) FORCEINLINE PKPCR KeGetPcr(VOID) { return (PKPCR)KIPCR(); } #if (NTDDI_VERSION < NTDDI_WIN7) || !defined(NT_PROCESSOR_GROUPS) FORCEINLINE ULONG KeGetCurrentProcessorNumber(VOID) { return (ULONG)*((PUCHAR)KIPCR() + 0x580); } #endif /* (NTDDI_VERSION < NTDDI_WIN7) || !defined(NT_PROCESSOR_GROUPS) */ $endif (_NTDDK_)