1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
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
|