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