From de40f8d7d76e7ae9c96d5159065dbf488b79f296 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Mon, 12 Apr 2010 22:28:22 +0000 Subject: [PATCH] [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 --- .../boot/freeldr/freeldr/arch/amd64/arch.S | 76 +++--- .../boot/freeldr/freeldr/arch/amd64/boot.S | 6 +- .../boot/freeldr/freeldr/arch/amd64/drvmap.S | 8 +- .../boot/freeldr/freeldr/arch/amd64/i386cpu.S | 6 +- .../boot/freeldr/freeldr/arch/amd64/i386pnp.S | 6 +- .../freeldr/freeldr/arch/amd64/i386trap.S | 4 +- .../boot/freeldr/freeldr/arch/amd64/int386.S | 2 +- .../boot/freeldr/freeldr/arch/amd64/loader.c | 246 +----------------- reactos/boot/freeldr/freeldr/arch/amd64/mb.S | 24 +- .../freeldr/include/arch/amd64/amd64.h | 2 +- .../freeldr/freeldr/windows/amd64/wlmemory.c | 39 +-- 11 files changed, 89 insertions(+), 330 deletions(-) diff --git a/reactos/boot/freeldr/freeldr/arch/amd64/arch.S b/reactos/boot/freeldr/freeldr/arch/amd64/arch.S index 0f6c257e34a..9def109221c 100644 --- a/reactos/boot/freeldr/freeldr/arch/amd64/arch.S +++ b/reactos/boot/freeldr/freeldr/arch/amd64/arch.S @@ -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 diff --git a/reactos/boot/freeldr/freeldr/arch/amd64/boot.S b/reactos/boot/freeldr/freeldr/arch/amd64/boot.S index ce7bb355c90..eb3ba3c3c64 100644 --- a/reactos/boot/freeldr/freeldr/arch/amd64/boot.S +++ b/reactos/boot/freeldr/freeldr/arch/amd64/boot.S @@ -24,14 +24,14 @@ #include -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 diff --git a/reactos/boot/freeldr/freeldr/arch/amd64/drvmap.S b/reactos/boot/freeldr/freeldr/arch/amd64/drvmap.S index d6b081ca60b..6871fe0f62d 100644 --- a/reactos/boot/freeldr/freeldr/arch/amd64/drvmap.S +++ b/reactos/boot/freeldr/freeldr/arch/amd64/drvmap.S @@ -24,7 +24,7 @@ #include -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) diff --git a/reactos/boot/freeldr/freeldr/arch/amd64/i386cpu.S b/reactos/boot/freeldr/freeldr/arch/amd64/i386cpu.S index 6dfb91dbf4a..ee3ee6fe256 100644 --- a/reactos/boot/freeldr/freeldr/arch/amd64/i386cpu.S +++ b/reactos/boot/freeldr/freeldr/arch/amd64/i386cpu.S @@ -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 diff --git a/reactos/boot/freeldr/freeldr/arch/amd64/i386pnp.S b/reactos/boot/freeldr/freeldr/arch/amd64/i386pnp.S index ff0ae71eb1a..19589275bac 100644 --- a/reactos/boot/freeldr/freeldr/arch/amd64/i386pnp.S +++ b/reactos/boot/freeldr/freeldr/arch/amd64/i386pnp.S @@ -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 diff --git a/reactos/boot/freeldr/freeldr/arch/amd64/i386trap.S b/reactos/boot/freeldr/freeldr/arch/amd64/i386trap.S index 833fcc37104..195bf097cd0 100644 --- a/reactos/boot/freeldr/freeldr/arch/amd64/i386trap.S +++ b/reactos/boot/freeldr/freeldr/arch/amd64/i386trap.S @@ -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 diff --git a/reactos/boot/freeldr/freeldr/arch/amd64/int386.S b/reactos/boot/freeldr/freeldr/arch/amd64/int386.S index 1c1f2dbdf0a..a22e409c61c 100644 --- a/reactos/boot/freeldr/freeldr/arch/amd64/int386.S +++ b/reactos/boot/freeldr/freeldr/arch/amd64/int386.S @@ -63,7 +63,7 @@ Int386_regsout: /* * int Int386(int ivec, REGS* in, REGS* out); */ -EXTERN(_Int386) +EXTERN(Int386) .code64 /* Get the function parameters */ diff --git a/reactos/boot/freeldr/freeldr/arch/amd64/loader.c b/reactos/boot/freeldr/freeldr/arch/amd64/loader.c index 9ca6f858644..cad77bf48d6 100644 --- a/reactos/boot/freeldr/freeldr/arch/amd64/loader.c +++ b/reactos/boot/freeldr/freeldr/arch/amd64/loader.c @@ -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); - -} diff --git a/reactos/boot/freeldr/freeldr/arch/amd64/mb.S b/reactos/boot/freeldr/freeldr/arch/amd64/mb.S index 368338ed33b..2d515e90053 100644 --- a/reactos/boot/freeldr/freeldr/arch/amd64/mb.S +++ b/reactos/boot/freeldr/freeldr/arch/amd64/mb.S @@ -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: diff --git a/reactos/boot/freeldr/freeldr/include/arch/amd64/amd64.h b/reactos/boot/freeldr/freeldr/include/arch/amd64/amd64.h index af46178d9db..9068e00f90a 100644 --- a/reactos/boot/freeldr/freeldr/include/arch/amd64/amd64.h +++ b/reactos/boot/freeldr/freeldr/include/arch/amd64/amd64.h @@ -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 diff --git a/reactos/boot/freeldr/freeldr/windows/amd64/wlmemory.c b/reactos/boot/freeldr/freeldr/windows/amd64/wlmemory.c index 3e3288a682a..5f979c4ca7b 100644 --- a/reactos/boot/freeldr/freeldr/windows/amd64/wlmemory.c +++ b/reactos/boot/freeldr/freeldr/windows/amd64/wlmemory.c @@ -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"); }