mirror of
https://github.com/reactos/reactos.git
synced 2025-07-05 11:31:20 +00:00
WINLDR: Move i386 specific code to its own file
svn path=/trunk/; revision=43261
This commit is contained in:
parent
aa4379b267
commit
7f2d93fde9
4 changed files with 97 additions and 71 deletions
|
@ -100,4 +100,12 @@
|
||||||
</if>
|
</if>
|
||||||
|
|
||||||
</directory>
|
</directory>
|
||||||
|
|
||||||
|
<directory name="windows">
|
||||||
|
<if property="ARCH" value="i386">
|
||||||
|
<directory name="i386">
|
||||||
|
<file>ntsetup.c</file>
|
||||||
|
</directory>
|
||||||
|
</if>
|
||||||
|
</directory>
|
||||||
</module>
|
</module>
|
||||||
|
|
83
reactos/boot/freeldr/freeldr/windows/i386/ntsetup.c
Normal file
83
reactos/boot/freeldr/freeldr/windows/i386/ntsetup.c
Normal file
|
@ -0,0 +1,83 @@
|
||||||
|
/*
|
||||||
|
* PROJECT: EFI Windows Loader
|
||||||
|
* LICENSE: GPL - See COPYING in the top level directory
|
||||||
|
* FILE: freeldr/windows/i386/ntsetup.c
|
||||||
|
* PURPOSE: i386-specific setup for Windows boot
|
||||||
|
* PROGRAMMERS: Aleksey Bragin (aleksey@reactos.org)
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* INCLUDES ***************************************************************/
|
||||||
|
|
||||||
|
#include <freeldr.h>
|
||||||
|
#include <debug.h>
|
||||||
|
|
||||||
|
// this is needed for new IDT filling
|
||||||
|
#if 0
|
||||||
|
extern ULONG_PTR i386DivideByZero;
|
||||||
|
extern ULONG_PTR i386DebugException;
|
||||||
|
extern ULONG_PTR i386NMIException;
|
||||||
|
extern ULONG_PTR i386Breakpoint;
|
||||||
|
extern ULONG_PTR i386Overflow;
|
||||||
|
extern ULONG_PTR i386BoundException;
|
||||||
|
extern ULONG_PTR i386InvalidOpcode;
|
||||||
|
extern ULONG_PTR i386FPUNotAvailable;
|
||||||
|
extern ULONG_PTR i386DoubleFault;
|
||||||
|
extern ULONG_PTR i386CoprocessorSegment;
|
||||||
|
extern ULONG_PTR i386InvalidTSS;
|
||||||
|
extern ULONG_PTR i386SegmentNotPresent;
|
||||||
|
extern ULONG_PTR i386StackException;
|
||||||
|
extern ULONG_PTR i386GeneralProtectionFault;
|
||||||
|
extern ULONG_PTR i386PageFault; // exc 14
|
||||||
|
extern ULONG_PTR i386CoprocessorError; // exc 16
|
||||||
|
extern ULONG_PTR i386AlignmentCheck; // exc 17
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* FUNCTIONS **************************************************************/
|
||||||
|
|
||||||
|
// Last step before going virtual
|
||||||
|
void WinLdrSetupForNt(PLOADER_PARAMETER_BLOCK LoaderBlock,
|
||||||
|
PVOID *GdtIdt,
|
||||||
|
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;
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
|
@ -24,6 +24,12 @@
|
||||||
#include <ndk/ldrtypes.h>
|
#include <ndk/ldrtypes.h>
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
|
|
||||||
|
// TODO: Move to .h
|
||||||
|
void WinLdrSetupForNt(PLOADER_PARAMETER_BLOCK LoaderBlock,
|
||||||
|
PVOID *GdtIdt,
|
||||||
|
ULONG *PcrBasePage,
|
||||||
|
ULONG *TssBasePage);
|
||||||
|
|
||||||
//FIXME: Do a better way to retrieve Arc disk information
|
//FIXME: Do a better way to retrieve Arc disk information
|
||||||
extern ULONG reactos_disk_count;
|
extern ULONG reactos_disk_count;
|
||||||
extern ARC_DISK_SIGNATURE reactos_arc_disk_info[];
|
extern ARC_DISK_SIGNATURE reactos_arc_disk_info[];
|
||||||
|
@ -91,8 +97,6 @@ WinLdrInitializePhase1(PLOADER_PARAMETER_BLOCK LoaderBlock,
|
||||||
ULONG i, PathSeparator;
|
ULONG i, PathSeparator;
|
||||||
PLOADER_PARAMETER_EXTENSION Extension;
|
PLOADER_PARAMETER_EXTENSION Extension;
|
||||||
|
|
||||||
LoaderBlock->u.I386.CommonDataArea = NULL; // Force No ABIOS support
|
|
||||||
|
|
||||||
/* Construct SystemRoot and ArcBoot from SystemPath */
|
/* Construct SystemRoot and ArcBoot from SystemPath */
|
||||||
PathSeparator = strstr(BootPath, "\\") - BootPath;
|
PathSeparator = strstr(BootPath, "\\") - BootPath;
|
||||||
strncpy(ArcBoot, BootPath, PathSeparator);
|
strncpy(ArcBoot, BootPath, PathSeparator);
|
||||||
|
@ -205,54 +209,6 @@ WinLdrInitializePhase1(PLOADER_PARAMETER_BLOCK LoaderBlock,
|
||||||
LoaderBlock->SetupLdrBlock = PaToVa(LoaderBlock->SetupLdrBlock);
|
LoaderBlock->SetupLdrBlock = PaToVa(LoaderBlock->SetupLdrBlock);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Last step before going virtual
|
|
||||||
void WinLdrSetupForNt(PLOADER_PARAMETER_BLOCK LoaderBlock,
|
|
||||||
PVOID *GdtIdt,
|
|
||||||
ULONG *PcrBasePage,
|
|
||||||
ULONG *TssBasePage)
|
|
||||||
{
|
|
||||||
ULONG TssSize;
|
|
||||||
ULONG TssPages;
|
|
||||||
ULONG_PTR Pcr = 0;
|
|
||||||
ULONG_PTR Tss = 0;
|
|
||||||
ULONG BlockSize, NumPages;
|
|
||||||
|
|
||||||
LoaderBlock->u.I386.CommonDataArea = NULL; //CommonDataArea;
|
|
||||||
LoaderBlock->u.I386.MachineType = 0; // ntldr sets this to 0
|
|
||||||
|
|
||||||
/* Allocate 2 pages for PCR */
|
|
||||||
Pcr = (ULONG_PTR)MmAllocateMemoryWithType(2 * MM_PAGE_SIZE, LoaderStartupPcrPage);
|
|
||||||
*PcrBasePage = Pcr >> MM_PAGE_SHIFT;
|
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
WinLdrLoadDeviceDriver(PLOADER_PARAMETER_BLOCK LoaderBlock,
|
WinLdrLoadDeviceDriver(PLOADER_PARAMETER_BLOCK LoaderBlock,
|
||||||
LPSTR BootPath,
|
LPSTR BootPath,
|
||||||
|
|
|
@ -77,27 +77,6 @@ WinLdrSetProcessorContext(PVOID GdtIdt, IN ULONG Pcr, IN ULONG Tss);
|
||||||
} GDTIDT;
|
} GDTIDT;
|
||||||
#pragma pack(4)
|
#pragma pack(4)
|
||||||
|
|
||||||
// this is needed for new IDT filling
|
|
||||||
#if 0
|
|
||||||
extern ULONG_PTR i386DivideByZero;
|
|
||||||
extern ULONG_PTR i386DebugException;
|
|
||||||
extern ULONG_PTR i386NMIException;
|
|
||||||
extern ULONG_PTR i386Breakpoint;
|
|
||||||
extern ULONG_PTR i386Overflow;
|
|
||||||
extern ULONG_PTR i386BoundException;
|
|
||||||
extern ULONG_PTR i386InvalidOpcode;
|
|
||||||
extern ULONG_PTR i386FPUNotAvailable;
|
|
||||||
extern ULONG_PTR i386DoubleFault;
|
|
||||||
extern ULONG_PTR i386CoprocessorSegment;
|
|
||||||
extern ULONG_PTR i386InvalidTSS;
|
|
||||||
extern ULONG_PTR i386SegmentNotPresent;
|
|
||||||
extern ULONG_PTR i386StackException;
|
|
||||||
extern ULONG_PTR i386GeneralProtectionFault;
|
|
||||||
extern ULONG_PTR i386PageFault; // exc 14
|
|
||||||
extern ULONG_PTR i386CoprocessorError; // exc 16
|
|
||||||
extern ULONG_PTR i386AlignmentCheck; // exc 17
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* GLOBALS ***************************************************************/
|
/* GLOBALS ***************************************************************/
|
||||||
|
|
||||||
PHARDWARE_PTE PDE;
|
PHARDWARE_PTE PDE;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue