From af53d12ef9610802d2623922585357b021c2cdfb Mon Sep 17 00:00:00 2001 From: Ivan Baravy Date: Wed, 31 Mar 2021 19:45:53 +0000 Subject: [PATCH] uefi4kos: Make sure 32bit trampoline is below 4GiB This fixes booting via uefi64kos on some systems. git-svn-id: svn://kolibrios.org@8656 a494cfbc-eb01-0410-851d-a64ba20cac60 --- .../trunk/bootloader/uefi4kos/uefi64kos.asm | 54 +++++++++++-------- 1 file changed, 32 insertions(+), 22 deletions(-) diff --git a/kernel/trunk/bootloader/uefi4kos/uefi64kos.asm b/kernel/trunk/bootloader/uefi4kos/uefi64kos.asm index bd4f1d9e87..927b0d6e03 100644 --- a/kernel/trunk/bootloader/uefi4kos/uefi64kos.asm +++ b/kernel/trunk/bootloader/uefi4kos/uefi64kos.asm @@ -23,6 +23,7 @@ GOP_BUFFER_SIZE = 0x100 LIP_BUFFER_SIZE = 0x100 FILE_BUFFER_SIZE = 0x1000 +KERNEL_TRAMPOLINE = 0x8f80 ; just before BOOT_LO KERNEL_BASE = 0x10000 RAMDISK_BASE = 0x100000 MAX_FILE_SIZE = 0x10000000 @@ -818,7 +819,14 @@ main: mov ecx, 0x17 rep movsb - lgdt [cs:GDTR] + ; kernel trampoline + mov rsi, kernel_trampoline + mov rdi, KERNEL_TRAMPOLINE + mov ecx, kernel_trampoline.size + rep movsb + + mov rax, GDTR + lgdt [cs:rax] mov ax, DATA_32_SELECTOR mov ds, ax @@ -828,29 +836,10 @@ main: mov ss, ax push CODE_32_SELECTOR - lea rax, [.next] + mov rax, KERNEL_TRAMPOLINE push rax retf -use32 -align 16 -.next: - mov eax, cr0 - and eax, not CR0_PG - mov cr0, eax - mov ecx, MSR_AMD_EFER - rdmsr - btr eax, 8 ; LME - wrmsr - - mov eax, cr4 - and eax, not CR4_PAE - mov cr4, eax - - push KERNEL_BASE - retn - -use64 .error: mov rbx, [efi_table] mov rbx, [rbx+EFI_SYSTEM_TABLE.ConOut] @@ -1086,7 +1075,25 @@ clearbuf: pop rdi rsi rdx rcx rbx rax ret -section '.rodata' data readable +use32 +kernel_trampoline: +org KERNEL_TRAMPOLINE + mov eax, cr0 + and eax, not CR0_PG + mov cr0, eax + + mov ecx, MSR_AMD_EFER + rdmsr + btr eax, 8 ; LME + wrmsr + + mov eax, cr4 + and eax, not CR4_PAE + mov cr4, eax + + push KERNEL_BASE + retn + align 16 GDTR: dw 4*8-1 @@ -1097,7 +1104,10 @@ GDT: dw 0FFFFh,0,9A00h,0CFh ; 32-bit code dw 0FFFFh,0,9200h,0CFh ; flat data dw 0FFFFh,0,9A00h,0AFh ; 64-bit code +assert $ < BOOT_LO +kernel_trampoline.size = $ - KERNEL_TRAMPOLINE +section '.rodata' data readable gopuuid db EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID lipuuid db EFI_LOADED_IMAGE_PROTOCOL_GUID sfspguid db EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID