Author: tkreuzer
Date: Mon Oct 19 14:50:36 2009
New Revision: 43601
URL:
http://svn.reactos.org/svn/reactos?rev=43601&view=rev
Log:
[FREELDR]
- Move definition of KIP0PCRADDRESS into arch specific header
- Implement WinLdrSetupForNt for amd64 (copied x86 version)
- Fix mapping of PCR and KI_USER_SHARED_DATA
- Don't enable paging again, it is already enabled on amd64
- Fix WinLdrSetProcessorContext to take a ULONG_PTR not ULONG for Pcr and Tss
Modified:
branches/ros-amd64-bringup/reactos/boot/freeldr/freeldr/include/arch/amd64/amd64.h
branches/ros-amd64-bringup/reactos/boot/freeldr/freeldr/include/arch/i386/i386.h
branches/ros-amd64-bringup/reactos/boot/freeldr/freeldr/windows/amd64/ntsetup.c
branches/ros-amd64-bringup/reactos/boot/freeldr/freeldr/windows/amd64/wlmemory.c
branches/ros-amd64-bringup/reactos/boot/freeldr/freeldr/windows/wlmemory.c
Modified:
branches/ros-amd64-bringup/reactos/boot/freeldr/freeldr/include/arch/amd64/amd64.h
URL:
http://svn.reactos.org/svn/reactos/branches/ros-amd64-bringup/reactos/boot/…
==============================================================================
--- branches/ros-amd64-bringup/reactos/boot/freeldr/freeldr/include/arch/amd64/amd64.h
[iso-8859-1] (original)
+++ branches/ros-amd64-bringup/reactos/boot/freeldr/freeldr/include/arch/amd64/amd64.h
[iso-8859-1] Mon Oct 19 14:50:36 2009
@@ -20,6 +20,10 @@
#ifndef __AMD64_AMD64_H_
#define __AMD64_AMD64_H_
+
+// This is needed because headers define wrong one for ReactOS
+#undef KIP0PCRADDRESS
+#define KIP0PCRADDRESS 0xFFFFF78000001000ULL /* FIXME!!! */
#define STACK64ADDR 0x74000 /* The 64-bit stack top will be at 0x74000 */
Modified:
branches/ros-amd64-bringup/reactos/boot/freeldr/freeldr/include/arch/i386/i386.h
URL:
http://svn.reactos.org/svn/reactos/branches/ros-amd64-bringup/reactos/boot/…
==============================================================================
--- branches/ros-amd64-bringup/reactos/boot/freeldr/freeldr/include/arch/i386/i386.h
[iso-8859-1] (original)
+++ branches/ros-amd64-bringup/reactos/boot/freeldr/freeldr/include/arch/i386/i386.h
[iso-8859-1] Mon Oct 19 14:50:36 2009
@@ -21,6 +21,9 @@
#ifndef __I386_I386_H_
#define __I386_I386_H_
+// This is needed because headers define wrong one for ReactOS
+#undef KIP0PCRADDRESS
+#define KIP0PCRADDRESS 0xffdff000
#endif /* __I386_I386_H_ */
Modified: branches/ros-amd64-bringup/reactos/boot/freeldr/freeldr/windows/amd64/ntsetup.c
URL:
http://svn.reactos.org/svn/reactos/branches/ros-amd64-bringup/reactos/boot/…
==============================================================================
--- branches/ros-amd64-bringup/reactos/boot/freeldr/freeldr/windows/amd64/ntsetup.c
[iso-8859-1] (original)
+++ branches/ros-amd64-bringup/reactos/boot/freeldr/freeldr/windows/amd64/ntsetup.c
[iso-8859-1] Mon Oct 19 14:50:36 2009
@@ -40,5 +40,45 @@
ULONG *PcrBasePage,
ULONG *TssBasePage)
{
+ ULONG TssSize;
+ ULONG TssPages;
+ ULONG_PTR Pcr = 0;
+ ULONG_PTR Tss = 0;
+ ULONG BlockSize, NumPages;
+ LoaderBlock->u.I386.CommonDataArea = NULL; // Force No ABIOS support
+ LoaderBlock->u.I386.MachineType = MACHINE_TYPE_ISA;
+
+ /* Allocate 2 pages for PCR */
+ Pcr = (ULONG_PTR)MmAllocateMemoryWithType(2 * MM_PAGE_SIZE, LoaderStartupPcrPage);
+ *PcrBasePage = Pcr >> MM_PAGE_SHIFT;
+ RtlZeroMemory((PVOID)Pcr, 2 * MM_PAGE_SIZE);
+
+ if (Pcr == 0)
+ {
+ UiMessageBox("Can't allocate PCR\n");
+ return;
+ }
+
+ /* Allocate TSS */
+ TssSize = (sizeof(KTSS) + MM_PAGE_SIZE) & ~(MM_PAGE_SIZE - 1);
+ TssPages = TssSize / MM_PAGE_SIZE;
+
+ Tss = (ULONG_PTR)MmAllocateMemoryWithType(TssSize, LoaderMemoryData);
+
+ *TssBasePage = Tss >> MM_PAGE_SHIFT;
+
+ /* Allocate space for new GDT + IDT */
+ BlockSize = NUM_GDT*sizeof(KGDTENTRY) + NUM_IDT*sizeof(KIDTENTRY);//FIXME: Use GDT/IDT
limits here?
+ NumPages = (BlockSize + MM_PAGE_SIZE - 1) >> MM_PAGE_SHIFT;
+ *GdtIdt = (PKGDTENTRY)MmAllocateMemoryWithType(NumPages * MM_PAGE_SIZE,
LoaderMemoryData);
+
+ if (*GdtIdt == NULL)
+ {
+ UiMessageBox("Can't allocate pages for GDT+IDT!\n");
+ return;
+ }
+
+ /* Zero newly prepared GDT+IDT */
+ RtlZeroMemory(*GdtIdt, NumPages << MM_PAGE_SHIFT);
}
Modified:
branches/ros-amd64-bringup/reactos/boot/freeldr/freeldr/windows/amd64/wlmemory.c
URL:
http://svn.reactos.org/svn/reactos/branches/ros-amd64-bringup/reactos/boot/…
==============================================================================
--- branches/ros-amd64-bringup/reactos/boot/freeldr/freeldr/windows/amd64/wlmemory.c
[iso-8859-1] (original)
+++ branches/ros-amd64-bringup/reactos/boot/freeldr/freeldr/windows/amd64/wlmemory.c
[iso-8859-1] Mon Oct 19 14:50:36 2009
@@ -15,10 +15,6 @@
//extern ULONG LoaderPagesSpanned;
-// This is needed because headers define wrong one for ReactOS
-#undef KIP0PCRADDRESS
-#define KIP0PCRADDRESS 0xffdff000
-
#define HYPER_SPACE_ENTRY 0x300
// This is needed only for SetProcessorContext routine
@@ -100,7 +96,7 @@
}
BOOLEAN
-MempMapSinglePage(ULONGLONG VirtualAddress, ULONGLONG PhysicalAddress)
+MempMapSinglePage(ULONG64 VirtualAddress, ULONG64 PhysicalAddress)
{
PPAGE_DIRECTORY_AMD64 pDir3, pDir2, pDir1;
ULONG Index;
@@ -110,11 +106,15 @@
pDir1 = MempGetOrCreatePageDir(pDir2, VAtoPDI(VirtualAddress));
if (!pDir1)
+ {
+ DPRINTM(DPRINT_WINDOWS,"!!!No Dir %p, %p, %p, %p\n", pPML4, pDir3,
pDir2, pDir1);
return FALSE;
+ }
Index = VAtoPTI(VirtualAddress);
if (pDir1->Pde[Index].Valid)
{
+ DPRINTM(DPRINT_WINDOWS,"!!!Already mapped %ld\n", Index);
return FALSE;
}
@@ -201,14 +201,14 @@
WinLdrMapSpecialPages(ULONG PcrBasePage)
{
/* Map the PCR page */
- if (!MempMapSinglePage(PcrBasePage * PAGE_SIZE, KIP0PCRADDRESS))
+ if (!MempMapSinglePage(KIP0PCRADDRESS, PcrBasePage * PAGE_SIZE))
{
DPRINTM(DPRINT_WINDOWS, "Could not map PCR @ %lx\n", PcrBasePage);
return FALSE;
}
/* Map KI_USER_SHARED_DATA */
- if (!MempMapSinglePage((PcrBasePage+1) * PAGE_SIZE, KI_USER_SHARED_DATA))
+ if (!MempMapSinglePage(KI_USER_SHARED_DATA, (PcrBasePage+1) * PAGE_SIZE))
{
DPRINTM(DPRINT_WINDOWS, "Could not map KI_USER_SHARED_DATA\n");
return FALSE;
@@ -284,6 +284,8 @@
VOID
WinLdrSetProcessorContext(PVOID GdtIdt, IN ULONG64 Pcr, IN ULONG64 Tss)
{
+ DPRINTM(DPRINT_WINDOWS, "WinLdrSetProcessorContext %p\n", Pcr);
+
/* Disable Interrupts */
_disable();
@@ -293,18 +295,13 @@
/* Set the new PML4 */
__writecr3((ULONGLONG)pPML4);
- // Enable paging by modifying CR0
- __writecr0(__readcr0() | CR0_PG);
-
- // Kernel expects the PCR to be zero-filled on startup
- // FIXME: Why zero it here when we can zero it right after allocation?
- RtlZeroMemory((PVOID)Pcr, MM_PAGE_SIZE); //FIXME: Why zero only 1 page when we allocate
2?
-
RtlZeroMemory(GdtIdt, PAGE_SIZE);
WinLdrSetupGdt(GdtIdt, Tss);
- WinLdrSetupIdt(GdtIdt);
+ WinLdrSetupIdt((PVOID)((ULONG64)GdtIdt + 2048)); // HACK!
+
+ DPRINTM(DPRINT_WINDOWS, "leave WinLdrSetProcessorContext\n");
}
Modified: branches/ros-amd64-bringup/reactos/boot/freeldr/freeldr/windows/wlmemory.c
URL:
http://svn.reactos.org/svn/reactos/branches/ros-amd64-bringup/reactos/boot/…
==============================================================================
--- branches/ros-amd64-bringup/reactos/boot/freeldr/freeldr/windows/wlmemory.c
[iso-8859-1] (original)
+++ branches/ros-amd64-bringup/reactos/boot/freeldr/freeldr/windows/wlmemory.c
[iso-8859-1] Mon Oct 19 14:50:36 2009
@@ -14,10 +14,6 @@
#include <debug.h>
extern ULONG LoaderPagesSpanned;
-
-// This is needed because headers define wrong one for ReactOS
-#undef KIP0PCRADDRESS
-#define KIP0PCRADDRESS 0xffdff000
PCHAR MemTypeDesc[] = {
"ExceptionBlock ", // ?
@@ -63,7 +59,7 @@
WinLdrRemoveDescriptor(IN PMEMORY_ALLOCATION_DESCRIPTOR Descriptor);
VOID
-WinLdrSetProcessorContext(PVOID GdtIdt, IN ULONG Pcr, IN ULONG Tss);
+WinLdrSetProcessorContext(PVOID GdtIdt, IN ULONG_PTR Pcr, IN ULONG_PTR Tss);
BOOLEAN
MempAllocatePageTables();