mirror of
https://github.com/reactos/reactos.git
synced 2025-05-18 16:51:18 +00:00
[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:
parent
740d266240
commit
4e62a422f8
4 changed files with 40 additions and 10 deletions
|
@ -269,6 +269,7 @@ Amd64SetupGdt(PVOID GdtBase, ULONG64 TssBase)
|
||||||
{
|
{
|
||||||
PKGDTENTRY64 Entry;
|
PKGDTENTRY64 Entry;
|
||||||
KDESCRIPTOR GdtDesc;
|
KDESCRIPTOR GdtDesc;
|
||||||
|
TRACE("Amd64SetupGdt(GdtBase = %p, TssBase = %p)\n", GdtBase, TssBase);
|
||||||
|
|
||||||
/* Setup KGDT64_NULL */
|
/* Setup KGDT64_NULL */
|
||||||
Entry = KiGetGdtEntry(GdtBase, KGDT64_NULL);
|
Entry = KiGetGdtEntry(GdtBase, KGDT64_NULL);
|
||||||
|
@ -308,20 +309,22 @@ Amd64SetupGdt(PVOID GdtBase, ULONG64 TssBase)
|
||||||
|
|
||||||
/* Set the new Gdt */
|
/* Set the new Gdt */
|
||||||
__lgdt(&GdtDesc.Limit);
|
__lgdt(&GdtDesc.Limit);
|
||||||
TRACE("Gdtr.Base = %p, num = %ld\n", GdtDesc.Base, NUM_GDT);
|
TRACE("Leave Amd64SetupGdt()\n");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
Amd64SetupIdt(PVOID IdtBase)
|
Amd64SetupIdt(PVOID IdtBase)
|
||||||
{
|
{
|
||||||
KDESCRIPTOR IdtDesc, OldIdt;
|
KDESCRIPTOR IdtDesc, OldIdt;
|
||||||
|
ULONG Size;
|
||||||
|
TRACE("Amd64SetupIdt(IdtBase = %p)\n", IdtBase);
|
||||||
|
|
||||||
/* Get old IDT */
|
/* Get old IDT */
|
||||||
__sidt(&OldIdt);
|
__sidt(&OldIdt.Limit);
|
||||||
|
|
||||||
/* Copy the old IDT */
|
/* 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 */
|
/* Setup the new IDT descriptor */
|
||||||
IdtDesc.Base = IdtBase;
|
IdtDesc.Base = IdtBase;
|
||||||
|
@ -329,8 +332,7 @@ Amd64SetupIdt(PVOID IdtBase)
|
||||||
|
|
||||||
/* Set the new IDT */
|
/* Set the new IDT */
|
||||||
__lidt(&IdtDesc.Limit);
|
__lidt(&IdtDesc.Limit);
|
||||||
TRACE("Idtr.Base = %p\n", IdtDesc.Base);
|
TRACE("Leave Amd64SetupIdt()\n");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
|
@ -354,7 +356,7 @@ WinLdrSetProcessorContext(void)
|
||||||
Amd64SetupGdt(GdtIdt, KSEG0_BASE | (TssBasePage << MM_PAGE_SHIFT));
|
Amd64SetupGdt(GdtIdt, KSEG0_BASE | (TssBasePage << MM_PAGE_SHIFT));
|
||||||
|
|
||||||
/* Copy old Idt and set idtr */
|
/* Copy old Idt and set idtr */
|
||||||
Amd64SetupIdt((PVOID)((ULONG64)GdtIdt + 2048)); // HACK!
|
Amd64SetupIdt((PVOID)((ULONG64)GdtIdt + NUM_GDT * sizeof(KGDTENTRY)));
|
||||||
|
|
||||||
/* LDT is unused */
|
/* LDT is unused */
|
||||||
// __lldt(0);
|
// __lldt(0);
|
||||||
|
@ -390,7 +392,7 @@ void WinLdrSetupMachineDependent(PLOADER_PARAMETER_BLOCK LoaderBlock)
|
||||||
TssBasePage = Tss >> MM_PAGE_SHIFT;
|
TssBasePage = Tss >> MM_PAGE_SHIFT;
|
||||||
|
|
||||||
/* Allocate space for new GDT + IDT */
|
/* 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;
|
NumPages = (BlockSize + MM_PAGE_SIZE - 1) >> MM_PAGE_SHIFT;
|
||||||
GdtIdt = (PKGDTENTRY)MmAllocateMemoryWithType(NumPages * MM_PAGE_SIZE, LoaderMemoryData);
|
GdtIdt = (PKGDTENTRY)MmAllocateMemoryWithType(NumPages * MM_PAGE_SIZE, LoaderMemoryData);
|
||||||
if (GdtIdt == NULL)
|
if (GdtIdt == NULL)
|
||||||
|
|
|
@ -24,6 +24,8 @@
|
||||||
#if DBG && !defined(_M_ARM)
|
#if DBG && !defined(_M_ARM)
|
||||||
|
|
||||||
//#define DEBUG_ALL
|
//#define DEBUG_ALL
|
||||||
|
//#define DEBUG_WARN
|
||||||
|
//#define DEBUG_ERR
|
||||||
//#define DEBUG_INIFILE
|
//#define DEBUG_INIFILE
|
||||||
//#define DEBUG_REACTOS
|
//#define DEBUG_REACTOS
|
||||||
//#define DEBUG_CUSTOM
|
//#define DEBUG_CUSTOM
|
||||||
|
@ -49,7 +51,12 @@ ULONG DebugPort = RS232;
|
||||||
//ULONG DebugPort = SCREEN;
|
//ULONG DebugPort = SCREEN;
|
||||||
//ULONG DebugPort = BOCHS;
|
//ULONG DebugPort = BOCHS;
|
||||||
//ULONG DebugPort = SCREEN|BOCHS;
|
//ULONG DebugPort = SCREEN|BOCHS;
|
||||||
|
#ifdef _WINKD_
|
||||||
|
/* COM1 is the WinDbg port */
|
||||||
|
ULONG ComPort = COM2;
|
||||||
|
#else
|
||||||
ULONG ComPort = COM1;
|
ULONG ComPort = COM1;
|
||||||
|
#endif
|
||||||
//ULONG BaudRate = 19200;
|
//ULONG BaudRate = 19200;
|
||||||
ULONG BaudRate = 115200;
|
ULONG BaudRate = 115200;
|
||||||
|
|
||||||
|
@ -59,6 +66,10 @@ VOID DebugInit(VOID)
|
||||||
{
|
{
|
||||||
#if defined (DEBUG_ALL)
|
#if defined (DEBUG_ALL)
|
||||||
memset(DbgChannels, MAX_LEVEL, DBG_CHANNELS_COUNT);
|
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
|
#else
|
||||||
memset(DbgChannels, 0, DBG_CHANNELS_COUNT);
|
memset(DbgChannels, 0, DBG_CHANNELS_COUNT);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -23,8 +23,13 @@ extern char __ImageBase;
|
||||||
#ifdef __GNUC__
|
#ifdef __GNUC__
|
||||||
#define FREELDR_SECTION_COUNT 3
|
#define FREELDR_SECTION_COUNT 3
|
||||||
#else
|
#else
|
||||||
|
#ifdef _M_AMD64
|
||||||
|
/* .text and .pdata */
|
||||||
|
#define FREELDR_SECTION_COUNT 2
|
||||||
|
#else
|
||||||
#define FREELDR_SECTION_COUNT 1
|
#define FREELDR_SECTION_COUNT 1
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef struct _FREELDR_MEMORY_DESCRIPTOR
|
typedef struct _FREELDR_MEMORY_DESCRIPTOR
|
||||||
{
|
{
|
||||||
|
|
|
@ -174,7 +174,7 @@ MmCheckFreeldrImageFile()
|
||||||
NtHeaders = RtlImageNtHeader(&__ImageBase);
|
NtHeaders = RtlImageNtHeader(&__ImageBase);
|
||||||
if (!NtHeaders)
|
if (!NtHeaders)
|
||||||
{
|
{
|
||||||
ERR("Coult not get NtHeaders!\n");
|
ERR("Could not get NtHeaders!\n");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -184,8 +184,14 @@ MmCheckFreeldrImageFile()
|
||||||
(FileHeader->NumberOfSections != FREELDR_SECTION_COUNT) ||
|
(FileHeader->NumberOfSections != FREELDR_SECTION_COUNT) ||
|
||||||
(FileHeader->PointerToSymbolTable != 0) ||
|
(FileHeader->PointerToSymbolTable != 0) ||
|
||||||
(FileHeader->NumberOfSymbols != 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;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -197,6 +203,12 @@ MmCheckFreeldrImageFile()
|
||||||
(OptionalHeader->SizeOfImage > MAX_FREELDR_PE_SIZE) ||
|
(OptionalHeader->SizeOfImage > MAX_FREELDR_PE_SIZE) ||
|
||||||
(OptionalHeader->SectionAlignment != OptionalHeader->FileAlignment))
|
(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;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue