]> git.proxmox.com Git - mirror_edk2.git/blobdiff - UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.nasm
UefiCpuPkg PiSmmCpuDxeSmm: Update SmiEntry function run the same position
[mirror_edk2.git] / UefiCpuPkg / PiSmmCpuDxeSmm / X64 / SmiEntry.nasm
index 315d0f8670757f6cdb93e5a5d0ace0c03971cb10..414b5ab5fa9e014a5aaa9534c10c3c6588323733 100644 (file)
@@ -173,9 +173,6 @@ SmiHandlerIdtrAbsAddr:
     mov     gs, eax\r
     mov     ax, [rbx + DSC_SS]\r
     mov     ss, eax\r
     mov     gs, eax\r
     mov     ax, [rbx + DSC_SS]\r
     mov     ss, eax\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
 \r
 _SmiHandler:\r
     mov     rbx, [rsp + 0x8]             ; rcx <- CpuIndex\r
@@ -189,13 +186,19 @@ _SmiHandler:
     add     rsp, -0x20\r
 \r
     mov     rcx, rbx\r
     add     rsp, -0x20\r
 \r
     mov     rcx, rbx\r
-    call    ASM_PFX(CpuSmmDebugEntry)\r
+    mov     rax, strict qword 0         ;   call    ASM_PFX(CpuSmmDebugEntry)\r
+CpuSmmDebugEntryAbsAddr:\r
+    call    rax\r
 \r
     mov     rcx, rbx\r
 \r
     mov     rcx, rbx\r
-    call    ASM_PFX(SmiRendezvous)\r
+    mov     rax, strict qword 0         ;   call    ASM_PFX(SmiRendezvous)\r
+SmiRendezvousAbsAddr:\r
+    call    rax\r
 \r
     mov     rcx, rbx\r
 \r
     mov     rcx, rbx\r
-    call    ASM_PFX(CpuSmmDebugExit)\r
+    mov     rax, strict qword 0         ;   call    ASM_PFX(CpuSmmDebugExit)\r
+CpuSmmDebugExitAbsAddr:\r
+    call    rax\r
 \r
     add     rsp, 0x20\r
 \r
 \r
     add     rsp, 0x20\r
 \r
@@ -206,7 +209,8 @@ _SmiHandler:
 \r
     add     rsp, 0x200\r
 \r
 \r
     add     rsp, 0x200\r
 \r
-    lea     rax, [ASM_PFX(mXdSupported)]\r
+    mov     rax, strict qword 0         ;       lea     rax, [ASM_PFX(mXdSupported)]\r
+mXdSupportedAbsAddr:\r
     mov     al, [rax]\r
     cmp     al, 0\r
     jz      .1\r
     mov     al, [rax]\r
     cmp     al, 0\r
     jz      .1\r
@@ -224,13 +228,33 @@ _SmiHandler:
 \r
 ASM_PFX(gcSmiHandlerSize)    DW      $ - _SmiEntryPoint\r
 \r
 \r
 ASM_PFX(gcSmiHandlerSize)    DW      $ - _SmiEntryPoint\r
 \r
+;\r
+; Retrieve the address and fill it into mov opcode.\r
+;\r
+; It is called in the driver entry point first.\r
+; It is used to fix up the real address in mov opcode.\r
+; Then, after the code logic is copied to the different location,\r
+; the code can also run.\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
 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
+    lea    rax, [ASM_PFX(CpuSmmDebugEntry)]\r
+    lea    rcx, [CpuSmmDebugEntryAbsAddr]\r
+    mov    qword [rcx - 8], rax\r
+\r
+    lea    rax, [ASM_PFX(SmiRendezvous)]\r
+    lea    rcx, [SmiRendezvousAbsAddr]\r
+    mov    qword [rcx - 8], rax\r
+\r
+    lea    rax, [ASM_PFX(CpuSmmDebugExit)]\r
+    lea    rcx, [CpuSmmDebugExitAbsAddr]\r
+    mov    qword [rcx - 8], rax\r
+\r
+    lea    rax, [ASM_PFX(mXdSupported)]\r
+    lea    rcx, [mXdSupportedAbsAddr]\r
     mov    qword [rcx - 8], rax\r
     ret\r
     mov    qword [rcx - 8], rax\r
     ret\r