diff --git a/reactos/include/psdk/winnt.h b/reactos/include/psdk/winnt.h index e1ac6a31e2a..c08975402eb 100644 --- a/reactos/include/psdk/winnt.h +++ b/reactos/include/psdk/winnt.h @@ -2561,35 +2561,37 @@ typedef struct _EXCEPTION_POINTERS { 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 @@ BitScanReverse(OUT ULONG *Index, return BitPosition; #else /* Slow implementation for now */ - for( *Index = 31; *Index; *Index-- ) { + for( *Index = 31; *Index; (*Index)-- ) { if( (1<<*Index) & Mask ) { return TRUE; } diff --git a/reactos/ntoskrnl/ke/freeldr.c b/reactos/ntoskrnl/ke/freeldr.c index b1b02e33e2b..c0aefed8a18 100644 --- a/reactos/ntoskrnl/ke/freeldr.c +++ b/reactos/ntoskrnl/ke/freeldr.c @@ -9,11 +9,16 @@ /* INCLUDES *****************************************************************/ #include -#define NDEBUG +//#define NDEBUG #include #ifdef _M_PPC #include +#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 @@ VOID NTAPI KiRosBuildBiosMemoryMap(VOID) { - ULONG j; ULONG BlockBegin, BlockEnd; + ULONG j; /* Loop the BIOS Memory Map */ for (j = 0; j < KeMemoryMapRangeCount; j++) @@ -967,17 +972,19 @@ KiRosFrldrLpbToNtLpb(IN PROS_LOADER_PARAMETER_BLOCK RosLoaderBlock, 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 @@ KiRosFrldrLpbToNtLpb(IN PROS_LOADER_PARAMETER_BLOCK RosLoaderBlock, 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 @@ KiRosFrldrLpbToNtLpb(IN PROS_LOADER_PARAMETER_BLOCK RosLoaderBlock, 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 @@ KiRosFrldrLpbToNtLpb(IN PROS_LOADER_PARAMETER_BLOCK RosLoaderBlock, !(_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 @@ KiRosFrldrLpbToNtLpb(IN PROS_LOADER_PARAMETER_BLOCK RosLoaderBlock, /* 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 @@ KiRosFrldrLpbToNtLpb(IN PROS_LOADER_PARAMETER_BLOCK RosLoaderBlock, { /* 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 @@ KiRosFrldrLpbToNtLpb(IN PROS_LOADER_PARAMETER_BLOCK RosLoaderBlock, { /* 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 @@ KiRosFrldrLpbToNtLpb(IN PROS_LOADER_PARAMETER_BLOCK RosLoaderBlock, { /* 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 @@ KiRosFrldrLpbToNtLpb(IN PROS_LOADER_PARAMETER_BLOCK RosLoaderBlock, { /* 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 @@ KiRosPrepareForSystemStartup(IN ULONG Dummy, #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);