]> git.proxmox.com Git - mirror_edk2.git/blame - Vlv2TbltDevicePkg/PlatformSmm/SmmScriptSave.c
ArmPkg/CompilerIntrinsicsLib: Add uread, uwrite GCC assembly sources
[mirror_edk2.git] / Vlv2TbltDevicePkg / PlatformSmm / SmmScriptSave.c
CommitLineData
3cbfba02
DW
1/** @file\r
2\r
3 Copyright (c) 2004 - 2014, Intel Corporation. All rights reserved.<BR>\r
4 \r\r
9dc8036d
MK
5 SPDX-License-Identifier: BSD-2-Clause-Patent\r
6\r
3cbfba02
DW
7 \r\r
8\r
9\r
10Module Name:\r
11\r
12\r
13 SmmScriptSave.c\r
14\r
15Abstract:\r
16\r
17 ScriptTableSave module at run time\r
18\r
19--*/\r
20\r
21#include "SmmScriptSave.h"\r
22\r
23//\r
24// internal functions\r
25//\r
26\r
27EFI_STATUS\r
28BootScriptIoWrite (\r
29 IN EFI_SMM_SCRIPT_TABLE *ScriptTable,\r
30 IN VA_LIST Marker\r
31 );\r
32\r
33EFI_STATUS\r
34BootScriptPciCfgWrite (\r
35 IN EFI_SMM_SCRIPT_TABLE *ScriptTable,\r
36 IN VA_LIST Marker\r
37 );\r
38\r
39VOID\r
40SmmCopyMem (\r
41 IN UINT8 *Destination,\r
42 IN UINT8 *Source,\r
43 IN UINTN ByteCount\r
44 );\r
45\r
46//\r
47// Function implementations\r
48//\r
49EFI_STATUS\r
50SmmBootScriptWrite (\r
51 IN OUT EFI_SMM_SCRIPT_TABLE *ScriptTable,\r
52 IN UINTN Type,\r
53 IN UINT16 OpCode,\r
54 ...\r
55 )\r
56{\r
57 EFI_STATUS Status;\r
58 VA_LIST Marker;\r
59\r
60 if (ScriptTable == NULL) {\r
61 return EFI_INVALID_PARAMETER;\r
62 }\r
63\r
64 //\r
65 // Build script according to opcode\r
66 //\r
67 switch ( OpCode ) {\r
68\r
69 case EFI_BOOT_SCRIPT_IO_WRITE_OPCODE:\r
70 VA_START(Marker, OpCode);\r
71 Status = BootScriptIoWrite (ScriptTable, Marker);\r
72 VA_END(Marker);\r
73 break;\r
74\r
75 case EFI_BOOT_SCRIPT_PCI_CONFIG_WRITE_OPCODE:\r
76 VA_START(Marker, OpCode);\r
77 Status = BootScriptPciCfgWrite(ScriptTable, Marker);\r
78 VA_END(Marker);\r
79 break;\r
80\r
81 default:\r
82 Status = EFI_SUCCESS;\r
83 break;\r
84 }\r
85\r
86 return Status;\r
87}\r
88\r
89\r
90EFI_STATUS\r
91SmmBootScriptCreateTable (\r
92 IN OUT EFI_SMM_SCRIPT_TABLE *ScriptTable,\r
93 IN UINTN Type\r
94 )\r
95{\r
96 BOOT_SCRIPT_POINTERS Script;\r
97 UINT8 *Buffer;\r
98\r
99 if (ScriptTable == NULL) {\r
100 return EFI_INVALID_PARAMETER;\r
101 }\r
102\r
103 Buffer = (UINT8*) ((UINTN)(*ScriptTable));\r
104\r
105 //\r
106 // Fill Table Header\r
107 //\r
108 Script.Raw = Buffer;\r
109 Script.TableInfo->OpCode = EFI_BOOT_SCRIPT_TABLE_OPCODE;\r
110 Script.TableInfo->Length = sizeof(EFI_BOOT_SCRIPT_TABLE_HEADER);\r
111 Script.TableInfo->TableLength = sizeof(EFI_BOOT_SCRIPT_TABLE_HEADER);\r
112\r
113 //\r
114 // Update current table pointer\r
115 //\r
116 *ScriptTable = *ScriptTable + sizeof(EFI_BOOT_SCRIPT_TABLE_HEADER);\r
117 return EFI_SUCCESS;\r
118}\r
119\r
120\r
121EFI_STATUS\r
122SmmBootScriptCloseTable (\r
123 IN EFI_SMM_SCRIPT_TABLE ScriptTableBase,\r
124 IN EFI_SMM_SCRIPT_TABLE ScriptTablePtr,\r
125 IN UINTN Type\r
126 )\r
127{\r
128 BOOT_SCRIPT_POINTERS Script;\r
129\r
130 //\r
131 // Add final "termination" node to script table\r
132 //\r
133 Script.Raw = (UINT8*) ((UINTN)ScriptTablePtr);\r
134 Script.Terminate->OpCode = EFI_BOOT_SCRIPT_TERMINATE_OPCODE;\r
135 Script.Terminate->Length = sizeof (EFI_BOOT_SCRIPT_TERMINATE);\r
136 ScriptTablePtr += sizeof (EFI_BOOT_SCRIPT_TERMINATE);\r
137\r
138\r
139 //\r
140 // Update Table Header\r
141 //\r
142 Script.Raw = (UINT8*) ((UINTN)ScriptTableBase);\r
143 Script.TableInfo->OpCode = EFI_BOOT_SCRIPT_TABLE_OPCODE;\r
144 Script.TableInfo->Length = sizeof (EFI_BOOT_SCRIPT_TABLE_HEADER);\r
145 Script.TableInfo->TableLength = (UINT32)(ScriptTablePtr - ScriptTableBase);\r
146\r
147 return EFI_SUCCESS;\r
148}\r
149\r
150\r
151EFI_STATUS\r
152BootScriptIoWrite (\r
153 IN EFI_SMM_SCRIPT_TABLE *ScriptTable,\r
154 IN VA_LIST Marker\r
155 )\r
156{\r
157 BOOT_SCRIPT_POINTERS Script;\r
158 EFI_BOOT_SCRIPT_WIDTH Width;\r
159 UINTN Address;\r
160 UINTN Count;\r
161 UINT8 *Buffer;\r
162 UINTN NodeLength;\r
163 UINT8 WidthInByte;\r
164\r
165 Width = VA_ARG(Marker, EFI_BOOT_SCRIPT_WIDTH);\r
166 Address = VA_ARG(Marker, UINTN);\r
167 Count = VA_ARG(Marker, UINTN);\r
168 Buffer = VA_ARG(Marker, UINT8*);\r
169\r
170 WidthInByte = (UINT8)(0x01 << (Width & 0x03));\r
171 Script.Raw = (UINT8*) ((UINTN)(*ScriptTable));\r
172 NodeLength = sizeof (EFI_BOOT_SCRIPT_IO_WRITE) + (WidthInByte * Count);\r
173\r
174 //\r
175 // Build script data\r
176 //\r
177 Script.IoWrite->OpCode = EFI_BOOT_SCRIPT_IO_WRITE_OPCODE;\r
178 Script.IoWrite->Length = (UINT8)(NodeLength);\r
179 Script.IoWrite->Width = Width;\r
180 Script.IoWrite->Address = Address;\r
181 Script.IoWrite->Count = (UINT32)Count;\r
182 SmmCopyMem (\r
183 (UINT8*)(Script.Raw + sizeof (EFI_BOOT_SCRIPT_IO_WRITE)),\r
184 Buffer,\r
185 WidthInByte * Count\r
186 );\r
187\r
188 //\r
189 // Update Script table pointer\r
190 //\r
191 *ScriptTable = *ScriptTable + NodeLength;\r
192 return EFI_SUCCESS;\r
193}\r
194\r
195\r
196EFI_STATUS\r
197BootScriptPciCfgWrite (\r
198 IN EFI_SMM_SCRIPT_TABLE *ScriptTable,\r
199 IN VA_LIST Marker\r
200 )\r
201{\r
202 BOOT_SCRIPT_POINTERS Script;\r
203 EFI_BOOT_SCRIPT_WIDTH Width;\r
204 UINT64 Address;\r
205 UINTN Count;\r
206 UINT8 *Buffer;\r
207 UINTN NodeLength;\r
208 UINT8 WidthInByte;\r
209\r
210 Width = VA_ARG(Marker, EFI_BOOT_SCRIPT_WIDTH);\r
211 Address = VA_ARG(Marker, UINT64);\r
212 Count = VA_ARG(Marker, UINTN);\r
213 Buffer = VA_ARG(Marker, UINT8*);\r
214\r
215 WidthInByte = (UINT8)(0x01 << (Width & 0x03));\r
216 Script.Raw = (UINT8*) ((UINTN)(*ScriptTable));\r
217 NodeLength = sizeof (EFI_BOOT_SCRIPT_PCI_CONFIG_WRITE) + (WidthInByte * Count);\r
218\r
219 //\r
220 // Build script data\r
221 //\r
222 Script.PciWrite->OpCode = EFI_BOOT_SCRIPT_PCI_CONFIG_WRITE_OPCODE;\r
223 Script.PciWrite->Length = (UINT8)(NodeLength);\r
224 Script.PciWrite->Width = Width;\r
225 Script.PciWrite->Address = Address;\r
226 Script.PciWrite->Count = (UINT32)Count;\r
227 SmmCopyMem (\r
228 (UINT8*)(Script.Raw + sizeof (EFI_BOOT_SCRIPT_PCI_CONFIG_WRITE)),\r
229 Buffer,\r
230 WidthInByte * Count\r
231 );\r
232\r
233 //\r
234 // Update Script table pointer\r
235 //\r
236 *ScriptTable = *ScriptTable + NodeLength;\r
237 return EFI_SUCCESS;\r
238}\r
239\r
240VOID\r
241SmmCopyMem (\r
242 IN UINT8 *Destination,\r
243 IN UINT8 *Source,\r
244 IN UINTN ByteCount\r
245 )\r
246{\r
247 UINTN Index;\r
248\r
249 for (Index = 0; Index < ByteCount; Index++, Destination++, Source++) {\r
250 *Destination = *Source;\r
251 }\r
252}\r