diff options
author | raywu <raywu0301@gmail.com> | 2018-06-15 00:00:50 +0800 |
---|---|---|
committer | raywu <raywu0301@gmail.com> | 2018-06-15 00:00:50 +0800 |
commit | b7c51c9cf4864df6aabb99a1ae843becd577237c (patch) | |
tree | eebe9b0d0ca03062955223097e57da84dd618b9a /Core/CPU/IA32/SwitchCoreStacks.asm | |
download | zprj-master.tar.xz |
Diffstat (limited to 'Core/CPU/IA32/SwitchCoreStacks.asm')
-rw-r--r-- | Core/CPU/IA32/SwitchCoreStacks.asm | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/Core/CPU/IA32/SwitchCoreStacks.asm b/Core/CPU/IA32/SwitchCoreStacks.asm new file mode 100644 index 0000000..dbb664d --- /dev/null +++ b/Core/CPU/IA32/SwitchCoreStacks.asm @@ -0,0 +1,104 @@ + TITLE SwitchCoreStacks.asm: Core stack switching routine + +;------------------------------------------------------------------------------ +;Copyright (c) 2004, Intel Corporation +;All rights reserved. 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: +; +; SwitchCoreStacks.asm +; +;Abstract: +; +; Core stack switching routine, invoked when real system memory is +; discovered and installed. +; +;------------------------------------------------------------------------------ + + .686P + .XMM + .MODEL SMALL + .CODE + + +include token.equ + +AsmWriteMm7 PROTO C + +AsmWriteMm7 PROC C +;------------------------------------------------------------------------------ +; VOID +; EFIAPI +; AsmWriteMm7 ( +; IN UINT64 Value +; ); +;------------------------------------------------------------------------------ + movq mm7, [esp + 4] + ret +AsmWriteMm7 ENDP + +IF MKF_PI_SPECIFICATION_VERSION GE 00010000h +SwitchCoreStacks PROTO C EntryPoint: DWORD, Parameter1: DWORD, Parameter2: DWORD, Parameter3: DWORD, NewStack: DWORD + +SwitchCoreStacks PROC C EntryPoint: DWORD, Parameter1: DWORD, Parameter2: DWORD, Parameter3: DWORD, NewStack: DWORD +ELSE +SwitchCoreStacks PROTO C EntryPoint: DWORD, Parameter1: DWORD, Parameter2: DWORD, NewStack: DWORD + +SwitchCoreStacks PROC C EntryPoint: DWORD, Parameter1: DWORD, Parameter2: DWORD, NewStack: DWORD +ENDIF + +;------------------------------------------------------------------------------ +; VOID +; SwitchCoreStacks ( +; IN VOID *EntryPoint, +; IN UINTN Parameter1, +; IN UINTN Parameter2, +; IN UINTN Parameter3, +; IN VOID *NewStack +; ) +; +; Routine Description: +; +; Routine for PEI switching stacks. +; +; Arguments: +; +; EntryPoint - Entry point with new stack. +; Parameter1 - First parameter for entry point. +; Parameter2 - Second parameter for entry point. +; Parameter3 - Third parameter for entry point. +; NewStack - Pointer to new stack. +; +; Returns: +; +; None +; +;---------------------------------------------------- + + mov ebx, Parameter1 + mov edx, Parameter2 +IF MKF_PI_SPECIFICATION_VERSION GE 00010000h + mov eax, Parameter3 +ENDIF + mov ecx, EntryPoint + mov esp, NewStack + + ; First push Parameter3, and then Parameter2 ,at last Parameter1. +IF MKF_PI_SPECIFICATION_VERSION GE 00010000h + push eax +ENDIF + push edx + push ebx + call ecx + + ret + +SwitchCoreStacks ENDP + +END |