;------------------------------------------------------------------------------ ;\r
-; Copyright (c) 2016 - 2017, 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
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, ASM_PFX(CpuSmmDebugEntry)\r
- call rax\r
+ call ASM_PFX(CpuSmmDebugEntry)\r
\r
mov rcx, rbx\r
- mov rax, ASM_PFX(SmiRendezvous) ; rax <- absolute addr of SmiRedezvous\r
- call rax\r
+ call ASM_PFX(SmiRendezvous)\r
\r
mov rcx, rbx\r
- mov rax, ASM_PFX(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
\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