From 46c6129581178cd4dc0fbce4137e902bc752b765 Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Thu, 7 Feb 2008 06:40:42 +0000 Subject: [PATCH] We don't define types which are usually documented on "real" NT platforms in the NDK aynmore, but instead in the ARMDDK.h. This also avoids many ndk-from-ddk cross-header issues. Added x86-only guards around certain structures and functions which are non-portable. Also guarded certain inline functions. Added some more ARM structures, and filled out the KPRCB. Created ARM-specific headers when required. We can now have a buildable ARM kernel, minus a couple of compile errors. svn path=/trunk/; revision=32178 --- reactos/include/ddk/ntifs.h | 3 - reactos/include/ddk/winddk.h | 4 +- reactos/include/ndk/arm/ketypes.h | 211 ++++++++++-------- reactos/include/ndk/kefuncs.h | 28 ++- reactos/include/psdk/winnt.h | 15 +- reactos/include/reactos/armddk.h | 103 +++++++++ .../ntoskrnl/include/internal/arch/intrin_i.h | 4 + reactos/ntoskrnl/include/internal/arch/ke.h | 2 + reactos/ntoskrnl/include/internal/arch/mm.h | 6 +- reactos/ntoskrnl/include/internal/arm/ke.h | 1 + reactos/ntoskrnl/include/internal/arm/mm.h | 1 + reactos/ntoskrnl/include/internal/ke.h | 5 + reactos/ntoskrnl/include/internal/ke_x.h | 7 + reactos/ntoskrnl/include/internal/ntoskrnl.h | 4 +- 14 files changed, 266 insertions(+), 128 deletions(-) create mode 100644 reactos/include/reactos/armddk.h create mode 100644 reactos/ntoskrnl/include/internal/arm/ke.h create mode 100644 reactos/ntoskrnl/include/internal/arm/mm.h diff --git a/reactos/include/ddk/ntifs.h b/reactos/include/ddk/ntifs.h index b84e3406c88..c31e0650f3a 100644 --- a/reactos/include/ddk/ntifs.h +++ b/reactos/include/ddk/ntifs.h @@ -297,9 +297,6 @@ typedef enum _SECURITY_LOGON_TYPE #ifdef _X86_ #define HARDWARE_PTE HARDWARE_PTE_X86 #define PHARDWARE_PTE PHARDWARE_PTE_X86 -#else -#define HARDWARE_PTE ULONG -#define PHARDWARE_PTE PULONG #endif #define IO_CHECK_CREATE_PARAMETERS 0x0200 diff --git a/reactos/include/ddk/winddk.h b/reactos/include/ddk/winddk.h index 757260bba21..6abd2ae75ee 100644 --- a/reactos/include/ddk/winddk.h +++ b/reactos/include/ddk/winddk.h @@ -5570,9 +5570,9 @@ KeGetCurrentProcessorNumber(VOID) #elif defined(_M_ARM) // -// NT-ARM is not documented, need NDK +// NT-ARM is not documented, need DDK-ARM // -#include +#include #else #error Unknown architecture diff --git a/reactos/include/ndk/arm/ketypes.h b/reactos/include/ndk/arm/ketypes.h index 4ddd0745172..172b9d06638 100644 --- a/reactos/include/ndk/arm/ketypes.h +++ b/reactos/include/ndk/arm/ketypes.h @@ -23,19 +23,6 @@ Author: // Dependencies // -// -// IRQLs -// -#define PASSIVE_LEVEL 0 -#define LOW_LEVEL 0 -#define APC_LEVEL 1 -#define DISPATCH_LEVEL 2 -#define IPI_LEVEL 7 -#define POWER_LEVEL 7 -#define PROFILE_LEVEL 8 -#define HIGH_LEVEL 8 -#define SYNCH_LEVEL (IPI_LEVEL - 1) - // // IPI Types // @@ -62,19 +49,6 @@ Author: // #define KSEG0_BASE 0x80000000 -// -// FIXME: mmtypes.h? -// -#define KIPCR 0xFFFFF000 -#define USPCR 0x7FFF0000 -#define PCR ((volatile KPCR * const)USPCR) -#define USERPCR ((volatile KPCR * const)KIPCR) - -// -// Synchronization-level IRQL -// -#define SYNCH_LEVEL DISPATCH_LEVEL - // // Trap Frame Definition // @@ -106,75 +80,23 @@ typedef struct _KTRAP_FRAME ULONG FpExtra[8]; } KTRAP_FRAME, *PKTRAP_FRAME; -// -// Processor Control Region -// On ARM, it's actually readable from user-mode, much like KUSER_SHARED_DATA -// -#ifdef NTOS_MODE_USER -#define PKINTERRUPT_ROUTINE PVOID // Hack! -#endif -typedef struct _KPCR -{ - ULONG MinorVersion; - ULONG MajorVersion; - PKINTERRUPT_ROUTINE InterruptRoutine[64]; - PVOID XcodeDispatch; - ULONG FirstLevelDcacheSize; - ULONG FirstLevelDcacheFillSize; - ULONG FirstLevelIcacheSize; - ULONG FirstLevelIcacheFillSize; - ULONG SecondLevelDcacheSize; - ULONG SecondLevelDcacheFillSize; - ULONG SecondLevelIcacheSize; - ULONG SecondLevelIcacheFillSize; - struct _KPRCB *Prcb; - struct _TEB *Teb; - PVOID TlsArray; - ULONG DcacheFillSize; - ULONG IcacheAlignment; - ULONG IcacheFillSize; - ULONG ProcessorId; - ULONG ProfileInterval; - ULONG ProfileCount; - ULONG StallExecutionCount; - ULONG StallScaleFactor; - CCHAR Number; - PVOID DataBusError; - PVOID InstructionBusError; - ULONG CachePolicy; - UCHAR IrqlMask[64]; - UCHAR IrqlTable[64]; - UCHAR CurrentIrql; - KAFFINITY SetMember; - struct _KTHREAD *CurrentThread; - KAFFINITY NotMember; - ULONG SystemReserved[6]; - ULONG DcacheAlignment; - ULONG HalReserved[64]; - BOOLEAN FirstLevelActive; - BOOLEAN DpcRoutineActive; - ULONG CurrentPid; - BOOLEAN OnInterruptStack; - PVOID SavedInitialStack; - PVOID SavedStackLimit; - PVOID SystemServiceDispatchStart; - PVOID SystemServiceDispatchEnd; - PVOID InterruptStack; - PVOID PanicStack; - PVOID BadVaddr; - PVOID InitialStack; - PVOID StackLimit; - ULONG QuantumEnd; -} KPCR, *PKPCR; - #ifndef NTOS_MODE_USER + // -// Stub +// Exception Frame Definition // -typedef struct _KFLOATING_SAVE +typedef struct _KEXCEPTION_FRAME { - ULONG Reserved; -} KFLOATING_SAVE, *PKFLOATING_SAVE; + ULONG PlaceHolder; +} KEXCEPTION_FRAME, *PKEXCEPTION_FRAME; + +// +// Processor State +// +typedef struct _KPROCESSOR_STATE +{ + struct _CONTEXT ContextFrame; +} KPROCESSOR_STATE, *PKPROCESSOR_STATE; // // Processor Region Control Block @@ -187,9 +109,110 @@ typedef struct _KPRCB struct _KTHREAD *NextThread; struct _KTHREAD *IdleThread; UCHAR Number; - // - // TODO - // + UCHAR Reserved; + USHORT BuildType; + KAFFINITY SetMember; + KPROCESSOR_STATE ProcessorState; + ULONG KernelReserved[16]; + ULONG HalReserved[16]; + KSPIN_LOCK_QUEUE LockQueue[LockQueueMaximumLock]; + struct _KTHREAD *NpxThread; + ULONG InterruptCount; + ULONG KernelTime; + ULONG UserTime; + ULONG DpcTime; + ULONG DebugDpcTime; + ULONG InterruptTime; + ULONG AdjustDpcThreshold; + ULONG PageColor; + UCHAR SkipTick; + UCHAR DebuggerSavedIRQL; + UCHAR NodeColor; + UCHAR Spare1; + ULONG NodeShiftedColor; + struct _KNODE *ParentNode; + ULONG MultiThreadProcessorSet; + struct _KPRCB *MultiThreadSetMaster; + ULONG SecondaryColorMask; + LONG Sleeping; + ULONG CcFastReadNoWait; + ULONG CcFastReadWait; + ULONG CcFastReadNotPossible; + ULONG CcCopyReadNoWait; + ULONG CcCopyReadWait; + ULONG CcCopyReadNoWaitMiss; + ULONG KeAlignmentFixupCount; + ULONG SpareCounter0; + ULONG KeDcacheFlushCount; + ULONG KeExceptionDispatchCount; + ULONG KeFirstLevelTbFills; + ULONG KeIcacheFlushCount; + ULONG KeSecondLevelTbFills; + ULONG KeSystemCalls; + volatile ULONG IoReadOperationCount; + volatile ULONG IoWriteOperationCount; + volatile ULONG IoOtherOperationCount; + LARGE_INTEGER IoReadTransferCount; + LARGE_INTEGER IoWriteTransferCount; + LARGE_INTEGER IoOtherTransferCount; + PP_LOOKASIDE_LIST PPLookasideList[16]; + PP_LOOKASIDE_LIST PPNPagedLookasideList[32]; + PP_LOOKASIDE_LIST PPPagedLookasideList[32]; + volatile ULONG PacketBarrier; + volatile ULONG ReverseStall; + PVOID IpiFrame; + volatile PVOID CurrentPacket[3]; + volatile ULONG TargetSet; + volatile PKIPI_WORKER WorkerRoutine; + volatile ULONG IpiFrozen; + volatile ULONG RequestSummary; + volatile struct _KPRCB *SignalDone; + struct _KDPC_DATA DpcData[2]; + PVOID DpcStack; + ULONG MaximumDpcQueueDepth; + ULONG DpcRequestRate; + ULONG MinimumDpcRate; + volatile UCHAR DpcInterruptRequested; + volatile UCHAR DpcThreadRequested; + volatile UCHAR DpcRoutineActive; + volatile UCHAR DpcThreadActive; + ULONG PrcbLock; + ULONG DpcLastCount; + volatile ULONG TimerHand; + volatile ULONG TimerRequest; + PVOID DpcThread; + KEVENT DpcEvent; + UCHAR ThreadDpcEnable; + volatile BOOLEAN QuantumEnd; + volatile UCHAR IdleSchedule; + LONG DpcSetEventRequest; + LONG TickOffset; + KDPC CallDpc; + LIST_ENTRY WaitListHead; + ULONG ReadySummary; + ULONG QueueIndex; + LIST_ENTRY DispatcherReadyListHead[32]; + SINGLE_LIST_ENTRY DeferredReadyListHead; + PVOID ChainedInterruptList; + LONG LookasideIrpFloat; + volatile LONG MmPageFaultCount; + volatile LONG MmCopyOnWriteCount; + volatile LONG MmTransitionCount; + volatile LONG MmCacheTransitionCount; + volatile LONG MmDemandZeroCount; + volatile LONG MmPageReadCount; + volatile LONG MmPageReadIoCount; + volatile LONG MmCacheReadCount; + volatile LONG MmCacheIoCount; + volatile LONG MmDirtyPagesWriteCount; + volatile LONG MmDirtyWriteIoCount; + volatile LONG MmMappedPagesWriteCount; + volatile LONG MmMappedWriteIoCount; + CHAR VendorString[13]; + ULONG MHz; + ULONG FeatureBits; + volatile LARGE_INTEGER IsrTime; + PROCESSOR_POWER_STATE PowerState; } KPRCB, *PKPRCB; // diff --git a/reactos/include/ndk/kefuncs.h b/reactos/include/ndk/kefuncs.h index e63b81ed1b8..54589c9f1b2 100644 --- a/reactos/include/ndk/kefuncs.h +++ b/reactos/include/ndk/kefuncs.h @@ -453,19 +453,21 @@ NTSYSCALLAPI NTSTATUS NTAPI NtSetIntervalProfile( - ULONG Interval, - KPROFILE_SOURCE ClockSource + IN ULONG Interval, + IN KPROFILE_SOURCE ClockSource ); +#ifdef _M_IX86 NTSYSCALLAPI NTSTATUS NTAPI NtSetLdtEntries( - ULONG Selector1, - LDT_ENTRY LdtEntry1, - ULONG Selector2, - LDT_ENTRY LdtEntry2 + IN ULONG Selector1, + IN LDT_ENTRY LdtEntry1, + IN ULONG Selector2, + IN LDT_ENTRY LdtEntry2 ); +#endif NTSYSCALLAPI NTSTATUS @@ -659,19 +661,21 @@ NTSYSAPI NTSTATUS NTAPI ZwSetIntervalProfile( - ULONG Interval, - KPROFILE_SOURCE ClockSource + IN ULONG Interval, + IN KPROFILE_SOURCE ClockSource ); +#ifdef _M_IX86 NTSYSAPI NTSTATUS NTAPI ZwSetLdtEntries( - ULONG Selector1, - LDT_ENTRY LdtEntry1, - ULONG Selector2, - LDT_ENTRY LdtEntry2 + IN ULONG Selector1, + IN LDT_ENTRY LdtEntry1, + IN ULONG Selector2, + IN LDT_ENTRY LdtEntry2 ); +#endif NTSYSAPI NTSTATUS diff --git a/reactos/include/psdk/winnt.h b/reactos/include/psdk/winnt.h index 03333f1927e..760bcf640e7 100644 --- a/reactos/include/psdk/winnt.h +++ b/reactos/include/psdk/winnt.h @@ -4106,21 +4106,10 @@ static __inline__ struct _TEB * NtCurrentTeb(void) #elif _M_ARM // -// NT-ARM is not documented, need NDK +// NT-ARM is not documented // -#define NTOS_MODE_USER -#include +#include -// -// FIXME: Move _M_ARM stuff away from here -// *** AND NOT IN THE NDK! NDK IS ONLY FOR OFFICIALLY OBTAINABLE/EXISTING NT -// -FORCEINLINE -struct _TEB* NtCurrentTeb(VOID) -{ - return (struct _TEB*)USERPCR->Teb; -} - #else static __inline__ struct _TEB * NtCurrentTeb(void) { diff --git a/reactos/include/reactos/armddk.h b/reactos/include/reactos/armddk.h new file mode 100644 index 00000000000..4110279b1f5 --- /dev/null +++ b/reactos/include/reactos/armddk.h @@ -0,0 +1,103 @@ +#ifndef _ARMDDK_ +#define _ARMDDK_ + +// +// IRQLs +// +#define PASSIVE_LEVEL 0 +#define LOW_LEVEL 0 +#define APC_LEVEL 1 +#define DISPATCH_LEVEL 2 +#define IPI_LEVEL 7 +#define POWER_LEVEL 7 +#define PROFILE_LEVEL 8 +#define HIGH_LEVEL 8 +#define SYNCH_LEVEL (IPI_LEVEL - 1) + +// +// FIXME: mmtypes.h? +// +#define KIPCR 0xFFFFF000 +#define USPCR 0x7FFF0000 +#define PCR ((volatile KPCR * const)USPCR) +#define USERPCR ((volatile KPCR * const)KIPCR) + +// +// Stub +// +typedef struct _KFLOATING_SAVE +{ + ULONG Reserved; +} KFLOATING_SAVE, *PKFLOATING_SAVE; + +// +// Processor Control Region +// On ARM, it's actually readable from user-mode, much like KUSER_SHARED_DATA +// +#ifdef _WINNT_H +#define PKINTERRUPT_ROUTINE PVOID // Hack! +#endif +typedef struct _KPCR +{ + ULONG MinorVersion; + ULONG MajorVersion; + PKINTERRUPT_ROUTINE InterruptRoutine[64]; + PVOID XcodeDispatch; + ULONG FirstLevelDcacheSize; + ULONG FirstLevelDcacheFillSize; + ULONG FirstLevelIcacheSize; + ULONG FirstLevelIcacheFillSize; + ULONG SecondLevelDcacheSize; + ULONG SecondLevelDcacheFillSize; + ULONG SecondLevelIcacheSize; + ULONG SecondLevelIcacheFillSize; + struct _KPRCB *Prcb; + struct _TEB *Teb; + PVOID TlsArray; + ULONG DcacheFillSize; + ULONG IcacheAlignment; + ULONG IcacheFillSize; + ULONG ProcessorId; + ULONG ProfileInterval; + ULONG ProfileCount; + ULONG StallExecutionCount; + ULONG StallScaleFactor; + CCHAR Number; + PVOID DataBusError; + PVOID InstructionBusError; + ULONG CachePolicy; + UCHAR IrqlMask[64]; + UCHAR IrqlTable[64]; + UCHAR CurrentIrql; + KAFFINITY SetMember; + struct _KTHREAD *CurrentThread; + KAFFINITY NotMember; + ULONG SystemReserved[6]; + ULONG DcacheAlignment; + ULONG HalReserved[64]; + BOOLEAN FirstLevelActive; + BOOLEAN DpcRoutineActive; + ULONG CurrentPid; + BOOLEAN OnInterruptStack; + PVOID SavedInitialStack; + PVOID SavedStackLimit; + PVOID SystemServiceDispatchStart; + PVOID SystemServiceDispatchEnd; + PVOID InterruptStack; + PVOID PanicStack; + PVOID BadVaddr; + PVOID InitialStack; + PVOID StackLimit; + ULONG QuantumEnd; +} KPCR, *PKPCR; + +// +// Get the current TEB +// +FORCEINLINE +struct _TEB* NtCurrentTeb(VOID) +{ + return (struct _TEB*)USERPCR->Teb; +} + +#endif diff --git a/reactos/ntoskrnl/include/internal/arch/intrin_i.h b/reactos/ntoskrnl/include/internal/arch/intrin_i.h index 9b849ce0932..de147bb311b 100644 --- a/reactos/ntoskrnl/include/internal/arch/intrin_i.h +++ b/reactos/ntoskrnl/include/internal/arch/intrin_i.h @@ -25,6 +25,10 @@ #include "../powerpc/intrin_i.h" #elif defined(_M_MIPS) #include "../mips/intrin_i.h" +#elif defined(_M_ARM) +// +// Not sure we'll need ARM internal intrinsics +// #else #error "Unknown processor" #endif diff --git a/reactos/ntoskrnl/include/internal/arch/ke.h b/reactos/ntoskrnl/include/internal/arch/ke.h index 167d5e41ac5..5a1b053f23f 100644 --- a/reactos/ntoskrnl/include/internal/arch/ke.h +++ b/reactos/ntoskrnl/include/internal/arch/ke.h @@ -25,6 +25,8 @@ #include "../powerpc/ke.h" #elif defined(_M_MIPS) #include "../mips/ke.h" +#elif defined(_M_ARM) +#include "../arm/ke.h" #else #error "Unknown processor" #endif diff --git a/reactos/ntoskrnl/include/internal/arch/mm.h b/reactos/ntoskrnl/include/internal/arch/mm.h index a31ba503f5b..ebbe5917061 100644 --- a/reactos/ntoskrnl/include/internal/arch/mm.h +++ b/reactos/ntoskrnl/include/internal/arch/mm.h @@ -22,9 +22,11 @@ #ifdef _M_IX86 #include #elif defined(_M_PPC) -#include +#include #elif defined(_M_MIPS) -#include +#include +#elif defined(_M_ARM) +#include #else #error "Unknown processor" #endif diff --git a/reactos/ntoskrnl/include/internal/arm/ke.h b/reactos/ntoskrnl/include/internal/arm/ke.h new file mode 100644 index 00000000000..8b137891791 --- /dev/null +++ b/reactos/ntoskrnl/include/internal/arm/ke.h @@ -0,0 +1 @@ + diff --git a/reactos/ntoskrnl/include/internal/arm/mm.h b/reactos/ntoskrnl/include/internal/arm/mm.h new file mode 100644 index 00000000000..8b137891791 --- /dev/null +++ b/reactos/ntoskrnl/include/internal/arm/mm.h @@ -0,0 +1 @@ + diff --git a/reactos/ntoskrnl/include/internal/ke.h b/reactos/ntoskrnl/include/internal/ke.h index 1d66c742d51..583f2576601 100644 --- a/reactos/ntoskrnl/include/internal/ke.h +++ b/reactos/ntoskrnl/include/internal/ke.h @@ -837,11 +837,16 @@ KiInitializeMachineType( VOID ); +// +// We need to do major portability work +// +#ifdef _M_IX86 VOID NTAPI KiFlushNPXState( IN FLOATING_SAVE_AREA *SaveArea ); +#endif VOID NTAPI diff --git a/reactos/ntoskrnl/include/internal/ke_x.h b/reactos/ntoskrnl/include/internal/ke_x.h index 72d1cb9b6ba..044724ceae6 100644 --- a/reactos/ntoskrnl/include/internal/ke_x.h +++ b/reactos/ntoskrnl/include/internal/ke_x.h @@ -350,6 +350,7 @@ FORCEINLINE VOID KiRundownThread(IN PKTHREAD Thread) { +#if defined(_M_IX86) || defined(_M_AMD64) /* Check if this is the NPX Thread */ if (KeGetCurrentPrcb()->NpxThread == Thread) { @@ -357,6 +358,7 @@ KiRundownThread(IN PKTHREAD Thread) KeGetCurrentPrcb()->NpxThread = NULL; KeArchFnInit(); } +#endif } FORCEINLINE @@ -1552,6 +1554,11 @@ KeFlushProcessTb(VOID) /* Flush the TLB by resetting CR3 */ #ifdef _M_PPC __asm__("sync\n\tisync\n\t"); +#elif _M_ARM + // + // We need to implement this! + // + ASSERTMSG("Need ARM flush routine\n", FALSE); #else __writecr3(__readcr3()); #endif diff --git a/reactos/ntoskrnl/include/internal/ntoskrnl.h b/reactos/ntoskrnl/include/internal/ntoskrnl.h index b07a87e055a..518a832cdd1 100644 --- a/reactos/ntoskrnl/include/internal/ntoskrnl.h +++ b/reactos/ntoskrnl/include/internal/ntoskrnl.h @@ -280,7 +280,7 @@ DefaultQueryInfoBufferCheck(ULONG Class, * Use IsPointerOffset to test whether a pointer should be interpreted as an offset * or as a pointer */ -#if defined(_X86_) || defined(_M_AMD64) || defined(_MIPS_) || defined(_PPC_) +#if defined(_X86_) || defined(_M_AMD64) || defined(_MIPS_) || defined(_PPC_) || defined(_ARM_) /* for x86 and x86-64 the MSB is 1 so we can simply test on that */ #define IsPointerOffset(Ptr) ((LONG_PTR)(Ptr) >= 0) @@ -310,10 +310,10 @@ C_ASSERT(FIELD_OFFSET(KTHREAD, ApcState.Process) == KTHREAD_APCSTATE_PROCESS); C_ASSERT(FIELD_OFFSET(KPROCESS, DirectoryTableBase) == KPROCESS_DIRECTORY_TABLE_BASE); //C_ASSERT(FIELD_OFFSET(KPCR, Tib.ExceptionList) == KPCR_EXCEPTION_LIST); //C_ASSERT(FIELD_OFFSET(KPCR, Self) == KPCR_SELF); +#ifdef _M_IX86 C_ASSERT(FIELD_OFFSET(KPCR, IRR) == KPCR_IRR); C_ASSERT(FIELD_OFFSET(KPCR, IDR) == KPCR_IDR); C_ASSERT(FIELD_OFFSET(KPCR, Irql) == KPCR_IRQL); -#ifdef _M_IX86 C_ASSERT(FIELD_OFFSET(KIPCR, PrcbData) + FIELD_OFFSET(KPRCB, CurrentThread) == KPCR_CURRENT_THREAD); C_ASSERT(FIELD_OFFSET(KIPCR, PrcbData) + FIELD_OFFSET(KPRCB, NextThread) == KPCR_PRCB_NEXT_THREAD); C_ASSERT(FIELD_OFFSET(KIPCR, PrcbData) + FIELD_OFFSET(KPRCB, NpxThread) == KPCR_NPX_THREAD);