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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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