[XDK/DDK/NDK/PSDK/ARMDDK]

- Move stuff from armddk.h to XDK/DDK
- Fix ARM CONTEXT flags
- Add missing KeGetCurrentIrql() for ARM
- Improve some amd64 based definitions
- Use Native math for Int64Sh**Mod32 on ARM

svn path=/trunk/; revision=67631
This commit is contained in:
Timo Kreuzer 2015-05-10 19:34:38 +00:00
parent 840af6fcb3
commit c74c888770
16 changed files with 918 additions and 419 deletions

View file

@ -2023,10 +2023,10 @@ typedef struct _TIMER_SET_COALESCABLE_TIMER_INFO {
#define XSTATE_LEGACY_SSE 1 #define XSTATE_LEGACY_SSE 1
#define XSTATE_GSSE 2 #define XSTATE_GSSE 2
#define XSTATE_MASK_LEGACY_FLOATING_POINT (1i64 << (XSTATE_LEGACY_FLOATING_POINT)) #define XSTATE_MASK_LEGACY_FLOATING_POINT (1LL << (XSTATE_LEGACY_FLOATING_POINT))
#define XSTATE_MASK_LEGACY_SSE (1i64 << (XSTATE_LEGACY_SSE)) #define XSTATE_MASK_LEGACY_SSE (1LL << (XSTATE_LEGACY_SSE))
#define XSTATE_MASK_LEGACY (XSTATE_MASK_LEGACY_FLOATING_POINT | XSTATE_MASK_LEGACY_SSE) #define XSTATE_MASK_LEGACY (XSTATE_MASK_LEGACY_FLOATING_POINT | XSTATE_MASK_LEGACY_SSE)
#define XSTATE_MASK_GSSE (1i64 << (XSTATE_GSSE)) #define XSTATE_MASK_GSSE (1LL << (XSTATE_GSSE))
#define MAXIMUM_XSTATE_FEATURES 64 #define MAXIMUM_XSTATE_FEATURES 64
@ -3327,13 +3327,17 @@ extern NTKERNELAPI PVOID MmHighestUserAddress;
extern NTKERNELAPI PVOID MmSystemRangeStart; extern NTKERNELAPI PVOID MmSystemRangeStart;
extern NTKERNELAPI ULONG64 MmUserProbeAddress; extern NTKERNELAPI ULONG64 MmUserProbeAddress;
#define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress #define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress
#define MM_SYSTEM_RANGE_START MmSystemRangeStart #define MM_SYSTEM_RANGE_START MmSystemRangeStart
#define MM_USER_PROBE_ADDRESS MmUserProbeAddress #if defined(_LOCAL_COPY_USER_PROBE_ADDRESS_)
#define MM_LOWEST_USER_ADDRESS (PVOID)0x10000 #define MM_USER_PROBE_ADDRESS _LOCAL_COPY_USER_PROBE_ADDRESS_
extern ULONG64 _LOCAL_COPY_USER_PROBE_ADDRESS_;
#else
#define MM_USER_PROBE_ADDRESS MmUserProbeAddress
#endif
#define MM_LOWEST_USER_ADDRESS (PVOID)0x10000
#define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xFFFF080000000000ULL #define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xFFFF080000000000ULL
#elif defined(_M_IA64) #elif defined(_M_IA64)
#elif defined(_M_PPC) #elif defined(_M_PPC)
@ -3343,7 +3347,184 @@ extern NTKERNELAPI ULONG64 MmUserProbeAddress;
#elif defined(_M_ARM) #elif defined(_M_ARM)
#define KeMemoryBarrierWithoutFence() _ReadWriteBarrier() #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)(_MoveFromCoprocessor(CP15_TPIDRPRW) & ~CP15_PCR_RESERVED_MASK);
}
#if (NTDDI_VERSION < NTDDI_WIN7) || !defined(NT_PROCESSOR_GROUPS)
FORCEINLINE
ULONG
KeGetCurrentProcessorNumber(
VOID)
{
return *((PUCHAR)KeGetPcr() + 0x580);
}
#endif /* (NTDDI_VERSION < NTDDI_WIN7) || !defined(NT_PROCESSOR_GROUPS) */
#define PTI_SHIFT 12
#define PDI_SHIFT 22
#define PDE_BASE 0xC0300000
#define PTE_BASE 0xC0000000
#define PDE_TOP 0xC0300FFF
#define PTE_TOP 0xC03FFFFF
extern NTKERNELAPI PVOID MmHighestUserAddress;
extern NTKERNELAPI PVOID MmSystemRangeStart;
extern NTKERNELAPI ULONG MmUserProbeAddress;
#define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress
#define MM_SYSTEM_RANGE_START MmSystemRangeStart
#if defined(_LOCAL_COPY_USER_PROBE_ADDRESS_)
#define MM_USER_PROBE_ADDRESS _LOCAL_COPY_USER_PROBE_ADDRESS_
extern ULONG _LOCAL_COPY_USER_PROBE_ADDRESS_;
#else
#define MM_USER_PROBE_ADDRESS MmUserProbeAddress
#endif
#define MM_LOWEST_USER_ADDRESS (PVOID)0x10000
#define MM_KSEG0_BASE MM_SYSTEM_RANGE_START
#define MM_SYSTEM_SPACE_END 0xFFFFFFFF
#else #else
#error Unknown Architecture #error Unknown Architecture
#endif #endif

