]> git.proxmox.com Git - mirror_edk2.git/blobdiff - IntelFsp2Pkg/FspSecCore/X64/Stack.nasm
IntelFsp2Pkg: FspSecCore support for X64
[mirror_edk2.git] / IntelFsp2Pkg / FspSecCore / X64 / Stack.nasm
diff --git a/IntelFsp2Pkg/FspSecCore/X64/Stack.nasm b/IntelFsp2Pkg/FspSecCore/X64/Stack.nasm
new file mode 100644 (file)
index 0000000..0af7f54
--- /dev/null
@@ -0,0 +1,73 @@
+;------------------------------------------------------------------------------\r
+;\r
+; Copyright (c) 2022, Intel Corporation. All rights reserved.<BR>\r
+; SPDX-License-Identifier: BSD-2-Clause-Patent\r
+;\r
+; Abstract:\r
+;\r
+;   Switch the stack from temporary memory to permanent memory.\r
+;\r
+;------------------------------------------------------------------------------\r
+\r
+    SECTION .text\r
+\r
+;------------------------------------------------------------------------------\r
+; VOID\r
+; EFIAPI\r
+; SecSwitchStack (\r
+;   UINT64   TemporaryMemoryBase,\r
+;   UINT64   PermanentMemoryBase\r
+;   );\r
+;------------------------------------------------------------------------------\r
+global ASM_PFX(SecSwitchStack)\r
+ASM_PFX(SecSwitchStack):\r
+    ;\r
+    ; Save four register: rax, rbx, rcx, rdx\r
+    ;\r
+    push  rax\r
+    push  rbx\r
+    push  rcx\r
+    push  rdx\r
+\r
+    ;\r
+    ; !!CAUTION!! this function address's is pushed into stack after\r
+    ; migration of whole temporary memory, so need save it to permanent\r
+    ; memory at first!\r
+    ;\r
+\r
+    mov   rbx, rcx                 ; Save the first parameter\r
+    mov   rcx, rdx                 ; Save the second parameter\r
+\r
+    ;\r
+    ; Save this function's return address into permanent memory at first.\r
+    ; Then, Fixup the esp point to permanent memory\r
+    ;\r
+    mov   rax, rsp\r
+    sub   rax, rbx\r
+    add   rax, rcx\r
+    mov   rdx, qword [rsp]         ; copy pushed register's value to permanent memory\r
+    mov   qword [rax], rdx\r
+    mov   rdx, qword [rsp + 8]\r
+    mov   qword [rax + 8], rdx\r
+    mov   rdx, qword [rsp + 16]\r
+    mov   qword [rax + 16], rdx\r
+    mov   rdx, qword [rsp + 24]\r
+    mov   qword [rax + 24], rdx\r
+    mov   rdx, qword [rsp + 32]    ; Update this function's return address into permanent memory\r
+    mov   qword [rax + 32], rdx\r
+    mov   rsp, rax                 ; From now, rsp is pointed to permanent memory\r
+\r
+    ;\r
+    ; Fixup the rbp point to permanent memory\r
+    ;\r
+    mov   rax, rbp\r
+    sub   rax, rbx\r
+    add   rax, rcx\r
+    mov   rbp, rax                 ; From now, rbp is pointed to permanent memory\r
+\r
+    pop   rdx\r
+    pop   rcx\r
+    pop   rbx\r
+    pop   rax\r
+    ret\r
+\r