mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 23:12:56 +00:00
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:
parent
56a886e58d
commit
9ebb58eb88
2 changed files with 38 additions and 37 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue