S3SaveState.c revision bdfde4623daff97f8f796a89329048ece94d4be9
1bdfde4623daff97f8f796a89329048ece94d4be9jljusten/** @file
2bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Implementation for S3 Boot Script Saver state driver.
3bdfde4623daff97f8f796a89329048ece94d4be9jljusten
4bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
5bdfde4623daff97f8f796a89329048ece94d4be9jljusten
6bdfde4623daff97f8f796a89329048ece94d4be9jljusten  This program and the accompanying materials
7bdfde4623daff97f8f796a89329048ece94d4be9jljusten  are licensed and made available under the terms and conditions
8bdfde4623daff97f8f796a89329048ece94d4be9jljusten  of the BSD License which accompanies this distribution.  The
9bdfde4623daff97f8f796a89329048ece94d4be9jljusten  full text of the license may be found at
10bdfde4623daff97f8f796a89329048ece94d4be9jljusten  http://opensource.org/licenses/bsd-license.php
11bdfde4623daff97f8f796a89329048ece94d4be9jljusten
12bdfde4623daff97f8f796a89329048ece94d4be9jljusten  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
13bdfde4623daff97f8f796a89329048ece94d4be9jljusten  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
14bdfde4623daff97f8f796a89329048ece94d4be9jljusten
15bdfde4623daff97f8f796a89329048ece94d4be9jljusten**/
16bdfde4623daff97f8f796a89329048ece94d4be9jljusten#include "InternalS3SaveState.h"
17bdfde4623daff97f8f796a89329048ece94d4be9jljusten
18bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFI_HANDLE                    mHandle = NULL;
19bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFI_S3_SAVE_STATE_PROTOCOL    mS3SaveState = {
20bdfde4623daff97f8f796a89329048ece94d4be9jljusten  BootScriptWrite,
21bdfde4623daff97f8f796a89329048ece94d4be9jljusten  BootScriptInsert,
22bdfde4623daff97f8f796a89329048ece94d4be9jljusten  BootScriptLabel,
23bdfde4623daff97f8f796a89329048ece94d4be9jljusten  BootScriptCompare
24bdfde4623daff97f8f796a89329048ece94d4be9jljusten  };
25bdfde4623daff97f8f796a89329048ece94d4be9jljusten/**
26bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Internal function to add IO write opcode to the table.
27bdfde4623daff97f8f796a89329048ece94d4be9jljusten
28bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  Marker                The variable argument list to get the opcode
29bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                and associated attributes.
30bdfde4623daff97f8f796a89329048ece94d4be9jljusten
31bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_OUT_OF_RESOURCES  Not enough resource to do operation.
32bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_SUCCESS           Opcode is added.
33bdfde4623daff97f8f796a89329048ece94d4be9jljusten
34bdfde4623daff97f8f796a89329048ece94d4be9jljusten**/
35bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFI_STATUS
36bdfde4623daff97f8f796a89329048ece94d4be9jljustenBootScriptWriteIoWrite (
37bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN VA_LIST                       Marker
38bdfde4623daff97f8f796a89329048ece94d4be9jljusten  )
39bdfde4623daff97f8f796a89329048ece94d4be9jljusten{
40bdfde4623daff97f8f796a89329048ece94d4be9jljusten  S3_BOOT_SCRIPT_LIB_WIDTH Width;
41bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINT64                Address;
42bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINTN                 Count;
43bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINT8                 *Buffer;
44bdfde4623daff97f8f796a89329048ece94d4be9jljusten
45bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Width       = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);
46bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Address     = VA_ARG (Marker, UINT64);
47bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Count       = VA_ARG (Marker, UINTN);
48bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Buffer      = VA_ARG (Marker, UINT8 *);
49bdfde4623daff97f8f796a89329048ece94d4be9jljusten
50bdfde4623daff97f8f796a89329048ece94d4be9jljusten  return S3BootScriptSaveIoWrite (Width, Address, Count, Buffer);
51bdfde4623daff97f8f796a89329048ece94d4be9jljusten}
52bdfde4623daff97f8f796a89329048ece94d4be9jljusten/**
53bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Internal function to add IO read/write opcode to the table.
54bdfde4623daff97f8f796a89329048ece94d4be9jljusten
55bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  Marker                The variable argument list to get the opcode
56bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                and associated attributes.
57bdfde4623daff97f8f796a89329048ece94d4be9jljusten
58bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_OUT_OF_RESOURCES  Not enough resource to do operation.
59bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_SUCCESS           Opcode is added.
60bdfde4623daff97f8f796a89329048ece94d4be9jljusten
61bdfde4623daff97f8f796a89329048ece94d4be9jljusten**/
62bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFI_STATUS
63bdfde4623daff97f8f796a89329048ece94d4be9jljustenBootScriptWriteIoReadWrite (
64bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN VA_LIST                       Marker
65bdfde4623daff97f8f796a89329048ece94d4be9jljusten  )
66bdfde4623daff97f8f796a89329048ece94d4be9jljusten{
67bdfde4623daff97f8f796a89329048ece94d4be9jljusten  S3_BOOT_SCRIPT_LIB_WIDTH Width;
68bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINT64                Address;
69bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINT8                 *Data;
70bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINT8                 *DataMask;
71bdfde4623daff97f8f796a89329048ece94d4be9jljusten
72bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Width       = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);
73bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Address     = VA_ARG (Marker, UINT64);
74bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Data        = VA_ARG (Marker, UINT8 *);
75bdfde4623daff97f8f796a89329048ece94d4be9jljusten  DataMask    = VA_ARG (Marker, UINT8 *);
76bdfde4623daff97f8f796a89329048ece94d4be9jljusten
77bdfde4623daff97f8f796a89329048ece94d4be9jljusten  return S3BootScriptSaveIoReadWrite (Width, Address, Data, DataMask);
78bdfde4623daff97f8f796a89329048ece94d4be9jljusten}
79bdfde4623daff97f8f796a89329048ece94d4be9jljusten
80bdfde4623daff97f8f796a89329048ece94d4be9jljusten/**
81bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Internal function to add memory write opcode to the table.
82bdfde4623daff97f8f796a89329048ece94d4be9jljusten
83bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  Marker                The variable argument list to get the opcode
84bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                and associated attributes.
85bdfde4623daff97f8f796a89329048ece94d4be9jljusten
86bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_OUT_OF_RESOURCES  Not enough resource to do operation.
87bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_SUCCESS           Opcode is added.
88bdfde4623daff97f8f796a89329048ece94d4be9jljusten
89bdfde4623daff97f8f796a89329048ece94d4be9jljusten**/
90bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFI_STATUS
91bdfde4623daff97f8f796a89329048ece94d4be9jljustenBootScriptWriteMemWrite (
92bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN VA_LIST                       Marker
93bdfde4623daff97f8f796a89329048ece94d4be9jljusten  )
94bdfde4623daff97f8f796a89329048ece94d4be9jljusten{
95bdfde4623daff97f8f796a89329048ece94d4be9jljusten  S3_BOOT_SCRIPT_LIB_WIDTH Width;
96bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINT64                Address;
97bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINTN                 Count;
98bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINT8                 *Buffer;
99bdfde4623daff97f8f796a89329048ece94d4be9jljusten
100bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Width       = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);
101bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Address     = VA_ARG (Marker, UINT64);
102bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Count       = VA_ARG (Marker, UINTN);
103bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Buffer      = VA_ARG (Marker, UINT8 *);
104bdfde4623daff97f8f796a89329048ece94d4be9jljusten
105bdfde4623daff97f8f796a89329048ece94d4be9jljusten  return S3BootScriptSaveMemWrite (Width, Address, Count, Buffer);
106bdfde4623daff97f8f796a89329048ece94d4be9jljusten}
107bdfde4623daff97f8f796a89329048ece94d4be9jljusten
108bdfde4623daff97f8f796a89329048ece94d4be9jljusten/**
109bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Internal function to add memory read/write opcode to the table.
110bdfde4623daff97f8f796a89329048ece94d4be9jljusten
111bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  Marker                The variable argument list to get the opcode
112bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                and associated attributes.
113bdfde4623daff97f8f796a89329048ece94d4be9jljusten
114bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_OUT_OF_RESOURCES  Not enough resource to do operation.
115bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_SUCCESS           Opcode is added.
116bdfde4623daff97f8f796a89329048ece94d4be9jljusten
117bdfde4623daff97f8f796a89329048ece94d4be9jljusten**/
118bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFI_STATUS
119bdfde4623daff97f8f796a89329048ece94d4be9jljustenBootScriptWriteMemReadWrite (
120bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN VA_LIST                       Marker
121bdfde4623daff97f8f796a89329048ece94d4be9jljusten  )
122bdfde4623daff97f8f796a89329048ece94d4be9jljusten{
123bdfde4623daff97f8f796a89329048ece94d4be9jljusten  S3_BOOT_SCRIPT_LIB_WIDTH Width;
124bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINT64                Address;
125bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINT8                 *Data;
126bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINT8                 *DataMask;
127bdfde4623daff97f8f796a89329048ece94d4be9jljusten
128bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Width       = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);
129bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Address     = VA_ARG (Marker, UINT64);
130bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Data        = VA_ARG (Marker, UINT8 *);
131bdfde4623daff97f8f796a89329048ece94d4be9jljusten  DataMask    = VA_ARG (Marker, UINT8 *);
132bdfde4623daff97f8f796a89329048ece94d4be9jljusten
133bdfde4623daff97f8f796a89329048ece94d4be9jljusten  return S3BootScriptSaveMemReadWrite (Width, Address, Data, DataMask);
134bdfde4623daff97f8f796a89329048ece94d4be9jljusten}
135bdfde4623daff97f8f796a89329048ece94d4be9jljusten
136bdfde4623daff97f8f796a89329048ece94d4be9jljusten/**
137bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Internal function to add PciCfg write opcode to the table.
138bdfde4623daff97f8f796a89329048ece94d4be9jljusten
139bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  Marker                The variable argument list to get the opcode
140bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                and associated attributes.
141bdfde4623daff97f8f796a89329048ece94d4be9jljusten
142bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_OUT_OF_RESOURCES  Not enough resource to do operation.
143bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_SUCCESS           Opcode is added.
144bdfde4623daff97f8f796a89329048ece94d4be9jljusten
145bdfde4623daff97f8f796a89329048ece94d4be9jljusten**/
146bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFI_STATUS
147bdfde4623daff97f8f796a89329048ece94d4be9jljustenBootScriptWritePciCfgWrite (
148bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN VA_LIST                       Marker
149bdfde4623daff97f8f796a89329048ece94d4be9jljusten  )
150bdfde4623daff97f8f796a89329048ece94d4be9jljusten{
151bdfde4623daff97f8f796a89329048ece94d4be9jljusten  S3_BOOT_SCRIPT_LIB_WIDTH Width;
152bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINT64                Address;
153bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINTN                 Count;
154bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINT8                 *Buffer;
155bdfde4623daff97f8f796a89329048ece94d4be9jljusten
156bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Width       = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);
157bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Address     = VA_ARG (Marker, UINT64);
158bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Count       = VA_ARG (Marker, UINTN);
159bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Buffer      = VA_ARG (Marker, UINT8 *);
160bdfde4623daff97f8f796a89329048ece94d4be9jljusten
161bdfde4623daff97f8f796a89329048ece94d4be9jljusten  return S3BootScriptSavePciCfgWrite (Width, Address, Count, Buffer);
162bdfde4623daff97f8f796a89329048ece94d4be9jljusten}
163bdfde4623daff97f8f796a89329048ece94d4be9jljusten
164bdfde4623daff97f8f796a89329048ece94d4be9jljusten/**
165bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Internal function to PciCfg read/write opcode to the table.
166bdfde4623daff97f8f796a89329048ece94d4be9jljusten
167bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  Marker                The variable argument list to get the opcode
168bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                and associated attributes.
169bdfde4623daff97f8f796a89329048ece94d4be9jljusten
170bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_OUT_OF_RESOURCES  Not enough resource to do operation.
171bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_SUCCESS           Opcode is added.
172bdfde4623daff97f8f796a89329048ece94d4be9jljusten
173bdfde4623daff97f8f796a89329048ece94d4be9jljusten**/
174bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFI_STATUS
175bdfde4623daff97f8f796a89329048ece94d4be9jljustenBootScriptWritePciCfgReadWrite (
176bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN VA_LIST                       Marker
177bdfde4623daff97f8f796a89329048ece94d4be9jljusten  )
178bdfde4623daff97f8f796a89329048ece94d4be9jljusten{
179bdfde4623daff97f8f796a89329048ece94d4be9jljusten  S3_BOOT_SCRIPT_LIB_WIDTH Width;
180bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINT64                Address;
181bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINT8                 *Data;
182bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINT8                 *DataMask;
183bdfde4623daff97f8f796a89329048ece94d4be9jljusten
184bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Width       = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);
185bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Address     = VA_ARG (Marker, UINT64);
186bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Data        = VA_ARG (Marker, UINT8 *);
187bdfde4623daff97f8f796a89329048ece94d4be9jljusten  DataMask    = VA_ARG (Marker, UINT8 *);
188bdfde4623daff97f8f796a89329048ece94d4be9jljusten
189bdfde4623daff97f8f796a89329048ece94d4be9jljusten  return S3BootScriptSavePciCfgReadWrite (Width, Address, Data, DataMask);
190bdfde4623daff97f8f796a89329048ece94d4be9jljusten}
191bdfde4623daff97f8f796a89329048ece94d4be9jljusten/**
192bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Internal function to add PciCfg2 write opcode to the table.
193bdfde4623daff97f8f796a89329048ece94d4be9jljusten
194bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  Marker                The variable argument list to get the opcode
195bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                and associated attributes.
196bdfde4623daff97f8f796a89329048ece94d4be9jljusten
197bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_OUT_OF_RESOURCES  Not enough resource to do operation.
198bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_SUCCESS           Opcode is added.
199bdfde4623daff97f8f796a89329048ece94d4be9jljusten
200bdfde4623daff97f8f796a89329048ece94d4be9jljusten**/
201bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFI_STATUS
202bdfde4623daff97f8f796a89329048ece94d4be9jljustenBootScriptWritePciCfg2Write (
203bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN VA_LIST                       Marker
204bdfde4623daff97f8f796a89329048ece94d4be9jljusten  )
205bdfde4623daff97f8f796a89329048ece94d4be9jljusten{
206bdfde4623daff97f8f796a89329048ece94d4be9jljusten  S3_BOOT_SCRIPT_LIB_WIDTH Width;
207bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINT64                Address;
208bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINTN                 Count;
209bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINT8                 *Buffer;
210bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINT16                Segment;
211bdfde4623daff97f8f796a89329048ece94d4be9jljusten
212bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Width       = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);
213bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Address     = VA_ARG (Marker, UINT64);
214bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Count       = VA_ARG (Marker, UINTN);
215bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Buffer      = VA_ARG (Marker, UINT8 *);
216bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Segment     = VA_ARG (Marker, UINT16);
217bdfde4623daff97f8f796a89329048ece94d4be9jljusten
218bdfde4623daff97f8f796a89329048ece94d4be9jljusten  return S3BootScriptSavePciCfg2Write (Width, Segment, Address, Count, Buffer);
219bdfde4623daff97f8f796a89329048ece94d4be9jljusten}
220bdfde4623daff97f8f796a89329048ece94d4be9jljusten
221bdfde4623daff97f8f796a89329048ece94d4be9jljusten/**
222bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Internal function to PciCfg2 read/write opcode to the table.
223bdfde4623daff97f8f796a89329048ece94d4be9jljusten
224bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  Marker                The variable argument list to get the opcode
225bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                and associated attributes.
226bdfde4623daff97f8f796a89329048ece94d4be9jljusten
227bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_OUT_OF_RESOURCES  Not enough resource to do operation.
228bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_SUCCESS           Opcode is added.
229bdfde4623daff97f8f796a89329048ece94d4be9jljusten
230bdfde4623daff97f8f796a89329048ece94d4be9jljusten**/
231bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFI_STATUS
232bdfde4623daff97f8f796a89329048ece94d4be9jljustenBootScriptWritePciCfg2ReadWrite (
233bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN VA_LIST                       Marker
234bdfde4623daff97f8f796a89329048ece94d4be9jljusten  )
235bdfde4623daff97f8f796a89329048ece94d4be9jljusten{
236bdfde4623daff97f8f796a89329048ece94d4be9jljusten  S3_BOOT_SCRIPT_LIB_WIDTH Width;
237bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINT16                Segment;
238bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINT64                Address;
239bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINT8                 *Data;
240bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINT8                 *DataMask;
241bdfde4623daff97f8f796a89329048ece94d4be9jljusten
242bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Width       = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);
243bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Address     = VA_ARG (Marker, UINT64);
244bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Segment     = VA_ARG (Marker, UINT16);
245bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Data        = VA_ARG (Marker, UINT8 *);
246bdfde4623daff97f8f796a89329048ece94d4be9jljusten  DataMask    = VA_ARG (Marker, UINT8 *);
247bdfde4623daff97f8f796a89329048ece94d4be9jljusten
248bdfde4623daff97f8f796a89329048ece94d4be9jljusten  return S3BootScriptSavePciCfg2ReadWrite (Width, Segment, Address, Data, DataMask);
249bdfde4623daff97f8f796a89329048ece94d4be9jljusten}
250bdfde4623daff97f8f796a89329048ece94d4be9jljusten/**
251bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Internal function to add smbus excute opcode to the table.
252bdfde4623daff97f8f796a89329048ece94d4be9jljusten
253bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  Marker                The variable argument list to get the opcode
254bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                and associated attributes.
255bdfde4623daff97f8f796a89329048ece94d4be9jljusten
256bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_OUT_OF_RESOURCES  Not enough resource to do operation.
257bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_SUCCESS           Opcode is added.
258bdfde4623daff97f8f796a89329048ece94d4be9jljusten
259bdfde4623daff97f8f796a89329048ece94d4be9jljusten**/
260bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFI_STATUS
261bdfde4623daff97f8f796a89329048ece94d4be9jljustenBootScriptWriteSmbusExecute (
262bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN VA_LIST                       Marker
263bdfde4623daff97f8f796a89329048ece94d4be9jljusten  )
264bdfde4623daff97f8f796a89329048ece94d4be9jljusten{
265bdfde4623daff97f8f796a89329048ece94d4be9jljusten  EFI_SMBUS_DEVICE_ADDRESS  SlaveAddress;
266bdfde4623daff97f8f796a89329048ece94d4be9jljusten  EFI_SMBUS_DEVICE_COMMAND  Command;
267bdfde4623daff97f8f796a89329048ece94d4be9jljusten  EFI_SMBUS_OPERATION       Operation;
268bdfde4623daff97f8f796a89329048ece94d4be9jljusten  BOOLEAN                   PecCheck;
269bdfde4623daff97f8f796a89329048ece94d4be9jljusten  VOID                     *Buffer;
270bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINTN                    *DataSize;
271bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINTN                     SmBusAddress;
272bdfde4623daff97f8f796a89329048ece94d4be9jljusten
273bdfde4623daff97f8f796a89329048ece94d4be9jljusten  SlaveAddress.SmbusDeviceAddress = VA_ARG (Marker, UINTN);
274bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Command                         = VA_ARG (Marker, EFI_SMBUS_DEVICE_COMMAND);
275bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Operation                       = VA_ARG (Marker, EFI_SMBUS_OPERATION);
276bdfde4623daff97f8f796a89329048ece94d4be9jljusten  PecCheck                        = VA_ARG (Marker, BOOLEAN);
277bdfde4623daff97f8f796a89329048ece94d4be9jljusten  SmBusAddress                    = SMBUS_LIB_ADDRESS (SlaveAddress.SmbusDeviceAddress,Command,0,PecCheck);
278bdfde4623daff97f8f796a89329048ece94d4be9jljusten  DataSize                        = VA_ARG (Marker, UINTN *);
279bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Buffer                          = VA_ARG (Marker, VOID *);
280bdfde4623daff97f8f796a89329048ece94d4be9jljusten
281bdfde4623daff97f8f796a89329048ece94d4be9jljusten  return S3BootScriptSaveSmbusExecute (SmBusAddress, Operation, DataSize, Buffer);
282bdfde4623daff97f8f796a89329048ece94d4be9jljusten}
283bdfde4623daff97f8f796a89329048ece94d4be9jljusten/**
284bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Internal function to add stall opcode to the table.
285bdfde4623daff97f8f796a89329048ece94d4be9jljusten
286bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  Marker                The variable argument list to get the opcode
287bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                and associated attributes.
288bdfde4623daff97f8f796a89329048ece94d4be9jljusten
289bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_OUT_OF_RESOURCES  Not enough resource to do operation.
290bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_SUCCESS           Opcode is added.
291bdfde4623daff97f8f796a89329048ece94d4be9jljusten
292bdfde4623daff97f8f796a89329048ece94d4be9jljusten**/
293bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFI_STATUS
294bdfde4623daff97f8f796a89329048ece94d4be9jljustenBootScriptWriteStall (
295bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN VA_LIST                       Marker
296bdfde4623daff97f8f796a89329048ece94d4be9jljusten  )
297bdfde4623daff97f8f796a89329048ece94d4be9jljusten{
298bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINT32                Duration;
299bdfde4623daff97f8f796a89329048ece94d4be9jljusten
300bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Duration    = VA_ARG (Marker, UINT32);
301bdfde4623daff97f8f796a89329048ece94d4be9jljusten
302bdfde4623daff97f8f796a89329048ece94d4be9jljusten  return S3BootScriptSaveStall (Duration);
303bdfde4623daff97f8f796a89329048ece94d4be9jljusten}
304bdfde4623daff97f8f796a89329048ece94d4be9jljusten
305bdfde4623daff97f8f796a89329048ece94d4be9jljusten/**
306bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Internal function to add Save jmp address according to DISPATCH_OPCODE.
307bdfde4623daff97f8f796a89329048ece94d4be9jljusten  We ignore "Context" parameter
308bdfde4623daff97f8f796a89329048ece94d4be9jljusten
309bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  Marker                The variable argument list to get the opcode
310bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                and associated attributes.
311bdfde4623daff97f8f796a89329048ece94d4be9jljusten
312bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_OUT_OF_RESOURCES  Not enough resource to do operation.
313bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_SUCCESS           Opcode is added.
314bdfde4623daff97f8f796a89329048ece94d4be9jljusten
315bdfde4623daff97f8f796a89329048ece94d4be9jljusten**/
316bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFI_STATUS
317bdfde4623daff97f8f796a89329048ece94d4be9jljustenBootScriptWriteDispatch (
318bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN VA_LIST                       Marker
319bdfde4623daff97f8f796a89329048ece94d4be9jljusten  )
320bdfde4623daff97f8f796a89329048ece94d4be9jljusten{
321bdfde4623daff97f8f796a89329048ece94d4be9jljusten  VOID        *EntryPoint;
322bdfde4623daff97f8f796a89329048ece94d4be9jljusten
323bdfde4623daff97f8f796a89329048ece94d4be9jljusten  EntryPoint = (VOID*)(UINTN)VA_ARG (Marker, EFI_PHYSICAL_ADDRESS);
324bdfde4623daff97f8f796a89329048ece94d4be9jljusten  return S3BootScriptSaveDispatch (EntryPoint);
325bdfde4623daff97f8f796a89329048ece94d4be9jljusten}
326bdfde4623daff97f8f796a89329048ece94d4be9jljusten
327bdfde4623daff97f8f796a89329048ece94d4be9jljusten/**
328bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Internal function to add memory pool operation to the table.
329bdfde4623daff97f8f796a89329048ece94d4be9jljusten
330bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  Marker                The variable argument list to get the opcode
331bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                and associated attributes.
332bdfde4623daff97f8f796a89329048ece94d4be9jljusten
333bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_OUT_OF_RESOURCES  Not enough resource to do operation.
334bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_SUCCESS           Opcode is added.
335bdfde4623daff97f8f796a89329048ece94d4be9jljusten
336bdfde4623daff97f8f796a89329048ece94d4be9jljusten**/
337bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFI_STATUS
338bdfde4623daff97f8f796a89329048ece94d4be9jljustenBootScriptWriteMemPoll (
339bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN VA_LIST                       Marker
340bdfde4623daff97f8f796a89329048ece94d4be9jljusten  )
341bdfde4623daff97f8f796a89329048ece94d4be9jljusten{
342bdfde4623daff97f8f796a89329048ece94d4be9jljusten  S3_BOOT_SCRIPT_LIB_WIDTH   Width;
343bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINT64                     Address;
344bdfde4623daff97f8f796a89329048ece94d4be9jljusten  VOID                      *Data;
345bdfde4623daff97f8f796a89329048ece94d4be9jljusten  VOID                      *DataMask;
346bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINTN                     Delay;
347bdfde4623daff97f8f796a89329048ece94d4be9jljusten
348bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Width    = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);
349bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Address  = VA_ARG (Marker, UINT64);
350bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Data     = VA_ARG (Marker, VOID *);
351bdfde4623daff97f8f796a89329048ece94d4be9jljusten  DataMask = VA_ARG (Marker, VOID *);
352bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Delay    = (UINTN)VA_ARG (Marker, UINT64);
353bdfde4623daff97f8f796a89329048ece94d4be9jljusten  //
354bdfde4623daff97f8f796a89329048ece94d4be9jljusten  // According to the spec, the interval between 2 pools is 100ns
355bdfde4623daff97f8f796a89329048ece94d4be9jljusten  //
356bdfde4623daff97f8f796a89329048ece94d4be9jljusten  return S3BootScriptSaveMemPoll (Width, Address, DataMask, Data, 100, Delay);
357bdfde4623daff97f8f796a89329048ece94d4be9jljusten
358bdfde4623daff97f8f796a89329048ece94d4be9jljusten}
359bdfde4623daff97f8f796a89329048ece94d4be9jljusten
360bdfde4623daff97f8f796a89329048ece94d4be9jljusten/**
361bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Internal function to add Save jmp address according to DISPATCH_OPCODE2.
362bdfde4623daff97f8f796a89329048ece94d4be9jljusten  The "Context" parameter is not ignored.
363bdfde4623daff97f8f796a89329048ece94d4be9jljusten
364bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  Marker                The variable argument list to get the opcode
365bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                and associated attributes.
366bdfde4623daff97f8f796a89329048ece94d4be9jljusten
367bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_OUT_OF_RESOURCES  Not enough resource to do operation.
368bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_SUCCESS           Opcode is added.
369bdfde4623daff97f8f796a89329048ece94d4be9jljusten
370bdfde4623daff97f8f796a89329048ece94d4be9jljusten**/
371bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFI_STATUS
372bdfde4623daff97f8f796a89329048ece94d4be9jljustenBootScriptWriteDispatch2 (
373bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN VA_LIST                       Marker
374bdfde4623daff97f8f796a89329048ece94d4be9jljusten  )
375bdfde4623daff97f8f796a89329048ece94d4be9jljusten{
376bdfde4623daff97f8f796a89329048ece94d4be9jljusten  VOID                  *EntryPoint;
377bdfde4623daff97f8f796a89329048ece94d4be9jljusten  VOID                  *Context;
378bdfde4623daff97f8f796a89329048ece94d4be9jljusten
379bdfde4623daff97f8f796a89329048ece94d4be9jljusten  EntryPoint = (VOID*)(UINTN)VA_ARG (Marker, EFI_PHYSICAL_ADDRESS);
380bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Context    = (VOID*)(UINTN)VA_ARG (Marker, EFI_PHYSICAL_ADDRESS);
381bdfde4623daff97f8f796a89329048ece94d4be9jljusten
382bdfde4623daff97f8f796a89329048ece94d4be9jljusten  return S3BootScriptSaveDispatch2 (EntryPoint, Context);
383bdfde4623daff97f8f796a89329048ece94d4be9jljusten}
384bdfde4623daff97f8f796a89329048ece94d4be9jljusten/**
385bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Internal function to add INFORAMTION opcode node to the table
386bdfde4623daff97f8f796a89329048ece94d4be9jljusten  list.
387bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  Marker                The variable argument list to get the opcode
388bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                and associated attributes.
389bdfde4623daff97f8f796a89329048ece94d4be9jljusten
390bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_OUT_OF_RESOURCES  Not enought resource to complete the operations.
391bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_SUCCESS           The opcode entry is added to the  table
392bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                successfully.
393bdfde4623daff97f8f796a89329048ece94d4be9jljusten**/
394bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFI_STATUS
395bdfde4623daff97f8f796a89329048ece94d4be9jljustenBootScriptWriteInformation (
396bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN VA_LIST                       Marker
397bdfde4623daff97f8f796a89329048ece94d4be9jljusten  )
398bdfde4623daff97f8f796a89329048ece94d4be9jljusten{
399bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINT32                InformationLength;
400bdfde4623daff97f8f796a89329048ece94d4be9jljusten  EFI_PHYSICAL_ADDRESS  Information;
401bdfde4623daff97f8f796a89329048ece94d4be9jljusten
402bdfde4623daff97f8f796a89329048ece94d4be9jljusten  InformationLength = VA_ARG (Marker, UINT32);
403bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Information = VA_ARG (Marker, EFI_PHYSICAL_ADDRESS);
404bdfde4623daff97f8f796a89329048ece94d4be9jljusten  return S3BootScriptSaveInformation (InformationLength, (VOID*)(UINTN)Information);
405bdfde4623daff97f8f796a89329048ece94d4be9jljusten}
406bdfde4623daff97f8f796a89329048ece94d4be9jljusten/**
407bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Internal function to add IO poll opcode node  to the table
408bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  Marker                The variable argument list to get the opcode
409bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                and associated attributes.
410bdfde4623daff97f8f796a89329048ece94d4be9jljusten
411bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_OUT_OF_RESOURCES  Not enought resource to complete the operations.
412bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_SUCCESS           The opcode entry is added to the  table
413bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                successfully.
414bdfde4623daff97f8f796a89329048ece94d4be9jljusten**/
415bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFI_STATUS
416bdfde4623daff97f8f796a89329048ece94d4be9jljustenBootScriptWriteIoPoll (
417bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN VA_LIST                       Marker
418bdfde4623daff97f8f796a89329048ece94d4be9jljusten  )
419bdfde4623daff97f8f796a89329048ece94d4be9jljusten{
420bdfde4623daff97f8f796a89329048ece94d4be9jljusten   S3_BOOT_SCRIPT_LIB_WIDTH     Width;
421bdfde4623daff97f8f796a89329048ece94d4be9jljusten   UINT64                     Address;
422bdfde4623daff97f8f796a89329048ece94d4be9jljusten   VOID                      *Data;
423bdfde4623daff97f8f796a89329048ece94d4be9jljusten   VOID                      *DataMask;
424bdfde4623daff97f8f796a89329048ece94d4be9jljusten   UINT64                     Delay;
425bdfde4623daff97f8f796a89329048ece94d4be9jljusten
426bdfde4623daff97f8f796a89329048ece94d4be9jljusten   Width    = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);
427bdfde4623daff97f8f796a89329048ece94d4be9jljusten   Address  = VA_ARG (Marker, UINT64);
428bdfde4623daff97f8f796a89329048ece94d4be9jljusten   Data     = VA_ARG (Marker, VOID *);
429bdfde4623daff97f8f796a89329048ece94d4be9jljusten   DataMask = VA_ARG (Marker, VOID *);
430bdfde4623daff97f8f796a89329048ece94d4be9jljusten   Delay    = (UINT64)VA_ARG (Marker, UINT64);
431bdfde4623daff97f8f796a89329048ece94d4be9jljusten
432bdfde4623daff97f8f796a89329048ece94d4be9jljusten   return S3BootScriptSaveIoPoll (Width, Address, Data, DataMask, Delay);
433bdfde4623daff97f8f796a89329048ece94d4be9jljusten}
434bdfde4623daff97f8f796a89329048ece94d4be9jljusten/**
435bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Internal function to add PCI config poll opcode node to the table
436bdfde4623daff97f8f796a89329048ece94d4be9jljusten
437bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  Marker                The variable argument list to get the opcode
438bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                and associated attributes.
439bdfde4623daff97f8f796a89329048ece94d4be9jljusten
440bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_OUT_OF_RESOURCES  Not enought resource to complete the operations.
441bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_SUCCESS           The opcode entry is added to the  table
442bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                successfully.
443bdfde4623daff97f8f796a89329048ece94d4be9jljusten**/
444bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFI_STATUS
445bdfde4623daff97f8f796a89329048ece94d4be9jljustenBootScriptWritePciConfigPoll (
446bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN VA_LIST                       Marker
447bdfde4623daff97f8f796a89329048ece94d4be9jljusten  )
448bdfde4623daff97f8f796a89329048ece94d4be9jljusten{
449bdfde4623daff97f8f796a89329048ece94d4be9jljusten   S3_BOOT_SCRIPT_LIB_WIDTH   Width;
450bdfde4623daff97f8f796a89329048ece94d4be9jljusten   UINT64                     Address;
451bdfde4623daff97f8f796a89329048ece94d4be9jljusten   VOID                      *Data;
452bdfde4623daff97f8f796a89329048ece94d4be9jljusten   VOID                      *DataMask;
453bdfde4623daff97f8f796a89329048ece94d4be9jljusten   UINT64                     Delay;
454bdfde4623daff97f8f796a89329048ece94d4be9jljusten
455bdfde4623daff97f8f796a89329048ece94d4be9jljusten
456bdfde4623daff97f8f796a89329048ece94d4be9jljusten   Width    = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);
457bdfde4623daff97f8f796a89329048ece94d4be9jljusten   Address  = VA_ARG (Marker, UINT64);
458bdfde4623daff97f8f796a89329048ece94d4be9jljusten   Data     = VA_ARG (Marker, VOID *);
459bdfde4623daff97f8f796a89329048ece94d4be9jljusten   DataMask = VA_ARG (Marker, VOID *);
460bdfde4623daff97f8f796a89329048ece94d4be9jljusten   Delay    = (UINT64)VA_ARG (Marker, UINT64);
461bdfde4623daff97f8f796a89329048ece94d4be9jljusten
462bdfde4623daff97f8f796a89329048ece94d4be9jljusten   return S3BootScriptSavePciPoll (Width, Address, Data, DataMask, Delay);
463bdfde4623daff97f8f796a89329048ece94d4be9jljusten}
464bdfde4623daff97f8f796a89329048ece94d4be9jljusten/**
465bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Internal function to add PCI config 2 poll opcode node to the table
466bdfde4623daff97f8f796a89329048ece94d4be9jljusten
467bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  Marker                The variable argument list to get the opcode
468bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                and associated attributes.
469bdfde4623daff97f8f796a89329048ece94d4be9jljusten
470bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_OUT_OF_RESOURCES  Not enought resource to complete the operations.
471bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_SUCCESS           The opcode entry is added to the  table
472bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                successfully.
473bdfde4623daff97f8f796a89329048ece94d4be9jljusten**/
474bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFI_STATUS
475bdfde4623daff97f8f796a89329048ece94d4be9jljustenBootScriptWritePciConfig2Poll (
476bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN VA_LIST                       Marker
477bdfde4623daff97f8f796a89329048ece94d4be9jljusten  )
478bdfde4623daff97f8f796a89329048ece94d4be9jljusten{
479bdfde4623daff97f8f796a89329048ece94d4be9jljusten   S3_BOOT_SCRIPT_LIB_WIDTH      Width;
480bdfde4623daff97f8f796a89329048ece94d4be9jljusten   UINT16                        Segment;
481bdfde4623daff97f8f796a89329048ece94d4be9jljusten   UINT64                        Address;
482bdfde4623daff97f8f796a89329048ece94d4be9jljusten   VOID                         *Data;
483bdfde4623daff97f8f796a89329048ece94d4be9jljusten   VOID                         *DataMask;
484bdfde4623daff97f8f796a89329048ece94d4be9jljusten   UINT64                        Delay;
485bdfde4623daff97f8f796a89329048ece94d4be9jljusten
486bdfde4623daff97f8f796a89329048ece94d4be9jljusten   Width    = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);
487bdfde4623daff97f8f796a89329048ece94d4be9jljusten   Segment  = VA_ARG (Marker, UINT16);
488bdfde4623daff97f8f796a89329048ece94d4be9jljusten   Address  = VA_ARG (Marker, UINT64);
489bdfde4623daff97f8f796a89329048ece94d4be9jljusten   Data     = VA_ARG (Marker, VOID *);
490bdfde4623daff97f8f796a89329048ece94d4be9jljusten   DataMask = VA_ARG (Marker, VOID *);
491bdfde4623daff97f8f796a89329048ece94d4be9jljusten   Delay    = (UINT64)VA_ARG (Marker, UINT64);
492bdfde4623daff97f8f796a89329048ece94d4be9jljusten
493bdfde4623daff97f8f796a89329048ece94d4be9jljusten   return S3BootScriptSavePci2Poll (Width, Segment, Address, Data, DataMask, Delay);
494bdfde4623daff97f8f796a89329048ece94d4be9jljusten}
495bdfde4623daff97f8f796a89329048ece94d4be9jljusten
496bdfde4623daff97f8f796a89329048ece94d4be9jljusten
497bdfde4623daff97f8f796a89329048ece94d4be9jljusten/**
498bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Adds a record into S3 boot script table.
499bdfde4623daff97f8f796a89329048ece94d4be9jljusten
500bdfde4623daff97f8f796a89329048ece94d4be9jljusten  This function is used to store a boot script record into a given boot
501bdfde4623daff97f8f796a89329048ece94d4be9jljusten  script table. If the table specified by TableName is nonexistent in the
502bdfde4623daff97f8f796a89329048ece94d4be9jljusten  system, a new table will automatically be created and then the script record
503bdfde4623daff97f8f796a89329048ece94d4be9jljusten  will be added into the new table. This function is responsible for allocating
504bdfde4623daff97f8f796a89329048ece94d4be9jljusten  necessary memory for the script.
505bdfde4623daff97f8f796a89329048ece94d4be9jljusten
506bdfde4623daff97f8f796a89329048ece94d4be9jljusten  This function has a variable parameter list. The exact parameter list depends on
507bdfde4623daff97f8f796a89329048ece94d4be9jljusten  the OpCode that is passed into the function. If an unsupported OpCode or illegal
508bdfde4623daff97f8f796a89329048ece94d4be9jljusten  parameter list is passed in, this function returns EFI_INVALID_PARAMETER.
509bdfde4623daff97f8f796a89329048ece94d4be9jljusten  If there are not enough resources available for storing more scripts, this function returns
510bdfde4623daff97f8f796a89329048ece94d4be9jljusten  EFI_OUT_OF_RESOURCES.
511bdfde4623daff97f8f796a89329048ece94d4be9jljusten
512bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  This                  A pointer to the EFI_S3_SAVE_STATE_PROTOCOL instance.
513bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  OpCode                The operation code (opcode) number.
514bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  ...                   Argument list that is specific to each opcode.
515bdfde4623daff97f8f796a89329048ece94d4be9jljusten
516bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_SUCCESS           The operation succeeded. A record was added into the
517bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                specified script table.
518bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_INVALID_PARAMETER The parameter is illegal or the given boot script is not supported.
519bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                If the opcode is unknow or not supported because of the PCD
520bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                Feature Flags.
521bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_OUT_OF_RESOURCES  There is insufficient memory to store the boot script.
522bdfde4623daff97f8f796a89329048ece94d4be9jljusten
523bdfde4623daff97f8f796a89329048ece94d4be9jljusten**/
524bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFI_STATUS
525bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFIAPI
526bdfde4623daff97f8f796a89329048ece94d4be9jljustenBootScriptWrite (
527bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN CONST EFI_S3_SAVE_STATE_PROTOCOL      *This,
528bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN       UINT16                           OpCode,
529bdfde4623daff97f8f796a89329048ece94d4be9jljusten  ...
530bdfde4623daff97f8f796a89329048ece94d4be9jljusten  )
531bdfde4623daff97f8f796a89329048ece94d4be9jljusten{
532bdfde4623daff97f8f796a89329048ece94d4be9jljusten  EFI_STATUS                Status;
533bdfde4623daff97f8f796a89329048ece94d4be9jljusten  VA_LIST                   Marker;
534bdfde4623daff97f8f796a89329048ece94d4be9jljusten  //
535bdfde4623daff97f8f796a89329048ece94d4be9jljusten  // Build script according to opcode
536bdfde4623daff97f8f796a89329048ece94d4be9jljusten  //
537bdfde4623daff97f8f796a89329048ece94d4be9jljusten  switch (OpCode) {
538bdfde4623daff97f8f796a89329048ece94d4be9jljusten
539bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_IO_WRITE_OPCODE:
540bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
541bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWriteIoWrite (Marker);
542bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
543bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
544bdfde4623daff97f8f796a89329048ece94d4be9jljusten
545bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_IO_READ_WRITE_OPCODE:
546bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
547bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWriteIoReadWrite (Marker);
548bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
549bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
550bdfde4623daff97f8f796a89329048ece94d4be9jljusten
551bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_MEM_WRITE_OPCODE:
552bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
553bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWriteMemWrite (Marker);
554bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
555bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
556bdfde4623daff97f8f796a89329048ece94d4be9jljusten
557bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_MEM_READ_WRITE_OPCODE:
558bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
559bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWriteMemReadWrite (Marker);
560bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
561bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
562bdfde4623daff97f8f796a89329048ece94d4be9jljusten
563bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_PCI_CONFIG_WRITE_OPCODE:
564bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
565bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWritePciCfgWrite (Marker);
566bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
567bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
568bdfde4623daff97f8f796a89329048ece94d4be9jljusten
569bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_PCI_CONFIG_READ_WRITE_OPCODE:
570bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
571bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWritePciCfgReadWrite (Marker);
572bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
573bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
574bdfde4623daff97f8f796a89329048ece94d4be9jljusten
575bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_SMBUS_EXECUTE_OPCODE:
576bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
577bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWriteSmbusExecute (Marker);
578bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
579bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
580bdfde4623daff97f8f796a89329048ece94d4be9jljusten
581bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_STALL_OPCODE:
582bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
583bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWriteStall (Marker);
584bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
585bdfde4623daff97f8f796a89329048ece94d4be9jljusten
586bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
587bdfde4623daff97f8f796a89329048ece94d4be9jljusten
588bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_DISPATCH_OPCODE:
589bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
590bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWriteDispatch (Marker);
591bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
592bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
593bdfde4623daff97f8f796a89329048ece94d4be9jljusten
594bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_DISPATCH_2_OPCODE:
595bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
596bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWriteDispatch2 (Marker);
597bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
598bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
599bdfde4623daff97f8f796a89329048ece94d4be9jljusten
600bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_INFORMATION_OPCODE:
601bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
602bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWriteInformation (Marker);
603bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
604bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
605bdfde4623daff97f8f796a89329048ece94d4be9jljusten
606bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_MEM_POLL_OPCODE:
607bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
608bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWriteMemPoll (Marker);
609bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
610bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
611bdfde4623daff97f8f796a89329048ece94d4be9jljusten
612bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_PCI_CONFIG2_WRITE_OPCODE:
613bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
614bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWritePciCfg2Write (Marker);
615bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
616bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
617bdfde4623daff97f8f796a89329048ece94d4be9jljusten
618bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_PCI_CONFIG2_READ_WRITE_OPCODE:
619bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
620bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWritePciCfg2ReadWrite (Marker);
621bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
622bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
623bdfde4623daff97f8f796a89329048ece94d4be9jljusten
624bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_IO_POLL_OPCODE:
625bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
626bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWriteIoPoll (Marker);
627bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
628bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
629bdfde4623daff97f8f796a89329048ece94d4be9jljusten
630bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_PCI_CONFIG_POLL_OPCODE:
631bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
632bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWritePciConfigPoll (Marker);
633bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
634bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
635bdfde4623daff97f8f796a89329048ece94d4be9jljusten
636bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_PCI_CONFIG2_POLL_OPCODE:
637bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
638bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWritePciConfig2Poll (Marker);
639bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
640bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
641bdfde4623daff97f8f796a89329048ece94d4be9jljusten
642bdfde4623daff97f8f796a89329048ece94d4be9jljusten  default:
643bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = EFI_INVALID_PARAMETER;
644bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
645bdfde4623daff97f8f796a89329048ece94d4be9jljusten  }
646bdfde4623daff97f8f796a89329048ece94d4be9jljusten
647bdfde4623daff97f8f796a89329048ece94d4be9jljusten  return Status;
648bdfde4623daff97f8f796a89329048ece94d4be9jljusten}
649bdfde4623daff97f8f796a89329048ece94d4be9jljusten/**
650bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Insert a record into a specified Framework boot script table.
651bdfde4623daff97f8f796a89329048ece94d4be9jljusten
652bdfde4623daff97f8f796a89329048ece94d4be9jljusten  This function is used to store an OpCode to be replayed as part of the S3 resume boot path. It is
653bdfde4623daff97f8f796a89329048ece94d4be9jljusten  assumed this protocol has platform specific mechanism to store the OpCode set and replay them
654bdfde4623daff97f8f796a89329048ece94d4be9jljusten  during the S3 resume.
655bdfde4623daff97f8f796a89329048ece94d4be9jljusten  The opcode is inserted before or after the specified position in the boot script table. If Position is
656bdfde4623daff97f8f796a89329048ece94d4be9jljusten  NULL then that position is after the last opcode in the table (BeforeOrAfter is FALSE) or before
657bdfde4623daff97f8f796a89329048ece94d4be9jljusten  the first opcode in the table (BeforeOrAfter is TRUE). The position which is pointed to by
658bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Position upon return can be used for subsequent insertions.
659bdfde4623daff97f8f796a89329048ece94d4be9jljusten
660bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  This                  A pointer to the EFI_S3_SAVE_STATE_PROTOCOL instance.
661bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  BeforeOrAfter         Specifies whether the opcode is stored before (TRUE) or after (FALSE) the position
662bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                in the boot script table specified by Position. If Position is NULL or points to
663bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                NULL then the new opcode is inserted at the beginning of the table (if TRUE) or end
664bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                of the table (if FALSE).
665bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  Position              On entry, specifies the position in the boot script table where the opcode will be
666bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                inserted, either before or after, depending on BeforeOrAfter. On exit, specifies
667bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                the position of the inserted opcode in the boot script table.
668bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  OpCode                The operation code (opcode) number.
669bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  ...                   Argument list that is specific to each opcode.
670bdfde4623daff97f8f796a89329048ece94d4be9jljusten
671bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_SUCCESS           The operation succeeded. A record was added into the
672bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                specified script table.
673bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_INVALID_PARAMETER The Opcode is an invalid opcode value or the Position is not a valid position in the boot script table..
674bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_OUT_OF_RESOURCES  There is insufficient memory to store the boot script.
675bdfde4623daff97f8f796a89329048ece94d4be9jljusten
676bdfde4623daff97f8f796a89329048ece94d4be9jljusten**/
677bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFI_STATUS
678bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFIAPI
679bdfde4623daff97f8f796a89329048ece94d4be9jljustenBootScriptInsert (
680bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN CONST EFI_S3_SAVE_STATE_PROTOCOL     *This,
681bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN       BOOLEAN                        BeforeOrAfter,
682bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN OUT   EFI_S3_BOOT_SCRIPT_POSITION    *Position OPTIONAL,
683bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN       UINT16                         OpCode,
684bdfde4623daff97f8f796a89329048ece94d4be9jljusten  ...
685bdfde4623daff97f8f796a89329048ece94d4be9jljusten  )
686bdfde4623daff97f8f796a89329048ece94d4be9jljusten{
687bdfde4623daff97f8f796a89329048ece94d4be9jljusten  EFI_STATUS                Status;
688bdfde4623daff97f8f796a89329048ece94d4be9jljusten  VA_LIST                   Marker;
689bdfde4623daff97f8f796a89329048ece94d4be9jljusten  //
690bdfde4623daff97f8f796a89329048ece94d4be9jljusten  // Build script according to opcode
691bdfde4623daff97f8f796a89329048ece94d4be9jljusten  //
692bdfde4623daff97f8f796a89329048ece94d4be9jljusten  switch (OpCode) {
693bdfde4623daff97f8f796a89329048ece94d4be9jljusten
694bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_IO_WRITE_OPCODE:
695bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
696bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWriteIoWrite (Marker);
697bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
698bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
699bdfde4623daff97f8f796a89329048ece94d4be9jljusten
700bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_IO_READ_WRITE_OPCODE:
701bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
702bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWriteIoReadWrite (Marker);
703bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
704bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
705bdfde4623daff97f8f796a89329048ece94d4be9jljusten
706bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_MEM_WRITE_OPCODE:
707bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
708bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWriteMemWrite (Marker);
709bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
710bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
711bdfde4623daff97f8f796a89329048ece94d4be9jljusten
712bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_MEM_READ_WRITE_OPCODE:
713bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
714bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWriteMemReadWrite (Marker);
715bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
716bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
717bdfde4623daff97f8f796a89329048ece94d4be9jljusten
718bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_PCI_CONFIG_WRITE_OPCODE:
719bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
720bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWritePciCfgWrite (Marker);
721bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
722bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
723bdfde4623daff97f8f796a89329048ece94d4be9jljusten
724bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_PCI_CONFIG_READ_WRITE_OPCODE:
725bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
726bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWritePciCfgReadWrite (Marker);
727bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
728bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
729bdfde4623daff97f8f796a89329048ece94d4be9jljusten
730bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_SMBUS_EXECUTE_OPCODE:
731bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
732bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWriteSmbusExecute (Marker);
733bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
734bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
735bdfde4623daff97f8f796a89329048ece94d4be9jljusten
736bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_STALL_OPCODE:
737bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
738bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWriteStall (Marker);
739bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
740bdfde4623daff97f8f796a89329048ece94d4be9jljusten
741bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
742bdfde4623daff97f8f796a89329048ece94d4be9jljusten
743bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_DISPATCH_OPCODE:
744bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
745bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWriteDispatch (Marker);
746bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
747bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
748bdfde4623daff97f8f796a89329048ece94d4be9jljusten
749bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_DISPATCH_2_OPCODE:
750bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
751bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWriteDispatch2 (Marker);
752bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
753bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
754bdfde4623daff97f8f796a89329048ece94d4be9jljusten
755bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_INFORMATION_OPCODE:
756bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
757bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWriteInformation (Marker);
758bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
759bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
760bdfde4623daff97f8f796a89329048ece94d4be9jljusten
761bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_MEM_POLL_OPCODE:
762bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
763bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWriteMemPoll (Marker);
764bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
765bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
766bdfde4623daff97f8f796a89329048ece94d4be9jljusten
767bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_PCI_CONFIG2_WRITE_OPCODE:
768bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
769bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWritePciCfg2Write (Marker);
770bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
771bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
772bdfde4623daff97f8f796a89329048ece94d4be9jljusten
773bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_PCI_CONFIG2_READ_WRITE_OPCODE:
774bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
775bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWritePciCfg2ReadWrite (Marker);
776bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
777bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
778bdfde4623daff97f8f796a89329048ece94d4be9jljusten
779bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_IO_POLL_OPCODE:
780bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
781bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWriteIoPoll (Marker);
782bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
783bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
784bdfde4623daff97f8f796a89329048ece94d4be9jljusten
785bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_PCI_CONFIG_POLL_OPCODE:
786bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
787bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWritePciConfigPoll (Marker);
788bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
789bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
790bdfde4623daff97f8f796a89329048ece94d4be9jljusten
791bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_PCI_CONFIG2_POLL_OPCODE:
792bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
793bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWritePciConfig2Poll (Marker);
794bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
795bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
796bdfde4623daff97f8f796a89329048ece94d4be9jljusten
797bdfde4623daff97f8f796a89329048ece94d4be9jljusten  default:
798bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = EFI_INVALID_PARAMETER;
799bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
800bdfde4623daff97f8f796a89329048ece94d4be9jljusten  }
801bdfde4623daff97f8f796a89329048ece94d4be9jljusten
802bdfde4623daff97f8f796a89329048ece94d4be9jljusten  if (!EFI_ERROR (Status)) {
803bdfde4623daff97f8f796a89329048ece94d4be9jljusten   Status = S3BootScriptMoveLastOpcode (BeforeOrAfter, Position);
804bdfde4623daff97f8f796a89329048ece94d4be9jljusten  }
805bdfde4623daff97f8f796a89329048ece94d4be9jljusten  return Status;
806bdfde4623daff97f8f796a89329048ece94d4be9jljusten}
807bdfde4623daff97f8f796a89329048ece94d4be9jljusten/**
808bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Find a label within the boot script table and, if not present, optionally create it.
809bdfde4623daff97f8f796a89329048ece94d4be9jljusten
810bdfde4623daff97f8f796a89329048ece94d4be9jljusten  If the label Label is already exists in the boot script table, then no new label is created, the
811bdfde4623daff97f8f796a89329048ece94d4be9jljusten  position of the Label is returned in *Position and EFI_SUCCESS is returned.
812bdfde4623daff97f8f796a89329048ece94d4be9jljusten  If the label Label does not already exist and CreateIfNotFound is TRUE, then it will be
813bdfde4623daff97f8f796a89329048ece94d4be9jljusten  created before or after the specified position and EFI_SUCCESS is returned.
814bdfde4623daff97f8f796a89329048ece94d4be9jljusten  If the label Label does not already exist and CreateIfNotFound is FALSE, then
815bdfde4623daff97f8f796a89329048ece94d4be9jljusten  EFI_NOT_FOUND is returned.
816bdfde4623daff97f8f796a89329048ece94d4be9jljusten
817bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  This                  A pointer to the EFI_S3_SAVE_STATE_PROTOCOL instance.
818bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  BeforeOrAfter         Specifies whether the label is stored before (TRUE) or after (FALSE) the position in
819bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                the boot script table specified by Position. If Position is NULL or points to
820bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                NULL then the new label is inserted at the beginning of the table (if TRUE) or end of
821bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                the table (if FALSE).
822bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  CreateIfNotFound      Specifies whether the label will be created if the label does not exists (TRUE) or not
823bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                (FALSE).
824bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  Position              On entry, specifies the position in the boot script table where the label will be inserted,
825bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                either before or after, depending on BeforeOrAfter. On exit, specifies the position
826bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                of the inserted label in the boot script table.
827bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  Label                 Points to the label which will be inserted in the boot script table.
828bdfde4623daff97f8f796a89329048ece94d4be9jljusten
829bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_SUCCESS           The label already exists or was inserted.
830bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_INVALID_PARAMETER The Opcode is an invalid opcode value or the Position is not a valid position in the boot script table..
831bdfde4623daff97f8f796a89329048ece94d4be9jljusten
832bdfde4623daff97f8f796a89329048ece94d4be9jljusten**/
833bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFI_STATUS
834bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFIAPI
835bdfde4623daff97f8f796a89329048ece94d4be9jljustenBootScriptLabel (
836bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN CONST EFI_S3_SAVE_STATE_PROTOCOL           *This,
837bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN       BOOLEAN                              BeforeOrAfter,
838bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN       BOOLEAN                              CreateIfNotFound,
839bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN OUT   EFI_S3_BOOT_SCRIPT_POSITION          *Position OPTIONAL,
840bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN CONST CHAR8                                *Label
841bdfde4623daff97f8f796a89329048ece94d4be9jljusten  )
842bdfde4623daff97f8f796a89329048ece94d4be9jljusten{
843bdfde4623daff97f8f796a89329048ece94d4be9jljusten	return S3BootScriptLabel (BeforeOrAfter, CreateIfNotFound, Position, Label);
844bdfde4623daff97f8f796a89329048ece94d4be9jljusten}
845bdfde4623daff97f8f796a89329048ece94d4be9jljusten/**
846bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Compare two positions in the boot script table and return their relative position.
847bdfde4623daff97f8f796a89329048ece94d4be9jljusten
848bdfde4623daff97f8f796a89329048ece94d4be9jljusten  This function compares two positions in the boot script table and returns their relative positions. If
849bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Position1 is before Position2, then -1 is returned. If Position1 is equal to Position2,
850bdfde4623daff97f8f796a89329048ece94d4be9jljusten  then 0 is returned. If Position1 is after Position2, then 1 is returned.
851bdfde4623daff97f8f796a89329048ece94d4be9jljusten
852bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  This                  A pointer to the EFI_S3_SAVE_STATE_PROTOCOL instance.
853bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  Position1             The positions in the boot script table to compare
854bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  Position2             The positions in the boot script table to compare
855bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  RelativePosition      On return, points to the result of the comparison
856bdfde4623daff97f8f796a89329048ece94d4be9jljusten
857bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_SUCCESS           The operation succeeded.
858bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_INVALID_PARAMETER The Position1 or Position2 is not a valid position in the boot script table.
859bdfde4623daff97f8f796a89329048ece94d4be9jljusten
860bdfde4623daff97f8f796a89329048ece94d4be9jljusten**/
861bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFI_STATUS
862bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFIAPI
863bdfde4623daff97f8f796a89329048ece94d4be9jljustenBootScriptCompare (
864bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN CONST EFI_S3_SAVE_STATE_PROTOCOL      *This,
865bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN       EFI_S3_BOOT_SCRIPT_POSITION      Position1,
866bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN       EFI_S3_BOOT_SCRIPT_POSITION      Position2,
867bdfde4623daff97f8f796a89329048ece94d4be9jljusten  OUT      UINTN                           *RelativePosition
868bdfde4623daff97f8f796a89329048ece94d4be9jljusten  )
869bdfde4623daff97f8f796a89329048ece94d4be9jljusten{
870bdfde4623daff97f8f796a89329048ece94d4be9jljusten	return S3BootScriptCompare (Position1, Position2, RelativePosition);
871bdfde4623daff97f8f796a89329048ece94d4be9jljusten}
872bdfde4623daff97f8f796a89329048ece94d4be9jljusten/**
873bdfde4623daff97f8f796a89329048ece94d4be9jljusten  This routine is entry point of ScriptSave driver.
874bdfde4623daff97f8f796a89329048ece94d4be9jljusten
875bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  ImageHandle           Handle for this drivers loaded image protocol.
876bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  SystemTable           EFI system table.
877bdfde4623daff97f8f796a89329048ece94d4be9jljusten
878bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_OUT_OF_RESOURCES  No enough resource
879bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_SUCCESS           Succesfully installed the ScriptSave driver.
880bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval other                 Errors occured.
881bdfde4623daff97f8f796a89329048ece94d4be9jljusten
882bdfde4623daff97f8f796a89329048ece94d4be9jljusten**/
883bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFI_STATUS
884bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFIAPI
885bdfde4623daff97f8f796a89329048ece94d4be9jljustenInitializeS3SaveState (
886bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN EFI_HANDLE           ImageHandle,
887bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN EFI_SYSTEM_TABLE     *SystemTable
888bdfde4623daff97f8f796a89329048ece94d4be9jljusten  )
889bdfde4623daff97f8f796a89329048ece94d4be9jljusten{
890bdfde4623daff97f8f796a89329048ece94d4be9jljusten
891bdfde4623daff97f8f796a89329048ece94d4be9jljusten
892bdfde4623daff97f8f796a89329048ece94d4be9jljusten  return  gBS->InstallProtocolInterface (
893bdfde4623daff97f8f796a89329048ece94d4be9jljusten                  &mHandle,
894bdfde4623daff97f8f796a89329048ece94d4be9jljusten                  &gEfiS3SaveStateProtocolGuid,
895bdfde4623daff97f8f796a89329048ece94d4be9jljusten                  EFI_NATIVE_INTERFACE,
896bdfde4623daff97f8f796a89329048ece94d4be9jljusten                  &mS3SaveState
897bdfde4623daff97f8f796a89329048ece94d4be9jljusten                  );
898bdfde4623daff97f8f796a89329048ece94d4be9jljusten
899bdfde4623daff97f8f796a89329048ece94d4be9jljusten}
900bdfde4623daff97f8f796a89329048ece94d4be9jljusten
901bdfde4623daff97f8f796a89329048ece94d4be9jljusten
902