[FREELDR/HAL/NDK]

- Move some shared constants (HYPERSPACE_BASE, MM_HAL_VA_START, APIC_BASE) to NDK to avoid duplicating them, also fix wrong values for amd64
- Map the hal address space in amd64 freeldr
- Fix use of uninitialized variable (HighPart of PHYSICAL_ADDRESS) in HalpAcpiCopyBiosTable
- Fix some MSVC and amd64 warnings

svn path=/trunk/; revision=53709
This commit is contained in:
Timo Kreuzer 2011-09-15 10:46:02 +00:00
parent 679d1e828c
commit 00502b9642
10 changed files with 81 additions and 83 deletions

View file

@ -235,23 +235,31 @@ WinLdrpMapApic()
BOOLEAN
WinLdrMapSpecialPages()
{
/* Map the PCR page */
if (!MempMapSinglePage(KIP0PCRADDRESS, PcrBasePage * PAGE_SIZE))
{
ERR("Could not map PCR @ %lx\n", PcrBasePage);
return FALSE;
}
PHARDWARE_PTE PpeBase, PdeBase, PteBase;
/* Map KI_USER_SHARED_DATA */
if (!MempMapSinglePage(KI_USER_SHARED_DATA, (PcrBasePage+1) * PAGE_SIZE))
{
ERR("Could not map KI_USER_SHARED_DATA\n");
return FALSE;
}
/* Map the PCR page */
if (!MempMapSinglePage(KIP0PCRADDRESS, PcrBasePage * PAGE_SIZE))
{
ERR("Could not map PCR @ %lx\n", PcrBasePage);
return FALSE;
}
/* Map KI_USER_SHARED_DATA */
if (!MempMapSinglePage(KI_USER_SHARED_DATA, (PcrBasePage+1) * PAGE_SIZE))
{
ERR("Could not map KI_USER_SHARED_DATA\n");
return FALSE;
}
/* Map the APIC page */
WinLdrpMapApic();
/* Map the page tables for 4 MB HAL address space. */
PpeBase = MempGetOrCreatePageDir(PxeBase, VAtoPXI(MM_HAL_VA_START));
PdeBase = MempGetOrCreatePageDir(PpeBase, VAtoPPI(MM_HAL_VA_START));
MempGetOrCreatePageDir(PdeBase, VAtoPDI(MM_HAL_VA_START));
MempGetOrCreatePageDir(PdeBase, VAtoPDI(MM_HAL_VA_START + 2 * 1024 * 1024));
return TRUE;
}

View file

@ -36,14 +36,6 @@
#define VAtoPDI(va) ((((ULONG64)va) >> PDI_SHIFT) & 0x1FF)
#define VAtoPTI(va) ((((ULONG64)va) >> PTI_SHIFT) & 0x1FF)
#define HYPERSPACE_BASE 0xfffff70000000000ULL
#define HAL_BASE 0xffffffff80000000ULL
#define APIC_BASE 0xFFFFFFFFFFFE0000ULL
#define APIC_PHYS_BASE 0xfee00000
#define NUM_PAGES_KERNEL
#ifndef ASM
VOID FrLdrSetupGdtIdt(VOID);

View file

@ -40,8 +40,6 @@
((p) >> PFN_SHIFT)
#define STARTUP_BASE 0xC0000000
#define HAL_BASE 0xFFC00000
#define APIC_BASE 0xFFFE0000
#define LowMemPageTableIndex 0
#define StartupPageTableIndex (STARTUP_BASE >> 22)

View file

