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 ----