mirror of
https://github.com/reactos/reactos.git
synced 2025-02-23 17:05:46 +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
|
||||
|
||||
/* checkPoint Charlie - where it all began... */
|
||||
mov si, offset _CheckPoint0
|
||||
mov si, offset CheckPoint0
|
||||
call writestr
|
||||
|
||||
|
||||
/* Setup a real mode stack */
|
||||
mov sp, stack16
|
||||
|
||||
/* Zero BootDrive and BootPartition */
|
||||
xor eax, eax
|
||||
mov _BootDrive, eax
|
||||
mov _BootPartition, eax
|
||||
mov BootDrive, eax
|
||||
mov BootPartition, eax
|
||||
|
||||
/* Store the boot drive */
|
||||
mov _BootDrive, dl
|
||||
mov BootDrive, dl
|
||||
|
||||
/* Store the boot partition */
|
||||
mov _BootPartition, dh
|
||||
mov BootPartition, dh
|
||||
|
||||
/* Load the GDT */
|
||||
lgdt gdtptr
|
||||
|
@ -46,13 +46,13 @@ RealEntryPoint:
|
|||
call x86_16_EnableA20
|
||||
|
||||
/* checkPoint Charlie - where it all began... */
|
||||
mov si, offset _CheckPoint1
|
||||
mov si, offset CheckPoint1
|
||||
call writestr
|
||||
|
||||
call x86_16_BuildPageTables
|
||||
|
||||
/* checkPoint Charlie - where it all began... */
|
||||
mov si, offset _CheckPoint2
|
||||
mov si, offset CheckPoint2
|
||||
call writestr
|
||||
|
||||
/* Check if CPU supports CPUID */
|
||||
|
@ -89,26 +89,26 @@ RealEntryPoint:
|
|||
/* X64 Processor */
|
||||
|
||||
/* checkPoint Charlie - where it all began... */
|
||||
mov si, offset _CheckPoint3
|
||||
mov si, offset CheckPoint3
|
||||
call writestr
|
||||
|
||||
jmp _switch64
|
||||
jmp switch64
|
||||
|
||||
NO_X64_SUPPORT_DETECTED:
|
||||
mov si, offset _NotAnX64Processor // Loading message
|
||||
mov si, offset NotAnX64Processor // Loading message
|
||||
call writestr
|
||||
jmp _fail
|
||||
jmp fail
|
||||
|
||||
NO_CPUID_SUPPORT_DETECTED:
|
||||
mov si, offset _NoCPUIDSupport // Loading message
|
||||
call writestr
|
||||
mov si, offset NoCPUIDSupport // Loading message
|
||||
call writestr
|
||||
|
||||
_fail:
|
||||
jmp _fail
|
||||
fail:
|
||||
jmp fail
|
||||
nop
|
||||
nop
|
||||
|
||||
_switch64:
|
||||
switch64:
|
||||
call x86_16_SwitchToLong
|
||||
|
||||
.code64
|
||||
|
@ -119,7 +119,7 @@ _switch64:
|
|||
|
||||
/* GO! */
|
||||
xor rcx, rcx
|
||||
call _BootMain
|
||||
call BootMain
|
||||
|
||||
/* Checkpoint */
|
||||
// mov ax, LMODE_DS
|
||||
|
@ -174,14 +174,14 @@ x86_16_BuildPageTables:
|
|||
push es
|
||||
|
||||
/* Get segment of pml4 */
|
||||
mov eax, offset _pml4_startup
|
||||
mov eax, offset pml4_startup
|
||||
shr eax, 4
|
||||
mov es, ax
|
||||
cld
|
||||
xor di, di
|
||||
|
||||
/* One entry in the PML4 pointing to PDP */
|
||||
mov eax, offset _pdp_startup
|
||||
mov eax, offset pdp_startup
|
||||
or eax, 0x00f
|
||||
stosd
|
||||
/* clear rest */
|
||||
|
@ -190,7 +190,7 @@ x86_16_BuildPageTables:
|
|||
rep stosd
|
||||
|
||||
/* One entry in the PDP pointing to PD */
|
||||
mov eax, offset _pd_startup
|
||||
mov eax, offset pd_startup
|
||||
or eax, 0x00f
|
||||
stosd
|
||||
/* clear rest */
|
||||
|
@ -268,7 +268,7 @@ x86_16_SwitchToLong:
|
|||
mov eax, 0x00a0 // Set PAE and PGE: 10100000b
|
||||
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 ecx, 0xC0000080 // Specify EFER MSR
|
||||
|
@ -405,42 +405,42 @@ gdtptr:
|
|||
.long gdt /* Base Address */
|
||||
|
||||
|
||||
.global _BootDrive
|
||||
_BootDrive:
|
||||
.global BootDrive
|
||||
BootDrive:
|
||||
.long 0
|
||||
|
||||
.global _BootPartition
|
||||
_BootPartition:
|
||||
.global BootPartition
|
||||
BootPartition:
|
||||
.long 0
|
||||
|
||||
.global _NotAnX64Processor
|
||||
_NotAnX64Processor:
|
||||
.global NotAnX64Processor
|
||||
NotAnX64Processor:
|
||||
.ascii "FreeLoader: No x64-compatible CPU detected! Exiting..."
|
||||
.byte 0x0d, 0x0a, 0
|
||||
|
||||
.global _NoCPUIDSupport
|
||||
_NoCPUIDSupport:
|
||||
.global NoCPUIDSupport
|
||||
NoCPUIDSupport:
|
||||
.ascii "FreeLoader: No CPUID instruction support detected! Exiting..."
|
||||
.byte 0x0d, 0x0a, 0
|
||||
|
||||
/////////////////////////// Checkpoint messages ///////////////////////////////
|
||||
.global _CheckPoint0
|
||||
_CheckPoint0:
|
||||
.global CheckPoint0
|
||||
CheckPoint0:
|
||||
.ascii "Starting FreeLoader..."
|
||||
.byte 0x0d, 0x0a, 0
|
||||
|
||||
.global _CheckPoint1
|
||||
_CheckPoint1:
|
||||
.global CheckPoint1
|
||||
CheckPoint1:
|
||||
.ascii "FreeLoader[16-bit]: building page tables..."
|
||||
.byte 0x0d, 0x0a, 0
|
||||
|
||||
.global _CheckPoint2
|
||||
_CheckPoint2:
|
||||
.global CheckPoint2
|
||||
CheckPoint2:
|
||||
.ascii "FreeLoader[16-bit]: checking CPU for x64 long mode..."
|
||||
.byte 0x0d, 0x0a, 0
|
||||
|
||||
.global _CheckPoint3
|
||||
_CheckPoint3:
|
||||
.global CheckPoint3
|
||||
CheckPoint3:
|
||||
.ascii "FreeLoader: Switching to x64 long mode..."
|
||||
.byte 0x0d, 0x0a, 0
|
||||
|
||||
|
|
|
@ -24,14 +24,14 @@
|
|||
#include <arch.h>
|
||||
|
||||
|
||||
EXTERN(_ChainLoadBiosBootSectorCode)
|
||||
EXTERN(ChainLoadBiosBootSectorCode)
|
||||
.code64
|
||||
|
||||
call x86_64_SwitchToReal
|
||||
.code16
|
||||
|
||||
/* Set the boot drive */
|
||||
mov dl, _BootDrive
|
||||
mov dl, BootDrive
|
||||
|
||||
/* Load segment registers */
|
||||
cli
|
||||
|
@ -46,7 +46,7 @@ EXTERN(_ChainLoadBiosBootSectorCode)
|
|||
// ljmpl $0x0000,$0x7C00
|
||||
jmp 0x7c00:0x0000
|
||||
|
||||
EXTERN(_SoftReboot)
|
||||
EXTERN(SoftReboot)
|
||||
.code64
|
||||
|
||||
call x86_64_SwitchToReal
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
#include <arch.h>
|
||||
|
||||
|
||||
EXTERN(_DriveMapInt13HandlerStart)
|
||||
EXTERN(DriveMapInt13HandlerStart)
|
||||
Int13Handler:
|
||||
|
||||
pushw %bp
|
||||
|
@ -82,7 +82,7 @@ CallOldInt13Handler:
|
|||
|
||||
/* Call old int 13h handler with new drive number */
|
||||
.byte 0x9a /* lcall */
|
||||
EXTERN(_DriveMapOldInt13HandlerAddress)
|
||||
EXTERN(DriveMapOldInt13HandlerAddress)
|
||||
.word 0
|
||||
.word 0
|
||||
|
||||
|
@ -105,7 +105,7 @@ CallersFlags:
|
|||
PassedInDriveNumber:
|
||||
.byte 0
|
||||
|
||||
EXTERN(_DriveMapInt13HandlerMapList)
|
||||
EXTERN(DriveMapInt13HandlerMapList)
|
||||
Int13HandlerMapCount:
|
||||
.byte 0
|
||||
|
||||
|
@ -129,4 +129,4 @@ Int13HandlerDrive4:
|
|||
Int13HandlerDriveNew4:
|
||||
.byte 0
|
||||
|
||||
EXTERN(_DriveMapInt13HandlerEnd)
|
||||
EXTERN(DriveMapInt13HandlerEnd)
|
||||
|
|
|
@ -33,7 +33,7 @@
|
|||
* 0x00000400: Found 80486 CPU without CPUID support
|
||||
*/
|
||||
|
||||
EXTERN(_CpuidSupported)
|
||||
EXTERN(CpuidSupported)
|
||||
.code32
|
||||
|
||||
pushl %ecx /* save ECX */
|
||||
|
@ -80,7 +80,7 @@ NoCpuid:
|
|||
* VOID GetCpuid(U32 Level, U32 *eax, U32 *ebx, U32 *ecx, U32 *edx);
|
||||
*/
|
||||
|
||||
EXTERN(_GetCpuid)
|
||||
EXTERN(GetCpuid)
|
||||
.code32
|
||||
|
||||
pushl %ebp
|
||||
|
@ -123,7 +123,7 @@ EXTERN(_GetCpuid)
|
|||
* U64 RDTSC(VOID);
|
||||
*/
|
||||
|
||||
EXTERN(_RDTSC)
|
||||
EXTERN(RDTSC)
|
||||
.code32
|
||||
rdtsc
|
||||
ret
|
||||
|
|
|
@ -35,7 +35,7 @@ _pnp_bios_entry_point:
|
|||
_pnp_bios_data_segment:
|
||||
.word 0
|
||||
|
||||
EXTERN(_PnpBiosSupported)
|
||||
EXTERN(PnpBiosSupported)
|
||||
.code64
|
||||
|
||||
push rdi
|
||||
|
@ -113,7 +113,7 @@ _pnp_node_size:
|
|||
_pnp_node_count:
|
||||
.word 0
|
||||
|
||||
EXTERN(_PnpBiosGetDeviceNodeCount)
|
||||
EXTERN(PnpBiosGetDeviceNodeCount)
|
||||
.code64
|
||||
|
||||
push rbp
|
||||
|
@ -182,7 +182,7 @@ _pnp_buffer_offset:
|
|||
_pnp_node_number:
|
||||
.byte 0
|
||||
|
||||
EXTERN(_PnpBiosGetDeviceNode)
|
||||
EXTERN(PnpBiosGetDeviceNode)
|
||||
.code64
|
||||
|
||||
push rbp
|
||||
|
|
|
@ -273,7 +273,7 @@ i386CommonExceptionHandler:
|
|||
SAVE_CPU_REGS
|
||||
|
||||
pushl $SCREEN_ATTR
|
||||
call _MachVideoClearScreen
|
||||
call MachVideoClearScreen
|
||||
add $4,%esp
|
||||
|
||||
movl $i386ExceptionHandlerText,%esi
|
||||
|
@ -485,7 +485,7 @@ i386PrintChar:
|
|||
pushl $SCREEN_ATTR
|
||||
andl $0xff,%eax
|
||||
pushl %eax
|
||||
call _MachVideoPutChar
|
||||
call MachVideoPutChar
|
||||
addl $16,%esp
|
||||
|
||||
ret
|
||||
|
|
|
@ -63,7 +63,7 @@ Int386_regsout:
|
|||
/*
|
||||
* int Int386(int ivec, REGS* in, REGS* out);
|
||||
*/
|
||||
EXTERN(_Int386)
|
||||
EXTERN(Int386)
|
||||
.code64
|
||||
|
||||
/* Get the function parameters */
|
||||
|
|
|
@ -39,33 +39,6 @@ EnableA20()
|
|||
/* 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
|
||||
* INTERNAL
|
||||
|
@ -86,222 +59,7 @@ VOID
|
|||
NTAPI
|
||||
FrLdrStartup(ULONG Magic)
|
||||
{
|
||||
/* Disable Interrupts */
|
||||
_disable();
|
||||
|
||||
/* 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);
|
||||
|
||||
DbgPrint("ReactOS loader is unsupported! Halting.\n", KernelEntryPoint);
|
||||
for(;;);
|
||||
}
|
||||
|
||||
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
|
||||
*/
|
||||
.code64
|
||||
.globl _PageDirectoryStart
|
||||
.globl PageDirectoryStart
|
||||
|
||||
.globl _pml4_startup
|
||||
.globl _pdp_startup
|
||||
.globl _pd_startup
|
||||
.globl pml4_startup
|
||||
.globl pdp_startup
|
||||
.globl pd_startup
|
||||
|
||||
.globl _PageDirectoryEnd
|
||||
.globl PageDirectoryEnd
|
||||
|
||||
//
|
||||
// Boot information structure
|
||||
//
|
||||
|
||||
EXTERN(_reactos_memory_map_descriptor_size)
|
||||
EXTERN(reactos_memory_map_descriptor_size)
|
||||
.long 0
|
||||
|
||||
EXTERN(_reactos_memory_map)
|
||||
EXTERN(reactos_memory_map)
|
||||
.rept (32 * /*sizeof(memory_map_t)*/24)
|
||||
.byte 0
|
||||
.endr
|
||||
|
||||
.bss
|
||||
_PageDirectoryStart:
|
||||
_pml4_startup:
|
||||
PageDirectoryStart:
|
||||
pml4_startup:
|
||||
.fill 4096, 1, 0
|
||||
|
||||
_pdp_startup:
|
||||
pdp_startup:
|
||||
.fill 4096, 1, 0
|
||||
|
||||
_pd_startup:
|
||||
pd_startup:
|
||||
.fill 4096, 1, 0
|
||||
|
||||
_PageDirectoryEnd:
|
||||
PageDirectoryEnd:
|
||||
|
|
|
@ -45,7 +45,7 @@
|
|||
|
||||
#define HYPERSPACE_BASE 0xfffff70000000000ULL
|
||||
#define HAL_BASE 0xffffffff80000000ULL
|
||||
#define APIC_BASE 0xfffffffffee00000ULL // FIXME
|
||||
#define APIC_BASE 0xFFFFFFFFFFFE0000ULL
|
||||
|
||||
#define APIC_PHYS_BASE 0xfee00000
|
||||
|
||||
|
|
|
@ -252,28 +252,36 @@ WinLdrSetupGdt(PVOID GdtBase, ULONG64 TssBase)
|
|||
PKGDTENTRY64 Entry;
|
||||
KDESCRIPTOR GdtDesc;
|
||||
|
||||
/* Setup KGDT_64_R0_CODE */
|
||||
Entry = KiGetGdtEntry(GdtBase, KGDT_64_R0_CODE);
|
||||
/* Setup KGDT64_NULL */
|
||||
Entry = KiGetGdtEntry(GdtBase, KGDT64_NULL);
|
||||
*(PULONG64)Entry = 0x0000000000000000ULL;
|
||||
|
||||
/* Setup KGDT64_R0_CODE */
|
||||
Entry = KiGetGdtEntry(GdtBase, KGDT64_R0_CODE);
|
||||
*(PULONG64)Entry = 0x00209b0000000000ULL;
|
||||
|
||||
/* Setup KGDT_64_R0_SS */
|
||||
Entry = KiGetGdtEntry(GdtBase, KGDT_64_R0_SS);
|
||||
/* Setup KGDT64_R0_DATA */
|
||||
Entry = KiGetGdtEntry(GdtBase, KGDT64_R0_DATA);
|
||||
*(PULONG64)Entry = 0x00cf93000000ffffULL;
|
||||
|
||||
/* Setup KGDT_64_DATA */
|
||||
Entry = KiGetGdtEntry(GdtBase, KGDT_64_DATA);
|
||||
/* Setup KGDT64_R3_CMCODE */
|
||||
Entry = KiGetGdtEntry(GdtBase, KGDT64_R3_CMCODE);
|
||||
*(PULONG64)Entry = 0x00cffb000000ffffULL;
|
||||
|
||||
/* Setup KGDT64_R3_DATA */
|
||||
Entry = KiGetGdtEntry(GdtBase, KGDT64_R3_DATA);
|
||||
*(PULONG64)Entry = 0x00cff3000000ffffULL;
|
||||
|
||||
/* Setup KGDT_64_R3_CODE */
|
||||
Entry = KiGetGdtEntry(GdtBase, KGDT_64_R3_CODE);
|
||||
/* Setup KGDT64_R3_CODE */
|
||||
Entry = KiGetGdtEntry(GdtBase, KGDT64_R3_CODE);
|
||||
*(PULONG64)Entry = 0x0020fb0000000000ULL;
|
||||
|
||||
/* Setup KGDT_32_R3_TEB */
|
||||
Entry = KiGetGdtEntry(GdtBase, KGDT_32_R3_TEB);
|
||||
/* Setup KGDT64_R3_CMTEB */
|
||||
Entry = KiGetGdtEntry(GdtBase, KGDT64_R3_CMTEB);
|
||||
*(PULONG64)Entry = 0xff40f3fd50003c00ULL;
|
||||
|
||||
/* Setup TSS entry */
|
||||
Entry = KiGetGdtEntry(GdtBase, KGDT_TSS);
|
||||
Entry = KiGetGdtEntry(GdtBase, KGDT64_SYS_TSS);
|
||||
KiInitGdtEntry(Entry, TssBase, sizeof(KTSS), I386_TSS, 0);
|
||||
|
||||
/* Setup GDT descriptor */
|
||||
|
@ -333,15 +341,8 @@ WinLdrSetProcessorContext(PVOID GdtIdt, IN ULONG64 Pcr, IN ULONG64 Tss)
|
|||
/* LDT is unused */
|
||||
// __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 */
|
||||
__ltr(KGDT_TSS);
|
||||
__ltr(KGDT64_SYS_TSS);
|
||||
|
||||
DPRINTM(DPRINT_WINDOWS, "leave WinLdrSetProcessorContext\n");
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue