mirror of
https://github.com/reactos/reactos.git
synced 2025-04-27 09:00:27 +00:00
[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:
parent
840af6fcb3
commit
c74c888770
16 changed files with 918 additions and 419 deletions
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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))
|
||||||
|
|
|
@ -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];
|
||||||
|
|
|
@ -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
|
||||||
//
|
//
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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_ */
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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))
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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];
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue