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