;------------------------------------------------------------------------------ ; ; 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