diff --git a/reactos/boot/freeldr/freeldr/arch/amd64/winldr.c b/reactos/boot/freeldr/freeldr/arch/amd64/winldr.c index 68d8569b189..72a014734da 100644 --- a/reactos/boot/freeldr/freeldr/arch/amd64/winldr.c +++ b/reactos/boot/freeldr/freeldr/arch/amd64/winldr.c @@ -269,6 +269,7 @@ Amd64SetupGdt(PVOID GdtBase, ULONG64 TssBase) { PKGDTENTRY64 Entry; KDESCRIPTOR GdtDesc; + TRACE("Amd64SetupGdt(GdtBase = %p, TssBase = %p)\n", GdtBase, TssBase); /* Setup KGDT64_NULL */ Entry = KiGetGdtEntry(GdtBase, KGDT64_NULL); @@ -308,20 +309,22 @@ Amd64SetupGdt(PVOID GdtBase, ULONG64 TssBase) /* Set the new Gdt */ __lgdt(&GdtDesc.Limit); - TRACE("Gdtr.Base = %p, num = %ld\n", GdtDesc.Base, NUM_GDT); - + TRACE("Leave Amd64SetupGdt()\n"); } VOID Amd64SetupIdt(PVOID IdtBase) { KDESCRIPTOR IdtDesc, OldIdt; + ULONG Size; + TRACE("Amd64SetupIdt(IdtBase = %p)\n", IdtBase); /* Get old IDT */ - __sidt(&OldIdt); + __sidt(&OldIdt.Limit); /* Copy the old IDT */ - RtlCopyMemory(IdtBase, (PVOID)OldIdt.Base, OldIdt.Limit + 1); + Size = min(OldIdt.Limit + 1, NUM_IDT * sizeof(KIDTENTRY)); + //RtlCopyMemory(IdtBase, (PVOID)OldIdt.Base, Size); /* Setup the new IDT descriptor */ IdtDesc.Base = IdtBase; @@ -329,8 +332,7 @@ Amd64SetupIdt(PVOID IdtBase) /* Set the new IDT */ __lidt(&IdtDesc.Limit); - TRACE("Idtr.Base = %p\n", IdtDesc.Base); - + TRACE("Leave Amd64SetupIdt()\n"); } VOID @@ -354,7 +356,7 @@ WinLdrSetProcessorContext(void) Amd64SetupGdt(GdtIdt, KSEG0_BASE | (TssBasePage << MM_PAGE_SHIFT)); /* Copy old Idt and set idtr */ - Amd64SetupIdt((PVOID)((ULONG64)GdtIdt + 2048)); // HACK! + Amd64SetupIdt((PVOID)((ULONG64)GdtIdt + NUM_GDT * sizeof(KGDTENTRY))); /* LDT is unused */ // __lldt(0); @@ -390,7 +392,7 @@ void WinLdrSetupMachineDependent(PLOADER_PARAMETER_BLOCK LoaderBlock) 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? + BlockSize = NUM_GDT * sizeof(KGDTENTRY) + NUM_IDT * sizeof(KIDTENTRY); NumPages = (BlockSize + MM_PAGE_SIZE - 1) >> MM_PAGE_SHIFT; GdtIdt = (PKGDTENTRY)MmAllocateMemoryWithType(NumPages * MM_PAGE_SIZE, LoaderMemoryData); if (GdtIdt == NULL) diff --git a/reactos/boot/freeldr/freeldr/debug.c b/reactos/boot/freeldr/freeldr/debug.c index 5ac8e10fbd0..e86060c73a2 100644 --- a/reactos/boot/freeldr/freeldr/debug.c +++ b/reactos/boot/freeldr/freeldr/debug.c @@ -24,6 +24,8 @@ #if DBG && !defined(_M_ARM) //#define DEBUG_ALL +//#define DEBUG_WARN +//#define DEBUG_ERR //#define DEBUG_INIFILE //#define DEBUG_REACTOS //#define DEBUG_CUSTOM @@ -49,7 +51,12 @@ ULONG DebugPort = RS232; //ULONG DebugPort = SCREEN; //ULONG DebugPort = BOCHS; //ULONG DebugPort = SCREEN|BOCHS; +#ifdef _WINKD_ +/* COM1 is the WinDbg port */ +ULONG ComPort = COM2; +#else ULONG ComPort = COM1; +#endif //ULONG BaudRate = 19200; ULONG BaudRate = 115200; @@ -59,6 +66,10 @@ VOID DebugInit(VOID) { #if defined (DEBUG_ALL) memset(DbgChannels, MAX_LEVEL, DBG_CHANNELS_COUNT); +#elif defined (DEBUG_WARN) + memset(DbgChannels, WARN_LEVEL|FIXME_LEVEL|ERR_LEVEL, DBG_CHANNELS_COUNT); +#elif defined (DEBUG_ERR) + memset(DbgChannels, ERR_LEVEL, DBG_CHANNELS_COUNT); #else memset(DbgChannels, 0, DBG_CHANNELS_COUNT); #endif diff --git a/reactos/boot/freeldr/freeldr/include/mm.h b/reactos/boot/freeldr/freeldr/include/mm.h index bc7687a71ca..4be199c0fe0 100644 --- a/reactos/boot/freeldr/freeldr/include/mm.h +++ b/reactos/boot/freeldr/freeldr/include/mm.h @@ -23,8 +23,13 @@ extern char __ImageBase; #ifdef __GNUC__ #define FREELDR_SECTION_COUNT 3 #else +#ifdef _M_AMD64 +/* .text and .pdata */ +#define FREELDR_SECTION_COUNT 2 +#else #define FREELDR_SECTION_COUNT 1 #endif +#endif typedef struct _FREELDR_MEMORY_DESCRIPTOR { diff --git a/reactos/boot/freeldr/freeldr/mm/meminit.c b/reactos/boot/freeldr/freeldr/mm/meminit.c index b9e8877c872..a36da8b42ca 100644 --- a/reactos/boot/freeldr/freeldr/mm/meminit.c +++ b/reactos/boot/freeldr/freeldr/mm/meminit.c @@ -174,7 +174,7 @@ MmCheckFreeldrImageFile() NtHeaders = RtlImageNtHeader(&__ImageBase); if (!NtHeaders) { - ERR("Coult not get NtHeaders!\n"); + ERR("Could not get NtHeaders!\n"); return FALSE; } @@ -184,8 +184,14 @@ MmCheckFreeldrImageFile() (FileHeader->NumberOfSections != FREELDR_SECTION_COUNT) || (FileHeader->PointerToSymbolTable != 0) || (FileHeader->NumberOfSymbols != 0) || - (FileHeader->SizeOfOptionalHeader != 0xE0)) + (FileHeader->SizeOfOptionalHeader != sizeof(IMAGE_OPTIONAL_HEADER))) { + ERR("FreeLdr FileHeader is invalid.\n"); + BugCheckInfo[0] = FileHeader->Machine; + BugCheckInfo[1] = FileHeader->NumberOfSections; + BugCheckInfo[2] = FileHeader->PointerToSymbolTable; + BugCheckInfo[3] = FileHeader->NumberOfSymbols; + BugCheckInfo[4] = FileHeader->SizeOfOptionalHeader; return FALSE; } @@ -197,6 +203,12 @@ MmCheckFreeldrImageFile() (OptionalHeader->SizeOfImage > MAX_FREELDR_PE_SIZE) || (OptionalHeader->SectionAlignment != OptionalHeader->FileAlignment)) { + ERR("FreeLdr OptionalHeader is invalid.\n"); + BugCheckInfo[0] = 0x80000000 | (OptionalHeader->Subsystem << 16) | OptionalHeader->Magic; + BugCheckInfo[1] = OptionalHeader->ImageBase; + BugCheckInfo[2] = OptionalHeader->SizeOfImage; + BugCheckInfo[3] = OptionalHeader->SectionAlignment; + BugCheckInfo[4] = OptionalHeader->FileAlignment; return FALSE; }