1bdfde4623daff97f8f796a89329048ece94d4be9jljusten/** @file 2bdfde4623daff97f8f796a89329048ece94d4be9jljusten Implementation for S3 Boot Script Saver state driver. 3bdfde4623daff97f8f796a89329048ece94d4be9jljusten 430522140a12f360d24babc36c9d9c8e4be8b1b5elzeng Copyright (c) 2006 - 2013, 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; 34730522140a12f360d24babc36c9d9c8e4be8b1b5elzeng UINTN LoopTimes; 34830522140a12f360d24babc36c9d9c8e4be8b1b5elzeng UINT32 Remainder; 34930522140a12f360d24babc36c9d9c8e4be8b1b5elzeng 350bdfde4623daff97f8f796a89329048ece94d4be9jljusten Width = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH); 351bdfde4623daff97f8f796a89329048ece94d4be9jljusten Address = VA_ARG (Marker, UINT64); 352bdfde4623daff97f8f796a89329048ece94d4be9jljusten Data = VA_ARG (Marker, VOID *); 353bdfde4623daff97f8f796a89329048ece94d4be9jljusten DataMask = VA_ARG (Marker, VOID *); 354bdfde4623daff97f8f796a89329048ece94d4be9jljusten Delay = (UINTN)VA_ARG (Marker, UINT64); 355bdfde4623daff97f8f796a89329048ece94d4be9jljusten // 35630522140a12f360d24babc36c9d9c8e4be8b1b5elzeng // According to the spec, the interval between 2 polls is 100ns, 35730522140a12f360d24babc36c9d9c8e4be8b1b5elzeng // but the unit of Duration for S3BootScriptSaveMemPoll() is microsecond(1000ns). 35830522140a12f360d24babc36c9d9c8e4be8b1b5elzeng // Duration * 1000ns * LoopTimes = Delay * 100ns 35930522140a12f360d24babc36c9d9c8e4be8b1b5elzeng // Duration will be minimum 1(microsecond) to be minimum deviation, 36030522140a12f360d24babc36c9d9c8e4be8b1b5elzeng // so LoopTimes = Delay / 10. 36130522140a12f360d24babc36c9d9c8e4be8b1b5elzeng // 3629f0b11ca07832189d8ceb82d9a5ed38f9b4cdc17lzeng LoopTimes = (UINTN) DivU64x32Remainder ( 36330522140a12f360d24babc36c9d9c8e4be8b1b5elzeng Delay, 36430522140a12f360d24babc36c9d9c8e4be8b1b5elzeng 10, 36530522140a12f360d24babc36c9d9c8e4be8b1b5elzeng &Remainder 36630522140a12f360d24babc36c9d9c8e4be8b1b5elzeng ); 36730522140a12f360d24babc36c9d9c8e4be8b1b5elzeng if (Remainder != 0) { 36830522140a12f360d24babc36c9d9c8e4be8b1b5elzeng // 36930522140a12f360d24babc36c9d9c8e4be8b1b5elzeng // If Remainder is not zero, LoopTimes will be rounded up by 1. 37030522140a12f360d24babc36c9d9c8e4be8b1b5elzeng // 37130522140a12f360d24babc36c9d9c8e4be8b1b5elzeng LoopTimes +=1; 37230522140a12f360d24babc36c9d9c8e4be8b1b5elzeng } 37330522140a12f360d24babc36c9d9c8e4be8b1b5elzeng return S3BootScriptSaveMemPoll (Width, Address, DataMask, Data, 1, LoopTimes); 374bdfde4623daff97f8f796a89329048ece94d4be9jljusten 375bdfde4623daff97f8f796a89329048ece94d4be9jljusten} 376bdfde4623daff97f8f796a89329048ece94d4be9jljusten 377bdfde4623daff97f8f796a89329048ece94d4be9jljusten/** 378bdfde4623daff97f8f796a89329048ece94d4be9jljusten Internal function to add Save jmp address according to DISPATCH_OPCODE2. 379bdfde4623daff97f8f796a89329048ece94d4be9jljusten The "Context" parameter is not ignored. 380bdfde4623daff97f8f796a89329048ece94d4be9jljusten 381bdfde4623daff97f8f796a89329048ece94d4be9jljusten @param Marker The variable argument list to get the opcode 382bdfde4623daff97f8f796a89329048ece94d4be9jljusten and associated attributes. 383bdfde4623daff97f8f796a89329048ece94d4be9jljusten 384bdfde4623daff97f8f796a89329048ece94d4be9jljusten @retval EFI_OUT_OF_RESOURCES Not enough resource to do operation. 385bdfde4623daff97f8f796a89329048ece94d4be9jljusten @retval EFI_SUCCESS Opcode is added. 386bdfde4623daff97f8f796a89329048ece94d4be9jljusten 387bdfde4623daff97f8f796a89329048ece94d4be9jljusten**/ 388bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFI_STATUS 389bdfde4623daff97f8f796a89329048ece94d4be9jljustenBootScriptWriteDispatch2 ( 390bdfde4623daff97f8f796a89329048ece94d4be9jljusten IN VA_LIST Marker 391bdfde4623daff97f8f796a89329048ece94d4be9jljusten ) 392bdfde4623daff97f8f796a89329048ece94d4be9jljusten{ 393bdfde4623daff97f8f796a89329048ece94d4be9jljusten VOID *EntryPoint; 394bdfde4623daff97f8f796a89329048ece94d4be9jljusten VOID *Context; 395bdfde4623daff97f8f796a89329048ece94d4be9jljusten 396bdfde4623daff97f8f796a89329048ece94d4be9jljusten EntryPoint = (VOID*)(UINTN)VA_ARG (Marker, EFI_PHYSICAL_ADDRESS); 397bdfde4623daff97f8f796a89329048ece94d4be9jljusten Context = (VOID*)(UINTN)VA_ARG (Marker, EFI_PHYSICAL_ADDRESS); 398bdfde4623daff97f8f796a89329048ece94d4be9jljusten 399bdfde4623daff97f8f796a89329048ece94d4be9jljusten return S3BootScriptSaveDispatch2 (EntryPoint, Context); 400bdfde4623daff97f8f796a89329048ece94d4be9jljusten} 401bdfde4623daff97f8f796a89329048ece94d4be9jljusten/** 402bdfde4623daff97f8f796a89329048ece94d4be9jljusten Internal function to add INFORAMTION opcode node to the table 403bdfde4623daff97f8f796a89329048ece94d4be9jljusten list. 404bdfde4623daff97f8f796a89329048ece94d4be9jljusten @param Marker The variable argument list to get the opcode 405bdfde4623daff97f8f796a89329048ece94d4be9jljusten and associated attributes. 406bdfde4623daff97f8f796a89329048ece94d4be9jljusten 407bdfde4623daff97f8f796a89329048ece94d4be9jljusten @retval EFI_OUT_OF_RESOURCES Not enought resource to complete the operations. 408bdfde4623daff97f8f796a89329048ece94d4be9jljusten @retval EFI_SUCCESS The opcode entry is added to the table 409bdfde4623daff97f8f796a89329048ece94d4be9jljusten successfully. 410bdfde4623daff97f8f796a89329048ece94d4be9jljusten**/ 411bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFI_STATUS 412bdfde4623daff97f8f796a89329048ece94d4be9jljustenBootScriptWriteInformation ( 413bdfde4623daff97f8f796a89329048ece94d4be9jljusten IN VA_LIST Marker 414bdfde4623daff97f8f796a89329048ece94d4be9jljusten ) 415bdfde4623daff97f8f796a89329048ece94d4be9jljusten{ 416bdfde4623daff97f8f796a89329048ece94d4be9jljusten UINT32 InformationLength; 417bdfde4623daff97f8f796a89329048ece94d4be9jljusten EFI_PHYSICAL_ADDRESS Information; 418bdfde4623daff97f8f796a89329048ece94d4be9jljusten 419bdfde4623daff97f8f796a89329048ece94d4be9jljusten InformationLength = VA_ARG (Marker, UINT32); 420bdfde4623daff97f8f796a89329048ece94d4be9jljusten Information = VA_ARG (Marker, EFI_PHYSICAL_ADDRESS); 421bdfde4623daff97f8f796a89329048ece94d4be9jljusten return S3BootScriptSaveInformation (InformationLength, (VOID*)(UINTN)Information); 422bdfde4623daff97f8f796a89329048ece94d4be9jljusten} 423bdfde4623daff97f8f796a89329048ece94d4be9jljusten/** 424bdfde4623daff97f8f796a89329048ece94d4be9jljusten Internal function to add IO poll opcode node to the table 425bdfde4623daff97f8f796a89329048ece94d4be9jljusten @param Marker The variable argument list to get the opcode 426bdfde4623daff97f8f796a89329048ece94d4be9jljusten and associated attributes. 427bdfde4623daff97f8f796a89329048ece94d4be9jljusten 428bdfde4623daff97f8f796a89329048ece94d4be9jljusten @retval EFI_OUT_OF_RESOURCES Not enought resource to complete the operations. 429bdfde4623daff97f8f796a89329048ece94d4be9jljusten @retval EFI_SUCCESS The opcode entry is added to the table 430bdfde4623daff97f8f796a89329048ece94d4be9jljusten successfully. 431bdfde4623daff97f8f796a89329048ece94d4be9jljusten**/ 432bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFI_STATUS 433bdfde4623daff97f8f796a89329048ece94d4be9jljustenBootScriptWriteIoPoll ( 434bdfde4623daff97f8f796a89329048ece94d4be9jljusten IN VA_LIST Marker 435bdfde4623daff97f8f796a89329048ece94d4be9jljusten ) 436bdfde4623daff97f8f796a89329048ece94d4be9jljusten{ 437bdfde4623daff97f8f796a89329048ece94d4be9jljusten S3_BOOT_SCRIPT_LIB_WIDTH Width; 438bdfde4623daff97f8f796a89329048ece94d4be9jljusten UINT64 Address; 439bdfde4623daff97f8f796a89329048ece94d4be9jljusten VOID *Data; 440bdfde4623daff97f8f796a89329048ece94d4be9jljusten VOID *DataMask; 441bdfde4623daff97f8f796a89329048ece94d4be9jljusten UINT64 Delay; 442bdfde4623daff97f8f796a89329048ece94d4be9jljusten 443bdfde4623daff97f8f796a89329048ece94d4be9jljusten Width = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH); 444bdfde4623daff97f8f796a89329048ece94d4be9jljusten Address = VA_ARG (Marker, UINT64); 445bdfde4623daff97f8f796a89329048ece94d4be9jljusten Data = VA_ARG (Marker, VOID *); 446bdfde4623daff97f8f796a89329048ece94d4be9jljusten DataMask = VA_ARG (Marker, VOID *); 447bdfde4623daff97f8f796a89329048ece94d4be9jljusten Delay = (UINT64)VA_ARG (Marker, UINT64); 448bdfde4623daff97f8f796a89329048ece94d4be9jljusten 449bdfde4623daff97f8f796a89329048ece94d4be9jljusten return S3BootScriptSaveIoPoll (Width, Address, Data, DataMask, Delay); 450bdfde4623daff97f8f796a89329048ece94d4be9jljusten} 451bdfde4623daff97f8f796a89329048ece94d4be9jljusten/** 452bdfde4623daff97f8f796a89329048ece94d4be9jljusten Internal function to add PCI config poll opcode node to the table 453bdfde4623daff97f8f796a89329048ece94d4be9jljusten 454bdfde4623daff97f8f796a89329048ece94d4be9jljusten @param Marker The variable argument list to get the opcode 455bdfde4623daff97f8f796a89329048ece94d4be9jljusten and associated attributes. 456bdfde4623daff97f8f796a89329048ece94d4be9jljusten 457bdfde4623daff97f8f796a89329048ece94d4be9jljusten @retval EFI_OUT_OF_RESOURCES Not enought resource to complete the operations. 458bdfde4623daff97f8f796a89329048ece94d4be9jljusten @retval EFI_SUCCESS The opcode entry is added to the table 459bdfde4623daff97f8f796a89329048ece94d4be9jljusten successfully. 460bdfde4623daff97f8f796a89329048ece94d4be9jljusten**/ 461bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFI_STATUS 462bdfde4623daff97f8f796a89329048ece94d4be9jljustenBootScriptWritePciConfigPoll ( 463bdfde4623daff97f8f796a89329048ece94d4be9jljusten IN VA_LIST Marker 464bdfde4623daff97f8f796a89329048ece94d4be9jljusten ) 465bdfde4623daff97f8f796a89329048ece94d4be9jljusten{ 466bdfde4623daff97f8f796a89329048ece94d4be9jljusten S3_BOOT_SCRIPT_LIB_WIDTH Width; 467bdfde4623daff97f8f796a89329048ece94d4be9jljusten UINT64 Address; 468bdfde4623daff97f8f796a89329048ece94d4be9jljusten VOID *Data; 469bdfde4623daff97f8f796a89329048ece94d4be9jljusten VOID *DataMask; 470bdfde4623daff97f8f796a89329048ece94d4be9jljusten UINT64 Delay; 471bdfde4623daff97f8f796a89329048ece94d4be9jljusten 472bdfde4623daff97f8f796a89329048ece94d4be9jljusten 473bdfde4623daff97f8f796a89329048ece94d4be9jljusten Width = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH); 474bdfde4623daff97f8f796a89329048ece94d4be9jljusten Address = VA_ARG (Marker, UINT64); 475bdfde4623daff97f8f796a89329048ece94d4be9jljusten Data = VA_ARG (Marker, VOID *); 476bdfde4623daff97f8f796a89329048ece94d4be9jljusten DataMask = VA_ARG (Marker, VOID *); 477bdfde4623daff97f8f796a89329048ece94d4be9jljusten Delay = (UINT64)VA_ARG (Marker, UINT64); 478bdfde4623daff97f8f796a89329048ece94d4be9jljusten 479bdfde4623daff97f8f796a89329048ece94d4be9jljusten return S3BootScriptSavePciPoll (Width, Address, Data, DataMask, Delay); 480bdfde4623daff97f8f796a89329048ece94d4be9jljusten} 481bdfde4623daff97f8f796a89329048ece94d4be9jljusten/** 482bdfde4623daff97f8f796a89329048ece94d4be9jljusten Internal function to add PCI config 2 poll opcode node to the table 483bdfde4623daff97f8f796a89329048ece94d4be9jljusten 484bdfde4623daff97f8f796a89329048ece94d4be9jljusten @param Marker The variable argument list to get the opcode 485bdfde4623daff97f8f796a89329048ece94d4be9jljusten and associated attributes. 486bdfde4623daff97f8f796a89329048ece94d4be9jljusten 487bdfde4623daff97f8f796a89329048ece94d4be9jljusten @retval EFI_OUT_OF_RESOURCES Not enought resource to complete the operations. 488bdfde4623daff97f8f796a89329048ece94d4be9jljusten @retval EFI_SUCCESS The opcode entry is added to the table 489bdfde4623daff97f8f796a89329048ece94d4be9jljusten successfully. 490bdfde4623daff97f8f796a89329048ece94d4be9jljusten**/ 491bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFI_STATUS 492bdfde4623daff97f8f796a89329048ece94d4be9jljustenBootScriptWritePciConfig2Poll ( 493bdfde4623daff97f8f796a89329048ece94d4be9jljusten IN VA_LIST Marker 494bdfde4623daff97f8f796a89329048ece94d4be9jljusten ) 495bdfde4623daff97f8f796a89329048ece94d4be9jljusten{ 496bdfde4623daff97f8f796a89329048ece94d4be9jljusten S3_BOOT_SCRIPT_LIB_WIDTH Width; 497bdfde4623daff97f8f796a89329048ece94d4be9jljusten UINT16 Segment; 498bdfde4623daff97f8f796a89329048ece94d4be9jljusten UINT64 Address; 499bdfde4623daff97f8f796a89329048ece94d4be9jljusten VOID *Data; 500bdfde4623daff97f8f796a89329048ece94d4be9jljusten VOID *DataMask; 501bdfde4623daff97f8f796a89329048ece94d4be9jljusten UINT64 Delay; 502bdfde4623daff97f8f796a89329048ece94d4be9jljusten 503bdfde4623daff97f8f796a89329048ece94d4be9jljusten Width = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH); 504bdfde4623daff97f8f796a89329048ece94d4be9jljusten Segment = VA_ARG (Marker, UINT16); 505bdfde4623daff97f8f796a89329048ece94d4be9jljusten Address = VA_ARG (Marker, UINT64); 506bdfde4623daff97f8f796a89329048ece94d4be9jljusten Data = VA_ARG (Marker, VOID *); 507bdfde4623daff97f8f796a89329048ece94d4be9jljusten DataMask = VA_ARG (Marker, VOID *); 508bdfde4623daff97f8f796a89329048ece94d4be9jljusten Delay = (UINT64)VA_ARG (Marker, UINT64); 509bdfde4623daff97f8f796a89329048ece94d4be9jljusten 510bdfde4623daff97f8f796a89329048ece94d4be9jljusten return S3BootScriptSavePci2Poll (Width, Segment, Address, Data, DataMask, Delay); 511bdfde4623daff97f8f796a89329048ece94d4be9jljusten} 512bdfde4623daff97f8f796a89329048ece94d4be9jljusten 513bdfde4623daff97f8f796a89329048ece94d4be9jljusten 514bdfde4623daff97f8f796a89329048ece94d4be9jljusten/** 515bdfde4623daff97f8f796a89329048ece94d4be9jljusten Adds a record into S3 boot script table. 516bdfde4623daff97f8f796a89329048ece94d4be9jljusten 517bdfde4623daff97f8f796a89329048ece94d4be9jljusten This function is used to store a boot script record into a given boot 518bdfde4623daff97f8f796a89329048ece94d4be9jljusten script table. If the table specified by TableName is nonexistent in the 519bdfde4623daff97f8f796a89329048ece94d4be9jljusten system, a new table will automatically be created and then the script record 520bdfde4623daff97f8f796a89329048ece94d4be9jljusten will be added into the new table. This function is responsible for allocating 521bdfde4623daff97f8f796a89329048ece94d4be9jljusten necessary memory for the script. 522bdfde4623daff97f8f796a89329048ece94d4be9jljusten 523bdfde4623daff97f8f796a89329048ece94d4be9jljusten This function has a variable parameter list. The exact parameter list depends on 524bdfde4623daff97f8f796a89329048ece94d4be9jljusten the OpCode that is passed into the function. If an unsupported OpCode or illegal 525bdfde4623daff97f8f796a89329048ece94d4be9jljusten parameter list is passed in, this function returns EFI_INVALID_PARAMETER. 526bdfde4623daff97f8f796a89329048ece94d4be9jljusten If there are not enough resources available for storing more scripts, this function returns 527bdfde4623daff97f8f796a89329048ece94d4be9jljusten EFI_OUT_OF_RESOURCES. 528bdfde4623daff97f8f796a89329048ece94d4be9jljusten 529bdfde4623daff97f8f796a89329048ece94d4be9jljusten @param This A pointer to the EFI_S3_SAVE_STATE_PROTOCOL instance. 530bdfde4623daff97f8f796a89329048ece94d4be9jljusten @param OpCode The operation code (opcode) number. 531bdfde4623daff97f8f796a89329048ece94d4be9jljusten @param ... Argument list that is specific to each opcode. 532bdfde4623daff97f8f796a89329048ece94d4be9jljusten 533bdfde4623daff97f8f796a89329048ece94d4be9jljusten @retval EFI_SUCCESS The operation succeeded. A record was added into the 534bdfde4623daff97f8f796a89329048ece94d4be9jljusten specified script table. 535bdfde4623daff97f8f796a89329048ece94d4be9jljusten @retval EFI_INVALID_PARAMETER The parameter is illegal or the given boot script is not supported. 536bdfde4623daff97f8f796a89329048ece94d4be9jljusten If the opcode is unknow or not supported because of the PCD 537bdfde4623daff97f8f796a89329048ece94d4be9jljusten Feature Flags. 538bdfde4623daff97f8f796a89329048ece94d4be9jljusten @retval EFI_OUT_OF_RESOURCES There is insufficient memory to store the boot script. 539bdfde4623daff97f8f796a89329048ece94d4be9jljusten 540bdfde4623daff97f8f796a89329048ece94d4be9jljusten**/ 541bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFI_STATUS 542bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFIAPI 543bdfde4623daff97f8f796a89329048ece94d4be9jljustenBootScriptWrite ( 544bdfde4623daff97f8f796a89329048ece94d4be9jljusten IN CONST EFI_S3_SAVE_STATE_PROTOCOL *This, 545bdfde4623daff97f8f796a89329048ece94d4be9jljusten IN UINT16 OpCode, 546bdfde4623daff97f8f796a89329048ece94d4be9jljusten ... 547bdfde4623daff97f8f796a89329048ece94d4be9jljusten ) 548bdfde4623daff97f8f796a89329048ece94d4be9jljusten{ 549bdfde4623daff97f8f796a89329048ece94d4be9jljusten EFI_STATUS Status; 550bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_LIST Marker; 551bdfde4623daff97f8f796a89329048ece94d4be9jljusten // 552bdfde4623daff97f8f796a89329048ece94d4be9jljusten // Build script according to opcode 553bdfde4623daff97f8f796a89329048ece94d4be9jljusten // 554bdfde4623daff97f8f796a89329048ece94d4be9jljusten switch (OpCode) { 555bdfde4623daff97f8f796a89329048ece94d4be9jljusten 556bdfde4623daff97f8f796a89329048ece94d4be9jljusten case EFI_BOOT_SCRIPT_IO_WRITE_OPCODE: 557bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_START (Marker, OpCode); 558bdfde4623daff97f8f796a89329048ece94d4be9jljusten Status = BootScriptWriteIoWrite (Marker); 559bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_END (Marker); 560bdfde4623daff97f8f796a89329048ece94d4be9jljusten break; 561bdfde4623daff97f8f796a89329048ece94d4be9jljusten 562bdfde4623daff97f8f796a89329048ece94d4be9jljusten case EFI_BOOT_SCRIPT_IO_READ_WRITE_OPCODE: 563bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_START (Marker, OpCode); 564bdfde4623daff97f8f796a89329048ece94d4be9jljusten Status = BootScriptWriteIoReadWrite (Marker); 565bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_END (Marker); 566bdfde4623daff97f8f796a89329048ece94d4be9jljusten break; 567bdfde4623daff97f8f796a89329048ece94d4be9jljusten 568bdfde4623daff97f8f796a89329048ece94d4be9jljusten case EFI_BOOT_SCRIPT_MEM_WRITE_OPCODE: 569bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_START (Marker, OpCode); 570bdfde4623daff97f8f796a89329048ece94d4be9jljusten Status = BootScriptWriteMemWrite (Marker); 571bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_END (Marker); 572bdfde4623daff97f8f796a89329048ece94d4be9jljusten break; 573bdfde4623daff97f8f796a89329048ece94d4be9jljusten 574bdfde4623daff97f8f796a89329048ece94d4be9jljusten case EFI_BOOT_SCRIPT_MEM_READ_WRITE_OPCODE: 575bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_START (Marker, OpCode); 576bdfde4623daff97f8f796a89329048ece94d4be9jljusten Status = BootScriptWriteMemReadWrite (Marker); 577bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_END (Marker); 578bdfde4623daff97f8f796a89329048ece94d4be9jljusten break; 579bdfde4623daff97f8f796a89329048ece94d4be9jljusten 580bdfde4623daff97f8f796a89329048ece94d4be9jljusten case EFI_BOOT_SCRIPT_PCI_CONFIG_WRITE_OPCODE: 581bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_START (Marker, OpCode); 582bdfde4623daff97f8f796a89329048ece94d4be9jljusten Status = BootScriptWritePciCfgWrite (Marker); 583bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_END (Marker); 584bdfde4623daff97f8f796a89329048ece94d4be9jljusten break; 585bdfde4623daff97f8f796a89329048ece94d4be9jljusten 586bdfde4623daff97f8f796a89329048ece94d4be9jljusten case EFI_BOOT_SCRIPT_PCI_CONFIG_READ_WRITE_OPCODE: 587bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_START (Marker, OpCode); 588bdfde4623daff97f8f796a89329048ece94d4be9jljusten Status = BootScriptWritePciCfgReadWrite (Marker); 589bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_END (Marker); 590bdfde4623daff97f8f796a89329048ece94d4be9jljusten break; 591bdfde4623daff97f8f796a89329048ece94d4be9jljusten 592bdfde4623daff97f8f796a89329048ece94d4be9jljusten case EFI_BOOT_SCRIPT_SMBUS_EXECUTE_OPCODE: 593bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_START (Marker, OpCode); 594bdfde4623daff97f8f796a89329048ece94d4be9jljusten Status = BootScriptWriteSmbusExecute (Marker); 595bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_END (Marker); 596bdfde4623daff97f8f796a89329048ece94d4be9jljusten break; 597bdfde4623daff97f8f796a89329048ece94d4be9jljusten 598bdfde4623daff97f8f796a89329048ece94d4be9jljusten case EFI_BOOT_SCRIPT_STALL_OPCODE: 599bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_START (Marker, OpCode); 600bdfde4623daff97f8f796a89329048ece94d4be9jljusten Status = BootScriptWriteStall (Marker); 601bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_END (Marker); 602bdfde4623daff97f8f796a89329048ece94d4be9jljusten 603bdfde4623daff97f8f796a89329048ece94d4be9jljusten break; 604bdfde4623daff97f8f796a89329048ece94d4be9jljusten 605bdfde4623daff97f8f796a89329048ece94d4be9jljusten case EFI_BOOT_SCRIPT_DISPATCH_OPCODE: 606bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_START (Marker, OpCode); 607bdfde4623daff97f8f796a89329048ece94d4be9jljusten Status = BootScriptWriteDispatch (Marker); 608bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_END (Marker); 609bdfde4623daff97f8f796a89329048ece94d4be9jljusten break; 610bdfde4623daff97f8f796a89329048ece94d4be9jljusten 611bdfde4623daff97f8f796a89329048ece94d4be9jljusten case EFI_BOOT_SCRIPT_DISPATCH_2_OPCODE: 612bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_START (Marker, OpCode); 613bdfde4623daff97f8f796a89329048ece94d4be9jljusten Status = BootScriptWriteDispatch2 (Marker); 614bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_END (Marker); 615bdfde4623daff97f8f796a89329048ece94d4be9jljusten break; 616bdfde4623daff97f8f796a89329048ece94d4be9jljusten 617bdfde4623daff97f8f796a89329048ece94d4be9jljusten case EFI_BOOT_SCRIPT_INFORMATION_OPCODE: 618bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_START (Marker, OpCode); 619bdfde4623daff97f8f796a89329048ece94d4be9jljusten Status = BootScriptWriteInformation (Marker); 620bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_END (Marker); 621bdfde4623daff97f8f796a89329048ece94d4be9jljusten break; 622bdfde4623daff97f8f796a89329048ece94d4be9jljusten 623bdfde4623daff97f8f796a89329048ece94d4be9jljusten case EFI_BOOT_SCRIPT_MEM_POLL_OPCODE: 624bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_START (Marker, OpCode); 625bdfde4623daff97f8f796a89329048ece94d4be9jljusten Status = BootScriptWriteMemPoll (Marker); 626bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_END (Marker); 627bdfde4623daff97f8f796a89329048ece94d4be9jljusten break; 628bdfde4623daff97f8f796a89329048ece94d4be9jljusten 629bdfde4623daff97f8f796a89329048ece94d4be9jljusten case EFI_BOOT_SCRIPT_PCI_CONFIG2_WRITE_OPCODE: 630bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_START (Marker, OpCode); 631bdfde4623daff97f8f796a89329048ece94d4be9jljusten Status = BootScriptWritePciCfg2Write (Marker); 632bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_END (Marker); 633bdfde4623daff97f8f796a89329048ece94d4be9jljusten break; 634bdfde4623daff97f8f796a89329048ece94d4be9jljusten 635bdfde4623daff97f8f796a89329048ece94d4be9jljusten case EFI_BOOT_SCRIPT_PCI_CONFIG2_READ_WRITE_OPCODE: 636bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_START (Marker, OpCode); 637bdfde4623daff97f8f796a89329048ece94d4be9jljusten Status = BootScriptWritePciCfg2ReadWrite (Marker); 638bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_END (Marker); 639bdfde4623daff97f8f796a89329048ece94d4be9jljusten break; 640bdfde4623daff97f8f796a89329048ece94d4be9jljusten 641bdfde4623daff97f8f796a89329048ece94d4be9jljusten case EFI_BOOT_SCRIPT_IO_POLL_OPCODE: 642bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_START (Marker, OpCode); 643bdfde4623daff97f8f796a89329048ece94d4be9jljusten Status = BootScriptWriteIoPoll (Marker); 644bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_END (Marker); 645bdfde4623daff97f8f796a89329048ece94d4be9jljusten break; 646bdfde4623daff97f8f796a89329048ece94d4be9jljusten 647bdfde4623daff97f8f796a89329048ece94d4be9jljusten case EFI_BOOT_SCRIPT_PCI_CONFIG_POLL_OPCODE: 648bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_START (Marker, OpCode); 649bdfde4623daff97f8f796a89329048ece94d4be9jljusten Status = BootScriptWritePciConfigPoll (Marker); 650bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_END (Marker); 651bdfde4623daff97f8f796a89329048ece94d4be9jljusten break; 652bdfde4623daff97f8f796a89329048ece94d4be9jljusten 653bdfde4623daff97f8f796a89329048ece94d4be9jljusten case EFI_BOOT_SCRIPT_PCI_CONFIG2_POLL_OPCODE: 654bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_START (Marker, OpCode); 655bdfde4623daff97f8f796a89329048ece94d4be9jljusten Status = BootScriptWritePciConfig2Poll (Marker); 656bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_END (Marker); 657bdfde4623daff97f8f796a89329048ece94d4be9jljusten break; 658bdfde4623daff97f8f796a89329048ece94d4be9jljusten 659bdfde4623daff97f8f796a89329048ece94d4be9jljusten default: 660bdfde4623daff97f8f796a89329048ece94d4be9jljusten Status = EFI_INVALID_PARAMETER; 661bdfde4623daff97f8f796a89329048ece94d4be9jljusten break; 662bdfde4623daff97f8f796a89329048ece94d4be9jljusten } 663bdfde4623daff97f8f796a89329048ece94d4be9jljusten 664bdfde4623daff97f8f796a89329048ece94d4be9jljusten return Status; 665bdfde4623daff97f8f796a89329048ece94d4be9jljusten} 666bdfde4623daff97f8f796a89329048ece94d4be9jljusten/** 667bdfde4623daff97f8f796a89329048ece94d4be9jljusten Insert a record into a specified Framework boot script table. 668bdfde4623daff97f8f796a89329048ece94d4be9jljusten 669bdfde4623daff97f8f796a89329048ece94d4be9jljusten This function is used to store an OpCode to be replayed as part of the S3 resume boot path. It is 670bdfde4623daff97f8f796a89329048ece94d4be9jljusten assumed this protocol has platform specific mechanism to store the OpCode set and replay them 671bdfde4623daff97f8f796a89329048ece94d4be9jljusten during the S3 resume. 672bdfde4623daff97f8f796a89329048ece94d4be9jljusten The opcode is inserted before or after the specified position in the boot script table. If Position is 673bdfde4623daff97f8f796a89329048ece94d4be9jljusten NULL then that position is after the last opcode in the table (BeforeOrAfter is FALSE) or before 674bdfde4623daff97f8f796a89329048ece94d4be9jljusten the first opcode in the table (BeforeOrAfter is TRUE). The position which is pointed to by 675bdfde4623daff97f8f796a89329048ece94d4be9jljusten Position upon return can be used for subsequent insertions. 676bdfde4623daff97f8f796a89329048ece94d4be9jljusten 677bdfde4623daff97f8f796a89329048ece94d4be9jljusten @param This A pointer to the EFI_S3_SAVE_STATE_PROTOCOL instance. 678bdfde4623daff97f8f796a89329048ece94d4be9jljusten @param BeforeOrAfter Specifies whether the opcode is stored before (TRUE) or after (FALSE) the position 679bdfde4623daff97f8f796a89329048ece94d4be9jljusten in the boot script table specified by Position. If Position is NULL or points to 680bdfde4623daff97f8f796a89329048ece94d4be9jljusten NULL then the new opcode is inserted at the beginning of the table (if TRUE) or end 681bdfde4623daff97f8f796a89329048ece94d4be9jljusten of the table (if FALSE). 682bdfde4623daff97f8f796a89329048ece94d4be9jljusten @param Position On entry, specifies the position in the boot script table where the opcode will be 683bdfde4623daff97f8f796a89329048ece94d4be9jljusten inserted, either before or after, depending on BeforeOrAfter. On exit, specifies 684bdfde4623daff97f8f796a89329048ece94d4be9jljusten the position of the inserted opcode in the boot script table. 685bdfde4623daff97f8f796a89329048ece94d4be9jljusten @param OpCode The operation code (opcode) number. 686bdfde4623daff97f8f796a89329048ece94d4be9jljusten @param ... Argument list that is specific to each opcode. 687bdfde4623daff97f8f796a89329048ece94d4be9jljusten 688bdfde4623daff97f8f796a89329048ece94d4be9jljusten @retval EFI_SUCCESS The operation succeeded. A record was added into the 689bdfde4623daff97f8f796a89329048ece94d4be9jljusten specified script table. 690bdfde4623daff97f8f796a89329048ece94d4be9jljusten @retval EFI_INVALID_PARAMETER The Opcode is an invalid opcode value or the Position is not a valid position in the boot script table.. 691bdfde4623daff97f8f796a89329048ece94d4be9jljusten @retval EFI_OUT_OF_RESOURCES There is insufficient memory to store the boot script. 692bdfde4623daff97f8f796a89329048ece94d4be9jljusten 693bdfde4623daff97f8f796a89329048ece94d4be9jljusten**/ 694bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFI_STATUS 695bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFIAPI 696bdfde4623daff97f8f796a89329048ece94d4be9jljustenBootScriptInsert ( 697bdfde4623daff97f8f796a89329048ece94d4be9jljusten IN CONST EFI_S3_SAVE_STATE_PROTOCOL *This, 698bdfde4623daff97f8f796a89329048ece94d4be9jljusten IN BOOLEAN BeforeOrAfter, 699bdfde4623daff97f8f796a89329048ece94d4be9jljusten IN OUT EFI_S3_BOOT_SCRIPT_POSITION *Position OPTIONAL, 700bdfde4623daff97f8f796a89329048ece94d4be9jljusten IN UINT16 OpCode, 701bdfde4623daff97f8f796a89329048ece94d4be9jljusten ... 702bdfde4623daff97f8f796a89329048ece94d4be9jljusten ) 703bdfde4623daff97f8f796a89329048ece94d4be9jljusten{ 704bdfde4623daff97f8f796a89329048ece94d4be9jljusten EFI_STATUS Status; 705bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_LIST Marker; 706bdfde4623daff97f8f796a89329048ece94d4be9jljusten // 707bdfde4623daff97f8f796a89329048ece94d4be9jljusten // Build script according to opcode 708bdfde4623daff97f8f796a89329048ece94d4be9jljusten // 709bdfde4623daff97f8f796a89329048ece94d4be9jljusten switch (OpCode) { 710bdfde4623daff97f8f796a89329048ece94d4be9jljusten 711bdfde4623daff97f8f796a89329048ece94d4be9jljusten case EFI_BOOT_SCRIPT_IO_WRITE_OPCODE: 712bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_START (Marker, OpCode); 713bdfde4623daff97f8f796a89329048ece94d4be9jljusten Status = BootScriptWriteIoWrite (Marker); 714bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_END (Marker); 715bdfde4623daff97f8f796a89329048ece94d4be9jljusten break; 716bdfde4623daff97f8f796a89329048ece94d4be9jljusten 717bdfde4623daff97f8f796a89329048ece94d4be9jljusten case EFI_BOOT_SCRIPT_IO_READ_WRITE_OPCODE: 718bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_START (Marker, OpCode); 719bdfde4623daff97f8f796a89329048ece94d4be9jljusten Status = BootScriptWriteIoReadWrite (Marker); 720bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_END (Marker); 721bdfde4623daff97f8f796a89329048ece94d4be9jljusten break; 722bdfde4623daff97f8f796a89329048ece94d4be9jljusten 723bdfde4623daff97f8f796a89329048ece94d4be9jljusten case EFI_BOOT_SCRIPT_MEM_WRITE_OPCODE: 724bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_START (Marker, OpCode); 725bdfde4623daff97f8f796a89329048ece94d4be9jljusten Status = BootScriptWriteMemWrite (Marker); 726bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_END (Marker); 727bdfde4623daff97f8f796a89329048ece94d4be9jljusten break; 728bdfde4623daff97f8f796a89329048ece94d4be9jljusten 729bdfde4623daff97f8f796a89329048ece94d4be9jljusten case EFI_BOOT_SCRIPT_MEM_READ_WRITE_OPCODE: 730bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_START (Marker, OpCode); 731bdfde4623daff97f8f796a89329048ece94d4be9jljusten Status = BootScriptWriteMemReadWrite (Marker); 732bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_END (Marker); 733bdfde4623daff97f8f796a89329048ece94d4be9jljusten break; 734bdfde4623daff97f8f796a89329048ece94d4be9jljusten 735bdfde4623daff97f8f796a89329048ece94d4be9jljusten case EFI_BOOT_SCRIPT_PCI_CONFIG_WRITE_OPCODE: 736bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_START (Marker, OpCode); 737bdfde4623daff97f8f796a89329048ece94d4be9jljusten Status = BootScriptWritePciCfgWrite (Marker); 738bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_END (Marker); 739bdfde4623daff97f8f796a89329048ece94d4be9jljusten break; 740bdfde4623daff97f8f796a89329048ece94d4be9jljusten 741bdfde4623daff97f8f796a89329048ece94d4be9jljusten case EFI_BOOT_SCRIPT_PCI_CONFIG_READ_WRITE_OPCODE: 742bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_START (Marker, OpCode); 743bdfde4623daff97f8f796a89329048ece94d4be9jljusten Status = BootScriptWritePciCfgReadWrite (Marker); 744bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_END (Marker); 745bdfde4623daff97f8f796a89329048ece94d4be9jljusten break; 746bdfde4623daff97f8f796a89329048ece94d4be9jljusten 747bdfde4623daff97f8f796a89329048ece94d4be9jljusten case EFI_BOOT_SCRIPT_SMBUS_EXECUTE_OPCODE: 748bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_START (Marker, OpCode); 749bdfde4623daff97f8f796a89329048ece94d4be9jljusten Status = BootScriptWriteSmbusExecute (Marker); 750bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_END (Marker); 751bdfde4623daff97f8f796a89329048ece94d4be9jljusten break; 752bdfde4623daff97f8f796a89329048ece94d4be9jljusten 753bdfde4623daff97f8f796a89329048ece94d4be9jljusten case EFI_BOOT_SCRIPT_STALL_OPCODE: 754bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_START (Marker, OpCode); 755bdfde4623daff97f8f796a89329048ece94d4be9jljusten Status = BootScriptWriteStall (Marker); 756bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_END (Marker); 757bdfde4623daff97f8f796a89329048ece94d4be9jljusten 758bdfde4623daff97f8f796a89329048ece94d4be9jljusten break; 759bdfde4623daff97f8f796a89329048ece94d4be9jljusten 760bdfde4623daff97f8f796a89329048ece94d4be9jljusten case EFI_BOOT_SCRIPT_DISPATCH_OPCODE: 761bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_START (Marker, OpCode); 762bdfde4623daff97f8f796a89329048ece94d4be9jljusten Status = BootScriptWriteDispatch (Marker); 763bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_END (Marker); 764bdfde4623daff97f8f796a89329048ece94d4be9jljusten break; 765bdfde4623daff97f8f796a89329048ece94d4be9jljusten 766bdfde4623daff97f8f796a89329048ece94d4be9jljusten case EFI_BOOT_SCRIPT_DISPATCH_2_OPCODE: 767bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_START (Marker, OpCode); 768bdfde4623daff97f8f796a89329048ece94d4be9jljusten Status = BootScriptWriteDispatch2 (Marker); 769bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_END (Marker); 770bdfde4623daff97f8f796a89329048ece94d4be9jljusten break; 771bdfde4623daff97f8f796a89329048ece94d4be9jljusten 772bdfde4623daff97f8f796a89329048ece94d4be9jljusten case EFI_BOOT_SCRIPT_INFORMATION_OPCODE: 773bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_START (Marker, OpCode); 774bdfde4623daff97f8f796a89329048ece94d4be9jljusten Status = BootScriptWriteInformation (Marker); 775bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_END (Marker); 776bdfde4623daff97f8f796a89329048ece94d4be9jljusten break; 777bdfde4623daff97f8f796a89329048ece94d4be9jljusten 778bdfde4623daff97f8f796a89329048ece94d4be9jljusten case EFI_BOOT_SCRIPT_MEM_POLL_OPCODE: 779bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_START (Marker, OpCode); 780bdfde4623daff97f8f796a89329048ece94d4be9jljusten Status = BootScriptWriteMemPoll (Marker); 781bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_END (Marker); 782bdfde4623daff97f8f796a89329048ece94d4be9jljusten break; 783bdfde4623daff97f8f796a89329048ece94d4be9jljusten 784bdfde4623daff97f8f796a89329048ece94d4be9jljusten case EFI_BOOT_SCRIPT_PCI_CONFIG2_WRITE_OPCODE: 785bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_START (Marker, OpCode); 786bdfde4623daff97f8f796a89329048ece94d4be9jljusten Status = BootScriptWritePciCfg2Write (Marker); 787bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_END (Marker); 788bdfde4623daff97f8f796a89329048ece94d4be9jljusten break; 789bdfde4623daff97f8f796a89329048ece94d4be9jljusten 790bdfde4623daff97f8f796a89329048ece94d4be9jljusten case EFI_BOOT_SCRIPT_PCI_CONFIG2_READ_WRITE_OPCODE: 791bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_START (Marker, OpCode); 792bdfde4623daff97f8f796a89329048ece94d4be9jljusten Status = BootScriptWritePciCfg2ReadWrite (Marker); 793bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_END (Marker); 794bdfde4623daff97f8f796a89329048ece94d4be9jljusten break; 795bdfde4623daff97f8f796a89329048ece94d4be9jljusten 796bdfde4623daff97f8f796a89329048ece94d4be9jljusten case EFI_BOOT_SCRIPT_IO_POLL_OPCODE: 797bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_START (Marker, OpCode); 798bdfde4623daff97f8f796a89329048ece94d4be9jljusten Status = BootScriptWriteIoPoll (Marker); 799bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_END (Marker); 800bdfde4623daff97f8f796a89329048ece94d4be9jljusten break; 801bdfde4623daff97f8f796a89329048ece94d4be9jljusten 802bdfde4623daff97f8f796a89329048ece94d4be9jljusten case EFI_BOOT_SCRIPT_PCI_CONFIG_POLL_OPCODE: 803bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_START (Marker, OpCode); 804bdfde4623daff97f8f796a89329048ece94d4be9jljusten Status = BootScriptWritePciConfigPoll (Marker); 805bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_END (Marker); 806bdfde4623daff97f8f796a89329048ece94d4be9jljusten break; 807bdfde4623daff97f8f796a89329048ece94d4be9jljusten 808bdfde4623daff97f8f796a89329048ece94d4be9jljusten case EFI_BOOT_SCRIPT_PCI_CONFIG2_POLL_OPCODE: 809bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_START (Marker, OpCode); 810bdfde4623daff97f8f796a89329048ece94d4be9jljusten Status = BootScriptWritePciConfig2Poll (Marker); 811bdfde4623daff97f8f796a89329048ece94d4be9jljusten VA_END (Marker); 812bdfde4623daff97f8f796a89329048ece94d4be9jljusten break; 813bdfde4623daff97f8f796a89329048ece94d4be9jljusten 814bdfde4623daff97f8f796a89329048ece94d4be9jljusten default: 815bdfde4623daff97f8f796a89329048ece94d4be9jljusten Status = EFI_INVALID_PARAMETER; 816bdfde4623daff97f8f796a89329048ece94d4be9jljusten break; 817bdfde4623daff97f8f796a89329048ece94d4be9jljusten } 818bdfde4623daff97f8f796a89329048ece94d4be9jljusten 819bdfde4623daff97f8f796a89329048ece94d4be9jljusten if (!EFI_ERROR (Status)) { 820bdfde4623daff97f8f796a89329048ece94d4be9jljusten Status = S3BootScriptMoveLastOpcode (BeforeOrAfter, Position); 821bdfde4623daff97f8f796a89329048ece94d4be9jljusten } 822bdfde4623daff97f8f796a89329048ece94d4be9jljusten return Status; 823bdfde4623daff97f8f796a89329048ece94d4be9jljusten} 824bdfde4623daff97f8f796a89329048ece94d4be9jljusten/** 825bdfde4623daff97f8f796a89329048ece94d4be9jljusten Find a label within the boot script table and, if not present, optionally create it. 826bdfde4623daff97f8f796a89329048ece94d4be9jljusten 827bdfde4623daff97f8f796a89329048ece94d4be9jljusten If the label Label is already exists in the boot script table, then no new label is created, the 828bdfde4623daff97f8f796a89329048ece94d4be9jljusten position of the Label is returned in *Position and EFI_SUCCESS is returned. 829bdfde4623daff97f8f796a89329048ece94d4be9jljusten If the label Label does not already exist and CreateIfNotFound is TRUE, then it will be 830bdfde4623daff97f8f796a89329048ece94d4be9jljusten created before or after the specified position and EFI_SUCCESS is returned. 831bdfde4623daff97f8f796a89329048ece94d4be9jljusten If the label Label does not already exist and CreateIfNotFound is FALSE, then 832bdfde4623daff97f8f796a89329048ece94d4be9jljusten EFI_NOT_FOUND is returned. 833bdfde4623daff97f8f796a89329048ece94d4be9jljusten 834bdfde4623daff97f8f796a89329048ece94d4be9jljusten @param This A pointer to the EFI_S3_SAVE_STATE_PROTOCOL instance. 835bdfde4623daff97f8f796a89329048ece94d4be9jljusten @param BeforeOrAfter Specifies whether the label is stored before (TRUE) or after (FALSE) the position in 836bdfde4623daff97f8f796a89329048ece94d4be9jljusten the boot script table specified by Position. If Position is NULL or points to 837bdfde4623daff97f8f796a89329048ece94d4be9jljusten NULL then the new label is inserted at the beginning of the table (if TRUE) or end of 838bdfde4623daff97f8f796a89329048ece94d4be9jljusten the table (if FALSE). 839bdfde4623daff97f8f796a89329048ece94d4be9jljusten @param CreateIfNotFound Specifies whether the label will be created if the label does not exists (TRUE) or not 840bdfde4623daff97f8f796a89329048ece94d4be9jljusten (FALSE). 841bdfde4623daff97f8f796a89329048ece94d4be9jljusten @param Position On entry, specifies the position in the boot script table where the label will be inserted, 842bdfde4623daff97f8f796a89329048ece94d4be9jljusten either before or after, depending on BeforeOrAfter. On exit, specifies the position 843bdfde4623daff97f8f796a89329048ece94d4be9jljusten of the inserted label in the boot script table. 844bdfde4623daff97f8f796a89329048ece94d4be9jljusten @param Label Points to the label which will be inserted in the boot script table. 845bdfde4623daff97f8f796a89329048ece94d4be9jljusten 846bdfde4623daff97f8f796a89329048ece94d4be9jljusten @retval EFI_SUCCESS The label already exists or was inserted. 847960729473e14c847526af94c430bc38f93105ec7jyao @retval EFI_INVALID_PARAMETER The Label is NULL or points to an empty string. 848960729473e14c847526af94c430bc38f93105ec7jyao @retval EFI_INVALID_PARAMETER The Position is not a valid position in the boot script table. 849bdfde4623daff97f8f796a89329048ece94d4be9jljusten 850bdfde4623daff97f8f796a89329048ece94d4be9jljusten**/ 851bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFI_STATUS 852bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFIAPI 853bdfde4623daff97f8f796a89329048ece94d4be9jljustenBootScriptLabel ( 854bdfde4623daff97f8f796a89329048ece94d4be9jljusten IN CONST EFI_S3_SAVE_STATE_PROTOCOL *This, 855bdfde4623daff97f8f796a89329048ece94d4be9jljusten IN BOOLEAN BeforeOrAfter, 856bdfde4623daff97f8f796a89329048ece94d4be9jljusten IN BOOLEAN CreateIfNotFound, 857bdfde4623daff97f8f796a89329048ece94d4be9jljusten IN OUT EFI_S3_BOOT_SCRIPT_POSITION *Position OPTIONAL, 858bdfde4623daff97f8f796a89329048ece94d4be9jljusten IN CONST CHAR8 *Label 859bdfde4623daff97f8f796a89329048ece94d4be9jljusten ) 860bdfde4623daff97f8f796a89329048ece94d4be9jljusten{ 861bdfde4623daff97f8f796a89329048ece94d4be9jljusten return S3BootScriptLabel (BeforeOrAfter, CreateIfNotFound, Position, Label); 862bdfde4623daff97f8f796a89329048ece94d4be9jljusten} 863bdfde4623daff97f8f796a89329048ece94d4be9jljusten/** 864bdfde4623daff97f8f796a89329048ece94d4be9jljusten Compare two positions in the boot script table and return their relative position. 865bdfde4623daff97f8f796a89329048ece94d4be9jljusten 866bdfde4623daff97f8f796a89329048ece94d4be9jljusten This function compares two positions in the boot script table and returns their relative positions. If 867bdfde4623daff97f8f796a89329048ece94d4be9jljusten Position1 is before Position2, then -1 is returned. If Position1 is equal to Position2, 868bdfde4623daff97f8f796a89329048ece94d4be9jljusten then 0 is returned. If Position1 is after Position2, then 1 is returned. 869bdfde4623daff97f8f796a89329048ece94d4be9jljusten 870bdfde4623daff97f8f796a89329048ece94d4be9jljusten @param This A pointer to the EFI_S3_SAVE_STATE_PROTOCOL instance. 871bdfde4623daff97f8f796a89329048ece94d4be9jljusten @param Position1 The positions in the boot script table to compare 872bdfde4623daff97f8f796a89329048ece94d4be9jljusten @param Position2 The positions in the boot script table to compare 873bdfde4623daff97f8f796a89329048ece94d4be9jljusten @param RelativePosition On return, points to the result of the comparison 874bdfde4623daff97f8f796a89329048ece94d4be9jljusten 875bdfde4623daff97f8f796a89329048ece94d4be9jljusten @retval EFI_SUCCESS The operation succeeded. 876bdfde4623daff97f8f796a89329048ece94d4be9jljusten @retval EFI_INVALID_PARAMETER The Position1 or Position2 is not a valid position in the boot script table. 877960729473e14c847526af94c430bc38f93105ec7jyao @retval EFI_INVALID_PARAMETER The RelativePosition is NULL. 878bdfde4623daff97f8f796a89329048ece94d4be9jljusten 879bdfde4623daff97f8f796a89329048ece94d4be9jljusten**/ 880bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFI_STATUS 881bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFIAPI 882bdfde4623daff97f8f796a89329048ece94d4be9jljustenBootScriptCompare ( 883bdfde4623daff97f8f796a89329048ece94d4be9jljusten IN CONST EFI_S3_SAVE_STATE_PROTOCOL *This, 884bdfde4623daff97f8f796a89329048ece94d4be9jljusten IN EFI_S3_BOOT_SCRIPT_POSITION Position1, 885bdfde4623daff97f8f796a89329048ece94d4be9jljusten IN EFI_S3_BOOT_SCRIPT_POSITION Position2, 886bdfde4623daff97f8f796a89329048ece94d4be9jljusten OUT UINTN *RelativePosition 887bdfde4623daff97f8f796a89329048ece94d4be9jljusten ) 888bdfde4623daff97f8f796a89329048ece94d4be9jljusten{ 889bdfde4623daff97f8f796a89329048ece94d4be9jljusten return S3BootScriptCompare (Position1, Position2, RelativePosition); 890bdfde4623daff97f8f796a89329048ece94d4be9jljusten} 891bdfde4623daff97f8f796a89329048ece94d4be9jljusten/** 892bdfde4623daff97f8f796a89329048ece94d4be9jljusten This routine is entry point of ScriptSave driver. 893bdfde4623daff97f8f796a89329048ece94d4be9jljusten 894bdfde4623daff97f8f796a89329048ece94d4be9jljusten @param ImageHandle Handle for this drivers loaded image protocol. 895bdfde4623daff97f8f796a89329048ece94d4be9jljusten @param SystemTable EFI system table. 896bdfde4623daff97f8f796a89329048ece94d4be9jljusten 897bdfde4623daff97f8f796a89329048ece94d4be9jljusten @retval EFI_OUT_OF_RESOURCES No enough resource 898bdfde4623daff97f8f796a89329048ece94d4be9jljusten @retval EFI_SUCCESS Succesfully installed the ScriptSave driver. 899bdfde4623daff97f8f796a89329048ece94d4be9jljusten @retval other Errors occured. 900bdfde4623daff97f8f796a89329048ece94d4be9jljusten 901bdfde4623daff97f8f796a89329048ece94d4be9jljusten**/ 902bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFI_STATUS 903bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFIAPI 904bdfde4623daff97f8f796a89329048ece94d4be9jljustenInitializeS3SaveState ( 905bdfde4623daff97f8f796a89329048ece94d4be9jljusten IN EFI_HANDLE ImageHandle, 906bdfde4623daff97f8f796a89329048ece94d4be9jljusten IN EFI_SYSTEM_TABLE *SystemTable 907bdfde4623daff97f8f796a89329048ece94d4be9jljusten ) 908bdfde4623daff97f8f796a89329048ece94d4be9jljusten{ 909bdfde4623daff97f8f796a89329048ece94d4be9jljusten 910bdfde4623daff97f8f796a89329048ece94d4be9jljusten 911bdfde4623daff97f8f796a89329048ece94d4be9jljusten return gBS->InstallProtocolInterface ( 912bdfde4623daff97f8f796a89329048ece94d4be9jljusten &mHandle, 913bdfde4623daff97f8f796a89329048ece94d4be9jljusten &gEfiS3SaveStateProtocolGuid, 914bdfde4623daff97f8f796a89329048ece94d4be9jljusten EFI_NATIVE_INTERFACE, 915bdfde4623daff97f8f796a89329048ece94d4be9jljusten &mS3SaveState 916bdfde4623daff97f8f796a89329048ece94d4be9jljusten ); 917bdfde4623daff97f8f796a89329048ece94d4be9jljusten 918bdfde4623daff97f8f796a89329048ece94d4be9jljusten} 919bdfde4623daff97f8f796a89329048ece94d4be9jljusten 920bdfde4623daff97f8f796a89329048ece94d4be9jljusten 921