Unhack freeldr.c a bit by applying some adjustment macros.

Fix slow bitscanreverse and make LARGE_INTEGER and kin bi-endian.

svn path=/trunk/; revision=31956
This commit is contained in:
Art Yerkes 2008-01-23 02:47:22 +00:00
parent 56a886e58d
commit 9ebb58eb88
2 changed files with 38 additions and 37 deletions

View file

@ -2561,35 +2561,37 @@ typedef struct _EXCEPTION_POINTERS {
PEXCEPTION_RECORD ExceptionRecord; PEXCEPTION_RECORD ExceptionRecord;
PCONTEXT ContextRecord; PCONTEXT ContextRecord;
} EXCEPTION_POINTERS,*PEXCEPTION_POINTERS,*LPEXCEPTION_POINTERS; } 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 { typedef union _LARGE_INTEGER {
#if ! defined(NONAMELESSUNION) || defined(__cplusplus) #if ! defined(NONAMELESSUNION) || defined(__cplusplus)
_ANONYMOUS_STRUCT struct { _ANONYMOUS_STRUCT struct {
DWORD LowPart; LARGE_INTEGER_ORDER(LONG)
LONG HighPart;
}; };
#endif /* NONAMELESSUNION */ #endif /* NONAMELESSUNION */
struct { struct {
DWORD LowPart; LARGE_INTEGER_ORDER(LONG)
LONG HighPart;
} u; } u;
LONGLONG QuadPart; LONGLONG QuadPart;
} LARGE_INTEGER, *PLARGE_INTEGER; } LARGE_INTEGER, *PLARGE_INTEGER;
typedef union _ULARGE_INTEGER { typedef union _ULARGE_INTEGER {
#if ! defined(NONAMELESSUNION) || defined(__cplusplus) #if ! defined(NONAMELESSUNION) || defined(__cplusplus)
_ANONYMOUS_STRUCT struct { _ANONYMOUS_STRUCT struct {
DWORD LowPart; LARGE_INTEGER_ORDER(DWORD)
DWORD HighPart;
}; };
#endif /* NONAMELESSUNION */ #endif /* NONAMELESSUNION */
struct { struct {
DWORD LowPart; LARGE_INTEGER_ORDER(DWORD)
DWORD HighPart;
} u; } u;
ULONGLONG QuadPart; ULONGLONG QuadPart;
} ULARGE_INTEGER, *PULARGE_INTEGER; } ULARGE_INTEGER, *PULARGE_INTEGER;
typedef struct _LUID { typedef struct _LUID {
DWORD LowPart; LARGE_INTEGER_ORDER(LONG)
LONG HighPart;
} LUID, *PLUID; } LUID, *PLUID;
#pragma pack(push,4) #pragma pack(push,4)
typedef struct _LUID_AND_ATTRIBUTES { typedef struct _LUID_AND_ATTRIBUTES {
@ -4215,7 +4217,7 @@ BitScanReverse(OUT ULONG *Index,
return BitPosition; return BitPosition;
#else #else
/* Slow implementation for now */ /* Slow implementation for now */
for( *Index = 31; *Index; *Index-- ) { for( *Index = 31; *Index; (*Index)-- ) {
if( (1<<*Index) & Mask ) { if( (1<<*Index) & Mask ) {
return TRUE; return TRUE;
} }

View file

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