x86: Disable paging before changing to long mode

This is required as part of the procedure. The existing code works
because it changes the GDT at the same time, but this makes kvm
unhappy.

Update the algorithm to disable and then re-enable paging.

Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Simon Glass
2024-11-10 15:42:23 -07:00
parent 1003f27657
commit 05e9c555b4

View File

@@ -25,6 +25,11 @@ cpu_call64:
push %edx /* arg1 = setup_base */
mov %eax, %ebx
# disable paging
movl %cr0, %eax
andl $~X86_CR0_PG, %eax
movl %eax, %cr0
/* Load new GDT with the 64bit segments using 32bit descriptor */
leal gdt, %eax
movl %eax, gdt+2
@@ -67,7 +72,8 @@ cpu_call64:
pushl %eax
/* Enter paged protected Mode, activating Long Mode */
movl $(X86_CR0_PG | X86_CR0_PE), %eax
movl %cr0, %eax
orl $X86_CR0_PG, %eax
movl %eax, %cr0
/* Jump from 32bit compatibility mode into 64bit mode. */