| ;------------------------------------------------------------------------------ | |
| ; | |
| ; Copyright (c) 2013, Intel Corporation. All rights reserved.<BR> | |
| ; 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 | |
| ; http://opensource.org/licenses/bsd-license.php | |
| ; | |
| ; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
| ; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
| ; | |
| ; Module Name: | |
| ; | |
| ; Stack.asm | |
| ; | |
| ; Abstract: | |
| ; | |
| ; Switch the stack from temporary memory to permenent memory. | |
| ; | |
| ;------------------------------------------------------------------------------ | |
| .code | |
| ;------------------------------------------------------------------------------ | |
| ; VOID | |
| ; EFIAPI | |
| ; SecSwitchStack ( | |
| ; UINT32 TemporaryMemoryBase, | |
| ; UINT32 PermenentMemoryBase | |
| ; ); | |
| ;------------------------------------------------------------------------------ | |
| SecSwitchStack PROC | |
| mov [rsp + 08h], rcx | |
| mov [rsp + 10h], rdx | |
| ; | |
| ; Save three register: eax, ebx, ecx | |
| ; | |
| push rax | |
| push rbx | |
| push rcx | |
| push rdx | |
| ; | |
| ; !!CAUTION!! this function address's is pushed into stack after | |
| ; migration of whole temporary memory, so need save it to permenent | |
| ; memory at first! | |
| ; | |
| mov rbx, [rsp + 28h] ; Save the first parameter | |
| mov rcx, [rsp + 30h] ; Save the second parameter | |
| ; | |
| ; Save this function's return address into permenent memory at first. | |
| ; Then, Fixup the esp point to permenent memory | |
| ; | |
| mov rax, rsp | |
| sub rax, rbx | |
| add rax, rcx | |
| mov rdx, qword ptr [rsp] ; copy pushed register's value to permenent memory | |
| mov qword ptr [rax], rdx | |
| mov rdx, qword ptr [rsp + 8] | |
| mov qword ptr [rax + 8], rdx | |
| mov rdx, qword ptr [rsp + 10h] | |
| mov qword ptr [rax + 10h], rdx | |
| mov rdx, qword ptr [rsp + 18h] | |
| mov qword ptr [rax + 18h], rdx | |
| mov rdx, qword ptr [rsp + 20h] ; Update this function's return address into permenent memory | |
| mov qword ptr [rax + 20h], rdx | |
| mov rsp, rax ; From now, esp is pointed to permenent memory | |
| ; | |
| ; Fixup the ebp point to permenent memory | |
| ; | |
| mov rax, rbp | |
| sub rax, rbx | |
| add rax, rcx | |
| mov rbp, rax ; From now, ebp is pointed to permenent memory | |
| pop rdx | |
| pop rcx | |
| pop rbx | |
| pop rax | |
| ret | |
| SecSwitchStack ENDP | |
| ;------------------------------------------------------------------------------ | |
| ; VOID | |
| ; EFIAPI | |
| ; PeiSwitchStacks ( | |
| ; IN SWITCH_STACK_ENTRY_POINT EntryPoint, | |
| ; IN VOID *Context1, OPTIONAL | |
| ; IN VOID *Context2, OPTIONAL | |
| ; IN VOID *Context3, OPTIONAL | |
| ; IN VOID *NewStack | |
| ; ) | |
| ;------------------------------------------------------------------------------ | |
| PeiSwitchStacks PROC | |
| mov rax, rcx | |
| mov rcx, rdx | |
| mov rdx, r8 | |
| mov r8, r9 | |
| mov rsp, [rsp + 28h] | |
| sub rsp, 20h | |
| call rax | |
| jmp $ | |
| ret | |
| PeiSwitchStacks ENDP | |
| END |