[ros-diffs] [arty] 31956: Unhack freeldr.c a bit by applying some adjustment macros. Fix slow bitscanreverse and make LARGE_INTEGER and kin bi-endian.

arty at svn.reactos.org arty at svn.reactos.org
Wed Jan 23 03:47:23 CET 2008


Author: arty
Date: Wed Jan 23 05:47:22 2008
New Revision: 31956

URL: http://svn.reactos.org/svn/reactos?rev=31956&view=rev
Log:
Unhack freeldr.c a bit by applying some adjustment macros.
Fix slow bitscanreverse and make LARGE_INTEGER and kin bi-endian.

Modified:
    trunk/reactos/include/psdk/winnt.h
    trunk/reactos/ntoskrnl/ke/freeldr.c

Modified: trunk/reactos/include/psdk/winnt.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/include/psdk/winnt.h?rev=31956&r1=31955&r2=31956&view=diff
==============================================================================
--- trunk/reactos/include/psdk/winnt.h (original)
+++ trunk/reactos/include/psdk/winnt.h Wed Jan 23 05:47:22 2008
@@ -2561,35 +2561,37 @@
 	PEXCEPTION_RECORD ExceptionRecord;
 	PCONTEXT ContextRecord;
 } EXCEPTION_POINTERS,*PEXCEPTION_POINTERS,*LPEXCEPTION_POINTERS;
