mirror of
https://github.com/reactos/reactos.git
synced 2025-02-24 01:15:09 +00:00
[FREELDR]
- Don't prefix amd64 symbol names with underscores - Cleanup unused amd64 functions - Fix amd64 GDT entries - Fix amd64 APIC_BASE svn path=/trunk/; revision=46856
This commit is contained in:
parent
31515fdd20
commit
de40f8d7d7
11 changed files with 89 additions and 330 deletions
|
@ -21,22 +21,22 @@ RealEntryPoint:
|
||||||
mov ss, ax
|
mov ss, ax
|
||||||
|
|
||||||
/* checkPoint Charlie - where it all began... */
|
/* checkPoint Charlie - where it all began... */
|
||||||
mov si, offset _CheckPoint0
|
mov si, offset CheckPoint0
|
||||||
call writestr
|
call writestr
|
||||||
|
|
||||||
/* Setup a real mode stack */
|
/* Setup a real mode stack */
|
||||||
mov sp, stack16
|
mov sp, stack16
|
||||||
|
|
||||||
/* Zero BootDrive and BootPartition */
|
/* Zero BootDrive and BootPartition */
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
mov _BootDrive, eax
|
mov BootDrive, eax
|
||||||
mov _BootPartition, eax
|
mov BootPartition, eax
|
||||||
|
|
||||||
/* Store the boot drive */
|
/* Store the boot drive */
|
||||||
mov _BootDrive, dl
|
mov BootDrive, dl
|
||||||
|
|
||||||
/* Store the boot partition */
|
/* Store the boot partition */
|
||||||
mov _BootPartition, dh
|
mov BootPartition, dh
|
||||||
|
|
||||||
/* Load the GDT */
|
/* Load the GDT */
|
||||||
lgdt gdtptr
|
lgdt gdtptr
|
||||||
|
@ -46,13 +46,13 @@ RealEntryPoint:
|
||||||
call x86_16_EnableA20
|
call x86_16_EnableA20
|
||||||
|
|
||||||
/* checkPoint Charlie - where it all began... */
|
/* checkPoint Charlie - where it all began... */
|
||||||
mov si, offset _CheckPoint1
|
mov si, offset CheckPoint1
|
||||||
call writestr
|
call writestr
|
||||||
|
|
||||||
call x86_16_BuildPageTables
|
call x86_16_BuildPageTables
|
||||||
|
|
||||||
/* checkPoint Charlie - where it all began... */
|
/* checkPoint Charlie - where it all began... */
|
||||||
mov si, offset _CheckPoint2
|
mov si, offset CheckPoint2
|
||||||
call writestr
|
call writestr
|
||||||
|
|
||||||
/* Check if CPU supports CPUID */
|
/* Check if CPU supports CPUID */
|
||||||
|
@ -89,26 +89,26 @@ RealEntryPoint:
|
||||||
/* X64 Processor */
|
/* X64 Processor */
|
||||||
|
|
||||||
/* checkPoint Charlie - where it all began... */
|
/* checkPoint Charlie - where it all began... */
|
||||||
mov si, offset _CheckPoint3
|
mov si, offset CheckPoint3
|
||||||
call writestr
|
call writestr
|
||||||
|
|
||||||
jmp _switch64
|
jmp switch64
|
||||||
|
|
||||||
NO_X64_SUPPORT_DETECTED:
|
NO_X64_SUPPORT_DETECTED:
|
||||||
mov si, offset _NotAnX64Processor // Loading message
|
mov si, offset NotAnX64Processor // Loading message
|
||||||
call writestr
|
call writestr
|
||||||
jmp _fail
|
jmp fail
|
||||||
|
|
||||||
NO_CPUID_SUPPORT_DETECTED:
|
NO_CPUID_SUPPORT_DETECTED:
|
||||||
mov si, offset _NoCPUIDSupport // Loading message
|
mov si, offset NoCPUIDSupport // Loading message
|
||||||
call writestr
|
call writestr
|
||||||
|
|
||||||
_fail:
|
fail:
|
||||||
jmp _fail
|
jmp fail
|
||||||
nop
|
nop
|
||||||
nop
|
nop
|
||||||
|
|
||||||
_switch64:
|
switch64:
|
||||||
call x86_16_SwitchToLong
|
call x86_16_SwitchToLong
|
||||||
|
|
||||||
.code64
|
.code64
|
||||||
|
@ -119,7 +119,7 @@ _switch64:
|
||||||
|
|
||||||
/* GO! */
|
/* GO! */
|
||||||
xor rcx, rcx
|
xor rcx, rcx
|
||||||
call _BootMain
|
call BootMain
|
||||||
|
|
||||||
/* Checkpoint */
|
/* Checkpoint */
|
||||||
// mov ax, LMODE_DS
|
// mov ax, LMODE_DS
|
||||||
|
@ -174,14 +174,14 @@ x86_16_BuildPageTables:
|
||||||
push es
|
push es
|
||||||
|
|
||||||
/* Get segment of pml4 */
|
/* Get segment of pml4 */
|
||||||
mov eax, offset _pml4_startup
|
mov eax, offset pml4_startup
|
||||||
shr eax, 4
|
shr eax, 4
|
||||||
mov es, ax
|
mov es, ax
|
||||||
cld
|
cld
|
||||||
xor di, di
|
xor di, di
|
||||||
|
|
||||||
/* One entry in the PML4 pointing to PDP */
|
/* One entry in the PML4 pointing to PDP */
|
||||||
mov eax, offset _pdp_startup
|
mov eax, offset pdp_startup
|
||||||
or eax, 0x00f
|
or eax, 0x00f
|
||||||
stosd
|
stosd
|
||||||
/* clear rest */
|
/* clear rest */
|
||||||
|
@ -190,7 +190,7 @@ x86_16_BuildPageTables:
|
||||||
rep stosd
|
rep stosd
|
||||||
|
|
||||||
/* One entry in the PDP pointing to PD */
|
/* One entry in the PDP pointing to PD */
|
||||||
mov eax, offset _pd_startup
|
mov eax, offset pd_startup
|
||||||
or eax, 0x00f
|
or eax, 0x00f
|
||||||
stosd
|
stosd
|
||||||
/* clear rest */
|
/* clear rest */
|
||||||
|
@ -268,7 +268,7 @@ x86_16_SwitchToLong:
|
||||||
mov eax, 0x00a0 // Set PAE and PGE: 10100000b
|
mov eax, 0x00a0 // Set PAE and PGE: 10100000b
|
||||||
mov cr4, eax
|
mov cr4, eax
|
||||||
|
|
||||||
mov edx, offset _pml4_startup // Point cr3 at PML4
|
mov edx, offset pml4_startup // Point cr3 at PML4
|
||||||
mov cr3, edx
|
mov cr3, edx
|
||||||
|
|
||||||
mov ecx, 0xC0000080 // Specify EFER MSR
|
mov ecx, 0xC0000080 // Specify EFER MSR
|
||||||
|
@ -405,42 +405,42 @@ gdtptr:
|
||||||
.long gdt /* Base Address */
|
.long gdt /* Base Address */
|
||||||
|
|
||||||
|
|
||||||
.global _BootDrive
|
.global BootDrive
|
||||||
_BootDrive:
|
BootDrive:
|
||||||
.long 0
|
.long 0
|
||||||
|
|
||||||
.global _BootPartition
|
.global BootPartition
|
||||||
_BootPartition:
|
BootPartition:
|
||||||
.long 0
|
.long 0
|
||||||
|
|
||||||
.global _NotAnX64Processor
|
.global NotAnX64Processor
|
||||||
_NotAnX64Processor:
|
NotAnX64Processor:
|
||||||
.ascii "FreeLoader: No x64-compatible CPU detected! Exiting..."
|
.ascii "FreeLoader: No x64-compatible CPU detected! Exiting..."
|
||||||
.byte 0x0d, 0x0a, 0
|
.byte 0x0d, 0x0a, 0
|
||||||
|
|
||||||
.global _NoCPUIDSupport
|
.global NoCPUIDSupport
|
||||||
_NoCPUIDSupport:
|
NoCPUIDSupport:
|
||||||
.ascii "FreeLoader: No CPUID instruction support detected! Exiting..."
|
.ascii "FreeLoader: No CPUID instruction support detected! Exiting..."
|
||||||
.byte 0x0d, 0x0a, 0
|
.byte 0x0d, 0x0a, 0
|
||||||
|
|
||||||
/////////////////////////// Checkpoint messages ///////////////////////////////
|
/////////////////////////// Checkpoint messages ///////////////////////////////
|
||||||
.global _CheckPoint0
|
.global CheckPoint0
|
||||||
_CheckPoint0:
|
CheckPoint0:
|
||||||
.ascii "Starting FreeLoader..."
|
.ascii "Starting FreeLoader..."
|
||||||
.byte 0x0d, 0x0a, 0
|
.byte 0x0d, 0x0a, 0
|
||||||
|
|
||||||
.global _CheckPoint1
|
.global CheckPoint1
|
||||||
_CheckPoint1:
|
CheckPoint1:
|
||||||
.ascii "FreeLoader[16-bit]: building page tables..."
|
.ascii "FreeLoader[16-bit]: building page tables..."
|
||||||
.byte 0x0d, 0x0a, 0
|
.byte 0x0d, 0x0a, 0
|
||||||
|
|
||||||
.global _CheckPoint2
|
.global CheckPoint2
|
||||||
_CheckPoint2:
|
CheckPoint2:
|
||||||
.ascii "FreeLoader[16-bit]: checking CPU for x64 long mode..."
|
.ascii "FreeLoader[16-bit]: checking CPU for x64 long mode..."
|
||||||
.byte 0x0d, 0x0a, 0
|
.byte 0x0d, 0x0a, 0
|
||||||
|
|
||||||
.global _CheckPoint3
|
.global CheckPoint3
|
||||||
_CheckPoint3:
|
CheckPoint3:
|
||||||
.ascii "FreeLoader: Switching to x64 long mode..."
|
.ascii "FreeLoader: Switching to x64 long mode..."
|
||||||
.byte 0x0d, 0x0a, 0
|
.byte 0x0d, 0x0a, 0
|
||||||
|
|
||||||
|
|
|
@ -24,14 +24,14 @@
|
||||||
#include <arch.h>
|
#include <arch.h>
|
||||||
|
|
||||||
|
|
||||||
EXTERN(_ChainLoadBiosBootSectorCode)
|
EXTERN(ChainLoadBiosBootSectorCode)
|
||||||
.code64
|
.code64
|
||||||
|
|
||||||
call x86_64_SwitchToReal
|
call x86_64_SwitchToReal
|
||||||
.code16
|
.code16
|
||||||
|
|
||||||
/* Set the boot drive */
|
/* Set the boot drive */
|
||||||
mov dl, _BootDrive
|
mov dl, BootDrive
|
||||||
|
|
||||||
/* Load segment registers */
|
/* Load segment registers */
|
||||||
cli
|
cli
|
||||||
|
@ -46,7 +46,7 @@ EXTERN(_ChainLoadBiosBootSectorCode)
|
||||||
// ljmpl $0x0000,$0x7C00
|
// ljmpl $0x0000,$0x7C00
|
||||||
jmp 0x7c00:0x0000
|
jmp 0x7c00:0x0000
|
||||||
|
|
||||||
EXTERN(_SoftReboot)
|
EXTERN(SoftReboot)
|
||||||
.code64
|
.code64
|
||||||
|
|
||||||
call x86_64_SwitchToReal
|
call x86_64_SwitchToReal
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
#include <arch.h>
|
#include <arch.h>
|
||||||
|
|
||||||
|
|
||||||
EXTERN(_DriveMapInt13HandlerStart)
|
EXTERN(DriveMapInt13HandlerStart)
|
||||||
Int13Handler:
|
Int13Handler:
|
||||||
|
|
||||||
pushw %bp
|
pushw %bp
|
||||||
|
@ -82,7 +82,7 @@ CallOldInt13Handler:
|
||||||
|
|
||||||
/* Call old int 13h handler with new drive number */
|
/* Call old int 13h handler with new drive number */
|
||||||
.byte 0x9a /* lcall */
|
.byte 0x9a /* lcall */
|
||||||
EXTERN(_DriveMapOldInt13HandlerAddress)
|
EXTERN(DriveMapOldInt13HandlerAddress)
|
||||||
.word 0
|
.word 0
|
||||||
.word 0
|
.word 0
|
||||||
|
|
||||||
|
@ -105,7 +105,7 @@ CallersFlags:
|
||||||
PassedInDriveNumber:
|
PassedInDriveNumber:
|
||||||
.byte 0
|
.byte 0
|
||||||
|
|
||||||
EXTERN(_DriveMapInt13HandlerMapList)
|
EXTERN(DriveMapInt13HandlerMapList)
|
||||||
Int13HandlerMapCount:
|
Int13HandlerMapCount:
|
||||||
.byte 0
|
.byte 0
|
||||||
|
|
||||||
|
@ -129,4 +129,4 @@ Int13HandlerDrive4:
|
||||||
Int13HandlerDriveNew4:
|
Int13HandlerDriveNew4:
|
||||||
.byte 0
|
.byte 0
|
||||||
|
|
||||||
EXTERN(_DriveMapInt13HandlerEnd)
|
EXTERN(DriveMapInt13HandlerEnd)
|
||||||
|
|
|
@ -33,7 +33,7 @@
|
||||||
* 0x00000400: Found 80486 CPU without CPUID support
|
* 0x00000400: Found 80486 CPU without CPUID support
|
||||||
*/
|
*/
|
||||||
|
|
||||||
EXTERN(_CpuidSupported)
|
EXTERN(CpuidSupported)
|
||||||
.code32
|
.code32
|
||||||
|
|
||||||
pushl %ecx /* save ECX */
|
pushl %ecx /* save ECX */
|
||||||
|
@ -80,7 +80,7 @@ NoCpuid:
|
||||||
* VOID GetCpuid(U32 Level, U32 *eax, U32 *ebx, U32 *ecx, U32 *edx);
|
* VOID GetCpuid(U32 Level, U32 *eax, U32 *ebx, U32 *ecx, U32 *edx);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
EXTERN(_GetCpuid)
|
EXTERN(GetCpuid)
|
||||||
.code32
|
.code32
|
||||||
|
|
||||||
pushl %ebp
|
pushl %ebp
|
||||||
|
@ -123,7 +123,7 @@ EXTERN(_GetCpuid)
|
||||||
* U64 RDTSC(VOID);
|
* U64 RDTSC(VOID);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
EXTERN(_RDTSC)
|
EXTERN(RDTSC)
|
||||||
.code32
|
.code32
|
||||||
rdtsc
|
rdtsc
|
||||||
ret
|
ret
|
||||||
|
|
|
@ -35,7 +35,7 @@ _pnp_bios_entry_point:
|
||||||
_pnp_bios_data_segment:
|
_pnp_bios_data_segment:
|
||||||
.word 0
|
.word 0
|
||||||
|
|
||||||
EXTERN(_PnpBiosSupported)
|
EXTERN(PnpBiosSupported)
|
||||||
.code64
|
.code64
|
||||||
|
|
||||||
push rdi
|
push rdi
|
||||||
|
@ -113,7 +113,7 @@ _pnp_node_size:
|
||||||
_pnp_node_count:
|
_pnp_node_count:
|
||||||
.word 0
|
.word 0
|
||||||
|
|
||||||
EXTERN(_PnpBiosGetDeviceNodeCount)
|
EXTERN(PnpBiosGetDeviceNodeCount)
|
||||||
.code64
|
.code64
|
||||||
|
|
||||||
push rbp
|
push rbp
|
||||||
|
@ -182,7 +182,7 @@ _pnp_buffer_offset:
|
||||||
_pnp_node_number:
|
_pnp_node_number:
|
||||||
.byte 0
|
.byte 0
|
||||||
|
|
||||||
EXTERN(_PnpBiosGetDeviceNode)
|
EXTERN(PnpBiosGetDeviceNode)
|
||||||
.code64
|
.code64
|
||||||
|
|
||||||
push rbp
|
push rbp
|
||||||
|
|
|
@ -273,7 +273,7 @@ i386CommonExceptionHandler:
|
||||||
SAVE_CPU_REGS
|
SAVE_CPU_REGS
|
||||||
|
|
||||||
pushl $SCREEN_ATTR
|
pushl $SCREEN_ATTR
|
||||||
call _MachVideoClearScreen
|
call MachVideoClearScreen
|
||||||
add $4,%esp
|
add $4,%esp
|
||||||
|
|
||||||
movl $i386ExceptionHandlerText,%esi
|
movl $i386ExceptionHandlerText,%esi
|
||||||
|
@ -485,7 +485,7 @@ i386PrintChar:
|
||||||
pushl $SCREEN_ATTR
|
pushl $SCREEN_ATTR
|
||||||
andl $0xff,%eax
|
andl $0xff,%eax
|
||||||
pushl %eax
|
pushl %eax
|
||||||
call _MachVideoPutChar
|
call MachVideoPutChar
|
||||||
addl $16,%esp
|
addl $16,%esp
|
||||||
|
|
||||||
ret
|
ret
|
||||||
|
|
|
@ -63,7 +63,7 @@ Int386_regsout:
|
||||||
/*
|
/*
|
||||||
* int Int386(int ivec, REGS* in, REGS* out);
|
* int Int386(int ivec, REGS* in, REGS* out);
|
||||||
*/
|
*/
|
||||||
EXTERN(_Int386)
|
EXTERN(Int386)
|
||||||
.code64
|
.code64
|
||||||
|
|
||||||
/* Get the function parameters */
|
/* Get the function parameters */
|
||||||
|
|
|
@ -39,33 +39,6 @@ EnableA20()
|
||||||
/* Already done */
|
/* Already done */
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
DumpLoaderBlock()
|
|
||||||
{
|
|
||||||
DbgPrint("LoaderBlock @ %p.\n", &LoaderBlock);
|
|
||||||
DbgPrint("Flags = 0x%x.\n", LoaderBlock.Flags);
|
|
||||||
DbgPrint("MemLower = 0x%p.\n", (PVOID)LoaderBlock.MemLower);
|
|
||||||
DbgPrint("MemHigher = 0x%p.\n", (PVOID)LoaderBlock.MemHigher);
|
|
||||||
DbgPrint("BootDevice = 0x%x.\n", LoaderBlock.BootDevice);
|
|
||||||
DbgPrint("CommandLine = %s.\n", LoaderBlock.CommandLine);
|
|
||||||
DbgPrint("ModsCount = 0x%x.\n", LoaderBlock.ModsCount);
|
|
||||||
DbgPrint("ModsAddr = 0x%p.\n", LoaderBlock.ModsAddr);
|
|
||||||
DbgPrint("Syms = 0x%s.\n", LoaderBlock.Syms);
|
|
||||||
DbgPrint("MmapLength = 0x%x.\n", LoaderBlock.MmapLength);
|
|
||||||
DbgPrint("MmapAddr = 0x%p.\n", (PVOID)LoaderBlock.MmapAddr);
|
|
||||||
DbgPrint("RdLength = 0x%x.\n", LoaderBlock.RdLength);
|
|
||||||
DbgPrint("RdAddr = 0x%p.\n", (PVOID)LoaderBlock.RdAddr);
|
|
||||||
DbgPrint("DrivesCount = 0x%x.\n", LoaderBlock.DrivesCount);
|
|
||||||
DbgPrint("DrivesAddr = 0x%p.\n", (PVOID)LoaderBlock.DrivesAddr);
|
|
||||||
DbgPrint("ConfigTable = 0x%x.\n", LoaderBlock.ConfigTable);
|
|
||||||
DbgPrint("BootLoaderName = 0x%x.\n", LoaderBlock.BootLoaderName);
|
|
||||||
DbgPrint("PageDirectoryStart = 0x%p.\n", (PVOID)LoaderBlock.PageDirectoryStart);
|
|
||||||
DbgPrint("PageDirectoryEnd = 0x%p.\n", (PVOID)LoaderBlock.PageDirectoryEnd);
|
|
||||||
DbgPrint("KernelBase = 0x%p.\n", (PVOID)LoaderBlock.KernelBase);
|
|
||||||
DbgPrint("ArchExtra = 0x%p.\n", (PVOID)LoaderBlock.ArchExtra);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
* FrLdrStartup
|
* FrLdrStartup
|
||||||
* INTERNAL
|
* INTERNAL
|
||||||
|
@ -86,222 +59,7 @@ VOID
|
||||||
NTAPI
|
NTAPI
|
||||||
FrLdrStartup(ULONG Magic)
|
FrLdrStartup(ULONG Magic)
|
||||||
{
|
{
|
||||||
/* Disable Interrupts */
|
DbgPrint("ReactOS loader is unsupported! Halting.\n", KernelEntryPoint);
|
||||||
_disable();
|
for(;;);
|
||||||
|
|
||||||
/* Re-initalize EFLAGS */
|
|
||||||
__writeeflags(0);
|
|
||||||
|
|
||||||
/* Initialize the page directory */
|
|
||||||
FrLdrSetupPageDirectory();
|
|
||||||
|
|
||||||
/* Set the new PML4 */
|
|
||||||
__writecr3((ULONGLONG)pPML4);
|
|
||||||
|
|
||||||
FrLdrSetupGdtIdt();
|
|
||||||
|
|
||||||
LoaderBlock.FrLdrDbgPrint = DbgPrint;
|
|
||||||
|
|
||||||
// DumpLoaderBlock();
|
|
||||||
|
|
||||||
DbgPrint("Jumping to kernel @ %p.\n", KernelEntryPoint);
|
|
||||||
|
|
||||||
/* Jump to Kernel */
|
|
||||||
(*KernelEntryPoint)(Magic, &LoaderBlock);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
PPAGE_DIRECTORY_AMD64
|
|
||||||
FrLdrGetOrCreatePageDir(PPAGE_DIRECTORY_AMD64 pDir, ULONG Index)
|
|
||||||
{
|
|
||||||
PPAGE_DIRECTORY_AMD64 pSubDir;
|
|
||||||
|
|
||||||
if (!pDir)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
if (!pDir->Pde[Index].Valid)
|
|
||||||
{
|
|
||||||
pSubDir = MmAllocateMemoryWithType(PAGE_SIZE, LoaderSpecialMemory);
|
|
||||||
if (!pSubDir)
|
|
||||||
return NULL;
|
|
||||||
RtlZeroMemory(pSubDir, PAGE_SIZE);
|
|
||||||
pDir->Pde[Index].PageFrameNumber = PtrToPfn(pSubDir);
|
|
||||||
pDir->Pde[Index].Valid = 1;
|
|
||||||
pDir->Pde[Index].Write = 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
pSubDir = (PPAGE_DIRECTORY_AMD64)((ULONGLONG)(pDir->Pde[Index].PageFrameNumber) * PAGE_SIZE);
|
|
||||||
}
|
|
||||||
return pSubDir;
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOLEAN
|
|
||||||
FrLdrMapSinglePage(ULONGLONG VirtualAddress, ULONGLONG PhysicalAddress)
|
|
||||||
{
|
|
||||||
PPAGE_DIRECTORY_AMD64 pDir3, pDir2, pDir1;
|
|
||||||
ULONG Index;
|
|
||||||
|
|
||||||
pDir3 = FrLdrGetOrCreatePageDir(pPML4, VAtoPXI(VirtualAddress));
|
|
||||||
pDir2 = FrLdrGetOrCreatePageDir(pDir3, VAtoPPI(VirtualAddress));
|
|
||||||
pDir1 = FrLdrGetOrCreatePageDir(pDir2, VAtoPDI(VirtualAddress));
|
|
||||||
|
|
||||||
if (!pDir1)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
Index = VAtoPTI(VirtualAddress);
|
|
||||||
if (pDir1->Pde[Index].Valid)
|
|
||||||
{
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
pDir1->Pde[Index].Valid = 1;
|
|
||||||
pDir1->Pde[Index].Write = 1;
|
|
||||||
pDir1->Pde[Index].PageFrameNumber = PhysicalAddress / PAGE_SIZE;
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
ULONG
|
|
||||||
FrLdrMapRangeOfPages(ULONGLONG VirtualAddress, ULONGLONG PhysicalAddress, ULONG cPages)
|
|
||||||
{
|
|
||||||
ULONG i;
|
|
||||||
|
|
||||||
for (i = 0; i < cPages; i++)
|
|
||||||
{
|
|
||||||
if (!FrLdrMapSinglePage(VirtualAddress, PhysicalAddress))
|
|
||||||
{
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
VirtualAddress += PAGE_SIZE;
|
|
||||||
PhysicalAddress += PAGE_SIZE;
|
|
||||||
}
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*++
|
|
||||||
* FrLdrSetupPageDirectory
|
|
||||||
* INTERNAL
|
|
||||||
*
|
|
||||||
* Sets up the ReactOS Startup Page Directory.
|
|
||||||
*
|
|
||||||
* Params:
|
|
||||||
* None.
|
|
||||||
*
|
|
||||||
* Returns:
|
|
||||||
* None.
|
|
||||||
*--*/
|
|
||||||
VOID
|
|
||||||
FASTCALL
|
|
||||||
FrLdrSetupPageDirectory(VOID)
|
|
||||||
{
|
|
||||||
ULONG KernelPages;
|
|
||||||
PVOID UserSharedData;
|
|
||||||
|
|
||||||
/* Allocate a Page for the PML4 */
|
|
||||||
pPML4 = MmAllocateMemoryWithType(PAGE_SIZE, LoaderSpecialMemory);
|
|
||||||
|
|
||||||
ASSERT(pPML4);
|
|
||||||
|
|
||||||
/* The page tables are located at 0xfffff68000000000
|
|
||||||
* We create a recursive self mapping through all 4 levels at
|
|
||||||
* virtual address 0xfffff6fb7dbedf68 */
|
|
||||||
pPML4->Pde[VAtoPXI(PXE_BASE)].Valid = 1;
|
|
||||||
pPML4->Pde[VAtoPXI(PXE_BASE)].Write = 1;
|
|
||||||
pPML4->Pde[VAtoPXI(PXE_BASE)].PageFrameNumber = PtrToPfn(pPML4);
|
|
||||||
|
|
||||||
/* Setup low memory pages */
|
|
||||||
if (FrLdrMapRangeOfPages(0, 0, 1024) < 1024)
|
|
||||||
{
|
|
||||||
DbgPrint("Could not map low memory pages.\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Setup kernel pages */
|
|
||||||
KernelPages = (ROUND_TO_PAGES(NextModuleBase - KERNEL_BASE_PHYS) / PAGE_SIZE);
|
|
||||||
if (FrLdrMapRangeOfPages(KernelBase, KERNEL_BASE_PHYS, KernelPages) != KernelPages)
|
|
||||||
{
|
|
||||||
DbgPrint("Could not map %d kernel pages.\n", KernelPages);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Setup a page for the idt */
|
|
||||||
pIdt = MmAllocateMemoryWithType(PAGE_SIZE, LoaderSpecialMemory);
|
|
||||||
IdtBase = KernelBase + KernelPages * PAGE_SIZE;
|
|
||||||
if (!FrLdrMapSinglePage(IdtBase, (ULONGLONG)pIdt))
|
|
||||||
{
|
|
||||||
DbgPrint("Could not map idt page.\n", KernelPages);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Setup a page for the gdt & tss */
|
|
||||||
pGdt = MmAllocateMemoryWithType(PAGE_SIZE, LoaderSpecialMemory);
|
|
||||||
GdtBase = IdtBase + PAGE_SIZE;
|
|
||||||
TssBase = GdtBase + 20 * sizeof(ULONG64); // FIXME: don't hardcode
|
|
||||||
if (!FrLdrMapSinglePage(GdtBase, (ULONGLONG)pGdt))
|
|
||||||
{
|
|
||||||
DbgPrint("Could not map gdt page.\n", KernelPages);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Setup KUSER_SHARED_DATA page */
|
|
||||||
UserSharedData = MmAllocateMemoryWithType(PAGE_SIZE, LoaderSpecialMemory);
|
|
||||||
if (!FrLdrMapSinglePage(KI_USER_SHARED_DATA, (ULONG64)UserSharedData))
|
|
||||||
{
|
|
||||||
DbgPrint("Could not map KUSER_SHARED_DATA page.\n", KernelPages);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Map APIC page */
|
|
||||||
if (!FrLdrMapSinglePage(APIC_BASE, APIC_PHYS_BASE))
|
|
||||||
{
|
|
||||||
DbgPrint("Could not map APIC page.\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
VOID
|
|
||||||
FrLdrSetupGdtIdt()
|
|
||||||
{
|
|
||||||
PKGDTENTRY64 Entry;
|
|
||||||
KDESCRIPTOR Desc;
|
|
||||||
|
|
||||||
RtlZeroMemory(pGdt, PAGE_SIZE);
|
|
||||||
|
|
||||||
/* Setup KGDT_64_R0_CODE */
|
|
||||||
Entry = KiGetGdtEntry(pGdt, KGDT_64_R0_CODE);
|
|
||||||
*(PULONG64)Entry = 0x00209b0000000000ULL;
|
|
||||||
|
|
||||||
/* Setup KGDT_64_R0_SS */
|
|
||||||
Entry = KiGetGdtEntry(pGdt, KGDT_64_R0_SS);
|
|
||||||
*(PULONG64)Entry = 0x00cf93000000ffffULL;
|
|
||||||
|
|
||||||
/* Setup KGDT_64_DATA */
|
|
||||||
Entry = KiGetGdtEntry(pGdt, KGDT_64_DATA);
|
|
||||||
*(PULONG64)Entry = 0x00cff3000000ffffULL;
|
|
||||||
|
|
||||||
/* Setup KGDT_64_R3_CODE */
|
|
||||||
Entry = KiGetGdtEntry(pGdt, KGDT_64_R3_CODE);
|
|
||||||
*(PULONG64)Entry = 0x0020fb0000000000ULL;
|
|
||||||
|
|
||||||
/* Setup KGDT_32_R3_TEB */
|
|
||||||
Entry = KiGetGdtEntry(pGdt, KGDT_32_R3_TEB);
|
|
||||||
*(PULONG64)Entry = 0xff40f3fd50003c00ULL;
|
|
||||||
|
|
||||||
/* Setup TSS entry */
|
|
||||||
Entry = KiGetGdtEntry(pGdt, KGDT_TSS);
|
|
||||||
KiInitGdtEntry(Entry, TssBase, sizeof(KTSS), I386_TSS, 0);
|
|
||||||
|
|
||||||
/* Setup the gdt descriptor */
|
|
||||||
Desc.Limit = 12 * sizeof(ULONG64) - 1;
|
|
||||||
Desc.Base = (PVOID)GdtBase;
|
|
||||||
|
|
||||||
/* Set the new Gdt */
|
|
||||||
__lgdt(&Desc.Limit);
|
|
||||||
DbgPrint("Gdtr.Base = %p\n", Desc.Base);
|
|
||||||
|
|
||||||
/* Setup the idt descriptor */
|
|
||||||
Desc.Limit = 12 * sizeof(ULONG64) - 1;
|
|
||||||
Desc.Base = (PVOID)IdtBase;
|
|
||||||
|
|
||||||
/* Set the new Idt */
|
|
||||||
__lidt(&Desc.Limit);
|
|
||||||
DbgPrint("Idtr.Base = %p\n", Desc.Base);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -29,35 +29,35 @@
|
||||||
* This boots the kernel
|
* This boots the kernel
|
||||||
*/
|
*/
|
||||||
.code64
|
.code64
|
||||||
.globl _PageDirectoryStart
|
.globl PageDirectoryStart
|
||||||
|
|
||||||
.globl _pml4_startup
|
.globl pml4_startup
|
||||||
.globl _pdp_startup
|
.globl pdp_startup
|
||||||
.globl _pd_startup
|
.globl pd_startup
|
||||||
|
|
||||||
.globl _PageDirectoryEnd
|
.globl PageDirectoryEnd
|
||||||
|
|
||||||
//
|
//
|
||||||
// Boot information structure
|
// Boot information structure
|
||||||
//
|
//
|
||||||
|
|
||||||
EXTERN(_reactos_memory_map_descriptor_size)
|
EXTERN(reactos_memory_map_descriptor_size)
|
||||||
.long 0
|
.long 0
|
||||||
|
|
||||||
EXTERN(_reactos_memory_map)
|
EXTERN(reactos_memory_map)
|
||||||
.rept (32 * /*sizeof(memory_map_t)*/24)
|
.rept (32 * /*sizeof(memory_map_t)*/24)
|
||||||
.byte 0
|
.byte 0
|
||||||
.endr
|
.endr
|
||||||
|
|
||||||
.bss
|
.bss
|
||||||
_PageDirectoryStart:
|
PageDirectoryStart:
|
||||||
_pml4_startup:
|
pml4_startup:
|
||||||
.fill 4096, 1, 0
|
.fill 4096, 1, 0
|
||||||
|
|
||||||
_pdp_startup:
|
pdp_startup:
|
||||||
.fill 4096, 1, 0
|
.fill 4096, 1, 0
|
||||||
|
|
||||||
_pd_startup:
|
pd_startup:
|
||||||
.fill 4096, 1, 0
|
.fill 4096, 1, 0
|
||||||
|
|
||||||
_PageDirectoryEnd:
|
PageDirectoryEnd:
|
||||||
|
|
|
@ -45,7 +45,7 @@
|
||||||
|
|
||||||
#define HYPERSPACE_BASE 0xfffff70000000000ULL
|
#define HYPERSPACE_BASE 0xfffff70000000000ULL
|
||||||
#define HAL_BASE 0xffffffff80000000ULL
|
#define HAL_BASE 0xffffffff80000000ULL
|
||||||
#define APIC_BASE 0xfffffffffee00000ULL // FIXME
|
#define APIC_BASE 0xFFFFFFFFFFFE0000ULL
|
||||||
|
|
||||||
#define APIC_PHYS_BASE 0xfee00000
|
#define APIC_PHYS_BASE 0xfee00000
|
||||||
|
|
||||||
|
|
|
@ -252,28 +252,36 @@ WinLdrSetupGdt(PVOID GdtBase, ULONG64 TssBase)
|
||||||
PKGDTENTRY64 Entry;
|
PKGDTENTRY64 Entry;
|
||||||
KDESCRIPTOR GdtDesc;
|
KDESCRIPTOR GdtDesc;
|
||||||
|
|
||||||
/* Setup KGDT_64_R0_CODE */
|
/* Setup KGDT64_NULL */
|
||||||
Entry = KiGetGdtEntry(GdtBase, KGDT_64_R0_CODE);
|
Entry = KiGetGdtEntry(GdtBase, KGDT64_NULL);
|
||||||
|
*(PULONG64)Entry = 0x0000000000000000ULL;
|
||||||
|
|
||||||
|
/* Setup KGDT64_R0_CODE */
|
||||||
|
Entry = KiGetGdtEntry(GdtBase, KGDT64_R0_CODE);
|
||||||
*(PULONG64)Entry = 0x00209b0000000000ULL;
|
*(PULONG64)Entry = 0x00209b0000000000ULL;
|
||||||
|
|
||||||
/* Setup KGDT_64_R0_SS */
|
/* Setup KGDT64_R0_DATA */
|
||||||
Entry = KiGetGdtEntry(GdtBase, KGDT_64_R0_SS);
|
Entry = KiGetGdtEntry(GdtBase, KGDT64_R0_DATA);
|
||||||
*(PULONG64)Entry = 0x00cf93000000ffffULL;
|
*(PULONG64)Entry = 0x00cf93000000ffffULL;
|
||||||
|
|
||||||
/* Setup KGDT_64_DATA */
|
/* Setup KGDT64_R3_CMCODE */
|
||||||
Entry = KiGetGdtEntry(GdtBase, KGDT_64_DATA);
|
Entry = KiGetGdtEntry(GdtBase, KGDT64_R3_CMCODE);
|
||||||
|
*(PULONG64)Entry = 0x00cffb000000ffffULL;
|
||||||
|
|
||||||
|
/* Setup KGDT64_R3_DATA */
|
||||||
|
Entry = KiGetGdtEntry(GdtBase, KGDT64_R3_DATA);
|
||||||
*(PULONG64)Entry = 0x00cff3000000ffffULL;
|
*(PULONG64)Entry = 0x00cff3000000ffffULL;
|
||||||
|
|
||||||
/* Setup KGDT_64_R3_CODE */
|
/* Setup KGDT64_R3_CODE */
|
||||||
Entry = KiGetGdtEntry(GdtBase, KGDT_64_R3_CODE);
|
Entry = KiGetGdtEntry(GdtBase, KGDT64_R3_CODE);
|
||||||
*(PULONG64)Entry = 0x0020fb0000000000ULL;
|
*(PULONG64)Entry = 0x0020fb0000000000ULL;
|
||||||
|
|
||||||
/* Setup KGDT_32_R3_TEB */
|
/* Setup KGDT64_R3_CMTEB */
|
||||||
Entry = KiGetGdtEntry(GdtBase, KGDT_32_R3_TEB);
|
Entry = KiGetGdtEntry(GdtBase, KGDT64_R3_CMTEB);
|
||||||
*(PULONG64)Entry = 0xff40f3fd50003c00ULL;
|
*(PULONG64)Entry = 0xff40f3fd50003c00ULL;
|
||||||
|
|
||||||
/* Setup TSS entry */
|
/* Setup TSS entry */
|
||||||
Entry = KiGetGdtEntry(GdtBase, KGDT_TSS);
|
Entry = KiGetGdtEntry(GdtBase, KGDT64_SYS_TSS);
|
||||||
KiInitGdtEntry(Entry, TssBase, sizeof(KTSS), I386_TSS, 0);
|
KiInitGdtEntry(Entry, TssBase, sizeof(KTSS), I386_TSS, 0);
|
||||||
|
|
||||||
/* Setup GDT descriptor */
|
/* Setup GDT descriptor */
|
||||||
|
@ -333,15 +341,8 @@ WinLdrSetProcessorContext(PVOID GdtIdt, IN ULONG64 Pcr, IN ULONG64 Tss)
|
||||||
/* LDT is unused */
|
/* LDT is unused */
|
||||||
// __lldt(0);
|
// __lldt(0);
|
||||||
|
|
||||||
/* Load selectors for DS/ES/FS/GS/SS */
|
|
||||||
Ke386SetDs(KGDT_64_DATA | RPL_MASK); // 0x2b
|
|
||||||
Ke386SetEs(KGDT_64_DATA | RPL_MASK); // 0x2b
|
|
||||||
Ke386SetFs(KGDT_32_R3_TEB | RPL_MASK); // 0x53
|
|
||||||
Ke386SetGs(KGDT_64_DATA | RPL_MASK); // 0x2b
|
|
||||||
Ke386SetSs(KGDT_64_R0_SS); // 0x18
|
|
||||||
|
|
||||||
/* Load TSR */
|
/* Load TSR */
|
||||||
__ltr(KGDT_TSS);
|
__ltr(KGDT64_SYS_TSS);
|
||||||
|
|
||||||
DPRINTM(DPRINT_WINDOWS, "leave WinLdrSetProcessorContext\n");
|
DPRINTM(DPRINT_WINDOWS, "leave WinLdrSetProcessorContext\n");
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue