REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3790 Replace Opcode with the corresponding instructions. The code changes have been verified with CompareBuild.py tool, which can be used to compare the results of two different EDK II builds to determine if they generate the same binaries. (tool link: https://github.com/mdkinney/edk2/tree/sandbox/CompareBuild) Signed-off-by: Jason Lou <yun.lou@intel.com> Cc: Michael D Kinney <michael.d.kinney@intel.com> Reviewed-by: Liming Gao <gaoliming@byosoft.com.cn> Cc: Zhiguang Liu <zhiguang.liu@intel.com>
		
			
				
	
	
		
			78 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			NASM
		
	
	
	
	
	
			
		
		
	
	
			78 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			NASM
		
	
	
	
	
	
| ;------------------------------------------------------------------------------
 | |
| ;
 | |
| ; Copyright (c) 2006 - 2022, Intel Corporation. All rights reserved.<BR>
 | |
| ; SPDX-License-Identifier: BSD-2-Clause-Patent
 | |
| ;
 | |
| ; Module Name:
 | |
| ;
 | |
| ;   DisablePaging64.Asm
 | |
| ;
 | |
| ; Abstract:
 | |
| ;
 | |
| ;   AsmDisablePaging64 function
 | |
| ;
 | |
| ; Notes:
 | |
| ;
 | |
| ;------------------------------------------------------------------------------
 | |
| 
 | |
|     DEFAULT REL
 | |
|     SECTION .text
 | |
| 
 | |
| ;------------------------------------------------------------------------------
 | |
| ; VOID
 | |
| ; EFIAPI
 | |
| ; InternalX86DisablePaging64 (
 | |
| ;   IN      UINT16                    Cs,
 | |
| ;   IN      UINT32                    EntryPoint,
 | |
| ;   IN      UINT32                    Context1,  OPTIONAL
 | |
| ;   IN      UINT32                    Context2,  OPTIONAL
 | |
| ;   IN      UINT32                    NewStack
 | |
| ;   );
 | |
| ;------------------------------------------------------------------------------
 | |
| global ASM_PFX(InternalX86DisablePaging64)
 | |
| ASM_PFX(InternalX86DisablePaging64):
 | |
|     cli
 | |
|     lea     rsi, [.0]                     ; rsi <- The start address of transition code
 | |
|     mov     edi, [rsp + 0x28]            ; rdi <- New stack
 | |
|     lea     rax, [mTransitionEnd]         ; rax <- end of transition code
 | |
|     sub     rax, rsi                    ; rax <- The size of transition piece code
 | |
|     add     rax, 4                      ; Round RAX up to the next 4 byte boundary
 | |
|     and     al, 0xfc
 | |
|     sub     rdi, rax                    ; rdi <- Use stack to hold transition code
 | |
|     mov     r10d, edi                   ; r10 <- The start address of transicition code below 4G
 | |
|     push    rcx                         ; save rcx to stack
 | |
|     mov     rcx, rax                    ; rcx <- The size of transition piece code
 | |
|     rep     movsb                       ; copy transition code to top of new stack which must be below 4GB
 | |
|     pop     rcx                         ; restore rcx
 | |
| 
 | |
|     mov     esi, r8d
 | |
|     mov     edi, r9d
 | |
|     mov     eax, r10d                   ; eax <- start of the transition code on the stack
 | |
|     sub     eax, 4                      ; eax <- One slot below transition code on the stack
 | |
|     push    rcx                         ; push Cs to stack
 | |
|     push    r10                         ; push address of tansition code on stack
 | |
|     retfq
 | |
| 
 | |
| ; Start of transition code
 | |
| .0:
 | |
|     mov     esp, eax                    ; set up new stack
 | |
|     mov     rax, cr0
 | |
|     btr     eax, 31                     ; Clear CR0.PG
 | |
|     mov     cr0, rax                    ; disable paging and caches
 | |
| 
 | |
|     mov     ebx, edx                    ; save EntryPoint to rbx, for rdmsr will overwrite rdx
 | |
|     mov     ecx, 0xc0000080
 | |
|     rdmsr
 | |
|     and     ah, ~ 1                   ; clear LME
 | |
|     wrmsr
 | |
|     mov     rax, cr4
 | |
|     and     al, ~ (1 << 5)           ; clear PAE
 | |
|     mov     cr4, rax
 | |
|     push    rdi                         ; push Context2
 | |
|     push    rsi                         ; push Context1
 | |
|     call    rbx                         ; transfer control to EntryPoint
 | |
|     hlt                                 ; no one should get here
 | |
| 
 | |
| mTransitionEnd:
 | |
| 
 |