3 Copyright (c) 2004 - 2014, Intel Corporation. All rights reserved.<BR>
5 SPDX-License-Identifier: BSD-2-Clause-Patent
17 ScriptTableSave module at run time
21 #include "SmmScriptSave.h"
29 IN EFI_SMM_SCRIPT_TABLE
*ScriptTable
,
34 BootScriptPciCfgWrite (
35 IN EFI_SMM_SCRIPT_TABLE
*ScriptTable
,
41 IN UINT8
*Destination
,
47 // Function implementations
51 IN OUT EFI_SMM_SCRIPT_TABLE
*ScriptTable
,
60 if (ScriptTable
== NULL
) {
61 return EFI_INVALID_PARAMETER
;
65 // Build script according to opcode
69 case EFI_BOOT_SCRIPT_IO_WRITE_OPCODE
:
70 VA_START(Marker
, OpCode
);
71 Status
= BootScriptIoWrite (ScriptTable
, Marker
);
75 case EFI_BOOT_SCRIPT_PCI_CONFIG_WRITE_OPCODE
:
76 VA_START(Marker
, OpCode
);
77 Status
= BootScriptPciCfgWrite(ScriptTable
, Marker
);
91 SmmBootScriptCreateTable (
92 IN OUT EFI_SMM_SCRIPT_TABLE
*ScriptTable
,
96 BOOT_SCRIPT_POINTERS Script
;
99 if (ScriptTable
== NULL
) {
100 return EFI_INVALID_PARAMETER
;
103 Buffer
= (UINT8
*) ((UINTN
)(*ScriptTable
));
109 Script
.TableInfo
->OpCode
= EFI_BOOT_SCRIPT_TABLE_OPCODE
;
110 Script
.TableInfo
->Length
= sizeof(EFI_BOOT_SCRIPT_TABLE_HEADER
);
111 Script
.TableInfo
->TableLength
= sizeof(EFI_BOOT_SCRIPT_TABLE_HEADER
);
114 // Update current table pointer
116 *ScriptTable
= *ScriptTable
+ sizeof(EFI_BOOT_SCRIPT_TABLE_HEADER
);
122 SmmBootScriptCloseTable (
123 IN EFI_SMM_SCRIPT_TABLE ScriptTableBase
,
124 IN EFI_SMM_SCRIPT_TABLE ScriptTablePtr
,
128 BOOT_SCRIPT_POINTERS Script
;
131 // Add final "termination" node to script table
133 Script
.Raw
= (UINT8
*) ((UINTN
)ScriptTablePtr
);
134 Script
.Terminate
->OpCode
= EFI_BOOT_SCRIPT_TERMINATE_OPCODE
;
135 Script
.Terminate
->Length
= sizeof (EFI_BOOT_SCRIPT_TERMINATE
);
136 ScriptTablePtr
+= sizeof (EFI_BOOT_SCRIPT_TERMINATE
);
140 // Update Table Header
142 Script
.Raw
= (UINT8
*) ((UINTN
)ScriptTableBase
);
143 Script
.TableInfo
->OpCode
= EFI_BOOT_SCRIPT_TABLE_OPCODE
;
144 Script
.TableInfo
->Length
= sizeof (EFI_BOOT_SCRIPT_TABLE_HEADER
);
145 Script
.TableInfo
->TableLength
= (UINT32
)(ScriptTablePtr
- ScriptTableBase
);
153 IN EFI_SMM_SCRIPT_TABLE
*ScriptTable
,
157 BOOT_SCRIPT_POINTERS Script
;
158 EFI_BOOT_SCRIPT_WIDTH Width
;
165 Width
= VA_ARG(Marker
, EFI_BOOT_SCRIPT_WIDTH
);
166 Address
= VA_ARG(Marker
, UINTN
);
167 Count
= VA_ARG(Marker
, UINTN
);
168 Buffer
= VA_ARG(Marker
, UINT8
*);
170 WidthInByte
= (UINT8
)(0x01 << (Width
& 0x03));
171 Script
.Raw
= (UINT8
*) ((UINTN
)(*ScriptTable
));
172 NodeLength
= sizeof (EFI_BOOT_SCRIPT_IO_WRITE
) + (WidthInByte
* Count
);
177 Script
.IoWrite
->OpCode
= EFI_BOOT_SCRIPT_IO_WRITE_OPCODE
;
178 Script
.IoWrite
->Length
= (UINT8
)(NodeLength
);
179 Script
.IoWrite
->Width
= Width
;
180 Script
.IoWrite
->Address
= Address
;
181 Script
.IoWrite
->Count
= (UINT32
)Count
;
183 (UINT8
*)(Script
.Raw
+ sizeof (EFI_BOOT_SCRIPT_IO_WRITE
)),
189 // Update Script table pointer
191 *ScriptTable
= *ScriptTable
+ NodeLength
;
197 BootScriptPciCfgWrite (
198 IN EFI_SMM_SCRIPT_TABLE
*ScriptTable
,
202 BOOT_SCRIPT_POINTERS Script
;
203 EFI_BOOT_SCRIPT_WIDTH Width
;
210 Width
= VA_ARG(Marker
, EFI_BOOT_SCRIPT_WIDTH
);
211 Address
= VA_ARG(Marker
, UINT64
);
212 Count
= VA_ARG(Marker
, UINTN
);
213 Buffer
= VA_ARG(Marker
, UINT8
*);
215 WidthInByte
= (UINT8
)(0x01 << (Width
& 0x03));
216 Script
.Raw
= (UINT8
*) ((UINTN
)(*ScriptTable
));
217 NodeLength
= sizeof (EFI_BOOT_SCRIPT_PCI_CONFIG_WRITE
) + (WidthInByte
* Count
);
222 Script
.PciWrite
->OpCode
= EFI_BOOT_SCRIPT_PCI_CONFIG_WRITE_OPCODE
;
223 Script
.PciWrite
->Length
= (UINT8
)(NodeLength
);
224 Script
.PciWrite
->Width
= Width
;
225 Script
.PciWrite
->Address
= Address
;
226 Script
.PciWrite
->Count
= (UINT32
)Count
;
228 (UINT8
*)(Script
.Raw
+ sizeof (EFI_BOOT_SCRIPT_PCI_CONFIG_WRITE
)),
234 // Update Script table pointer
236 *ScriptTable
= *ScriptTable
+ NodeLength
;
242 IN UINT8
*Destination
,
249 for (Index
= 0; Index
< ByteCount
; Index
++, Destination
++, Source
++) {
250 *Destination
= *Source
;