From 34e64ee87b96f3a0b5a6bde5af76b09678abe0be Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Fri, 15 Feb 2008 19:01:45 +0000 Subject: [PATCH] We now define KUSER_SHARED_DATA per architecture, since the address isn't portable. Now SharedUserData works on ARM. Implemented KeAcquireInSTackQueuedSpinLock, KeAcquireInStackQueuedSpinLockRaiseToSYnc and KeReleaseInStackQueuedSpinLock based on x86 UP versions. On ARM, the PCR is fully exposed, so some APIs are always-inlined direct-memory-access (unlike x86 which has the fs selector, and undocumented parts of the PCR). This means we can define several macros -- fixed the headers to allow this, by defining the previous stuff for x86 only. Setup registry data in the ARM loader block. The ARM port boots all the way through ExpInitializeExecutive until reaching MmInit1. The boot-registry is correctly loaded and parsed, as are NLS files! svn path=/trunk/; revision=32379 --- .../boot/freeldr/freeldr/arch/arm/loader.c | 5 +-- .../boot/freeldr/freeldr/reactos/imageldr.c | 7 +++- reactos/hal/halarm/generic/hal.c | 34 +++++++++++-------- reactos/include/ddk/winddk.h | 30 +++++++++------- reactos/include/ndk/ketypes.h | 5 --- reactos/include/reactos/armddk.h | 8 ++++- reactos/ntoskrnl/include/internal/ke_x.h | 2 ++ 7 files changed, 55 insertions(+), 36 deletions(-) diff --git a/reactos/boot/freeldr/freeldr/arch/arm/loader.c b/reactos/boot/freeldr/freeldr/arch/arm/loader.c index cb7380b1212..1d1a97be655 100644 --- a/reactos/boot/freeldr/freeldr/arch/arm/loader.c +++ b/reactos/boot/freeldr/freeldr/arch/arm/loader.c @@ -28,7 +28,7 @@ extern ARM_TRANSLATION_TABLE ArmTranslationTable; extern ARM_COARSE_PAGE_TABLE BootTranslationTable, KernelTranslationTable; extern ROS_KERNEL_ENTRY_POINT KernelEntryPoint; extern ULONG_PTR KernelBase; -extern ULONG_PTR AnsiData, OemData, UnicodeData; +extern ULONG_PTR AnsiData, OemData, UnicodeData, RegistryData; ULONG SizeBits[] = { @@ -290,8 +290,9 @@ ArmPrepareForReactOS(IN BOOLEAN Setup) // // - // TODO: Setup registry data + // Setup registry data // + ArmLoaderBlock->RegistryBase = (PVOID)((ULONG_PTR)RegistryData | KSEG0_BASE); // // TODO: Setup ARC Hardware tree data diff --git a/reactos/boot/freeldr/freeldr/reactos/imageldr.c b/reactos/boot/freeldr/freeldr/reactos/imageldr.c index 97a0017f22c..c6a1c24605a 100644 --- a/reactos/boot/freeldr/freeldr/reactos/imageldr.c +++ b/reactos/boot/freeldr/freeldr/reactos/imageldr.c @@ -16,7 +16,7 @@ LdrPEGetExportByName( ); extern BOOLEAN FrLdrLoadDriver(PCHAR szFileName, INT nPos); -PVOID AnsiData, OemData, UnicodeData; +PVOID AnsiData, OemData, UnicodeData, RegistryData; /* MODULE MANAGEMENT **********************************************************/ PLOADER_MODULE @@ -110,6 +110,11 @@ FrLdrLoadModule(FILE *ModuleImage, { UnicodeData = (PVOID)NextModuleBase; } + else if (!(_stricmp(NameBuffer, "system")) || + !(_stricmp(NameBuffer, "system.hiv"))) + { + RegistryData = (PVOID)NextModuleBase; + } /* Load the file image */ FsReadFile(ModuleImage, LocalModuleSize, NULL, (PVOID)NextModuleBase); diff --git a/reactos/hal/halarm/generic/hal.c b/reactos/hal/halarm/generic/hal.c index 06adcb7d211..30d76869a25 100644 --- a/reactos/hal/halarm/generic/hal.c +++ b/reactos/hal/halarm/generic/hal.c @@ -753,33 +753,39 @@ KeAcquireSpinLockRaiseToSynch( } +/* + * @implemented + */ VOID FASTCALL -KeAcquireInStackQueuedSpinLock( - IN PKSPIN_LOCK SpinLock, - IN PKLOCK_QUEUE_HANDLE LockHandle - ) +KeAcquireInStackQueuedSpinLock(IN PKSPIN_LOCK SpinLock, + IN PKLOCK_QUEUE_HANDLE LockHandle) { - UNIMPLEMENTED; + /* Simply raise to dispatch */ + LockHandle->OldIrql = KeSwapIrql(DISPATCH_LEVEL); } +/* + * @implemented + */ VOID FASTCALL -KeAcquireInStackQueuedSpinLockRaiseToSynch( - IN PKSPIN_LOCK SpinLock, - IN PKLOCK_QUEUE_HANDLE LockHandle - ) +KeAcquireInStackQueuedSpinLockRaiseToSynch(IN PKSPIN_LOCK SpinLock, + IN PKLOCK_QUEUE_HANDLE LockHandle) { - UNIMPLEMENTED; + /* Simply raise to synch */ + LockHandle->OldIrql = KeSwapIrql(SYNCH_LEVEL); } +/* + * @implemented + */ VOID FASTCALL -KeReleaseInStackQueuedSpinLock( - IN PKLOCK_QUEUE_HANDLE LockHandle - ) +KeReleaseInStackQueuedSpinLock(IN PKLOCK_QUEUE_HANDLE LockHandle) { - UNIMPLEMENTED; + /* Simply lower IRQL back */ + KeSwapIrql(LockHandle->OldIrql); } VOID diff --git a/reactos/include/ddk/winddk.h b/reactos/include/ddk/winddk.h index 9b1aabff050..92be1a8a424 100644 --- a/reactos/include/ddk/winddk.h +++ b/reactos/include/ddk/winddk.h @@ -5459,6 +5459,20 @@ KeGetCurrentProcessorNumber(VOID) #error Unknown compiler #endif } + +NTHALAPI +KIRQL +DDKAPI +KeGetCurrentIrql( + VOID); + +NTKERNELAPI +PRKTHREAD +NTAPI +KeGetCurrentThread( + VOID); + +#define KI_USER_SHARED_DATA 0xffdf0000 #elif defined(__x86_64__) @@ -5580,6 +5594,8 @@ KeGetCurrentProcessorNumber(VOID) #define PAGE_SIZE 0x1000 #define PAGE_SHIFT 12L +#define SharedUserData ((KUSER_SHARED_DATA * CONST) KI_USER_SHARED_DATA) + extern NTKERNELAPI PVOID MmHighestUserAddress; extern NTKERNELAPI PVOID MmSystemRangeStart; extern NTKERNELAPI ULONG_PTR MmUserProbeAddress; @@ -5593,8 +5609,6 @@ extern NTKERNELAPI ULONG_PTR MmUserProbeAddress; #define MM_KSEG0_BASE MM_SYSTEM_RANGE_START #define MM_SYSTEM_SPACE_END 0xFFFFFFFF -#define KI_USER_SHARED_DATA 0xffdf0000 -#define SharedUserData ((KUSER_SHARED_DATA * CONST) KI_USER_SHARED_DATA) #define EFLAG_SIGN 0x8000 #define EFLAG_ZERO 0x4000 @@ -5651,11 +5665,7 @@ typedef struct _PCIBUSDATA PVOID Reserved[4]; } PCIBUSDATA, *PPCIBUSDATA; -NTHALAPI -KIRQL -DDKAPI -KeGetCurrentIrql( - VOID); + #if !defined(__INTERLOCKED_DECLARED) #define __INTERLOCKED_DECLARED @@ -9087,12 +9097,6 @@ VOID NTAPI KeFlushWriteBuffer(VOID); -NTKERNELAPI -PRKTHREAD -NTAPI -KeGetCurrentThread( - VOID); - NTKERNELAPI ULONG NTAPI diff --git a/reactos/include/ndk/ketypes.h b/reactos/include/ndk/ketypes.h index dea06dbf69b..ea91b01da36 100644 --- a/reactos/include/ndk/ketypes.h +++ b/reactos/include/ndk/ketypes.h @@ -55,11 +55,6 @@ Author: // #define THREAD_ALERT_INCREMENT 2 -// -// User Shared Data in Kernel-Mode -// -#define KI_USER_SHARED_DATA 0xffdf0000 - // // Physical memory offset of KUSER_SHARED_DATA // diff --git a/reactos/include/reactos/armddk.h b/reactos/include/reactos/armddk.h index 165120761c5..a5b2d3321be 100644 --- a/reactos/include/reactos/armddk.h +++ b/reactos/include/reactos/armddk.h @@ -18,6 +18,7 @@ // FIXME: mmtypes.h? // #define KIPCR 0xFFFFF000 +#define KI_USER_SHARED_DATA 0xFFFFE000 #define USPCR 0x7FFF0000 #define PCR ((volatile KPCR * const)USPCR) #define USERPCR ((volatile KPCR * const)KIPCR) @@ -30,7 +31,12 @@ // // Just read it from the PCR // -#define KeGetCurrentProcessorNumber() ((ULONG)(PCR->Number)) +#define KeGetCurrentProcessorNumber() PCR->Number +#define KeGetCurrentIrql() PCR->CurrentIrql +#define _KeGetCurrentThread() PCR->CurrentThread +#define _KeGetPreviousMode() PCR->CurrentThread->PreviousMode +#define _KeIsExecutingDpc() (PCR->DpcRoutineActive != 0) +#define KeGetDcacheFillSize() PCR->DcacheFillSize // // Stub diff --git a/reactos/ntoskrnl/include/internal/ke_x.h b/reactos/ntoskrnl/include/internal/ke_x.h index 044724ceae6..65984ff0609 100644 --- a/reactos/ntoskrnl/include/internal/ke_x.h +++ b/reactos/ntoskrnl/include/internal/ke_x.h @@ -1526,6 +1526,7 @@ KiComputeNewPriority(IN PKTHREAD Thread, return Priority; } +#ifndef _M_ARM PRKTHREAD FORCEINLINE KeGetCurrentThread(VOID) @@ -1546,6 +1547,7 @@ KeGetPreviousMode(VOID) /* Return the current mode */ return KeGetCurrentThread()->PreviousMode; } +#endif VOID FORCEINLINE