[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:
Timo Kreuzer 2010-04-12 22:28:22 +00:00
parent 31515fdd20
commit de40f8d7d7
11 changed files with 89 additions and 330 deletions

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -63,7 +63,7 @@ Int386_regsout:
/*
* int Int386(int ivec, REGS* in, REGS* out);
*/
EXTERN(_Int386)
EXTERN(Int386)
.code64
/* Get the function parameters */

View file

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

View file

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

View file

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

View file

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