+
+#ifdef _M_PPC
+#define LARGE_INTEGER_ORDER(x) x HighPart; DWORD LowPart;
+#else
+#define LARGE_INTEGER_ORDER(x) DWORD LowPart; x HighPart;
+#endif
+
 typedef union _LARGE_INTEGER {
 #if ! defined(NONAMELESSUNION) || defined(__cplusplus)
   _ANONYMOUS_STRUCT struct {
-    DWORD LowPart;
-    LONG  HighPart;
+      LARGE_INTEGER_ORDER(LONG)
   };
 #endif /* NONAMELESSUNION */
   struct {
-    DWORD LowPart;
-    LONG  HighPart;
+      LARGE_INTEGER_ORDER(LONG)
   } u;
   LONGLONG QuadPart;
 } LARGE_INTEGER, *PLARGE_INTEGER;
 typedef union _ULARGE_INTEGER {
 #if ! defined(NONAMELESSUNION) || defined(__cplusplus)
   _ANONYMOUS_STRUCT struct {
-    DWORD LowPart;
-    DWORD HighPart;
+      LARGE_INTEGER_ORDER(DWORD)
   };
 #endif /* NONAMELESSUNION */
   struct {
-    DWORD LowPart;
-    DWORD HighPart;
+      LARGE_INTEGER_ORDER(DWORD)
   } u;
   ULONGLONG QuadPart;
 } ULARGE_INTEGER, *PULARGE_INTEGER;
 typedef struct _LUID {
-    DWORD LowPart;
-    LONG HighPart;
+    LARGE_INTEGER_ORDER(LONG)
 } LUID, *PLUID;
 #pragma pack(push,4)
 typedef struct _LUID_AND_ATTRIBUTES {
@@ -4215,7 +4217,7 @@
 	return BitPosition;
 #else
 	/* Slow implementation for now */
-	for( *Index = 31; *Index; *Index-- ) {
+	for( *Index = 31; *Index; (*Index)-- ) {
 		if( (1<<*Index) & Mask ) {
 			return TRUE;
 		}

Modified: trunk/reactos/ntoskrnl/ke/freeldr.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/freeldr.c?rev=31956&r1=31955&r2=31956&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/ke/freeldr.c (original)
+++ trunk/reactos/ntoskrnl/ke/freeldr.c Wed Jan 23 05:47:22 2008
@@ -9,11 +9,16 @@
 /* INCLUDES *****************************************************************/
 
 #include <ntoskrnl.h>
-#define NDEBUG
+//#define NDEBUG
 #include <debug.h>
 
 #ifdef _M_PPC
 #include <ppcmmu/mmu.h>
+#define KERNEL_RVA(x) RVA(x,0x80800000)
+#define KERNEL_DESCRIPTOR_PAGE(x) (((ULONG_PTR)x + KernelBase) >> PAGE_SHIFT)
+#else
+#define KERNEL_RVA(x) RVA(x,KSEG0_BASE)
+#define KERNEL_DESCRIPTOR_PAGE(x) (((ULONG_PTR)x &~ KSEG0_BASE) >> PAGE_SHIFT)
 #endif
 
 typedef struct _BIOS_MEMORY_DESCRIPTOR
@@ -126,8 +131,8 @@
 NTAPI
 KiRosBuildBiosMemoryMap(VOID)
 {
+    ULONG BlockBegin, BlockEnd;
     ULONG j;
-    ULONG BlockBegin, BlockEnd;
 
     /* Loop the BIOS Memory Map */
     for (j = 0; j < KeMemoryMapRangeCount; j++)
@@ -967,17 +972,19 @@
         ModStart = (PVOID)RosEntry->ModStart;
         ModSize = RosEntry->ModEnd - (ULONG_PTR)ModStart;
 
+#ifdef _M_PPC
+        ModStart -= KernelBase;
+#endif
+
         /* Check if this is any of the NLS files */
         if (!_stricmp(DriverName, "ansi.nls"))
         {
             /* ANSI Code page */
-            ModStart = RVA(ModStart, KSEG0_BASE);
-            LoaderBlock->NlsData->AnsiCodePageData = ModStart;
+            LoaderBlock->NlsData->AnsiCodePageData = KERNEL_RVA(ModStart);
 
             /* Create an MD for it */
             KiRosAllocateNtDescriptor(LoaderNlsData,
-                                      ((ULONG_PTR)ModStart &~ KSEG0_BASE) >>
-                                      PAGE_SHIFT,
+                                      KERNEL_DESCRIPTOR_PAGE(ModStart),
                                       (ModSize + PAGE_SIZE - 1)>> PAGE_SHIFT,
                                       0,
                                       &Base);
@@ -986,13 +993,11 @@
         else if (!_stricmp(DriverName, "oem.nls"))
         {
             /* OEM Code page */
-            ModStart = RVA(ModStart, KSEG0_BASE);
-            LoaderBlock->NlsData->OemCodePageData = ModStart;
+            LoaderBlock->NlsData->OemCodePageData = KERNEL_RVA(ModStart);
 
             /* Create an MD for it */
             KiRosAllocateNtDescriptor(LoaderNlsData,
-                                      ((ULONG_PTR)ModStart &~ KSEG0_BASE) >>
-                                      PAGE_SHIFT,
+                                      KERNEL_DESCRIPTOR_PAGE(ModStart),
                                       (ModSize + PAGE_SIZE - 1)>> PAGE_SHIFT,
                                       0,
                                       &Base);
@@ -1001,13 +1006,11 @@
         else if (!_stricmp(DriverName, "casemap.nls"))
         {
             /* Unicode Code page */
-            ModStart = RVA(ModStart, KSEG0_BASE);
-            LoaderBlock->NlsData->UnicodeCodePageData = ModStart;
+            LoaderBlock->NlsData->UnicodeCodePageData = KERNEL_RVA(ModStart);
 
             /* Create an MD for it */
             KiRosAllocateNtDescriptor(LoaderNlsData,
-                                      ((ULONG_PTR)ModStart &~ KSEG0_BASE) >>
-                                      PAGE_SHIFT,
+                                      KERNEL_DESCRIPTOR_PAGE(ModStart),
                                       (ModSize + PAGE_SIZE - 1)>> PAGE_SHIFT,
                                       0,
                                       &Base);
@@ -1019,8 +1022,7 @@
             !(_stricmp(DriverName, "system.hiv")))
         {
             /* Save registry data */
-            ModStart = RVA(ModStart, KSEG0_BASE);
-            LoaderBlock->RegistryBase = ModStart;
+            LoaderBlock->RegistryBase = KERNEL_RVA(ModStart);
             LoaderBlock->RegistryLength = ModSize;
 
             /* Disable setup mode */
@@ -1028,8 +1030,7 @@
 
             /* Create an MD for it */
             KiRosAllocateNtDescriptor(LoaderRegistryData,
-                                      ((ULONG_PTR)ModStart &~ KSEG0_BASE) >>
-                                      PAGE_SHIFT,
+                                      KERNEL_DESCRIPTOR_PAGE(ModStart),
                                       (ModSize + PAGE_SIZE - 1)>> PAGE_SHIFT,
                                       0,
                                       &Base);
@@ -1042,7 +1043,7 @@
         {
             /* Create an MD for it */
             KiRosAllocateNtDescriptor(LoaderRegistryData,
-                                      (ULONG_PTR)ModStart >> PAGE_SHIFT,
+                                      KERNEL_DESCRIPTOR_PAGE(ModStart),
                                       (ModSize + PAGE_SIZE - 1)>> PAGE_SHIFT,
                                       0,
                                       &Base);
@@ -1054,8 +1055,7 @@
         {
             /* Create an MD for it */
             KiRosAllocateNtDescriptor(LoaderSystemCode,
-                                      ((ULONG_PTR)ModStart &~ KSEG0_BASE) >>
-                                      PAGE_SHIFT,
+                                      KERNEL_DESCRIPTOR_PAGE(ModStart),
                                       (ModSize + PAGE_SIZE - 1)>> PAGE_SHIFT,
                                       0,
                                       &Base);
@@ -1064,8 +1064,7 @@
         {
             /* Create an MD for the HAL */
             KiRosAllocateNtDescriptor(LoaderHalCode,
-                                      ((ULONG_PTR)ModStart &~ KSEG0_BASE) >>
-                                      PAGE_SHIFT,
+                                      KERNEL_DESCRIPTOR_PAGE(ModStart),
                                       (ModSize + PAGE_SIZE - 1)>> PAGE_SHIFT,
                                       0,
                                       &Base);
@@ -1074,15 +1073,14 @@
         {
             /* Create an MD for any driver */
             KiRosAllocateNtDescriptor(LoaderBootDriver,
-                                      ((ULONG_PTR)ModStart &~ KSEG0_BASE) >>
-                                      PAGE_SHIFT,
+                                      KERNEL_DESCRIPTOR_PAGE(ModStart),
                                       (ModSize + PAGE_SIZE - 1)>> PAGE_SHIFT,
                                       0,
                                       &Base);
         }
 
 #ifdef _M_PPC
-        ModStart = (PVOID)((ULONG)ModStart + 0x80800000 - KernelBase);
+        ModStart += 0x80800000;
 #endif
 
         /* Lowercase the drivername so we can check its extension later */
@@ -1291,6 +1289,7 @@
 #if defined(_M_PPC)
     MmFreeLdrFirstKrnlPhysAddr = KeRosLoaderBlock->ModsAddr[0].ModStart;
     MmFreeLdrLastKrnlPhysAddr = MmFreeLdrLastKernelAddress;
+    MmFreeLdrLastKernelAddress = 0x80800000 + KeRosLoaderBlock->ModsAddr[KeRosLoaderBlock->ModsCount - 1].ModEnd - MmFreeLdrFirstKrnlPhysAddr;
     DbgPrint("kernel phys = %08x-%08x\n", 
              MmFreeLdrFirstKrnlPhysAddr,
              MmFreeLdrLastKrnlPhysAddr);




More information about the Ros-diffs mailing list