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:
@@ -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. */
|
||||
|
||||
Reference in New Issue
Block a user