X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=UefiCpuPkg%2FPiSmmCpuDxeSmm%2FX64%2FSmiEntry.nasm;h=9cfa8e7fc8f49c56057d2502a2b095e2e35d9701;hp=c3c094ff9f7e9882807e71038280b3b801c63c4c;hb=fc504fdea7fe92bfa88e15f50e64b4d76d4f75fd;hpb=717fb60443fbaedfab9a37fd186361b3b9e1ecfe diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.nasm b/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.nasm index c3c094ff9f..9cfa8e7fc8 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.nasm +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.nasm @@ -1,5 +1,5 @@ ;------------------------------------------------------------------------------ ; -; Copyright (c) 2016, Intel Corporation. All rights reserved.
+; Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.
; This program and the accompanying materials ; are licensed and made available under the terms and conditions of the BSD License ; which accompanies this distribution. The full text of the license may be found at @@ -53,9 +53,9 @@ extern ASM_PFX(gSmiHandlerIdtr) extern ASM_PFX(CpuSmmDebugEntry) extern ASM_PFX(CpuSmmDebugExit) -global ASM_PFX(gSmbase) +global ASM_PFX(gPatchSmbase) global ASM_PFX(mXdSupported) -global ASM_PFX(gSmiStack) +global ASM_PFX(gPatchSmiStack) global ASM_PFX(gSmiCr3) global ASM_PFX(gcSmiHandlerTemplate) global ASM_PFX(gcSmiHandlerSize) @@ -75,8 +75,8 @@ _SmiEntryPoint: o32 lgdt [cs:bx] ; lgdt fword ptr cs:[bx] mov ax, PROTECT_MODE_CS mov [cs:bx-0x2],ax - DB 0x66, 0xbf ; mov edi, SMBASE -ASM_PFX(gSmbase): DD 0 + mov edi, strict dword 0 ; source operand will be patched +ASM_PFX(gPatchSmbase): lea eax, [edi + (@ProtectedMode - _SmiEntryPoint) + 0x8000] mov [cs:bx-0x6],eax mov ebx, cr0 @@ -96,8 +96,8 @@ o16 mov es, ax o16 mov fs, ax o16 mov gs, ax o16 mov ss, ax - DB 0xbc ; mov esp, imm32 -ASM_PFX(gSmiStack): DD 0 + mov esp, strict dword 0 ; source operand will be patched +ASM_PFX(gPatchSmiStack): jmp ProtFlatMode BITS 64 @@ -158,7 +158,8 @@ Base: mov cr0, rbx retf @LongMode: ; long mode (64-bit code) starts here - mov rax, ASM_PFX(gSmiHandlerIdtr) + mov rax, strict qword 0 ; mov rax, ASM_PFX(gSmiHandlerIdtr) +SmiHandlerIdtrAbsAddr: lidt [rax] lea ebx, [rdi + DSC_OFFSET] mov ax, [rbx + DSC_DS] @@ -169,7 +170,9 @@ Base: mov gs, eax mov ax, [rbx + DSC_SS] mov ss, eax -; jmp _SmiHandler ; instruction is not needed + mov rax, strict qword 0 ; mov rax, _SmiHandler +_SmiHandlerAbsAddr: + jmp rax _SmiHandler: mov rbx, [rsp + 0x8] ; rcx <- CpuIndex @@ -184,16 +187,13 @@ _SmiHandler: add rsp, -0x20 mov rcx, rbx - mov rax, CpuSmmDebugEntry - call rax + call ASM_PFX(CpuSmmDebugEntry) mov rcx, rbx - mov rax, SmiRendezvous ; rax <- absolute addr of SmiRedezvous - call rax + call ASM_PFX(SmiRendezvous) mov rcx, rbx - mov rax, CpuSmmDebugExit - call rax + call ASM_PFX(CpuSmmDebugExit) add rsp, 0x20 @@ -205,7 +205,7 @@ _SmiHandler: add rsp, 0x200 - mov rax, ASM_PFX(mXdSupported) + lea rax, [ASM_PFX(mXdSupported)] mov al, [rax] cmp al, 0 jz .1 @@ -220,5 +220,15 @@ _SmiHandler: .1: rsm -gcSmiHandlerSize DW $ - _SmiEntryPoint +ASM_PFX(gcSmiHandlerSize) DW $ - _SmiEntryPoint +global ASM_PFX(PiSmmCpuSmiEntryFixupAddress) +ASM_PFX(PiSmmCpuSmiEntryFixupAddress): + lea rax, [ASM_PFX(gSmiHandlerIdtr)] + lea rcx, [SmiHandlerIdtrAbsAddr] + mov qword [rcx - 8], rax + + lea rax, [_SmiHandler] + lea rcx, [_SmiHandlerAbsAddr] + mov qword [rcx - 8], rax + ret