]> git.ipfire.org Git - thirdparty/u-boot.git/commitdiff
x86: Disable paging before changing to long mode
authorSimon Glass <sjg@chromium.org>
Sat, 15 Mar 2025 14:25:37 +0000 (14:25 +0000)
committerTom Rini <trini@konsulko.com>
Thu, 3 Apr 2025 17:41:55 +0000 (11:41 -0600)
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>
arch/x86/cpu/i386/call64.S

index 424732fa3fa659403dc41f5abe4b588c34ae995d..f979f9e5f0edf4f89e5ad6307e492b406fe99307 100644 (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. */