REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3084 When DXE drivers are dispatched above 4GB memory in 64bit mode, the address setCodeSelectorLongJump in stack will be override by parameter. Jump to Qword is not supported by some processors. So use "o64 retf" instead. Signed-off-by: Guo Dong <guo.dong@intel.com> Acked-by: Laszlo Ersek <lersek@redhat.com> Tested-by: Tom Lendacky <thomas.lendacky@amd.com> Reviewed-by: Michael D Kinney <michael.d.kinney@intel.com> Tested-by: James Bottomley <jejb@linux.ibm.com> Reviewed-by: Ray Ni <ray.ni@intel.com>
45 lines
1.1 KiB
NASM
45 lines
1.1 KiB
NASM
;------------------------------------------------------------------------------
|
|
;*
|
|
;* Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>
|
|
;* SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
;*
|
|
;* CpuAsm.nasm
|
|
;*
|
|
;* Abstract:
|
|
;*
|
|
;------------------------------------------------------------------------------
|
|
|
|
DEFAULT REL
|
|
SECTION .text
|
|
|
|
;------------------------------------------------------------------------------
|
|
; VOID
|
|
; SetCodeSelector (
|
|
; UINT16 Selector
|
|
; );
|
|
;------------------------------------------------------------------------------
|
|
global ASM_PFX(SetCodeSelector)
|
|
ASM_PFX(SetCodeSelector):
|
|
push rcx
|
|
lea rax, [setCodeSelectorLongJump]
|
|
push rax
|
|
o64 retf
|
|
setCodeSelectorLongJump:
|
|
ret
|
|
|
|
;------------------------------------------------------------------------------
|
|
; VOID
|
|
; SetDataSelectors (
|
|
; UINT16 Selector
|
|
; );
|
|
;------------------------------------------------------------------------------
|
|
global ASM_PFX(SetDataSelectors)
|
|
ASM_PFX(SetDataSelectors):
|
|
o16 mov ss, cx
|
|
o16 mov ds, cx
|
|
o16 mov es, cx
|
|
o16 mov fs, cx
|
|
o16 mov gs, cx
|
|
ret
|
|
|