reactos/sdk/include/xdk/arm/ke.h

357 lines
8.7 KiB
C

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