[FREELDR]

- Set bugcheck data when the image is corrupt
- Add 2 more useful debug constants: DEBUG_WARN and DEBUG_ERR
- Use COM2 for debug output when _WINKD_ is defined
- Fix amd64 boot

svn path=/trunk/; revision=58606
This commit is contained in:
Timo Kreuzer 2013-03-24 17:09:03 +00:00
parent 740d266240
commit 4e62a422f8
4 changed files with 40 additions and 10 deletions

View file

@ -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)

View file

@ -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

View file

@ -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
{

View file

@ -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;
}