;------------------------------------------------------------------------------ ;\r
-; Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>\r
+; Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR>\r
; This program and the accompanying materials\r
; are licensed and made available under the terms and conditions of the BSD License\r
; which accompanies this distribution. The full text of the license may be found at\r
extern ASM_PFX(CpuSmmDebugEntry)\r
extern ASM_PFX(CpuSmmDebugExit)\r
\r
-global ASM_PFX(gSmbase)\r
+global ASM_PFX(gPatchSmbase)\r
global ASM_PFX(mXdSupported)\r
global ASM_PFX(gSmiStack)\r
global ASM_PFX(gSmiCr3)\r
o32 lgdt [cs:bx] ; lgdt fword ptr cs:[bx]\r
mov ax, PROTECT_MODE_CS\r
mov [cs:bx-0x2],ax\r
- DB 0x66, 0xbf ; mov edi, SMBASE\r
-ASM_PFX(gSmbase): DD 0\r
+ mov edi, strict dword 0 ; source operand will be patched\r
+ASM_PFX(gPatchSmbase):\r
lea eax, [edi + (@ProtectedMode - _SmiEntryPoint) + 0x8000]\r
mov [cs:bx-0x6],eax\r
mov ebx, cr0\r
mov cr0, rbx\r
retf\r
@LongMode: ; long mode (64-bit code) starts here\r
- mov rax, ASM_PFX(gSmiHandlerIdtr)\r
+ mov rax, strict qword 0 ; mov rax, ASM_PFX(gSmiHandlerIdtr)\r
+SmiHandlerIdtrAbsAddr:\r
lidt [rax]\r
lea ebx, [rdi + DSC_OFFSET]\r
mov ax, [rbx + DSC_DS]\r
mov gs, eax\r
mov ax, [rbx + DSC_SS]\r
mov ss, eax\r
-; jmp _SmiHandler ; instruction is not needed\r
+ mov rax, strict qword 0 ; mov rax, _SmiHandler\r
+_SmiHandlerAbsAddr:\r
+ jmp rax\r
\r
_SmiHandler:\r
mov rbx, [rsp + 0x8] ; rcx <- CpuIndex\r
add rsp, -0x20\r
\r
mov rcx, rbx\r
- mov rax, CpuSmmDebugEntry\r
- call rax\r
+ call ASM_PFX(CpuSmmDebugEntry)\r
\r
mov rcx, rbx\r
- mov rax, SmiRendezvous ; rax <- absolute addr of SmiRedezvous\r
- call rax\r
+ call ASM_PFX(SmiRendezvous)\r
\r
mov rcx, rbx\r
- mov rax, CpuSmmDebugExit\r
- call rax\r
+ call ASM_PFX(CpuSmmDebugExit)\r
\r
add rsp, 0x20\r
\r
\r
add rsp, 0x200\r
\r
- mov rax, ASM_PFX(mXdSupported)\r
+ lea rax, [ASM_PFX(mXdSupported)]\r
mov al, [rax]\r
cmp al, 0\r
jz .1\r
.1:\r
rsm\r
\r
-gcSmiHandlerSize DW $ - _SmiEntryPoint\r
+ASM_PFX(gcSmiHandlerSize) DW $ - _SmiEntryPoint\r
\r
+global ASM_PFX(PiSmmCpuSmiEntryFixupAddress)\r
+ASM_PFX(PiSmmCpuSmiEntryFixupAddress):\r
+ lea rax, [ASM_PFX(gSmiHandlerIdtr)]\r
+ lea rcx, [SmiHandlerIdtrAbsAddr]\r
+ mov qword [rcx - 8], rax\r
+\r
+ lea rax, [_SmiHandler]\r
+ lea rcx, [_SmiHandlerAbsAddr]\r
+ mov qword [rcx - 8], rax\r
+ ret\r