/*++ Copyright (c) 2006 - 2007, Intel Corporation All rights reserved. This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at http://opensource.org/licenses/bsd-license.php THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. Module Name: EfiScriptLib.c Abstract: Support for EFI script. --*/ #include "EfiScriptLib.h" EFI_BOOT_SCRIPT_SAVE_PROTOCOL *mBootScriptSave; STATIC UINTN EfiScriptLibAsciiStrLen ( IN CHAR8 *String ) /*++ Routine Description: Return the number of Ascii characters in String. This is not the same as the length of the string in bytes. Arguments: String - String to process Returns: Number of Ascii characters in String --*/ { UINTN Length; for (Length=0; *String; String++, Length++); return Length; } STATIC UINTN EfiScriptLibStrLen ( IN CHAR16 *String ) /*++ Routine Description: Return the number of Unicode characters in String. This is not the same as the length of the string in bytes. Arguments: String - String to process Returns: Number of Unicode characters in String --*/ { UINTN Length; for (Length=0; *String; String++, Length++); return Length; } EFI_STATUS EFIAPI BootScriptSaveInitialize ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ) /*++ Routine Description: Intialize Boot Script Lib if it has not yet been initialized. Arguments: (Standard EFI Image entry - EFI_IMAGE_ENTRY_POINT) Returns: EFI_STATUS always returns EFI_SUCCESS --*/ // GC_TODO: ImageHandle - add argument and description to function comment // GC_TODO: SystemTable - add argument and description to function comment { EFI_STATUS Status; EFI_BOOT_SERVICES *BS; BS = SystemTable->BootServices; Status = BS->LocateProtocol (&gEfiBootScriptSaveGuid, NULL, &mBootScriptSave); if (EFI_ERROR (Status) && Status != EFI_ALREADY_STARTED) { mBootScriptSave = NULL; } return EFI_SUCCESS; } EFI_STATUS EFIAPI BootScriptSaveIoWrite ( IN UINT16 TableName, IN EFI_BOOT_SCRIPT_WIDTH Width, IN UINT64 Address, IN UINTN Count, IN VOID *Buffer ) /*++ Routine Description: Save I/O write to boot script Arguments: TableName - Desired boot script table (Standard EFI IO write script parameter) Returns: EFI_NOT_FOUND - BootScriptSave Protocol not exist. EFI_STATUS - BootScriptSave Protocol exist, always returns EFI_SUCCESS --*/ // GC_TODO: Width - add argument and description to function comment // GC_TODO: Address - add argument and description to function comment // GC_TODO: Count - add argument and description to function comment // GC_TODO: Buffer - add argument and description to function comment { if (mBootScriptSave == NULL) { return EFI_NOT_FOUND; } mBootScriptSave->Write ( mBootScriptSave, TableName, EFI_BOOT_SCRIPT_IO_WRITE_OPCODE, Width, Address, Count, Buffer ); return EFI_SUCCESS; } EFI_STATUS EFIAPI BootScriptSaveIoReadWrite ( IN UINT16 TableName, IN EFI_BOOT_SCRIPT_WIDTH Width, IN UINT64 Address, IN VOID *Data, IN VOID *DataMask ) /*++ Routine Description: Save I/O write to boot script Arguments: TableName - Desired boot script table (Standard EFI IO read write script parameter) Returns: EFI_NOT_FOUND - BootScriptSave Protocol not exist. EFI_STATUS - BootScriptSave Protocol exist, always returns EFI_SUCCESS --*/ // GC_TODO: Width - add argument and description to function comment // GC_TODO: Address - add argument and description to function comment // GC_TODO: Data - add argument and description to function comment // GC_TODO: DataMask - add argument and description to function comment { if (mBootScriptSave == NULL) { return EFI_NOT_FOUND; } mBootScriptSave->Write ( mBootScriptSave, TableName, EFI_BOOT_SCRIPT_IO_READ_WRITE_OPCODE, Width, Address, Data, DataMask ); return EFI_SUCCESS; } EFI_STATUS EFIAPI BootScriptSaveMemWrite ( IN UINT16 TableName, IN EFI_BOOT_SCRIPT_WIDTH Width, IN UINT64 Address, IN UINTN Count, IN VOID *Buffer ) /*++ Routine Description: Save I/O write to boot script Arguments: TableName - Desired boot script table (Standard EFI MEM write script parameter) Returns: EFI_NOT_FOUND - BootScriptSave Protocol not exist. EFI_STATUS - BootScriptSave Protocol exist, always returns EFI_SUCCESS --*/ // GC_TODO: Width - add argument and description to function comment // GC_TODO: Address - add argument and description to function comment // GC_TODO: Count - add argument and description to function comment // GC_TODO: Buffer - add argument and description to function comment { if (mBootScriptSave == NULL) { return EFI_NOT_FOUND; } mBootScriptSave->Write ( mBootScriptSave, TableName, EFI_BOOT_SCRIPT_MEM_WRITE_OPCODE, Width, Address, Count, Buffer ); return EFI_SUCCESS; } EFI_STATUS EFIAPI BootScriptSaveMemReadWrite ( IN UINT16 TableName, IN EFI_BOOT_SCRIPT_WIDTH Width, IN UINT64 Address, IN VOID *Data, IN VOID *DataMask ) /*++ Routine Description: Save I/O write to boot script Arguments: TableName - Desired boot script table (Standard EFI MEM read write script parameter) Returns: EFI_NOT_FOUND - BootScriptSave Protocol not exist. EFI_STATUS - BootScriptSave Protocol exist, always returns EFI_SUCCESS --*/ // GC_TODO: Width - add argument and description to function comment // GC_TODO: Address - add argument and description to function comment // GC_TODO: Data - add argument and description to function comment // GC_TODO: DataMask - add argument and description to function comment { if (mBootScriptSave == NULL) { return EFI_NOT_FOUND; } mBootScriptSave->Write ( mBootScriptSave, TableName, EFI_BOOT_SCRIPT_MEM_READ_WRITE_OPCODE, Width, Address, Data, DataMask ); return EFI_SUCCESS; } EFI_STATUS EFIAPI BootScriptSavePciCfgWrite ( IN UINT16 TableName, IN EFI_BOOT_SCRIPT_WIDTH Width, IN UINT64 Address, IN UINTN Count, IN VOID *Buffer ) /*++ Routine Description: Save I/O write to boot script Arguments: TableName - Desired boot script table (Standard EFI PCI write script parameter) Returns: EFI_NOT_FOUND - BootScriptSave Protocol not exist. EFI_STATUS - BootScriptSave Protocol exist, always returns EFI_SUCCESS --*/ // GC_TODO: Width - add argument and description to function comment // GC_TODO: Address - add argument and description to function comment // GC_TODO: Count - add argument and description to function comment // GC_TODO: Buffer - add argument and description to function comment { if (mBootScriptSave == NULL) { return EFI_NOT_FOUND; } mBootScriptSave->Write ( mBootScriptSave, TableName, EFI_BOOT_SCRIPT_PCI_CONFIG_WRITE_OPCODE, Width, Address, Count, Buffer ); return EFI_SUCCESS; } EFI_STATUS EFIAPI BootScriptSavePciCfgReadWrite ( IN UINT16 TableName, IN EFI_BOOT_SCRIPT_WIDTH Width, IN UINT64 Address, IN VOID *Data, IN VOID *DataMask ) /*++ Routine Description: Save I/O write to boot script Arguments: TableName - Desired boot script table (Standard EFI PCI read write script parameter) Returns: EFI_NOT_FOUND - BootScriptSave Protocol not exist. EFI_STATUS - BootScriptSave Protocol exist, always returns EFI_SUCCESS --*/ // GC_TODO: Width - add argument and description to function comment // GC_TODO: Address - add argument and description to function comment // GC_TODO: Data - add argument and description to function comment // GC_TODO: DataMask - add argument and description to function comment { if (mBootScriptSave == NULL) { return EFI_NOT_FOUND; } mBootScriptSave->Write ( mBootScriptSave, TableName, EFI_BOOT_SCRIPT_PCI_CONFIG_READ_WRITE_OPCODE, Width, Address, Data, DataMask ); return EFI_SUCCESS; } EFI_STATUS EFIAPI BootScriptSaveSmbusExecute ( IN UINT16 TableName, IN EFI_SMBUS_DEVICE_ADDRESS SlaveAddress, IN EFI_SMBUS_DEVICE_COMMAND Command, IN EFI_SMBUS_OPERATION Operation, IN BOOLEAN PecCheck, IN UINTN *Length, IN VOID *Buffer ) /*++ Routine Description: Save I/O write to boot script Arguments: TableName - Desired boot script table (Standard EFI Smbus execute script parameter) Returns: EFI_NOT_FOUND - BootScriptSave Protocol not exist. EFI_STATUS - BootScriptSave Protocol exist, always returns EFI_SUCCESS --*/ // GC_TODO: SlaveAddress - add argument and description to function comment // GC_TODO: Command - add argument and description to function comment // GC_TODO: Operation - add argument and description to function comment // GC_TODO: PecCheck - add argument and description to function comment // GC_TODO: Length - add argument and description to function comment // GC_TODO: Buffer - add argument and description to function comment { if (mBootScriptSave == NULL) { return EFI_NOT_FOUND; } mBootScriptSave->Write ( mBootScriptSave, TableName, EFI_BOOT_SCRIPT_SMBUS_EXECUTE_OPCODE, SlaveAddress, Command, Operation, PecCheck, Length, Buffer ); return EFI_SUCCESS; } EFI_STATUS EFIAPI BootScriptSaveStall ( IN UINT16 TableName, IN UINTN Duration ) /*++ Routine Description: Save I/O write to boot script Arguments: TableName - Desired boot script table (Standard EFI stall script parameter) Returns: EFI_NOT_FOUND - BootScriptSave Protocol not exist. EFI_STATUS - BootScriptSave Protocol exist, always returns EFI_SUCCESS --*/ // GC_TODO: Duration - add argument and description to function comment { if (mBootScriptSave == NULL) { return EFI_NOT_FOUND; } mBootScriptSave->Write ( mBootScriptSave, TableName, EFI_BOOT_SCRIPT_STALL_OPCODE, Duration ); return EFI_SUCCESS; } EFI_STATUS EFIAPI BootScriptSaveDispatch ( IN UINT16 TableName, IN EFI_PHYSICAL_ADDRESS EntryPoint ) /*++ Routine Description: GC_TODO: Add function description Arguments: TableName - GC_TODO: add argument description EntryPoint - GC_TODO: add argument description Returns: EFI_NOT_FOUND - GC_TODO: Add description for return value EFI_SUCCESS - GC_TODO: Add description for return value --*/ { if (mBootScriptSave == NULL) { return EFI_NOT_FOUND; } mBootScriptSave->Write ( mBootScriptSave, TableName, EFI_BOOT_SCRIPT_DISPATCH_OPCODE, EntryPoint ); return EFI_SUCCESS; } EFI_STATUS EFIAPI BootScriptMemPoll ( IN UINT16 TableName, IN EFI_BOOT_SCRIPT_WIDTH Width, IN UINT64 Address, IN VOID *BitMask, IN VOID *BitValue, IN UINTN Duration, IN UINTN LoopTimes ) /*++ Routine Description: Save I/O write to boot script Arguments: TableName - Desired boot script table Width - The width of the memory operations. Address - The base address of the memory operations. BitMask - A pointer to the bit mask to be AND-ed with the data read from the register. BitValue - A pointer to the data value after to be Masked. Duration - Duration in microseconds of the stall. LoopTimes - The times of the register polling. Returns: EFI_NOT_FOUND - BootScriptSave Protocol not exist. EFI_STATUS - BootScriptSave Protocol exist, always returns EFI_SUCCESS --*/ { mBootScriptSave->Write ( mBootScriptSave, TableName, EFI_BOOT_SCRIPT_MEM_POLL_OPCODE, Width, Address, BitMask, BitValue, Duration, LoopTimes ); return EFI_SUCCESS; } EFI_STATUS EFIAPI BootScriptSaveInformation ( IN UINT16 TableName, IN UINT32 Length, IN EFI_PHYSICAL_ADDRESS Buffer ) /*++ Routine Description: Save a Information Opcode record in table specified with TableName Arguments: TableName - Desired boot script table Length - Length of information in bytes Buffer - Content of information that will be saved in script table Returns: EFI_NOT_FOUND - BootScriptSave Protocol not exist. EFI_STATUS - BootScriptSave Protocol exist, always returns EFI_SUCCESS --*/ { if (mBootScriptSave == NULL) { return EFI_NOT_FOUND; } mBootScriptSave->Write ( mBootScriptSave, TableName, EFI_BOOT_SCRIPT_INFORMATION_OPCODE, Length, Buffer ); return EFI_SUCCESS; } EFI_STATUS EFIAPI BootScriptSaveInformationUnicodeString ( IN UINT16 TableName, IN CHAR16 *String ) /*++ Routine Description: Save a Information Opcode record in table specified with TableName, the information is a unicode string. Arguments: TableName - Desired boot script table String - The string that will be saved in script table Returns: EFI_NOT_FOUND - BootScriptSave Protocol not exist. EFI_STATUS - BootScriptSave Protocol exist, always returns EFI_SUCCESS --*/ { return BootScriptSaveInformation ( TableName, (UINT32) EfiScriptLibStrLen (String) * 2 + 2, (EFI_PHYSICAL_ADDRESS)String ); } EFI_STATUS EFIAPI BootScriptSaveInformationAsciiString ( IN UINT16 TableName, IN CHAR8 *String ) /*++ Routine Description: Save a Information Opcode record in table specified with TableName, the information is a ascii string. Arguments: TableName - Desired boot script table String - The string that will be saved in script table Returns: EFI_NOT_FOUND - BootScriptSave Protocol not exist. EFI_STATUS - BootScriptSave Protocol exist, always returns EFI_SUCCESS --*/ { return BootScriptSaveInformation ( TableName, (UINT32) EfiScriptLibAsciiStrLen (String) + 1, (EFI_PHYSICAL_ADDRESS)String ); }