Print this page
Use `iretq` method of jumping to 32-bit so VirtualBox (and maybe QEMU/KVM too?)
can cope and not get its `ljmp <mem48>` emulation bug(s) tickled.
*** 1,9 ****
/*
* Parts copyright Michael Brown <mbrown@fensystems.co.uk>
*
! * Copyright (c) 2019, Joyent, Inc.
*/
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
/* CR0: protection enabled */
--- 1,9 ----
/*
* Parts copyright Michael Brown <mbrown@fensystems.co.uk>
*
! * Copyright 2020 Joyent, Inc.
*/
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
/* CR0: protection enabled */
*** 60,70 ****
leaq entry_gdtr(%rip), %rax
lgdt (%rax)
/* Load our new %cs. */
! ljmp *newcs_vector
.code32
newcs:
movw $GDTSEL_DATA, %ax
--- 60,77 ----
leaq entry_gdtr(%rip), %rax
lgdt (%rax)
/* Load our new %cs. */
! movq %rsp, %rax
! pushq $GDTSEL_DATA
! pushq %rax
! pushf
! pushq $GDTSEL_CODE
! lea newcs(%rip), %rax
! pushq %rax
! iretq
.code32
newcs:
movw $GDTSEL_DATA, %ax
*** 106,118 ****
movq %rsi, %rsp
jmp *%rdx
.data
- newcs_vector:
- .long newcs, GDTSEL_CODE
-
.align 16
entry_gdt:
/* null entry */
.word 0x0, 0x0
.byte 0x0, 0x0, 0x0, 0x0
--- 113,122 ----