View file

@ -8623,7 +8623,7 @@ _KeQueryTickCount(
#define HIGH_LEVEL 15 #define HIGH_LEVEL 15
#define KI_USER_SHARED_DATA 0xFFFFF78000000000ULL #define KI_USER_SHARED_DATA 0xFFFFF78000000000ULL
#define SharedUserData ((PKUSER_SHARED_DATA const)KI_USER_SHARED_DATA) #define SharedUserData ((KUSER_SHARED_DATA * const)KI_USER_SHARED_DATA)
#define SharedInterruptTime (KI_USER_SHARED_DATA + 0x8) #define SharedInterruptTime (KI_USER_SHARED_DATA + 0x8)
#define SharedSystemTime (KI_USER_SHARED_DATA + 0x14) #define SharedSystemTime (KI_USER_SHARED_DATA + 0x14)
#define SharedTickCount (KI_USER_SHARED_DATA + 0x320) #define SharedTickCount (KI_USER_SHARED_DATA + 0x320)
@ -8635,8 +8635,9 @@ _KeQueryTickCount(
#define EFLAG_ZERO 0x4000 #define EFLAG_ZERO 0x4000
#define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO) #define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO)
typedef struct _KFLOATING_SAVE { typedef struct _KFLOATING_SAVE
ULONG Dummy; {
ULONG Dummy;
} KFLOATING_SAVE, *PKFLOATING_SAVE; } KFLOATING_SAVE, *PKFLOATING_SAVE;
typedef XSAVE_FORMAT XMM_SAVE_AREA32, *PXMM_SAVE_AREA32; typedef XSAVE_FORMAT XMM_SAVE_AREA32, *PXMM_SAVE_AREA32;
@ -8662,78 +8663,101 @@ typedef XSAVE_FORMAT XMM_SAVE_AREA32, *PXMM_SAVE_AREA32;
FORCEINLINE FORCEINLINE
VOID VOID
KeMemoryBarrier(VOID) KeMemoryBarrier(
VOID)
{ {
// FIXME: Do we really need lfence after the __faststorefence ? // FIXME: Do we really need lfence after the __faststorefence ?
FastFence(); FastFence();
LFENCE_ACQUIRE(); LFENCE_ACQUIRE();
} }
#define KeMemoryBarrierWithoutFence() _ReadWriteBarrier() #define KeMemoryBarrierWithoutFence() _ReadWriteBarrier()
_IRQL_requires_max_(HIGH_LEVEL)
_IRQL_saves_
FORCEINLINE FORCEINLINE
KIRQL KIRQL
KeGetCurrentIrql(VOID) KeGetCurrentIrql(VOID)
{ {
return (KIRQL)__readcr8(); return (KIRQL)__readcr8();
} }
_IRQL_requires_max_(HIGH_LEVEL)
FORCEINLINE FORCEINLINE
VOID VOID
KeLowerIrql(IN KIRQL NewIrql) KeLowerIrql(
_In_ _IRQL_restores_ _Notliteral_ KIRQL NewIrql)
{ {
//ASSERT((KIRQL)__readcr8() >= NewIrql); //ASSERT((KIRQL)__readcr8() >= NewIrql);
__writecr8(NewIrql); __writecr8(NewIrql);
} }
_IRQL_requires_max_(HIGH_LEVEL)
_IRQL_raises_(NewIrql)
_IRQL_saves_
FORCEINLINE FORCEINLINE
KIRQL KIRQL
KfRaiseIrql(IN KIRQL NewIrql) KfRaiseIrql(
_In_ KIRQL NewIrql)
{ {
KIRQL OldIrql; KIRQL OldIrql;
OldIrql = (KIRQL)__readcr8(); OldIrql = (KIRQL)__readcr8();
//ASSERT(OldIrql <= NewIrql); //ASSERT(OldIrql <= NewIrql);
__writecr8(NewIrql); __writecr8(NewIrql);
return OldIrql; return OldIrql;
} }
#define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a) #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
_IRQL_requires_max_(DISPATCH_LEVEL)
_IRQL_saves_
_IRQL_raises_(DISPATCH_LEVEL)
FORCEINLINE FORCEINLINE
KIRQL KIRQL
KeRaiseIrqlToDpcLevel(VOID) KeRaiseIrqlToDpcLevel(
VOID)
{ {
return KfRaiseIrql(DISPATCH_LEVEL); return KfRaiseIrql(DISPATCH_LEVEL);
} }
FORCEINLINE FORCEINLINE
KIRQL KIRQL
KeRaiseIrqlToSynchLevel(VOID) KeRaiseIrqlToSynchLevel(VOID)
{ {
return KfRaiseIrql(12); // SYNCH_LEVEL = IPI_LEVEL - 2 return KfRaiseIrql(12); // SYNCH_LEVEL = IPI_LEVEL - 2
} }
FORCEINLINE FORCEINLINE
PKTHREAD PKTHREAD
KeGetCurrentThread(VOID) KeGetCurrentThread(VOID)
{ {
return (struct _KTHREAD *)__readgsqword(0x188); return (struct _KTHREAD *)__readgsqword(0x188);
} }
_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 FORCEINLINE
NTSTATUS NTSTATUS
KeSaveFloatingPointState(PVOID FloatingState) KeSaveFloatingPointState(
_Out_ PKFLOATING_SAVE FloatSave)
{ {
UNREFERENCED_PARAMETER(FloatingState); UNREFERENCED_PARAMETER(FloatSave);
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
_Success_(1)
_Kernel_float_restored_
_At_(*FloatSave, _Kernel_requires_resource_held_(FloatState) _Kernel_releases_resource_(FloatState))
FORCEINLINE FORCEINLINE
NTSTATUS NTSTATUS
KeRestoreFloatingPointState(PVOID FloatingState) KeRestoreFloatingPointState(
_In_ PKFLOATING_SAVE FloatSave)
{ {
UNREFERENCED_PARAMETER(FloatingState); UNREFERENCED_PARAMETER(FloatSave);
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
/* VOID /* VOID
@ -8956,9 +8980,206 @@ KeRaiseIrqlToSynchLevel(VOID);
#elif defined(_M_ARM) #elif defined(_M_ARM)
#include <armddk.h> /** 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() #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 */
#else #else
#error Unknown Architecture #error Unknown Architecture
#endif #endif

View file

@ -7,12 +7,11 @@ FORCEINLINE struct _TEB * NtCurrentTeb(void)
return (struct _TEB *)__readfsdword(0x18); return (struct _TEB *)__readfsdword(0x18);
} }
#elif defined(_M_ARM) #elif defined(_M_ARM)
FORCEINLINE struct _TEB * NtCurrentTeb(void)
// {
// NT-ARM is not documented __debugbreak();
// return (struct _TEB *)0;
#include <armddk.h> }
#elif defined(_M_AMD64) #elif defined(_M_AMD64)
FORCEINLINE struct _TEB * NtCurrentTeb(void) FORCEINLINE struct _TEB * NtCurrentTeb(void)
{ {

View file

@ -410,7 +410,6 @@ NtCreateThread(
_In_ BOOLEAN CreateSuspended _In_ BOOLEAN CreateSuspended
); );
#ifndef _M_ARM
#ifndef NTOS_MODE_USER #ifndef NTOS_MODE_USER
FORCEINLINE struct _TEB * NtCurrentTeb(VOID) FORCEINLINE struct _TEB * NtCurrentTeb(VOID)
{ {
@ -418,12 +417,13 @@ FORCEINLINE struct _TEB * NtCurrentTeb(VOID)
return (PTEB)__readfsdword(0x18); return (PTEB)__readfsdword(0x18);
#elif defined (_M_AMD64) #elif defined (_M_AMD64)
return (struct _TEB *)__readgsqword(FIELD_OFFSET(NT_TIB, Self)); return (struct _TEB *)__readgsqword(FIELD_OFFSET(NT_TIB, Self));
#elif defined (_M_ARM)
return (struct _TEB *)KeGetPcr()->Used_Self;
#endif #endif
} }
#else #else
struct _TEB * NtCurrentTeb(void); struct _TEB * NtCurrentTeb(void);
#endif #endif
#endif
NTSYSCALLAPI NTSYSCALLAPI
NTSTATUS NTSTATUS

View file

@ -838,7 +838,7 @@ extern "C++" { \
#define UInt32x32To64(a,b) ((unsigned __int64)(unsigned int)(a)*(unsigned __int64)(unsigned int)(b)) #define UInt32x32To64(a,b) ((unsigned __int64)(unsigned int)(a)*(unsigned __int64)(unsigned int)(b))
#endif #endif
#if defined(MIDL_PASS)|| defined(RC_INVOKED) || defined(_M_CEE_PURE) #if defined(MIDL_PASS)|| defined(RC_INVOKED) || defined(_M_CEE_PURE) || defined(_M_ARM)
/* Use native math */ /* Use native math */
#define Int64ShllMod32(a,b) ((unsigned __int64)(a)<<(b)) #define Int64ShllMod32(a,b) ((unsigned __int64)(a)<<(b))
#define Int64ShraMod32(a,b) (((__int64)(a))>>(b)) #define Int64ShraMod32(a,b) (((__int64)(a))>>(b))

View file

@ -772,7 +772,7 @@ extern "C++" { \
#define UInt32x32To64(a,b) ((unsigned __int64)(unsigned int)(a)*(unsigned __int64)(unsigned int)(b)) #define UInt32x32To64(a,b) ((unsigned __int64)(unsigned int)(a)*(unsigned __int64)(unsigned int)(b))
#endif #endif
#if defined(MIDL_PASS)|| defined(RC_INVOKED) || defined(_M_CEE_PURE) #if defined(MIDL_PASS)|| defined(RC_INVOKED) || defined(_M_CEE_PURE) || defined(_M_ARM)
/* Use native math */ /* Use native math */
#define Int64ShllMod32(a,b) ((unsigned __int64)(a)<<(b)) #define Int64ShllMod32(a,b) ((unsigned __int64)(a)<<(b))
#define Int64ShraMod32(a,b) (((__int64)(a))>>(b)) #define Int64ShraMod32(a,b) (((__int64)(a))>>(b))
@ -4307,13 +4307,19 @@ typedef struct _CONTEXT {
/* The following flags control the contents of the CONTEXT structure. */ /* The following flags control the contents of the CONTEXT structure. */
#define CONTEXT_ARM 0x0000040 #define CONTEXT_ARM 0x200000L
#define CONTEXT_CONTROL (CONTEXT_ARM | 0x00000001L) #define CONTEXT_CONTROL (CONTEXT_ARM | 0x00000001L)
#define CONTEXT_INTEGER (CONTEXT_ARM | 0x00000002L) #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)
#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER) #define EXCEPTION_READ_FAULT 0
#define EXCEPTION_WRITE_FAULT 1
#define EXCEPTION_EXECUTE_FAULT 8
typedef struct _NEON128 { typedef struct _NEON128
{
ULONGLONG Low; ULONGLONG Low;
LONGLONG High; LONGLONG High;
} NEON128, *PNEON128; } NEON128, *PNEON128;
@ -4321,7 +4327,8 @@ typedef struct _NEON128 {
#define ARM_MAX_BREAKPOINTS 8 #define ARM_MAX_BREAKPOINTS 8
#define ARM_MAX_WATCHPOINTS 1 #define ARM_MAX_WATCHPOINTS 1
typedef struct _CONTEXT { typedef struct _CONTEXT
{
/* The flags values within this flag control the contents of /* The flags values within this flag control the contents of
a CONTEXT record. a CONTEXT record.
@ -4337,7 +4344,6 @@ typedef struct _CONTEXT {
context corresponding to set flags will be returned. context corresponding to set flags will be returned.
The context record is never used as an OUT only parameter. */ The context record is never used as an OUT only parameter. */
DWORD ContextFlags; DWORD ContextFlags;
/* This section is specified/returned if the ContextFlags word contains /* This section is specified/returned if the ContextFlags word contains
@ -4364,7 +4370,8 @@ typedef struct _CONTEXT {
/* Floating Point/NEON Registers */ /* Floating Point/NEON Registers */
DWORD Fpscr; DWORD Fpscr;
DWORD Padding; DWORD Padding;
union { union
{
NEON128 Q[16]; NEON128 Q[16];
ULONGLONG D[32]; ULONGLONG D[32];
DWORD S[32]; DWORD S[32];

View file

@ -1,41 +1,12 @@
#ifndef _ARMDDK_ #ifndef _ARMDDK_
#define _ARMDDK_ #define _ARMDDK_
//
// Page size
//
#ifndef PAGE_SIZE
#define PAGE_SIZE 0x1000
#endif
#ifndef _WINNT_
//
// IRQLs
//
#define PASSIVE_LEVEL 0
#define LOW_LEVEL 0
#define APC_LEVEL 1
#define DISPATCH_LEVEL 2
#define SYNCH_LEVEL DISPATCH_LEVEL
#define PROFILE_LEVEL 27
#define CLOCK1_LEVEL 28
#define CLOCK2_LEVEL 28
#define IPI_LEVEL 29
#define POWER_LEVEL 30
#define HIGH_LEVEL 31
#endif
//
// FIXME: mmtypes.h?
//
#define KIP0PCRADDRESS 0xFFDFF000
#define KI_USER_SHARED_DATA 0xFFFF9000
#define USPCR 0x7FFF0000 #define USPCR 0x7FFF0000
#define PCR ((KPCR * const)KIP0PCRADDRESS)
#define USERPCR ((volatile KPCR * const)USPCR) #define USERPCR ((volatile KPCR * const)USPCR)
#define KeGetPcr() PCR
#ifndef _WINNT_ #ifndef _WINNT_
#define SharedUserData ((KUSER_SHARED_DATA * const)KI_USER_SHARED_DATA)
// //
// Address space layout // Address space layout
@ -49,14 +20,7 @@ extern ULONG_PTR MmUserProbeAddress;
#define MM_LOWEST_USER_ADDRESS (PVOID)0x10000 #define MM_LOWEST_USER_ADDRESS (PVOID)0x10000
#define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0800000 #define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0800000
//
// Maximum IRQs
//
#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 // Used to contain PFNs and PFN counts
@ -65,86 +29,7 @@ extern ULONG_PTR MmUserProbeAddress;
//typedef ULONG PFN_NUMBER, *PPFN_NUMBER; //typedef ULONG PFN_NUMBER, *PPFN_NUMBER;
//typedef LONG SPFN_NUMBER, *PSPFN_NUMBER; //typedef LONG SPFN_NUMBER, *PSPFN_NUMBER;
//
// Stub
//
typedef struct _KFLOATING_SAVE
{
ULONG Reserved;
} KFLOATING_SAVE, *PKFLOATING_SAVE;
/* The following flags control the contents of the CONTEXT structure. */
#define CONTEXT_ARM 0x0000040
#define CONTEXT_CONTROL (CONTEXT_ARM | 0x00000001L)
#define CONTEXT_INTEGER (CONTEXT_ARM | 0x00000002L)
#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER)
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;
#endif #endif
@ -155,211 +40,12 @@ typedef struct _CONTEXT {
#define KIRQL ULONG #define KIRQL ULONG
#endif #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
{
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;
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;
ULONG StallScaleFactor;
UCHAR SpareUnused;
UCHAR Number;
UCHAR Spare0;
UCHAR SecondLevelCacheAssociativity;
ULONG VdmAlert;
ULONG KernelReserved[14];
ULONG SecondLevelCacheSize;
ULONG HalReserved[16];
} KPCR, *PKPCR;
//
// Get the current TEB
//
FORCEINLINE
struct _TEB* NtCurrentTeb(VOID)
{
return (struct _TEB*)USERPCR->Used_Self;
}
NTSYSAPI
struct _KTHREAD*
NTAPI
KeGetCurrentThread(VOID);
FORCEINLINE
NTSTATUS
KeSaveFloatingPointState(PVOID FloatingState)
{
UNREFERENCED_PARAMETER(FloatingState);
return STATUS_SUCCESS;
}
FORCEINLINE
NTSTATUS
KeRestoreFloatingPointState(PVOID FloatingState)
{
UNREFERENCED_PARAMETER(FloatingState);
return STATUS_SUCCESS;
}
extern volatile struct _KSYSTEM_TIME KeTickCount;
#ifndef YieldProcessor
#define YieldProcessor __yield
#endif
#define ASSERT_BREAKPOINT BREAKPOINT_COMMAND_STRING + 1 #define ASSERT_BREAKPOINT BREAKPOINT_COMMAND_STRING + 1
#define DbgRaiseAssertionFailure() __emit(0xdefc)
#define PCR_MINOR_VERSION 1
#define PCR_MAJOR_VERSION 1
#define RESULT_ZERO 0 #define RESULT_ZERO 0
#define RESULT_NEGATIVE 1 #define RESULT_NEGATIVE 1
#define RESULT_POSITIVE 2 #define RESULT_POSITIVE 2
#if 0
DECLSPEC_IMPORT
VOID
__fastcall
KfReleaseSpinLock(
IN OUT ULONG_PTR* SpinLock,
IN KIRQL NewIrql);
DECLSPEC_IMPORT
KIRQL
__fastcall
KfAcquireSpinLock(
IN OUT ULONG_PTR* SpinLock);
#endif
#ifndef _WINNT_
//
// IRQL Support on ARM is similar to MIPS/ALPHA
//
KIRQL
KfRaiseIrql(
IN KIRQL NewIrql
);
VOID
KfLowerIrql(
IN KIRQL NewIrql
);
KIRQL
KeRaiseIrqlToSynchLevel(
VOID
);
KIRQL
KeRaiseIrqlToDpcLevel(
VOID
);
#define KeLowerIrql(NewIrql) KfLowerIrql(NewIrql)
#define KeRaiseIrql(NewIrql, OldIrql) *(OldIrql) = KfRaiseIrql(NewIrql)
NTHALAPI
KIRQL
FASTCALL
KfAcquireSpinLock(
IN OUT PKSPIN_LOCK SpinLock);
#define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a)
NTHALAPI
VOID
FASTCALL
KfReleaseSpinLock(
IN OUT PKSPIN_LOCK SpinLock,
IN KIRQL NewIrql);
#define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b)
NTKERNELAPI
VOID
FASTCALL
KefAcquireSpinLockAtDpcLevel(
IN OUT PKSPIN_LOCK SpinLock);
#define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock)
NTKERNELAPI
VOID
FASTCALL
KefReleaseSpinLockFromDpcLevel(
IN OUT PKSPIN_LOCK SpinLock);
#define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock)
//
// Cache clean and flush
//
VOID
HalSweepDcache(
VOID
);
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
// //
// Intrinsics // Intrinsics
// //

View file

@ -15,7 +15,7 @@ $if (_WDMDDK_)
#define HIGH_LEVEL 15 #define HIGH_LEVEL 15
#define KI_USER_SHARED_DATA 0xFFFFF78000000000ULL #define KI_USER_SHARED_DATA 0xFFFFF78000000000ULL
#define SharedUserData ((PKUSER_SHARED_DATA const)KI_USER_SHARED_DATA) #define SharedUserData ((KUSER_SHARED_DATA * const)KI_USER_SHARED_DATA)
#define SharedInterruptTime (KI_USER_SHARED_DATA + 0x8) #define SharedInterruptTime (KI_USER_SHARED_DATA + 0x8)
#define SharedSystemTime (KI_USER_SHARED_DATA + 0x14) #define SharedSystemTime (KI_USER_SHARED_DATA + 0x14)
#define SharedTickCount (KI_USER_SHARED_DATA + 0x320) #define SharedTickCount (KI_USER_SHARED_DATA + 0x320)
@ -27,8 +27,9 @@ $if (_WDMDDK_)
#define EFLAG_ZERO 0x4000 #define EFLAG_ZERO 0x4000
#define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO) #define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO)
typedef struct _KFLOATING_SAVE { typedef struct _KFLOATING_SAVE
ULONG Dummy; {
ULONG Dummy;
} KFLOATING_SAVE, *PKFLOATING_SAVE; } KFLOATING_SAVE, *PKFLOATING_SAVE;
typedef XSAVE_FORMAT XMM_SAVE_AREA32, *PXMM_SAVE_AREA32; typedef XSAVE_FORMAT XMM_SAVE_AREA32, *PXMM_SAVE_AREA32;
@ -54,78 +55,101 @@ typedef XSAVE_FORMAT XMM_SAVE_AREA32, *PXMM_SAVE_AREA32;
FORCEINLINE FORCEINLINE
VOID VOID
KeMemoryBarrier(VOID) KeMemoryBarrier(
VOID)
{ {
// FIXME: Do we really need lfence after the __faststorefence ? // FIXME: Do we really need lfence after the __faststorefence ?
FastFence(); FastFence();
LFENCE_ACQUIRE(); LFENCE_ACQUIRE();
} }
#define KeMemoryBarrierWithoutFence() _ReadWriteBarrier() #define KeMemoryBarrierWithoutFence() _ReadWriteBarrier()
_IRQL_requires_max_(HIGH_LEVEL)
_IRQL_saves_
FORCEINLINE FORCEINLINE
KIRQL KIRQL
KeGetCurrentIrql(VOID) KeGetCurrentIrql(VOID)
{ {
return (KIRQL)__readcr8(); return (KIRQL)__readcr8();
} }
_IRQL_requires_max_(HIGH_LEVEL)
FORCEINLINE FORCEINLINE
VOID VOID
KeLowerIrql(IN KIRQL NewIrql) KeLowerIrql(
_In_ _IRQL_restores_ _Notliteral_ KIRQL NewIrql)
{ {
//ASSERT((KIRQL)__readcr8() >= NewIrql); //ASSERT((KIRQL)__readcr8() >= NewIrql);
__writecr8(NewIrql); __writecr8(NewIrql);
} }
_IRQL_requires_max_(HIGH_LEVEL)
_IRQL_raises_(NewIrql)
_IRQL_saves_
FORCEINLINE FORCEINLINE
KIRQL KIRQL
KfRaiseIrql(IN KIRQL NewIrql) KfRaiseIrql(
_In_ KIRQL NewIrql)
{ {
KIRQL OldIrql; KIRQL OldIrql;
OldIrql = (KIRQL)__readcr8(); OldIrql = (KIRQL)__readcr8();
//ASSERT(OldIrql <= NewIrql); //ASSERT(OldIrql <= NewIrql);
__writecr8(NewIrql); __writecr8(NewIrql);
return OldIrql; return OldIrql;
} }
#define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a) #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
_IRQL_requires_max_(DISPATCH_LEVEL)
_IRQL_saves_
_IRQL_raises_(DISPATCH_LEVEL)
FORCEINLINE FORCEINLINE
KIRQL KIRQL
KeRaiseIrqlToDpcLevel(VOID) KeRaiseIrqlToDpcLevel(
VOID)
{ {
return KfRaiseIrql(DISPATCH_LEVEL); return KfRaiseIrql(DISPATCH_LEVEL);
} }
FORCEINLINE FORCEINLINE
KIRQL KIRQL
KeRaiseIrqlToSynchLevel(VOID) KeRaiseIrqlToSynchLevel(VOID)
{ {
return KfRaiseIrql(12); // SYNCH_LEVEL = IPI_LEVEL - 2 return KfRaiseIrql(12); // SYNCH_LEVEL = IPI_LEVEL - 2
} }
FORCEINLINE FORCEINLINE
PKTHREAD PKTHREAD
KeGetCurrentThread(VOID) KeGetCurrentThread(VOID)
{ {
return (struct _KTHREAD *)__readgsqword(0x188); return (struct _KTHREAD *)__readgsqword(0x188);
} }
_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 FORCEINLINE
NTSTATUS NTSTATUS
KeSaveFloatingPointState(PVOID FloatingState) KeSaveFloatingPointState(
_Out_ PKFLOATING_SAVE FloatSave)
{ {
UNREFERENCED_PARAMETER(FloatingState); UNREFERENCED_PARAMETER(FloatSave);
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
_Success_(1)
_Kernel_float_restored_
_At_(*FloatSave, _Kernel_requires_resource_held_(FloatState) _Kernel_releases_resource_(FloatState))
FORCEINLINE FORCEINLINE
NTSTATUS NTSTATUS
KeRestoreFloatingPointState(PVOID FloatingState) KeRestoreFloatingPointState(
_In_ PKFLOATING_SAVE FloatSave)
{ {
UNREFERENCED_PARAMETER(FloatingState); UNREFERENCED_PARAMETER(FloatSave);
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
/* VOID /* VOID

View file

@ -27,11 +27,15 @@ extern NTKERNELAPI PVOID MmHighestUserAddress;
extern NTKERNELAPI PVOID MmSystemRangeStart; extern NTKERNELAPI PVOID MmSystemRangeStart;
extern NTKERNELAPI ULONG64 MmUserProbeAddress; extern NTKERNELAPI ULONG64 MmUserProbeAddress;
#define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress #define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress
#define MM_SYSTEM_RANGE_START MmSystemRangeStart #define MM_SYSTEM_RANGE_START MmSystemRangeStart
#define MM_USER_PROBE_ADDRESS MmUserProbeAddress #if defined(_LOCAL_COPY_USER_PROBE_ADDRESS_)
#define MM_LOWEST_USER_ADDRESS (PVOID)0x10000 #define MM_USER_PROBE_ADDRESS _LOCAL_COPY_USER_PROBE_ADDRESS_
extern ULONG64 _LOCAL_COPY_USER_PROBE_ADDRESS_;
#else
#define MM_USER_PROBE_ADDRESS MmUserProbeAddress
#endif
#define MM_LOWEST_USER_ADDRESS (PVOID)0x10000
#define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xFFFF080000000000ULL #define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xFFFF080000000000ULL
$endif /* _NTDDK_ */ $endif /* _NTDDK_ */

View file

@ -1,5 +1,358 @@
$if (_WDMDDK_) $if (_WDMDDK_)
#include <armddk.h> /** Kernel definitions for ARM **/
$endif
/* 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() #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)(_MoveFromCoprocessor(CP15_TPIDRPRW) & ~CP15_PCR_RESERVED_MASK);
}
#if (NTDDI_VERSION < NTDDI_WIN7) || !defined(NT_PROCESSOR_GROUPS)
FORCEINLINE
ULONG
KeGetCurrentProcessorNumber(
VOID)
{
return *((PUCHAR)KeGetPcr() + 0x580);
}
#endif /* (NTDDI_VERSION < NTDDI_WIN7) || !defined(NT_PROCESSOR_GROUPS) */
$endif

View file

@ -1097,10 +1097,10 @@ typedef struct _TIMER_SET_COALESCABLE_TIMER_INFO {
#define XSTATE_LEGACY_SSE 1 #define XSTATE_LEGACY_SSE 1
#define XSTATE_GSSE 2 #define XSTATE_GSSE 2
#define XSTATE_MASK_LEGACY_FLOATING_POINT (1i64 << (XSTATE_LEGACY_FLOATING_POINT)) #define XSTATE_MASK_LEGACY_FLOATING_POINT (1LL << (XSTATE_LEGACY_FLOATING_POINT))
#define XSTATE_MASK_LEGACY_SSE (1i64 << (XSTATE_LEGACY_SSE)) #define XSTATE_MASK_LEGACY_SSE (1LL << (XSTATE_LEGACY_SSE))
#define XSTATE_MASK_LEGACY (XSTATE_MASK_LEGACY_FLOATING_POINT | XSTATE_MASK_LEGACY_SSE) #define XSTATE_MASK_LEGACY (XSTATE_MASK_LEGACY_FLOATING_POINT | XSTATE_MASK_LEGACY_SSE)
#define XSTATE_MASK_GSSE (1i64 << (XSTATE_GSSE)) #define XSTATE_MASK_GSSE (1LL << (XSTATE_GSSE))
#define MAXIMUM_XSTATE_FEATURES 64 #define MAXIMUM_XSTATE_FEATURES 64

View file

@ -757,7 +757,7 @@ $endif(_WINNT_)
#define UInt32x32To64(a,b) ((unsigned __int64)(unsigned int)(a)*(unsigned __int64)(unsigned int)(b)) #define UInt32x32To64(a,b) ((unsigned __int64)(unsigned int)(a)*(unsigned __int64)(unsigned int)(b))
#endif #endif
#if defined(MIDL_PASS)|| defined(RC_INVOKED) || defined(_M_CEE_PURE) #if defined(MIDL_PASS)|| defined(RC_INVOKED) || defined(_M_CEE_PURE) || defined(_M_ARM)
/* Use native math */ /* Use native math */
#define Int64ShllMod32(a,b) ((unsigned __int64)(a)<<(b)) #define Int64ShllMod32(a,b) ((unsigned __int64)(a)<<(b))
#define Int64ShraMod32(a,b) (((__int64)(a))>>(b)) #define Int64ShraMod32(a,b) (((__int64)(a))>>(b))

View file

@ -117,6 +117,7 @@ $include(ppc/ke.h)
$include(mips/ke.h) $include(mips/ke.h)
#elif defined(_M_ARM) #elif defined(_M_ARM)
$include(arm/ke.h) $include(arm/ke.h)
$include(arm/mm.h)
#else #else
#error Unknown Architecture #error Unknown Architecture
#endif #endif

View file

@ -2412,13 +2412,19 @@ typedef struct _CONTEXT {
/* The following flags control the contents of the CONTEXT structure. */ /* The following flags control the contents of the CONTEXT structure. */
#define CONTEXT_ARM 0x0000040 #define CONTEXT_ARM 0x200000L
#define CONTEXT_CONTROL (CONTEXT_ARM | 0x00000001L) #define CONTEXT_CONTROL (CONTEXT_ARM | 0x00000001L)
#define CONTEXT_INTEGER (CONTEXT_ARM | 0x00000002L) #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)
#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER) #define EXCEPTION_READ_FAULT 0
#define EXCEPTION_WRITE_FAULT 1
#define EXCEPTION_EXECUTE_FAULT 8
typedef struct _NEON128 { typedef struct _NEON128
{
ULONGLONG Low; ULONGLONG Low;
LONGLONG High; LONGLONG High;
} NEON128, *PNEON128; } NEON128, *PNEON128;
@ -2426,7 +2432,8 @@ typedef struct _NEON128 {
#define ARM_MAX_BREAKPOINTS 8 #define ARM_MAX_BREAKPOINTS 8
#define ARM_MAX_WATCHPOINTS 1 #define ARM_MAX_WATCHPOINTS 1
typedef struct _CONTEXT { typedef struct _CONTEXT
{
/* The flags values within this flag control the contents of /* The flags values within this flag control the contents of
a CONTEXT record. a CONTEXT record.
@ -2442,7 +2449,6 @@ typedef struct _CONTEXT {
context corresponding to set flags will be returned. context corresponding to set flags will be returned.
The context record is never used as an OUT only parameter. */ The context record is never used as an OUT only parameter. */
DWORD ContextFlags; DWORD ContextFlags;
/* This section is specified/returned if the ContextFlags word contains /* This section is specified/returned if the ContextFlags word contains
@ -2469,7 +2475,8 @@ typedef struct _CONTEXT {
/* Floating Point/NEON Registers */ /* Floating Point/NEON Registers */
DWORD Fpscr; DWORD Fpscr;
DWORD Padding; DWORD Padding;
union { union
{
NEON128 Q[16]; NEON128 Q[16];
ULONGLONG D[32]; ULONGLONG D[32];
DWORD S[32]; DWORD S[32];

View file

@ -4,6 +4,9 @@
#define KiServiceExit2 KiExceptionExit #define KiServiceExit2 KiExceptionExit
#define SYNCH_LEVEL DISPATCH_LEVEL
#define PCR ((KPCR * const)KIP0PCRADDRESS)
// //
//Lockdown TLB entries //Lockdown TLB entries
// //
@ -17,6 +20,11 @@
#define KD_BREAKPOINT_SIZE sizeof(ULONG) #define KD_BREAKPOINT_SIZE sizeof(ULONG)
//#define KD_BREAKPOINT_VALUE //#define KD_BREAKPOINT_VALUE
//
// Maximum IRQs
//
#define MAXIMUM_VECTOR 16
// //
// Macros for getting and setting special purpose registers in portable code // Macros for getting and setting special purpose registers in portable code
// //
@ -137,6 +145,19 @@ KeFlushTb(
VOID VOID
); );
//
// Cache clean and flush
//
VOID
HalSweepDcache(
VOID
);
VOID
HalSweepIcache(
VOID
);
#define Ki386PerfEnd() #define Ki386PerfEnd()
#define KiEndInterrupt(x,y) #define KiEndInterrupt(x,y)

View file

@ -15,11 +15,6 @@
#define MI_NONPAGED_POOL_END (PVOID)0xFFBE0000 #define MI_NONPAGED_POOL_END (PVOID)0xFFBE0000
#define MI_DEBUG_MAPPING (PVOID)0xFFBFF000 #define MI_DEBUG_MAPPING (PVOID)0xFFBFF000
#define PTE_BASE 0xC0000000
#define PDE_BASE 0xC0400000
#define PDE_TOP 0xC04FFFFF
#define PTE_TOP 0xC03FFFFF
#define PTE_PER_PAGE 256 #define PTE_PER_PAGE 256
#define PDE_PER_PAGE 4096 #define PDE_PER_PAGE 4096
#define PPE_PER_PAGE 1 #define PPE_PER_PAGE 1