@ -100,11 +100,11 @@ HalpAcpiCopyBiosTable(IN PLOADER_PARAMETER_BLOCK LoaderBlock,
{
/* Phase 0: Convert to pages and use the HAL heap */
PageCount = BYTES_TO_PAGES(Size);
PhysAddress.LowPart = HalpAllocPhysicalMemory(LoaderBlock,
0x1000000,
PageCount,
FALSE);
if (PhysAddress.LowPart)
PhysAddress.QuadPart = HalpAllocPhysicalMemory(LoaderBlock,
0x1000000,
PageCount,
FALSE);
if (PhysAddress.QuadPart)
{
/* Map it */
CachedTable = HalpMapPhysicalMemory64(PhysAddress, PageCount);
@ -217,7 +217,7 @@ HalpAcpiGetTableFromBios(IN PLOADER_PARAMETER_BLOCK LoaderBlock,
}
else
{
/* To find tables, we need the RSDT */
/* To find tables, we need the RSDT */
Rsdt = HalpAcpiGetTable(LoaderBlock, RSDT_SIGNATURE);
if (Rsdt)
{
@ -342,7 +342,7 @@ HalpAcpiGetTableFromBios(IN PLOADER_PARAMETER_BLOCK LoaderBlock,
ASSERT(Header);
/* How many pages do we need? */
PageCount = BYTES_TO_PAGES(Header->Length);
PageCount = BYTES_TO_PAGES(Header->Length);
if (PageCount != 2)
{
/* We assumed two, but this is not the case, free the current mapping */
@ -546,7 +546,7 @@ HalpAcpiFindRsdtPhase0(IN PLOADER_PARAMETER_BLOCK LoaderBlock,
PCONFIGURATION_COMPONENT_DATA Next = NULL;
PCM_PARTIAL_RESOURCE_LIST ResourceList;
PACPI_BIOS_MULTI_NODE NodeData;
ULONG NodeLength;
SIZE_T NodeLength;
PFN_NUMBER PageCount;
PVOID MappedAddress;
PHYSICAL_ADDRESS PhysicalAddress;
@ -605,12 +605,11 @@ HalpAcpiFindRsdtPhase0(IN PLOADER_PARAMETER_BLOCK LoaderBlock,
PageCount = BYTES_TO_PAGES(NodeLength);
/* Allocate the memory */
PhysicalAddress.HighPart = 0;
PhysicalAddress.LowPart = HalpAllocPhysicalMemory(LoaderBlock,
0x1000000,
PageCount,
FALSE);
if (PhysicalAddress.LowPart)
PhysicalAddress.QuadPart = HalpAllocPhysicalMemory(LoaderBlock,
0x1000000,
PageCount,
FALSE);
if (PhysicalAddress.QuadPart)
{
/* Map it if the allocation worked */
MappedAddress = HalpMapPhysicalMemory64(PhysicalAddress, PageCount);
@ -741,7 +740,7 @@ HalpAcpiTableCacheInit(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
MmUnmapIoSpace(MappedAddress, TableLength << PAGE_SHIFT);
}
/* Cache the RSDT */
/* Cache the RSDT */
HalpAcpiCacheTable(&Rsdt->Header);
/* Check for compatible loader block extension */
@ -825,7 +824,7 @@ HalpSetupAcpiPhase0(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
HalpNumaInitializeStaticConfiguration(LoaderBlock);
/* Initialize hotplug through the SRAT */
HalpDynamicSystemResourceConfiguration(LoaderBlock);
HalpDynamicSystemResourceConfiguration(LoaderBlock);
DPRINT1("ACPI SRAT at 0x%p\n", HalpAcpiSrat);
if (HalpAcpiSrat)
{
@ -843,14 +842,14 @@ HalpSetupAcpiPhase0(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
HaliAcpiTimerInit(0, 0);
/* Do we have a low stub address yet? */
if (!HalpLowStubPhysicalAddress.LowPart)
if (!HalpLowStubPhysicalAddress.QuadPart)
{
/* Allocate it */
HalpLowStubPhysicalAddress.LowPart = HalpAllocPhysicalMemory(LoaderBlock,
0x100000,
1,
FALSE);
if (HalpLowStubPhysicalAddress.LowPart)
HalpLowStubPhysicalAddress.QuadPart = HalpAllocPhysicalMemory(LoaderBlock,
0x100000,
1,
FALSE);
if (HalpLowStubPhysicalAddress.QuadPart)
{
/* Map it */
HalpLowStub = HalpMapPhysicalMemory64(HalpLowStubPhysicalAddress, 1);

View file

@ -1,7 +1,6 @@
#ifdef _M_AMD64
#define APIC_BASE 0xFFFFFFFFFEE00000ULL
#define IOAPIC_BASE 0xFFFFFFFFFEE01000ULL // checkme
#define IOAPIC_BASE 0xFFFFFFFFFFFE1000ULL // checkme
#define ZERO_VECTOR 0x00 // IRQL 00
#define APC_VECTOR 0x3D // IRQL 01
#define APIC_SPURIOUS_VECTOR 0x3f
@ -18,7 +17,6 @@
#define TprToIrql(Tpr) ((KIRQL)(Tpr >> 4))
#define CLOCK2_LEVEL CLOCK_LEVEL
#else
#define APIC_BASE 0xFFFE0000
#define IOAPIC_BASE 0xFFFE1000 // checkme
#define ZERO_VECTOR 0x00 // IRQL 00
#define APIC_SPURIOUS_VECTOR 0x1f

View file

@ -34,7 +34,7 @@ HackEoi:
push rax
lea rax, HackEoiReturn[rip]
push rax
mov dword ptr [HEX(0FFFFFFFFFEE000B0)], 0
mov dword ptr [HEX(0FFFFFFFFFFFE00B0)], 0
iretq
HackEoiReturn:
ret

View file

@ -13,8 +13,7 @@
#include <debug.h>
/* Share with Mm headers? */
#define MM_HAL_VA_START (PVOID)0xFFC00000
#define MM_HAL_HEAP_START (PVOID)((ULONG_PTR)MM_HAL_VA_START + (1024 * 1024))
#define MM_HAL_HEAP_START (PVOID)(MM_HAL_VA_START + (1024 * 1024))
/* GLOBALS *******************************************************************/
@ -25,14 +24,15 @@ PVOID HalpHeapStart = MM_HAL_HEAP_START;
/* PRIVATE FUNCTIONS *********************************************************/
ULONG
ULONG_PTR
NTAPI
HalpAllocPhysicalMemory(IN PLOADER_PARAMETER_BLOCK LoaderBlock,
IN ULONG MaxAddress,
IN ULONG PageCount,
IN ULONG_PTR MaxAddress,
IN PFN_NUMBER PageCount,
IN BOOLEAN Aligned)
{
ULONG UsedDescriptors, Alignment, PhysicalAddress;
ULONG UsedDescriptors, Alignment;
ULONG_PTR PhysicalAddress;
PFN_NUMBER MaxPage, BasePage;
PLIST_ENTRY NextEntry;
PMEMORY_ALLOCATION_DESCRIPTOR MdBlock, NewBlock, FreeBlock;
@ -87,7 +87,7 @@ HalpAllocPhysicalMemory(IN PLOADER_PARAMETER_BLOCK LoaderBlock,
/* Okay, now get a descriptor */
NewBlock = &HalpAllocationDescriptorArray[HalpUsedAllocDescriptors];
NewBlock->PageCount = PageCount;
NewBlock->PageCount = (ULONG)PageCount;
NewBlock->BasePage = MdBlock->BasePage + Alignment;
NewBlock->MemoryType = LoaderHALCachedMemory;
@ -103,8 +103,8 @@ HalpAllocPhysicalMemory(IN PLOADER_PARAMETER_BLOCK LoaderBlock,
{
/* Get the next descriptor */
FreeBlock = &HalpAllocationDescriptorArray[UsedDescriptors];
FreeBlock->PageCount = MdBlock->PageCount - Alignment - PageCount;
FreeBlock->BasePage = MdBlock->BasePage + Alignment + PageCount;
FreeBlock->PageCount = MdBlock->PageCount - Alignment - (ULONG)PageCount;
FreeBlock->BasePage = MdBlock->BasePage + Alignment + (ULONG)PageCount;
/* One more */
HalpUsedAllocDescriptors++;
@ -120,8 +120,8 @@ HalpAllocPhysicalMemory(IN PLOADER_PARAMETER_BLOCK LoaderBlock,
else
{
/* Consume memory from this block */
MdBlock->BasePage += PageCount;
MdBlock->PageCount -= PageCount;
MdBlock->BasePage += (ULONG)PageCount;
MdBlock->PageCount -= (ULONG)PageCount;
/* Insert the descriptor */
InsertTailList(&MdBlock->ListEntry, &NewBlock->ListEntry);
@ -137,10 +137,10 @@ HalpAllocPhysicalMemory(IN PLOADER_PARAMETER_BLOCK LoaderBlock,
PVOID
NTAPI
HalpMapPhysicalMemory64(IN PHYSICAL_ADDRESS PhysicalAddress,
IN ULONG PageCount)
IN PFN_NUMBER PageCount)
{
PHARDWARE_PTE PointerPte;
ULONG UsedPages = 0;
PFN_NUMBER UsedPages = 0;
PVOID VirtualAddress, BaseAddress;
/* Start at the current HAL heap base */
@ -205,13 +205,13 @@ HalpMapPhysicalMemory64(IN PHYSICAL_ADDRESS PhysicalAddress,
VOID
NTAPI
HalpUnmapVirtualAddress(IN PVOID VirtualAddress,
IN ULONG PageCount)
IN PFN_NUMBER PageCount)
{
PHARDWARE_PTE PointerPte;
ULONG i;
/* Only accept valid addresses */
if (VirtualAddress < MM_HAL_VA_START) return;
if (VirtualAddress < (PVOID)MM_HAL_VA_START) return;
/* Align it down to page size */
VirtualAddress = (PVOID)((ULONG_PTR)VirtualAddress & ~(PAGE_SIZE - 1));

View file

@ -639,18 +639,27 @@ HalpReleasePciDeviceForDebugging(
//
// Memory routines
//
ULONG_PTR
NTAPI
HalpAllocPhysicalMemory(
IN PLOADER_PARAMETER_BLOCK LoaderBlock,
IN ULONG_PTR MaxAddress,
IN PFN_NUMBER PageCount,
IN BOOLEAN Aligned
);
PVOID
NTAPI
HalpMapPhysicalMemory64(
IN PHYSICAL_ADDRESS PhysicalAddress,
IN ULONG NumberPage
IN PFN_NUMBER PageCount
);
VOID
NTAPI
HalpUnmapVirtualAddress(
IN PVOID VirtualAddress,
IN ULONG NumberPages
IN PFN_NUMBER NumberPages
);
/* sysinfo.c */
@ -738,22 +747,6 @@ HalpReleaseCmosSpinLock(
VOID
);
ULONG
NTAPI
HalpAllocPhysicalMemory(
IN PLOADER_PARAMETER_BLOCK LoaderBlock,
IN ULONG MaxAddress,
IN ULONG PageCount,
IN BOOLEAN Aligned
);
PVOID
NTAPI
HalpMapPhysicalMemory64(
IN PHYSICAL_ADDRESS PhysicalAddress,
IN ULONG PageCount
);
NTSTATUS
NTAPI
HalpOpenRegistryKey(
@ -852,8 +845,8 @@ HalpInitProcessor(
#ifdef _M_AMD64
#define KfLowerIrql KeLowerIrql
#define KiEnterInterruptTrap(TrapFrame) /* We do all neccessary in asm code */
#define KiEoiHelper() return
#define HalBeginSystemInterrupt(Irql, Vector, OldIrql) TRUE
#define KiEoiHelper(TrapFrame) return /* Just return to the caller */
#define HalBeginSystemInterrupt(Irql, Vector, OldIrql) (KeRaiseIrql(Irql, OldIrql), TRUE)
#ifndef CONFIG_SMP
/* On UP builds, spinlocks don't exist at IRQL >= DISPATCH */
#define KiAcquireSpinLock(SpinLock)

View file

@ -162,6 +162,9 @@ Author:
// HAL Variables
//
#define INITIAL_STALL_COUNT 100
#define HYPERSPACE_BASE 0xfffff70000000000ULL
#define MM_HAL_VA_START 0xFFFFFFFFFFC00000ULL /* This is Vista+ */
#define APIC_BASE 0xFFFFFFFFFFFE0000ULL
//
// IOPM Definitions

View file

@ -136,6 +136,13 @@ Author:
// HAL Variables
//
#define INITIAL_STALL_COUNT 100
#ifdef PAE
#define HYPERSPACE_BASE 0xc0400000
#else
#define HYPERSPACE_BASE 0xc0800000
#endif
#define MM_HAL_VA_START 0xFFC00000
#define APIC_BASE 0xFFFE0000
//
// IOPM Definitions