From b7c51c9cf4864df6aabb99a1ae843becd577237c Mon Sep 17 00:00:00 2001 From: raywu Date: Fri, 15 Jun 2018 00:00:50 +0800 Subject: init. 1AQQW051 --- EDK/Foundation/Library/Dxe/EfiDriverLib/Debug.c | 173 ++ .../Library/Dxe/EfiDriverLib/DevicePath.c | 551 +++++ .../Library/Dxe/EfiDriverLib/DxeDriverLib.c | 56 + .../Dxe/EfiDriverLib/Ebc/PerformancePrimitives.c | 52 + .../Library/Dxe/EfiDriverLib/EfiDriverLib.c | 506 +++++ .../Library/Dxe/EfiDriverLib/EfiDriverLib.cif | 32 + .../Library/Dxe/EfiDriverLib/EfiDriverLib.inf | 90 + .../Library/Dxe/EfiDriverLib/EfiDriverLib.mak | 75 + .../Library/Dxe/EfiDriverLib/EfiDriverLib.sdl | 26 + .../Library/Dxe/EfiDriverLib/EfiDriverModelLib.c | 444 ++++ .../Library/Dxe/EfiDriverLib/EfiGetConfigTable.c | 61 + .../Library/Dxe/EfiDriverLib/EfiLibAllocate.c | 233 ++ EDK/Foundation/Library/Dxe/EfiDriverLib/Event.c | 371 ++++ EDK/Foundation/Library/Dxe/EfiDriverLib/GetImage.c | 220 ++ EDK/Foundation/Library/Dxe/EfiDriverLib/Handle.c | 176 ++ EDK/Foundation/Library/Dxe/EfiDriverLib/HobLib.inf | 47 + .../Dxe/EfiDriverLib/IA32/PerformancePrimitives.c | 47 + .../Dxe/EfiDriverLib/Ipf/PerformancePrimitives.s | 61 + .../Library/Dxe/EfiDriverLib/LibGlobalDs.c | 32 + .../Library/Dxe/EfiDriverLib/LibGlobalErrorLevel.c | 34 + .../Library/Dxe/EfiDriverLib/LibGlobalSt.c | 34 + EDK/Foundation/Library/Dxe/EfiDriverLib/Lock.c | 159 ++ EDK/Foundation/Library/Dxe/EfiDriverLib/Perf.c | 946 ++++++++ .../Library/Dxe/EfiDriverLib/ReportStatusCode.c | 130 ++ .../Dxe/EfiDriverLib/x64/PerformancePrimitives.c | 47 + .../Dxe/EfiIfrSupportLib/EfiIfrSupportLib.cif | 15 + .../Dxe/EfiIfrSupportLib/EfiIfrSupportLib.inf | 52 + .../Dxe/EfiIfrSupportLib/EfiIfrSupportLib.mak | 69 + .../Dxe/EfiIfrSupportLib/EfiIfrSupportLib.sdl | 26 + .../Library/Dxe/EfiIfrSupportLib/IfrCommon.c | 1031 +++++++++ .../Library/Dxe/EfiIfrSupportLib/IfrLibrary.h | 1299 +++++++++++ .../Library/Dxe/EfiIfrSupportLib/IfrOnTheFly.c | 974 +++++++++ .../Dxe/EfiIfrSupportLib/IfrOpCodeCreation.c | 615 ++++++ .../Library/Dxe/EfiIfrSupportLib/IfrVariable.c | 488 +++++ .../Library/Dxe/EfiScriptLib/EfiScriptLib.c | 712 +++++++ .../Library/Dxe/EfiScriptLib/EfiScriptLib.cif | 11 + .../Library/Dxe/EfiScriptLib/EfiScriptLib.inf | 45 + .../Library/Dxe/EfiScriptLib/EfiScriptLib.mak | 70 + .../Library/Dxe/EfiScriptLib/EfiScriptLib.sdl | 26 + .../Library/Dxe/Graphics/Ascii/GraphicsAscii.cif | 9 + .../Library/Dxe/Graphics/Ascii/PrintWidth.h | 88 + EDK/Foundation/Library/Dxe/Graphics/Ascii/Sprint.c | 144 ++ EDK/Foundation/Library/Dxe/Graphics/Graphics.c | 617 ++++++ EDK/Foundation/Library/Dxe/Graphics/Graphics.inf | 51 + .../Library/Dxe/Graphics/GraphicsLib.cif | 18 + .../Library/Dxe/Graphics/GraphicsLib.mak | 70 + .../Library/Dxe/Graphics/GraphicsLib.sdl | 26 + EDK/Foundation/Library/Dxe/Graphics/Print.c | 973 +++++++++ EDK/Foundation/Library/Dxe/Graphics/Print.h | 37 + .../Dxe/Graphics/Unicode/GraphicsUnicode.cif | 9 + .../Library/Dxe/Graphics/Unicode/PrintWidth.h | 34 + .../Library/Dxe/Graphics/Unicode/Sprint.c | 147 ++ .../Dxe/GraphicsLite/Ascii/GraphicsLiteAscii.cif | 9 + .../Library/Dxe/GraphicsLite/Ascii/PrintWidth.h | 88 + .../Library/Dxe/GraphicsLite/Ascii/Sprint.c | 144 ++ EDK/Foundation/Library/Dxe/GraphicsLite/Graphics.c | 617 ++++++ .../Library/Dxe/GraphicsLite/Graphics.inf | 51 + .../Library/Dxe/GraphicsLite/GraphicsLite.cif | 18 + .../Library/Dxe/GraphicsLite/GraphicsLite.mak | 70 + .../Library/Dxe/GraphicsLite/GraphicsLite.sdl | 26 + EDK/Foundation/Library/Dxe/GraphicsLite/Print.c | 519 +++++ EDK/Foundation/Library/Dxe/GraphicsLite/Print.h | 37 + .../GraphicsLite/Unicode/GraphicsLiteUnicode.cif | 9 + .../Library/Dxe/GraphicsLite/Unicode/PrintWidth.h | 35 + .../Library/Dxe/GraphicsLite/Unicode/Sprint.c | 147 ++ EDK/Foundation/Library/Dxe/Include/Ebc/ProcDep.h | 26 + .../Library/Dxe/Include/EfiCombinationLib.h | 294 +++ EDK/Foundation/Library/Dxe/Include/EfiCommonLib.h | 1359 ++++++++++++ EDK/Foundation/Library/Dxe/Include/EfiDriverLib.h | 1231 +++++++++++ EDK/Foundation/Library/Dxe/Include/EfiHobLib.h | 299 +++ .../Library/Dxe/Include/EfiMgmtModeRuntimeLib.h | 429 ++++ EDK/Foundation/Library/Dxe/Include/EfiPrintLib.h | 326 +++ .../Library/Dxe/Include/EfiRegTableLib.h | 205 ++ EDK/Foundation/Library/Dxe/Include/EfiRuntimeLib.h | 1691 +++++++++++++++ EDK/Foundation/Library/Dxe/Include/EfiScriptLib.h | 570 +++++ .../Library/Dxe/Include/EfiSmmDriverLib.h | 226 ++ EDK/Foundation/Library/Dxe/Include/EfiUiLib.h | 205 ++ EDK/Foundation/Library/Dxe/Include/EfiWinNtLib.h | 75 + EDK/Foundation/Library/Dxe/Include/GetImage.h | 104 + EDK/Foundation/Library/Dxe/Include/GraphicsLib.h | 181 ++ EDK/Foundation/Library/Dxe/Include/Ia32/CpuFuncs.h | 260 +++ EDK/Foundation/Library/Dxe/Include/Ia32/ProcDep.h | 26 + .../Library/Dxe/Include/Ia32EfiRuntimeDriverLib.h | 111 + EDK/Foundation/Library/Dxe/Include/Ipf/CpuFuncs.h | 93 + .../Library/Dxe/Include/Ipf/EsalRuntimeLib.h | 1305 ++++++++++++ EDK/Foundation/Library/Dxe/Include/Ipf/ProcDep.h | 119 ++ .../Library/Dxe/Include/Ipf/SalDriverLib.h | 1454 +++++++++++++ EDK/Foundation/Library/Dxe/Include/LinkedList.h | 310 +++ EDK/Foundation/Library/Dxe/Include/RtDevicePath.h | 231 ++ EDK/Foundation/Library/Dxe/Include/SmmRuntimeLib.h | 75 + EDK/Foundation/Library/Dxe/Include/x64/CpuFuncs.h | 262 +++ EDK/Foundation/Library/Dxe/Include/x64/ProcDep.h | 29 + .../Library/Dxe/Print/Ascii/PrintAscii.cif | 9 + .../Library/Dxe/Print/Ascii/PrintWidth.h | 88 + EDK/Foundation/Library/Dxe/Print/Ascii/Sprint.c | 144 ++ EDK/Foundation/Library/Dxe/Print/BoxDraw.c | 212 ++ EDK/Foundation/Library/Dxe/Print/Print.c | 596 ++++++ EDK/Foundation/Library/Dxe/Print/Print.h | 37 + EDK/Foundation/Library/Dxe/Print/PrintLib.cif | 19 + EDK/Foundation/Library/Dxe/Print/PrintLib.inf | 50 + EDK/Foundation/Library/Dxe/Print/PrintLib.mak | 70 + EDK/Foundation/Library/Dxe/Print/PrintLib.sdl | 26 + EDK/Foundation/Library/Dxe/Print/StdErr.c | 287 +++ .../Library/Dxe/Print/Unicode/PrintUnicode.cif | 9 + .../Library/Dxe/Print/Unicode/PrintWidth.h | 35 + EDK/Foundation/Library/Dxe/Print/Unicode/Sprint.c | 147 ++ .../Library/Dxe/PrintLite/Ascii/PrintLiteAscii.cif | 9 + .../Library/Dxe/PrintLite/Ascii/PrintWidth.h | 88 + .../Library/Dxe/PrintLite/Ascii/Sprint.c | 142 ++ EDK/Foundation/Library/Dxe/PrintLite/BoxDraw.c | 212 ++ EDK/Foundation/Library/Dxe/PrintLite/Print.c | 194 ++ EDK/Foundation/Library/Dxe/PrintLite/Print.h | 37 + EDK/Foundation/Library/Dxe/PrintLite/PrintLib.inf | 51 + .../Library/Dxe/PrintLite/PrintLibLite.cif | 19 + .../Library/Dxe/PrintLite/PrintLibLite.mak | 70 + .../Library/Dxe/PrintLite/PrintLibLite.sdl | 26 + EDK/Foundation/Library/Dxe/PrintLite/StdErr.c | 287 +++ .../Dxe/PrintLite/Unicode/PrintLiteUnicode.cif | 9 + .../Library/Dxe/PrintLite/Unicode/PrintWidth.h | 35 + .../Library/Dxe/PrintLite/Unicode/Sprint.c | 147 ++ .../UefiEfiIfrSupportLib/UefiEfiIfrSupportLib.cif | 15 + .../UefiEfiIfrSupportLib/UefiEfiIfrSupportLib.inf | 49 + .../UefiEfiIfrSupportLib/UefiEfiIfrSupportLib.mak | 70 + .../UefiEfiIfrSupportLib/UefiEfiIfrSupportLib.sdl | 26 + .../Dxe/UefiEfiIfrSupportLib/UefiIfrCommon.c | 762 +++++++ .../Library/Dxe/UefiEfiIfrSupportLib/UefiIfrForm.c | 2249 ++++++++++++++++++++ .../Dxe/UefiEfiIfrSupportLib/UefiIfrLibrary.h | 1370 ++++++++++++ .../UefiEfiIfrSupportLib/UefiIfrOpCodeCreation.c | 638 ++++++ .../Dxe/UefiEfiIfrSupportLib/UefiIfrString.c | 729 +++++++ EDK/Foundation/Library/Dxe/hob/hob.c | 542 +++++ 130 files changed, 35030 insertions(+) create mode 100644 EDK/Foundation/Library/Dxe/EfiDriverLib/Debug.c create mode 100644 EDK/Foundation/Library/Dxe/EfiDriverLib/DevicePath.c create mode 100644 EDK/Foundation/Library/Dxe/EfiDriverLib/DxeDriverLib.c create mode 100644 EDK/Foundation/Library/Dxe/EfiDriverLib/Ebc/PerformancePrimitives.c create mode 100644 EDK/Foundation/Library/Dxe/EfiDriverLib/EfiDriverLib.c create mode 100644 EDK/Foundation/Library/Dxe/EfiDriverLib/EfiDriverLib.cif create mode 100644 EDK/Foundation/Library/Dxe/EfiDriverLib/EfiDriverLib.inf create mode 100644 EDK/Foundation/Library/Dxe/EfiDriverLib/EfiDriverLib.mak create mode 100644 EDK/Foundation/Library/Dxe/EfiDriverLib/EfiDriverLib.sdl create mode 100644 EDK/Foundation/Library/Dxe/EfiDriverLib/EfiDriverModelLib.c create mode 100644 EDK/Foundation/Library/Dxe/EfiDriverLib/EfiGetConfigTable.c create mode 100644 EDK/Foundation/Library/Dxe/EfiDriverLib/EfiLibAllocate.c create mode 100644 EDK/Foundation/Library/Dxe/EfiDriverLib/Event.c create mode 100644 EDK/Foundation/Library/Dxe/EfiDriverLib/GetImage.c create mode 100644 EDK/Foundation/Library/Dxe/EfiDriverLib/Handle.c create mode 100644 EDK/Foundation/Library/Dxe/EfiDriverLib/HobLib.inf create mode 100644 EDK/Foundation/Library/Dxe/EfiDriverLib/IA32/PerformancePrimitives.c create mode 100644 EDK/Foundation/Library/Dxe/EfiDriverLib/Ipf/PerformancePrimitives.s create mode 100644 EDK/Foundation/Library/Dxe/EfiDriverLib/LibGlobalDs.c create mode 100644 EDK/Foundation/Library/Dxe/EfiDriverLib/LibGlobalErrorLevel.c create mode 100644 EDK/Foundation/Library/Dxe/EfiDriverLib/LibGlobalSt.c create mode 100644 EDK/Foundation/Library/Dxe/EfiDriverLib/Lock.c create mode 100644 EDK/Foundation/Library/Dxe/EfiDriverLib/Perf.c create mode 100644 EDK/Foundation/Library/Dxe/EfiDriverLib/ReportStatusCode.c create mode 100644 EDK/Foundation/Library/Dxe/EfiDriverLib/x64/PerformancePrimitives.c create mode 100644 EDK/Foundation/Library/Dxe/EfiIfrSupportLib/EfiIfrSupportLib.cif create mode 100644 EDK/Foundation/Library/Dxe/EfiIfrSupportLib/EfiIfrSupportLib.inf create mode 100644 EDK/Foundation/Library/Dxe/EfiIfrSupportLib/EfiIfrSupportLib.mak create mode 100644 EDK/Foundation/Library/Dxe/EfiIfrSupportLib/EfiIfrSupportLib.sdl create mode 100644 EDK/Foundation/Library/Dxe/EfiIfrSupportLib/IfrCommon.c create mode 100644 EDK/Foundation/Library/Dxe/EfiIfrSupportLib/IfrLibrary.h create mode 100644 EDK/Foundation/Library/Dxe/EfiIfrSupportLib/IfrOnTheFly.c create mode 100644 EDK/Foundation/Library/Dxe/EfiIfrSupportLib/IfrOpCodeCreation.c create mode 100644 EDK/Foundation/Library/Dxe/EfiIfrSupportLib/IfrVariable.c create mode 100644 EDK/Foundation/Library/Dxe/EfiScriptLib/EfiScriptLib.c create mode 100644 EDK/Foundation/Library/Dxe/EfiScriptLib/EfiScriptLib.cif create mode 100644 EDK/Foundation/Library/Dxe/EfiScriptLib/EfiScriptLib.inf create mode 100644 EDK/Foundation/Library/Dxe/EfiScriptLib/EfiScriptLib.mak create mode 100644 EDK/Foundation/Library/Dxe/EfiScriptLib/EfiScriptLib.sdl create mode 100644 EDK/Foundation/Library/Dxe/Graphics/Ascii/GraphicsAscii.cif create mode 100644 EDK/Foundation/Library/Dxe/Graphics/Ascii/PrintWidth.h create mode 100644 EDK/Foundation/Library/Dxe/Graphics/Ascii/Sprint.c create mode 100644 EDK/Foundation/Library/Dxe/Graphics/Graphics.c create mode 100644 EDK/Foundation/Library/Dxe/Graphics/Graphics.inf create mode 100644 EDK/Foundation/Library/Dxe/Graphics/GraphicsLib.cif create mode 100644 EDK/Foundation/Library/Dxe/Graphics/GraphicsLib.mak create mode 100644 EDK/Foundation/Library/Dxe/Graphics/GraphicsLib.sdl create mode 100644 EDK/Foundation/Library/Dxe/Graphics/Print.c create mode 100644 EDK/Foundation/Library/Dxe/Graphics/Print.h create mode 100644 EDK/Foundation/Library/Dxe/Graphics/Unicode/GraphicsUnicode.cif create mode 100644 EDK/Foundation/Library/Dxe/Graphics/Unicode/PrintWidth.h create mode 100644 EDK/Foundation/Library/Dxe/Graphics/Unicode/Sprint.c create mode 100644 EDK/Foundation/Library/Dxe/GraphicsLite/Ascii/GraphicsLiteAscii.cif create mode 100644 EDK/Foundation/Library/Dxe/GraphicsLite/Ascii/PrintWidth.h create mode 100644 EDK/Foundation/Library/Dxe/GraphicsLite/Ascii/Sprint.c create mode 100644 EDK/Foundation/Library/Dxe/GraphicsLite/Graphics.c create mode 100644 EDK/Foundation/Library/Dxe/GraphicsLite/Graphics.inf create mode 100644 EDK/Foundation/Library/Dxe/GraphicsLite/GraphicsLite.cif create mode 100644 EDK/Foundation/Library/Dxe/GraphicsLite/GraphicsLite.mak create mode 100644 EDK/Foundation/Library/Dxe/GraphicsLite/GraphicsLite.sdl create mode 100644 EDK/Foundation/Library/Dxe/GraphicsLite/Print.c create mode 100644 EDK/Foundation/Library/Dxe/GraphicsLite/Print.h create mode 100644 EDK/Foundation/Library/Dxe/GraphicsLite/Unicode/GraphicsLiteUnicode.cif create mode 100644 EDK/Foundation/Library/Dxe/GraphicsLite/Unicode/PrintWidth.h create mode 100644 EDK/Foundation/Library/Dxe/GraphicsLite/Unicode/Sprint.c create mode 100644 EDK/Foundation/Library/Dxe/Include/Ebc/ProcDep.h create mode 100644 EDK/Foundation/Library/Dxe/Include/EfiCombinationLib.h create mode 100644 EDK/Foundation/Library/Dxe/Include/EfiCommonLib.h create mode 100644 EDK/Foundation/Library/Dxe/Include/EfiDriverLib.h create mode 100644 EDK/Foundation/Library/Dxe/Include/EfiHobLib.h create mode 100644 EDK/Foundation/Library/Dxe/Include/EfiMgmtModeRuntimeLib.h create mode 100644 EDK/Foundation/Library/Dxe/Include/EfiPrintLib.h create mode 100644 EDK/Foundation/Library/Dxe/Include/EfiRegTableLib.h create mode 100644 EDK/Foundation/Library/Dxe/Include/EfiRuntimeLib.h create mode 100644 EDK/Foundation/Library/Dxe/Include/EfiScriptLib.h create mode 100644 EDK/Foundation/Library/Dxe/Include/EfiSmmDriverLib.h create mode 100644 EDK/Foundation/Library/Dxe/Include/EfiUiLib.h create mode 100644 EDK/Foundation/Library/Dxe/Include/EfiWinNtLib.h create mode 100644 EDK/Foundation/Library/Dxe/Include/GetImage.h create mode 100644 EDK/Foundation/Library/Dxe/Include/GraphicsLib.h create mode 100644 EDK/Foundation/Library/Dxe/Include/Ia32/CpuFuncs.h create mode 100644 EDK/Foundation/Library/Dxe/Include/Ia32/ProcDep.h create mode 100644 EDK/Foundation/Library/Dxe/Include/Ia32EfiRuntimeDriverLib.h create mode 100644 EDK/Foundation/Library/Dxe/Include/Ipf/CpuFuncs.h create mode 100644 EDK/Foundation/Library/Dxe/Include/Ipf/EsalRuntimeLib.h create mode 100644 EDK/Foundation/Library/Dxe/Include/Ipf/ProcDep.h create mode 100644 EDK/Foundation/Library/Dxe/Include/Ipf/SalDriverLib.h create mode 100644 EDK/Foundation/Library/Dxe/Include/LinkedList.h create mode 100644 EDK/Foundation/Library/Dxe/Include/RtDevicePath.h create mode 100644 EDK/Foundation/Library/Dxe/Include/SmmRuntimeLib.h create mode 100644 EDK/Foundation/Library/Dxe/Include/x64/CpuFuncs.h create mode 100644 EDK/Foundation/Library/Dxe/Include/x64/ProcDep.h create mode 100644 EDK/Foundation/Library/Dxe/Print/Ascii/PrintAscii.cif create mode 100644 EDK/Foundation/Library/Dxe/Print/Ascii/PrintWidth.h create mode 100644 EDK/Foundation/Library/Dxe/Print/Ascii/Sprint.c create mode 100644 EDK/Foundation/Library/Dxe/Print/BoxDraw.c create mode 100644 EDK/Foundation/Library/Dxe/Print/Print.c create mode 100644 EDK/Foundation/Library/Dxe/Print/Print.h create mode 100644 EDK/Foundation/Library/Dxe/Print/PrintLib.cif create mode 100644 EDK/Foundation/Library/Dxe/Print/PrintLib.inf create mode 100644 EDK/Foundation/Library/Dxe/Print/PrintLib.mak create mode 100644 EDK/Foundation/Library/Dxe/Print/PrintLib.sdl create mode 100644 EDK/Foundation/Library/Dxe/Print/StdErr.c create mode 100644 EDK/Foundation/Library/Dxe/Print/Unicode/PrintUnicode.cif create mode 100644 EDK/Foundation/Library/Dxe/Print/Unicode/PrintWidth.h create mode 100644 EDK/Foundation/Library/Dxe/Print/Unicode/Sprint.c create mode 100644 EDK/Foundation/Library/Dxe/PrintLite/Ascii/PrintLiteAscii.cif create mode 100644 EDK/Foundation/Library/Dxe/PrintLite/Ascii/PrintWidth.h create mode 100644 EDK/Foundation/Library/Dxe/PrintLite/Ascii/Sprint.c create mode 100644 EDK/Foundation/Library/Dxe/PrintLite/BoxDraw.c create mode 100644 EDK/Foundation/Library/Dxe/PrintLite/Print.c create mode 100644 EDK/Foundation/Library/Dxe/PrintLite/Print.h create mode 100644 EDK/Foundation/Library/Dxe/PrintLite/PrintLib.inf create mode 100644 EDK/Foundation/Library/Dxe/PrintLite/PrintLibLite.cif create mode 100644 EDK/Foundation/Library/Dxe/PrintLite/PrintLibLite.mak create mode 100644 EDK/Foundation/Library/Dxe/PrintLite/PrintLibLite.sdl create mode 100644 EDK/Foundation/Library/Dxe/PrintLite/StdErr.c create mode 100644 EDK/Foundation/Library/Dxe/PrintLite/Unicode/PrintLiteUnicode.cif create mode 100644 EDK/Foundation/Library/Dxe/PrintLite/Unicode/PrintWidth.h create mode 100644 EDK/Foundation/Library/Dxe/PrintLite/Unicode/Sprint.c create mode 100644 EDK/Foundation/Library/Dxe/UefiEfiIfrSupportLib/UefiEfiIfrSupportLib.cif create mode 100644 EDK/Foundation/Library/Dxe/UefiEfiIfrSupportLib/UefiEfiIfrSupportLib.inf create mode 100644 EDK/Foundation/Library/Dxe/UefiEfiIfrSupportLib/UefiEfiIfrSupportLib.mak create mode 100644 EDK/Foundation/Library/Dxe/UefiEfiIfrSupportLib/UefiEfiIfrSupportLib.sdl create mode 100644 EDK/Foundation/Library/Dxe/UefiEfiIfrSupportLib/UefiIfrCommon.c create mode 100644 EDK/Foundation/Library/Dxe/UefiEfiIfrSupportLib/UefiIfrForm.c create mode 100644 EDK/Foundation/Library/Dxe/UefiEfiIfrSupportLib/UefiIfrLibrary.h create mode 100644 EDK/Foundation/Library/Dxe/UefiEfiIfrSupportLib/UefiIfrOpCodeCreation.c create mode 100644 EDK/Foundation/Library/Dxe/UefiEfiIfrSupportLib/UefiIfrString.c create mode 100644 EDK/Foundation/Library/Dxe/hob/hob.c (limited to 'EDK/Foundation/Library/Dxe') diff --git a/EDK/Foundation/Library/Dxe/EfiDriverLib/Debug.c b/EDK/Foundation/Library/Dxe/EfiDriverLib/Debug.c new file mode 100644 index 0000000..446d229 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/EfiDriverLib/Debug.c @@ -0,0 +1,173 @@ +/*++ + +Copyright (c) 2004 - 2006, 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: + + Debug.c + +Abstract: + + Support for Debug primatives. + +--*/ + +#include "Tiano.h" +#include "EfiDriverLib.h" +#include "EfiPrintLib.h" +#include "EfiStatusCode.h" +#include EFI_GUID_DEFINITION (StatusCodeCallerId) +#include EFI_GUID_DEFINITION (StatusCodeDataTypeId) +#include EFI_PROTOCOL_DEFINITION (DEBUGMASK) + +// +// You would think you should divid by sizeof (UINT64), but EBC does not like +// that! +// +#define EFI_STATUS_CODE_DATA_MAX_SIZE64 (EFI_STATUS_CODE_DATA_MAX_SIZE / 8) + +VOID +EfiDebugAssert ( + IN CHAR8 *FileName, + IN INTN LineNumber, + IN CHAR8 *Description + ) +/*++ + +Routine Description: + + Worker function for ASSERT(). If Error Logging hub is loaded log ASSERT + information. If Error Logging hub is not loaded BREAKPOINT(). + + We use UINT64 buffers due to IPF alignment concerns. + +Arguments: + + FileName - File name of failing routine. + + LineNumber - Line number of failing ASSERT(). + + Description - Descritption, usally the assertion, + +Returns: + + None + +--*/ +{ + UINT64 Buffer[EFI_STATUS_CODE_DATA_MAX_SIZE]; + + EfiDebugAssertWorker (FileName, LineNumber, Description, sizeof (Buffer), Buffer); + + EfiLibReportStatusCode ( + (EFI_ERROR_CODE | EFI_ERROR_UNRECOVERED), + (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_EC_ILLEGAL_SOFTWARE_STATE), + 0, + &gEfiCallerIdGuid, + (EFI_STATUS_CODE_DATA *) Buffer + ); + + // + // Put break point in module that contained the error. + // + EFI_BREAKPOINT (); +} + +VOID +EfiDebugVPrint ( + IN UINTN ErrorLevel, + IN CHAR8 *Format, + IN VA_LIST Marker + ) +/*++ + +Routine Description: + + Worker function for DEBUG(). If Error Logging hub is loaded log ASSERT + information. If Error Logging hub is not loaded do nothing. + + We use UINT64 buffers due to IPF alignment concerns. + +Arguments: + + ErrorLevel - If error level is set do the debug print. + + Format - String to use for the print, followed by Print arguments. + + Marker - VarArgs + +Returns: + + None + +--*/ +{ + UINT64 Buffer[EFI_STATUS_CODE_DATA_MAX_SIZE]; + UINTN ImageDebugMask; + + // + // Check driver debug mask value and global mask + // + if (gDebugMaskInterface != NULL) { + gDebugMaskInterface->GetDebugMask (gDebugMaskInterface, &ImageDebugMask); + if (!(ErrorLevel & ImageDebugMask)) { + return ; + } + } else if (!(gErrorLevel & ErrorLevel)) { + return ; + } + + EfiDebugVPrintWorker (ErrorLevel, Format, Marker, sizeof (Buffer), Buffer); + + ASSERT (NULL != gRT); + EfiLibReportStatusCode ( + EFI_DEBUG_CODE, + (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_DC_UNSPECIFIED), + 0, + &gEfiCallerIdGuid, + (EFI_STATUS_CODE_DATA *) Buffer + ); + + return ; +} + +VOID +EfiDebugPrint ( + IN UINTN ErrorLevel, + IN CHAR8 *Format, + ... + ) +/*++ + +Routine Description: + + Wrapper for EfiDebugVPrint () + +Arguments: + + ErrorLevel - If error level is set do the debug print. + + Format - String to use for the print, followed by Print arguments. + + ... - Print arguments. + + +Returns: + + None + +--*/ +{ + VA_LIST Marker; + + VA_START (Marker, Format); + EfiDebugVPrint (ErrorLevel, Format, Marker); + VA_END (Marker); +} diff --git a/EDK/Foundation/Library/Dxe/EfiDriverLib/DevicePath.c b/EDK/Foundation/Library/Dxe/EfiDriverLib/DevicePath.c new file mode 100644 index 0000000..8eb411f --- /dev/null +++ b/EDK/Foundation/Library/Dxe/EfiDriverLib/DevicePath.c @@ -0,0 +1,551 @@ +/*++ + +Copyright (c) 2004 - 2008, 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: + + DevicePath.c + +Abstract: + + Device Path services. The thing to remember is device paths are built out of + nodes. The device path is terminated by an end node that is length + sizeof(EFI_DEVICE_PATH_PROTOCOL). That would be why there is sizeof(EFI_DEVICE_PATH_PROTOCOL) + all over this file. + + The only place where multi-instance device paths are supported is in + environment varibles. Multi-instance device paths should never be placed + on a Handle. + +--*/ + +#include "Tiano.h" +#include "EfiDriverLib.h" +#include EFI_PROTOCOL_DEFINITION (DevicePath) + +EFI_DEVICE_PATH_PROTOCOL * +EfiDevicePathInstance ( + IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath, + OUT UINTN *Size + ) +/*++ + +Routine Description: + Function retrieves the next device path instance from a device path data structure. + +Arguments: + DevicePath - A pointer to a device path data structure. + + Size - A pointer to the size of a device path instance in bytes. + +Returns: + + This function returns a pointer to the current device path instance. + In addition, it returns the size in bytes of the current device path instance in Size, + and a pointer to the next device path instance in DevicePath. + If there are no more device path instances in DevicePath, then DevicePath will be set to NULL. + +--*/ +{ + EFI_DEVICE_PATH_PROTOCOL *DevPath; + EFI_DEVICE_PATH_PROTOCOL *ReturnValue; + UINT8 Temp; + + if (*DevicePath == NULL) { + if (Size != NULL) { + *Size = 0; + } + + return NULL; + } + + // + // Find the end of the device path instance + // + DevPath = *DevicePath; + while (!IsDevicePathEndType (DevPath)) { + DevPath = NextDevicePathNode (DevPath); + } + + // + // Compute the size of the device path instance + // + if (Size != NULL) { + *Size = ((UINTN) DevPath - (UINTN) (*DevicePath)) + sizeof (EFI_DEVICE_PATH_PROTOCOL); + } + + // + // Make a copy and return the device path instance + // + Temp = DevPath->SubType; + DevPath->SubType = END_ENTIRE_DEVICE_PATH_SUBTYPE; + ReturnValue = EfiDuplicateDevicePath (*DevicePath); + DevPath->SubType = Temp; + + // + // If DevPath is the end of an entire device path, then another instance + // does not follow, so *DevicePath is set to NULL. + // + if (DevicePathSubType (DevPath) == END_ENTIRE_DEVICE_PATH_SUBTYPE) { + *DevicePath = NULL; + } else { + *DevicePath = NextDevicePathNode (DevPath); + } + + return ReturnValue; +} + +BOOLEAN +EfiIsDevicePathMultiInstance ( + IN EFI_DEVICE_PATH_PROTOCOL *DevicePath + ) +/*++ + +Routine Description: + Return TRUE is this is a multi instance device path. + +Arguments: + DevicePath - A pointer to a device path data structure. + + +Returns: + TRUE - If DevicePath is multi instance. FALSE - If DevicePath is not multi + instance. + +--*/ +{ + EFI_DEVICE_PATH_PROTOCOL *Node; + + if (DevicePath == NULL) { + return FALSE; + } + + Node = DevicePath; + while (!EfiIsDevicePathEnd (Node)) { + if (EfiIsDevicePathEndInstance (Node)) { + return TRUE; + } + + Node = EfiNextDevicePathNode (Node); + } + + return FALSE; +} + +UINTN +EfiDevicePathSize ( + IN EFI_DEVICE_PATH_PROTOCOL *DevicePath + ) +/*++ + +Routine Description: + + Calculate the space size of a device path. + +Arguments: + + DevicePath - A specified device path + +Returns: + + The size. + +--*/ +{ + EFI_DEVICE_PATH_PROTOCOL *Start; + + if (DevicePath == NULL) { + return 0; + } + + // + // Search for the end of the device path structure + // + Start = DevicePath; + while (!EfiIsDevicePathEnd (DevicePath)) { + DevicePath = EfiNextDevicePathNode (DevicePath); + } + + // + // Compute the size and add back in the size of the end device path structure + // + return ((UINTN) DevicePath - (UINTN) Start) + sizeof (EFI_DEVICE_PATH_PROTOCOL); +} + +EFI_DEVICE_PATH_PROTOCOL * +EfiDevicePathFromHandle ( + IN EFI_HANDLE Handle + ) +/*++ + +Routine Description: + + Get the device path protocol interface installed on a specified handle. + +Arguments: + + Handle - a specified handle + +Returns: + + The device path protocol interface installed on that handle. + +--*/ +{ + EFI_DEVICE_PATH_PROTOCOL *DevicePath; + + DevicePath = NULL; + gBS->HandleProtocol ( + Handle, + &gEfiDevicePathProtocolGuid, + (VOID *) &DevicePath + ); + return DevicePath; +} + +EFI_DEVICE_PATH_PROTOCOL * +EfiDuplicateDevicePath ( + IN EFI_DEVICE_PATH_PROTOCOL *DevicePath + ) +/*++ + +Routine Description: + + Duplicate a device path structure. + +Arguments: + + DevicePath - The device path to duplicated. + +Returns: + + The duplicated device path. + +--*/ +{ + EFI_DEVICE_PATH_PROTOCOL *NewDevicePath; + UINTN Size; + + if (DevicePath == NULL) { + return NULL; + } + + // + // Compute the size + // + Size = EfiDevicePathSize (DevicePath); + if (Size == 0) { + return NULL; + } + + // + // Allocate space for duplicate device path + // + NewDevicePath = EfiLibAllocateCopyPool (Size, DevicePath); + + return NewDevicePath; +} + +EFI_DEVICE_PATH_PROTOCOL * +EfiAppendDevicePath ( + IN EFI_DEVICE_PATH_PROTOCOL *Src1, + IN EFI_DEVICE_PATH_PROTOCOL *Src2 + ) +/*++ + +Routine Description: + Function is used to append a Src1 and Src2 together. + +Arguments: + Src1 - A pointer to a device path data structure. + + Src2 - A pointer to a device path data structure. + +Returns: + + A pointer to the new device path is returned. + NULL is returned if space for the new device path could not be allocated from pool. + It is up to the caller to free the memory used by Src1 and Src2 if they are no longer needed. + +--*/ +{ + UINTN Size; + UINTN Size1; + UINTN Size2; + EFI_DEVICE_PATH_PROTOCOL *NewDevicePath; + EFI_DEVICE_PATH_PROTOCOL *SecondDevicePath; + + // + // If there's only 1 path, just duplicate it + // + if (!Src1) { + ASSERT (!IsDevicePathUnpacked (Src2)); + return EfiDuplicateDevicePath (Src2); + } + + if (!Src2) { + ASSERT (!IsDevicePathUnpacked (Src1)); + return EfiDuplicateDevicePath (Src1); + } + + // + // Allocate space for the combined device path. It only has one end node of + // length EFI_DEVICE_PATH_PROTOCOL + // + Size1 = EfiDevicePathSize (Src1); + Size2 = EfiDevicePathSize (Src2); + Size = Size1 + Size2 - sizeof (EFI_DEVICE_PATH_PROTOCOL); + + NewDevicePath = EfiLibAllocateCopyPool (Size, Src1); + + if (NewDevicePath != NULL) { + + // + // Over write Src1 EndNode and do the copy + // + SecondDevicePath = (EFI_DEVICE_PATH_PROTOCOL *) ((CHAR8 *) NewDevicePath + (Size1 - sizeof (EFI_DEVICE_PATH_PROTOCOL))); + EfiCopyMem (SecondDevicePath, Src2, Size2); + } + + return NewDevicePath; +} + +EFI_DEVICE_PATH_PROTOCOL * +EfiAppendDevicePathNode ( + IN EFI_DEVICE_PATH_PROTOCOL *Src1, + IN EFI_DEVICE_PATH_PROTOCOL *Node + ) +/*++ + +Routine Description: + Function is used to append a device path node to the end of another device path. + +Arguments: + Src1 - A pointer to a device path data structure. + + Node - A pointer to a device path data structure. + +Returns: + This function returns a pointer to the new device path. + If there is not enough temporary pool memory available to complete this function, + then NULL is returned. + + +--*/ +{ + EFI_DEVICE_PATH_PROTOCOL *Temp; + EFI_DEVICE_PATH_PROTOCOL *NextNode; + EFI_DEVICE_PATH_PROTOCOL *NewDevicePath; + UINTN NodeLength; + + // + // Build a Node that has a terminator on it + // + NodeLength = DevicePathNodeLength (Node); + + Temp = EfiLibAllocateCopyPool (NodeLength + sizeof (EFI_DEVICE_PATH_PROTOCOL), Node); + if (Temp == NULL) { + return NULL; + } + + // + // Add and end device path node to convert Node to device path + // + NextNode = NextDevicePathNode (Temp); + SetDevicePathEndNode (NextNode); + + // + // Append device paths + // + NewDevicePath = EfiAppendDevicePath (Src1, Temp); + gBS->FreePool (Temp); + return NewDevicePath; +} + +EFI_DEVICE_PATH_PROTOCOL * +EfiFileDevicePath ( + IN EFI_HANDLE Device OPTIONAL, + IN CHAR16 *FileName + ) +/*++ + +Routine Description: + + This function allocates a device path for a file and appends it to an existiong + device path. + +Arguments: + Device - A pointer to a device handle. + + FileName - A pointer to a Null-terminated Unicodestring. + +Returns: + A device path contain the file name. + +--*/ +{ + UINTN Size; + FILEPATH_DEVICE_PATH *FilePath; + EFI_DEVICE_PATH_PROTOCOL *Eop; + EFI_DEVICE_PATH_PROTOCOL *DevicePath; + + for (Size = 0; FileName[Size] != 0; Size++) + ; + Size = (Size + 1) * 2; + + FilePath = EfiLibAllocateZeroPool (Size + SIZE_OF_FILEPATH_DEVICE_PATH + sizeof (EFI_DEVICE_PATH_PROTOCOL)); + + DevicePath = NULL; + + if (FilePath != NULL) { + + // + // Build a file path + // + FilePath->Header.Type = MEDIA_DEVICE_PATH; + FilePath->Header.SubType = MEDIA_FILEPATH_DP; + SetDevicePathNodeLength (&FilePath->Header, Size + SIZE_OF_FILEPATH_DEVICE_PATH); + EfiCopyMem (FilePath->PathName, FileName, Size); + Eop = NextDevicePathNode (&FilePath->Header); + SetDevicePathEndNode (Eop); + + // + // Append file path to device's device path + // + + DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) FilePath; + if (Device != NULL) { + DevicePath = EfiAppendDevicePath ( + EfiDevicePathFromHandle (Device), + DevicePath + ); + + gBS->FreePool (FilePath); + } + } + + return DevicePath; +} + +EFI_DEVICE_PATH_PROTOCOL * +EfiAppendDevicePathInstance ( + IN EFI_DEVICE_PATH_PROTOCOL *Src, + IN EFI_DEVICE_PATH_PROTOCOL *Instance + ) +/*++ + +Routine Description: + + Append a device path instance to another. + +Arguments: + + Src - The device path instance to be appended with. + Instance - The device path instance appending the other. + +Returns: + + The contaction of these two. + +--*/ +{ + UINT8 *Ptr; + EFI_DEVICE_PATH_PROTOCOL *DevPath; + UINTN SrcSize; + UINTN InstanceSize; + + if (Src == NULL) { + return EfiDuplicateDevicePath (Instance); + } + + SrcSize = EfiDevicePathSize (Src); + InstanceSize = EfiDevicePathSize (Instance); + + Ptr = EfiLibAllocateCopyPool (SrcSize + InstanceSize, Src); + if (Ptr != NULL) { + + DevPath = (EFI_DEVICE_PATH_PROTOCOL *) Ptr; + + while (!IsDevicePathEnd (DevPath)) { + DevPath = NextDevicePathNode (DevPath); + } + // + // Convert the End to an End Instance, since we are + // appending another instacne after this one its a good + // idea. + // + DevPath->SubType = END_INSTANCE_DEVICE_PATH_SUBTYPE; + + DevPath = NextDevicePathNode (DevPath); + EfiCopyMem (DevPath, Instance, InstanceSize); + } + + return (EFI_DEVICE_PATH_PROTOCOL *) Ptr; +} + +VOID +EFIAPI +EfiInitializeFwVolDevicepathNode ( + IN MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *FvDevicePathNode, + IN EFI_GUID *NameGuid + ) +/*++ + +Routine Description: + + Initialize a Firmware Volume (FV) Media Device Path node. + +Arguments: + + FvDevicePathNode - Pointer to a FV device path node to initialize + NameGuid - FV file name to use in FvDevicePathNode + +Returns: + + None + +--*/ +{ + FvDevicePathNode->Header.Type = MEDIA_DEVICE_PATH; + FvDevicePathNode->Header.SubType = MEDIA_FV_FILEPATH_DP; + SetDevicePathNodeLength (&FvDevicePathNode->Header, sizeof (MEDIA_FW_VOL_FILEPATH_DEVICE_PATH)); + + EfiCopyMem (&FvDevicePathNode->NameGuid, NameGuid, sizeof(EFI_GUID)); +} + +EFI_GUID * +EFIAPI +EfiGetNameGuidFromFwVolDevicePathNode ( + IN MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *FvDevicePathNode + ) +/*++ + +Routine Description: + + Check to see if the Firmware Volume (FV) Media Device Path is valid. + +Arguments: + + FvDevicePathNode - Pointer to FV device path to check + +Returns: + + NULL - FvDevicePathNode is not valid. + Other - FvDevicePathNode is valid and pointer to NameGuid was returned. + +--*/ +{ + if (DevicePathType (&FvDevicePathNode->Header) == MEDIA_DEVICE_PATH && + DevicePathSubType (&FvDevicePathNode->Header) == MEDIA_FV_FILEPATH_DP) { + return &FvDevicePathNode->NameGuid; + } + + return NULL; +} diff --git a/EDK/Foundation/Library/Dxe/EfiDriverLib/DxeDriverLib.c b/EDK/Foundation/Library/Dxe/EfiDriverLib/DxeDriverLib.c new file mode 100644 index 0000000..0d5b36e --- /dev/null +++ b/EDK/Foundation/Library/Dxe/EfiDriverLib/DxeDriverLib.c @@ -0,0 +1,56 @@ +/*++ + +Copyright (c) 2004, 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: + + DxeDriverLib.c + +Abstract: + + Light weight lib to support EFI drivers. + +--*/ + +#include "Tiano.h" +#include "EfiDriverLib.h" + +EFI_STATUS +DxeInitializeDriverLib ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +/*++ + +Routine Description: + + Intialize Driver Lib if it has not yet been initialized. + +Arguments: + + ImageHandle - Standard EFI Image entry parameter + + SystemTable - Standard EFI Image entry parameter + +Returns: + + EFI_STATUS always returns EFI_SUCCESS + +--*/ +{ + EFI_STATUS Status; + + Status = EfiInitializeDriverLib (ImageHandle, SystemTable); + if (!EFI_ERROR (Status)) { + Status = EfiLibGetSystemConfigurationTable (&gEfiDxeServicesTableGuid, (VOID **) &gDS); + } + + return Status; +} diff --git a/EDK/Foundation/Library/Dxe/EfiDriverLib/Ebc/PerformancePrimitives.c b/EDK/Foundation/Library/Dxe/EfiDriverLib/Ebc/PerformancePrimitives.c new file mode 100644 index 0000000..7e77a2e --- /dev/null +++ b/EDK/Foundation/Library/Dxe/EfiDriverLib/Ebc/PerformancePrimitives.c @@ -0,0 +1,52 @@ +/*++ + +Copyright (c) 2004, 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: + + PerformancePrimitives.c + +Abstract: + + Support for Performance library + +--*/ + +#include "Tiano.h" // for ASSERT macro +#include "TianoCommon.h" + +EFI_STATUS +GetTimerValue ( + OUT UINT64 *TimerValue + ) +/*++ + +Routine Description: + + Set TimerValue to 0, which is not expected to be run. + +Arguments: + + TimerValue - Timer value for output + +Returns: + + EFI_SUCCESS - Should not be reached. + +--*/ +{ + // + // Should not be used for EBC, so assert. + // + *TimerValue = 0; + ASSERT (FALSE); + + return EFI_SUCCESS; +} diff --git a/EDK/Foundation/Library/Dxe/EfiDriverLib/EfiDriverLib.c b/EDK/Foundation/Library/Dxe/EfiDriverLib/EfiDriverLib.c new file mode 100644 index 0000000..674bf4c --- /dev/null +++ b/EDK/Foundation/Library/Dxe/EfiDriverLib/EfiDriverLib.c @@ -0,0 +1,506 @@ +/*++ + +Copyright (c) 2004 - 2008, 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: + + EfiDriverLib.c + +Abstract: + + Light weight lib to support EFI drivers. + +--*/ + +#include "Tiano.h" +#include "EfiDriverLib.h" + +// +// Global Interface for Debug Mask Protocol +// +EFI_DEBUG_MASK_PROTOCOL *gDebugMaskInterface = NULL; + +EFI_STATUS +EfiInitializeDriverLib ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +/*++ + +Routine Description: + + Intialize Driver Lib if it has not yet been initialized. + +Arguments: + + ImageHandle - Standard EFI Image entry parameter + + SystemTable - Standard EFI Image entry parameter + +Returns: + + EFI_STATUS always returns EFI_SUCCESS + +--*/ +{ + gST = SystemTable; + + ASSERT (gST != NULL); + + gBS = gST->BootServices; + gRT = gST->RuntimeServices; + + ASSERT (gBS != NULL); + ASSERT (gRT != NULL); + + // + // Get driver debug mask protocol interface + // +#ifdef EFI_DEBUG + gBS->HandleProtocol ( + ImageHandle, + &gEfiDebugMaskProtocolGuid, + (VOID *) &gDebugMaskInterface + ); +#endif + // + // Should be at EFI_D_INFO, but lets us know things are running + // + DEBUG ((EFI_D_INFO, "EfiInitializeDriverLib: Started\n")); + + return EFI_SUCCESS; +} + +STATIC +BOOLEAN +IsIso639LanguageCode ( + IN CHAR8 *Languages + ) +/*++ + +Routine Description: + + Tests whether a language code has format of ISO639-2. + +Arguments: + + Languages - The language code to be tested. + +Returns: + + TRUE - Language code format is ISO 639-2. + FALSE - Language code format is not ISO 639-2. + +--*/ +{ + UINTN Index; + + // + // Find out format of Languages + // + for (Index = 0; Languages[Index] != 0 && Languages[Index] != ';' && Languages[Index] != '-'; Index++); + if (Languages[Index] != 0) { + // + // RFC4646 language code + // + return FALSE; + } + + // + // No ';' and '-', it's either ISO639-2 code (list) or single RFC4646 code + // + if (Index == 2) { + // + // Single RFC4646 language code without country code, e.g. "en" + // + return FALSE; + } + + // + // Languages in format of ISO639-2 + // + return TRUE; +} + +BOOLEAN +EfiLibCompareLanguage ( + IN CHAR8 *Language1, + IN CHAR8 *Language2 + ) +/*++ + +Routine Description: + + Compare the first language instance of two language codes, either could be a + single language code or a language code list. This function assume Language1 + and Language2 has the same language code format, i.e. either ISO639-2 or RFC4646. + +Arguments: + + Language1 - The first language code to be tested. + Language2 - The second language code to be tested. + +Returns: + + TRUE - Language code match. + FALSE - Language code mismatch. + +--*/ +{ + UINTN Index; + + // + // Compare first two bytes of language tag + // + if ((Language1[0] != Language2[0]) || (Language1[1] != Language2[1])) { + return FALSE; + } + + if (IsIso639LanguageCode (Language1)) { + // + // ISO639-2 language code, compare the third byte of language tag + // + return (Language1[2] == Language2[2]) ? TRUE : FALSE; + } + + // + // RFC4646 language code + // + for (Index = 0; Language1[Index] != 0 && Language1[Index] != ';'; Index++); + if ((EfiAsciiStrnCmp (Language1, Language2, Index) == 0) && (Language2[Index] == 0 || Language2[Index] == ';')) { + return TRUE; +} + + return FALSE; +} + +STATIC +CHAR8 * +NextSupportedLanguage ( + IN CHAR8 *Languages + ) +/*++ + +Routine Description: + + Step to next language code of a language code list. + +Arguments: + + Languages - The language code list to traverse. + +Returns: + + Pointer to next language code or NULL terminator if it's the last one. + +--*/ +{ + UINTN Index; + + if (IsIso639LanguageCode (Languages)) { + // + // ISO639-2 language code + // + return (Languages + 3); + } + + // + // Search in RFC4646 language code list + // + for (Index = 0; Languages[Index] != 0 && Languages[Index] != ';'; Index++); + if (Languages[Index] == ';') { + Index++; + } + return (Languages + Index); +} + +EFI_STATUS +EfiLibLookupUnicodeString ( + IN CHAR8 *Language, + IN CHAR8 *SupportedLanguages, + IN EFI_UNICODE_STRING_TABLE *UnicodeStringTable, + OUT CHAR16 **UnicodeString + ) +/*++ + +Routine Description: + + Translate a unicode string to a specified language if supported. + +Arguments: + + Language - The name of language to translate to + SupportedLanguages - Supported languages set + UnicodeStringTable - Pointer of one item in translation dictionary + UnicodeString - The translated string + +Returns: + + EFI_INVALID_PARAMETER - Invalid parameter + EFI_UNSUPPORTED - System not supported this language or this string translation + EFI_SUCCESS - String successfully translated + +--*/ +{ + // + // Make sure the parameters are valid + // + if (Language == NULL || UnicodeString == NULL) { + return EFI_INVALID_PARAMETER; + } + + // + // If there are no supported languages, or the Unicode String Table is empty, then the + // Unicode String specified by Language is not supported by this Unicode String Table + // + if (SupportedLanguages == NULL || UnicodeStringTable == NULL) { + return EFI_UNSUPPORTED; + } + + // + // Make sure Language is in the set of Supported Languages + // + while (*SupportedLanguages != 0) { + if (EfiLibCompareLanguage (Language, SupportedLanguages)) { + + // + // Search the Unicode String Table for the matching Language specifier + // + while (UnicodeStringTable->Language != NULL) { + if (EfiLibCompareLanguage (Language, UnicodeStringTable->Language)) { + + // + // A matching string was found, so return it + // + *UnicodeString = UnicodeStringTable->UnicodeString; + return EFI_SUCCESS; + } + + UnicodeStringTable++; + } + + return EFI_UNSUPPORTED; + } + + SupportedLanguages = NextSupportedLanguage (SupportedLanguages); + } + + return EFI_UNSUPPORTED; +} + +EFI_STATUS +EfiLibAddUnicodeString ( + IN CHAR8 *Language, + IN CHAR8 *SupportedLanguages, + IN OUT EFI_UNICODE_STRING_TABLE **UnicodeStringTable, + IN CHAR16 *UnicodeString + ) +/*++ + +Routine Description: + + Add an translation to the dictionary if this language if supported. + +Arguments: + + Language - The name of language to translate to + SupportedLanguages - Supported languages set + UnicodeStringTable - Translation dictionary + UnicodeString - The corresponding string for the language to be translated to + +Returns: + + EFI_INVALID_PARAMETER - Invalid parameter + EFI_UNSUPPORTED - System not supported this language + EFI_ALREADY_STARTED - Already has a translation item of this language + EFI_OUT_OF_RESOURCES - No enough buffer to be allocated + EFI_SUCCESS - String successfully translated + +--*/ +{ + UINTN NumberOfEntries; + EFI_UNICODE_STRING_TABLE *OldUnicodeStringTable; + EFI_UNICODE_STRING_TABLE *NewUnicodeStringTable; + UINTN UnicodeStringLength; + + // + // Make sure the parameter are valid + // + if (Language == NULL || UnicodeString == NULL || UnicodeStringTable == NULL) { + return EFI_INVALID_PARAMETER; + } + + // + // If there are no supported languages, then a Unicode String can not be added + // + if (SupportedLanguages == NULL) { + return EFI_UNSUPPORTED; + } + + // + // If the Unicode String is empty, then a Unicode String can not be added + // + if (UnicodeString[0] == 0) { + return EFI_INVALID_PARAMETER; + } + + // + // Make sure Language is a member of SupportedLanguages + // + while (*SupportedLanguages != 0) { + if (EfiLibCompareLanguage (Language, SupportedLanguages)) { + + // + // Determine the size of the Unicode String Table by looking for a NULL Language entry + // + NumberOfEntries = 0; + if (*UnicodeStringTable != NULL) { + OldUnicodeStringTable = *UnicodeStringTable; + while (OldUnicodeStringTable->Language != NULL) { + if (EfiLibCompareLanguage (Language, OldUnicodeStringTable->Language)) { + return EFI_ALREADY_STARTED; + } + + OldUnicodeStringTable++; + NumberOfEntries++; + } + } + + // + // Allocate space for a new Unicode String Table. It must hold the current number of + // entries, plus 1 entry for the new Unicode String, plus 1 entry for the end of table + // marker + // + NewUnicodeStringTable = EfiLibAllocatePool ((NumberOfEntries + 2) * sizeof (EFI_UNICODE_STRING_TABLE)); + if (NewUnicodeStringTable == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + // + // If the current Unicode String Table contains any entries, then copy them to the + // newly allocated Unicode String Table. + // + if (*UnicodeStringTable != NULL) { + EfiCopyMem ( + NewUnicodeStringTable, + *UnicodeStringTable, + NumberOfEntries * sizeof (EFI_UNICODE_STRING_TABLE) + ); + } + + // + // Allocate space for a copy of the Language specifier + // + NewUnicodeStringTable[NumberOfEntries].Language = EfiLibAllocateCopyPool (EfiAsciiStrSize (Language), Language); + if (NewUnicodeStringTable[NumberOfEntries].Language == NULL) { + gBS->FreePool (NewUnicodeStringTable); + return EFI_OUT_OF_RESOURCES; + } + + // + // Compute the length of the Unicode String + // + for (UnicodeStringLength = 0; UnicodeString[UnicodeStringLength] != 0; UnicodeStringLength++) + ; + + // + // Allocate space for a copy of the Unicode String + // + NewUnicodeStringTable[NumberOfEntries].UnicodeString = EfiLibAllocateCopyPool ( + (UnicodeStringLength + 1) * sizeof (CHAR16), + UnicodeString + ); + if (NewUnicodeStringTable[NumberOfEntries].UnicodeString == NULL) { + gBS->FreePool (NewUnicodeStringTable[NumberOfEntries].Language); + gBS->FreePool (NewUnicodeStringTable); + return EFI_OUT_OF_RESOURCES; + } + + // + // Mark the end of the Unicode String Table + // + NewUnicodeStringTable[NumberOfEntries + 1].Language = NULL; + NewUnicodeStringTable[NumberOfEntries + 1].UnicodeString = NULL; + + // + // Free the old Unicode String Table + // + if (*UnicodeStringTable != NULL) { + gBS->FreePool (*UnicodeStringTable); + } + + // + // Point UnicodeStringTable at the newly allocated Unicode String Table + // + *UnicodeStringTable = NewUnicodeStringTable; + + return EFI_SUCCESS; + } + + SupportedLanguages = NextSupportedLanguage (SupportedLanguages); + } + + return EFI_UNSUPPORTED; +} + +EFI_STATUS +EfiLibFreeUnicodeStringTable ( + IN OUT EFI_UNICODE_STRING_TABLE *UnicodeStringTable + ) +/*++ + +Routine Description: + + Free a string table. + +Arguments: + + UnicodeStringTable - The string table to be freed. + +Returns: + + EFI_SUCCESS - The table successfully freed. + +--*/ +{ + UINTN Index; + + // + // If the Unicode String Table is NULL, then it is already freed + // + if (UnicodeStringTable == NULL) { + return EFI_SUCCESS; + } + + // + // Loop through the Unicode String Table until we reach the end of table marker + // + for (Index = 0; UnicodeStringTable[Index].Language != NULL; Index++) { + + // + // Free the Language string from the Unicode String Table + // + gBS->FreePool (UnicodeStringTable[Index].Language); + + // + // Free the Unicode String from the Unicode String Table + // + if (UnicodeStringTable[Index].UnicodeString != NULL) { + gBS->FreePool (UnicodeStringTable[Index].UnicodeString); + } + } + + // + // Free the Unicode String Table itself + // + gBS->FreePool (UnicodeStringTable); + + return EFI_SUCCESS; +} diff --git a/EDK/Foundation/Library/Dxe/EfiDriverLib/EfiDriverLib.cif b/EDK/Foundation/Library/Dxe/EfiDriverLib/EfiDriverLib.cif new file mode 100644 index 0000000..701a0b9 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/EfiDriverLib/EfiDriverLib.cif @@ -0,0 +1,32 @@ + + name = "EfiDriverLib" + category = ModulePart + LocalRoot = "EDK\Foundation\Library\Dxe\EfiDriverLib\" + RefName = "EfiDriverLib" +[files] +"EfiDriverLib.sdl" +"EfiDriverLib.mak" +"Debug.c" +"DevicePath.c" +"EfiDriverLib.c" +"DxeDriverLib.c" +"EfiGetConfigTable.c" +"EfiDriverModelLib.c" +"Event.c" +"Handle.c" +"LibGlobalSt.c" +"LibGlobalDs.c" +"LibGlobalErrorLevel.c" +"Lock.c" +"EfiLibAllocate.c" +"Perf.c" +"ReportStatusCode.c" +"GetImage.c" +"..\hob\hob.c" +"IA32\PerformancePrimitives.c" +"x64\PerformancePrimitives.c" +"Ipf\PerformancePrimitives.s" +"Ebc\PerformancePrimitives.c" +"EfiDriverLib.inf" +"HobLib.inf" + diff --git a/EDK/Foundation/Library/Dxe/EfiDriverLib/EfiDriverLib.inf b/EDK/Foundation/Library/Dxe/EfiDriverLib/EfiDriverLib.inf new file mode 100644 index 0000000..83226e9 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/EfiDriverLib/EfiDriverLib.inf @@ -0,0 +1,90 @@ +#/*++ +# +# Copyright (c) 2004 - 2012, 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: +# +# EfiDriverLib.inf +# +# Abstract: +# +# Component description file for the EFI driver library. +# +#--*/ + +[defines] +BASE_NAME = EfiDriverLib +COMPONENT_TYPE = LIBRARY + +[sources.common] + Debug.c + DevicePath.c + EfiDriverLib.c + DxeDriverLib.c + EfiGetConfigTable.c + EfiDriverModelLib.c + Event.c + Handle.c + LibGlobalSt.c + LibGlobalDs.c + LibGlobalErrorLevel.c + Lock.c + EfiLibAllocate.c + Perf.c + ReportStatusCode.c + GetImage.c + + ..\hob\hob.c + +[sources.ia32] + ia32\PerformancePrimitives.c + +[sources.x64] + x64\PerformancePrimitives.c + +[sources.ipf] + ipf\PerformancePrimitives.s + +[sources.ebc] + Ebc\PerformancePrimitives.c + +[includes.common] + $(EDK_SOURCE)\Foundation + $(EDK_SOURCE)\Foundation\Framework + $(EDK_SOURCE)\Foundation\Efi + $(EDK_SOURCE)\Foundation\Include + $(EDK_SOURCE)\Foundation\Efi\Include + $(EDK_SOURCE)\Foundation\Framework\Include + $(EDK_SOURCE)\Foundation\Include\IndustryStandard + $(EDK_SOURCE)\Foundation\Core\Dxe + $(EDK_SOURCE)\Foundation\Library\Dxe\Include + $(EDK_SOURCE)\Foundation\Cpu\Pentium\Include + +[libraries.common] + EdkGuidLib + EdkProtocolLib + EdkFrameworkProtocolLib + EfiGuidLib + EfiProtocolLib + ArchProtocolLib + EfiCommonLib + PrintLib + +[libraries.ia32] + CpuIA32Lib + +[libraries.x64] + CpuIA32Lib + +[libraries.ipf] + CpuIA64Lib + +[nmake.common] + C_STD_INCLUDE= diff --git a/EDK/Foundation/Library/Dxe/EfiDriverLib/EfiDriverLib.mak b/EDK/Foundation/Library/Dxe/EfiDriverLib/EfiDriverLib.mak new file mode 100644 index 0000000..ac43c21 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/EfiDriverLib/EfiDriverLib.mak @@ -0,0 +1,75 @@ +#********************************************************************** +#********************************************************************** +#** ** +#** (C)Copyright 1985-2009, American Megatrends, Inc. ** +#** ** +#** All Rights Reserved. ** +#** ** +#** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +#** ** +#** Phone: (770)-246-8600 ** +#** ** +#********************************************************************** +#********************************************************************** + +#********************************************************************** +# $Header: /Alaska/SOURCE/Modules/SharkBayRefCodes/IntelEDK/EfiDriverLib/EfiDriverLib.mak 1 1/20/12 4:06a Jeffch $ +# +# $Revision: 1 $ +# +# $Date: 1/20/12 4:06a $ +#********************************************************************** +# Revision History +# ---------------- +# $Log: /Alaska/SOURCE/Modules/SharkBayRefCodes/IntelEDK/EfiDriverLib/EfiDriverLib.mak $ +# +# 1 1/20/12 4:06a Jeffch +# Create Intel EDK 1117 Patch 7. +# +# 1 9/27/11 6:30a Wesleychen +# Intel EDK initially releases. +# +# 2 9/02/09 3:44a Iminglin +# EIP24919 +# +#********************************************************************** +# +# +# Name: EfiDriverLib.mak +# +# Description: +# +# +#********************************************************************** +$(EFIDRIVERLIB) : EfiDriverLib + +$(BUILD_DIR)\EfiDriverLib.lib : EfiDriverLib + +EfiDriverLib : $(BUILD_DIR)\EfiDriverLib.mak EfiDriverLibBin + +$(BUILD_DIR)\EfiDriverLib.mak : $(EfiDriverLib_DIR)\$(@B).cif $(EfiDriverLib_DIR)\$(@B).mak $(BUILD_RULES) + $(CIF2MAK) $(EfiDriverLib_DIR)\$(@B).cif $(CIF2MAK_DEFAULTS) + +!IF "$(PROCESSOR)"!="IPF" +EfiDriverLibBin : $(CPUIA32LIB) +!ELSE +EfiDriverLibBin : $(CPUIA64LIB) +!ENDIF + +EfiDriverLibBin : $(EDKGUIDLIB) $(EDKPROTOCOLLIB) $(EDKFRAMEWORKPROTOCOLLIB) $(EFIGUIDLIB) $(EFIPROTOCOLLIB) $(ARCHPROTOCOLLIB) $(EFICOMMONLIB) + $(MAKE) /$(MAKEFLAGS) $(EDK_DEFAULTS)\ + /f $(BUILD_DIR)\EfiDriverLib.mak all\ + TYPE=LIBRARY +#********************************************************************** +#********************************************************************** +#** ** +#** (C)Copyright 1985-2009, American Megatrends, Inc. ** +#** ** +#** All Rights Reserved. ** +#** ** +#** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +#** ** +#** Phone: (770)-246-8600 ** +#** ** +#********************************************************************** +#********************************************************************** \ No newline at end of file diff --git a/EDK/Foundation/Library/Dxe/EfiDriverLib/EfiDriverLib.sdl b/EDK/Foundation/Library/Dxe/EfiDriverLib/EfiDriverLib.sdl new file mode 100644 index 0000000..9c3fc8d --- /dev/null +++ b/EDK/Foundation/Library/Dxe/EfiDriverLib/EfiDriverLib.sdl @@ -0,0 +1,26 @@ +TOKEN + Name = "EfiDriverLib_SUPPORT" + Value = "1" + Help = "Main switch to enable EfiDriverLib support in Project" + TokenType = Boolean + TargetEQU = Yes + TargetMAK = Yes + Master = Yes +End + +TOKEN + Name = "EFIDRIVERLIB" + Value = "$(BUILD_DIR)\EfiDriverLib.lib" + TokenType = Expression + TargetMAK = Yes +End + +PATH + Name = "EfiDriverLib_DIR" +End + +MODULE + Help = "Includes EfiDriverLib.mak to Project" + File = "EfiDriverLib.mak" +End + diff --git a/EDK/Foundation/Library/Dxe/EfiDriverLib/EfiDriverModelLib.c b/EDK/Foundation/Library/Dxe/EfiDriverLib/EfiDriverModelLib.c new file mode 100644 index 0000000..eb3d7ae --- /dev/null +++ b/EDK/Foundation/Library/Dxe/EfiDriverLib/EfiDriverModelLib.c @@ -0,0 +1,444 @@ +/*++ + +Copyright (c) 2004 - 2008, 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: + + EfiDriverModelLib.c + +Abstract: + + Light weight lib to support EFI drivers. + +--*/ + +#include "Tiano.h" +#include "EfiDriverLib.h" + +EFI_STATUS +EfiLibInstallDriverBinding ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable, + IN EFI_DRIVER_BINDING_PROTOCOL *DriverBinding, + IN EFI_HANDLE DriverBindingHandle + ) +/*++ + +Routine Description: + + Intialize a driver by installing the Driver Binding Protocol onto the + driver's DriverBindingHandle. This is typically the same as the driver's + ImageHandle, but it can be different if the driver produces multiple + DriverBinding Protocols. This function also initializes the EFI Driver + Library that initializes the global variables gST, gBS, gRT. + +Arguments: + + ImageHandle - The image handle of the driver + + SystemTable - The EFI System Table that was passed to the driver's entry point + + DriverBinding - A Driver Binding Protocol instance that this driver is producing + + DriverBindingHandle - The handle that DriverBinding is to be installe onto. If this + parameter is NULL, then a new handle is created. + +Returns: + + EFI_SUCCESS is DriverBinding is installed onto DriverBindingHandle + + Otherwise, then return status from gBS->InstallProtocolInterface() + +--*/ +{ + EfiInitializeDriverLib (ImageHandle, SystemTable); + + DriverBinding->ImageHandle = ImageHandle; + + DriverBinding->DriverBindingHandle = DriverBindingHandle; + + return gBS->InstallProtocolInterface ( + &DriverBinding->DriverBindingHandle, + &gEfiDriverBindingProtocolGuid, + EFI_NATIVE_INTERFACE, + DriverBinding + ); +} + +EFI_STATUS +InstallAllDriverProtocolsWorker ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE * SystemTable, + IN EFI_DRIVER_BINDING_PROTOCOL * DriverBinding, + IN EFI_HANDLE DriverBindingHandle, + IN EFI_COMPONENT_NAME_PROTOCOL * ComponentName, OPTIONAL + IN EFI_COMPONENT_NAME2_PROTOCOL * ComponentName2, OPTIONAL + IN EFI_DRIVER_CONFIGURATION_PROTOCOL * DriverConfiguration, OPTIONAL + IN EFI_DRIVER_CONFIGURATION2_PROTOCOL * DriverConfiguration2, OPTIONAL + IN EFI_DRIVER_DIAGNOSTICS_PROTOCOL * DriverDiagnostics, OPTIONAL + IN EFI_DRIVER_DIAGNOSTICS2_PROTOCOL * DriverDiagnostics2 OPTIONAL + ) +/*++ + +Routine Description: + + Intialize a driver by installing the Driver Binding Protocol onto the + driver's DriverBindingHandle. This is typically the same as the driver's + ImageHandle, but it can be different if the driver produces multiple + DriverBinding Protocols. This function also initializes the EFI Driver + Library that initializes the global variables gST, gBS, gRT. + +Arguments: + + ImageHandle - The image handle of the driver + + SystemTable - The EFI System Table that was passed to the driver's entry point + + DriverBinding - A Driver Binding Protocol instance that this driver is producing + + DriverBindingHandle - The handle that DriverBinding is to be installe onto. If this + parameter is NULL, then a new handle is created. + + ComponentName - A Component Name Protocol instance that this driver is producing + + ComponentName2 - A Component Name2 Protocol instance that this driver is producing + + DriverConfiguration - A Driver Configuration Protocol instance that this driver is producing + + DriverConfiguration2- A Driver Configuration2 Protocol instance that this driver is producing + + DriverDiagnostics - A Driver Diagnostics Protocol instance that this driver is producing + + DriverDiagnostics2 - A Driver Diagnostics2 Protocol instance that this driver is producing + +Returns: + + EFI_SUCCESS if all the protocols were installed onto DriverBindingHandle + + Otherwise, then return status from gBS->InstallProtocolInterface() + +--*/ +{ + EFI_STATUS Status; + + Status = EfiLibInstallDriverBinding (ImageHandle, SystemTable, DriverBinding, DriverBindingHandle); + if (EFI_ERROR (Status)) { + return Status; + } + + if (ComponentName != NULL) { + Status = gBS->InstallProtocolInterface ( + &DriverBinding->DriverBindingHandle, + &gEfiComponentNameProtocolGuid, + EFI_NATIVE_INTERFACE, + ComponentName + ); + if (EFI_ERROR (Status)) { + return Status; + } + } + + if (ComponentName2 != NULL) { + Status = gBS->InstallProtocolInterface ( + &DriverBinding->DriverBindingHandle, + &gEfiComponentName2ProtocolGuid, + EFI_NATIVE_INTERFACE, + ComponentName2 + ); + if (EFI_ERROR (Status)) { + return Status; + } + } + + if (DriverConfiguration != NULL) { + Status = gBS->InstallProtocolInterface ( + &DriverBinding->DriverBindingHandle, + &gEfiDriverConfigurationProtocolGuid, + EFI_NATIVE_INTERFACE, + DriverConfiguration + ); + if (EFI_ERROR (Status)) { + return Status; + } + } + + if (DriverConfiguration2 != NULL) { + Status = gBS->InstallProtocolInterface ( + &DriverBinding->DriverBindingHandle, + &gEfiDriverConfiguration2ProtocolGuid, + EFI_NATIVE_INTERFACE, + DriverConfiguration2 + ); + if (EFI_ERROR (Status)) { + return Status; + } + } + + if (DriverDiagnostics != NULL) { + Status = gBS->InstallProtocolInterface ( + &DriverBinding->DriverBindingHandle, + &gEfiDriverDiagnosticsProtocolGuid, + EFI_NATIVE_INTERFACE, + DriverDiagnostics + ); + if (EFI_ERROR (Status)) { + return Status; + } + } + + if (DriverDiagnostics2 != NULL) { + Status = gBS->InstallProtocolInterface ( + &DriverBinding->DriverBindingHandle, + &gEfiDriverDiagnostics2ProtocolGuid, + EFI_NATIVE_INTERFACE, + DriverDiagnostics2 + ); + if (EFI_ERROR (Status)) { + return Status; + } + } + + return EFI_SUCCESS; +} + +EFI_STATUS +EfiLibInstallAllDriverProtocols ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE * SystemTable, + IN EFI_DRIVER_BINDING_PROTOCOL * DriverBinding, + IN EFI_HANDLE DriverBindingHandle, + IN EFI_COMPONENT_NAME_PROTOCOL * ComponentName, OPTIONAL + IN EFI_DRIVER_CONFIGURATION_PROTOCOL * DriverConfiguration, OPTIONAL + IN EFI_DRIVER_DIAGNOSTICS_PROTOCOL * DriverDiagnostics OPTIONAL + ) +/*++ + +Routine Description: + + Intialize a driver by installing the Driver Binding Protocol onto the + driver's DriverBindingHandle. This is typically the same as the driver's + ImageHandle, but it can be different if the driver produces multiple + DriverBinding Protocols. This function also initializes the EFI Driver + Library that initializes the global variables gST, gBS, gRT. + +Arguments: + + ImageHandle - The image handle of the driver + + SystemTable - The EFI System Table that was passed to the driver's entry point + + DriverBinding - A Driver Binding Protocol instance that this driver is producing + + DriverBindingHandle - The handle that DriverBinding is to be installe onto. If this + parameter is NULL, then a new handle is created. + + ComponentName - A Component Name Protocol instance that this driver is producing + + DriverConfiguration - A Driver Configuration Protocol instance that this driver is producing + + DriverDiagnostics - A Driver Diagnostics Protocol instance that this driver is producing + +Returns: + + EFI_SUCCESS if all the protocols were installed onto DriverBindingHandle + + Otherwise, then return status from gBS->InstallProtocolInterface() + +--*/ +{ + return InstallAllDriverProtocolsWorker ( + ImageHandle, + SystemTable, + DriverBinding, + DriverBindingHandle, + ComponentName, + NULL, + DriverConfiguration, + NULL, + DriverDiagnostics, + NULL + ); +} + +EFI_STATUS +EfiLibInstallAllDriverProtocols2 ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE * SystemTable, + IN EFI_DRIVER_BINDING_PROTOCOL * DriverBinding, + IN EFI_HANDLE DriverBindingHandle, + IN EFI_COMPONENT_NAME2_PROTOCOL * ComponentName2, OPTIONAL + IN EFI_DRIVER_CONFIGURATION2_PROTOCOL * DriverConfiguration2, OPTIONAL + IN EFI_DRIVER_DIAGNOSTICS2_PROTOCOL * DriverDiagnostics2 OPTIONAL + ) +/*++ + +Routine Description: + + Intialize a driver by installing the Driver Binding Protocol onto the + driver's DriverBindingHandle. This is typically the same as the driver's + ImageHandle, but it can be different if the driver produces multiple + DriverBinding Protocols. This function also initializes the EFI Driver + Library that initializes the global variables gST, gBS, gRT. + +Arguments: + + ImageHandle - The image handle of the driver + + SystemTable - The EFI System Table that was passed to the driver's entry point + + DriverBinding - A Driver Binding Protocol instance that this driver is producing + + DriverBindingHandle - The handle that DriverBinding is to be installe onto. If this + parameter is NULL, then a new handle is created. + + ComponentName2 - A Component Name2 Protocol instance that this driver is producing + + DriverConfiguration2- A Driver Configuration2 Protocol instance that this driver is producing + + DriverDiagnostics2 - A Driver Diagnostics2 Protocol instance that this driver is producing + +Returns: + + EFI_SUCCESS if all the protocols were installed onto DriverBindingHandle + + Otherwise, then return status from gBS->InstallProtocolInterface() + +--*/ +{ + return InstallAllDriverProtocolsWorker ( + ImageHandle, + SystemTable, + DriverBinding, + DriverBindingHandle, + NULL, + ComponentName2, + NULL, + DriverConfiguration2, + NULL, + DriverDiagnostics2 + ); +} + +EFI_STATUS +EfiLibTestManagedDevice ( + IN EFI_HANDLE ControllerHandle, + IN EFI_HANDLE DriverBindingHandle, + IN EFI_GUID *ManagedProtocolGuid + ) +/*++ + +Routine Description: + + Test to see if the controller is managed by a specific driver. + +Arguments: + + ControllerHandle - Handle for controller to test + + DriverBindingHandle - Driver binding handle for controller + + ManagedProtocolGuid - The protocol guid the driver opens on controller + +Returns: + + EFI_SUCCESS - The controller is managed by the driver + + EFI_UNSUPPORTED - The controller is not managed by the driver + +--*/ +{ + EFI_STATUS Status; + VOID *ManagedInterface; + + Status = gBS->OpenProtocol ( + ControllerHandle, + ManagedProtocolGuid, + &ManagedInterface, + DriverBindingHandle, + ControllerHandle, + EFI_OPEN_PROTOCOL_BY_DRIVER + ); + if (!EFI_ERROR (Status)) { + gBS->CloseProtocol ( + ControllerHandle, + ManagedProtocolGuid, + DriverBindingHandle, + ControllerHandle + ); + return EFI_UNSUPPORTED; + } + + if (Status != EFI_ALREADY_STARTED) { + return EFI_UNSUPPORTED; + } + + return EFI_SUCCESS; +} + +EFI_STATUS +EfiLibTestChildHandle ( + IN EFI_HANDLE ControllerHandle, + IN EFI_HANDLE ChildHandle, + IN EFI_GUID *ConsumedGuid + ) +/*++ + +Routine Description: + + Test to see if the child handle is the child of the controller + +Arguments: + + ControllerHandle - Handle for controller (parent) + + ChildHandle - Child handle to test + + ConsumsedGuid - Protocol guid consumed by child from controller + +Returns: + + EFI_SUCCESS - The child handle is the child of the controller + + EFI_UNSUPPORTED - The child handle is not the child of the controller + +--*/ +{ + EFI_STATUS Status; + EFI_OPEN_PROTOCOL_INFORMATION_ENTRY *OpenInfoBuffer; + UINTN EntryCount; + UINTN Index; + + // + // Retrieve the list of agents that are consuming one of the protocols + // on ControllerHandle that the children consume + // + Status = gBS->OpenProtocolInformation ( + ControllerHandle, + ConsumedGuid, + &OpenInfoBuffer, + &EntryCount + ); + if (EFI_ERROR (Status)) { + return EFI_UNSUPPORTED; + } + + // + // See if one of the agents is ChildHandle + // + Status = EFI_UNSUPPORTED; + for (Index = 0; Index < EntryCount; Index++) { + if (OpenInfoBuffer[Index].ControllerHandle == ChildHandle && + OpenInfoBuffer[Index].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) { + Status = EFI_SUCCESS; + } + } + gBS->FreePool (OpenInfoBuffer); + return Status; +} diff --git a/EDK/Foundation/Library/Dxe/EfiDriverLib/EfiGetConfigTable.c b/EDK/Foundation/Library/Dxe/EfiDriverLib/EfiGetConfigTable.c new file mode 100644 index 0000000..619f1b2 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/EfiDriverLib/EfiGetConfigTable.c @@ -0,0 +1,61 @@ +/*++ + +Copyright (c) 2004, 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: + + EfiGetConfigTable.c + +Abstract: + + Light weight lib to support EFI drivers. + +--*/ + +#include "Tiano.h" +#include "EfiDriverLib.h" + +EFI_STATUS +EfiLibGetSystemConfigurationTable ( + IN EFI_GUID *TableGuid, + IN OUT VOID **Table + ) +/*++ + +Routine Description: + + Get table from configuration table by name + +Arguments: + + TableGuid - Table name to search + + Table - Pointer to the table caller wants + +Returns: + + EFI_NOT_FOUND - Not found the table + + EFI_SUCCESS - Found the table + +--*/ +{ + UINTN Index; + + *Table = NULL; + for (Index = 0; Index < gST->NumberOfTableEntries; Index++) { + if (EfiCompareGuid (TableGuid, &(gST->ConfigurationTable[Index].VendorGuid))) { + *Table = gST->ConfigurationTable[Index].VendorTable; + return EFI_SUCCESS; + } + } + + return EFI_NOT_FOUND; +} diff --git a/EDK/Foundation/Library/Dxe/EfiDriverLib/EfiLibAllocate.c b/EDK/Foundation/Library/Dxe/EfiDriverLib/EfiLibAllocate.c new file mode 100644 index 0000000..373d2df --- /dev/null +++ b/EDK/Foundation/Library/Dxe/EfiDriverLib/EfiLibAllocate.c @@ -0,0 +1,233 @@ +/*++ + +Copyright (c) 2004 - 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: + + EfiLibAllocate.c + +Abstract: + + Support routines for memory allocation routines for use with drivers. + +--*/ + +#include "Tiano.h" +#include "EfiDriverLib.h" + +VOID * +EfiLibAllocatePool ( + IN UINTN AllocationSize + ) +/*++ + +Routine Description: + + Allocate BootServicesData pool. + +Arguments: + + AllocationSize - The size to allocate + +Returns: + + Pointer of the buffer allocated. + +--*/ +{ + VOID *Memory; + + Memory = NULL; + gBS->AllocatePool (EfiBootServicesData, AllocationSize, &Memory); + return Memory; +} + +VOID * +EfiLibAllocateRuntimePool ( + IN UINTN AllocationSize + ) +/*++ + +Routine Description: + + Allocate RuntimeServicesData pool. + +Arguments: + + AllocationSize - The size to allocate + +Returns: + + Pointer of the buffer allocated. + +--*/ +{ + VOID *Memory; + + Memory = NULL; + gBS->AllocatePool (EfiRuntimeServicesData, AllocationSize, &Memory); + return Memory; +} + +VOID * +EfiLibAllocateZeroPool ( + IN UINTN AllocationSize + ) +/*++ + +Routine Description: + + Allocate BootServicesData pool and zero it. + +Arguments: + + AllocationSize - The size to allocate + +Returns: + + Pointer of the buffer allocated. + +--*/ +{ + VOID *Memory; + + Memory = EfiLibAllocatePool (AllocationSize); + if (Memory != NULL) { + gBS->SetMem (Memory, AllocationSize, 0); + } + + return Memory; +} + +VOID * +EfiLibAllocateRuntimeZeroPool ( + IN UINTN AllocationSize + ) +/*++ + +Routine Description: + + Allocate RuntimeServicesData pool and zero it. + +Arguments: + + AllocationSize - The size to allocate + +Returns: + + Pointer of the buffer allocated. + +--*/ +{ + VOID *Memory; + + Memory = EfiLibAllocateRuntimePool (AllocationSize); + if (Memory != NULL) { + gBS->SetMem (Memory, AllocationSize, 0); + } + + return Memory; +} + +VOID * +EfiLibAllocateCopyPool ( + IN UINTN AllocationSize, + IN VOID *Buffer + ) +/*++ + +Routine Description: + + Allocate BootServicesData pool and use a buffer provided by + caller to fill it. + +Arguments: + + AllocationSize - The size to allocate + + Buffer - Buffer that will be filled into the buffer allocated + +Returns: + + Pointer of the buffer allocated. + +--*/ +{ + VOID *Memory; + + Memory = NULL; + gBS->AllocatePool (EfiBootServicesData, AllocationSize, &Memory); + if (Memory != NULL) { + gBS->CopyMem (Memory, Buffer, AllocationSize); + } + + return Memory; +} + +VOID * +EfiLibAllocateRuntimeCopyPool ( + IN UINTN AllocationSize, + IN VOID *Buffer + ) +/*++ + +Routine Description: + + Allocate RuntimeServicesData pool and use a buffer provided by + caller to fill it. + +Arguments: + + AllocationSize - The size to allocate + + Buffer - Buffer that will be filled into the buffer allocated + +Returns: + + Pointer of the buffer allocated. + +--*/ +{ + VOID *Memory; + + Memory = NULL; + gBS->AllocatePool (EfiRuntimeServicesData, AllocationSize, &Memory); + if (Memory != NULL) { + gBS->CopyMem (Memory, Buffer, AllocationSize); + } + + return Memory; +} + + +VOID +EfiLibSafeFreePool ( + IN VOID *Buffer + ) +/*++ + +Routine Description: + + Free pool safely (without setting back Buffer to NULL). + +Arguments: + + Buffer - The allocated pool entry to free + +Returns: + + Pointer of the buffer allocated. + +--*/ +{ + if (Buffer != NULL) { + gBS->FreePool (Buffer); + } +} \ No newline at end of file diff --git a/EDK/Foundation/Library/Dxe/EfiDriverLib/Event.c b/EDK/Foundation/Library/Dxe/EfiDriverLib/Event.c new file mode 100644 index 0000000..c341d82 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/EfiDriverLib/Event.c @@ -0,0 +1,371 @@ +/*++ + +Copyright (c) 2004 - 2006, 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: + + Event.c + +Abstract: + + Support for Event lib fucntions. + +--*/ + +#include "Tiano.h" +#include "EfiDriverLib.h" + +EFI_EVENT +EfiLibCreateProtocolNotifyEvent ( + IN EFI_GUID *ProtocolGuid, + IN EFI_TPL NotifyTpl, + IN EFI_EVENT_NOTIFY NotifyFunction, + IN VOID *NotifyContext, + OUT VOID **Registration + ) +/*++ + +Routine Description: + + Create a protocol notification event and return it. + +Arguments: + + ProtocolGuid - Protocol to register notification event on. + + NotifyTpl - Maximum TPL to single the NotifyFunction. + + NotifyFunction - EFI notification routine. + + NotifyContext - Context passed into Event when it is created. + + Registration - Registration key returned from RegisterProtocolNotify(). + +Returns: + + The EFI_EVENT that has been registered to be signaled when a ProtocolGuid + is added to the system. + +--*/ +{ + EFI_STATUS Status; + EFI_EVENT Event; + + // + // Create the event + // + + Status = gBS->CreateEvent ( + EFI_EVENT_NOTIFY_SIGNAL, + NotifyTpl, + NotifyFunction, + NotifyContext, + &Event + ); + ASSERT (!EFI_ERROR (Status)); + + // + // Register for protocol notifactions on this event + // + + Status = gBS->RegisterProtocolNotify ( + ProtocolGuid, + Event, + Registration + ); + + ASSERT (!EFI_ERROR (Status)); + + // + // Kick the event so we will perform an initial pass of + // current installed drivers + // + + gBS->SignalEvent (Event); + return Event; +} + +EFI_STATUS +EfiLibNamedEventListen ( + IN EFI_GUID * Name, + IN EFI_TPL NotifyTpl, + IN EFI_EVENT_NOTIFY NotifyFunction, + IN VOID *NotifyContext + ) +/*++ + +Routine Description: + Listenes to signals on the name. + EfiLibNamedEventSignal() signals the event. + + NOTE: For now, the named listening/signalling is implemented + on a protocol interface being installed and uninstalled. + In the future, this maybe implemented based on a dedicated mechanism. + +Arguments: + Name - Name to register the listener on. + NotifyTpl - Maximum TPL to singnal the NotifyFunction. + NotifyFunction - The listener routine. + NotifyContext - Context passed into the listener routine. + +Returns: + EFI_SUCCESS if successful. + +--*/ +{ + EFI_STATUS Status; + EFI_EVENT Event; + VOID *RegistrationLocal; + + // + // Create event + // + Status = gBS->CreateEvent ( + EFI_EVENT_NOTIFY_SIGNAL, + NotifyTpl, + NotifyFunction, + NotifyContext, + &Event + ); + ASSERT_EFI_ERROR (Status); + + Status = gBS->RegisterProtocolNotify ( + Name, + Event, + &RegistrationLocal + ); + ASSERT_EFI_ERROR (Status); + + return EFI_SUCCESS; +} + +EFI_STATUS +EfiLibNamedEventSignal ( + IN EFI_GUID *Name + ) +/*++ + +Routine Description: + Signals a named event. All registered listeners will run. + The listeners should register using EfiLibNamedEventListen() function. + + NOTE: For now, the named listening/signalling is implemented + on a protocol interface being installed and uninstalled. + In the future, this maybe implemented based on a dedicated mechanism. + +Arguments: + Name - Name to perform the signaling on. The name is a GUID. + +Returns: + EFI_SUCCESS if successfull. + +--*/ +{ + EFI_STATUS Status; + EFI_HANDLE Handle; + + Handle = NULL; + Status = gBS->InstallProtocolInterface ( + &Handle, + Name, + EFI_NATIVE_INTERFACE, + NULL + ); + ASSERT_EFI_ERROR (Status); + + Status = gBS->UninstallProtocolInterface ( + Handle, + Name, + NULL + ); + ASSERT_EFI_ERROR (Status); + + return EFI_SUCCESS; +} + +#if (EFI_SPECIFICATION_VERSION >= 0x00020000) + +static +VOID +EFIAPI +EventNotifySignalAllNullEvent ( + IN EFI_EVENT Event, + IN VOID *Context + ) +{ + // + // This null event is a size efficent way to enusre that + // EFI_EVENT_NOTIFY_SIGNAL_ALL is error checked correctly. + // EFI_EVENT_NOTIFY_SIGNAL_ALL is now mapped into + // CreateEventEx() and this function is used to make the + // old error checking in CreateEvent() for Tiano extensions + // function. + // + return; +} + +#endif + +EFI_STATUS +EFIAPI +EfiCreateEventLegacyBoot ( + IN EFI_TPL NotifyTpl, + IN EFI_EVENT_NOTIFY NotifyFunction, + IN VOID *NotifyContext, + OUT EFI_EVENT *LegacyBootEvent + ) +/*++ + +Routine Description: + Create a Legacy Boot Event. + Tiano extended the CreateEvent Type enum to add a legacy boot event type. + This was bad as Tiano did not own the enum. In UEFI 2.0 CreateEventEx was + added and now it's possible to not voilate the UEFI specification by + declaring a GUID for the legacy boot event class. This library supports + the R8.5/EFI 1.10 form and R8.6/UEFI 2.0 form and allows common code to + work both ways. + +Arguments: + LegacyBootEvent Returns the EFI event returned from gBS->CreateEvent(Ex) + +Returns: + EFI_SUCCESS Event was created. + Other Event was not created. + +--*/ +{ + EFI_STATUS Status; + UINT32 EventType; + EFI_EVENT_NOTIFY WorkerNotifyFunction; + +#if (EFI_SPECIFICATION_VERSION < 0x00020000) + + if (NotifyFunction == NULL) { + EventType = EFI_EVENT_SIGNAL_LEGACY_BOOT | EFI_EVENT_NOTIFY_SIGNAL_ALL; + } else { + EventType = EFI_EVENT_SIGNAL_LEGACY_BOOT; + } + WorkerNotifyFunction = NotifyFunction; + + // + // prior to UEFI 2.0 use Tiano extension to EFI + // + Status = gBS->CreateEvent ( + EventType, + NotifyTpl, + WorkerNotifyFunction, + NotifyContext, + LegacyBootEvent + ); +#else + + EventType = EFI_EVENT_NOTIFY_SIGNAL; + if (NotifyFunction == NULL) { + // + // CreatEventEx will check NotifyFunction is NULL or not + // + WorkerNotifyFunction = EventNotifySignalAllNullEvent; + } else { + WorkerNotifyFunction = NotifyFunction; + } + + // + // For UEFI 2.0 and the future use an Event Group + // + Status = gBS->CreateEventEx ( + EventType, + NotifyTpl, + WorkerNotifyFunction, + NotifyContext, + &gEfiEventLegacyBootGuid, + LegacyBootEvent + ); +#endif + return Status; +} + +EFI_STATUS +EFIAPI +EfiCreateEventReadyToBoot ( + IN EFI_TPL NotifyTpl, + IN EFI_EVENT_NOTIFY NotifyFunction, + IN VOID *NotifyContext, + OUT EFI_EVENT *ReadyToBootEvent + ) +/*++ + +Routine Description: + Create a Read to Boot Event. + + Tiano extended the CreateEvent Type enum to add a ready to boot event type. + This was bad as Tiano did not own the enum. In UEFI 2.0 CreateEventEx was + added and now it's possible to not voilate the UEFI specification and use + the ready to boot event class defined in UEFI 2.0. This library supports + the R8.5/EFI 1.10 form and R8.6/UEFI 2.0 form and allows common code to + work both ways. + +Arguments: + @param LegacyBootEvent Returns the EFI event returned from gBS->CreateEvent(Ex) + +Return: + EFI_SUCCESS - Event was created. + Other - Event was not created. + +--*/ +{ + EFI_STATUS Status; + UINT32 EventType; + EFI_EVENT_NOTIFY WorkerNotifyFunction; + +#if (EFI_SPECIFICATION_VERSION < 0x00020000) + + if (NotifyFunction == NULL) { + EventType = EFI_EVENT_SIGNAL_READY_TO_BOOT | EFI_EVENT_NOTIFY_SIGNAL_ALL; + } else { + EventType = EFI_EVENT_SIGNAL_READY_TO_BOOT; + } + WorkerNotifyFunction = NotifyFunction; + + // + // prior to UEFI 2.0 use Tiano extension to EFI + // + Status = gBS->CreateEvent ( + EventType, + NotifyTpl, + WorkerNotifyFunction, + NotifyContext, + ReadyToBootEvent + ); +#else + + EventType = EFI_EVENT_NOTIFY_SIGNAL; + if (NotifyFunction == NULL) { + // + // CreatEventEx will check NotifyFunction is NULL or not + // + WorkerNotifyFunction = EventNotifySignalAllNullEvent; + } else { + WorkerNotifyFunction = NotifyFunction; + } + + // + // For UEFI 2.0 and the future use an Event Group + // + Status = gBS->CreateEventEx ( + EventType, + NotifyTpl, + WorkerNotifyFunction, + NotifyContext, + &gEfiEventReadyToBootGuid, + ReadyToBootEvent + ); +#endif + return Status; +} diff --git a/EDK/Foundation/Library/Dxe/EfiDriverLib/GetImage.c b/EDK/Foundation/Library/Dxe/EfiDriverLib/GetImage.c new file mode 100644 index 0000000..20493b3 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/EfiDriverLib/GetImage.c @@ -0,0 +1,220 @@ +/*++ + +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: + + GetImage.c + +Abstract: + + Image data extraction support for common use. + +--*/ + +#include "Tiano.h" +#include "EfiDriverLib.h" +#include "EfiImageFormat.h" + +#include EFI_PROTOCOL_CONSUMER (LoadedImage) + +EFI_STATUS +GetImageFromFv ( +#if (PI_SPECIFICATION_VERSION < 0x00010000) //;;## ...AMI_OVERRIDE... Support PI1.x + IN EFI_FIRMWARE_VOLUME_PROTOCOL *Fv, +#else + IN EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv, +#endif + IN EFI_GUID *NameGuid, + IN EFI_SECTION_TYPE SectionType, + OUT VOID **Buffer, + OUT UINTN *Size + ) +{ + EFI_STATUS Status; + EFI_FV_FILETYPE FileType; + EFI_FV_FILE_ATTRIBUTES Attributes; + UINT32 AuthenticationStatus; + + // + // Read desired section content in NameGuid file + // + *Buffer = NULL; + *Size = 0; + Status = Fv->ReadSection ( + Fv, + NameGuid, + SectionType, + 0, + Buffer, + Size, + &AuthenticationStatus + ); + + if (EFI_ERROR (Status) && (SectionType == EFI_SECTION_TE)) { + // + // Try reading PE32 section, since the TE section does not exist + // + *Buffer = NULL; + *Size = 0; + Status = Fv->ReadSection ( + Fv, + NameGuid, + EFI_SECTION_PE32, + 0, + Buffer, + Size, + &AuthenticationStatus + ); + } + + if (EFI_ERROR (Status) && + ((SectionType == EFI_SECTION_TE) || (SectionType == EFI_SECTION_PE32))) { + // + // Try reading raw file, since the desired section does not exist + // + *Buffer = NULL; + *Size = 0; + Status = Fv->ReadFile ( + Fv, + NameGuid, + Buffer, + Size, + &FileType, + &Attributes, + &AuthenticationStatus + ); + } + + return Status; +} + +EFI_STATUS +GetImage ( + IN EFI_GUID *NameGuid, + IN EFI_SECTION_TYPE SectionType, + OUT VOID **Buffer, + OUT UINTN *Size + ) +{ + return GetImageEx (NULL, NameGuid, SectionType, Buffer, Size, FALSE); +} + +EFI_STATUS +GetImageEx ( + IN EFI_HANDLE ImageHandle, + IN EFI_GUID *NameGuid, + IN EFI_SECTION_TYPE SectionType, + OUT VOID **Buffer, + OUT UINTN *Size, + BOOLEAN WithinImageFv + ) +{ + EFI_STATUS Status; + EFI_HANDLE *HandleBuffer; + UINTN HandleCount; + UINTN Index; + EFI_LOADED_IMAGE_PROTOCOL *LoadedImage; +#if (PI_SPECIFICATION_VERSION < 0x00010000) //;;## ...AMI_OVERRIDE... Support PI1.x + EFI_FIRMWARE_VOLUME_PROTOCOL *ImageFv; + EFI_FIRMWARE_VOLUME_PROTOCOL *Fv; +#else + EFI_FIRMWARE_VOLUME2_PROTOCOL *ImageFv; + EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv; +#endif + + if (ImageHandle == NULL && WithinImageFv) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_NOT_FOUND; + ImageFv = NULL; + if (ImageHandle != NULL) { + Status = gBS->HandleProtocol ( + ImageHandle, + &gEfiLoadedImageProtocolGuid, + (VOID **) &LoadedImage + ); + if (EFI_ERROR (Status)) { + return Status; + } + Status = gBS->HandleProtocol ( + LoadedImage->DeviceHandle, + #if (PI_SPECIFICATION_VERSION < 0x00010000) + &gEfiFirmwareVolumeProtocolGuid, + #else + &gEfiFirmwareVolume2ProtocolGuid, + #endif + (VOID **) &ImageFv + ); + if (!EFI_ERROR (Status)) { + Status = GetImageFromFv (ImageFv, NameGuid, SectionType, Buffer, Size); + } + } + + if (Status == EFI_SUCCESS || WithinImageFv) { + return Status; + } + + Status = gBS->LocateHandleBuffer ( + ByProtocol, + #if (PI_SPECIFICATION_VERSION < 0x00010000) + &gEfiFirmwareVolumeProtocolGuid, + #else + &gEfiFirmwareVolume2ProtocolGuid, + #endif + NULL, + &HandleCount, + &HandleBuffer + ); + if (EFI_ERROR (Status)) { + return Status; + } + + // + // Find desired image in all Fvs + // + for (Index = 0; Index < HandleCount; ++Index) { + Status = gBS->HandleProtocol ( + HandleBuffer[Index], + #if (PI_SPECIFICATION_VERSION < 0x00010000) + &gEfiFirmwareVolumeProtocolGuid, + #else + &gEfiFirmwareVolume2ProtocolGuid, + #endif + (VOID**)&Fv + ); + + if (EFI_ERROR (Status)) { + gBS->FreePool(HandleBuffer); + return Status; + } + + if (ImageFv != NULL && Fv == ImageFv) { + continue; + } + + Status = GetImageFromFv (Fv, NameGuid, SectionType, Buffer, Size); + + if (!EFI_ERROR (Status)) { + break; + } + } + gBS->FreePool(HandleBuffer); + + // + // Not found image + // + if (Index == HandleCount) { + return EFI_NOT_FOUND; + } + + return EFI_SUCCESS; +} diff --git a/EDK/Foundation/Library/Dxe/EfiDriverLib/Handle.c b/EDK/Foundation/Library/Dxe/EfiDriverLib/Handle.c new file mode 100644 index 0000000..b440a10 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/EfiDriverLib/Handle.c @@ -0,0 +1,176 @@ +/*++ + +Copyright (c) 2004, 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: + + Handle.c + +Abstract: + + Support for Handle lib fucntions. + +--*/ + +#include "Tiano.h" +#include "EfiDriverLib.h" + +EFI_STATUS +EfiLibLocateHandleProtocolByProtocols ( + IN OUT EFI_HANDLE * Handle, OPTIONAL + OUT VOID **Interface, OPTIONAL + ... + ) +/*++ +Routine Description: + + Function locates Protocol and/or Handle on which all Protocols specified + as a variable list are installed. + It supports continued search. The caller must assure that no handles are added + or removed while performing continued search, by e.g., rising the TPL and not + calling any handle routines. Otherwise the behavior is undefined. + +Arguments: + + Handle - The address of handle to receive the handle on which protocols + indicated by the variable list are installed. + If points to NULL, all handles are searched. If pointing to a + handle returned from previous call, searches starting from next handle. + If NULL, the parameter is ignored. + + Interface - The address of a pointer to a protocol interface that will receive + the interface indicated by first variable argument. + If NULL, the parameter is ignored. + + ... - A variable argument list containing protocol GUIDs. Must end with NULL. + +Returns: + + EFI_SUCCESS - All the protocols where found on same handle. + EFI_NOT_FOUND - A Handle with all the protocols installed was not found. + Other values as may be returned from LocateHandleBuffer() or HandleProtocol(). + +--*/ +{ + VA_LIST args; + EFI_STATUS Status; + EFI_GUID *Protocol; + EFI_GUID *ProtocolFirst; + EFI_HANDLE *HandleBuffer; + UINTN NumberOfHandles; + UINTN Idx; + VOID *AnInterface; + + AnInterface = NULL; + VA_START (args, Interface); + ProtocolFirst = VA_ARG (args, EFI_GUID *); + + // + // Get list of all handles that support the first protocol. + // + Status = gBS->LocateHandleBuffer ( + ByProtocol, + ProtocolFirst, + NULL, + &NumberOfHandles, + &HandleBuffer + ); + if (EFI_ERROR (Status)) { + return Status; + } + + // + // Check if this is a countinuation of handle searching. + // + Idx = 0; + if ((Handle != NULL) && (*Handle != NULL)) { + // + // Leave the Idx just beyond the matching handle. + // + for (; Idx < NumberOfHandles;) { + if (*Handle == HandleBuffer[Idx++]) { + break; + } + } + } + + // + // Iterate handles testing for presence of remaining protocols. + // + for (; Idx < NumberOfHandles; Idx++) { + + // + // Start with the second protocol, the first one is sure on this handle. + // + VA_START (args, Interface); + VA_ARG (args, EFI_GUID *); + + // + // Iterate protocols from the variable list. + // + while (TRUE) { + + Protocol = VA_ARG (args, EFI_GUID *); + + if (Protocol == NULL) { + + // + // If here, the list was iterated successfully + // finding each protocol on a single handle. + // + + Status = EFI_SUCCESS; + + // + // OPTIONAL parameter returning the Handle. + // + if (Handle != NULL) { + *Handle = HandleBuffer[Idx]; + } + + // + // OPTIONAL parameter returning the first rotocol's Interface. + // + if (Interface != NULL) { + Status = gBS->HandleProtocol ( + HandleBuffer[Idx], + ProtocolFirst, + Interface + ); + } + + goto lbl_out; + } + + Status = gBS->HandleProtocol ( + HandleBuffer[Idx], + Protocol, + &AnInterface + ); + if (EFI_ERROR (Status)) { + + // + // This handle does not have the iterated protocol. + // + break; + } + } + + } + + // + // If here, no handle that bears all the protocols was found. + // + Status = EFI_NOT_FOUND; + +lbl_out: + gBS->FreePool (HandleBuffer); + return Status; +} diff --git a/EDK/Foundation/Library/Dxe/EfiDriverLib/HobLib.inf b/EDK/Foundation/Library/Dxe/EfiDriverLib/HobLib.inf new file mode 100644 index 0000000..aecf5b7 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/EfiDriverLib/HobLib.inf @@ -0,0 +1,47 @@ +#/*++ +# +# Copyright (c) 2004, 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: +# +# HobLib.inf +# +# Abstract: +# +# Component description file. +# +#--*/ + +[defines] +BASE_NAME = HobLib +COMPONENT_TYPE = LIBRARY + +[sources.common] + Hob.c + + +[includes.common] + $(EDK_SOURCE)\Foundation + $(EDK_SOURCE)\Foundation\Framework + $(EDK_SOURCE)\Foundation\Efi + . + $(EDK_SOURCE)\Foundation\Include + $(EDK_SOURCE)\Foundation\Efi\Include + $(EDK_SOURCE)\Foundation\Framework\Include + $(EDK_SOURCE)\Foundation\Include\IndustryStandard + $(EDK_SOURCE)\Foundation\Library\Dxe\Include + $(EDK_SOURCE)\Foundation\Core\Dxe + +[libraries.common] + EdkGuidLib + EdkFrameworkGuidLib + +[nmake.common] + C_STD_INCLUDE= diff --git a/EDK/Foundation/Library/Dxe/EfiDriverLib/IA32/PerformancePrimitives.c b/EDK/Foundation/Library/Dxe/EfiDriverLib/IA32/PerformancePrimitives.c new file mode 100644 index 0000000..d3a437c --- /dev/null +++ b/EDK/Foundation/Library/Dxe/EfiDriverLib/IA32/PerformancePrimitives.c @@ -0,0 +1,47 @@ +/*++ + +Copyright (c) 2004, 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: + + PerformancePrimitives.c + +Abstract: + + Support for Performance library + +--*/ + +#include "TianoCommon.h" +#include "CpuIA32.h" + +EFI_STATUS +GetTimerValue ( + OUT UINT64 *TimerValue + ) +/*++ + +Routine Description: + + Set TimerValue with current tick. + +Arguments: + + TimerValue - Timer value to be set + +Returns: + + EFI_SUCCESS - TimerValue is set. + +--*/ +{ + *TimerValue = EfiReadTsc (); + return EFI_SUCCESS; +} diff --git a/EDK/Foundation/Library/Dxe/EfiDriverLib/Ipf/PerformancePrimitives.s b/EDK/Foundation/Library/Dxe/EfiDriverLib/Ipf/PerformancePrimitives.s new file mode 100644 index 0000000..5aeb886 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/EfiDriverLib/Ipf/PerformancePrimitives.s @@ -0,0 +1,61 @@ +//++ +// Copyright (c) 2004, 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: +// +// PerformancePrimitives.s +// +// Abstract: +// +// +// Revision History: +// +//-- + +.file "PerformancePrimitives.s" + +#include "IpfMacro.i" + +//----------------------------------------------------------------------------- +//++ +// GetTimerValue +// +// Implementation of CPU-based time service +// +// On Entry : +// EFI_STATUS +// GetTimerValue ( +// OUT UINT64 *TimerValue +// ) +// +// Return Value: +// r8 = Status +// r9 = 0 +// r10 = 0 +// r11 = 0 +// +// As per static calling conventions. +// +//-- +//--------------------------------------------------------------------------- +PROCEDURE_ENTRY (GetTimerValue) + + NESTED_SETUP (1,8,0,0) + mov r8 = ar.itc;; + st8 [r32]= r8 + mov r8 = r0 + mov r9 = r0 + mov r10 = r0 + mov r11 = r0 + NESTED_RETURN + +PROCEDURE_EXIT (GetTimerValue) +//--------------------------------------------------------------------------- + diff --git a/EDK/Foundation/Library/Dxe/EfiDriverLib/LibGlobalDs.c b/EDK/Foundation/Library/Dxe/EfiDriverLib/LibGlobalDs.c new file mode 100644 index 0000000..2edd766 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/EfiDriverLib/LibGlobalDs.c @@ -0,0 +1,32 @@ +/*++ + +Copyright (c) 2004, 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: + + LibGlobalDs.c + +Abstract: + + Globals used in EFI Driver Lib. They are initialized in EfiDriverLib.c. + Each seperatly linked module has it's own copy of these globals. + + gBS - Boot Services table pointer + gRT - Runt Time services table pointer + gST - System Table pointer + + gErrorLevel - Debug error level. + +--*/ + +#include "Tiano.h" +#include "EfiDriverLib.h" + +EFI_DXE_SERVICES *gDS = NULL; diff --git a/EDK/Foundation/Library/Dxe/EfiDriverLib/LibGlobalErrorLevel.c b/EDK/Foundation/Library/Dxe/EfiDriverLib/LibGlobalErrorLevel.c new file mode 100644 index 0000000..82bea32 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/EfiDriverLib/LibGlobalErrorLevel.c @@ -0,0 +1,34 @@ +/*++ + +Copyright (c) 2004, 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: + + LibGlobalErrorLevel.c + +Abstract: + + Globals used in EFI Driver Lib. They are initialized in EfiDriverLib.c. + Each seperatly linked module has it's own copy of these globals. + + gBS - Boot Services table pointer + gRT - Runt Time services table pointer + gST - System Table pointer + + gErrorLevel - Debug error level. + +--*/ + +#include "Tiano.h" +#include "EfiDriverLib.h" +#include EFI_GUID_DEFINITION (StatusCodeCallerId) +#include EFI_GUID_DEFINITION (StatusCodeDataTypeId) + +UINTN gErrorLevel = EFI_DBUG_MASK | EFI_D_LOAD | EFI_D_INFO; //;;## ...AMI_OVERRIDE... Aptio not support gEfiDebugMaskPpiGuid. diff --git a/EDK/Foundation/Library/Dxe/EfiDriverLib/LibGlobalSt.c b/EDK/Foundation/Library/Dxe/EfiDriverLib/LibGlobalSt.c new file mode 100644 index 0000000..cd866ba --- /dev/null +++ b/EDK/Foundation/Library/Dxe/EfiDriverLib/LibGlobalSt.c @@ -0,0 +1,34 @@ +/*++ + +Copyright (c) 2004, 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: + + LibGlobalSt.c + +Abstract: + + Globals used in EFI Driver Lib. They are initialized in EfiDriverLib.c. + Each seperatly linked module has it's own copy of these globals. + + gBS - Boot Services table pointer + gRT - Runt Time services table pointer + gST - System Table pointer + + gErrorLevel - Debug error level. + +--*/ + +#include "Tiano.h" +#include "EfiDriverLib.h" + +EFI_SYSTEM_TABLE *gST = NULL; +EFI_BOOT_SERVICES *gBS = NULL; +EFI_RUNTIME_SERVICES *gRT = NULL; diff --git a/EDK/Foundation/Library/Dxe/EfiDriverLib/Lock.c b/EDK/Foundation/Library/Dxe/EfiDriverLib/Lock.c new file mode 100644 index 0000000..f9d1006 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/EfiDriverLib/Lock.c @@ -0,0 +1,159 @@ +/*++ + +Copyright (c) 2004, 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: + + Lock.c + +Abstract: + + Support for locking lib services. + +--*/ + +#include "Tiano.h" +#include "EfiDriverLib.h" + +VOID +EfiInitializeLock ( + IN OUT EFI_LOCK *Lock, + IN EFI_TPL Priority + ) +/*++ + +Routine Description: + + Initialize a basic mutual exclusion lock. Each lock + provides mutual exclusion access at it's task priority + level. Since there is no-premption (at any TPL) or + multiprocessor support, acquiring the lock only consists + of raising to the locks TPL. + + Note on a check build ASSERT()s are used to ensure proper + lock usage. + +Arguments: + + Lock - The EFI_LOCK structure to initialize + + Priority - The task priority level of the lock + + +Returns: + + An initialized Efi Lock structure. + +--*/ +{ + Lock->Tpl = Priority; + Lock->OwnerTpl = 0; + Lock->Lock = 0; +} + +EFI_STATUS +EfiAcquireLockOrFail ( + IN EFI_LOCK *Lock + ) +/*++ + +Routine Description: + + Initialize a basic mutual exclusion lock. Each lock + provides mutual exclusion access at it's task priority + level. Since there is no-premption (at any TPL) or + multiprocessor support, acquiring the lock only consists + of raising to the locks TPL. + +Arguments: + + Lock - The EFI_LOCK structure to initialize + +Returns: + + EFI_SUCCESS - Lock Owned. + EFI_ACCESS_DENIED - Reentrant Lock Acquisition, Lock not Owned. + +--*/ +{ + if (Lock->Lock != 0) { + // + // Lock is already owned, so bail out + // + return EFI_ACCESS_DENIED; + } + + Lock->OwnerTpl = gBS->RaiseTPL (Lock->Tpl); + + Lock->Lock += 1; + return EFI_SUCCESS; +} + +VOID +EfiAcquireLock ( + IN EFI_LOCK *Lock + ) +/*++ + +Routine Description: + + Raising to the task priority level of the mutual exclusion + lock, and then acquires ownership of the lock. + +Arguments: + + Lock - The lock to acquire + +Returns: + + Lock owned + +--*/ +{ + EFI_STATUS Status; + + Status = EfiAcquireLockOrFail (Lock); + + // + // Lock was already locked. + // + ASSERT_EFI_ERROR (Status); +} + +VOID +EfiReleaseLock ( + IN EFI_LOCK *Lock + ) +/*++ + +Routine Description: + + Releases ownership of the mutual exclusion lock, and + restores the previous task priority level. + +Arguments: + + Lock - The lock to release + +Returns: + + Lock unowned + +--*/ +{ + EFI_TPL Tpl; + + Tpl = Lock->OwnerTpl; + + ASSERT (Lock->Lock == 1); + Lock->Lock -= 1; + + gBS->RestoreTPL (Tpl); +} diff --git a/EDK/Foundation/Library/Dxe/EfiDriverLib/Perf.c b/EDK/Foundation/Library/Dxe/EfiDriverLib/Perf.c new file mode 100644 index 0000000..9bed854 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/EfiDriverLib/Perf.c @@ -0,0 +1,946 @@ +/*++ + +Copyright (c) 2004 - 2012, 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: + + Perf.c + +Abstract: + + Support library for DXE Firmware Performance logging. + +--*/ + +#include "Tiano.h" + +#include EFI_PROTOCOL_DEFINITION (FirmwarePerformance) +#include EFI_GUID_DEFINITION (PeiPerformanceHob) +#include EFI_PROTOCOL_DEFINITION (LoadedImage) +#include EFI_PROTOCOL_DEFINITION (DriverBinding) +#include EFI_GUID_DEFINITION (Hob) + +#include "EfiDriverLib.h" +#include "EfiHobLib.h" +#include "EfiImage.h" +#include "EfiCommonLib.h" +#include "CpuIA32.h" + +EFI_GUID gNullGuid = EFI_NULL_GUID; +FIRMWARE_PERFORMANCE_PROTOCOL *FirmwarePerformance; + +static UINT32 *mPerformancePointer; +static UINT32 mPerformanceLength; +UINT16 BdsAttemptNumber = 0; + +#define LOCAL_APIC_BASE 0xfee00000 +#define APIC_ID_REGISTER 0x20 +#define MSR_EXT_XAPIC_LOGICAL_APIC_ID 0x802 +#define MSR_XAPIC_BASE 0x1B +#define MSR_XAPIC_BASE_MASK 0x0c00 +#define MAX_NON_TURBO_RATIO_OFFSET 8 +#define MAX_NON_TURBO_RATIO_MASK 0xff +#define PLATFORM_INFO_MSR 0xce + +EFI_STATUS +GetTimerValue ( + OUT UINT64 *TimerValue + ); + +EFI_STATUS +GetPeiFirmwarePerformanceHob ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ); + +UINT64 GetTimeInNanoSec ( + UINT64 Ticker + ) +/*++ + +Routine Description: + + Internal routine to convert TSC value into nano second value + +Arguments: + + Ticker - OPTIONAL. TSC value supplied by caller function + +Returns: + + UINT64 - returns calculated timer value + +--*/ +{ + UINT64 Tick, pi; + UINT8 Ratio; + + if(Ticker != 0){ + Tick = Ticker; + } else { + GetTimerValue (&Tick); + } + + pi = EfiReadMsr(PLATFORM_INFO_MSR); + Ratio = (UINT8)( ((UINT32)(UINTN)RShiftU64(pi, MAX_NON_TURBO_RATIO_OFFSET)) & MAX_NON_TURBO_RATIO_MASK); + + return (UINT64)DivU64x32((UINT64)MultU64x32(Tick, 10), (UINTN)(Ratio), NULL); +} + +UINT32 GetApicId ( + VOID + ) +/*++ + +Routine Description: + + Internal routine to retrieve current APIC Id + +Arguments: + + None + +Returns: + + UINT32 - returns Apic Id value + +--*/ +{ + BOOLEAN x2ApicEnabled; + UINT32 ApicId; + + x2ApicEnabled = (BOOLEAN)(((EfiReadMsr (MSR_XAPIC_BASE)) & (MSR_XAPIC_BASE_MASK)) == MSR_XAPIC_BASE_MASK); + if (x2ApicEnabled) { + ApicId = (UINT32) EfiReadMsr (MSR_EXT_XAPIC_LOGICAL_APIC_ID); + } else { + ApicId = (UINT8) (*(volatile UINT32 *) (UINTN) (LOCAL_APIC_BASE + APIC_ID_REGISTER) >> 24); + } + + return ApicId; +} + +STATIC +VOID +GetShortPdbFileName ( + CHAR8 *PdbFileName, + CHAR8 *GaugeString + ) +/*++ + +Routine Description: + + Shotens PDB path name + +Arguments: + + PdbFileName - PdbFileName + +Returns: + GaugeString - GaugeString + +--*/ +{ + UINTN Index; + UINTN Index1; + UINTN StartIndex; + UINTN EndIndex; + + if (PdbFileName == NULL) { + EfiAsciiStrCpy (GaugeString, " "); + } else { + StartIndex = 0; + for (EndIndex = 0; PdbFileName[EndIndex] != 0; EndIndex++) + ; + + for (Index = 0; PdbFileName[Index] != 0; Index++) { + if (PdbFileName[Index] == '\\') { + StartIndex = Index + 1; + } + + if (PdbFileName[Index] == '.') { + EndIndex = Index; + } + } + + Index1 = 0; + for (Index = StartIndex; Index < EndIndex; Index++) { + GaugeString[Index1] = PdbFileName[Index]; + Index1++; + if (Index1 == STRING_EVENT_RECORD_NAME_LENGTH - 1) { + break; + } + } + + GaugeString[Index1] = 0; + } + + return ; +} + +STATIC +CHAR8 * +GetPdbPath ( + VOID *ImageBase + ) +/*++ + +Routine Description: + + Locate PDB path name in PE image + +Arguments: + + ImageBase - base of PE to search + +Returns: + + Pointer into image at offset of PDB file name if PDB file name is found, + Otherwise a pointer to an empty string. + +--*/ +{ + CHAR8 *PdbPath; + UINT32 DirCount; + EFI_IMAGE_DOS_HEADER *DosHdr; + EFI_IMAGE_NT_HEADERS *NtHdr; + UINT16 Magic; + EFI_IMAGE_OPTIONAL_HEADER32 *OptionalHdr32; + EFI_IMAGE_OPTIONAL_HEADER64 *OptionalHdr64; + EFI_IMAGE_DATA_DIRECTORY *DirectoryEntry; + EFI_IMAGE_DEBUG_DIRECTORY_ENTRY *DebugEntry; + VOID *CodeViewEntryPointer; + + CodeViewEntryPointer = NULL; + PdbPath = NULL; + DosHdr = ImageBase; + if (DosHdr && DosHdr->e_magic == EFI_IMAGE_DOS_SIGNATURE) { + NtHdr = (EFI_IMAGE_NT_HEADERS *) ((UINT8 *) DosHdr + DosHdr->e_lfanew); + // + // NOTE: We use Machine to identify PE32/PE32+, instead of Magic. + // It is for backward-compatibility consideration, because + // some system will generate PE32+ image with PE32 Magic. + // + if (NtHdr->FileHeader.Machine == EFI_IMAGE_MACHINE_IA32) { + Magic = EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC; + } else if (NtHdr->FileHeader.Machine == EFI_IMAGE_MACHINE_IA64) { + Magic = EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC; + } else if (NtHdr->FileHeader.Machine == EFI_IMAGE_MACHINE_X64) { + Magic = EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC; + } else { + Magic = NtHdr->OptionalHeader.Magic; + } + if (Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) { + OptionalHdr32 = (VOID *) &NtHdr->OptionalHeader; + DirectoryEntry = (EFI_IMAGE_DATA_DIRECTORY *) &(OptionalHdr32->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG]); + } else { + OptionalHdr64 = (VOID *) &NtHdr->OptionalHeader; + DirectoryEntry = (EFI_IMAGE_DATA_DIRECTORY *) &(OptionalHdr64->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG]); + } + + if (DirectoryEntry->VirtualAddress != 0) { + for (DirCount = 0; + (DirCount < DirectoryEntry->Size / sizeof (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY)) && CodeViewEntryPointer == NULL; + DirCount++ + ) { + DebugEntry = (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY *) (DirectoryEntry->VirtualAddress + (UINTN) ImageBase + DirCount * sizeof (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY)); + if (DebugEntry->Type == EFI_IMAGE_DEBUG_TYPE_CODEVIEW) { + CodeViewEntryPointer = (VOID *) ((UINTN) DebugEntry->RVA + (UINTN) ImageBase); + switch (*(UINT32 *) CodeViewEntryPointer) { + case CODEVIEW_SIGNATURE_NB10: + PdbPath = (CHAR8 *) CodeViewEntryPointer + sizeof (EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY); + break; + + case CODEVIEW_SIGNATURE_RSDS: + PdbPath = (CHAR8 *) CodeViewEntryPointer + sizeof (EFI_IMAGE_DEBUG_CODEVIEW_RSDS_ENTRY); + break; + + default: + break; + } + } + } + } + } + + return PdbPath; +} + +STATIC +VOID +GetNameFromHandle ( + IN EFI_HANDLE Handle, + OUT CHAR8 *GaugeString + ) +/*++ + +Routine Description: + + retrieves PDB path name from Handle + +Arguments: + + Handle - Handle of image + +Returns: + + Pointer to PDB Filename +--*/ +{ + EFI_STATUS Status; + EFI_LOADED_IMAGE_PROTOCOL *Image; + CHAR8 *PdbFileName; + EFI_DRIVER_BINDING_PROTOCOL *DriverBinding; + + EfiAsciiStrCpy (GaugeString, " "); + + // + // Get handle name from image protocol + // + Status = gBS->HandleProtocol ( + Handle, + &gEfiLoadedImageProtocolGuid, + (VOID**)&Image + ); + + if (EFI_ERROR (Status)) { + Status = gBS->OpenProtocol ( + Handle, + &gEfiDriverBindingProtocolGuid, + (VOID **) &DriverBinding, + NULL, + NULL, + EFI_OPEN_PROTOCOL_GET_PROTOCOL + ); + if (EFI_ERROR (Status)) { + return ; + } + // + // Get handle name from image protocol + // + Status = gBS->HandleProtocol ( + DriverBinding->ImageHandle, + &gEfiLoadedImageProtocolGuid, + (VOID**)&Image + ); + } + + PdbFileName = GetPdbPath (Image->ImageBase); + + if (PdbFileName != NULL) { + GetShortPdbFileName (PdbFileName, GaugeString); + } + + return ; +} + +EFI_GUID * +GetGuidFromHandle ( + EFI_HANDLE Handle + ) +/*++ + +Routine Description: + + retrieves GUID name from Handle + +Arguments: + + Handle - Handle of image + +Returns: + + Pointer to GUID name +--*/ +{ + EFI_STATUS Status; + EFI_LOADED_IMAGE_PROTOCOL *pImage; + MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *FvFilePath; + + if (Handle!=NULL){ + Status = gBS->HandleProtocol(Handle, + &gEfiLoadedImageProtocolGuid, + &pImage + ); + if (!EFI_ERROR(Status)){ + if (pImage->FilePath->Type==MEDIA_DEVICE_PATH && pImage->FilePath->SubType==MEDIA_FV_FILEPATH_DP) { + // + // Determine GUID associated with module logging performance + // + FvFilePath = (MEDIA_FW_VOL_FILEPATH_DEVICE_PATH*)pImage->FilePath; + + return &FvFilePath->NameGuid; + } + } + } + + return NULL; +} + +EFI_STATUS +LocatePerformanceProtocol( + VOID + ) +/*++ + +Routine Description: + + locates Performance protocol interface + +Arguments: + + None + +Returns: + EFI_STATUS + +--*/ +{ + EFI_STATUS Status; + + FirmwarePerformance = NULL; + Status = gBS->LocateProtocol (&gFirmwarePerformanceProtocolGuid, NULL, (VOID **) &FirmwarePerformance); + + return Status; +} + +EFI_STATUS +EFIAPI +InsertMeasurement ( + IN FIRMWARE_PERFORMANCE_PROTOCOL *This, + IN EFI_HANDLE Handle, + IN UINT16 RecordType, + IN UINT64 Ticker, + IN UINT16 Identifier OPTIONAL + ) +/*++ + +Routine Description: + + Logs performance data according to Record Type into pre-allocated buffer + +Arguments: + + This - Calling context + Handle - Handle of gauge data + RecordType - Type of FPDT record + Ticker - Set event's Tick. If 0, Tick is current timer. + Identifier - Identifier of event records and other types of records + +Returns: + + EFI_SUCCESS - Successfully create and initialized a guage data node. + EFI_OUT_OF_RESOURCES - No enough resource to create a guage data node. + +--*/ +{ + EFI_DEVICE_PATH_PROTOCOL *DevicePath; + HARDWARE_BOOT_REC *HardwareBootRec; + STRING_EVENT_REC *StringEvent; + GUID_EVENT_REC *GuidEvent; + BDS_ATTEMPT_REC *BdsAttemptRec; + EFI_GUID *GuidName; + + UINT8 PdbFileName[STRING_EVENT_RECORD_NAME_LENGTH] = {0}; + UINT8 NullFileName[STRING_EVENT_RECORD_NAME_LENGTH] = {0}; + DevicePath = NULL; + + // + // buffer overflow check + // + if (mPerformanceLength + sizeof(STRING_EVENT_REC) > FIRMWARE_MAX_BUFFER) { + return EFI_OUT_OF_RESOURCES; + } + + switch (RecordType) { + case HARDWARE_BOOT_TYPE: + // + // Hardware Boot Record Table + // + HardwareBootRec = (HARDWARE_BOOT_REC*) ((UINT8*)mPerformancePointer + mPerformanceLength); + + HardwareBootRec->RecType = RecordType; + HardwareBootRec->RecLength = sizeof(HARDWARE_BOOT_REC); + HardwareBootRec->Revision = RECORD_REVISION_1; + HardwareBootRec->HardwareBoot = GetTimeInNanoSec(Ticker); + + mPerformanceLength += sizeof(HARDWARE_BOOT_REC); + break; + + case GUID_EVENT_REC_TYPE: + case STRING_EVENT_REC_TYPE: + // + // Determine Pdb FileName associated with module logging performance + // + if (Handle != NULL){ + GetNameFromHandle (Handle, PdbFileName); + } + + GuidName = GetGuidFromHandle(Handle); + if (EfiCompareMem (PdbFileName,NullFileName, STRING_EVENT_RECORD_NAME_LENGTH)){ + // + // String Event Record + // + StringEvent = (STRING_EVENT_REC*) ((UINT8*)mPerformancePointer + mPerformanceLength); + StringEvent->RecType = STRING_EVENT_REC_TYPE; + StringEvent->RecLength = sizeof(STRING_EVENT_REC); + StringEvent->Revision = RECORD_REVISION_1; + StringEvent->ProgressID = Identifier; + StringEvent->ApicID = GetApicId(); + StringEvent->Timestamp = GetTimeInNanoSec(Ticker); + if (GuidName != NULL) { + gBS->CopyMem(&(StringEvent->Guid),GuidName,sizeof(EFI_GUID)); + } + + (gBS->CopyMem) (StringEvent->NameString, PdbFileName, STRING_EVENT_RECORD_NAME_LENGTH); + + mPerformanceLength += sizeof(STRING_EVENT_REC); + + } else { + // + // GUID Event Record + // + GuidEvent = (GUID_EVENT_REC*) ((UINT8*)mPerformancePointer + mPerformanceLength); + GuidEvent->RecType = GUID_EVENT_REC_TYPE; + GuidEvent->RecLength = sizeof(GUID_EVENT_REC); + GuidEvent->Revision = RECORD_REVISION_1; + GuidEvent->ProgressID = Identifier; + GuidEvent->ApicID = GetApicId(); + GuidEvent->Timestamp = GetTimeInNanoSec(Ticker); + if (GuidName != NULL) { + gBS->CopyMem(&(GuidEvent->Guid),GuidName,sizeof(EFI_GUID)); + } + + mPerformanceLength += sizeof(GUID_EVENT_REC); + } + break; + + case BDS_ATTEMPT_EVENT_REC_TYPE: + // + // BDS Boot Attempt Record + // + DevicePath = EfiDevicePathFromHandle (Handle); + + BdsAttemptRec = (BDS_ATTEMPT_REC*) ((UINT8*)mPerformancePointer + mPerformanceLength); + BdsAttemptRec->RecType = BDS_ATTEMPT_EVENT_REC_TYPE; + BdsAttemptRec->RecLength = sizeof(BDS_ATTEMPT_REC); + BdsAttemptRec->Revision = RECORD_REVISION_1; + BdsAttemptRec->ApicID = GetApicId(); + BdsAttemptRec->BdsAttemptNo = BdsAttemptNumber + 1; + BdsAttemptRec->Timestamp = GetTimeInNanoSec(Ticker); + ASPrint ((CHAR8*)(&BdsAttemptRec->UEFIBootVar), sizeof(BdsAttemptRec->UEFIBootVar)+1, "BOOT%04x", Identifier); + BdsAttemptRec->DevicePathString = '0'; + mPerformanceLength += sizeof(BDS_ATTEMPT_REC); + break; + + default: + // + // Record is undefined, return EFI_ABORTED + // + return EFI_ABORTED; + break; + } + + return EFI_SUCCESS; +} + +EFI_STATUS +GetPerfBufferAddr ( + IN FIRMWARE_PERFORMANCE_PROTOCOL *This, + OUT UINT32 *PerformanceBuffer + ) +{ + EFI_STATUS Status; + + *PerformanceBuffer = 0; + + Status = LocatePerformanceProtocol(); + if(EFI_ERROR(Status)) { + return EFI_NOT_FOUND; + } + + if (mPerformancePointer == NULL) { + return EFI_NOT_FOUND; + } + + *PerformanceBuffer = (UINT32)((UINTN)mPerformancePointer); + + return Status; +} + + +UINT32 +GetPerfBufferLength ( + IN FIRMWARE_PERFORMANCE_PROTOCOL *This + ) +{ + EFI_STATUS Status; + + Status = LocatePerformanceProtocol(); + if(EFI_ERROR(Status)) { + return 0; + } + + return mPerformanceLength; +} + +FIRMWARE_PERFORMANCE_PROTOCOL FirmwarePerformanceProtocol = { + InsertMeasurement, + GetPerfBufferAddr, + GetPerfBufferLength +}; + +// +// Driver entry point +// +EFI_STATUS +InitializePerformanceInfrastructure ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable, + IN UINT64 Ticker + ) +/*++ + +Routine Description: + + Install gFirmwarePerformanceProtocolGuid protocol and transfer PEI performance to gauge data nodes. + +Arguments: + + ImageHandle - Standard driver entry point parameter + SystemTable - Standard driver entry point parameter + Ticker - End tick for PEI performance + +Returns: + + EFI_OUT_OF_RESOURCES - No enough buffer to allocate + EFI_SUCCESS - Protocol installed. + +--*/ +{ + EFI_STATUS Status; + + Status = EFI_SUCCESS; + // + //A buffer of MAX size + // + mPerformancePointer = EfiLibAllocateZeroPool (FIRMWARE_MAX_BUFFER); + if (mPerformancePointer == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + mPerformanceLength = 0; + // + // Install the protocol interfaces + // + Status = gBS->InstallProtocolInterface ( + &ImageHandle, + &gFirmwarePerformanceProtocolGuid, + EFI_NATIVE_INTERFACE, + &FirmwarePerformanceProtocol + ); + if (!EFI_ERROR (Status)) { + // + // Get PEI performance hob and convert into FPDT structure + // + GetPeiFirmwarePerformanceHob (ImageHandle, SystemTable); + } + + return EFI_SUCCESS; +} + + +EFI_STATUS +StartMeasure ( + EFI_HANDLE Handle, + IN UINT16 *Token, + IN UINT16 *Host, + IN UINT64 Ticker + ) +/*++ + +Routine Description: + + Start measurement according to token field and insert into pre-allocated buffer + +Arguments: + + Handle - Handle to measure + Token - Token to measure + Host - Host to measure + Ticker - Ticker as start tick + +Returns: + + Status code. + +--*/ +{ + EFI_STATUS Status; + UINT16 RecordType; + UINT16 Identifier; + + Status = LocatePerformanceProtocol(); + if(EFI_ERROR(Status)) { + return Status; + } + + if (!EfiStrCmp (Token, START_IMAGE_TOK)) { + RecordType = STRING_EVENT_REC_TYPE; + Identifier = MODULE_START_ID; + } else if (!EfiStrCmp (Token, LOAD_IMAGE_TOK)) { + RecordType = STRING_EVENT_REC_TYPE; + Identifier = MODULE_LOADIMAGE_START_ID; + } else if (!EfiStrCmp (Token, DRIVERBINDING_START_TOK)) { + RecordType = STRING_EVENT_REC_TYPE; + Identifier = MODULE_DRIVERBINDING_START_ID; + } else if (!EfiStrCmp (Token, DXE_TOK)) { + RecordType = STRING_EVENT_REC_TYPE; + Identifier = DXE_START_ID; + } else if (!EfiStrCmp (Token, DXE_CORE_DISP_INIT_TOK)) { + RecordType = STRING_EVENT_REC_TYPE; + Identifier = DXE_CORE_DISP_START_ID; + } else if (!EfiStrCmp (Token, COREDISPATCHER_TOK)) { + RecordType = STRING_EVENT_REC_TYPE; + Identifier = COREDISPATCHER_START_ID; + } else { + RecordType = PERFORMANCE_RECORD_TYPE_MAX; + Identifier = 0; + } + + Status = FirmwarePerformance->InsertMeasurement (FirmwarePerformance, Handle, RecordType, Ticker, Identifier); + + return Status; +} + +EFI_STATUS +EndMeasure ( + EFI_HANDLE Handle, + IN UINT16 *Token, + IN UINT16 *Host, + IN UINT64 Ticker + ) +/*++ + +Routine Description: + + End measurement according to token field and insert into pre-allocated buffer + +Arguments: + + Handle - Handle to stop + Token - Token to stop + Host - Host to stop + Ticker - Ticker as end tick + +Returns: + + Status code. + +--*/ +{ + EFI_STATUS Status; + UINT16 RecordType; + UINT16 Identifier; + + Status = LocatePerformanceProtocol(); + if(EFI_ERROR(Status)) { + return Status; + } + + if (!EfiStrCmp (Token, START_IMAGE_TOK)) { + RecordType = STRING_EVENT_REC_TYPE; + Identifier = MODULE_END_ID; + } else if (!EfiStrCmp (Token, LOAD_IMAGE_TOK)) { + RecordType = STRING_EVENT_REC_TYPE; + Identifier = MODULE_LOADIMAGE_END_ID; + } else if (!EfiStrCmp (Token, DRIVERBINDING_START_TOK)) { + RecordType = STRING_EVENT_REC_TYPE; + Identifier = MODULE_DRIVERBINDING_END_ID; + } else if (!EfiStrCmp (Token, DXE_TOK)) { + RecordType = STRING_EVENT_REC_TYPE; + Identifier = DXE_END_ID; + } else if (!EfiStrCmp (Token, DXE_CORE_DISP_INIT_TOK)) { + RecordType = STRING_EVENT_REC_TYPE; + Identifier = DXE_CORE_DISP_END_ID; + } else if (!EfiStrCmp (Token, COREDISPATCHER_TOK)) { + RecordType = STRING_EVENT_REC_TYPE; + Identifier = COREDISPATCHER_END_ID; + } else { + RecordType = PERFORMANCE_RECORD_TYPE_MAX; + Identifier = 0; + } + + Status = FirmwarePerformance->InsertMeasurement (FirmwarePerformance, Handle, RecordType, Ticker, Identifier); + + return Status; +} + +EFI_STATUS +StartMeasureEx ( + IN EFI_HANDLE Handle, + IN UINT16 *Token, + IN UINT16 *Host, + IN UINT64 Ticker, + IN UINT16 Identifier + ) +/*++ + +Routine Description: + + Start extended measurement according to token field and insert into pre-allocated buffer + +Arguments: + + Handle - Handle to stop + Token - Token to stop + Host - Host to stop + Ticker - Ticker as end tick + Identifier - Identifier for a given record +Returns: + + Status code. + +--*/ +{ + EFI_STATUS Status; + UINT16 RecordType; + + Status = LocatePerformanceProtocol(); + if(EFI_ERROR(Status)) { + return Status; + } + + if (!EfiStrCmp (Token, EVENT_REC_TOK)) { + RecordType = STRING_EVENT_REC_TYPE; + } else if (!EfiStrCmp (Token, BDS_ATTEMPT_TOK)) { + RecordType = BDS_ATTEMPT_EVENT_REC_TYPE; + } else if (!EfiStrCmp (Token, HARDWARE_BOOT_TOK)) { + RecordType = HARDWARE_BOOT_TYPE; + } else { + RecordType = PERFORMANCE_RECORD_TYPE_MAX; + } + Status = FirmwarePerformance->InsertMeasurement (FirmwarePerformance, Handle, RecordType, Ticker, Identifier); + + return Status; +} + +EFI_STATUS +EndMeasureEx ( + IN EFI_HANDLE Handle, + IN UINT16 *Token, + IN UINT16 *Host, + IN UINT64 Ticker, + IN UINT16 Identifier + ) +/*++ + +Routine Description: + + End extended measurement according to token field and insert into pre-allocated buffer + +Arguments: + + Handle - Handle to stop + Token - Token to stop + Host - Host to stop + Ticker - Ticker as end tick + Identifier - Identifier for a given record +Returns: + + Status code. + +--*/ +{ + EFI_STATUS Status; + UINT16 RecordType; + + Status = LocatePerformanceProtocol(); + if(EFI_ERROR(Status)) { + return Status; + } + + if (!EfiStrCmp (Token, EVENT_REC_TOK)) { + RecordType = STRING_EVENT_REC_TYPE; + } else if (!EfiStrCmp (Token, BDS_ATTEMPT_TOK)) { + RecordType = BDS_ATTEMPT_EVENT_REC_TYPE; + } else if (!EfiStrCmp (Token, HARDWARE_BOOT_TOK)) { + RecordType = HARDWARE_BOOT_TYPE; + } else { + RecordType = PERFORMANCE_RECORD_TYPE_MAX; + } + + Status = FirmwarePerformance->InsertMeasurement (FirmwarePerformance, Handle, RecordType, Ticker, Identifier); + + return Status; +} + +EFI_STATUS +GetPeiFirmwarePerformanceHob ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +/*++ + +Routine Description: + + Transfer PEI performance data to pre-allocated memory into FPDT format. + +Arguments: + + ImageHandle - Standard entry point parameter + SystemTable - Standard entry point parameter + +Returns: + + EFI_OUT_OF_RESOURCES - No enough resource to create data node. + EFI_SUCCESS - Transfer done successfully. + +--*/ +{ + EFI_STATUS Status; + UINT32 Index; + VOID *HobList; + PEI_FIRMWARE_PERFORMANCE_HOB *PeiFirmwarePerformanceHob; + PEI_GUID_EVENT_REC *PeiGuidRec; + GUID_EVENT_REC *GuidEvent; + + // + // Locate installed Performance HOB + // + PeiFirmwarePerformanceHob = NULL; + + EfiLibGetSystemConfigurationTable (&gEfiHobListGuid, &HobList); + + do { + Status = GetNextGuidHob (&HobList, &gPeiFirmwarePerformanceGuid, (VOID **) &PeiFirmwarePerformanceHob, NULL); + if (EFI_ERROR (Status) || (PeiFirmwarePerformanceHob == NULL)) { + break; + } + + for (Index = 0; Index < PeiFirmwarePerformanceHob->NumberOfEntries; Index++) { + PeiGuidRec = &(PeiFirmwarePerformanceHob->GuidEventRecord[Index]); + // + // GUID Event Records from PEI phase + // + GuidEvent = (GUID_EVENT_REC*)((UINT8*)mPerformancePointer + mPerformanceLength); + GuidEvent->RecType = GUID_EVENT_REC_TYPE; + GuidEvent->RecLength = sizeof(GUID_EVENT_REC); + GuidEvent->Revision = RECORD_REVISION_1; + GuidEvent->ProgressID = PeiGuidRec->ProgressID; + GuidEvent->ApicID = PeiGuidRec->ApicID; + GuidEvent->Timestamp = PeiGuidRec->Timestamp; + GuidEvent->Guid = PeiGuidRec->Guid; + + mPerformanceLength += sizeof(GUID_EVENT_REC); + } + } while (!EFI_ERROR (Status)); + + return Status; +} \ No newline at end of file diff --git a/EDK/Foundation/Library/Dxe/EfiDriverLib/ReportStatusCode.c b/EDK/Foundation/Library/Dxe/EfiDriverLib/ReportStatusCode.c new file mode 100644 index 0000000..31da17b --- /dev/null +++ b/EDK/Foundation/Library/Dxe/EfiDriverLib/ReportStatusCode.c @@ -0,0 +1,130 @@ +/*++ + +Copyright (c) 2004 - 2006, 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: + + ReportStatusCode.c + +Abstract: + +--*/ + +#include "Tiano.h" +#include "EfiDriverLib.h" +#include EFI_PROTOCOL_DEFINITION (DevicePath) +#include EFI_GUID_DEFINITION (StatusCodeDataTypeId) +#include EFI_ARCH_PROTOCOL_DEFINITION (StatusCode) + +#if (EFI_SPECIFICATION_VERSION >= 0x00020000) +STATIC EFI_STATUS_CODE_PROTOCOL *gStatusCode = NULL; +#endif + +EFI_STATUS +EfiLibReportStatusCode ( + IN EFI_STATUS_CODE_TYPE Type, + IN EFI_STATUS_CODE_VALUE Value, + IN UINT32 Instance, + IN EFI_GUID *CallerId OPTIONAL, + IN EFI_STATUS_CODE_DATA *Data OPTIONAL + ) +/*++ + +Routine Description: + + Report device path through status code. + +Arguments: + + Type - Code type + Value - Code value + Instance - Instance number + CallerId - Caller name + DevicePath - Device path that to be reported + +Returns: + + Status code. + + EFI_OUT_OF_RESOURCES - No enough buffer could be allocated + +--*/ +{ + EFI_STATUS Status; + +#if (EFI_SPECIFICATION_VERSION >= 0x00020000) + if (gStatusCode == NULL) { + if (gBS == NULL) { + return EFI_UNSUPPORTED; + } + Status = gBS->LocateProtocol (&gEfiStatusCodeRuntimeProtocolGuid, NULL, (VOID **)&gStatusCode); + if (EFI_ERROR (Status) || gStatusCode == NULL) { + return EFI_UNSUPPORTED; + } + } + Status = gStatusCode->ReportStatusCode (Type, Value, Instance, CallerId, Data); + return Status; +#else + Status = gRT->ReportStatusCode (Type, Value, Instance, CallerId, Data); + return Status; +#endif +} + +EFI_STATUS +ReportStatusCodeWithDevicePath ( + IN EFI_STATUS_CODE_TYPE Type, + IN EFI_STATUS_CODE_VALUE Value, + IN UINT32 Instance, + IN EFI_GUID * CallerId OPTIONAL, + IN EFI_DEVICE_PATH_PROTOCOL * DevicePath + ) +/*++ + +Routine Description: + + Report device path through status code. + +Arguments: + + Type - Code type + Value - Code value + Instance - Instance number + CallerId - Caller name + DevicePath - Device path that to be reported + +Returns: + + Status code. + + EFI_OUT_OF_RESOURCES - No enough buffer could be allocated + +--*/ +{ + UINT16 Size; + UINT16 DevicePathSize; + EFI_STATUS_CODE_DATA *ExtendedData; + EFI_DEVICE_PATH_PROTOCOL *ExtendedDevicePath; + EFI_STATUS Status; + + DevicePathSize = (UINT16) EfiDevicePathSize (DevicePath); + Size = DevicePathSize + sizeof (EFI_STATUS_CODE_DATA); + ExtendedData = (EFI_STATUS_CODE_DATA *) EfiLibAllocatePool (Size); + if (ExtendedData == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + ExtendedDevicePath = EfiConstructStatusCodeData (Size, &gEfiStatusCodeSpecificDataGuid, ExtendedData); + EfiCopyMem (ExtendedDevicePath, DevicePath, DevicePathSize); + + Status = EfiLibReportStatusCode (Type, Value, Instance, CallerId, (EFI_STATUS_CODE_DATA *) ExtendedData); + + gBS->FreePool (ExtendedData); + return Status; +} diff --git a/EDK/Foundation/Library/Dxe/EfiDriverLib/x64/PerformancePrimitives.c b/EDK/Foundation/Library/Dxe/EfiDriverLib/x64/PerformancePrimitives.c new file mode 100644 index 0000000..b8b5f8b --- /dev/null +++ b/EDK/Foundation/Library/Dxe/EfiDriverLib/x64/PerformancePrimitives.c @@ -0,0 +1,47 @@ +/*++ + +Copyright (c) 2005, 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: + + PerformancePrimitives.c + +Abstract: + + Support for Performance library + +--*/ + +#include "TianoCommon.h" +#include "CpuIA32.h" + +EFI_STATUS +GetTimerValue ( + OUT UINT64 *TimerValue + ) +/*++ + +Routine Description: + + Set TimerValue with current tick. + +Arguments: + + TimerValue - Timer value to be set + +Returns: + + EFI_SUCCESS - TimerValue is set. + +--*/ +{ + *TimerValue = EfiReadTsc (); + return EFI_SUCCESS; +} diff --git a/EDK/Foundation/Library/Dxe/EfiIfrSupportLib/EfiIfrSupportLib.cif b/EDK/Foundation/Library/Dxe/EfiIfrSupportLib/EfiIfrSupportLib.cif new file mode 100644 index 0000000..8c467c9 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/EfiIfrSupportLib/EfiIfrSupportLib.cif @@ -0,0 +1,15 @@ + + name = "EfiIfrSupportLib" + category = ModulePart + LocalRoot = "EDK\Foundation\Library\Dxe\EfiIfrSupportLib\" + RefName = "EfiIfrSupportLib" +[files] +"EfiIfrSupportLib.sdl" +"EfiIfrSupportLib.mak" +"IfrCommon.c" +"IfrLibrary.h" +"IfrOnTheFly.c" +"IfrOpCodeCreation.c" +"IfrVariable.c" +"EfiIfrSupportLib.inf" + diff --git a/EDK/Foundation/Library/Dxe/EfiIfrSupportLib/EfiIfrSupportLib.inf b/EDK/Foundation/Library/Dxe/EfiIfrSupportLib/EfiIfrSupportLib.inf new file mode 100644 index 0000000..387978b --- /dev/null +++ b/EDK/Foundation/Library/Dxe/EfiIfrSupportLib/EfiIfrSupportLib.inf @@ -0,0 +1,52 @@ +#/*++ +# +# Copyright (c) 2004, 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: +# +# EfiIfrSupportLib.inf +# +# Abstract: +# +# Component description file. +# +#--*/ + +[defines] +BASE_NAME = EfiIfrSupportLib +COMPONENT_TYPE = LIBRARY + +[sources.common] + IfrCommon.c + IfrOnTheFly.c + IfrOpCodeCreation.c + IfrLibrary.h + IfrVariable.c + +[includes.common] + $(EDK_SOURCE)\Foundation\Efi + $(EDK_SOURCE)\Foundation\Framework + $(EDK_SOURCE)\Foundation + . + $(EDK_SOURCE)\Foundation\Include + $(EDK_SOURCE)\Foundation\Efi\Include + $(EDK_SOURCE)\Foundation\Framework\Include + $(EDK_SOURCE)\Foundation\Include\IndustryStandard + $(EDK_SOURCE)\Foundation\Core\Dxe + $(EDK_SOURCE)\Foundation\Library\Dxe\Include + $(EDK_SOURCE)\Foundation\Library\Dxe\EfiDriverLib + +[libraries.common] + EfiGuidLib + EdkFrameworkProtocolLib + + +[nmake.common] + C_STD_INCLUDE= diff --git a/EDK/Foundation/Library/Dxe/EfiIfrSupportLib/EfiIfrSupportLib.mak b/EDK/Foundation/Library/Dxe/EfiIfrSupportLib/EfiIfrSupportLib.mak new file mode 100644 index 0000000..2b36924 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/EfiIfrSupportLib/EfiIfrSupportLib.mak @@ -0,0 +1,69 @@ +#********************************************************************** +#********************************************************************** +#** ** +#** (C)Copyright 1985-2009, American Megatrends, Inc. ** +#** ** +#** All Rights Reserved. ** +#** ** +#** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +#** ** +#** Phone: (770)-246-8600 ** +#** ** +#********************************************************************** +#********************************************************************** + +#********************************************************************** +# $Header: /Alaska/SOURCE/Modules/SharkBayRefCodes/IntelEDK/EfiIfrSupportLib/EfiIfrSupportLib.mak 1 1/20/12 4:07a Jeffch $ +# +# $Revision: 1 $ +# +# $Date: 1/20/12 4:07a $ +#********************************************************************** +# Revision History +# ---------------- +# $Log: /Alaska/SOURCE/Modules/SharkBayRefCodes/IntelEDK/EfiIfrSupportLib/EfiIfrSupportLib.mak $ +# +# 1 1/20/12 4:07a Jeffch +# Create Intel EDK 1117 Patch 7. +# +# 1 9/27/11 6:30a Wesleychen +# Intel EDK initially releases. +# +# 2 9/02/09 3:45a Iminglin +# EIP24919 +# +#********************************************************************** +# +# +# Name: EfiIfrSupportLib.mak +# +# Description: +# +# +#********************************************************************** +$(EFIIFRSUPPORTLIB) : EfiIfrSupportLib + +$(BUILD_DIR)\EfiIfrSupportLib.lib : EfiIfrSupportLib + +EfiIfrSupportLib : $(BUILD_DIR)\EfiIfrSupportLib.mak EfiIfrSupportLibBin + +$(BUILD_DIR)\EfiIfrSupportLib.mak : $(EfiIfrSupportLib_DIR)\$(@B).cif $(EfiIfrSupportLib_DIR)\$(@B).mak $(BUILD_RULES) + $(CIF2MAK) $(EfiIfrSupportLib_DIR)\$(@B).cif $(CIF2MAK_DEFAULTS) + +EfiIfrSupportLibBin : $(EFIGUIDLIB) $(EDKFRAMEWORKPROTOCOLLIB) + $(MAKE) /$(MAKEFLAGS) $(EDK_DEFAULTS)\ + /f $(BUILD_DIR)\EfiIfrSupportLib.mak all\ + TYPE=LIBRARY \ +#********************************************************************** +#********************************************************************** +#** ** +#** (C)Copyright 1985-2009, American Megatrends, Inc. ** +#** ** +#** All Rights Reserved. ** +#** ** +#** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +#** ** +#** Phone: (770)-246-8600 ** +#** ** +#********************************************************************** +#********************************************************************** \ No newline at end of file diff --git a/EDK/Foundation/Library/Dxe/EfiIfrSupportLib/EfiIfrSupportLib.sdl b/EDK/Foundation/Library/Dxe/EfiIfrSupportLib/EfiIfrSupportLib.sdl new file mode 100644 index 0000000..88c2b12 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/EfiIfrSupportLib/EfiIfrSupportLib.sdl @@ -0,0 +1,26 @@ +TOKEN + Name = "EfiIfrSupportLib_SUPPORT" + Value = "1" + Help = "Main switch to enable EfiIfrSupportLib support in Project" + TokenType = Boolean + TargetEQU = Yes + TargetMAK = Yes + Master = Yes +End + +TOKEN + Name = "EFIIFRSUPPORTLIB" + Value = "$(BUILD_DIR)\EfiIfrSupportLib.lib" + TokenType = Expression + TargetMAK = Yes +End + +PATH + Name = "EfiIfrSupportLib_DIR" +End + +MODULE + Help = "Includes EfiIfrSupportLib.mak to Project" + File = "EfiIfrSupportLib.mak" +End + diff --git a/EDK/Foundation/Library/Dxe/EfiIfrSupportLib/IfrCommon.c b/EDK/Foundation/Library/Dxe/EfiIfrSupportLib/IfrCommon.c new file mode 100644 index 0000000..13654b1 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/EfiIfrSupportLib/IfrCommon.c @@ -0,0 +1,1031 @@ +/*++ +Copyright (c) 2004 - 2006, 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: + IfrCommon.c + +Abstract: + + Common Library Routines to assist in IFR creation on-the-fly + +--*/ + +#include "IfrLibrary.h" + +EFI_STATUS +GetCurrentLanguage ( + OUT CHAR16 *Lang + ) +/*++ + +Routine Description: + + Determine what is the current language setting + +Arguments: + + Lang - Pointer of system language + +Returns: + + Status code + +--*/ +{ + EFI_STATUS Status; + UINTN Size; + UINTN Index; + CHAR8 Language[4]; + + // + // Getting the system language and placing it into our Global Data + // + Size = sizeof (Language); + + Status = gRT->GetVariable ( + L"Lang", + &gEfiGlobalVariableGuid, + NULL, + &Size, + Language + ); + + if (EFI_ERROR (Status)) { + EfiAsciiStrCpy (Language, "eng"); + } + + for (Index = 0; Index < 3; Index++) { + // + // Bitwise AND ascii value with 0xDF yields an uppercase value. + // Sign extend into a unicode value + // + Lang[Index] = (CHAR16) (Language[Index] & 0xDF); + } + + // + // Null-terminate the value + // + Lang[3] = (CHAR16) 0; + + return Status; +} + + +EFI_STATUS +AddString ( + IN VOID *StringBuffer, + IN CHAR16 *Language, + IN CHAR16 *String, + IN OUT STRING_REF *StringToken + ) +/*++ + +Routine Description: + + Add a string to the incoming buffer and return the token and offset data + +Arguments: + + StringBuffer - The incoming buffer + + Language - Currrent language + + String - The string to be added + + StringToken - The index where the string placed + +Returns: + + EFI_OUT_OF_RESOURCES - No enough buffer to allocate + + EFI_SUCCESS - String successfully added to the incoming buffer + +--*/ +{ + EFI_HII_STRING_PACK *StringPack; + EFI_HII_STRING_PACK *StringPackBuffer; + VOID *NewBuffer; + RELOFST *PackSource; + RELOFST *PackDestination; + UINT8 *Source; + UINT8 *Destination; + UINTN Index; + BOOLEAN Finished; + + StringPack = (EFI_HII_STRING_PACK *) StringBuffer; + Finished = FALSE; + + // + // Pre-allocate a buffer sufficient for us to work on. + // We will use it as a destination scratch pad to build data on + // and when complete shift the data back to the original buffer + // + NewBuffer = EfiLibAllocateZeroPool (DEFAULT_STRING_BUFFER_SIZE); + if (NewBuffer == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + StringPackBuffer = (EFI_HII_STRING_PACK *) NewBuffer; + + // + // StringPack is terminated with a length 0 entry + // + for (; StringPack->Header.Length != 0;) { + // + // If this stringpack's language is same as CurrentLanguage, use it + // + if (EfiCompareMem ((VOID *) ((CHAR8 *) (StringPack) + StringPack->LanguageNameString), Language, 3) == 0) { + // + // We have some data in this string pack, copy the string package up to the string data + // + EfiCopyMem (&StringPackBuffer->Header, &StringPack->Header, sizeof (StringPack)); + + // + // These are references in the structure to tokens, need to increase them by the space occupied by an additional StringPointer + // + StringPackBuffer->LanguageNameString = (UINT16) (StringPackBuffer->LanguageNameString + (UINT16) sizeof (RELOFST)); + StringPackBuffer->PrintableLanguageName = (UINT16) (StringPackBuffer->PrintableLanguageName + (UINT16) sizeof (RELOFST)); + + PackSource = (RELOFST *) (StringPack + 1); + PackDestination = (RELOFST *) (StringPackBuffer + 1); + for (Index = 0; PackSource[Index] != 0x0000; Index++) { + // + // Copy the stringpointers from old to new buffer + // remember that we are adding a string, so the string offsets will all go up by sizeof (RELOFST) + // + PackDestination[Index] = (UINT16) (PackDestination[Index] + sizeof (RELOFST)); + } + + // + // Add a new stringpointer in the new buffer since we are adding a string. Null terminate it + // + PackDestination[Index] = (UINT16)(PackDestination[Index-1] + + EfiStrSize((CHAR16 *)((CHAR8 *)(StringPack) + PackSource[Index-1]))); + PackDestination[Index + 1] = (UINT16) 0; + + // + // Index is the token value for the new string + // + *StringToken = (UINT16) Index; + + // + // Source now points to the beginning of the old buffer strings + // Destination now points to the beginning of the new buffer strings + // + Source = (UINT8 *) &PackSource[Index + 1]; + Destination = (UINT8 *) &PackDestination[Index + 2]; + + // + // This should copy all the strings from the old buffer to the new buffer + // + for (; Index != 0; Index--) { + // + // Copy Source string to destination buffer + // + EfiStrCpy ((CHAR16 *) Destination, (CHAR16 *) Source); + + // + // Adjust the source/destination to the next string location + // + Destination = Destination + EfiStrSize ((CHAR16 *) Source); + Source = Source + EfiStrSize ((CHAR16 *) Source); + } + + // + // This copies the new string to the destination buffer + // + EfiStrCpy ((CHAR16 *) Destination, (CHAR16 *) String); + + // + // Adjust the size of the changed string pack by adding the size of the new string + // along with the size of the additional offset entry for the new string + // + StringPackBuffer->Header.Length = (UINT32) ((UINTN) StringPackBuffer->Header.Length + EfiStrSize (String) + sizeof (RELOFST)); + + // + // Advance the buffers to point to the next spots. + // + StringPackBuffer = (EFI_HII_STRING_PACK *) ((CHAR8 *) (StringPackBuffer) + StringPackBuffer->Header.Length); + StringPack = (EFI_HII_STRING_PACK *) ((CHAR8 *) (StringPack) + StringPack->Header.Length); + Finished = TRUE; + continue; + } + // + // This isn't the language of the stringpack we were asked to add a string to + // so we need to copy it to the new buffer. + // + EfiCopyMem (&StringPackBuffer->Header, &StringPack->Header, StringPack->Header.Length); + + // + // Advance the buffers to point to the next spots. + // + StringPackBuffer = (EFI_HII_STRING_PACK *) ((CHAR8 *) (StringPackBuffer) + StringPack->Header.Length); + StringPack = (EFI_HII_STRING_PACK *) ((CHAR8 *) (StringPack) + StringPack->Header.Length); + } + + // + // If we didn't copy the new data to a stringpack yet + // + if (!Finished) { + PackDestination = (RELOFST *) (StringPackBuffer + 1); + // + // Pointing to a new string pack location + // + StringPackBuffer->Header.Length = (UINT32) + ( + sizeof (EFI_HII_STRING_PACK) - + sizeof (EFI_STRING) + + sizeof (RELOFST) + + sizeof (RELOFST) + + EfiStrSize (Language) + + EfiStrSize (String) + ); + StringPackBuffer->Header.Type = EFI_HII_STRING; + StringPackBuffer->LanguageNameString = (UINT16) ((UINTN) &PackDestination[3] - (UINTN) StringPackBuffer); + StringPackBuffer->PrintableLanguageName = (UINT16) ((UINTN) &PackDestination[3] - (UINTN) StringPackBuffer); + StringPackBuffer->Attributes = 0; + PackDestination[0] = (UINT16) ((UINTN) &PackDestination[3] - (UINTN) StringPackBuffer); + PackDestination[1] = (UINT16) (PackDestination[0] + EfiStrSize (Language)); + PackDestination[2] = (UINT16) 0; + + // + // The first string location will be set to destination. The minimum number of strings + // associated with a stringpack will always be token 0 stored as the languagename (e.g. ENG, SPA, etc) + // and token 1 as the new string being added and and null entry for the stringpointers + // + Destination = (CHAR8 *) &PackDestination[3]; + + // + // Copy the language name string to the new buffer + // + EfiStrCpy ((CHAR16 *) Destination, Language); + + // + // Advance the destination to the new empty spot + // + Destination = Destination + EfiStrSize (Language); + + // + // Copy the string to the new buffer + // + EfiStrCpy ((CHAR16 *) Destination, String); + + // + // Since we are starting with a new string pack - we know the new string is token 1 + // + *StringToken = (UINT16) 1; + } + + // + // Zero out the original buffer and copy the updated data in the new buffer to the old buffer + // + EfiZeroMem (StringBuffer, DEFAULT_STRING_BUFFER_SIZE); + EfiCopyMem (StringBuffer, NewBuffer, DEFAULT_STRING_BUFFER_SIZE); + + // + // Free the newly created buffer since we don't need it anymore + // + gBS->FreePool (NewBuffer); + return EFI_SUCCESS; +} + + +EFI_STATUS +AddOpCode ( + IN VOID *FormBuffer, + IN OUT VOID *OpCodeData + ) +/*++ + +Routine Description: + + Add op-code data to the FormBuffer + +Arguments: + + FormBuffer - Form buffer to be inserted to + + OpCodeData - Op-code data to be inserted + +Returns: + + EFI_OUT_OF_RESOURCES - No enough buffer to allocate + + EFI_SUCCESS - Op-code data successfully inserted + +--*/ +{ + EFI_HII_PACK_HEADER *NewBuffer; + UINT8 *Source; + UINT8 *Destination; + + // + // Pre-allocate a buffer sufficient for us to work on. + // We will use it as a destination scratch pad to build data on + // and when complete shift the data back to the original buffer + // + NewBuffer = EfiLibAllocateZeroPool (DEFAULT_FORM_BUFFER_SIZE); + if (NewBuffer == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + Source = (UINT8 *) FormBuffer; + Destination = (UINT8 *) NewBuffer; + + // + // Copy the IFR Package header to the new buffer + // + EfiCopyMem (Destination, Source, sizeof (EFI_HII_PACK_HEADER)); + + // + // Advance Source and Destination to next op-code + // + Source = Source + sizeof (EFI_HII_PACK_HEADER); + Destination = Destination + sizeof (EFI_HII_PACK_HEADER); + + // + // Copy data to the new buffer until we run into the end_form + // + for (; ((EFI_IFR_OP_HEADER *) Source)->OpCode != EFI_IFR_END_FORM_OP;) { + // + // If the this opcode is an end_form_set we better be creating and endform + // Nonetheless, we will add data before the end_form_set. This also provides + // for interesting behavior in the code we will run, but has no bad side-effects + // since we will possibly do a 0 byte copy in this particular end-case. + // + if (((EFI_IFR_OP_HEADER *) Source)->OpCode == EFI_IFR_END_FORM_SET_OP) { + break; + } + + // + // Copy data to new buffer + // + EfiCopyMem (Destination, Source, ((EFI_IFR_OP_HEADER *) Source)->Length); + + // + // Adjust Source/Destination to next op-code location + // + Destination = Destination + (UINTN) ((EFI_IFR_OP_HEADER *) Source)->Length; + Source = Source + (UINTN) ((EFI_IFR_OP_HEADER *) Source)->Length; + } + + // + // Prior to the end_form is where we insert the new op-code data + // + EfiCopyMem (Destination, OpCodeData, ((EFI_IFR_OP_HEADER *) OpCodeData)->Length); + Destination = Destination + (UINTN) ((EFI_IFR_OP_HEADER *) OpCodeData)->Length; + + NewBuffer->Length = (UINT32) (NewBuffer->Length + (UINT32) (((EFI_IFR_OP_HEADER *) OpCodeData)->Length)); + + // + // Copy end-form data to new buffer + // + EfiCopyMem (Destination, Source, ((EFI_IFR_OP_HEADER *) Source)->Length); + + // + // Adjust Source/Destination to next op-code location + // + Destination = Destination + (UINTN) ((EFI_IFR_OP_HEADER *) Source)->Length; + Source = Source + (UINTN) ((EFI_IFR_OP_HEADER *) Source)->Length; + + // + // Copy end-formset data to new buffer + // + EfiCopyMem (Destination, Source, ((EFI_IFR_OP_HEADER *) Source)->Length); + + // + // Zero out the original buffer and copy the updated data in the new buffer to the old buffer + // + EfiZeroMem (FormBuffer, DEFAULT_FORM_BUFFER_SIZE); + EfiCopyMem (FormBuffer, NewBuffer, DEFAULT_FORM_BUFFER_SIZE); + + // + // Free the newly created buffer since we don't need it anymore + // + gBS->FreePool (NewBuffer); + return EFI_SUCCESS; +} + + +EFI_STATUS +GetHiiInterface ( + OUT EFI_HII_PROTOCOL **Hii + ) +/*++ + +Routine Description: + + Get the HII protocol interface + +Arguments: + + Hii - HII protocol interface + +Returns: + + Status code + +--*/ +{ + EFI_STATUS Status; + + // + // There should only be one HII protocol + // + Status = gBS->LocateProtocol ( + &gEfiHiiProtocolGuid, + NULL, + (VOID **) Hii + ); + + return Status;; +} + + +EFI_STATUS +ExtractDataFromHiiHandle ( + IN EFI_HII_HANDLE HiiHandle, + IN OUT UINT16 *ImageLength, + OUT UINT8 *DefaultImage, + OUT EFI_GUID *Guid + ) +/*++ + +Routine Description: + + Extract information pertaining to the HiiHandle + +Arguments: + + HiiHandle - Hii handle + + ImageLength - For input, length of DefaultImage; + For output, length of actually required + + DefaultImage - Image buffer prepared by caller + + Guid - Guid information about the form + +Returns: + + EFI_OUT_OF_RESOURCES - No enough buffer to allocate + + EFI_BUFFER_TOO_SMALL - DefualtImage has no enough ImageLength + + EFI_SUCCESS - Successfully extract data from Hii database. + + +--*/ +{ + EFI_STATUS Status; + EFI_HII_PROTOCOL *Hii; + UINTN DataLength; + UINT8 *RawData; + UINT8 *OldData; + UINTN Index; + UINTN Temp; + UINTN SizeOfNvStore; + UINTN CachedStart; + + DataLength = DEFAULT_FORM_BUFFER_SIZE; + SizeOfNvStore = 0; + CachedStart = 0; + + Status = GetHiiInterface (&Hii); + + if (EFI_ERROR (Status)) { + return Status; + } + + // + // Allocate space for retrieval of IFR data + // + RawData = EfiLibAllocateZeroPool ((UINTN) DataLength); + if (RawData == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + // + // Get all the forms associated with this HiiHandle + // + Status = Hii->GetForms (Hii, HiiHandle, 0, &DataLength, RawData); + + if (EFI_ERROR (Status)) { + gBS->FreePool (RawData); + + // + // Allocate space for retrieval of IFR data + // + RawData = EfiLibAllocateZeroPool ((UINTN) DataLength); + if (RawData == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + // + // Get all the forms associated with this HiiHandle + // + Status = Hii->GetForms (Hii, HiiHandle, 0, &DataLength, RawData); + } + + OldData = RawData; + + // + // Point RawData to the beginning of the form data + // + RawData = (UINT8 *) ((UINTN) RawData + sizeof (EFI_HII_PACK_HEADER)); + + for (Index = 0; RawData[Index] != EFI_IFR_END_FORM_SET_OP;) { + switch (RawData[Index]) { + case EFI_IFR_FORM_SET_OP: + // + // Copy the GUID information from this handle + // + EfiCopyMem (Guid, &((EFI_IFR_FORM_SET *) &RawData[Index])->Guid, sizeof (EFI_GUID)); + break; + + case EFI_IFR_ONE_OF_OP: + case EFI_IFR_CHECKBOX_OP: + case EFI_IFR_NUMERIC_OP: + case EFI_IFR_DATE_OP: + case EFI_IFR_TIME_OP: + case EFI_IFR_PASSWORD_OP: + case EFI_IFR_STRING_OP: + // + // Remember, multiple op-codes may reference the same item, so let's keep a running + // marker of what the highest QuestionId that wasn't zero length. This will accurately + // maintain the Size of the NvStore + // + if (((EFI_IFR_ONE_OF *) &RawData[Index])->Width != 0) { + Temp = ((EFI_IFR_ONE_OF *) &RawData[Index])->QuestionId + ((EFI_IFR_ONE_OF *) &RawData[Index])->Width; + if (SizeOfNvStore < Temp) { + SizeOfNvStore = ((EFI_IFR_ONE_OF *) &RawData[Index])->QuestionId + ((EFI_IFR_ONE_OF *) &RawData[Index])->Width; + } + } + } + + Index = RawData[Index + 1] + Index; + } + + // + // Return an error if buffer is too small + // + if (SizeOfNvStore > *ImageLength) { + gBS->FreePool (OldData); + *ImageLength = (UINT16) SizeOfNvStore; + return EFI_BUFFER_TOO_SMALL; + } + + EfiZeroMem (DefaultImage, SizeOfNvStore); + + // + // Copy the default image information to the user's buffer + // + for (Index = 0; RawData[Index] != EFI_IFR_END_FORM_SET_OP;) { + switch (RawData[Index]) { + case EFI_IFR_ONE_OF_OP: + CachedStart = ((EFI_IFR_ONE_OF *) &RawData[Index])->QuestionId; + break; + + case EFI_IFR_ONE_OF_OPTION_OP: + if (((EFI_IFR_ONE_OF_OPTION *) &RawData[Index])->Flags & EFI_IFR_FLAG_DEFAULT) { + EfiCopyMem (&DefaultImage[CachedStart], &((EFI_IFR_ONE_OF_OPTION *) &RawData[Index])->Value, 2); + } + break; + + case EFI_IFR_CHECKBOX_OP: + DefaultImage[((EFI_IFR_ONE_OF *) &RawData[Index])->QuestionId] = ((EFI_IFR_CHECK_BOX *) &RawData[Index])->Flags; + break; + + case EFI_IFR_NUMERIC_OP: + EfiCopyMem ( + &DefaultImage[((EFI_IFR_ONE_OF *) &RawData[Index])->QuestionId], + &((EFI_IFR_NUMERIC *) &RawData[Index])->Default, + 2 + ); + break; + + } + + Index = RawData[Index + 1] + Index; + } + + *ImageLength = (UINT16) SizeOfNvStore; + + // + // Free our temporary repository of form data + // + gBS->FreePool (OldData); + + return EFI_SUCCESS; +} + + +EFI_HII_HANDLE +FindHiiHandle ( + IN OUT EFI_HII_PROTOCOL **HiiProtocol, OPTIONAL + IN EFI_GUID *Guid + ) +/*++ + +Routine Description: + Finds HII handle for given pack GUID previously registered with the HII. + +Arguments: + HiiProtocol - pointer to pointer to HII protocol interface. + If NULL, the interface will be found but not returned. + If it points to NULL, the interface will be found and + written back to the pointer that is pointed to. + Guid - The GUID of the pack that registered with the HII. + +Returns: + Handle to the HII pack previously registered by the memory driver. + +--*/ +{ + EFI_STATUS Status; + + EFI_HII_HANDLE *HiiHandleBuffer; + EFI_HII_HANDLE HiiHandle; + UINT16 HiiHandleBufferLength; + UINT32 NumberOfHiiHandles; + EFI_GUID HiiGuid; + EFI_HII_PROTOCOL *HiiProt; + UINT32 Index; + UINT16 Length; + + HiiHandle = 0; + if ((HiiProtocol != NULL) && (*HiiProtocol != NULL)) { + // + // The protocol has been passed in + // + HiiProt = *HiiProtocol; + } else { + gBS->LocateProtocol ( + &gEfiHiiProtocolGuid, + NULL, + (VOID **) &HiiProt + ); + if (HiiProt == NULL) { + return HiiHandle; + } + + if (HiiProtocol != NULL) { + // + // Return back the HII protocol for the caller as promissed + // + *HiiProtocol = HiiProt; + } + } + // + // Allocate buffer + // + HiiHandleBufferLength = 10; + HiiHandleBuffer = EfiLibAllocatePool (HiiHandleBufferLength); + ASSERT (HiiHandleBuffer != NULL); + + // + // Get the Handles of the packages that were registered with Hii + // + Status = HiiProt->FindHandles ( + HiiProt, + &HiiHandleBufferLength, + HiiHandleBuffer + ); + + // + // Get a bigger bugffer if this one is to small, and try again + // + if (Status == EFI_BUFFER_TOO_SMALL) { + + gBS->FreePool (HiiHandleBuffer); + + HiiHandleBuffer = EfiLibAllocatePool (HiiHandleBufferLength); + ASSERT (HiiHandleBuffer != NULL); + + Status = HiiProt->FindHandles ( + HiiProt, + &HiiHandleBufferLength, + HiiHandleBuffer + ); + } + + if (EFI_ERROR (Status)) { + goto lbl_exit; + } + + NumberOfHiiHandles = HiiHandleBufferLength / sizeof (EFI_HII_HANDLE); + + // + // Iterate Hii handles and look for the one that matches our Guid + // + for (Index = 0; Index < NumberOfHiiHandles; Index++) { + + Length = 0; + ExtractDataFromHiiHandle (HiiHandleBuffer[Index], &Length, NULL, &HiiGuid); + + if (EfiCompareGuid (&HiiGuid, Guid)) { + + HiiHandle = HiiHandleBuffer[Index]; + break; + } + } + +lbl_exit: + gBS->FreePool (HiiHandleBuffer); + return HiiHandle; +} + + +EFI_STATUS +ValidateDataFromHiiHandle ( + IN EFI_HII_HANDLE HiiHandle, + OUT BOOLEAN *Results + ) +/*++ + +Routine Description: + + Validate that the data associated with the HiiHandle in NVRAM is within + the reasonable parameters for that FormSet. Values for strings and passwords + are not verified due to their not having the equivalent of valid range settings. + +Arguments: + + HiiHandle - Handle of the HII database entry to query + + Results - If return Status is EFI_SUCCESS, Results provides valid data + TRUE = NVRAM Data is within parameters + FALSE = NVRAM Data is NOT within parameters + +Returns: + + EFI_OUT_OF_RESOURCES - No enough buffer to allocate + + EFI_SUCCESS - Data successfully validated +--*/ +{ + EFI_STATUS Status; + EFI_HII_PROTOCOL *Hii; + EFI_GUID Guid; + UINT8 *RawData; + UINT8 *OldData; + UINTN RawDataLength; + UINT8 *VariableData; + UINTN Index; + UINTN Temp; + UINTN SizeOfNvStore; + UINTN CachedStart; + BOOLEAN GotMatch; + + RawDataLength = DEFAULT_FORM_BUFFER_SIZE; + SizeOfNvStore = 0; + CachedStart = 0; + GotMatch = FALSE; + *Results = TRUE; + + Status = GetHiiInterface (&Hii); + + if (EFI_ERROR (Status)) { + return Status; + } + + // + // Allocate space for retrieval of IFR data + // + RawData = EfiLibAllocateZeroPool (RawDataLength); + if (RawData == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + // + // Get all the forms associated with this HiiHandle + // + Status = Hii->GetForms (Hii, HiiHandle, 0, &RawDataLength, RawData); + + if (EFI_ERROR (Status)) { + gBS->FreePool (RawData); + + // + // Allocate space for retrieval of IFR data + // + RawData = EfiLibAllocateZeroPool (RawDataLength); + if (RawData == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + // + // Get all the forms associated with this HiiHandle + // + Status = Hii->GetForms (Hii, HiiHandle, 0, &RawDataLength, RawData); + } + + OldData = RawData; + + // + // Point RawData to the beginning of the form data + // + RawData = (UINT8 *) ((UINTN) RawData + sizeof (EFI_HII_PACK_HEADER)); + + for (Index = 0; RawData[Index] != EFI_IFR_END_FORM_SET_OP;) { + if (RawData[Index] == EFI_IFR_FORM_SET_OP) { + EfiCopyMem (&Guid, &((EFI_IFR_FORM_SET *) &RawData[Index])->Guid, sizeof (EFI_GUID)); + break; + } + + Index = RawData[Index + 1] + Index; + } + + for (Index = 0; RawData[Index] != EFI_IFR_END_FORM_SET_OP;) { + switch (RawData[Index]) { + case EFI_IFR_FORM_SET_OP: + break; + + case EFI_IFR_ONE_OF_OP: + case EFI_IFR_CHECKBOX_OP: + case EFI_IFR_NUMERIC_OP: + case EFI_IFR_DATE_OP: + case EFI_IFR_TIME_OP: + case EFI_IFR_PASSWORD_OP: + case EFI_IFR_STRING_OP: + // + // Remember, multiple op-codes may reference the same item, so let's keep a running + // marker of what the highest QuestionId that wasn't zero length. This will accurately + // maintain the Size of the NvStore + // + if (((EFI_IFR_ONE_OF *) &RawData[Index])->Width != 0) { + Temp = ((EFI_IFR_ONE_OF *) &RawData[Index])->QuestionId + ((EFI_IFR_ONE_OF *) &RawData[Index])->Width; + if (SizeOfNvStore < Temp) { + SizeOfNvStore = ((EFI_IFR_ONE_OF *) &RawData[Index])->QuestionId + ((EFI_IFR_ONE_OF *) &RawData[Index])->Width; + } + } + } + + Index = RawData[Index + 1] + Index; + } + + // + // Allocate memory for our File Form Tags + // + VariableData = EfiLibAllocateZeroPool (SizeOfNvStore); + if (VariableData == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + Status = gRT->GetVariable ( + L"Setup", + &Guid, + NULL, + &SizeOfNvStore, + (VOID *) VariableData + ); + + if (EFI_ERROR (Status)) { + + // + // If there is a variable that exists already and it is larger than what we calculated the + // storage needs to be, we must assume the variable size from GetVariable is correct and not + // allow the truncation of the variable. It is very possible that the user who created the IFR + // we are cracking is not referring to a variable that was in a previous map, however we cannot + // allow it's truncation. + // + if (Status == EFI_BUFFER_TOO_SMALL) { + // + // Free the buffer that was allocated that was too small + // + gBS->FreePool (VariableData); + + VariableData = EfiLibAllocatePool (SizeOfNvStore); + if (VariableData == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + Status = gRT->GetVariable ( + L"Setup", + &Guid, + NULL, + &SizeOfNvStore, + (VOID *) VariableData + ); + } + } + + // + // Walk through the form and see that the variable data it refers to is ok. + // This allows for the possibility of stale (obsoleted) data in the variable + // can be overlooked without causing an error + // + for (Index = 0; RawData[Index] != EFI_IFR_END_FORM_SET_OP;) { + switch (RawData[Index]) { + case EFI_IFR_ONE_OF_OP: + // + // A one_of has no data, its the option that does - cache the storage Id + // + CachedStart = ((EFI_IFR_ONE_OF *) &RawData[Index])->QuestionId; + break; + + case EFI_IFR_ONE_OF_OPTION_OP: + // + // A one_of_option can be any value + // + if (VariableData[CachedStart] == ((EFI_IFR_ONE_OF_OPTION *) &RawData[Index])->Value) { + GotMatch = TRUE; + } + break; + + case EFI_IFR_END_ONE_OF_OP: + // + // At this point lets make sure that the data value in the NVRAM matches one of the options + // + if (!GotMatch) { + *Results = FALSE; + return EFI_SUCCESS; + } + break; + + case EFI_IFR_CHECKBOX_OP: + // + // A checkbox is a boolean, so 0 and 1 are valid + // Remember, QuestionId corresponds to the offset location of the data in the variable + // + if (VariableData[((EFI_IFR_CHECK_BOX *) &RawData[Index])->QuestionId] > 1) { + *Results = FALSE; + return EFI_SUCCESS; + } + break; + + case EFI_IFR_NUMERIC_OP: + if ((VariableData[((EFI_IFR_NUMERIC *)&RawData[Index])->QuestionId] < ((EFI_IFR_NUMERIC *)&RawData[Index])->Minimum) || + (VariableData[((EFI_IFR_NUMERIC *)&RawData[Index])->QuestionId] > ((EFI_IFR_NUMERIC *)&RawData[Index])->Maximum)) { + *Results = FALSE; + return EFI_SUCCESS; + } + break; + + } + + Index = RawData[Index + 1] + Index; + } + + // + // Free our temporary repository of form data + // + gBS->FreePool (OldData); + gBS->FreePool (VariableData); + + return EFI_SUCCESS; +} + +EFI_HII_PACKAGES * +PreparePackages ( + IN UINTN NumberOfPackages, + IN EFI_GUID *GuidId, + ... + ) +/*++ + +Routine Description: + + Assemble EFI_HII_PACKAGES according to the passed in packages. + +Arguments: + + NumberOfPackages - Number of packages. + GuidId - Package GUID. + +Returns: + + Pointer of EFI_HII_PACKAGES. + +--*/ +{ + VA_LIST args; + EFI_HII_PACKAGES *HiiPackages; + VOID **Package; + UINTN Index; + + ASSERT (NumberOfPackages > 0); + + HiiPackages = EfiLibAllocateZeroPool (sizeof (EFI_HII_PACKAGES) + NumberOfPackages * sizeof (VOID *)); + + HiiPackages->GuidId = GuidId; + HiiPackages->NumberOfPackages = NumberOfPackages; + Package = (VOID **) (((UINT8 *) HiiPackages) + sizeof (EFI_HII_PACKAGES)); + + VA_START (args, GuidId); + + for (Index = 0; Index < NumberOfPackages; Index++) { + *Package = VA_ARG (args, VOID *); + Package++; + } + + VA_END (args); + + return HiiPackages; +} diff --git a/EDK/Foundation/Library/Dxe/EfiIfrSupportLib/IfrLibrary.h b/EDK/Foundation/Library/Dxe/EfiIfrSupportLib/IfrLibrary.h new file mode 100644 index 0000000..ebf8a1c --- /dev/null +++ b/EDK/Foundation/Library/Dxe/EfiIfrSupportLib/IfrLibrary.h @@ -0,0 +1,1299 @@ +/*++ + +Copyright (c) 2004 - 2005, 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: + + IfrLibrary.h + +Abstract: + The file contain all library function for Ifr Operations. + +--*/ + +#ifndef _IFRLIBRARY_H +#define _IFRLIBRARY_H + +#include "Tiano.h" +#include "EfiDriverLib.h" + +#include EFI_PROTOCOL_DEFINITION (Hii) +#include EFI_GUID_DEFINITION (GlobalVariable) + +#define DEFAULT_FORM_BUFFER_SIZE 0xFFFF +#define DEFAULT_STRING_BUFFER_SIZE 0xFFFF + +#pragma pack(1) +typedef struct { + CHAR16 *OptionString; // Passed in string to generate a token for in a truly dynamic form creation + STRING_REF StringToken; // This is used when creating a single op-code without generating a StringToken (have one already) + UINT16 Value; + UINT8 Flags; + UINT16 Key; +} IFR_OPTION; +#pragma pack() + +EFI_STATUS +GetCurrentLanguage ( + OUT CHAR16 *Lang + ) +/*++ + +Routine Description: + + Determine what is the current language setting + +Arguments: + + Lang - Pointer of system language + +Returns: + + Status code + +--*/ +; + +EFI_STATUS +AddString ( + IN VOID *StringBuffer, + IN CHAR16 *Language, + IN CHAR16 *String, + IN OUT STRING_REF *StringToken + ) +/*++ + +Routine Description: + + Add a string to the incoming buffer and return the token and offset data + +Arguments: + + StringBuffer - The incoming buffer + + Language - Currrent language + + String - The string to be added + + StringToken - The index where the string placed + +Returns: + + EFI_OUT_OF_RESOURCES - No enough buffer to allocate + + EFI_SUCCESS - String successfully added to the incoming buffer + +--*/ +; + +EFI_STATUS +AddOpCode ( + IN VOID *FormBuffer, + IN OUT VOID *OpCodeData + ) +/*++ + +Routine Description: + + Add op-code data to the FormBuffer + +Arguments: + + FormBuffer - Form buffer to be inserted to + + OpCodeData - Op-code data to be inserted + +Returns: + + EFI_OUT_OF_RESOURCES - No enough buffer to allocate + + EFI_SUCCESS - Op-code data successfully inserted + +--*/ +; + +EFI_STATUS +CreateFormSet ( + IN CHAR16 *FormSetTitle, + IN EFI_GUID *Guid, + IN UINT8 Class, + IN UINT8 SubClass, + IN OUT VOID **FormBuffer, + IN OUT VOID **StringBuffer + ) +/*++ + +Routine Description: + + Create a formset + +Arguments: + + FormSetTitle - Title of formset + + Guid - Guid of formset + + Class - Class of formset + + SubClass - Sub class of formset + + FormBuffer - Pointer of the formset created + + StringBuffer - Pointer of FormSetTitile string created + +Returns: + + EFI_OUT_OF_RESOURCES - No enough buffer to allocate + + EFI_SUCCESS - Formset successfully created + +--*/ +; + +EFI_STATUS +CreateForm ( + IN CHAR16 *FormTitle, + IN UINT16 FormId, + IN OUT VOID *FormBuffer, + IN OUT VOID *StringBuffer + ) +/*++ + +Routine Description: + + Create a form + +Arguments: + + FormTitle - Title of the form + + FormId - Id of the form + + FormBuffer - Pointer of the form created + + StringBuffer - Pointer of FormTitil string created + +Returns: + + EFI_SUCCESS - Form successfully created + +--*/ +; + +EFI_STATUS +CreateSubTitle ( + IN CHAR16 *SubTitle, + IN OUT VOID *FormBuffer, + IN OUT VOID *StringBuffer + ) +/*++ + +Routine Description: + + Create a SubTitle + +Arguments: + + SubTitle - Sub title to be created + + FormBuffer - Where this subtitle to add to + + StringBuffer - String buffer created for subtitle + +Returns: + + EFI_SUCCESS - Subtitle successfully created + +--*/ +; + +EFI_STATUS +CreateText ( + IN CHAR16 *String, + IN CHAR16 *String2, + IN CHAR16 *String3, + IN UINT8 Flags, + IN UINT16 Key, + IN OUT VOID *FormBuffer, + IN OUT VOID *StringBuffer + ) +/*++ + +Routine Description: + + Create a line of text + +Arguments: + + String - First string of the text + + String2 - Second string of the text + + String3 - Help string of the text + + Flags - Flag of the text + + Key - Key of the text + + FormBuffer - The form where this text adds to + + StringBuffer - String buffer created for String, String2 and String3 + +Returns: + + EFI_SUCCESS - Text successfully created + +--*/ +; + +EFI_STATUS +CreateGoto ( + IN UINT16 FormId, + IN CHAR16 *Prompt, + IN OUT VOID *FormBuffer, + IN OUT VOID *StringBuffer + ) +/*++ + +Routine Description: + + Create a hyperlink + +Arguments: + + FormId - Form ID of the hyperlink + + Prompt - Prompt of the hyperlink + + FormBuffer - The form where this hyperlink adds to + + StringBuffer - String buffer created for Prompt + +Returns: + + EFI_SUCCESS - Hyperlink successfully created + +--*/ +; + +EFI_STATUS +CreateOneOf ( + IN UINT16 QuestionId, + IN UINT8 DataWidth, + IN CHAR16 *Prompt, + IN CHAR16 *Help, + IN IFR_OPTION *OptionsList, + IN UINTN OptionCount, + IN OUT VOID *FormBuffer, + IN OUT VOID *StringBuffer + ) +/*++ + +Routine Description: + + Create a one-of question with a set of options to choose from. The + OptionsList is a pointer to a null-terminated list of option descriptions. + +Arguments: + + QuestionId - Question ID of the one-of box + + DataWidth - DataWidth of the one-of box + + Prompt - Prompt of the one-of box + + Help - Help of the one-of box + + OptionsList - Each string in it is an option of the one-of box + + OptionCount - Option string count + + FormBuffer - The form where this one-of box adds to + + StringBuffer - String buffer created for Prompt, Help and Option strings + +Returns: + + EFI_DEVICE_ERROR - DataWidth > 2 + + EFI_SUCCESS - One-Of box successfully created. + +--*/ +; + +EFI_STATUS +CreateOrderedList ( + IN UINT16 QuestionId, + IN UINT8 MaxEntries, + IN CHAR16 *Prompt, + IN CHAR16 *Help, + IN IFR_OPTION *OptionsList, + IN UINTN OptionCount, + IN OUT VOID *FormBuffer, + IN OUT VOID *StringBuffer + ) +/*++ + +Routine Description: + + Create a one-of question with a set of options to choose from. The + OptionsList is a pointer to a null-terminated list of option descriptions. + +Arguments: + + QuestionId - Question ID of the ordered list + + MaxEntries - MaxEntries of the ordered list + + Prompt - Prompt of the ordered list + + Help - Help of the ordered list + + OptionsList - Each string in it is an option of the ordered list + + OptionCount - Option string count + + FormBuffer - The form where this ordered list adds to + + StringBuffer - String buffer created for Prompt, Help and Option strings + +Returns: + + EFI_SUCCESS - Ordered list successfully created. + +--*/ +; + +EFI_STATUS +CreateCheckBox ( + IN UINT16 QuestionId, + IN UINT8 DataWidth, + IN CHAR16 *Prompt, + IN CHAR16 *Help, + IN UINT8 Flags, + IN OUT VOID *FormBuffer, + IN OUT VOID *StringBuffer + ) +/*++ + +Routine Description: + + Create a checkbox + +Arguments: + + QuestionId - Question ID of the check box + + DataWidth - DataWidth of the check box + + Prompt - Prompt of the check box + + Help - Help of the check box + + Flags - Flags of the check box + + FormBuffer - The form where this check box adds to + + StringBuffer - String buffer created for Prompt and Help. + +Returns: + + EFI_DEVICE_ERROR - DataWidth > 1 + + EFI_SUCCESS - Check box successfully created + +--*/ +; + +EFI_STATUS +CreateNumeric ( + IN UINT16 QuestionId, + IN UINT8 DataWidth, + IN CHAR16 *Prompt, + IN CHAR16 *Help, + IN UINT16 Minimum, + IN UINT16 Maximum, + IN UINT16 Step, + IN UINT16 Default, + IN UINT8 Flags, + IN UINT16 Key, + IN OUT VOID *FormBuffer, + IN OUT VOID *StringBuffer + ) +/*++ + +Routine Description: + + Create a numeric + +Arguments: + + QuestionId - Question ID of the numeric + + DataWidth - DataWidth of the numeric + + Prompt - Prompt of the numeric + + Help - Help of the numeric + + Minimum - Minumun boundary of the numeric + + Maximum - Maximum boundary of the numeric + + Step - Step of the numeric + + Default - Default value + + Flags - Flags of the numeric + + Key - Key of the numeric + + FormBuffer - The form where this numeric adds to + + StringBuffer - String buffer created for Prompt and Help. + +Returns: + + EFI_DEVICE_ERROR - DataWidth > 2 + + EFI_SUCCESS - Numeric is successfully created + +--*/ +; + +EFI_STATUS +CreateString ( + IN UINT16 QuestionId, + IN UINT8 DataWidth, + IN CHAR16 *Prompt, + IN CHAR16 *Help, + IN UINT8 MinSize, + IN UINT8 MaxSize, + IN UINT8 Flags, + IN UINT16 Key, + IN OUT VOID *FormBuffer, + IN OUT VOID *StringBuffer + ) +/*++ + +Routine Description: + + Create a string + +Arguments: + + QuestionId - Question ID of the string + + DataWidth - DataWidth of the string + + Prompt - Prompt of the string + + Help - Help of the string + + MinSize - Min size boundary of the string + + MaxSize - Max size boundary of the string + + Flags - Flags of the string + + Key - Key of the string + + FormBuffer - The form where this string adds to + + StringBuffer - String buffer created for Prompt and Help. + +Returns: + + EFI_SUCCESS - String successfully created. + +--*/ +; + +EFI_STATUS +ExtractDataFromHiiHandle ( + IN EFI_HII_HANDLE HiiHandle, + IN OUT UINT16 *ImageLength, + OUT UINT8 *DefaultImage, + OUT EFI_GUID *Guid + ) +/*++ + +Routine Description: + + Extract information pertaining to the HiiHandle + +Arguments: + + HiiHandle - Hii handle + + ImageLength - For input, length of DefaultImage; + For output, length of actually required + + DefaultImage - Image buffer prepared by caller + + Guid - Guid information about the form + +Returns: + + EFI_OUT_OF_RESOURCES - No enough buffer to allocate + + EFI_BUFFER_TOO_SMALL - DefualtImage has no enough ImageLength + + EFI_SUCCESS - Successfully extract data from Hii database. + + +--*/ +; + +EFI_HII_HANDLE +FindHiiHandle ( + IN OUT EFI_HII_PROTOCOL **HiiProtocol, OPTIONAL + IN EFI_GUID *Guid + ) +/*++ + +Routine Description: + Finds HII handle for given pack GUID previously registered with the HII. + +Arguments: + HiiProtocol - pointer to pointer to HII protocol interface. + If NULL, the interface will be found but not returned. + If it points to NULL, the interface will be found and + written back to the pointer that is pointed to. + Guid - The GUID of the pack that registered with the HII. + +Returns: + Handle to the HII pack previously registered by the memory driver. + +--*/ +; + +EFI_STATUS +CreateSubTitleOpCode ( + IN STRING_REF StringToken, + IN OUT VOID *FormBuffer + ) +/*++ + +Routine Description: + + Create a SubTitle opcode independent of string creation + This is used primarily by users who need to create just one particular valid op-code and the string + data will be assumed to exist in the HiiDatabase already. (Useful when exporting op-codes at a label + location to pre-defined forms in HII) + +Arguments: + + StringToken - StringToken of the subtitle + + FormBuffer - Output of subtitle as a form + +Returns: + + EFI_SUCCESS - Subtitle created to be a form + +--*/ +; + +EFI_STATUS +CreateTextOpCode ( + IN STRING_REF StringToken, + IN STRING_REF StringTokenTwo, + IN STRING_REF StringTokenThree, + IN UINT8 Flags, + IN UINT16 Key, + IN OUT VOID *FormBuffer + ) +/*++ + +Routine Description: + + Create a Text opcode independent of string creation + This is used primarily by users who need to create just one particular valid op-code and the string + data will be assumed to exist in the HiiDatabase already. (Useful when exporting op-codes at a label + location to pre-defined forms in HII) + +Arguments: + + StringToken - First string token of the text + + StringTokenTwo - Second string token of the text + + StringTokenThree - Help string token of the text + + Flags - Flag of the text + + Key - Key of the text + + FormBuffer - Output of text as a form + +Returns: + + EFI_SUCCESS - Text created to be a form + +--*/ +; + +EFI_STATUS +CreateGotoOpCode ( + IN UINT16 FormId, + IN STRING_REF StringToken, + IN STRING_REF StringTokenTwo, + IN UINT8 Flags, + IN UINT16 Key, + IN OUT VOID *FormBuffer + ) +/*++ + +Routine Description: + + Create a hyperlink opcode independent of string creation + This is used primarily by users who need to create just one particular valid op-code and the string + data will be assumed to exist in the HiiDatabase already. (Useful when exporting op-codes at a label + location to pre-defined forms in HII) + +Arguments: + + FormId - Form ID of the hyperlink + + StringToken - Prompt string token of the hyperlink + + StringTokenTwo - Help string token of the hyperlink + + Flags - Flags of the hyperlink + + Key - Key of the hyperlink + + FormBuffer - Output of hyperlink as a form + +Returns: + + EFI_SUCCESS - Hyperlink created to be a form + +--*/ +; + +EFI_STATUS +CreateOneOfOpCode ( + IN UINT16 QuestionId, + IN UINT8 DataWidth, + IN STRING_REF PromptToken, + IN STRING_REF HelpToken, + IN IFR_OPTION *OptionsList, + IN UINTN OptionCount, + IN OUT VOID *FormBuffer + ) +/*++ + +Routine Description: + + Create a one-of opcode with a set of option op-codes to choose from independent of string creation. + This is used primarily by users who need to create just one particular valid op-code and the string + data will be assumed to exist in the HiiDatabase already. (Useful when exporting op-codes at a label + location to pre-defined forms in HII) + + OptionsList is a pointer to a null-terminated list of option descriptions. Ensure that OptionsList[x].StringToken + has been filled in since this routine will not generate StringToken values. + +Arguments: + + QuestionId - Question ID of the one-of box + + DataWidth - DataWidth of the one-of box + + PromptToken - Prompt string token of the one-of box + + HelpToken - Help string token of the one-of box + + OptionsList - Each string in it is an option of the one-of box + + OptionCount - Option string count + + FormBuffer - Output of One-Of box as a form + +Returns: + + EFI_SUCCESS - One-Of box created to be a form + + EFI_DEVICE_ERROR - DataWidth > 2 + +--*/ +; + +EFI_STATUS +CreateOrderedListOpCode ( + IN UINT16 QuestionId, + IN UINT8 MaxEntries, + IN STRING_REF PromptToken, + IN STRING_REF HelpToken, + IN IFR_OPTION *OptionsList, + IN UINTN OptionCount, + IN OUT VOID *FormBuffer + ) +/*++ + +Routine Description: + + Create a ordered list opcode with a set of option op-codes to choose from independent of string creation. + This is used primarily by users who need to create just one particular valid op-code and the string + data will be assumed to exist in the HiiDatabase already. (Useful when exporting op-codes at a label + location to pre-defined forms in HII) + + OptionsList is a pointer to a null-terminated list of option descriptions. Ensure that OptionsList[x].StringToken + has been filled in since this routine will not generate StringToken values. + +Arguments: + + QuestionId - Question ID of the ordered list + + MaxEntries - MaxEntries of the ordered list + + PromptToken - Prompt string token of the ordered list + + HelpToken - Help string token of the ordered list + + OptionsList - Each string in it is an option of the ordered list + + OptionCount - Option string count + + FormBuffer - Output of ordered list as a form + +Returns: + + EFI_SUCCESS - Ordered list created to be a form + +--*/ +; + +EFI_STATUS +CreateCheckBoxOpCode ( + IN UINT16 QuestionId, + IN UINT8 DataWidth, + IN STRING_REF PromptToken, + IN STRING_REF HelpToken, + IN UINT8 Flags, + IN UINT16 Key, + IN OUT VOID *FormBuffer + ) +/*++ + +Routine Description: + + Create a checkbox opcode independent of string creation + This is used primarily by users who need to create just one particular valid op-code and the string + data will be assumed to exist in the HiiDatabase already. (Useful when exporting op-codes at a label + location to pre-defined forms in HII) + +Arguments: + + QuestionId - Question ID of the check box + + DataWidth - DataWidth of the check box + + PromptToken - Prompt string token of the check box + + HelpToken - Help string token of the check box + + Flags - Flags of the check box + + Key - Key of the check box + + FormBuffer - Output of the check box as a form + +Returns: + + EFI_SUCCESS - Checkbox created to be a form + + EFI_DEVICE_ERROR - DataWidth > 1 + +--*/ +; + +EFI_STATUS +CreateNumericOpCode ( + IN UINT16 QuestionId, + IN UINT8 DataWidth, + IN STRING_REF PromptToken, + IN STRING_REF HelpToken, + IN UINT16 Minimum, + IN UINT16 Maximum, + IN UINT16 Step, + IN UINT16 Default, + IN UINT8 Flags, + IN UINT16 Key, + IN OUT VOID *FormBuffer + ) +/*++ + +Routine Description: + + Create a numeric opcode independent of string creation + This is used primarily by users who need to create just one particular valid op-code and the string + data will be assumed to exist in the HiiDatabase already. (Useful when exporting op-codes at a label + location to pre-defined forms in HII) + +Arguments: + + QuestionId - Question ID of the numeric + + DataWidth - DataWidth of the numeric + + PromptToken - Prompt string token of the numeric + + HelpToken - Help string token of the numeric + + Minimum - Minumun boundary of the numeric + + Maximum - Maximum boundary of the numeric + + Step - Step of the numeric + + Default - Default value of the numeric + + Flags - Flags of the numeric + + Key - Key of the numeric + + FormBuffer - Output of the numeric as a form + +Returns: + + EFI_SUCCESS - The numeric created to be a form. + + EFI_DEVICE_ERROR - DataWidth > 2 + +--*/ +; + +EFI_STATUS +CreateStringOpCode ( + IN UINT16 QuestionId, + IN UINT8 DataWidth, + IN STRING_REF PromptToken, + IN STRING_REF HelpToken, + IN UINT8 MinSize, + IN UINT8 MaxSize, + IN UINT8 Flags, + IN UINT16 Key, + IN OUT VOID *FormBuffer + ) +/*++ + +Routine Description: + + Create a numeric opcode independent of string creation + This is used primarily by users who need to create just one particular valid op-code and the string + data will be assumed to exist in the HiiDatabase already. (Useful when exporting op-codes at a label + location to pre-defined forms in HII) + +Arguments: + + QuestionId - Question ID of the string + + DataWidth - DataWidth of the string + + PromptToken - Prompt token of the string + + HelpToken - Help token of the string + + MinSize - Min size boundary of the string + + MaxSize - Max size boundary of the string + + Flags - Flags of the string + + Key - Key of the string + + FormBuffer - Output of the string as a form + +Returns: + + EFI_SUCCESS - String created to be a form. + +--*/ +; + +EFI_STATUS +ValidateDataFromHiiHandle ( + IN EFI_HII_HANDLE HiiHandle, + OUT BOOLEAN *Results + ) +/*++ + +Routine Description: + + Validate that the data associated with the HiiHandle in NVRAM is within + the reasonable parameters for that FormSet. Values for strings and passwords + are not verified due to their not having the equivalent of valid range settings. + +Arguments: + + HiiHandle - Handle of the HII database entry to query + + Results - If return Status is EFI_SUCCESS, Results provides valid data + TRUE = NVRAM Data is within parameters + FALSE = NVRAM Data is NOT within parameters + +Returns: + + EFI_OUT_OF_RESOURCES - No enough buffer to allocate + + EFI_SUCCESS - Data successfully validated +--*/ +; + +EFI_STATUS +CreateBannerOpCode ( + IN UINT16 Title, + IN UINT16 LineNumber, + IN UINT8 Alignment, + IN OUT VOID *FormBuffer + ) +/*++ + +Routine Description: + + Create a banner opcode. This is primarily used by the FrontPage implementation from BDS. + +Arguments: + + Title - Title of the banner + + LineNumber - LineNumber of the banner + + Alignment - Alignment of the banner + + FormBuffer - Output of banner as a form + +Returns: + + EFI_SUCCESS - Banner created to be a form. + +--*/ +; + +EFI_HII_PACKAGES * +PreparePackages ( + IN UINTN NumberOfPackages, + IN EFI_GUID *GuidId, + ... + ) +/*++ + +Routine Description: + + Assemble EFI_HII_PACKAGES according to the passed in packages. + +Arguments: + + NumberOfPackages - Number of packages. + GuidId - Package GUID. + +Returns: + + Pointer of EFI_HII_PACKAGES. + +--*/ +; + +VOID +EfiLibHiiVariablePackGetMap ( + IN EFI_HII_VARIABLE_PACK *Pack, + OUT CHAR16 **Name, OPTIONAL + OUT EFI_GUID **Guid, OPTIONAL + OUT UINT16 *Id, OPTIONAL + OUT VOID **Var, OPTIONAL + OUT UINTN *Size OPTIONAL + ) +/*++ + +Routine Description: + + Extracts a variable form a Pack. + +Arguments: + + Pack - List of variables + Name - Name of the variable/map + Guid - GUID of the variable/map + Var - Pointer to the variable/map + Size - Size of the variable/map in bytes + +Returns: + + VOID. + +--*/ +; + +UINTN +EfiLibHiiVariablePackListGetMapCnt ( + IN EFI_HII_VARIABLE_PACK_LIST *List + ) +/*++ + +Routine Description: + + Finds a count of the variables/maps in the List. + +Arguments: + + List - List of variables + +Returns: + + Number of Map in the variable pack list. + +--*/ +; + +typedef VOID (EFI_LIB_HII_VARIABLE_PACK_LIST_CALLBACK) ( + IN CHAR16 *Name, + IN EFI_GUID *Guid, + IN UINT16 Id, + IN VOID *Var, + IN UINTN Size + ) +/*++ + +Routine Description: + + type definition for the callback to be + used with EfiLibHiiVariablePackListForEachVar(). + +Arguments: + + Id - Variable/Map ID + Name - Name of the variable/map + Guid - GUID of the variable/map + Var - Pointer to the variable/map + Size - Size of the variable/map in bytes + +Returns: + + VOID + +--*/ +; + +VOID +EfiLibHiiVariablePackListForEachVar ( + IN EFI_HII_VARIABLE_PACK_LIST *List, + IN EFI_LIB_HII_VARIABLE_PACK_LIST_CALLBACK *Callback + ) +/*++ + +Routine Description: + + Will iterate all variable/maps as appearing + in List and for each, it will call the Callback. + +Arguments: + + List - List of variables + Callback - Routine to be called for each iterated variable. + +Returns: + + VOID + +--*/ +; + +EFI_STATUS +EfiLibHiiVariablePackListGetMapByIdx ( + IN UINTN Idx, + IN EFI_HII_VARIABLE_PACK_LIST *List, + OUT CHAR16 **Name, OPTIONAL + OUT EFI_GUID **Guid, OPTIONAL + OUT UINT16 *Id, OPTIONAL + OUT VOID **Var, + OUT UINTN *Size + ) +/*++ + +Routine Description: + + Finds a variable form List given + the order number as appears in the List. + +Arguments: + + Idx - The index of the variable/map to retrieve + List - List of variables + Name - Name of the variable/map + Guid - GUID of the variable/map + Var - Pointer to the variable/map + Size - Size of the variable/map in bytes + +Returns: + + EFI_SUCCESS - Variable is found, OUT parameters are valid + EFI_NOT_FOUND - Variable is not found, OUT parameters are not valid + +--*/ +; + +EFI_STATUS +EfiLibHiiVariablePackListGetMapById ( + IN UINT16 Id, + IN EFI_HII_VARIABLE_PACK_LIST *List, + OUT CHAR16 **Name, OPTIONAL + OUT EFI_GUID **Guid, OPTIONAL + OUT VOID **Var, + OUT UINTN *Size + ) +/*++ + +Routine Description: + + Finds a variable form List given the + order number as appears in the List. + +Arguments: + + Id - The ID of the variable/map to retrieve + List - List of variables + Name - Name of the variable/map + Guid - GUID of the variable/map + Var - Pointer to the variable/map + Size - Size of the variable/map in bytes + +Returns: + + EFI_SUCCESS - Variable is found, OUT parameters are valid + EFI_NOT_FOUND - Variable is not found, OUT parameters are not valid + +--*/ +; + +EFI_STATUS +EfiLibHiiVariablePackListGetMap ( + IN EFI_HII_VARIABLE_PACK_LIST *List, + IN CHAR16 *Name, + IN EFI_GUID *Guid, + OUT UINT16 *Id, + OUT VOID **Var, + OUT UINTN *Size + ) +/*++ + +Routine Description: + + Finds a variable form EFI_HII_VARIABLE_PACK_LIST given name and GUID. + +Arguments: + + List - List of variables + Name - Name of the variable/map to be found + Guid - GUID of the variable/map to be found + Var - Pointer to the variable/map found + Size - Size of the variable/map in bytes found + +Returns: + + EFI_SUCCESS - variable is found, OUT parameters are valid + EFI_NOT_FOUND - variable is not found, OUT parameters are not valid + +--*/ +; + +EFI_STATUS +EfiLibHiiVariableRetrieveFromNv ( + IN CHAR16 *Name, + IN EFI_GUID *Guid, + IN UINTN Size, + OUT VOID **Var + ) +/*++ + +Routine Description: + Finds out if a variable of specific Name/Guid/Size exists in NV. + If it does, it will retrieve it into the Var. + +Arguments: + Name, Guid, Size - Parameters of the variable to retrieve. Must match exactly. + Var - Variable will be retrieved into buffer pointed by this pointer. + If pointing to NULL, the buffer will be allocated. Caller is responsible for releasing the buffer. +Returns: + EFI_SUCCESS - The variable of exact Name/Guid/Size parameters was retrieved and written to Var. + EFI_NOT_FOUND - The variable of this Name/Guid was not found in the NV. + EFI_LOAD_ERROR - The variable in the NV was of different size, or NV API returned error. + +--*/ +; + +//// +//// Variable override support. +//// + +EFI_STATUS +EfiLibHiiVariableOverrideIfSuffix ( + IN CHAR16 *Suffix, + IN CHAR16 *Name, + IN EFI_GUID *Guid, + IN UINTN Size, + OUT VOID *Var + ) +/*++ + +Routine Description: + Overrrides the variable with NV data if found. + But it only does it if the Name ends with specified Suffix. + For example, if Suffix="MyOverride" and the Name="XyzSetupMyOverride", + the Suffix matches the end of Name, so the variable will be loaded from NV + provided the variable exists and the GUID and Size matches. + +Arguments: + Suffix - Suffix the Name should end with. + Name, Guid, Size - Parameters of the variable to retrieve. Must match exactly. + Var - Variable will be retrieved into this buffer. + Caller is responsible for providing storage of exactly Size size in bytes. +Returns: + EFI_SUCCESS - The variable was overriden with NV variable of same Name/Guid/Size. + EFI_INVALID_PARAMETER - The name of the variable does not end with . + EFI_NOT_FOUND - The variable of this Name/Guid was not found in the NV. + EFI_LOAD_ERROR - The variable in the NV was of different size, or NV API returned error. + +--*/ +; + +EFI_STATUS +EfiLibHiiVariableOverrideBySuffix ( + IN CHAR16 *Suffix, + IN CHAR16 *Name, + IN EFI_GUID *Guid, + IN UINTN Size, + OUT VOID *Var + ) +/*++ + +Routine Description: + Overrrides the variable with NV data if found. + But it only does it if the NV contains the same variable with Name is appended with Suffix. + For example, if Suffix="MyOverride" and the Name="XyzSetup", + the Suffix will be appended to the end of Name, and the variable with Name="XyzSetupMyOverride" + will be loaded from NV provided the variable exists and the GUID and Size matches. + +Arguments: + Suffix - Suffix the variable will be appended with. + Name, Guid, Size - Parameters of the variable to retrieve. Must match exactly. + Var - Variable will be retrieved into this buffer. + Caller is responsible for providing storage of exactly Size size in bytes. + +Returns: + EFI_SUCCESS - The variable was overriden with NV variable of same Name/Guid/Size. + EFI_NOT_FOUND - The variable of this Name/Guid was not found in the NV. + EFI_LOAD_ERROR - The variable in the NV was of different size, or NV API returned error. + +--*/ +; + +#endif diff --git a/EDK/Foundation/Library/Dxe/EfiIfrSupportLib/IfrOnTheFly.c b/EDK/Foundation/Library/Dxe/EfiIfrSupportLib/IfrOnTheFly.c new file mode 100644 index 0000000..7daadd4 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/EfiIfrSupportLib/IfrOnTheFly.c @@ -0,0 +1,974 @@ +/*++ +Copyright (c) 2004, 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: + IfrOnTheFly.c + +Abstract: + + Library Routines to create IFR on-the-fly + +Revision History: + +--*/ + +#include "IfrLibrary.h" + +EFI_STATUS +CreateFormSet ( + IN CHAR16 *FormSetTitle, + IN EFI_GUID *Guid, + IN UINT8 Class, + IN UINT8 SubClass, + IN OUT VOID **FormBuffer, + IN OUT VOID **StringBuffer + ) +/*++ + +Routine Description: + + Create a formset + +Arguments: + + FormSetTitle - Title of formset + + Guid - Guid of formset + + Class - Class of formset + + SubClass - Sub class of formset + + FormBuffer - Pointer of the formset created + + StringBuffer - Pointer of FormSetTitile string created + +Returns: + + EFI_OUT_OF_RESOURCES - No enough buffer to allocate + + EFI_SUCCESS - Formset successfully created + +--*/ +{ + EFI_STATUS Status; + EFI_HII_IFR_PACK IfrPack; + EFI_IFR_FORM_SET FormSet; + EFI_IFR_END_FORM_SET EndFormSet; + UINT8 *Destination; + CHAR16 CurrentLanguage[4]; + STRING_REF StringToken; + + // + // Pre-allocate a buffer sufficient for us to work from. + // + FormBuffer = EfiLibAllocateZeroPool (DEFAULT_FORM_BUFFER_SIZE); + if (FormBuffer == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + // + // Pre-allocate a buffer sufficient for us to work from. + // + StringBuffer = EfiLibAllocateZeroPool (DEFAULT_STRING_BUFFER_SIZE); + if (StringBuffer == NULL) { + gBS->FreePool (FormBuffer); + return EFI_OUT_OF_RESOURCES; + } + + // + // Obtain current language value + // + GetCurrentLanguage (CurrentLanguage); + + // + // Add the FormSetTitle to the string buffer and get the StringToken + // + Status = AddString (*StringBuffer, CurrentLanguage, FormSetTitle, &StringToken); + + if (EFI_ERROR (Status)) { + return Status; + } + + // + // Initialize the Ifr Package header data + // + IfrPack.Header.Length = sizeof (EFI_HII_PACK_HEADER) + sizeof (EFI_IFR_FORM_SET) + sizeof (EFI_IFR_END_FORM_SET); + IfrPack.Header.Type = EFI_HII_IFR; + + // + // Initialize FormSet with the appropriate information + // + FormSet.Header.OpCode = EFI_IFR_FORM_SET_OP; + FormSet.Header.Length = sizeof (EFI_IFR_FORM_SET); + FormSet.FormSetTitle = StringToken; + FormSet.Class = Class; + FormSet.SubClass = SubClass; + EfiCopyMem (&FormSet.Guid, Guid, sizeof (EFI_GUID)); + + // + // Initialize the end formset data + // + EndFormSet.Header.Length = sizeof (EFI_IFR_END_FORM_SET); + EndFormSet.Header.OpCode = EFI_IFR_END_FORM_SET_OP; + + Destination = (CHAR8 *) *FormBuffer; + + // + // Copy the formset/endformset data to the form buffer + // + EfiCopyMem (Destination, &IfrPack, sizeof (EFI_HII_PACK_HEADER)); + + Destination = Destination + sizeof (EFI_HII_PACK_HEADER); + + EfiCopyMem (Destination, &FormSet, sizeof (EFI_IFR_FORM_SET)); + + Destination = Destination + sizeof (EFI_IFR_FORM_SET); + + EfiCopyMem (Destination, &EndFormSet, sizeof (EFI_IFR_END_FORM_SET)); + return EFI_SUCCESS; +} + + +EFI_STATUS +CreateForm ( + IN CHAR16 *FormTitle, + IN UINT16 FormId, + IN OUT VOID *FormBuffer, + IN OUT VOID *StringBuffer + ) +/*++ + +Routine Description: + + Create a form + +Arguments: + + FormTitle - Title of the form + + FormId - Id of the form + + FormBuffer - Pointer of the form created + + StringBuffer - Pointer of FormTitil string created + +Returns: + + EFI_SUCCESS - Form successfully created + +--*/ +{ + EFI_STATUS Status; + EFI_IFR_FORM Form; + EFI_IFR_END_FORM EndForm; + CHAR16 CurrentLanguage[4]; + STRING_REF StringToken; + + // + // Obtain current language value + // + GetCurrentLanguage (CurrentLanguage); + + Status = AddString (StringBuffer, CurrentLanguage, FormTitle, &StringToken); + + if (EFI_ERROR (Status)) { + return Status; + } + + Form.Header.OpCode = EFI_IFR_FORM_OP; + Form.Header.Length = sizeof (EFI_IFR_FORM); + Form.FormId = FormId; + Form.FormTitle = StringToken; + + Status = AddOpCode (FormBuffer, &Form); + + if (EFI_ERROR (Status)) { + return Status; + } + + EndForm.Header.OpCode = EFI_IFR_END_FORM_OP; + EndForm.Header.Length = sizeof (EFI_IFR_END_FORM); + + Status = AddOpCode (FormBuffer, &EndForm); + + if (EFI_ERROR (Status)) { + return Status; + } + + return EFI_SUCCESS; +} + + +EFI_STATUS +CreateSubTitle ( + IN CHAR16 *SubTitle, + IN OUT VOID *FormBuffer, + IN OUT VOID *StringBuffer + ) +/*++ + +Routine Description: + + Create a SubTitle + +Arguments: + + SubTitle - Sub title to be created + + FormBuffer - Where this subtitle to add to + + StringBuffer - String buffer created for subtitle + +Returns: + + EFI_SUCCESS - Subtitle successfully created + +--*/ +{ + EFI_STATUS Status; + EFI_IFR_SUBTITLE Subtitle; + CHAR16 CurrentLanguage[4]; + STRING_REF StringToken; + + // + // Obtain current language value + // + GetCurrentLanguage (CurrentLanguage); + + Status = AddString (StringBuffer, CurrentLanguage, SubTitle, &StringToken); + + if (EFI_ERROR (Status)) { + return Status; + } + + Subtitle.Header.OpCode = EFI_IFR_SUBTITLE_OP; + Subtitle.Header.Length = sizeof (EFI_IFR_SUBTITLE); + Subtitle.SubTitle = StringToken; + + Status = AddOpCode (FormBuffer, &Subtitle); + + if (EFI_ERROR (Status)) { + return Status; + } + + return EFI_SUCCESS; +} + + +EFI_STATUS +CreateText ( + IN CHAR16 *String, + IN CHAR16 *String2, + IN CHAR16 *String3, + IN UINT8 Flags, + IN UINT16 Key, + IN OUT VOID *FormBuffer, + IN OUT VOID *StringBuffer + ) +/*++ + +Routine Description: + + Create a line of text + +Arguments: + + String - First string of the text + + String2 - Second string of the text + + String3 - Help string of the text + + Flags - Flag of the text + + Key - Key of the text + + FormBuffer - The form where this text adds to + + StringBuffer - String buffer created for String, String2 and String3 + +Returns: + + EFI_SUCCESS - Text successfully created + +--*/ +{ + EFI_STATUS Status; + EFI_IFR_TEXT Text; + CHAR16 CurrentLanguage[4]; + STRING_REF StringToken; + + // + // Obtain current language value + // + GetCurrentLanguage (CurrentLanguage); + + // + // Add first string, get first string's token + // + Status = AddString (StringBuffer, CurrentLanguage, String, &StringToken); + + if (EFI_ERROR (Status)) { + return Status; + } + + Text.Header.OpCode = EFI_IFR_TEXT_OP; + Text.Header.Length = sizeof (EFI_IFR_TEXT); + Text.Text = StringToken; + + // + // Add second string, get first string's token + // + Status = AddString (StringBuffer, CurrentLanguage, String2, &StringToken); + + if (EFI_ERROR (Status)) { + return Status; + } + + Text.TextTwo = StringToken; + + Text.Flags = (UINT8) (Flags | EFI_IFR_FLAG_CREATED); + Text.Key = Key; + + // + // Add second string, get first string's token + // + Status = AddString (StringBuffer, CurrentLanguage, String3, &StringToken); + + if (EFI_ERROR (Status)) { + return Status; + } + + Text.Help = StringToken; + + Status = AddOpCode (FormBuffer, &Text); + + if (EFI_ERROR (Status)) { + return Status; + } + + return EFI_SUCCESS; +} + + +EFI_STATUS +CreateGoto ( + IN UINT16 FormId, + IN CHAR16 *Prompt, + IN OUT VOID *FormBuffer, + IN OUT VOID *StringBuffer + ) +/*++ + +Routine Description: + + Create a hyperlink + +Arguments: + + FormId - Form ID of the hyperlink + + Prompt - Prompt of the hyperlink + + FormBuffer - The form where this hyperlink adds to + + StringBuffer - String buffer created for Prompt + +Returns: + + EFI_SUCCESS - Hyperlink successfully created + +--*/ +{ + EFI_STATUS Status; + EFI_IFR_REF Hyperlink; + CHAR16 CurrentLanguage[4]; + STRING_REF StringToken; + + // + // Obtain current language value + // + GetCurrentLanguage (CurrentLanguage); + + Status = AddString (StringBuffer, CurrentLanguage, Prompt, &StringToken); + + if (EFI_ERROR (Status)) { + return Status; + } + + Hyperlink.Header.OpCode = EFI_IFR_REF_OP; + Hyperlink.Header.Length = sizeof (EFI_IFR_REF); + Hyperlink.FormId = FormId; + Hyperlink.Prompt = StringToken; + + Status = AddOpCode (FormBuffer, &Hyperlink); + + if (EFI_ERROR (Status)) { + return Status; + } + + return EFI_SUCCESS; +} + + +EFI_STATUS +CreateOneOf ( + IN UINT16 QuestionId, + IN UINT8 DataWidth, + IN CHAR16 *Prompt, + IN CHAR16 *Help, + IN IFR_OPTION *OptionsList, + IN UINTN OptionCount, + IN OUT VOID *FormBuffer, + IN OUT VOID *StringBuffer + ) +/*++ + +Routine Description: + + Create a one-of question with a set of options to choose from. The + OptionsList is a pointer to a null-terminated list of option descriptions. + +Arguments: + + QuestionId - Question ID of the one-of box + + DataWidth - DataWidth of the one-of box + + Prompt - Prompt of the one-of box + + Help - Help of the one-of box + + OptionsList - Each string in it is an option of the one-of box + + OptionCount - Option string count + + FormBuffer - The form where this one-of box adds to + + StringBuffer - String buffer created for Prompt, Help and Option strings + +Returns: + + EFI_DEVICE_ERROR - DataWidth > 2 + + EFI_SUCCESS - One-Of box successfully created. + +--*/ +{ + EFI_STATUS Status; + UINTN Index; + EFI_IFR_ONE_OF OneOf; + EFI_IFR_ONE_OF_OPTION OneOfOption; + EFI_IFR_END_ONE_OF EndOneOf; + CHAR16 CurrentLanguage[4]; + STRING_REF StringToken; + + // + // We do not create op-code storage widths for one-of in excess of 16 bits for now + // + if (DataWidth > 2) { + return EFI_DEVICE_ERROR; + } + + // + // Obtain current language value + // + GetCurrentLanguage (CurrentLanguage); + + // + // Add first string, get first string's token + // + Status = AddString (StringBuffer, CurrentLanguage, Prompt, &StringToken); + + if (EFI_ERROR (Status)) { + return Status; + } + + OneOf.Header.OpCode = EFI_IFR_ONE_OF_OP; + OneOf.Header.Length = sizeof (EFI_IFR_ONE_OF); + OneOf.QuestionId = QuestionId; + OneOf.Width = DataWidth; + OneOf.Prompt = StringToken; + + // + // Add second string, get first string's token + // + Status = AddString (StringBuffer, CurrentLanguage, Help, &StringToken); + + if (EFI_ERROR (Status)) { + return Status; + } + + OneOf.Help = StringToken; + + Status = AddOpCode (FormBuffer, &OneOf); + + if (EFI_ERROR (Status)) { + return Status; + } + + for (Index = 0; Index < OptionCount; Index++) { + OneOfOption.Header.OpCode = EFI_IFR_ONE_OF_OPTION_OP; + OneOfOption.Header.Length = sizeof (EFI_IFR_ONE_OF_OPTION); + + // + // Add string and get token back + // + Status = AddString (StringBuffer, CurrentLanguage, OptionsList[Index].OptionString, &StringToken); + + OneOfOption.Option = StringToken; + OneOfOption.Value = OptionsList[Index].Value; + OneOfOption.Flags = (UINT8) (OptionsList[Index].Flags | EFI_IFR_FLAG_CREATED); + OneOfOption.Key = OptionsList[Index].Key; + + Status = AddOpCode (FormBuffer, &OneOfOption); + + if (EFI_ERROR (Status)) { + return Status; + } + } + + EndOneOf.Header.Length = sizeof (EFI_IFR_END_ONE_OF); + EndOneOf.Header.OpCode = EFI_IFR_END_ONE_OF_OP; + + Status = AddOpCode (FormBuffer, &EndOneOf); + + if (EFI_ERROR (Status)) { + return Status; + } + + return EFI_SUCCESS; +} + +EFI_STATUS +CreateOrderedList ( + IN UINT16 QuestionId, + IN UINT8 MaxEntries, + IN CHAR16 *Prompt, + IN CHAR16 *Help, + IN IFR_OPTION *OptionsList, + IN UINTN OptionCount, + IN OUT VOID *FormBuffer, + IN OUT VOID *StringBuffer + ) +/*++ + +Routine Description: + + Create a one-of question with a set of options to choose from. The + OptionsList is a pointer to a null-terminated list of option descriptions. + +Arguments: + + QuestionId - Question ID of the ordered list + + MaxEntries - MaxEntries of the ordered list + + Prompt - Prompt of the ordered list + + Help - Help of the ordered list + + OptionsList - Each string in it is an option of the ordered list + + OptionCount - Option string count + + FormBuffer - The form where this ordered list adds to + + StringBuffer - String buffer created for Prompt, Help and Option strings + +Returns: + + EFI_SUCCESS - Ordered list successfully created. + +--*/ +{ + EFI_STATUS Status; + UINTN Index; + EFI_IFR_ORDERED_LIST OrderedList; + EFI_IFR_ONE_OF_OPTION OrderedListOption; + EFI_IFR_END_ONE_OF EndOrderedList; + CHAR16 CurrentLanguage[4]; + STRING_REF StringToken; + + // + // Obtain current language value + // + GetCurrentLanguage (CurrentLanguage); + + // + // Add first string, get first string's token + // + Status = AddString (StringBuffer, CurrentLanguage, Prompt, &StringToken); + + if (EFI_ERROR (Status)) { + return Status; + } + + OrderedList.Header.OpCode = EFI_IFR_ORDERED_LIST_OP; + OrderedList.Header.Length = sizeof (EFI_IFR_ORDERED_LIST); + OrderedList.QuestionId = QuestionId; + OrderedList.MaxEntries = MaxEntries; + OrderedList.Prompt = StringToken; + + // + // Add second string, get first string's token + // + Status = AddString (StringBuffer, CurrentLanguage, Help, &StringToken); + + if (EFI_ERROR (Status)) { + return Status; + } + + OrderedList.Help = StringToken; + + Status = AddOpCode (FormBuffer, &OrderedList); + + if (EFI_ERROR (Status)) { + return Status; + } + + for (Index = 0; Index < OptionCount; Index++) { + OrderedListOption.Header.OpCode = EFI_IFR_ONE_OF_OPTION_OP; + OrderedListOption.Header.Length = sizeof (EFI_IFR_ONE_OF_OPTION); + + // + // Add string and get token back + // + Status = AddString (StringBuffer, CurrentLanguage, OptionsList[Index].OptionString, &StringToken); + + OrderedListOption.Option = StringToken; + OrderedListOption.Value = OptionsList[Index].Value; + OrderedListOption.Flags = (UINT8) (OptionsList[Index].Flags | EFI_IFR_FLAG_CREATED); + OrderedListOption.Key = OptionsList[Index].Key; + + Status = AddOpCode (FormBuffer, &OrderedListOption); + + if (EFI_ERROR (Status)) { + return Status; + } + } + + EndOrderedList.Header.Length = sizeof (EFI_IFR_END_ONE_OF); + EndOrderedList.Header.OpCode = EFI_IFR_END_ONE_OF_OP; + + Status = AddOpCode (FormBuffer, &EndOrderedList); + + if (EFI_ERROR (Status)) { + return Status; + } + + return EFI_SUCCESS; +} + + +EFI_STATUS +CreateCheckBox ( + IN UINT16 QuestionId, + IN UINT8 DataWidth, + IN CHAR16 *Prompt, + IN CHAR16 *Help, + IN UINT8 Flags, + IN OUT VOID *FormBuffer, + IN OUT VOID *StringBuffer + ) +/*++ + +Routine Description: + + Create a checkbox + +Arguments: + + QuestionId - Question ID of the check box + + DataWidth - DataWidth of the check box + + Prompt - Prompt of the check box + + Help - Help of the check box + + Flags - Flags of the check box + + FormBuffer - The form where this check box adds to + + StringBuffer - String buffer created for Prompt and Help. + +Returns: + + EFI_DEVICE_ERROR - DataWidth > 1 + + EFI_SUCCESS - Check box successfully created + +--*/ +{ + EFI_STATUS Status; + EFI_IFR_CHECK_BOX CheckBox; + CHAR16 CurrentLanguage[4]; + STRING_REF StringToken; + + // + // We do not create op-code storage widths for checkbox in excess of 8 bits for now + // + if (DataWidth > 1) { + return EFI_DEVICE_ERROR; + } + + // + // Obtain current language value + // + GetCurrentLanguage (CurrentLanguage); + + // + // Add first string, get first string's token + // + Status = AddString (StringBuffer, CurrentLanguage, Prompt, &StringToken); + + if (EFI_ERROR (Status)) { + return Status; + } + + CheckBox.Header.OpCode = EFI_IFR_CHECKBOX_OP; + CheckBox.Header.Length = sizeof (EFI_IFR_CHECK_BOX); + CheckBox.QuestionId = QuestionId; + CheckBox.Width = DataWidth; + CheckBox.Prompt = StringToken; + + // + // Add second string, get first string's token + // + Status = AddString (StringBuffer, CurrentLanguage, Help, &StringToken); + + if (EFI_ERROR (Status)) { + return Status; + } + + CheckBox.Help = StringToken; + CheckBox.Flags = (UINT8) (Flags | EFI_IFR_FLAG_CREATED); + + Status = AddOpCode (FormBuffer, &CheckBox); + + if (EFI_ERROR (Status)) { + return Status; + } + + return EFI_SUCCESS; +} + + +EFI_STATUS +CreateNumeric ( + IN UINT16 QuestionId, + IN UINT8 DataWidth, + IN CHAR16 *Prompt, + IN CHAR16 *Help, + IN UINT16 Minimum, + IN UINT16 Maximum, + IN UINT16 Step, + IN UINT16 Default, + IN UINT8 Flags, + IN UINT16 Key, + IN OUT VOID *FormBuffer, + IN OUT VOID *StringBuffer + ) +/*++ + +Routine Description: + + Create a numeric + +Arguments: + + QuestionId - Question ID of the numeric + + DataWidth - DataWidth of the numeric + + Prompt - Prompt of the numeric + + Help - Help of the numeric + + Minimum - Minumun boundary of the numeric + + Maximum - Maximum boundary of the numeric + + Step - Step of the numeric + + Default - Default value + + Flags - Flags of the numeric + + Key - Key of the numeric + + FormBuffer - The form where this numeric adds to + + StringBuffer - String buffer created for Prompt and Help. + +Returns: + + EFI_DEVICE_ERROR - DataWidth > 2 + + EFI_SUCCESS - Numeric is successfully created + +--*/ +{ + EFI_STATUS Status; + EFI_IFR_NUMERIC Numeric; + CHAR16 CurrentLanguage[4]; + STRING_REF StringToken; + + // + // We do not create op-code storage widths for numerics in excess of 16 bits for now + // + if (DataWidth > 2) { + return EFI_DEVICE_ERROR; + } + + // + // Obtain current language value + // + GetCurrentLanguage (CurrentLanguage); + + // + // Add first string, get first string's token + // + Status = AddString (StringBuffer, CurrentLanguage, Prompt, &StringToken); + + if (EFI_ERROR (Status)) { + return Status; + } + + Numeric.Header.OpCode = EFI_IFR_NUMERIC_OP; + Numeric.Header.Length = sizeof (EFI_IFR_NUMERIC); + Numeric.QuestionId = QuestionId; + Numeric.Width = DataWidth; + Numeric.Prompt = StringToken; + + // + // Add second string, get first string's token + // + Status = AddString (StringBuffer, CurrentLanguage, Help, &StringToken); + + if (EFI_ERROR (Status)) { + return Status; + } + + Numeric.Help = StringToken; + Numeric.Minimum = Minimum; + Numeric.Maximum = Maximum; + Numeric.Step = Step; + Numeric.Default = Default; + Numeric.Flags = (UINT8) (Flags | EFI_IFR_FLAG_CREATED); + Numeric.Key = Key; + + Status = AddOpCode (FormBuffer, &Numeric); + + if (EFI_ERROR (Status)) { + return Status; + } + + return EFI_SUCCESS; +} + + +EFI_STATUS +CreateString ( + IN UINT16 QuestionId, + IN UINT8 DataWidth, + IN CHAR16 *Prompt, + IN CHAR16 *Help, + IN UINT8 MinSize, + IN UINT8 MaxSize, + IN UINT8 Flags, + IN UINT16 Key, + IN OUT VOID *FormBuffer, + IN OUT VOID *StringBuffer + ) +/*++ + +Routine Description: + + Create a string + +Arguments: + + QuestionId - Question ID of the string + + DataWidth - DataWidth of the string + + Prompt - Prompt of the string + + Help - Help of the string + + MinSize - Min size boundary of the string + + MaxSize - Max size boundary of the string + + Flags - Flags of the string + + Key - Key of the string + + FormBuffer - The form where this string adds to + + StringBuffer - String buffer created for Prompt and Help. + +Returns: + + EFI_SUCCESS - String successfully created. + +--*/ +{ + EFI_STATUS Status; + EFI_IFR_STRING String; + CHAR16 CurrentLanguage[4]; + STRING_REF StringToken; + + // + // Obtain current language value + // + GetCurrentLanguage (CurrentLanguage); + + // + // Add first string, get first string's token + // + Status = AddString (StringBuffer, CurrentLanguage, Prompt, &StringToken); + + if (EFI_ERROR (Status)) { + return Status; + } + + String.Header.OpCode = EFI_IFR_STRING_OP; + String.Header.Length = sizeof (EFI_IFR_STRING); + String.QuestionId = QuestionId; + String.Width = DataWidth; + String.Prompt = StringToken; + + // + // Add second string, get first string's token + // + Status = AddString (StringBuffer, CurrentLanguage, Help, &StringToken); + + if (EFI_ERROR (Status)) { + return Status; + } + + String.Help = StringToken; + String.MinSize = MinSize; + String.MaxSize = MaxSize; + String.Flags = (UINT8) (Flags | EFI_IFR_FLAG_CREATED); + String.Key = Key; + + Status = AddOpCode (FormBuffer, &String); + + if (EFI_ERROR (Status)) { + return Status; + } + + return EFI_SUCCESS; +} diff --git a/EDK/Foundation/Library/Dxe/EfiIfrSupportLib/IfrOpCodeCreation.c b/EDK/Foundation/Library/Dxe/EfiIfrSupportLib/IfrOpCodeCreation.c new file mode 100644 index 0000000..6759655 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/EfiIfrSupportLib/IfrOpCodeCreation.c @@ -0,0 +1,615 @@ +/*++ +Copyright (c) 2004, 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: + IfrOpCodeCreation.c + +Abstract: + + Library Routines to create IFR independent of string data - assume tokens already exist + Primarily to be used for exporting op-codes at a label in pre-defined forms. + +Revision History: + +--*/ + +#include "IfrLibrary.h" + +EFI_STATUS +CreateSubTitleOpCode ( + IN STRING_REF StringToken, + IN OUT VOID *FormBuffer + ) +/*++ + +Routine Description: + + Create a SubTitle opcode independent of string creation + This is used primarily by users who need to create just one particular valid op-code and the string + data will be assumed to exist in the HiiDatabase already. (Useful when exporting op-codes at a label + location to pre-defined forms in HII) + +Arguments: + + StringToken - StringToken of the subtitle + + FormBuffer - Output of subtitle as a form + +Returns: + + EFI_SUCCESS - Subtitle created to be a form + +--*/ +{ + EFI_IFR_SUBTITLE Subtitle; + + Subtitle.Header.OpCode = EFI_IFR_SUBTITLE_OP; + Subtitle.Header.Length = sizeof (EFI_IFR_SUBTITLE); + Subtitle.SubTitle = StringToken; + + EfiCopyMem (FormBuffer, &Subtitle, sizeof (EFI_IFR_SUBTITLE)); + return EFI_SUCCESS; +} + + +EFI_STATUS +CreateTextOpCode ( + IN STRING_REF StringToken, + IN STRING_REF StringTokenTwo, + IN STRING_REF StringTokenThree, + IN UINT8 Flags, + IN UINT16 Key, + IN OUT VOID *FormBuffer + ) +/*++ + +Routine Description: + + Create a Text opcode independent of string creation + This is used primarily by users who need to create just one particular valid op-code and the string + data will be assumed to exist in the HiiDatabase already. (Useful when exporting op-codes at a label + location to pre-defined forms in HII) + +Arguments: + + StringToken - First string token of the text + + StringTokenTwo - Second string token of the text + + StringTokenThree - Help string token of the text + + Flags - Flag of the text + + Key - Key of the text + + FormBuffer - Output of text as a form + +Returns: + + EFI_SUCCESS - Text created to be a form + +--*/ +{ + EFI_IFR_TEXT Text; + + Text.Header.OpCode = EFI_IFR_TEXT_OP; + Text.Header.Length = sizeof (EFI_IFR_TEXT); + Text.Text = StringToken; + + Text.TextTwo = StringTokenTwo; + Text.Help = StringTokenThree; + Text.Flags = Flags; + Text.Key = Key; + + EfiCopyMem (FormBuffer, &Text, sizeof (EFI_IFR_TEXT)); + + return EFI_SUCCESS; +} + + +EFI_STATUS +CreateGotoOpCode ( + IN UINT16 FormId, + IN STRING_REF StringToken, + IN STRING_REF StringTokenTwo, + IN UINT8 Flags, + IN UINT16 Key, + IN OUT VOID *FormBuffer + ) +/*++ + +Routine Description: + + Create a hyperlink opcode independent of string creation + This is used primarily by users who need to create just one particular valid op-code and the string + data will be assumed to exist in the HiiDatabase already. (Useful when exporting op-codes at a label + location to pre-defined forms in HII) + +Arguments: + + FormId - Form ID of the hyperlink + + StringToken - Prompt string token of the hyperlink + + StringTokenTwo - Help string token of the hyperlink + + Flags - Flags of the hyperlink + + Key - Key of the hyperlink + + FormBuffer - Output of hyperlink as a form + +Returns: + + EFI_SUCCESS - Hyperlink created to be a form + +--*/ +{ + EFI_IFR_REF Hyperlink; + + Hyperlink.Header.OpCode = EFI_IFR_REF_OP; + Hyperlink.Header.Length = sizeof (EFI_IFR_REF); + Hyperlink.FormId = FormId; + Hyperlink.Prompt = StringToken; + Hyperlink.Help = StringTokenTwo; + Hyperlink.Key = Key; + Hyperlink.Flags = Flags; + + EfiCopyMem (FormBuffer, &Hyperlink, sizeof (EFI_IFR_REF)); + + return EFI_SUCCESS; +} + + +EFI_STATUS +CreateOneOfOpCode ( + IN UINT16 QuestionId, + IN UINT8 DataWidth, + IN STRING_REF PromptToken, + IN STRING_REF HelpToken, + IN IFR_OPTION *OptionsList, + IN UINTN OptionCount, + IN OUT VOID *FormBuffer + ) +/*++ + +Routine Description: + + Create a one-of opcode with a set of option op-codes to choose from independent of string creation. + This is used primarily by users who need to create just one particular valid op-code and the string + data will be assumed to exist in the HiiDatabase already. (Useful when exporting op-codes at a label + location to pre-defined forms in HII) + + OptionsList is a pointer to a null-terminated list of option descriptions. Ensure that OptionsList[x].StringToken + has been filled in since this routine will not generate StringToken values. + +Arguments: + + QuestionId - Question ID of the one-of box + + DataWidth - DataWidth of the one-of box + + PromptToken - Prompt string token of the one-of box + + HelpToken - Help string token of the one-of box + + OptionsList - Each string in it is an option of the one-of box + + OptionCount - Option string count + + FormBuffer - Output of One-Of box as a form + +Returns: + + EFI_SUCCESS - One-Of box created to be a form + + EFI_DEVICE_ERROR - DataWidth > 2 + +--*/ +{ + UINTN Index; + EFI_IFR_ONE_OF OneOf; + EFI_IFR_ONE_OF_OPTION OneOfOption; + EFI_IFR_END_ONE_OF EndOneOf; + UINT8 *LocalBuffer; + + // + // We do not create op-code storage widths for one-of in excess of 16 bits for now + // + if (DataWidth > 2) { + return EFI_DEVICE_ERROR; + } + + OneOf.Header.OpCode = EFI_IFR_ONE_OF_OP; + OneOf.Header.Length = sizeof (EFI_IFR_ONE_OF); + OneOf.QuestionId = QuestionId; + OneOf.Width = DataWidth; + OneOf.Prompt = PromptToken; + + OneOf.Help = HelpToken; + + LocalBuffer = (CHAR8 *) FormBuffer; + + EfiCopyMem (LocalBuffer, &OneOf, sizeof (EFI_IFR_ONE_OF)); + + LocalBuffer = (CHAR8 *) (LocalBuffer + sizeof (EFI_IFR_ONE_OF)); + + for (Index = 0; Index < OptionCount; Index++) { + OneOfOption.Header.OpCode = EFI_IFR_ONE_OF_OPTION_OP; + OneOfOption.Header.Length = sizeof (EFI_IFR_ONE_OF_OPTION); + + OneOfOption.Option = OptionsList[Index].StringToken; + OneOfOption.Value = OptionsList[Index].Value; + OneOfOption.Flags = OptionsList[Index].Flags; + OneOfOption.Key = OptionsList[Index].Key; + + EfiCopyMem (LocalBuffer, &OneOfOption, sizeof (EFI_IFR_ONE_OF_OPTION)); + + LocalBuffer = (CHAR8 *) (LocalBuffer + sizeof (EFI_IFR_ONE_OF_OPTION)); + } + + EndOneOf.Header.Length = sizeof (EFI_IFR_END_ONE_OF); + EndOneOf.Header.OpCode = EFI_IFR_END_ONE_OF_OP; + + EfiCopyMem (LocalBuffer, &EndOneOf, sizeof (EFI_IFR_END_ONE_OF)); + + LocalBuffer = (CHAR8 *) (LocalBuffer + sizeof (EFI_IFR_END_ONE_OF)); + + return EFI_SUCCESS; +} + +EFI_STATUS +CreateOrderedListOpCode ( + IN UINT16 QuestionId, + IN UINT8 MaxEntries, + IN STRING_REF PromptToken, + IN STRING_REF HelpToken, + IN IFR_OPTION *OptionsList, + IN UINTN OptionCount, + IN OUT VOID *FormBuffer + ) +/*++ + +Routine Description: + + Create a ordered list opcode with a set of option op-codes to choose from independent of string creation. + This is used primarily by users who need to create just one particular valid op-code and the string + data will be assumed to exist in the HiiDatabase already. (Useful when exporting op-codes at a label + location to pre-defined forms in HII) + + OptionsList is a pointer to a null-terminated list of option descriptions. Ensure that OptionsList[x].StringToken + has been filled in since this routine will not generate StringToken values. + +Arguments: + + QuestionId - Question ID of the ordered list + + MaxEntries - MaxEntries of the ordered list + + PromptToken - Prompt string token of the ordered list + + HelpToken - Help string token of the ordered list + + OptionsList - Each string in it is an option of the ordered list + + OptionCount - Option string count + + FormBuffer - Output of ordered list as a form + +Returns: + + EFI_SUCCESS - Ordered list created to be a form + +--*/ +{ + UINTN Index; + EFI_IFR_ORDERED_LIST OrderedList; + EFI_IFR_ONE_OF_OPTION OrderedListOption; + EFI_IFR_END_ONE_OF EndOrderedList; + UINT8 *LocalBuffer; + + OrderedList.Header.OpCode = EFI_IFR_ORDERED_LIST_OP; + OrderedList.Header.Length = sizeof (EFI_IFR_ORDERED_LIST); + OrderedList.QuestionId = QuestionId; + OrderedList.MaxEntries = MaxEntries; + OrderedList.Prompt = PromptToken; + + OrderedList.Help = HelpToken; + + LocalBuffer = (CHAR8 *) FormBuffer; + + EfiCopyMem (LocalBuffer, &OrderedList, sizeof (EFI_IFR_ORDERED_LIST)); + + LocalBuffer = (CHAR8 *) (LocalBuffer + sizeof (EFI_IFR_ORDERED_LIST)); + + for (Index = 0; Index < OptionCount; Index++) { + OrderedListOption.Header.OpCode = EFI_IFR_ONE_OF_OPTION_OP; + OrderedListOption.Header.Length = sizeof (EFI_IFR_ONE_OF_OPTION); + + OrderedListOption.Option = OptionsList[Index].StringToken; + OrderedListOption.Value = OptionsList[Index].Value; + OrderedListOption.Flags = OptionsList[Index].Flags; + OrderedListOption.Key = OptionsList[Index].Key; + + EfiCopyMem (LocalBuffer, &OrderedListOption, sizeof (EFI_IFR_ONE_OF_OPTION)); + + LocalBuffer = (CHAR8 *) (LocalBuffer + sizeof (EFI_IFR_ONE_OF_OPTION)); + } + + EndOrderedList.Header.Length = sizeof (EFI_IFR_END_ONE_OF); + EndOrderedList.Header.OpCode = EFI_IFR_END_ONE_OF_OP; + + EfiCopyMem (LocalBuffer, &EndOrderedList, sizeof (EFI_IFR_END_ONE_OF)); + + LocalBuffer = (CHAR8 *) (LocalBuffer + sizeof (EFI_IFR_END_ONE_OF)); + + return EFI_SUCCESS; +} + +EFI_STATUS +CreateCheckBoxOpCode ( + IN UINT16 QuestionId, + IN UINT8 DataWidth, + IN STRING_REF PromptToken, + IN STRING_REF HelpToken, + IN UINT8 Flags, + IN UINT16 Key, + IN OUT VOID *FormBuffer + ) +/*++ + +Routine Description: + + Create a checkbox opcode independent of string creation + This is used primarily by users who need to create just one particular valid op-code and the string + data will be assumed to exist in the HiiDatabase already. (Useful when exporting op-codes at a label + location to pre-defined forms in HII) + +Arguments: + + QuestionId - Question ID of the check box + + DataWidth - DataWidth of the check box + + PromptToken - Prompt string token of the check box + + HelpToken - Help string token of the check box + + Flags - Flags of the check box + + Key - Key of the check box + + FormBuffer - Output of the check box as a form + +Returns: + + EFI_SUCCESS - Checkbox created to be a form + + EFI_DEVICE_ERROR - DataWidth > 1 + +--*/ +{ + EFI_IFR_CHECK_BOX CheckBox; + + // + // We do not create op-code storage widths for checkbox in excess of 8 bits for now + // + if (DataWidth > 1) { + return EFI_DEVICE_ERROR; + } + + CheckBox.Header.OpCode = EFI_IFR_CHECKBOX_OP; + CheckBox.Header.Length = sizeof (EFI_IFR_CHECK_BOX); + CheckBox.QuestionId = QuestionId; + CheckBox.Width = DataWidth; + CheckBox.Prompt = PromptToken; + + CheckBox.Help = HelpToken; + CheckBox.Flags = Flags; + CheckBox.Key = Key; + + EfiCopyMem (FormBuffer, &CheckBox, sizeof (EFI_IFR_CHECK_BOX)); + + return EFI_SUCCESS; +} + + +EFI_STATUS +CreateNumericOpCode ( + IN UINT16 QuestionId, + IN UINT8 DataWidth, + IN STRING_REF PromptToken, + IN STRING_REF HelpToken, + IN UINT16 Minimum, + IN UINT16 Maximum, + IN UINT16 Step, + IN UINT16 Default, + IN UINT8 Flags, + IN UINT16 Key, + IN OUT VOID *FormBuffer + ) +/*++ + +Routine Description: + + Create a numeric opcode independent of string creation + This is used primarily by users who need to create just one particular valid op-code and the string + data will be assumed to exist in the HiiDatabase already. (Useful when exporting op-codes at a label + location to pre-defined forms in HII) + +Arguments: + + QuestionId - Question ID of the numeric + + DataWidth - DataWidth of the numeric + + PromptToken - Prompt string token of the numeric + + HelpToken - Help string token of the numeric + + Minimum - Minumun boundary of the numeric + + Maximum - Maximum boundary of the numeric + + Step - Step of the numeric + + Default - Default value of the numeric + + Flags - Flags of the numeric + + Key - Key of the numeric + + FormBuffer - Output of the numeric as a form + +Returns: + + EFI_SUCCESS - The numeric created to be a form. + + EFI_DEVICE_ERROR - DataWidth > 2 + +--*/ +{ + EFI_IFR_NUMERIC Numeric; + + // + // We do not create op-code storage widths for numerics in excess of 16 bits for now + // + if (DataWidth > 2) { + return EFI_DEVICE_ERROR; + } + + Numeric.Header.OpCode = EFI_IFR_NUMERIC_OP; + Numeric.Header.Length = sizeof (EFI_IFR_NUMERIC); + Numeric.QuestionId = QuestionId; + Numeric.Width = DataWidth; + Numeric.Prompt = PromptToken; + + Numeric.Help = HelpToken; + Numeric.Minimum = Minimum; + Numeric.Maximum = Maximum; + Numeric.Step = Step; + Numeric.Default = Default; + Numeric.Flags = Flags; + Numeric.Key = Key; + + EfiCopyMem (FormBuffer, &Numeric, sizeof (EFI_IFR_NUMERIC)); + + return EFI_SUCCESS; +} + + +EFI_STATUS +CreateStringOpCode ( + IN UINT16 QuestionId, + IN UINT8 DataWidth, + IN STRING_REF PromptToken, + IN STRING_REF HelpToken, + IN UINT8 MinSize, + IN UINT8 MaxSize, + IN UINT8 Flags, + IN UINT16 Key, + IN OUT VOID *FormBuffer + ) +/*++ + +Routine Description: + + Create a numeric opcode independent of string creation + This is used primarily by users who need to create just one particular valid op-code and the string + data will be assumed to exist in the HiiDatabase already. (Useful when exporting op-codes at a label + location to pre-defined forms in HII) + +Arguments: + + QuestionId - Question ID of the string + + DataWidth - DataWidth of the string + + PromptToken - Prompt token of the string + + HelpToken - Help token of the string + + MinSize - Min size boundary of the string + + MaxSize - Max size boundary of the string + + Flags - Flags of the string + + Key - Key of the string + + FormBuffer - Output of the string as a form + +Returns: + + EFI_SUCCESS - String created to be a form. + +--*/ +{ + EFI_IFR_STRING String; + + String.Header.OpCode = EFI_IFR_STRING_OP; + String.Header.Length = sizeof (EFI_IFR_STRING); + String.QuestionId = QuestionId; + String.Width = DataWidth; + String.Prompt = PromptToken; + + String.Help = HelpToken; + String.MinSize = MinSize; + String.MaxSize = MaxSize; + String.Flags = Flags; + String.Key = Key; + + EfiCopyMem (FormBuffer, &String, sizeof (EFI_IFR_STRING)); + + return EFI_SUCCESS; +} + + +EFI_STATUS +CreateBannerOpCode ( + IN UINT16 Title, + IN UINT16 LineNumber, + IN UINT8 Alignment, + IN OUT VOID *FormBuffer + ) +/*++ + +Routine Description: + + Create a banner opcode. This is primarily used by the FrontPage implementation from BDS. + +Arguments: + + Title - Title of the banner + + LineNumber - LineNumber of the banner + + Alignment - Alignment of the banner + + FormBuffer - Output of banner as a form + +Returns: + + EFI_SUCCESS - Banner created to be a form. + +--*/ +{ + EFI_IFR_BANNER Banner; + + Banner.Header.OpCode = EFI_IFR_BANNER_OP; + Banner.Header.Length = sizeof (EFI_IFR_BANNER); + EfiCopyMem (&Banner.Title, &Title, sizeof (UINT16)); + EfiCopyMem (&Banner.LineNumber, &LineNumber, sizeof (UINT16)); + Banner.Alignment = Alignment; + + EfiCopyMem (FormBuffer, &Banner, sizeof (EFI_IFR_BANNER)); + + return EFI_SUCCESS; +} diff --git a/EDK/Foundation/Library/Dxe/EfiIfrSupportLib/IfrVariable.c b/EDK/Foundation/Library/Dxe/EfiIfrSupportLib/IfrVariable.c new file mode 100644 index 0000000..57a9221 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/EfiIfrSupportLib/IfrVariable.c @@ -0,0 +1,488 @@ +/*++ + +Copyright (c) 2005, 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: + IfrVariable.c + +Abstract: + Variable/Map manipulations routines + +--*/ + +#include "IfrLibrary.h" + +VOID +EfiLibHiiVariablePackGetMap ( + IN EFI_HII_VARIABLE_PACK *Pack, + OUT CHAR16 **Name, OPTIONAL + OUT EFI_GUID **Guid, OPTIONAL + OUT UINT16 *Id, OPTIONAL + OUT VOID **Var, OPTIONAL + OUT UINTN *Size OPTIONAL + ) +/*++ + +Routine Description: + + Extracts a variable form a Pack. + +Arguments: + + Pack - List of variables + Name - Name of the variable/map + Guid - GUID of the variable/map + Var - Pointer to the variable/map + Size - Size of the variable/map in bytes + +Returns: + + VOID + +--*/ +{ + if (NULL != Name) { + *Name = (VOID *) (Pack + 1); + } + + if (NULL != Guid) { + *Guid = (EFI_GUID *)(UINTN)&Pack->VariableGuid; + } + + + if (NULL != Id) { + *Id = Pack->VariableId; + } + + if (NULL != Var) { + *Var = (VOID *) ((CHAR8 *) (Pack + 1) + Pack->VariableNameLength); + } + + if (NULL != Size) { + *Size = Pack->Header.Length - sizeof (*Pack) - Pack->VariableNameLength; + } +} + + +UINTN +EfiLibHiiVariablePackListGetMapCnt ( + IN EFI_HII_VARIABLE_PACK_LIST *List + ) + +/*++ + +Routine Description: + + Finds a count of the variables/maps in the List. + +Arguments: + + List - List of variables + +Returns: + + UINTN - The number of map count. + +--*/ + +{ + UINTN Cnt = 0; + while (NULL != List) { + Cnt++; + List = List->NextVariablePack; + } + return Cnt; +} + + +VOID +EfiLibHiiVariablePackListForEachVar ( + IN EFI_HII_VARIABLE_PACK_LIST *List, + IN EFI_LIB_HII_VARIABLE_PACK_LIST_CALLBACK *Callback + ) +/*++ + +Routine Description: + + Will iterate all variable/maps as appearing + in List and for each, it will call the Callback. + +Arguments: + + List - List of variables + Callback - Routine to be called for each iterated variable. + +Returns: + + VOID + +--*/ + +{ + CHAR16 *MapName; + EFI_GUID *MapGuid; + UINT16 MapId; + VOID *Map; + UINTN MapSize; + + while (NULL != List) { + EfiLibHiiVariablePackGetMap (List->VariablePack, &MapName, &MapGuid, &MapId, &Map, &MapSize); + // + // call the callback + // + Callback (MapName, MapGuid, MapId, Map, MapSize); + List = List->NextVariablePack; + } +} + + +EFI_STATUS +EfiLibHiiVariablePackListGetMapByIdx ( + IN UINTN Idx, + IN EFI_HII_VARIABLE_PACK_LIST *List, + OUT CHAR16 **Name, OPTIONAL + OUT EFI_GUID **Guid, OPTIONAL + OUT UINT16 *Id, OPTIONAL + OUT VOID **Var, + OUT UINTN *Size + ) + +/*++ + +Routine Description: + + Finds a variable form List given + the order number as appears in the List. + +Arguments: + + Idx - The index of the variable/map to retrieve + List - List of variables + Name - Name of the variable/map + Guid - GUID of the variable/map + Var - Pointer to the variable/map + Size - Size of the variable/map in bytes + +Returns: + + EFI_SUCCESS - Variable is found, OUT parameters are valid + EFI_NOT_FOUND - Variable is not found, OUT parameters are not valid + +--*/ +{ + CHAR16 *MapName; + EFI_GUID *MapGuid; + UINT16 MapId; + VOID *Map; + UINTN MapSize; + + while (NULL != List) { + EfiLibHiiVariablePackGetMap (List->VariablePack, &MapName, &MapGuid, &MapId, &Map, &MapSize); + if (0 == Idx--) { + *Var = Map; + *Size = MapSize; + + if (NULL != Name) { + *Name = MapName; + } + + if (NULL != Guid) { + *Guid = MapGuid; + } + + if (NULL != Id) { + *Id = MapId; + } + + return EFI_SUCCESS; // Map found + } + List = List->NextVariablePack; + } + // + // If here, the map is not found + // + return EFI_NOT_FOUND; +} + + +EFI_STATUS +EfiLibHiiVariablePackListGetMapById ( + IN UINT16 Id, + IN EFI_HII_VARIABLE_PACK_LIST *List, + OUT CHAR16 **Name, OPTIONAL + OUT EFI_GUID **Guid, OPTIONAL + OUT VOID **Var, + OUT UINTN *Size + ) + +/*++ + +Routine Description: + + Finds a variable form List given the + order number as appears in the List. + +Arguments: + + Id - The ID of the variable/map to retrieve + List - List of variables + Name - Name of the variable/map + Guid - GUID of the variable/map + Var - Pointer to the variable/map + Size - Size of the variable/map in bytes + +Returns: + + EFI_SUCCESS - Variable is found, OUT parameters are valid + EFI_NOT_FOUND - Variable is not found, OUT parameters are not valid + +--*/ + +{ + CHAR16 *MapName; + EFI_GUID *MapGuid; + UINT16 MapId; + VOID *Map; + UINTN MapSize; + + while (NULL != List) { + EfiLibHiiVariablePackGetMap (List->VariablePack, &MapName, &MapGuid, &MapId, &Map, &MapSize); + if (MapId == Id) { + *Var = Map; + *Size = MapSize; + if (NULL != Name) { + *Name = MapName; + } + if (NULL != Guid) { + *Guid = MapGuid; + } + // + // Map found + // + return EFI_SUCCESS; + } + List = List->NextVariablePack; + } + // + // If here, the map is not found + // + return EFI_NOT_FOUND; +} + + +EFI_STATUS +EfiLibHiiVariablePackListGetMap ( + IN EFI_HII_VARIABLE_PACK_LIST *List, + IN CHAR16 *Name, + IN EFI_GUID *Guid, + OUT UINT16 *Id, + OUT VOID **Var, + OUT UINTN *Size + ) + +/*++ + +Routine Description: + + Finds a variable form EFI_HII_VARIABLE_PACK_LIST given name and GUID. + +Arguments: + + List - List of variables + Name - Name of the variable/map to be found + Guid - GUID of the variable/map to be found + Var - Pointer to the variable/map found + Size - Size of the variable/map in bytes found + +Returns: + + EFI_SUCCESS - variable is found, OUT parameters are valid + EFI_NOT_FOUND - variable is not found, OUT parameters are not valid + +--*/ + +{ + VOID *Map; + UINTN MapSize; + UINT16 MapId; + CHAR16 *MapName; + EFI_GUID *MapGuid; + + while (NULL != List) { + EfiLibHiiVariablePackGetMap (List->VariablePack, &MapName, &MapGuid, &MapId, &Map, &MapSize); + if ((0 == EfiStrCmp (Name, MapName)) && EfiCompareGuid (Guid, MapGuid)) { + *Id = MapId; + *Var = Map; + *Size = MapSize; + return EFI_SUCCESS; + } + List = List->NextVariablePack; + } + // + // If here, the map is not found + // + return EFI_NOT_FOUND; +} + +EFI_STATUS +EfiLibHiiVariableRetrieveFromNv ( + IN CHAR16 *Name, + IN EFI_GUID *Guid, + IN UINTN Size, + OUT VOID **Var + ) +/*++ + +Routine Description: + Finds out if a variable of specific Name/Guid/Size exists in NV. + If it does, it will retrieve it into the Var. + +Arguments: + Name, Guid, Size - Parameters of the variable to retrieve. Must match exactly. + Var - Variable will be retrieved into buffer pointed by this pointer. + If pointing to NULL, the buffer will be allocated. Caller is responsible for releasing the buffer. +Returns: + EFI_SUCCESS - The variable of exact Name/Guid/Size parameters was retrieved and written to Var. + EFI_NOT_FOUND - The variable of this Name/Guid was not found in the NV. + EFI_LOAD_ERROR - The variable in the NV was of different size, or NV API returned error. + +--*/ +{ + EFI_STATUS Status; + UINTN SizeNv; + + // + // Test for existence of the variable. + // + SizeNv = 0; + Status = gRT->GetVariable (Name, Guid, NULL, &SizeNv, NULL); + if (EFI_BUFFER_TOO_SMALL != Status) { + ASSERT (EFI_SUCCESS != Status); + return EFI_NOT_FOUND; + } + if (SizeNv != Size) { + // + // The variable is considered corrupt, as it has different size from expected. + // + return EFI_LOAD_ERROR; + } + + if (NULL == *Var) { + *Var = EfiLibAllocatePool (Size); + ASSERT (NULL != *Var); + } + SizeNv = Size; + // + // Final read into the Var + // + Status = gRT->GetVariable (Name, Guid, NULL, &SizeNv, *Var); + // + // No tolerance for random failures. Such behavior is undetermined and not validated. + // + ASSERT_EFI_ERROR (Status); + ASSERT (SizeNv == Size); + return EFI_SUCCESS; +} + + + +EFI_STATUS +EfiLibHiiVariableOverrideIfSuffix ( + IN CHAR16 *Suffix, + IN CHAR16 *Name, + IN EFI_GUID *Guid, + IN UINTN Size, + OUT VOID *Var + ) +/*++ + +Routine Description: + Overrrides the variable with NV data if found. + But it only does it if the Name ends with specified Suffix. + For example, if Suffix="MyOverride" and the Name="XyzSetupMyOverride", + the Suffix matches the end of Name, so the variable will be loaded from NV + provided the variable exists and the GUID and Size matches. + +Arguments: + Suffix - Suffix the Name should end with. + Name, Guid, Size - Parameters of the variable to retrieve. Must match exactly. + Var - Variable will be retrieved into this buffer. + Caller is responsible for providing storage of exactly Size size in bytes. +Returns: + EFI_SUCCESS - The variable was overriden with NV variable of same Name/Guid/Size. + EFI_INVALID_PARAMETER - The name of the variable does not end with . + EFI_NOT_FOUND - The variable of this Name/Guid was not found in the NV. + EFI_LOAD_ERROR - The variable in the NV was of different size, or NV API returned error. + +--*/ +{ + UINTN StrLen; + UINTN StrLenSuffix; + + StrLen = EfiStrLen (Name); + StrLenSuffix = EfiStrLen (Suffix); + if ((StrLen <= StrLenSuffix) || (0 != EfiStrCmp (Suffix, &Name[StrLen - StrLenSuffix]))) { + // + // Not ending with . + // + return EFI_INVALID_PARAMETER; + } + return EfiLibHiiVariableRetrieveFromNv (Name, Guid, Size, &Var); +} + + + +EFI_STATUS +EfiLibHiiVariableOverrideBySuffix ( + IN CHAR16 *Suffix, + IN CHAR16 *Name, + IN EFI_GUID *Guid, + IN UINTN Size, + OUT VOID *Var + ) +/*++ + +Routine Description: + Overrrides the variable with NV data if found. + But it only does it if the NV contains the same variable with Name is appended with Suffix. + For example, if Suffix="MyOverride" and the Name="XyzSetup", + the Suffix will be appended to the end of Name, and the variable with Name="XyzSetupMyOverride" + will be loaded from NV provided the variable exists and the GUID and Size matches. + +Arguments: + Suffix - Suffix the variable will be appended with. + Name, Guid, Size - Parameters of the variable to retrieve. Must match exactly. + Var - Variable will be retrieved into this buffer. + Caller is responsible for providing storage of exactly Size size in bytes. + +Returns: + EFI_SUCCESS - The variable was overriden with NV variable of same Name/Guid/Size. + EFI_NOT_FOUND - The variable of this Name/Guid was not found in the NV. + EFI_LOAD_ERROR - The variable in the NV was of different size, or NV API returned error. + +--*/ +{ + EFI_STATUS Status; + CHAR16 *NameSuffixed; + + // + // enough to concatenate both strings. + // + NameSuffixed = EfiLibAllocateZeroPool ((EfiStrLen (Name) + EfiStrLen (Suffix) + 1) * sizeof (CHAR16)); + + EfiStrCpy (NameSuffixed, Name); + EfiStrCat (NameSuffixed, Suffix); + + Status = EfiLibHiiVariableRetrieveFromNv (NameSuffixed, Guid, Size, &Var); + gBS->FreePool (NameSuffixed); + + return Status; +} + diff --git a/EDK/Foundation/Library/Dxe/EfiScriptLib/EfiScriptLib.c b/EDK/Foundation/Library/Dxe/EfiScriptLib/EfiScriptLib.c new file mode 100644 index 0000000..a2f5e28 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/EfiScriptLib/EfiScriptLib.c @@ -0,0 +1,712 @@ +/*++ + +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 + ); +} + diff --git a/EDK/Foundation/Library/Dxe/EfiScriptLib/EfiScriptLib.cif b/EDK/Foundation/Library/Dxe/EfiScriptLib/EfiScriptLib.cif new file mode 100644 index 0000000..ed0c96a --- /dev/null +++ b/EDK/Foundation/Library/Dxe/EfiScriptLib/EfiScriptLib.cif @@ -0,0 +1,11 @@ + + name = "EfiScriptLib" + category = ModulePart + LocalRoot = "EDK\Foundation\Library\Dxe\EfiScriptLib\" + RefName = "EfiScriptLib" +[files] +"EfiScriptLib.sdl" +"EfiScriptLib.mak" +"EfiScriptLib.c" +"EfiScriptLib.inf" + diff --git a/EDK/Foundation/Library/Dxe/EfiScriptLib/EfiScriptLib.inf b/EDK/Foundation/Library/Dxe/EfiScriptLib/EfiScriptLib.inf new file mode 100644 index 0000000..fd33eae --- /dev/null +++ b/EDK/Foundation/Library/Dxe/EfiScriptLib/EfiScriptLib.inf @@ -0,0 +1,45 @@ +#/*++ +# +# Copyright (c) 2006, 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.inf +# +# Abstract: +# +# Component description file. +# +#--*/ + +[defines] +BASE_NAME = EfiScriptLib +COMPONENT_TYPE = LIBRARY + +[sources.common] + EfiScriptLib.c + + +[includes.common] + $(EDK_SOURCE)\Foundation\Framework + $(EDK_SOURCE)\Foundation\Efi + . + $(EDK_SOURCE)\Foundation\Include + $(EDK_SOURCE)\Foundation\Efi\Include + $(EDK_SOURCE)\Foundation\Framework\Include + $(EDK_SOURCE)\Foundation\Include\IndustryStandard + $(EDK_SOURCE)\Foundation\Library\Dxe\Include + $(EFI_SOURCE) + $(EDK_SOURCE)\Foundation\Core\Dxe + +[libraries.common] + EdkFrameworkProtocolLib + +[nmake.common] diff --git a/EDK/Foundation/Library/Dxe/EfiScriptLib/EfiScriptLib.mak b/EDK/Foundation/Library/Dxe/EfiScriptLib/EfiScriptLib.mak new file mode 100644 index 0000000..0283c99 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/EfiScriptLib/EfiScriptLib.mak @@ -0,0 +1,70 @@ +#********************************************************************** +#********************************************************************** +#** ** +#** (C)Copyright 1985-2009, American Megatrends, Inc. ** +#** ** +#** All Rights Reserved. ** +#** ** +#** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +#** ** +#** Phone: (770)-246-8600 ** +#** ** +#********************************************************************** +#********************************************************************** + +#********************************************************************** +# $Header: /Alaska/SOURCE/Modules/SharkBayRefCodes/IntelEDK/EfiScriptLib/EfiScriptLib.mak 1 1/20/12 4:12a Jeffch $ +# +# $Revision: 1 $ +# +# $Date: 1/20/12 4:12a $ +#********************************************************************** +# Revision History +# ---------------- +# $Log: /Alaska/SOURCE/Modules/SharkBayRefCodes/IntelEDK/EfiScriptLib/EfiScriptLib.mak $ +# +# 1 1/20/12 4:12a Jeffch +# Create Intel EDK 1117 Patch 7. +# +# 1 9/27/11 6:35a Wesleychen +# Intel EDK initially releases. +# +# 2 9/02/09 3:46a Iminglin +# EIP24919 +# +#********************************************************************** +#********************************************************************** +# +# +# Name: EfiScriptLib.mak +# +# Description: +# +# +#********************************************************************** +$(EFISCRIPTLIB) : EfiScriptLib + +$(BUILD_DIR)\EfiScriptLib.lib : EfiScriptLib + +EfiScriptLib : $(BUILD_DIR)\EfiScriptLib.mak EfiScriptLibBin + +$(BUILD_DIR)\EfiScriptLib.mak : $(EfiScriptLib_DIR)\$(@B).cif $(EfiScriptLib_DIR)\$(@B).mak $(BUILD_RULES) + $(CIF2MAK) $(EfiScriptLib_DIR)\$(@B).cif $(CIF2MAK_DEFAULTS) + +EfiScriptLibBin : $(EDKFRAMEWORKPROTOCOLLIB) + $(MAKE) /$(MAKEFLAGS) $(EDK_DEFAULTS)\ + /f $(BUILD_DIR)\EfiScriptLib.mak all\ + TYPE=LIBRARY \ +#********************************************************************** +#********************************************************************** +#** ** +#** (C)Copyright 1985-2009, American Megatrends, Inc. ** +#** ** +#** All Rights Reserved. ** +#** ** +#** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +#** ** +#** Phone: (770)-246-8600 ** +#** ** +#********************************************************************** +#********************************************************************** \ No newline at end of file diff --git a/EDK/Foundation/Library/Dxe/EfiScriptLib/EfiScriptLib.sdl b/EDK/Foundation/Library/Dxe/EfiScriptLib/EfiScriptLib.sdl new file mode 100644 index 0000000..232e858 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/EfiScriptLib/EfiScriptLib.sdl @@ -0,0 +1,26 @@ +TOKEN + Name = "EfiScriptLib_SUPPORT" + Value = "1" + Help = "Main switch to enable EfiScriptLib support in Project" + TokenType = Boolean + TargetEQU = Yes + TargetMAK = Yes + Master = Yes +End + +TOKEN + Name = "EFISCRIPTLIB" + Value = "$(BUILD_DIR)\EfiScriptLib.lib" + TokenType = Expression + TargetMAK = Yes +End + +PATH + Name = "EfiScriptLib_DIR" +End + +MODULE + Help = "Includes EfiScriptLib.mak to Project" + File = "EfiScriptLib.mak" +End + diff --git a/EDK/Foundation/Library/Dxe/Graphics/Ascii/GraphicsAscii.cif b/EDK/Foundation/Library/Dxe/Graphics/Ascii/GraphicsAscii.cif new file mode 100644 index 0000000..6555b3e --- /dev/null +++ b/EDK/Foundation/Library/Dxe/Graphics/Ascii/GraphicsAscii.cif @@ -0,0 +1,9 @@ + + name = "GraphicsAscii" + category = ModulePart + LocalRoot = "EDK\Foundation\Library\Dxe\Graphics\Ascii" + RefName = "GraphicsAscii" +[files] +"PrintWidth.h" +"Sprint.c" + diff --git a/EDK/Foundation/Library/Dxe/Graphics/Ascii/PrintWidth.h b/EDK/Foundation/Library/Dxe/Graphics/Ascii/PrintWidth.h new file mode 100644 index 0000000..07901dc --- /dev/null +++ b/EDK/Foundation/Library/Dxe/Graphics/Ascii/PrintWidth.h @@ -0,0 +1,88 @@ +/*++ + +Copyright (c) 2004, 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: + + PrintWidth.h + +Abstract: + + Unicde option for generic width. + CHAR_W is Ascii + STRING_W is "" + +--*/ + +#ifndef _PRINT_WIDTH_H_ +#define _PRINT_WIDTH_H_ + +typedef CHAR8 CHAR_W; +#define STRING_W(_s) _s + +#define ASPrint(Buffer, BufferSize, Format) SPrint (Buffer, BufferSize, Format) +#define AvSPrint(Buffer, BufferSize, Format, Marker) VSPrint (Buffer, BufferSize, Format, Marker) + +UINTN +UvSPrint ( + OUT CHAR16 *StartOfBuffer, + IN UINTN StrLen, + IN CONST CHAR16 *Format, + IN VA_LIST Marker + ) +/*++ + +Routine Description: + + Internal implementation of USPrint. + Process format and place the results in Buffer for wide chars. + +Arguments: + + StartOfBuffer - Wide char buffer to print the results of the parsing of Format into. + StrLen - Maximum number of characters to put into buffer. + Format - Format string + Marker - Vararg list consumed by processing Format. + +Returns: + + Number of characters printed. + +--*/ +; + +UINTN +USPrint ( + OUT CHAR16 *Buffer, + IN UINTN BufferSize, + IN CONST CHAR16 *Format, + ... + ) +/*++ + +Routine Description: + + Process format and place the results in Buffer for wide chars. + +Arguments: + + Buffer - Wide char buffer to print the results of the parsing of Format into. + BufferSize - Maximum number of characters to put into buffer. + Format - Format string + ... - Vararg list consumed by processing Format. + +Returns: + + Number of characters printed. + +--*/ +; + +#endif diff --git a/EDK/Foundation/Library/Dxe/Graphics/Ascii/Sprint.c b/EDK/Foundation/Library/Dxe/Graphics/Ascii/Sprint.c new file mode 100644 index 0000000..bb4bb1e --- /dev/null +++ b/EDK/Foundation/Library/Dxe/Graphics/Ascii/Sprint.c @@ -0,0 +1,144 @@ +/*++ + +Copyright (c) 2004, 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: + + Sprint.c + +Abstract: + + Basic Ascii AvSPrintf() function named VSPrint(). VSPrint() enables very + simple implemenation of SPrint() and Print() to support debug. + + You can not Print more than EFI_DRIVER_LIB_MAX_PRINT_BUFFER characters at a + time. This makes the implementation very simple. + + VSPrint, Print, SPrint format specification has the follwoing form + + %[flags][width]type + + flags: + '-' - Left justify + '+' - Prefix a sign + ' ' - Prefix a blank + ',' - Place commas in numberss + '0' - Prefix for width with zeros + 'l' - UINT64 + 'L' - UINT64 + + width: + '*' - Get width from a UINTN argumnet from the argument list + Decimal number that represents width of print + + type: + 'X' - argument is a UINTN hex number, prefix '0' + 'x' - argument is a hex number + 'd' - argument is a decimal number + 'a' - argument is an ascii string + 'S','s' - argument is an Unicode string + 'g' - argument is a pointer to an EFI_GUID + 't' - argument is a pointer to an EFI_TIME structure + 'c' - argument is an ascii character + 'r' - argument is EFI_STATUS + '%' - Print a % + +--*/ + +#include "TianoCommon.h" +#include "PrintWidth.h" +#include "EfiPrintLib.h" +#include "Print.h" + + +UINTN +USPrint ( + OUT CHAR16 *Buffer, + IN UINTN BufferSize, + IN CONST CHAR16 *Format, + ... + ) +/*++ + +Routine Description: + + Process format and place the results in Buffer for wide chars. + +Arguments: + + Buffer - Wide char buffer to print the results of the parsing of Format into. + BufferSize - Maximum number of characters to put into buffer. + Format - Format string + ... - Vararg list consumed by processing Format. + +Returns: + + Number of characters printed. + +--*/ +{ + UINTN Return; + VA_LIST Marker; + + VA_START (Marker, Format); + Return = UnicodeVSPrint (Buffer, BufferSize, Format, Marker); + VA_END (Marker); + + return Return; +} + + +UINTN +UvSPrint ( + OUT CHAR16 *Buffer, + IN UINTN BufferSize, + IN CONST CHAR16 *FormatString, + IN VA_LIST Marker + ) +/*++ + +Routine Description: + + Internal implementation of USPrint. + Process format and place the results in Buffer for wide chars. + +Arguments: + + Buffer - Wide char buffer to print the results of the parsing of Format into. + BufferSize - Maximum number of characters to put into buffer. + FormatString - Format string + Marker - Vararg list consumed by processing Format. + +Returns: + + Number of characters printed. + +--*/ +{ + UINTN Index; + CHAR8 AsciiFormat[EFI_DRIVER_LIB_MAX_PRINT_BUFFER]; + CHAR8 AsciiResult[EFI_DRIVER_LIB_MAX_PRINT_BUFFER]; + + for (Index = 0; Index < EFI_DRIVER_LIB_MAX_PRINT_BUFFER && FormatString[Index] != '\0'; Index++) { + AsciiFormat[Index] = (CHAR8) FormatString[Index]; + } + + AsciiFormat[Index] = '\0'; + + Index = VSPrint (AsciiResult, EFI_DRIVER_LIB_MAX_PRINT_BUFFER, AsciiFormat, Marker); + + for (Index = 0; (Index < (BufferSize - 1)) && AsciiResult[Index] != '\0'; Index++) { + Buffer[Index] = (CHAR16) AsciiResult[Index]; + } + + Buffer[Index] = '\0'; + + return Index++; +} diff --git a/EDK/Foundation/Library/Dxe/Graphics/Graphics.c b/EDK/Foundation/Library/Dxe/Graphics/Graphics.c new file mode 100644 index 0000000..5801d33 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/Graphics/Graphics.c @@ -0,0 +1,617 @@ +/*++ + +Copyright (c) 2004 - 2011, 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: + + Graphics.c + +Abstract: + + Support for Basic Graphics operations. + + BugBug: Currently *.BMP files are supported. This will be replaced + when Tiano graphics format is supported. + +--*/ + +#include "Tiano.h" +#include "EfiDriverLib.h" +#include "GraphicsLib.h" + + +EFI_STATUS +GetGraphicsBitMapFromFV ( + IN EFI_GUID *FileNameGuid, + OUT VOID **Image, + OUT UINTN *ImageSize + ) +/*++ + +Routine Description: + + Return the graphics image file named FileNameGuid into Image and return it's + size in ImageSize. All Firmware Volumes (FV) in the system are searched for the + file name. + +Arguments: + + FileNameGuid - File Name of graphics file in the FV(s). + + Image - Pointer to pointer to return graphics image. If NULL, a + buffer will be allocated. + + ImageSize - Size of the graphics Image in bytes. Zero if no image found. + + +Returns: + + EFI_SUCCESS - Image and ImageSize are valid. + EFI_BUFFER_TOO_SMALL - Image not big enough. ImageSize has required size + EFI_NOT_FOUND - FileNameGuid not found + +--*/ +{ + EFI_STATUS Status; + UINTN FvProtocolCount; + EFI_HANDLE *FvHandles; +#if (PI_SPECIFICATION_VERSION < 0x00010000) //;;## ...AMI_OVERRIDE... Support PI1.x + EFI_FIRMWARE_VOLUME_PROTOCOL *Fv; +#else + EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv; +#endif + UINTN Index; + UINT32 AuthenticationStatus; + + Status = gBS->LocateHandleBuffer ( + ByProtocol, + #if (PI_SPECIFICATION_VERSION < 0x00010000) //;;## ...AMI_OVERRIDE... Support PI1.x + &gEfiFirmwareVolumeProtocolGuid, + #else + &gEfiFirmwareVolume2ProtocolGuid, + #endif + NULL, + &FvProtocolCount, + &FvHandles + ); + if (EFI_ERROR (Status)) { + return EFI_NOT_FOUND; + } + + for (Index = 0; Index < FvProtocolCount; Index++) { + Status = gBS->HandleProtocol ( + FvHandles[Index], + #if (PI_SPECIFICATION_VERSION < 0x00010000) //;;## ...AMI_OVERRIDE... Support PI1.x + &gEfiFirmwareVolumeProtocolGuid, + #else + &gEfiFirmwareVolume2ProtocolGuid, + #endif + (VOID **) &Fv + ); + + // + // Assuming Image and ImageSize are correct on input. + // + Status = Fv->ReadSection ( + Fv, + &gEfiDefaultBmpLogoGuid, + EFI_SECTION_RAW, + 0, + Image, + ImageSize, + &AuthenticationStatus + ); + if (!EFI_ERROR (Status)) { + gBS->FreePool (FvHandles); + return EFI_SUCCESS; + } else if (Status == EFI_BUFFER_TOO_SMALL) { + // + // ImageSize updated to needed size so return + // + gBS->FreePool (FvHandles); + return EFI_BUFFER_TOO_SMALL; + } + } + + gBS->FreePool (FvHandles); + return EFI_NOT_FOUND; +} + + +EFI_STATUS +ConvertBmpToGopBlt ( + IN VOID *BmpImage, + IN UINTN BmpImageSize, + IN OUT VOID **GopBlt, + IN OUT UINTN *GopBltSize, + OUT UINTN *PixelHeight, + OUT UINTN *PixelWidth + ) +/*++ + +Routine Description: + + Convert a *.BMP graphics image to a GOP/UGA blt buffer. If a NULL Blt buffer + is passed in a GopBlt buffer will be allocated by this routine. If a GopBlt + buffer is passed in it will be used if it is big enough. + +Arguments: + + BmpImage - Pointer to BMP file + + BmpImageSize - Number of bytes in BmpImage + + GopBlt - Buffer containing GOP version of BmpImage. + + GopBltSize - Size of GopBlt in bytes. + + PixelHeight - Height of GopBlt/BmpImage in pixels + + PixelWidth - Width of GopBlt/BmpImage in pixels + + +Returns: + + EFI_SUCCESS - GopBlt and GopBltSize are returned. + EFI_UNSUPPORTED - BmpImage is not a valid *.BMP image + EFI_BUFFER_TOO_SMALL - The passed in GopBlt buffer is not big enough. + GopBltSize will contain the required size. + EFI_OUT_OF_RESOURCES - No enough buffer to allocate + +--*/ +{ + UINT8 *Image; + UINT8 *ImageHeader; + BMP_IMAGE_HEADER *BmpHeader; + BMP_COLOR_MAP *BmpColorMap; + EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer; + EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Blt; + UINT64 BltBufferSize; + UINTN Index; + UINTN Height; + UINTN Width; + UINTN ImageIndex; + BOOLEAN IsAllocated; + + BmpHeader = (BMP_IMAGE_HEADER *) BmpImage; + if (BmpHeader->CharB != 'B' || BmpHeader->CharM != 'M') { + return EFI_UNSUPPORTED; + } + + if (BmpHeader->CompressionType != 0) { + return EFI_UNSUPPORTED; + } + + // + // Calculate Color Map offset in the image. + // + Image = BmpImage; + BmpColorMap = (BMP_COLOR_MAP *) (Image + sizeof (BMP_IMAGE_HEADER)); + + // + // Calculate graphics image data address in the image + // + Image = ((UINT8 *) BmpImage) + BmpHeader->ImageOffset; + ImageHeader = Image; + + BltBufferSize = MultU64x32 ((UINT64) BmpHeader->PixelWidth, BmpHeader->PixelHeight); + // + // Ensure the BltBufferSize * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL) doesn't overflow + // + if (BltBufferSize > DivU64x32 ((UINTN) ~0, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL), NULL)) { + return EFI_UNSUPPORTED; + } + BltBufferSize = MultU64x32 (BltBufferSize, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)); + + IsAllocated = FALSE; + if (*GopBlt == NULL) { + *GopBltSize = (UINTN) BltBufferSize; + *GopBlt = EfiLibAllocatePool (*GopBltSize); + IsAllocated = TRUE; + if (*GopBlt == NULL) { + return EFI_OUT_OF_RESOURCES; + } + } else { + if (*GopBltSize < (UINTN) BltBufferSize) { + *GopBltSize = (UINTN) BltBufferSize; + return EFI_BUFFER_TOO_SMALL; + } + } + + *PixelWidth = BmpHeader->PixelWidth; + *PixelHeight = BmpHeader->PixelHeight; + + // + // Convert image from BMP to Blt buffer format + // + BltBuffer = *GopBlt; + for (Height = 0; Height < BmpHeader->PixelHeight; Height++) { + Blt = &BltBuffer[(BmpHeader->PixelHeight - Height - 1) * BmpHeader->PixelWidth]; + for (Width = 0; Width < BmpHeader->PixelWidth; Width++, Image++, Blt++) { + switch (BmpHeader->BitPerPixel) { + case 1: + // + // Convert 1bit BMP to 24-bit color + // + for (Index = 0; Index < 8 && Width < BmpHeader->PixelWidth; Index++) { + Blt->Red = BmpColorMap[((*Image) >> (7 - Index)) & 0x1].Red; + Blt->Green = BmpColorMap[((*Image) >> (7 - Index)) & 0x1].Green; + Blt->Blue = BmpColorMap[((*Image) >> (7 - Index)) & 0x1].Blue; + Blt++; + Width++; + } + + Blt --; + Width --; + break; + + case 4: + // + // Convert BMP Palette to 24-bit color + // + Index = (*Image) >> 4; + Blt->Red = BmpColorMap[Index].Red; + Blt->Green = BmpColorMap[Index].Green; + Blt->Blue = BmpColorMap[Index].Blue; + if (Width < (BmpHeader->PixelWidth - 1)) { + Blt++; + Width++; + Index = (*Image) & 0x0f; + Blt->Red = BmpColorMap[Index].Red; + Blt->Green = BmpColorMap[Index].Green; + Blt->Blue = BmpColorMap[Index].Blue; + } + break; + + case 8: + // + // Convert BMP Palette to 24-bit color + // + Blt->Red = BmpColorMap[*Image].Red; + Blt->Green = BmpColorMap[*Image].Green; + Blt->Blue = BmpColorMap[*Image].Blue; + break; + + case 24: + Blt->Blue = *Image++; + Blt->Green = *Image++; + Blt->Red = *Image; + break; + + default: + if (IsAllocated) { + gBS->FreePool (*GopBlt); + *GopBlt = NULL; + } + return EFI_UNSUPPORTED; + break; + }; + + } + + ImageIndex = (UINTN) (Image - ImageHeader); + if ((ImageIndex % 4) != 0) { + // + // Bmp Image starts each row on a 32-bit boundary! + // + Image = Image + (4 - (ImageIndex % 4)); + } + } + + return EFI_SUCCESS; +} + + +EFI_STATUS +LockKeyboards ( + IN CHAR16 *Password + ) +/*++ + +Routine Description: + Use Console Control Protocol to lock the Console In Spliter virtual handle. + This is the ConInHandle and ConIn handle in the EFI system table. All key + presses will be ignored until the Password is typed in. The only way to + disable the password is to type it in to a ConIn device. + +Arguments: + Password - Password used to lock ConIn device + + +Returns: + + EFI_SUCCESS - ConsoleControl has been flipped to graphics and logo + displayed. + EFI_UNSUPPORTED - Logo not found + +--*/ +{ + EFI_STATUS Status; + EFI_CONSOLE_CONTROL_PROTOCOL *ConsoleControl; + + Status = gBS->LocateProtocol (&gEfiConsoleControlProtocolGuid, NULL, (VOID**)&ConsoleControl); + if (EFI_ERROR (Status)) { + return EFI_UNSUPPORTED; + } + + Status = ConsoleControl->LockStdIn (ConsoleControl, Password); + return Status; +} + + +EFI_STATUS +EnableQuietBoot ( + IN EFI_GUID *LogoFile + ) +/*++ + +Routine Description: + + Use Console Control to turn off GOP/UGA based Simple Text Out consoles from going + to the GOP/UGA device. Put up LogoFile on every GOP/UGA device that is a console + +Arguments: + + LogoFile - File name of logo to display on the center of the screen. + + +Returns: + + EFI_SUCCESS - ConsoleControl has been flipped to graphics and logo + displayed. + EFI_UNSUPPORTED - Logo not found + +--*/ +{ + EFI_STATUS Status; + EFI_CONSOLE_CONTROL_PROTOCOL *ConsoleControl; + EFI_OEM_BADGING_PROTOCOL *Badging; + UINT32 SizeOfX; + UINT32 SizeOfY; + INTN DestX; + INTN DestY; + UINT8 *ImageData; + UINTN ImageSize; + UINTN BltSize; + UINT32 Instance; + EFI_BADGING_FORMAT Format; + EFI_BADGING_DISPLAY_ATTRIBUTE Attribute; + UINTN CoordinateX; + UINTN CoordinateY; + UINTN Height; + UINTN Width; + EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Blt; + EFI_UGA_DRAW_PROTOCOL *UgaDraw; + UINT32 ColorDepth; + UINT32 RefreshRate; + EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput; + + Status = gBS->LocateProtocol (&gEfiConsoleControlProtocolGuid, NULL, (VOID**)&ConsoleControl); + if (EFI_ERROR (Status)) { + return EFI_UNSUPPORTED; + } + + UgaDraw = NULL; + // + // Try to open GOP first + // + Status = gBS->HandleProtocol (gST->ConsoleOutHandle, &gEfiGraphicsOutputProtocolGuid, (VOID**)&GraphicsOutput); + if (EFI_ERROR (Status)) { + GraphicsOutput = NULL; + // + // Open GOP failed, try to open UGA + // + Status = gBS->HandleProtocol (gST->ConsoleOutHandle, &gEfiUgaDrawProtocolGuid, (VOID**)&UgaDraw); + if (EFI_ERROR (Status)) { + return EFI_UNSUPPORTED; + } + } + + Badging = NULL; + Status = gBS->LocateProtocol (&gEfiOEMBadgingProtocolGuid, NULL, (VOID**)&Badging); + + ConsoleControl->SetMode (ConsoleControl, EfiConsoleControlScreenGraphics); + + if (GraphicsOutput != NULL) { + SizeOfX = GraphicsOutput->Mode->Info->HorizontalResolution; + SizeOfY = GraphicsOutput->Mode->Info->VerticalResolution; + } else { + if (UgaDraw) { + Status = UgaDraw->GetMode (UgaDraw, &SizeOfX, &SizeOfY, &ColorDepth, &RefreshRate); + if (EFI_ERROR (Status)) { + return EFI_UNSUPPORTED; + } + } else { + return EFI_UNSUPPORTED; + } + } + + Instance = 0; + while (1) { + ImageData = NULL; + ImageSize = 0; + + if (Badging != NULL) { + Status = Badging->GetImage ( + Badging, + &Instance, + &Format, + &ImageData, + &ImageSize, + &Attribute, + &CoordinateX, + &CoordinateY + ); + if (EFI_ERROR (Status)) { + return Status; + } + + // + // Currently only support BMP format + // + if (Format != EfiBadgingFormatBMP) { + gBS->FreePool (ImageData); + continue; + } + } else { + Status = GetGraphicsBitMapFromFV (LogoFile, &ImageData, &ImageSize); + if (EFI_ERROR (Status)) { + return EFI_UNSUPPORTED; + } + + CoordinateX = 0; + CoordinateY = 0; + Attribute = EfiBadgingDisplayAttributeCenter; + } + + Blt = NULL; + Status = ConvertBmpToGopBlt ( + ImageData, + ImageSize, + (VOID**)&Blt, + &BltSize, + &Height, + &Width + ); + if (EFI_ERROR (Status)) { + gBS->FreePool (ImageData); + if (Badging == NULL) { + return Status; + } else { + continue; + } + } + + switch (Attribute) { + case EfiBadgingDisplayAttributeLeftTop: + DestX = CoordinateX; + DestY = CoordinateY; + break; + + case EfiBadgingDisplayAttributeCenterTop: + DestX = (SizeOfX - Width) / 2; + DestY = CoordinateY; + break; + + case EfiBadgingDisplayAttributeRightTop: + DestX = (SizeOfX - Width - CoordinateX); + DestY = CoordinateY;; + break; + + case EfiBadgingDisplayAttributeCenterRight: + DestX = (SizeOfX - Width - CoordinateX); + DestY = (SizeOfY - Height) / 2; + break; + + case EfiBadgingDisplayAttributeRightBottom: + DestX = (SizeOfX - Width - CoordinateX); + DestY = (SizeOfY - Height - CoordinateY); + break; + + case EfiBadgingDisplayAttributeCenterBottom: + DestX = (SizeOfX - Width) / 2; + DestY = (SizeOfY - Height - CoordinateY); + break; + + case EfiBadgingDisplayAttributeLeftBottom: + DestX = CoordinateX; + DestY = (SizeOfY - Height - CoordinateY); + break; + + case EfiBadgingDisplayAttributeCenterLeft: + DestX = CoordinateX; + DestY = (SizeOfY - Height) / 2; + break; + + case EfiBadgingDisplayAttributeCenter: + DestX = (SizeOfX - Width) / 2; + DestY = (SizeOfY - Height) / 2; + break; + + default: + DestX = CoordinateX; + DestY = CoordinateY; + break; + } + + if ((DestX >= 0) && (DestY >= 0)) { + if (GraphicsOutput != NULL) { + Status = GraphicsOutput->Blt ( + GraphicsOutput, + Blt, + EfiBltBufferToVideo, + 0, + 0, + (UINTN) DestX, + (UINTN) DestY, + Width, + Height, + Width * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL) + ); + } else { + Status = UgaDraw->Blt ( + UgaDraw, + (EFI_UGA_PIXEL *) Blt, + EfiUgaBltBufferToVideo, + 0, + 0, + (UINTN) DestX, + (UINTN) DestY, + Width, + Height, + Width * sizeof (EFI_UGA_PIXEL) + ); + } + } + + gBS->FreePool (ImageData); + gBS->FreePool (Blt); + + if (Badging == NULL) { + break; + } + } + + return Status; +} + + +EFI_STATUS +DisableQuietBoot ( + VOID + ) +/*++ + +Routine Description: + + Use Console Control to turn on GOP/UGA based Simple Text Out consoles. The GOP/UGA + Simple Text Out screens will now be synced up with all non GOP/UGA output devices + +Arguments: + + NONE + +Returns: + + EFI_SUCCESS - GOP/UGA devices are back in text mode and synced up. + EFI_UNSUPPORTED - Logo not found + +--*/ +{ + EFI_STATUS Status; + EFI_CONSOLE_CONTROL_PROTOCOL *ConsoleControl; + + Status = gBS->LocateProtocol (&gEfiConsoleControlProtocolGuid, NULL, (VOID**)&ConsoleControl); + if (EFI_ERROR (Status)) { + return EFI_UNSUPPORTED; + } + + return ConsoleControl->SetMode (ConsoleControl, EfiConsoleControlScreenText); +} diff --git a/EDK/Foundation/Library/Dxe/Graphics/Graphics.inf b/EDK/Foundation/Library/Dxe/Graphics/Graphics.inf new file mode 100644 index 0000000..a405356 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/Graphics/Graphics.inf @@ -0,0 +1,51 @@ +#/*++ +# +# Copyright (c) 2004, 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: +# +# Graphics.inf +# +# Abstract: +# +# Component description file. +# +#--*/ + +[defines] +BASE_NAME = Graphics +COMPONENT_TYPE = LIBRARY + +[sources.common] + Graphics.c + Print.c + Print.h + Unicode\PrintWidth.h + Unicode\Sprint.c + + +[includes.common] + $(EDK_SOURCE)\Foundation\Framework + $(EDK_SOURCE)\Foundation + $(EDK_SOURCE)\Foundation\Efi + . + $(EDK_SOURCE)\Foundation\Include + $(EDK_SOURCE)\Foundation\Efi\Include + $(EDK_SOURCE)\Foundation\Framework\Include + $(EDK_SOURCE)\Foundation\Include\IndustryStandard + $(EDK_SOURCE)\Foundation\Library\Dxe\Include + $(EDK_SOURCE)\Foundation\Library\Dxe\Graphics\Unicode + $(EDK_SOURCE)\Foundation\Core\Dxe + +[libraries.common] + EfiDriverLib + +[nmake.common] + C_STD_INCLUDE= diff --git a/EDK/Foundation/Library/Dxe/Graphics/GraphicsLib.cif b/EDK/Foundation/Library/Dxe/Graphics/GraphicsLib.cif new file mode 100644 index 0000000..cdb2c8c --- /dev/null +++ b/EDK/Foundation/Library/Dxe/Graphics/GraphicsLib.cif @@ -0,0 +1,18 @@ + + name = "GraphicsLib" + category = ModulePart + LocalRoot = "EDK\Foundation\Library\Dxe\Graphics\" + RefName = "GraphicsLib" +[files] +"GraphicsLib.sdl" +"GraphicsLib.mak" +"Graphics.c" +"Print.c" +"Print.h" +"Graphics.inf" +[parts] +"GraphicsAscii" +"GraphicsUnicode" +"GraphicsAscii" +"GraphicsUnicode" + diff --git a/EDK/Foundation/Library/Dxe/Graphics/GraphicsLib.mak b/EDK/Foundation/Library/Dxe/Graphics/GraphicsLib.mak new file mode 100644 index 0000000..0980401 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/Graphics/GraphicsLib.mak @@ -0,0 +1,70 @@ +#********************************************************************** +#********************************************************************** +#** ** +#** (C)Copyright 1985-2009, American Megatrends, Inc. ** +#** ** +#** All Rights Reserved. ** +#** ** +#** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +#** ** +#** Phone: (770)-246-8600 ** +#** ** +#********************************************************************** +#********************************************************************** + +#********************************************************************** +# $Header: /Alaska/SOURCE/Modules/SharkBayRefCodes/IntelEDK/GraphicsLib/GraphicsLib.mak 1 1/20/12 4:07a Jeffch $ +# +# $Revision: 1 $ +# +# $Date: 1/20/12 4:07a $ +#********************************************************************** +# Revision History +# ---------------- +# $Log: /Alaska/SOURCE/Modules/SharkBayRefCodes/IntelEDK/GraphicsLib/GraphicsLib.mak $ +# +# 1 1/20/12 4:07a Jeffch +# Create Intel EDK 1117 Patch 7. +# +# 1 9/27/11 6:31a Wesleychen +# Intel EDK initially releases. +# +# 2 9/02/09 3:49a Iminglin +# EIP24919 +# +#********************************************************************** +# +# +# Name: GraphicsLib.mak +# +# Description: +# +# +#********************************************************************** +$(GRAPHICSLIB) : GraphicsLib + +$(BUILD_DIR)\GraphicsLib.lib : GraphicsLib + +GraphicsLib : $(BUILD_DIR)\GraphicsLib.mak GraphicsLibBin + +$(BUILD_DIR)\GraphicsLib.mak : $(GraphicsLib_DIR)\$(@B).cif $(GraphicsLib_DIR)\$(@B).mak $(BUILD_RULES) $(GraphicsLib_DIR)\Unicode\GraphicsUnicode.cif + $(CIF2MAK) $(GraphicsLib_DIR)\$(@B).cif $(CIF2MAK_DEFAULTS) $(GraphicsLib_DIR)\Unicode\GraphicsUnicode.cif + +GraphicsLibBin : $(EFIDRIVERLIB) + $(MAKE) /$(MAKEFLAGS) $(EDK_DEFAULTS)\ + /f $(BUILD_DIR)\GraphicsLib.mak all\ + "MY_INCLUDES=/I$(GraphicsLib_DIR) /I$(GraphicsLib_DIR)\Unicode"\ + TYPE=LIBRARY \ +#********************************************************************** +#********************************************************************** +#** ** +#** (C)Copyright 1985-2009, American Megatrends, Inc. ** +#** ** +#** All Rights Reserved. ** +#** ** +#** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +#** ** +#** Phone: (770)-246-8600 ** +#** ** +#********************************************************************** +#********************************************************************** \ No newline at end of file diff --git a/EDK/Foundation/Library/Dxe/Graphics/GraphicsLib.sdl b/EDK/Foundation/Library/Dxe/Graphics/GraphicsLib.sdl new file mode 100644 index 0000000..45b0fcb --- /dev/null +++ b/EDK/Foundation/Library/Dxe/Graphics/GraphicsLib.sdl @@ -0,0 +1,26 @@ +TOKEN + Name = "GraphicsLib_SUPPORT" + Value = "1" + Help = "Main switch to enable GraphicsLib support in Project" + TokenType = Boolean + TargetEQU = Yes + TargetMAK = Yes + Master = Yes +End + +TOKEN + Name = "GRAPHICSLIB" + Value = "$(BUILD_DIR)\GraphicsLib.lib" + TokenType = Expression + TargetMAK = Yes +End + +PATH + Name = "GraphicsLib_DIR" +End + +MODULE + Help = "Includes GraphicsLib.mak to Project" + File = "GraphicsLib.mak" +End + diff --git a/EDK/Foundation/Library/Dxe/Graphics/Print.c b/EDK/Foundation/Library/Dxe/Graphics/Print.c new file mode 100644 index 0000000..5e22d54 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/Graphics/Print.c @@ -0,0 +1,973 @@ +/*++ + +Copyright (c) 2004 - 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: + + Print.c + +Abstract: + + Basic Ascii AvSPrintf() function named VSPrint(). VSPrint() enables very + simple implemenation of SPrint() and Print() to support debug. + + You can not Print more than EFI_DRIVER_LIB_MAX_PRINT_BUFFER characters at a + time. This makes the implementation very simple. + + VSPrint, Print, SPrint format specification has the follwoing form + + %[flags][width]type + + flags: + '-' - Left justify + '+' - Prefix a sign + ' ' - Prefix a blank + ',' - Place commas in numberss + '0' - Prefix for width with zeros + 'l' - UINT64 + 'L' - UINT64 + + width: + '*' - Get width from a UINTN argumnet from the argument list + Decimal number that represents width of print + + type: + 'X' - argument is a UINTN hex number, prefix '0' + 'x' - argument is a hex number + 'd' - argument is a decimal number + 'a' - argument is an ascii string + 'S','s' - argument is an Unicode string + 'g' - argument is a pointer to an EFI_GUID + 't' - argument is a pointer to an EFI_TIME structure + 'c' - argument is an ascii character + 'r' - argument is EFI_STATUS + '%' - Print a % + +--*/ + +#include "Tiano.h" +#include "EfiDriverLib.h" +#include "TianoCommon.h" +#include "EfiCommonLib.h" +#include "PrintWidth.h" +#include "EfiPrintLib.h" +#include "Print.h" +#if (EFI_SPECIFICATION_VERSION >= 0x0002000A) +#include EFI_PROTOCOL_DEFINITION (HiiFont) +#else +#include EFI_PROTOCOL_DEFINITION (Hii) +#endif + +STATIC +CHAR_W * +GetFlagsAndWidth ( + IN CHAR_W *Format, + OUT UINTN *Flags, + OUT UINTN *Width, + IN OUT VA_LIST *Marker + ); + +STATIC +UINTN +GuidToString ( + IN EFI_GUID *Guid, + IN OUT CHAR_W *Buffer, + IN UINTN BufferSize + ); + +STATIC +UINTN +TimeToString ( + IN EFI_TIME *Time, + IN OUT CHAR_W *Buffer, + IN UINTN BufferSize + ); + +STATIC +UINTN +EfiStatusToString ( + IN EFI_STATUS Status, + OUT CHAR_W *Buffer, + IN UINTN BufferSize + ); + +static EFI_GRAPHICS_OUTPUT_BLT_PIXEL mEfiColors[16] = { + 0x00, 0x00, 0x00, 0x00, + 0x98, 0x00, 0x00, 0x00, + 0x00, 0x98, 0x00, 0x00, + 0x98, 0x98, 0x00, 0x00, + 0x00, 0x00, 0x98, 0x00, + 0x98, 0x00, 0x98, 0x00, + 0x00, 0x98, 0x98, 0x00, + 0x98, 0x98, 0x98, 0x00, + 0x10, 0x10, 0x10, 0x00, + 0xff, 0x10, 0x10, 0x00, + 0x10, 0xff, 0x10, 0x00, + 0xff, 0xff, 0x10, 0x00, + 0x10, 0x10, 0xff, 0x00, + 0xf0, 0x10, 0xff, 0x00, + 0x10, 0xff, 0xff, 0x00, + 0xff, 0xff, 0xff, 0x00, +}; + + +UINTN +_IPrint ( + IN EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput, + IN EFI_UGA_DRAW_PROTOCOL *UgaDraw, + IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *Sto, + IN UINTN X, + IN UINTN Y, + IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Foreground, + IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Background, + IN CHAR16 *fmt, + IN VA_LIST args + ) +/*++ + +Routine Description: + + Display string worker for: Print, PrintAt, IPrint, IPrintAt + +Arguments: + + GraphicsOutput - Graphics output protocol interface + + UgaDraw - UGA draw protocol interface + + Sto - Simple text out protocol interface + + X - X coordinate to start printing + + Y - Y coordinate to start printing + + Foreground - Foreground color + + Background - Background color + + fmt - Format string + + args - Print arguments + +Returns: + + EFI_SUCCESS - success + EFI_OUT_OF_RESOURCES - out of resources + +--*/ +{ + VOID *Buffer; + EFI_STATUS Status; + UINTN Index; + CHAR16 *UnicodeWeight; + UINT32 HorizontalResolution; + UINT32 VerticalResolution; + UINT32 ColorDepth; + UINT32 RefreshRate; + UINTN BufferLen; + UINTN LineBufferLen; +#if (EFI_SPECIFICATION_VERSION >= 0x0002000A) + EFI_HII_FONT_PROTOCOL *HiiFont; + EFI_IMAGE_OUTPUT *Blt; + EFI_FONT_DISPLAY_INFO *FontInfo; +#else + EFI_HII_PROTOCOL *Hii; + UINT16 GlyphWidth; + UINT32 GlyphStatus; + UINT16 StringIndex; + EFI_NARROW_GLYPH *Glyph; + EFI_GRAPHICS_OUTPUT_BLT_PIXEL *LineBuffer; +#endif + + // + // For now, allocate an arbitrarily long buffer + // + Buffer = EfiLibAllocateZeroPool (0x10000); + if (Buffer == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + if (GraphicsOutput != NULL) { + HorizontalResolution = GraphicsOutput->Mode->Info->HorizontalResolution; + VerticalResolution = GraphicsOutput->Mode->Info->VerticalResolution; + } else { + UgaDraw->GetMode (UgaDraw, &HorizontalResolution, &VerticalResolution, &ColorDepth, &RefreshRate); + } + ASSERT ((HorizontalResolution != 0) && (VerticalResolution !=0)); + +#if (EFI_SPECIFICATION_VERSION >= 0x0002000A) + Blt = NULL; + FontInfo = NULL; + ASSERT (GraphicsOutput != NULL); + Status = gBS->LocateProtocol (&gEfiHiiFontProtocolGuid, NULL, (VOID **) &HiiFont); + if (EFI_ERROR (Status)) { + goto Error; + } +#else + LineBuffer = NULL; + Status = gBS->LocateProtocol (&gEfiHiiProtocolGuid, NULL, (VOID**)&Hii); + if (EFI_ERROR (Status)) { + goto Error; + } + LineBufferLen = sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL) * HorizontalResolution * GLYPH_HEIGHT; + LineBuffer = EfiLibAllocatePool (LineBufferLen); + if (LineBuffer == NULL) { + Status = EFI_OUT_OF_RESOURCES; + goto Error; + } +#endif + + VSPrint (Buffer, 0x10000, fmt, args); + + UnicodeWeight = (CHAR16 *) Buffer; + + for (Index = 0; UnicodeWeight[Index] != 0; Index++) { + if (UnicodeWeight[Index] == CHAR_BACKSPACE || + UnicodeWeight[Index] == CHAR_LINEFEED || + UnicodeWeight[Index] == CHAR_CARRIAGE_RETURN) { + UnicodeWeight[Index] = 0; + } + } + + BufferLen = EfiStrLen (Buffer); + + +#if (EFI_SPECIFICATION_VERSION >= 0x0002000A) + LineBufferLen = sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL) * HorizontalResolution * EFI_GLYPH_HEIGHT; + if (EFI_GLYPH_WIDTH * EFI_GLYPH_HEIGHT * sizeof(EFI_GRAPHICS_OUTPUT_BLT_PIXEL) * BufferLen > LineBufferLen) { + Status = EFI_INVALID_PARAMETER; + goto Error; + } + + Blt = (EFI_IMAGE_OUTPUT *) EfiLibAllocateZeroPool (sizeof (EFI_IMAGE_OUTPUT)); + if (Blt == NULL) { + Status = EFI_OUT_OF_RESOURCES; + goto Error; + } + + Blt->Width = (UINT16) (HorizontalResolution); + Blt->Height = (UINT16) (VerticalResolution); + Blt->Image.Screen = GraphicsOutput; + + FontInfo = (EFI_FONT_DISPLAY_INFO *) EfiLibAllocateZeroPool (sizeof (EFI_FONT_DISPLAY_INFO)); + if (FontInfo == NULL) { + Status = EFI_OUT_OF_RESOURCES; + goto Error; + } + if (Foreground != NULL) { + EfiCopyMem (&FontInfo->ForegroundColor, Foreground, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)); + } else { + EfiCopyMem ( + &FontInfo->ForegroundColor, + &mEfiColors[Sto->Mode->Attribute & 0x0f], + sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL) + ); + } + if (Background != NULL) { + EfiCopyMem (&FontInfo->BackgroundColor, Background, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)); + } else { + EfiCopyMem ( + &FontInfo->BackgroundColor, + &mEfiColors[Sto->Mode->Attribute >> 4], + sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL) + ); + } + + Status = HiiFont->StringToImage ( + HiiFont, + EFI_HII_IGNORE_IF_NO_GLYPH | EFI_HII_DIRECT_TO_SCREEN, + Buffer, + FontInfo, + &Blt, + X, + Y, + NULL, + NULL, + NULL + ); + +#else + GlyphStatus = 0; + + if (GLYPH_WIDTH * GLYPH_HEIGHT * sizeof(EFI_GRAPHICS_OUTPUT_BLT_PIXEL) * BufferLen > LineBufferLen) { + Status = EFI_INVALID_PARAMETER; + goto Error; + } + + for (Index = 0; Index < BufferLen; Index++) { + StringIndex = (UINT16) Index; + Status = Hii->GetGlyph (Hii, UnicodeWeight, &StringIndex, (UINT8 **) &Glyph, &GlyphWidth, &GlyphStatus); + if (EFI_ERROR (Status)) { + goto Error; + } + + if (Foreground == NULL || Background == NULL) { + Status = Hii->GlyphToBlt ( + Hii, + (UINT8 *) Glyph, + mEfiColors[Sto->Mode->Attribute & 0x0f], + mEfiColors[Sto->Mode->Attribute >> 4], + BufferLen, + GlyphWidth, + GLYPH_HEIGHT, + &LineBuffer[Index * GLYPH_WIDTH] + ); + } else { + Status = Hii->GlyphToBlt ( + Hii, + (UINT8 *) Glyph, + *Foreground, + *Background, + BufferLen, + GlyphWidth, + GLYPH_HEIGHT, + &LineBuffer[Index * GLYPH_WIDTH] + ); + } + } + + // + // Blt a character to the screen + // + if (GraphicsOutput != NULL) { + Status = GraphicsOutput->Blt ( + GraphicsOutput, + LineBuffer, + EfiBltBufferToVideo, + 0, + 0, + X, + Y, + GLYPH_WIDTH * BufferLen, + GLYPH_HEIGHT, + GLYPH_WIDTH * BufferLen * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL) + ); + } else { + Status = UgaDraw->Blt ( + UgaDraw, + (EFI_UGA_PIXEL *) LineBuffer, + EfiUgaBltBufferToVideo, + 0, + 0, + X, + Y, + GLYPH_WIDTH * BufferLen, + GLYPH_HEIGHT, + GLYPH_WIDTH * BufferLen * sizeof (EFI_UGA_PIXEL) + ); + } + +#endif + +Error: +#if (EFI_SPECIFICATION_VERSION >= 0x0002000A) + EfiLibSafeFreePool (Blt); + EfiLibSafeFreePool (FontInfo); +#else + gBS->FreePool (LineBuffer); +#endif + gBS->FreePool (Buffer); + return Status; +} + + +UINTN +PrintXY ( + IN UINTN X, + IN UINTN Y, + IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *ForeGround, OPTIONAL + IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BackGround, OPTIONAL + IN CHAR_W *Fmt, + ... + ) +/*++ + +Routine Description: + + Prints a formatted unicode string to the default console + +Arguments: + + X - X coordinate to start printing + + Y - Y coordinate to start printing + + ForeGround - Foreground color + + BackGround - Background color + + Fmt - Format string + + ... - Print arguments + +Returns: + + Length of string printed to the console + +--*/ +{ + EFI_HANDLE Handle; + EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput; + EFI_UGA_DRAW_PROTOCOL *UgaDraw; + EFI_SIMPLE_TEXT_OUT_PROTOCOL *Sto; + EFI_STATUS Status; + VA_LIST Args; + + VA_START (Args, Fmt); + + Handle = gST->ConsoleOutHandle; + + Status = gBS->HandleProtocol ( + Handle, + &gEfiGraphicsOutputProtocolGuid, + (VOID**)&GraphicsOutput + ); + + UgaDraw = NULL; + if (EFI_ERROR (Status)) { + GraphicsOutput = NULL; + + Status = gBS->HandleProtocol ( + Handle, + &gEfiUgaDrawProtocolGuid, + (VOID**)&UgaDraw + ); + + if (EFI_ERROR (Status)) { + return Status; + } + } + + Status = gBS->HandleProtocol ( + Handle, + &gEfiSimpleTextOutProtocolGuid, + (VOID**)&Sto + ); + + if (EFI_ERROR (Status)) { + return Status; + } + + return _IPrint (GraphicsOutput, UgaDraw, Sto, X, Y, ForeGround, BackGround, Fmt, Args); +} + + +UINTN +SPrint ( + OUT CHAR_W *Buffer, + IN UINTN BufferSize, + IN CONST CHAR_W *Format, + ... + ) +/*++ + +Routine Description: + + SPrint function to process format and place the results in Buffer. + +Arguments: + + Buffer - Wide char buffer to print the results of the parsing of Format into. + + BufferSize - Maximum number of characters to put into buffer. Zero means no + limit. + + Format - Format string see file header for more details. + + ... - Vararg list consumed by processing Format. + +Returns: + + Number of characters printed. + +--*/ +{ + UINTN Return; + VA_LIST Marker; + + VA_START (Marker, Format); + Return = VSPrint (Buffer, BufferSize, Format, Marker); + VA_END (Marker); + + return Return; +} + +UINTN +EFIAPI +VSPrint ( + OUT CHAR_W *StartOfBuffer, + IN UINTN BufferSize, + IN CONST CHAR_W *FormatString, + IN VA_LIST Marker + ) +/*++ + +Routine Description: + + VSPrint function to process format and place the results in Buffer. Since a + VA_LIST is used this rountine allows the nesting of Vararg routines. Thus + this is the main print working routine + +Arguments: + + StartOfBuffer - Unicode buffer to print the results of the parsing of Format into. + + BufferSize - Maximum number of characters to put into buffer. Zero means + no limit. + + FormatString - Unicode format string see file header for more details. + + Marker - Vararg list consumed by processing Format. + +Returns: + + Number of characters printed. + +--*/ +{ + CHAR16 TempBuffer[CHARACTER_NUMBER_FOR_VALUE]; + CHAR_W *Buffer; + CHAR8 *AsciiStr; + CHAR16 *UnicodeStr; + CHAR_W *Format; + UINTN Index; + UINTN Flags; + UINTN Width; + UINTN Count; + UINTN NumberOfCharacters; + UINTN BufferLeft; + UINT64 Value; + EFI_GUID *TmpGUID; + + // + // Process the format string. Stop if Buffer is over run. + // + + Buffer = StartOfBuffer; + Format = (CHAR_W *) FormatString; + NumberOfCharacters = BufferSize / sizeof (CHAR_W); + BufferLeft = BufferSize; + for (Index = 0; (*Format != '\0') && (Index < NumberOfCharacters - 1); Format++) { + if (*Format != '%') { + if ((*Format == '\n') && (Index < NumberOfCharacters - 2)) { + // + // If carage return add line feed + // + Buffer[Index++] = '\r'; + BufferLeft -= sizeof (CHAR_W); + } + + Buffer[Index++] = *Format; + BufferLeft -= sizeof (CHAR_W); + } else { + + // + // Now it's time to parse what follows after % + // + Format = GetFlagsAndWidth (Format, &Flags, &Width, &Marker); + switch (*Format) { + case 'X': + Flags |= PREFIX_ZERO; + Width = sizeof (UINT64) * 2; + + // + // break skiped on purpose + // + case 'x': + if ((Flags & LONG_TYPE) == LONG_TYPE) { + Value = VA_ARG (Marker, UINT64); + } else { + Value = VA_ARG (Marker, UINTN); + } + + EfiValueToHexStr (TempBuffer, Value, Flags, Width); + UnicodeStr = TempBuffer; + + for (; (*UnicodeStr != '\0') && (Index < NumberOfCharacters - 1); UnicodeStr++) { + Buffer[Index++] = *UnicodeStr; + } + break; + + case 'd': + if ((Flags & LONG_TYPE) == LONG_TYPE) { + Value = VA_ARG (Marker, UINT64); + } else { + Value = (UINTN) VA_ARG (Marker, UINTN); + } + + EfiValueToString (TempBuffer, Value, Flags, Width); + UnicodeStr = TempBuffer; + + for (; (*UnicodeStr != '\0') && (Index < NumberOfCharacters - 1); UnicodeStr++) { + Buffer[Index++] = *UnicodeStr; + } + break; + + case 's': + case 'S': + UnicodeStr = (CHAR16 *) VA_ARG (Marker, CHAR_W *); + if (UnicodeStr == NULL) { + UnicodeStr = L""; + } + + for (Count = 0; (*UnicodeStr != '\0') && (Index < NumberOfCharacters - 1); UnicodeStr++, Count++) { + Buffer[Index++] = *UnicodeStr; + } + // + // Add padding if needed + // + for (; (Count < Width) && (Index < NumberOfCharacters - 1); Count++) { + Buffer[Index++] = ' '; + } + + break; + + case 'a': + AsciiStr = (CHAR8 *) VA_ARG (Marker, CHAR8 *); + if (AsciiStr == NULL) { + AsciiStr = ""; + } + + for (Count = 0; (*AsciiStr != '\0') && (Index < NumberOfCharacters - 1); AsciiStr++, Count++) { + Buffer[Index++] = (CHAR_W) * AsciiStr; + } + // + // Add padding if needed + // + for (; (Count < Width) && (Index < NumberOfCharacters - 1); Count++) { + Buffer[Index++] = ' '; + } + break; + + case 'c': + Buffer[Index++] = (CHAR_W) VA_ARG (Marker, UINTN); + break; + + case 'g': + TmpGUID = VA_ARG (Marker, EFI_GUID *); + if (TmpGUID != NULL) { + Index += GuidToString ( + TmpGUID, + &Buffer[Index], + BufferLeft + ); + } + break; + + case 't': + Index += TimeToString ( + VA_ARG (Marker, EFI_TIME *), + &Buffer[Index], + BufferLeft + ); + break; + + case 'r': + Index += EfiStatusToString ( + VA_ARG (Marker, EFI_STATUS), + &Buffer[Index], + BufferLeft + ); + break; + + case '%': + Buffer[Index++] = *Format; + break; + + default: + // + // if the type is unknown print it to the screen + // + Buffer[Index++] = *Format; + } + + BufferLeft = BufferSize - Index * sizeof (CHAR_W); + } + } + + Buffer[Index++] = '\0'; + + return &Buffer[Index] - StartOfBuffer; +} + +STATIC +CHAR_W * +GetFlagsAndWidth ( + IN CHAR_W *Format, + OUT UINTN *Flags, + OUT UINTN *Width, + IN OUT VA_LIST *Marker + ) +/*++ + +Routine Description: + + VSPrint worker function that parses flag and width information from the + Format string and returns the next index into the Format string that needs + to be parsed. See file headed for details of Flag and Width. + +Arguments: + + Format - Current location in the VSPrint format string. + + Flags - Returns flags + + Width - Returns width of element + + Marker - Vararg list that may be paritally consumed and returned. + +Returns: + + Pointer indexed into the Format string for all the information parsed + by this routine. + +--*/ +{ + UINTN Count; + BOOLEAN Done; + + *Flags = 0; + *Width = 0; + for (Done = FALSE; !Done;) { + Format++; + + switch (*Format) { + + case '-': + *Flags |= LEFT_JUSTIFY; + break; + + case '+': + *Flags |= PREFIX_SIGN; + break; + + case ' ': + *Flags |= PREFIX_BLANK; + break; + + case ',': + *Flags |= COMMA_TYPE; + break; + + case 'L': + case 'l': + *Flags |= LONG_TYPE; + break; + + case '*': + *Width = VA_ARG (*Marker, UINTN); + break; + + case '0': + *Flags |= PREFIX_ZERO; + + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + Count = 0; + do { + Count = (Count * 10) +*Format - '0'; + Format++; + } while ((*Format >= '0') && (*Format <= '9')); + Format--; + *Width = Count; + break; + + default: + Done = TRUE; + } + } + + return Format; +} + +STATIC +UINTN +GuidToString ( + IN EFI_GUID *Guid, + IN CHAR_W *Buffer, + IN UINTN BufferSize + ) +/*++ + +Routine Description: + + VSPrint worker function that prints an EFI_GUID. + +Arguments: + + Guid - Pointer to GUID to print. + + Buffer - Buffe to print Guid into. + + BufferSize - Size of Buffer. + +Returns: + + Number of characters printed. + +--*/ +{ + UINTN Size; + + Size = SPrint ( + Buffer, + BufferSize, + STRING_W ("%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x"), + (UINTN)Guid->Data1, + (UINTN)Guid->Data2, + (UINTN)Guid->Data3, + (UINTN)Guid->Data4[0], + (UINTN)Guid->Data4[1], + (UINTN)Guid->Data4[2], + (UINTN)Guid->Data4[3], + (UINTN)Guid->Data4[4], + (UINTN)Guid->Data4[5], + (UINTN)Guid->Data4[6], + (UINTN)Guid->Data4[7] + ); + + // + // SPrint will null terminate the string. The -1 skips the null + // + return Size - 1; +} + + +STATIC +UINTN +TimeToString ( + IN EFI_TIME *Time, + OUT CHAR_W *Buffer, + IN UINTN BufferSize + ) +/*++ + +Routine Description: + + VSPrint worker function that prints EFI_TIME. + +Arguments: + + Time - Pointer to EFI_TIME sturcture to print. + + Buffer - Buffer to print Time into. + + BufferSize - Size of Buffer. + +Returns: + + Number of characters printed. + +--*/ +{ + UINTN Size; + + Size = SPrint ( + Buffer, + BufferSize, + STRING_W ("%02d/%02d/%04d %02d:%02d"), + (UINTN)Time->Month, + (UINTN)Time->Day, + (UINTN)Time->Year, + (UINTN)Time->Hour, + (UINTN)Time->Minute + ); + + // + // SPrint will null terminate the string. The -1 skips the null + // + return Size - 1; +} + +STATIC +UINTN +EfiStatusToString ( + IN EFI_STATUS Status, + OUT CHAR_W *Buffer, + IN UINTN BufferSize + ) +/*++ + +Routine Description: + + VSPrint worker function that prints EFI_STATUS as a string. If string is + not known a hex value will be printed. + +Arguments: + + Status - EFI_STATUS sturcture to print. + + Buffer - Buffer to print EFI_STATUS message string into. + + BufferSize - Size of Buffer. + +Returns: + + Number of characters printed. + +--*/ +{ + UINTN Size; + CHAR8 *Desc; + + Desc = NULL; + + // + // Can't use global Status String Array as UINTN is not constant for EBC + // + if (Status == EFI_SUCCESS) { Desc = "Success"; } else + if (Status == EFI_LOAD_ERROR) { Desc = "Load Error"; } else + if (Status == EFI_INVALID_PARAMETER) { Desc = "Invalid Parameter"; } else + if (Status == EFI_UNSUPPORTED) { Desc = "Unsupported"; } else + if (Status == EFI_BAD_BUFFER_SIZE) { Desc = "Bad Buffer Size"; } else + if (Status == EFI_BUFFER_TOO_SMALL) { Desc = "Buffer Too Small"; } else + if (Status == EFI_NOT_READY) { Desc = "Not Ready"; } else + if (Status == EFI_DEVICE_ERROR) { Desc = "Device Error"; } else + if (Status == EFI_WRITE_PROTECTED) { Desc = "Write Protected"; } else + if (Status == EFI_OUT_OF_RESOURCES) { Desc = "Out of Resources"; } else + if (Status == EFI_VOLUME_CORRUPTED) { Desc = "Volume Corrupt"; } else + if (Status == EFI_VOLUME_FULL) { Desc = "Volume Full"; } else + if (Status == EFI_NO_MEDIA) { Desc = "No Media"; } else + if (Status == EFI_MEDIA_CHANGED) { Desc = "Media changed"; } else + if (Status == EFI_NOT_FOUND) { Desc = "Not Found"; } else + if (Status == EFI_ACCESS_DENIED) { Desc = "Access Denied"; } else + if (Status == EFI_NO_RESPONSE) { Desc = "No Response"; } else + if (Status == EFI_NO_MAPPING) { Desc = "No mapping"; } else + if (Status == EFI_TIMEOUT) { Desc = "Time out"; } else + if (Status == EFI_NOT_STARTED) { Desc = "Not started"; } else + if (Status == EFI_ALREADY_STARTED) { Desc = "Already started"; } else + if (Status == EFI_ABORTED) { Desc = "Aborted"; } else + if (Status == EFI_ICMP_ERROR) { Desc = "ICMP Error"; } else + if (Status == EFI_TFTP_ERROR) { Desc = "TFTP Error"; } else + if (Status == EFI_PROTOCOL_ERROR) { Desc = "Protocol Error"; } else + if (Status == EFI_WARN_UNKNOWN_GLYPH) { Desc = "Warning Unknown Glyph"; } else + if (Status == EFI_WARN_DELETE_FAILURE) { Desc = "Warning Delete Failure"; } else + if (Status == EFI_WARN_WRITE_FAILURE) { Desc = "Warning Write Failure"; } else + if (Status == EFI_WARN_BUFFER_TOO_SMALL) { Desc = "Warning Buffer Too Small"; } + + // + // If we found a match, copy the message to the user's buffer. Otherwise + // sprint the hex status code to their buffer. + // + if (Desc != NULL) { + Size = SPrint (Buffer, BufferSize, STRING_W ("%a"), Desc); + } else { + Size = SPrint (Buffer, BufferSize, STRING_W ("%X"), Status); + } + + return Size - 1; +} diff --git a/EDK/Foundation/Library/Dxe/Graphics/Print.h b/EDK/Foundation/Library/Dxe/Graphics/Print.h new file mode 100644 index 0000000..ad54aa8 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/Graphics/Print.h @@ -0,0 +1,37 @@ +/*++ + +Copyright (c) 2004, 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: + + Print.h + +Abstract: + + Private data for Print.c + +--*/ + +#ifndef _PRINT_H_ +#define _PRINT_H_ + +#define LEFT_JUSTIFY 0x01 +#define PREFIX_SIGN 0x02 +#define PREFIX_BLANK 0x04 +#define COMMA_TYPE 0x08 +#define LONG_TYPE 0x10 +#define PREFIX_ZERO 0x20 + +// +// Largest number of characters that can be printed out. +// +#define EFI_DRIVER_LIB_MAX_PRINT_BUFFER (80 * 4) + +#endif diff --git a/EDK/Foundation/Library/Dxe/Graphics/Unicode/GraphicsUnicode.cif b/EDK/Foundation/Library/Dxe/Graphics/Unicode/GraphicsUnicode.cif new file mode 100644 index 0000000..928a0b9 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/Graphics/Unicode/GraphicsUnicode.cif @@ -0,0 +1,9 @@ + + name = "GraphicsUnicode" + category = ModulePart + LocalRoot = "EDK\Foundation\Library\Dxe\Graphics\Unicode" + RefName = "GraphicsUnicode" +[files] +"PrintWidth.h" +"Sprint.c" + diff --git a/EDK/Foundation/Library/Dxe/Graphics/Unicode/PrintWidth.h b/EDK/Foundation/Library/Dxe/Graphics/Unicode/PrintWidth.h new file mode 100644 index 0000000..9df3fc9 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/Graphics/Unicode/PrintWidth.h @@ -0,0 +1,34 @@ +/*++ + +Copyright (c) 2004, 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: + + PrintWidth.h + +Abstract: + + Unicde option for generic width. + CHAR_W is Unicode + STRING_W is L"" + +--*/ + +#ifndef _PRINT_WIDTH_H_ +#define _PRINT_WIDTH_H_ + +typedef CHAR16 CHAR_W; +#define STRING_W(_s) L##_s + +#define USPrint(Buffer, BufferSize, Format) SPrint (Buffer, BufferSize, Format) +#define UvSPrint(Buffer, BufferSize, Format, Marker) VSPrint (Buffer, BufferSize, Format, Marker) + +#include "EfiCommonLib.h" +#endif diff --git a/EDK/Foundation/Library/Dxe/Graphics/Unicode/Sprint.c b/EDK/Foundation/Library/Dxe/Graphics/Unicode/Sprint.c new file mode 100644 index 0000000..3daf4d9 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/Graphics/Unicode/Sprint.c @@ -0,0 +1,147 @@ +/*++ + +Copyright (c) 2004, 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: + + Sprint.c + +Abstract: + + Basic Ascii AvSPrintf() function named VSPrint(). VSPrint() enables very + simple implemenation of SPrint() and Print() to support debug. + + You can not Print more than EFI_DRIVER_LIB_MAX_PRINT_BUFFER characters at a + time. This makes the implementation very simple. + + VSPrint, Print, SPrint format specification has the follwoing form + + %[flags][width]type + + flags: + '-' - Left justify + '+' - Prefix a sign + ' ' - Prefix a blank + ',' - Place commas in numberss + '0' - Prefix for width with zeros + 'l' - UINT64 + 'L' - UINT64 + + width: + '*' - Get width from a UINTN argumnet from the argument list + Decimal number that represents width of print + + type: + 'X' - argument is a UINTN hex number, prefix '0' + 'x' - argument is a hex number + 'd' - argument is a decimal number + 'a' - argument is an ascii string + 'S','s' - argument is an Unicode string + 'g' - argument is a pointer to an EFI_GUID + 't' - argument is a pointer to an EFI_TIME structure + 'c' - argument is an ascii character + 'r' - argument is EFI_STATUS + '%' - Print a % + +--*/ + +#include "TianoCommon.h" +#include "PrintWidth.h" +#include "EfiPrintLib.h" +#include "Print.h" + + +UINTN +ASPrint ( + OUT CHAR8 *Buffer, + IN UINTN BufferSize, + IN CONST CHAR8 *Format, + ... + ) +/*++ + +Routine Description: + + Process format and place the results in Buffer for narrow chars. + +Arguments: + + Buffer - Narrow char buffer to print the results of the parsing of Format into. + BufferSize - Maximum number of characters to put into buffer. + Format - Format string + ... - Vararg list consumed by processing Format. + +Returns: + + Number of characters printed. + +--*/ +{ + UINTN Return; + VA_LIST Marker; + + VA_START (Marker, Format); + Return = AvSPrint (Buffer, BufferSize, Format, Marker); + VA_END (Marker); + + return Return; +} + + +UINTN +AvSPrint ( + OUT CHAR8 *Buffer, + IN UINTN BufferSize, + IN CONST CHAR8 *FormatString, + IN VA_LIST Marker + ) +/*++ + +Routine Description: + + Internal implementation of ASPrint. + Process format and place the results in Buffer for narrow chars. + +Arguments: + + Buffer - Narrow char buffer to print the results of the parsing of Format into. + BufferSize - Maximum number of characters to put into buffer. + FormatString - Format string + Marker - Vararg list consumed by processing Format. + +Returns: + + Number of characters printed. + +--*/ +{ + UINTN Index; + // + // Increase array size of 'UnicodeFormat' and 'UnicodeResult' by 1, as there is a possibility of buffer overflow. + // + CHAR16 UnicodeFormat[EFI_DRIVER_LIB_MAX_PRINT_BUFFER+1]; + CHAR16 UnicodeResult[EFI_DRIVER_LIB_MAX_PRINT_BUFFER+1]; + + for (Index = 0; Index < EFI_DRIVER_LIB_MAX_PRINT_BUFFER && FormatString[Index] != '\0'; Index++) { + UnicodeFormat[Index] = (CHAR16) FormatString[Index]; + } + + UnicodeFormat[Index] = '\0'; + + Index = VSPrint (UnicodeResult, sizeof (UnicodeResult)/sizeof (CHAR16), UnicodeFormat, Marker); + + for (Index = 0; (Index < (BufferSize - 1)) && UnicodeResult[Index] != '\0'; Index++) { + Buffer[Index] = (CHAR8) UnicodeResult[Index]; + } + + Buffer[Index] = '\0'; + + return Index++; +} diff --git a/EDK/Foundation/Library/Dxe/GraphicsLite/Ascii/GraphicsLiteAscii.cif b/EDK/Foundation/Library/Dxe/GraphicsLite/Ascii/GraphicsLiteAscii.cif new file mode 100644 index 0000000..2cbfcb6 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/GraphicsLite/Ascii/GraphicsLiteAscii.cif @@ -0,0 +1,9 @@ + + name = "GraphicsLiteAscii" + category = ModulePart + LocalRoot = "EDK\Foundation\Library\Dxe\GraphicsLite\Ascii" + RefName = "GraphicsLiteAscii" +[files] +"PrintWidth.h" +"Sprint.c" + diff --git a/EDK/Foundation/Library/Dxe/GraphicsLite/Ascii/PrintWidth.h b/EDK/Foundation/Library/Dxe/GraphicsLite/Ascii/PrintWidth.h new file mode 100644 index 0000000..07901dc --- /dev/null +++ b/EDK/Foundation/Library/Dxe/GraphicsLite/Ascii/PrintWidth.h @@ -0,0 +1,88 @@ +/*++ + +Copyright (c) 2004, 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: + + PrintWidth.h + +Abstract: + + Unicde option for generic width. + CHAR_W is Ascii + STRING_W is "" + +--*/ + +#ifndef _PRINT_WIDTH_H_ +#define _PRINT_WIDTH_H_ + +typedef CHAR8 CHAR_W; +#define STRING_W(_s) _s + +#define ASPrint(Buffer, BufferSize, Format) SPrint (Buffer, BufferSize, Format) +#define AvSPrint(Buffer, BufferSize, Format, Marker) VSPrint (Buffer, BufferSize, Format, Marker) + +UINTN +UvSPrint ( + OUT CHAR16 *StartOfBuffer, + IN UINTN StrLen, + IN CONST CHAR16 *Format, + IN VA_LIST Marker + ) +/*++ + +Routine Description: + + Internal implementation of USPrint. + Process format and place the results in Buffer for wide chars. + +Arguments: + + StartOfBuffer - Wide char buffer to print the results of the parsing of Format into. + StrLen - Maximum number of characters to put into buffer. + Format - Format string + Marker - Vararg list consumed by processing Format. + +Returns: + + Number of characters printed. + +--*/ +; + +UINTN +USPrint ( + OUT CHAR16 *Buffer, + IN UINTN BufferSize, + IN CONST CHAR16 *Format, + ... + ) +/*++ + +Routine Description: + + Process format and place the results in Buffer for wide chars. + +Arguments: + + Buffer - Wide char buffer to print the results of the parsing of Format into. + BufferSize - Maximum number of characters to put into buffer. + Format - Format string + ... - Vararg list consumed by processing Format. + +Returns: + + Number of characters printed. + +--*/ +; + +#endif diff --git a/EDK/Foundation/Library/Dxe/GraphicsLite/Ascii/Sprint.c b/EDK/Foundation/Library/Dxe/GraphicsLite/Ascii/Sprint.c new file mode 100644 index 0000000..bb4bb1e --- /dev/null +++ b/EDK/Foundation/Library/Dxe/GraphicsLite/Ascii/Sprint.c @@ -0,0 +1,144 @@ +/*++ + +Copyright (c) 2004, 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: + + Sprint.c + +Abstract: + + Basic Ascii AvSPrintf() function named VSPrint(). VSPrint() enables very + simple implemenation of SPrint() and Print() to support debug. + + You can not Print more than EFI_DRIVER_LIB_MAX_PRINT_BUFFER characters at a + time. This makes the implementation very simple. + + VSPrint, Print, SPrint format specification has the follwoing form + + %[flags][width]type + + flags: + '-' - Left justify + '+' - Prefix a sign + ' ' - Prefix a blank + ',' - Place commas in numberss + '0' - Prefix for width with zeros + 'l' - UINT64 + 'L' - UINT64 + + width: + '*' - Get width from a UINTN argumnet from the argument list + Decimal number that represents width of print + + type: + 'X' - argument is a UINTN hex number, prefix '0' + 'x' - argument is a hex number + 'd' - argument is a decimal number + 'a' - argument is an ascii string + 'S','s' - argument is an Unicode string + 'g' - argument is a pointer to an EFI_GUID + 't' - argument is a pointer to an EFI_TIME structure + 'c' - argument is an ascii character + 'r' - argument is EFI_STATUS + '%' - Print a % + +--*/ + +#include "TianoCommon.h" +#include "PrintWidth.h" +#include "EfiPrintLib.h" +#include "Print.h" + + +UINTN +USPrint ( + OUT CHAR16 *Buffer, + IN UINTN BufferSize, + IN CONST CHAR16 *Format, + ... + ) +/*++ + +Routine Description: + + Process format and place the results in Buffer for wide chars. + +Arguments: + + Buffer - Wide char buffer to print the results of the parsing of Format into. + BufferSize - Maximum number of characters to put into buffer. + Format - Format string + ... - Vararg list consumed by processing Format. + +Returns: + + Number of characters printed. + +--*/ +{ + UINTN Return; + VA_LIST Marker; + + VA_START (Marker, Format); + Return = UnicodeVSPrint (Buffer, BufferSize, Format, Marker); + VA_END (Marker); + + return Return; +} + + +UINTN +UvSPrint ( + OUT CHAR16 *Buffer, + IN UINTN BufferSize, + IN CONST CHAR16 *FormatString, + IN VA_LIST Marker + ) +/*++ + +Routine Description: + + Internal implementation of USPrint. + Process format and place the results in Buffer for wide chars. + +Arguments: + + Buffer - Wide char buffer to print the results of the parsing of Format into. + BufferSize - Maximum number of characters to put into buffer. + FormatString - Format string + Marker - Vararg list consumed by processing Format. + +Returns: + + Number of characters printed. + +--*/ +{ + UINTN Index; + CHAR8 AsciiFormat[EFI_DRIVER_LIB_MAX_PRINT_BUFFER]; + CHAR8 AsciiResult[EFI_DRIVER_LIB_MAX_PRINT_BUFFER]; + + for (Index = 0; Index < EFI_DRIVER_LIB_MAX_PRINT_BUFFER && FormatString[Index] != '\0'; Index++) { + AsciiFormat[Index] = (CHAR8) FormatString[Index]; + } + + AsciiFormat[Index] = '\0'; + + Index = VSPrint (AsciiResult, EFI_DRIVER_LIB_MAX_PRINT_BUFFER, AsciiFormat, Marker); + + for (Index = 0; (Index < (BufferSize - 1)) && AsciiResult[Index] != '\0'; Index++) { + Buffer[Index] = (CHAR16) AsciiResult[Index]; + } + + Buffer[Index] = '\0'; + + return Index++; +} diff --git a/EDK/Foundation/Library/Dxe/GraphicsLite/Graphics.c b/EDK/Foundation/Library/Dxe/GraphicsLite/Graphics.c new file mode 100644 index 0000000..b54e960 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/GraphicsLite/Graphics.c @@ -0,0 +1,617 @@ +/*++ + +Copyright (c) 2004 - 2011, 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: + + Graphics.c + +Abstract: + + Support for Basic Graphics operations. + + BugBug: Currently *.BMP files are supported. This will be replaced + when Tiano graphics format is supported. + +--*/ + +#include "Tiano.h" +#include "EfiDriverLib.h" +#include "GraphicsLib.h" + + +EFI_STATUS +GetGraphicsBitMapFromFV ( + IN EFI_GUID *FileNameGuid, + OUT VOID **Image, + OUT UINTN *ImageSize + ) +/*++ + +Routine Description: + + Return the graphics image file named FileNameGuid into Image and return it's + size in ImageSize. All Firmware Volumes (FV) in the system are searched for the + file name. + +Arguments: + + FileNameGuid - File Name of graphics file in the FV(s). + + Image - Pointer to pointer to return graphics image. If NULL, a + buffer will be allocated. + + ImageSize - Size of the graphics Image in bytes. Zero if no image found. + + +Returns: + + EFI_SUCCESS - Image and ImageSize are valid. + EFI_BUFFER_TOO_SMALL - Image not big enough. ImageSize has required size + EFI_NOT_FOUND - FileNameGuid not found + +--*/ +{ + EFI_STATUS Status; + UINTN FvProtocolCount; + EFI_HANDLE *FvHandles; +#if (PI_SPECIFICATION_VERSION < 0x00010000) //;;## ...AMI_OVERRIDE... Support PI1.x + EFI_FIRMWARE_VOLUME_PROTOCOL *Fv; +#else + EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv; +#endif + UINTN Index; + UINT32 AuthenticationStatus; + + Status = gBS->LocateHandleBuffer ( + ByProtocol, + #if (PI_SPECIFICATION_VERSION < 0x00010000) //;;## ...AMI_OVERRIDE... Support PI1.x + &gEfiFirmwareVolumeProtocolGuid, + #else + &gEfiFirmwareVolume2ProtocolGuid, + #endif + NULL, + &FvProtocolCount, + &FvHandles + ); + if (EFI_ERROR (Status)) { + return EFI_NOT_FOUND; + } + + for (Index = 0; Index < FvProtocolCount; Index++) { + Status = gBS->HandleProtocol ( + FvHandles[Index], + #if (PI_SPECIFICATION_VERSION < 0x00010000) //;;## ...AMI_OVERRIDE... Support PI1.x + &gEfiFirmwareVolumeProtocolGuid, + #else + &gEfiFirmwareVolume2ProtocolGuid, + #endif + (VOID **) &Fv + ); + + // + // Assuming Image and ImageSize are correct on input. + // + Status = Fv->ReadSection ( + Fv, + &gEfiDefaultBmpLogoGuid, + EFI_SECTION_RAW, + 0, + Image, + ImageSize, + &AuthenticationStatus + ); + if (!EFI_ERROR (Status)) { + gBS->FreePool (FvHandles); + return EFI_SUCCESS; + } else if (Status == EFI_BUFFER_TOO_SMALL) { + // + // ImageSize updated to needed size so return + // + gBS->FreePool (FvHandles); + return EFI_BUFFER_TOO_SMALL; + } + } + + gBS->FreePool (FvHandles); + return EFI_NOT_FOUND; +} + + +EFI_STATUS +ConvertBmpToGopBlt ( + IN VOID *BmpImage, + IN UINTN BmpImageSize, + IN OUT VOID **GopBlt, + IN OUT UINTN *GopBltSize, + OUT UINTN *PixelHeight, + OUT UINTN *PixelWidth + ) +/*++ + +Routine Description: + + Convert a *.BMP graphics image to a GOP/UGA blt buffer. If a NULL Blt buffer + is passed in a GopBlt buffer will be allocated by this routine. If a GopBlt + buffer is passed in it will be used if it is big enough. + +Arguments: + + BmpImage - Pointer to BMP file + + BmpImageSize - Number of bytes in BmpImage + + GopBlt - Buffer containing GOP version of BmpImage. + + GopBltSize - Size of GopBlt in bytes. + + PixelHeight - Height of GopBlt/BmpImage in pixels + + PixelWidth - Width of GopBlt/BmpImage in pixels + + +Returns: + + EFI_SUCCESS - GopBlt and GopBltSize are returned. + EFI_UNSUPPORTED - BmpImage is not a valid *.BMP image + EFI_BUFFER_TOO_SMALL - The passed in GopBlt buffer is not big enough. + GopBltSize will contain the required size. + EFI_OUT_OF_RESOURCES - No enough buffer to allocate + +--*/ +{ + UINT8 *Image; + UINT8 *ImageHeader; + BMP_IMAGE_HEADER *BmpHeader; + BMP_COLOR_MAP *BmpColorMap; + EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer; + EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Blt; + UINT64 BltBufferSize; + UINTN Index; + UINTN Height; + UINTN Width; + UINTN ImageIndex; + BOOLEAN IsAllocated; + + BmpHeader = (BMP_IMAGE_HEADER *) BmpImage; + if (BmpHeader->CharB != 'B' || BmpHeader->CharM != 'M') { + return EFI_UNSUPPORTED; + } + + if (BmpHeader->CompressionType != 0) { + return EFI_UNSUPPORTED; + } + + // + // Calculate Color Map offset in the image. + // + Image = BmpImage; + BmpColorMap = (BMP_COLOR_MAP *) (Image + sizeof (BMP_IMAGE_HEADER)); + + // + // Calculate graphics image data address in the image + // + Image = ((UINT8 *) BmpImage) + BmpHeader->ImageOffset; + ImageHeader = Image; + + BltBufferSize = MultU64x32 ((UINT64) BmpHeader->PixelWidth, BmpHeader->PixelHeight); + // + // Ensure the BltBufferSize * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL) doesn't overflow + // + if (BltBufferSize > DivU64x32 ((UINTN) ~0, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL), NULL)) { + return EFI_UNSUPPORTED; + } + BltBufferSize = MultU64x32 (BltBufferSize, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)); + + IsAllocated = FALSE; + if (*GopBlt == NULL) { + *GopBltSize = (UINTN) BltBufferSize; + *GopBlt = EfiLibAllocatePool (*GopBltSize); + IsAllocated = TRUE; + if (*GopBlt == NULL) { + return EFI_OUT_OF_RESOURCES; + } + } else { + if (*GopBltSize < (UINTN) BltBufferSize) { + *GopBltSize = (UINTN) BltBufferSize; + return EFI_BUFFER_TOO_SMALL; + } + } + + *PixelWidth = BmpHeader->PixelWidth; + *PixelHeight = BmpHeader->PixelHeight; + + // + // Convert image from BMP to Blt buffer format + // + BltBuffer = *GopBlt; + for (Height = 0; Height < BmpHeader->PixelHeight; Height++) { + Blt = &BltBuffer[(BmpHeader->PixelHeight - Height - 1) * BmpHeader->PixelWidth]; + for (Width = 0; Width < BmpHeader->PixelWidth; Width++, Image++, Blt++) { + switch (BmpHeader->BitPerPixel) { + case 1: + // + // Convert 1bit BMP to 24-bit color + // + for (Index = 0; Index < 8 && Width < BmpHeader->PixelWidth; Index++) { + Blt->Red = BmpColorMap[((*Image) >> (7 - Index)) & 0x1].Red; + Blt->Green = BmpColorMap[((*Image) >> (7 - Index)) & 0x1].Green; + Blt->Blue = BmpColorMap[((*Image) >> (7 - Index)) & 0x1].Blue; + Blt++; + Width++; + } + + Blt --; + Width --; + break; + + case 4: + // + // Convert BMP Palette to 24-bit color + // + Index = (*Image) >> 4; + Blt->Red = BmpColorMap[Index].Red; + Blt->Green = BmpColorMap[Index].Green; + Blt->Blue = BmpColorMap[Index].Blue; + if (Width < (BmpHeader->PixelWidth - 1)) { + Blt++; + Width++; + Index = (*Image) & 0x0f; + Blt->Red = BmpColorMap[Index].Red; + Blt->Green = BmpColorMap[Index].Green; + Blt->Blue = BmpColorMap[Index].Blue; + } + break; + + case 8: + // + // Convert BMP Palette to 24-bit color + // + Blt->Red = BmpColorMap[*Image].Red; + Blt->Green = BmpColorMap[*Image].Green; + Blt->Blue = BmpColorMap[*Image].Blue; + break; + + case 24: + Blt->Blue = *Image++; + Blt->Green = *Image++; + Blt->Red = *Image; + break; + + default: + if (IsAllocated) { + gBS->FreePool (*GopBlt); + *GopBlt = NULL; + } + return EFI_UNSUPPORTED; + break; + }; + + } + + ImageIndex = (UINTN) (Image - ImageHeader); + if ((ImageIndex % 4) != 0) { + // + // Bmp Image starts each row on a 32-bit boundary! + // + Image = Image + (4 - (ImageIndex % 4)); + } + } + + return EFI_SUCCESS; +} + + +EFI_STATUS +LockKeyboards ( + IN CHAR16 *Password + ) +/*++ + +Routine Description: + Use Console Control Protocol to lock the Console In Spliter virtual handle. + This is the ConInHandle and ConIn handle in the EFI system table. All key + presses will be ignored until the Password is typed in. The only way to + disable the password is to type it in to a ConIn device. + +Arguments: + Password - Password used to lock ConIn device + + +Returns: + + EFI_SUCCESS - ConsoleControl has been flipped to graphics and logo + displayed. + EFI_UNSUPPORTED - Logo not found + +--*/ +{ + EFI_STATUS Status; + EFI_CONSOLE_CONTROL_PROTOCOL *ConsoleControl; + + Status = gBS->LocateProtocol (&gEfiConsoleControlProtocolGuid, NULL, &ConsoleControl); + if (EFI_ERROR (Status)) { + return EFI_UNSUPPORTED; + } + + Status = ConsoleControl->LockStdIn (ConsoleControl, Password); + return Status; +} + + +EFI_STATUS +EnableQuietBoot ( + IN EFI_GUID *LogoFile + ) +/*++ + +Routine Description: + + Use Console Control to turn off GOP/UGA based Simple Text Out consoles from going + to the GOP/UGA device. Put up LogoFile on every GOP/UGA device that is a console + +Arguments: + + LogoFile - File name of logo to display on the center of the screen. + + +Returns: + + EFI_SUCCESS - ConsoleControl has been flipped to graphics and logo + displayed. + EFI_UNSUPPORTED - Logo not found + +--*/ +{ + EFI_STATUS Status; + EFI_CONSOLE_CONTROL_PROTOCOL *ConsoleControl; + EFI_OEM_BADGING_PROTOCOL *Badging; + UINT32 SizeOfX; + UINT32 SizeOfY; + INTN DestX; + INTN DestY; + UINT8 *ImageData; + UINTN ImageSize; + UINTN BltSize; + UINT32 Instance; + EFI_BADGING_FORMAT Format; + EFI_BADGING_DISPLAY_ATTRIBUTE Attribute; + UINTN CoordinateX; + UINTN CoordinateY; + UINTN Height; + UINTN Width; + EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Blt; + EFI_UGA_DRAW_PROTOCOL *UgaDraw; + UINT32 ColorDepth; + UINT32 RefreshRate; + EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput; + + Status = gBS->LocateProtocol (&gEfiConsoleControlProtocolGuid, NULL, &ConsoleControl); + if (EFI_ERROR (Status)) { + return EFI_UNSUPPORTED; + } + + UgaDraw = NULL; + // + // Try to open GOP first + // + Status = gBS->HandleProtocol (gST->ConsoleOutHandle, &gEfiGraphicsOutputProtocolGuid, &GraphicsOutput); + if (EFI_ERROR (Status)) { + GraphicsOutput = NULL; + // + // Open GOP failed, try to open UGA + // + Status = gBS->HandleProtocol (gST->ConsoleOutHandle, &gEfiUgaDrawProtocolGuid, &UgaDraw); + if (EFI_ERROR (Status)) { + return EFI_UNSUPPORTED; + } + } + + Badging = NULL; + Status = gBS->LocateProtocol (&gEfiOEMBadgingProtocolGuid, NULL, &Badging); + + ConsoleControl->SetMode (ConsoleControl, EfiConsoleControlScreenGraphics); + + if (GraphicsOutput != NULL) { + SizeOfX = GraphicsOutput->Mode->Info->HorizontalResolution; + SizeOfY = GraphicsOutput->Mode->Info->VerticalResolution; + } else { + if (UgaDraw) { + Status = UgaDraw->GetMode (UgaDraw, &SizeOfX, &SizeOfY, &ColorDepth, &RefreshRate); + if (EFI_ERROR (Status)) { + return EFI_UNSUPPORTED; + } + } else { + return EFI_UNSUPPORTED; + } + } + + Instance = 0; + while (1) { + ImageData = NULL; + ImageSize = 0; + + if (Badging != NULL) { + Status = Badging->GetImage ( + Badging, + &Instance, + &Format, + &ImageData, + &ImageSize, + &Attribute, + &CoordinateX, + &CoordinateY + ); + if (EFI_ERROR (Status)) { + return Status; + } + + // + // Currently only support BMP format + // + if (Format != EfiBadgingFormatBMP) { + gBS->FreePool (ImageData); + continue; + } + } else { + Status = GetGraphicsBitMapFromFV (LogoFile, &ImageData, &ImageSize); + if (EFI_ERROR (Status)) { + return EFI_UNSUPPORTED; + } + + CoordinateX = 0; + CoordinateY = 0; + Attribute = EfiBadgingDisplayAttributeCenter; + } + + Blt = NULL; + Status = ConvertBmpToGopBlt ( + ImageData, + ImageSize, + &Blt, + &BltSize, + &Height, + &Width + ); + if (EFI_ERROR (Status)) { + gBS->FreePool (ImageData); + if (Badging == NULL) { + return Status; + } else { + continue; + } + } + + switch (Attribute) { + case EfiBadgingDisplayAttributeLeftTop: + DestX = CoordinateX; + DestY = CoordinateY; + break; + + case EfiBadgingDisplayAttributeCenterTop: + DestX = (SizeOfX - Width) / 2; + DestY = CoordinateY; + break; + + case EfiBadgingDisplayAttributeRightTop: + DestX = (SizeOfX - Width - CoordinateX); + DestY = CoordinateY;; + break; + + case EfiBadgingDisplayAttributeCenterRight: + DestX = (SizeOfX - Width - CoordinateX); + DestY = (SizeOfY - Height) / 2; + break; + + case EfiBadgingDisplayAttributeRightBottom: + DestX = (SizeOfX - Width - CoordinateX); + DestY = (SizeOfY - Height - CoordinateY); + break; + + case EfiBadgingDisplayAttributeCenterBottom: + DestX = (SizeOfX - Width) / 2; + DestY = (SizeOfY - Height - CoordinateY); + break; + + case EfiBadgingDisplayAttributeLeftBottom: + DestX = CoordinateX; + DestY = (SizeOfY - Height - CoordinateY); + break; + + case EfiBadgingDisplayAttributeCenterLeft: + DestX = CoordinateX; + DestY = (SizeOfY - Height) / 2; + break; + + case EfiBadgingDisplayAttributeCenter: + DestX = (SizeOfX - Width) / 2; + DestY = (SizeOfY - Height) / 2; + break; + + default: + DestX = CoordinateX; + DestY = CoordinateY; + break; + } + + if ((DestX >= 0) && (DestY >= 0)) { + if (GraphicsOutput != NULL) { + Status = GraphicsOutput->Blt ( + GraphicsOutput, + Blt, + EfiBltBufferToVideo, + 0, + 0, + (UINTN) DestX, + (UINTN) DestY, + Width, + Height, + Width * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL) + ); + } else { + Status = UgaDraw->Blt ( + UgaDraw, + (EFI_UGA_PIXEL *) Blt, + EfiUgaBltBufferToVideo, + 0, + 0, + (UINTN) DestX, + (UINTN) DestY, + Width, + Height, + Width * sizeof (EFI_UGA_PIXEL) + ); + } + } + + gBS->FreePool (ImageData); + gBS->FreePool (Blt); + + if (Badging == NULL) { + break; + } + } + + return Status; +} + + +EFI_STATUS +DisableQuietBoot ( + VOID + ) +/*++ + +Routine Description: + + Use Console Control to turn on GOP/UGA based Simple Text Out consoles. The GOP/UGA + Simple Text Out screens will now be synced up with all non GOP/UGA output devices + +Arguments: + + NONE + +Returns: + + EFI_SUCCESS - GOP/UGA devices are back in text mode and synced up. + EFI_UNSUPPORTED - Logo not found + +--*/ +{ + EFI_STATUS Status; + EFI_CONSOLE_CONTROL_PROTOCOL *ConsoleControl; + + Status = gBS->LocateProtocol (&gEfiConsoleControlProtocolGuid, NULL, &ConsoleControl); + if (EFI_ERROR (Status)) { + return EFI_UNSUPPORTED; + } + + return ConsoleControl->SetMode (ConsoleControl, EfiConsoleControlScreenText); +} diff --git a/EDK/Foundation/Library/Dxe/GraphicsLite/Graphics.inf b/EDK/Foundation/Library/Dxe/GraphicsLite/Graphics.inf new file mode 100644 index 0000000..f5d655a --- /dev/null +++ b/EDK/Foundation/Library/Dxe/GraphicsLite/Graphics.inf @@ -0,0 +1,51 @@ +#/*++ +# +# Copyright (c) 2004, 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: +# +# Graphics.inf +# +# Abstract: +# +# Component description file. +# +#--*/ + +[defines] +BASE_NAME = GraphicsLite +COMPONENT_TYPE = LIBRARY + +[sources.common] + Graphics.c + Print.c + Print.h + Unicode\PrintWidth.h + Unicode\Sprint.c + + +[includes.common] + $(EDK_SOURCE)\Foundation\Framework + $(EDK_SOURCE)\Foundation + $(EDK_SOURCE)\Foundation\Efi + . + $(EDK_SOURCE)\Foundation\Include + $(EDK_SOURCE)\Foundation\Efi\Include + $(EDK_SOURCE)\Foundation\Framework\Include + $(EDK_SOURCE)\Foundation\Include\IndustryStandard + $(EDK_SOURCE)\Foundation\Library\Dxe\Include + $(EDK_SOURCE)\Foundation\Library\Dxe\Graphics\Unicode + $(EDK_SOURCE)\Foundation\Core\Dxe + +[libraries.common] + EfiDriverLib + +[nmake.common] + C_STD_INCLUDE= diff --git a/EDK/Foundation/Library/Dxe/GraphicsLite/GraphicsLite.cif b/EDK/Foundation/Library/Dxe/GraphicsLite/GraphicsLite.cif new file mode 100644 index 0000000..955af56 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/GraphicsLite/GraphicsLite.cif @@ -0,0 +1,18 @@ + + name = "GraphicsLite" + category = ModulePart + LocalRoot = "EDK\Foundation\Library\Dxe\GraphicsLite\" + RefName = "GraphicsLite" +[files] +"GraphicsLite.sdl" +"GraphicsLite.mak" +"Graphics.c" +"Print.c" +"Print.h" +"Graphics.inf" +[parts] +"GraphicsLiteAscii" +"GraphicsLiteUnicode" +"GraphicsLiteAscii" +"GraphicsLiteUnicode" + diff --git a/EDK/Foundation/Library/Dxe/GraphicsLite/GraphicsLite.mak b/EDK/Foundation/Library/Dxe/GraphicsLite/GraphicsLite.mak new file mode 100644 index 0000000..2003588 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/GraphicsLite/GraphicsLite.mak @@ -0,0 +1,70 @@ +#********************************************************************** +#********************************************************************** +#** ** +#** (C)Copyright 1985-2009, American Megatrends, Inc. ** +#** ** +#** All Rights Reserved. ** +#** ** +#** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +#** ** +#** Phone: (770)-246-8600 ** +#** ** +#********************************************************************** +#********************************************************************** + +#********************************************************************** +# $Header: /Alaska/SOURCE/Modules/SharkBayRefCodes/IntelEDK/GraphicsLite/GraphicsLite.mak 1 1/20/12 4:08a Jeffch $ +# +# $Revision: 1 $ +# +# $Date: 1/20/12 4:08a $ +#********************************************************************** +# Revision History +# ---------------- +# $Log: /Alaska/SOURCE/Modules/SharkBayRefCodes/IntelEDK/GraphicsLite/GraphicsLite.mak $ +# +# 1 1/20/12 4:08a Jeffch +# Create Intel EDK 1117 Patch 7. +# +# 1 9/27/11 6:31a Wesleychen +# Intel EDK initially releases. +# +# 2 9/02/09 3:51a Iminglin +# EIP24919 +# +#********************************************************************** +# +# +# Name: GraphicsLite.mak +# +# Description: +# +# +#********************************************************************** +$(GRAPHICSLITE) : GraphicsLite + +$(BUILD_DIR)\GraphicsLite.lib : GraphicsLite + +GraphicsLite : $(BUILD_DIR)\GraphicsLite.mak GraphicsLiteBin + +$(BUILD_DIR)\GraphicsLite.mak : $(GraphicsLite_DIR)\$(@B).cif $(GraphicsLite_DIR)\$(@B).mak $(BUILD_RULES) $(GraphicsLite_DIR)\Unicode\GraphicsLiteUnicode.cif + $(CIF2MAK) $(GraphicsLite_DIR)\$(@B).cif $(CIF2MAK_DEFAULTS) $(GraphicsLite_DIR)\Unicode\GraphicsLiteUnicode.cif + +GraphicsLiteBin : $(EFIDRIVERLIB) + $(MAKE) /$(MAKEFLAGS) $(EDK_DEFAULTS)\ + /f $(BUILD_DIR)\GraphicsLite.mak all\ + "MY_INCLUDES=/I$(GraphicsLite_DIR) /I$(GraphicsLite_DIR)\Unicode"\ + TYPE=LIBRARY \ +#********************************************************************** +#********************************************************************** +#** ** +#** (C)Copyright 1985-2009, American Megatrends, Inc. ** +#** ** +#** All Rights Reserved. ** +#** ** +#** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +#** ** +#** Phone: (770)-246-8600 ** +#** ** +#********************************************************************** +#********************************************************************** \ No newline at end of file diff --git a/EDK/Foundation/Library/Dxe/GraphicsLite/GraphicsLite.sdl b/EDK/Foundation/Library/Dxe/GraphicsLite/GraphicsLite.sdl new file mode 100644 index 0000000..437059b --- /dev/null +++ b/EDK/Foundation/Library/Dxe/GraphicsLite/GraphicsLite.sdl @@ -0,0 +1,26 @@ +TOKEN + Name = "GraphicsLite_SUPPORT" + Value = "1" + Help = "Main switch to enable GraphicsLite support in Project" + TokenType = Boolean + TargetEQU = Yes + TargetMAK = Yes + Master = Yes +End + +TOKEN + Name = "GRAPHICSLITE" + Value = "$(BUILD_DIR)\GraphicsLite.lib" + TokenType = Expression + TargetMAK = Yes +End + +PATH + Name = "GraphicsLite_DIR" +End + +MODULE + Help = "Includes GraphicsLite.mak to Project" + File = "GraphicsLite.mak" +End + diff --git a/EDK/Foundation/Library/Dxe/GraphicsLite/Print.c b/EDK/Foundation/Library/Dxe/GraphicsLite/Print.c new file mode 100644 index 0000000..7aaa269 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/GraphicsLite/Print.c @@ -0,0 +1,519 @@ +/*++ + +Copyright (c) 2004 - 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: + + Print.c + +Abstract: + + Basic Ascii AvSPrintf() function named VSPrint(). VSPrint() enables very + simple implemenation of SPrint() and Print() to support debug. + + You can not Print more than EFI_DRIVER_LIB_MAX_PRINT_BUFFER characters at a + time. This makes the implementation very simple. + + VSPrint, Print, SPrint format specification has the follwoing form + + %[flags][width]type + + flags: + '-' - Left justify + '+' - Prefix a sign + ' ' - Prefix a blank + ',' - Place commas in numberss + '0' - Prefix for width with zeros + 'l' - UINT64 + 'L' - UINT64 + + width: + '*' - Get width from a UINTN argumnet from the argument list + Decimal number that represents width of print + + type: + 'X' - argument is a UINTN hex number, prefix '0' + 'x' - argument is a hex number + 'd' - argument is a decimal number + 'a' - argument is an ascii string + 'S','s' - argument is an Unicode string + 'g' - argument is a pointer to an EFI_GUID + 't' - argument is a pointer to an EFI_TIME structure + 'c' - argument is an ascii character + 'r' - argument is EFI_STATUS + '%' - Print a % + +--*/ + +#include "Tiano.h" +#include "EfiDriverLib.h" +#include "TianoCommon.h" +#include "EfiCommonLib.h" +#include "PrintWidth.h" +#include "EfiPrintLib.h" +#include "Print.h" +#if (EFI_SPECIFICATION_VERSION >= 0x0002000A) +#include EFI_PROTOCOL_DEFINITION (HiiFont) +#else +#include EFI_PROTOCOL_DEFINITION (Hii) +#endif + +static EFI_GRAPHICS_OUTPUT_BLT_PIXEL mEfiColors[16] = { + 0x00, 0x00, 0x00, 0x00, + 0x98, 0x00, 0x00, 0x00, + 0x00, 0x98, 0x00, 0x00, + 0x98, 0x98, 0x00, 0x00, + 0x00, 0x00, 0x98, 0x00, + 0x98, 0x00, 0x98, 0x00, + 0x00, 0x98, 0x98, 0x00, + 0x98, 0x98, 0x98, 0x00, + 0x10, 0x10, 0x10, 0x00, + 0xff, 0x10, 0x10, 0x00, + 0x10, 0xff, 0x10, 0x00, + 0xff, 0xff, 0x10, 0x00, + 0x10, 0x10, 0xff, 0x00, + 0xf0, 0x10, 0xff, 0x00, + 0x10, 0xff, 0xff, 0x00, + 0xff, 0xff, 0xff, 0x00, +}; + + +UINTN +_IPrint ( + IN EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput, + IN EFI_UGA_DRAW_PROTOCOL *UgaDraw, + IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *Sto, + IN UINTN X, + IN UINTN Y, + IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Foreground, + IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Background, + IN CHAR16 *fmt, + IN VA_LIST args + ) +/*++ + +Routine Description: + + Display string worker for: Print, PrintAt, IPrint, IPrintAt + +Arguments: + + GraphicsOutput - Graphics output protocol interface + + UgaDraw - UGA draw protocol interface + + Sto - Simple text out protocol interface + + X - X coordinate to start printing + + Y - Y coordinate to start printing + + Foreground - Foreground color + + Background - Background color + + fmt - Format string + + args - Print arguments + +Returns: + + EFI_SUCCESS - success + EFI_OUT_OF_RESOURCES - out of resources + +--*/ +{ + VOID *Buffer; + EFI_STATUS Status; + UINTN Index; + CHAR16 *UnicodeWeight; + UINT32 HorizontalResolution; + UINT32 VerticalResolution; + UINT32 ColorDepth; + UINT32 RefreshRate; + UINTN BufferLen; + UINTN LineBufferLen; +#if (EFI_SPECIFICATION_VERSION >= 0x0002000A) + EFI_HII_FONT_PROTOCOL *HiiFont; + EFI_IMAGE_OUTPUT *Blt; + EFI_FONT_DISPLAY_INFO *FontInfo; +#else + EFI_HII_PROTOCOL *Hii; + UINT16 GlyphWidth; + UINT32 GlyphStatus; + UINT16 StringIndex; + EFI_NARROW_GLYPH *Glyph; + EFI_GRAPHICS_OUTPUT_BLT_PIXEL *LineBuffer; +#endif + + // + // For now, allocate an arbitrarily long buffer + // + Buffer = EfiLibAllocateZeroPool (0x10000); + if (Buffer == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + if (GraphicsOutput != NULL) { + HorizontalResolution = GraphicsOutput->Mode->Info->HorizontalResolution; + VerticalResolution = GraphicsOutput->Mode->Info->VerticalResolution; + } else { + UgaDraw->GetMode (UgaDraw, &HorizontalResolution, &VerticalResolution, &ColorDepth, &RefreshRate); + } + ASSERT ((HorizontalResolution != 0) && (VerticalResolution !=0)); + +#if (EFI_SPECIFICATION_VERSION >= 0x0002000A) + Blt = NULL; + FontInfo = NULL; + ASSERT (GraphicsOutput != NULL); + Status = gBS->LocateProtocol (&gEfiHiiFontProtocolGuid, NULL, (VOID **) &HiiFont); + if (EFI_ERROR (Status)) { + goto Error; + } +#else + LineBuffer = NULL; + Status = gBS->LocateProtocol (&gEfiHiiProtocolGuid, NULL, (VOID**)&Hii); + if (EFI_ERROR (Status)) { + goto Error; + } + LineBufferLen = sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL) * HorizontalResolution * GLYPH_HEIGHT; + LineBuffer = EfiLibAllocatePool (LineBufferLen); + if (LineBuffer == NULL) { + Status = EFI_OUT_OF_RESOURCES; + goto Error; + } +#endif + + VSPrint (Buffer, 0x10000, fmt, args); + + UnicodeWeight = (CHAR16 *) Buffer; + + for (Index = 0; UnicodeWeight[Index] != 0; Index++) { + if (UnicodeWeight[Index] == CHAR_BACKSPACE || + UnicodeWeight[Index] == CHAR_LINEFEED || + UnicodeWeight[Index] == CHAR_CARRIAGE_RETURN) { + UnicodeWeight[Index] = 0; + } + } + + BufferLen = EfiStrLen (Buffer); + +#if (EFI_SPECIFICATION_VERSION >= 0x0002000A) + LineBufferLen = sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL) * HorizontalResolution * EFI_GLYPH_HEIGHT; + if (EFI_GLYPH_WIDTH * EFI_GLYPH_HEIGHT * sizeof(EFI_GRAPHICS_OUTPUT_BLT_PIXEL) * BufferLen > LineBufferLen) { + Status = EFI_INVALID_PARAMETER; + goto Error; + } + + Blt = (EFI_IMAGE_OUTPUT *) EfiLibAllocateZeroPool (sizeof (EFI_IMAGE_OUTPUT)); + if (Blt == NULL) { + Status = EFI_OUT_OF_RESOURCES; + goto Error; + } + + Blt->Width = (UINT16) (HorizontalResolution); + Blt->Height = (UINT16) (VerticalResolution); + Blt->Image.Screen = GraphicsOutput; + + FontInfo = (EFI_FONT_DISPLAY_INFO *) EfiLibAllocateZeroPool (sizeof (EFI_FONT_DISPLAY_INFO)); + if (FontInfo == NULL) { + Status = EFI_OUT_OF_RESOURCES; + goto Error; + } + if (Foreground != NULL) { + EfiCopyMem (&FontInfo->ForegroundColor, Foreground, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)); + } else { + EfiCopyMem ( + &FontInfo->ForegroundColor, + &mEfiColors[Sto->Mode->Attribute & 0x0f], + sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL) + ); + } + if (Background != NULL) { + EfiCopyMem (&FontInfo->BackgroundColor, Background, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)); + } else { + EfiCopyMem ( + &FontInfo->BackgroundColor, + &mEfiColors[Sto->Mode->Attribute >> 4], + sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL) + ); + } + + Status = HiiFont->StringToImage ( + HiiFont, + EFI_HII_IGNORE_IF_NO_GLYPH | EFI_HII_DIRECT_TO_SCREEN, + Buffer, + FontInfo, + &Blt, + X, + Y, + NULL, + NULL, + NULL + ); + +#else + GlyphStatus = 0; + + if (GLYPH_WIDTH * GLYPH_HEIGHT * sizeof(EFI_GRAPHICS_OUTPUT_BLT_PIXEL) * BufferLen > LineBufferLen) { + Status = EFI_INVALID_PARAMETER; + goto Error; + } + + for (Index = 0; Index < BufferLen; Index++) { + StringIndex = (UINT16) Index; + Status = Hii->GetGlyph (Hii, UnicodeWeight, &StringIndex, (UINT8 **) &Glyph, &GlyphWidth, &GlyphStatus); + if (EFI_ERROR (Status)) { + goto Error; + } + + if (Foreground == NULL || Background == NULL) { + Status = Hii->GlyphToBlt ( + Hii, + (UINT8 *) Glyph, + mEfiColors[Sto->Mode->Attribute & 0x0f], + mEfiColors[Sto->Mode->Attribute >> 4], + BufferLen, + GlyphWidth, + GLYPH_HEIGHT, + &LineBuffer[Index * GLYPH_WIDTH] + ); + } else { + Status = Hii->GlyphToBlt ( + Hii, + (UINT8 *) Glyph, + *Foreground, + *Background, + BufferLen, + GlyphWidth, + GLYPH_HEIGHT, + &LineBuffer[Index * GLYPH_WIDTH] + ); + } + } + + // + // Blt a character to the screen + // + if (GraphicsOutput != NULL) { + Status = GraphicsOutput->Blt ( + GraphicsOutput, + LineBuffer, + EfiBltBufferToVideo, + 0, + 0, + X, + Y, + GLYPH_WIDTH * BufferLen, + GLYPH_HEIGHT, + GLYPH_WIDTH * BufferLen * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL) + ); + } else { + Status = UgaDraw->Blt ( + UgaDraw, + (EFI_UGA_PIXEL *) LineBuffer, + EfiUgaBltBufferToVideo, + 0, + 0, + X, + Y, + GLYPH_WIDTH * BufferLen, + GLYPH_HEIGHT, + GLYPH_WIDTH * BufferLen * sizeof (EFI_UGA_PIXEL) + ); + } + +#endif + +Error: +#if (EFI_SPECIFICATION_VERSION >= 0x0002000A) + EfiLibSafeFreePool (Blt); + EfiLibSafeFreePool (FontInfo); +#else + gBS->FreePool (LineBuffer); +#endif + gBS->FreePool (Buffer); + return Status; +} + + +UINTN +PrintXY ( + IN UINTN X, + IN UINTN Y, + IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *ForeGround, OPTIONAL + IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BackGround, OPTIONAL + IN CHAR_W *Fmt, + ... + ) +/*++ + +Routine Description: + + Prints a formatted unicode string to the default console + +Arguments: + + X - X coordinate to start printing + + Y - Y coordinate to start printing + + ForeGround - Foreground color + + BackGround - Background color + + Fmt - Format string + + ... - Print arguments + +Returns: + + Length of string printed to the console + +--*/ +{ + EFI_HANDLE Handle; + EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput; + EFI_UGA_DRAW_PROTOCOL *UgaDraw; + EFI_SIMPLE_TEXT_OUT_PROTOCOL *Sto; + EFI_STATUS Status; + VA_LIST Args; + + VA_START (Args, Fmt); + + Handle = gST->ConsoleOutHandle; + + Status = gBS->HandleProtocol ( + Handle, + &gEfiGraphicsOutputProtocolGuid, + &GraphicsOutput + ); + + UgaDraw = NULL; + if (EFI_ERROR (Status)) { + GraphicsOutput = NULL; + + Status = gBS->HandleProtocol ( + Handle, + &gEfiUgaDrawProtocolGuid, + &UgaDraw + ); + + if (EFI_ERROR (Status)) { + return Status; + } + } + + Status = gBS->HandleProtocol ( + Handle, + &gEfiSimpleTextOutProtocolGuid, + &Sto + ); + + if (EFI_ERROR (Status)) { + return Status; + } + + return _IPrint (GraphicsOutput, UgaDraw, Sto, X, Y, ForeGround, BackGround, Fmt, Args); +} + + +UINTN +SPrint ( + OUT CHAR_W *Buffer, + IN UINTN BufferSize, + IN CONST CHAR_W *Format, + ... + ) +/*++ + +Routine Description: + + SPrint function to process format and place the results in Buffer. + +Arguments: + + Buffer - Wide char buffer to print the results of the parsing of Format into. + + BufferSize - Maximum number of characters to put into buffer. Zero means no + limit. + + Format - Format string see file header for more details. + + ... - Vararg list consumed by processing Format. + +Returns: + + Number of characters printed. + +--*/ +{ + UINTN Return; + VA_LIST Marker; + + VA_START (Marker, Format); + Return = VSPrint (Buffer, BufferSize, Format, Marker); + VA_END (Marker); + + return Return; +} + +UINTN +EFIAPI +VSPrint ( + OUT CHAR_W *StartOfBuffer, + IN UINTN BufferSize, + IN CONST CHAR_W *FormatString, + IN VA_LIST Marker + ) +/*++ + +Routine Description: + + VSPrint function to process format and place the results in Buffer. Since a + VA_LIST is used this rountine allows the nesting of Vararg routines. Thus + this is the main print working routine + +Arguments: + + StartOfBuffer - Unicode buffer to print the results of the parsing of Format into. + + BufferSize - Maximum number of characters to put into buffer. Zero means + no limit. + + FormatString - Unicode format string see file header for more details. + + Marker - Vararg list consumed by processing Format. + +Returns: + + Number of characters printed. + +--*/ +{ + EFI_STATUS Status; + EFI_PRINT_PROTOCOL *PrintProtocol; + + Status = gBS->LocateProtocol ( + &gEfiPrintProtocolGuid, + NULL, + &PrintProtocol + ); + if (EFI_ERROR (Status)) { + return 0; + } else { + return PrintProtocol->VSPrint ( + StartOfBuffer, + BufferSize, + FormatString, + Marker + ); + } +} diff --git a/EDK/Foundation/Library/Dxe/GraphicsLite/Print.h b/EDK/Foundation/Library/Dxe/GraphicsLite/Print.h new file mode 100644 index 0000000..ad54aa8 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/GraphicsLite/Print.h @@ -0,0 +1,37 @@ +/*++ + +Copyright (c) 2004, 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: + + Print.h + +Abstract: + + Private data for Print.c + +--*/ + +#ifndef _PRINT_H_ +#define _PRINT_H_ + +#define LEFT_JUSTIFY 0x01 +#define PREFIX_SIGN 0x02 +#define PREFIX_BLANK 0x04 +#define COMMA_TYPE 0x08 +#define LONG_TYPE 0x10 +#define PREFIX_ZERO 0x20 + +// +// Largest number of characters that can be printed out. +// +#define EFI_DRIVER_LIB_MAX_PRINT_BUFFER (80 * 4) + +#endif diff --git a/EDK/Foundation/Library/Dxe/GraphicsLite/Unicode/GraphicsLiteUnicode.cif b/EDK/Foundation/Library/Dxe/GraphicsLite/Unicode/GraphicsLiteUnicode.cif new file mode 100644 index 0000000..773911c --- /dev/null +++ b/EDK/Foundation/Library/Dxe/GraphicsLite/Unicode/GraphicsLiteUnicode.cif @@ -0,0 +1,9 @@ + + name = "GraphicsLiteUnicode" + category = ModulePart + LocalRoot = "EDK\Foundation\Library\Dxe\GraphicsLite\Unicode" + RefName = "GraphicsLiteUnicode" +[files] +"PrintWidth.h" +"Sprint.c" + diff --git a/EDK/Foundation/Library/Dxe/GraphicsLite/Unicode/PrintWidth.h b/EDK/Foundation/Library/Dxe/GraphicsLite/Unicode/PrintWidth.h new file mode 100644 index 0000000..fef9ea9 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/GraphicsLite/Unicode/PrintWidth.h @@ -0,0 +1,35 @@ +/*++ + +Copyright (c) 2004, 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: + + PrintWidth.h + +Abstract: + + Unicde option for generic width. + CHAR_W is Unicode + STRING_W is L"" + +--*/ + +#ifndef _PRINT_WIDTH_H_ +#define _PRINT_WIDTH_H_ + +typedef CHAR16 CHAR_W; +#define STRING_W(_s) L##_s + +#define USPrint(Buffer, BufferSize, Format) SPrint (Buffer, BufferSize, Format) +#define UvSPrint(Buffer, BufferSize, Format, Marker) VSPrint (Buffer, BufferSize, Format, Marker) + +#include "EfiCommonLib.h" + +#endif diff --git a/EDK/Foundation/Library/Dxe/GraphicsLite/Unicode/Sprint.c b/EDK/Foundation/Library/Dxe/GraphicsLite/Unicode/Sprint.c new file mode 100644 index 0000000..e3b8738 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/GraphicsLite/Unicode/Sprint.c @@ -0,0 +1,147 @@ +/*++ + +Copyright (c) 2004, 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: + + Sprint.c + +Abstract: + + Basic Ascii AvSPrintf() function named VSPrint(). VSPrint() enables very + simple implemenation of SPrint() and Print() to support debug. + + You can not Print more than EFI_DRIVER_LIB_MAX_PRINT_BUFFER characters at a + time. This makes the implementation very simple. + + VSPrint, Print, SPrint format specification has the follwoing form + + %[flags][width]type + + flags: + '-' - Left justify + '+' - Prefix a sign + ' ' - Prefix a blank + ',' - Place commas in numberss + '0' - Prefix for width with zeros + 'l' - UINT64 + 'L' - UINT64 + + width: + '*' - Get width from a UINTN argumnet from the argument list + Decimal number that represents width of print + + type: + 'X' - argument is a UINTN hex number, prefix '0' + 'x' - argument is a hex number + 'd' - argument is a decimal number + 'a' - argument is an ascii string + 'S','s' - argument is an Unicode string + 'g' - argument is a pointer to an EFI_GUID + 't' - argument is a pointer to an EFI_TIME structure + 'c' - argument is an ascii character + 'r' - argument is EFI_STATUS + '%' - Print a % + +--*/ + +#include "TianoCommon.h" +#include "PrintWidth.h" +#include "EfiPrintLib.h" +#include "Print.h" + + +UINTN +ASPrint ( + OUT CHAR8 *Buffer, + IN UINTN BufferSize, + IN CONST CHAR8 *Format, + ... + ) +/*++ + +Routine Description: + + Process format and place the results in Buffer for narrow chars. + +Arguments: + + Buffer - Narrow char buffer to print the results of the parsing of Format into. + BufferSize - Maximum number of characters to put into buffer. + Format - Format string + ... - Vararg list consumed by processing Format. + +Returns: + + Number of characters printed. + +--*/ +{ + UINTN Return; + VA_LIST Marker; + + VA_START (Marker, Format); + Return = AvSPrint (Buffer, BufferSize, Format, Marker); + VA_END (Marker); + + return Return; +} + + +UINTN +AvSPrint ( + OUT CHAR8 *Buffer, + IN UINTN BufferSize, + IN CONST CHAR8 *FormatString, + IN VA_LIST Marker + ) +/*++ + +Routine Description: + + Internal implementation of ASPrint. + Process format and place the results in Buffer for narrow chars. + +Arguments: + + Buffer - Narrow char buffer to print the results of the parsing of Format into. + BufferSize - Maximum number of characters to put into buffer. + FormatString - Format string + Marker - Vararg list consumed by processing Format. + +Returns: + + Number of characters printed. + +--*/ +{ + UINTN Index; + // + // Increase array size of 'UnicodeFormat' and 'UnicodeResult' by 1 as there is a possibility of buffer overflow. + // + CHAR16 UnicodeFormat[EFI_DRIVER_LIB_MAX_PRINT_BUFFER+1]; + CHAR16 UnicodeResult[EFI_DRIVER_LIB_MAX_PRINT_BUFFER+1]; + + for (Index = 0; Index < EFI_DRIVER_LIB_MAX_PRINT_BUFFER && FormatString[Index] != '\0'; Index++) { + UnicodeFormat[Index] = (CHAR16) FormatString[Index]; + } + + UnicodeFormat[Index] = '\0'; + + Index = VSPrint (UnicodeResult, sizeof (UnicodeResult)/sizeof (CHAR16), UnicodeFormat, Marker); + + for (Index = 0; (Index < (BufferSize - 1)) && UnicodeResult[Index] != '\0'; Index++) { + Buffer[Index] = (CHAR8) UnicodeResult[Index]; + } + + Buffer[Index] = '\0'; + + return Index++; +} diff --git a/EDK/Foundation/Library/Dxe/Include/Ebc/ProcDep.h b/EDK/Foundation/Library/Dxe/Include/Ebc/ProcDep.h new file mode 100644 index 0000000..7fd542b --- /dev/null +++ b/EDK/Foundation/Library/Dxe/Include/Ebc/ProcDep.h @@ -0,0 +1,26 @@ +/*++ + +Copyright (c) 2004, 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: + + ProcDep.h + +Abstract: + + EBC- specific runtime lib. Only used to get a clean build of + EFI libraries. + +--*/ + +#ifndef _PROC_DEP_H_ +#define _PROC_DEP_H_ + +#endif diff --git a/EDK/Foundation/Library/Dxe/Include/EfiCombinationLib.h b/EDK/Foundation/Library/Dxe/Include/EfiCombinationLib.h new file mode 100644 index 0000000..f091fdc --- /dev/null +++ b/EDK/Foundation/Library/Dxe/Include/EfiCombinationLib.h @@ -0,0 +1,294 @@ +/*++ + +Copyright (c) 2004, 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: + + EfiCombinationLib.h + +Abstract: + + Library functions that can be called in both PEI and DXE phase + +--*/ + +#ifndef _EFI_COMBINATION_LIB_H_ +#define _EFI_COMBINATION_LIB_H_ + +EFI_STATUS +EfiInitializeCommonDriverLib ( + IN EFI_HANDLE ImageHandle, + IN VOID *SystemTable + ) +/*++ + +Routine Description: + + Initialize lib function calling phase: PEI or DXE + +Arguments: + + ImageHandle - The firmware allocated handle for the EFI image. + + SystemTable - A pointer to the EFI System Table. + +Returns: + + EFI_STATUS always returns EFI_SUCCESS + +--*/ +; + +EFI_STATUS +EfiCommonIoRead ( + IN UINT8 Width, + IN UINTN Address, + IN UINTN Count, + IN OUT VOID *Buffer + ) +/*++ + +Routine Description: + + Io read operation. + +Arguments: + + Width - Width of read operation + Address - Start IO address to read + Count - Read count + Buffer - Buffer to store result + +Returns: + + Status code + +--*/ +; + +EFI_STATUS +EfiCommonIoWrite ( + IN UINT8 Width, + IN UINTN Address, + IN UINTN Count, + IN OUT VOID *Buffer + ) +/*++ + +Routine Description: + + Io write operation. + +Arguments: + + Width - Width of write operation + Address - Start IO address to write + Count - Write count + Buffer - Buffer to write to the address + +Returns: + + Status code + +--*/ +; + +EFI_STATUS +EfiCommonPciRead ( + IN UINT8 Width, + IN UINT64 Address, + IN UINTN Count, + IN OUT VOID *Buffer + ) +/*++ + +Routine Description: + + Pci read operation + +Arguments: + + Width - Width of PCI read + Address - PCI address to read + Count - Read count + Buffer - Output buffer for the read + +Returns: + + Status code + +--*/ +; + +EFI_STATUS +EfiCommonPciWrite ( + IN UINT8 Width, + IN UINT64 Address, + IN UINTN Count, + IN OUT VOID *Buffer + ) +/*++ + +Routine Description: + + Pci write operation + +Arguments: + + Width - Width of PCI write + Address - PCI address to write + Count - Write count + Buffer - Buffer to write to the address + +Returns: + + Status code + +--*/ +; + +EFI_STATUS +EfiCommonStall ( + IN UINTN Microseconds + ) +/*++ + +Routine Description: + + Induces a fine-grained stall. + +Arguments: + + Microseconds - The number of microseconds to stall execution. + +Returns: + + Status code + +--*/ +; + +EFI_STATUS +EfiCommonCopyMem ( + IN VOID *Destination, + IN VOID *Source, + IN UINTN Length + ) +/*++ + +Routine Description: + + Copy Length bytes from Source to Destination. + +Arguments: + + Destination - Target of copy + + Source - Place to copy from + + Length - Number of bytes to copy + +Returns: + + Status code + +--*/ +; + +EFI_STATUS +EfiCommonAllocatePages ( + IN EFI_ALLOCATE_TYPE Type, + IN EFI_MEMORY_TYPE MemoryType, + IN UINTN Pages, + IN OUT EFI_PHYSICAL_ADDRESS *Memory + ) +/*++ + +Routine Description: + + Allocates memory pages from the system. + +Arguments: + + Type - The type of allocation to perform. + MemoryType - The type of memory to allocate. + Pages - The number of contiguous pages to allocate. + Memory - Pointer to a physical address. + +Returns: + + EFI_OUT_OF_RESOURCES - The pages could not be allocated. + + EFI_INVALID_PARAMETER - Invalid parameter + + EFI_NOT_FOUND - The requested pages could not be found. + + EFI_SUCCESS - The requested pages were allocated. + +--*/ +; + +EFI_STATUS +EfiCommonLocateInterface ( + IN EFI_GUID *Guid, + OUT VOID **Interface + ) +/*++ + +Routine Description: + + Returns the first protocol instance that matches the given protocol. + +Arguments: + + Guid - Provides the protocol to search for. + Interface - On return, a pointer to the first interface that matches Protocol + +Returns: + + Status code + +--*/ +; + +EFI_STATUS +EfiCommonReportStatusCode ( + IN EFI_STATUS_CODE_TYPE CodeType, + IN EFI_STATUS_CODE_VALUE Value, + IN UINT32 Instance, + IN EFI_GUID * CallerId, + IN EFI_STATUS_CODE_DATA * Data OPTIONAL + ) +/*++ + +Routine Description: + + Status Code reporter + +Arguments: + + CodeType - Type of Status Code. + + Value - Value to output for Status Code. + + Instance - Instance Number of this status code. + + CallerId - ID of the caller of this status code. + + Data - Optional data associated with this status code. + +Returns: + + Status code + +--*/ +; + +#endif diff --git a/EDK/Foundation/Library/Dxe/Include/EfiCommonLib.h b/EDK/Foundation/Library/Dxe/Include/EfiCommonLib.h new file mode 100644 index 0000000..d499d2b --- /dev/null +++ b/EDK/Foundation/Library/Dxe/Include/EfiCommonLib.h @@ -0,0 +1,1359 @@ +/*++ + +Copyright (c) 2004 - 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: + + EfiCommonLib.h + +Abstract: + + Light weight lib to support EFI drivers. + +--*/ + +#ifndef _EFI_COMMON_LIB_H_ +#define _EFI_COMMON_LIB_H_ + +EFI_STATUS +EfiLibGetSystemConfigurationTable ( + IN EFI_GUID *TableGuid, + IN OUT VOID **Table + ) +/*++ + +Routine Description: + + Return the EFI 1.0 System Tabl entry with TableGuid + +Arguments: + + TableGuid - Name of entry to return in the system table + Table - Pointer in EFI system table associated with TableGuid + +Returns: + + EFI_SUCCESS - Table returned; + EFI_NOT_FOUND - TableGuid not in EFI system table + +--*/ +; + +// +// ASPrint and AvSPrint definitions you must include the specific library +// to get the expected behavior from the two functions +// PEI: PeiLib +// Graphics: Dxe\Graphics\Unicode Dxe\Graphics\ASCII +// ASCII: Dxe\Print\ASCII +// Unicode: Dxe\Print\Unicode +// +UINTN +ASPrint ( + OUT CHAR8 *Buffer, + IN UINTN BufferSize, + IN CONST CHAR8 *Format, + ... + ) +/*++ + +Routine Description: + + Process format and place the results in Buffer for narrow chars. + +Arguments: + + Buffer - Narrow char buffer to print the results of the parsing of Format into. + BufferSize - Maximum number of characters to put into buffer. + Format - Format string + ... - Vararg list consumed by processing Format. + +Returns: + + Number of characters printed. + +--*/ +; + +UINTN +AvSPrint ( + OUT CHAR8 *StartOfBuffer, + IN UINTN StrSize, + IN CONST CHAR8 *Format, + IN VA_LIST Marker + ) +/*++ + +Routine Description: + + Internal implementation of ASPrint. + Process format and place the results in Buffer for narrow chars. + +Arguments: + + StartOfBuffer - Narrow char buffer to print the results of the parsing of Format into. + StrSize - Maximum number of characters to put into buffer. + FormatString - Format string + Marker - Vararg list consumed by processing Format. + +Returns: + + Number of characters printed. + +--*/ +; + +// +// Lib functions which can be used in both PEI and DXE pahse +// +EFI_STATUS +EfiInitializeCommonDriverLib ( + IN EFI_HANDLE ImageHandle, + IN VOID *SystemTable + ) +/*++ + +Routine Description: + + Initialize lib function calling phase: PEI or DXE + +Arguments: + + ImageHandle - The firmware allocated handle for the EFI image. + + SystemTable - A pointer to the EFI System Table. + +Returns: + + EFI_STATUS always returns EFI_SUCCESS + +--*/ +; + +EFI_STATUS +EfiCommonIoRead ( + IN UINT8 Width, + IN UINTN Address, + IN UINTN Count, + IN OUT VOID *Buffer + ) +/*++ + +Routine Description: + + Io read operation. + +Arguments: + + Width - Width of read operation + Address - Start IO address to read + Count - Read count + Buffer - Buffer to store result + +Returns: + + Status code + +--*/ +; + +EFI_STATUS +EfiCommonIoWrite ( + IN UINT8 Width, + IN UINTN Address, + IN UINTN Count, + IN OUT VOID *Buffer + ) +/*++ + +Routine Description: + + Io write operation. + +Arguments: + + Width - Width of write operation + Address - Start IO address to write + Count - Write count + Buffer - Buffer to write to the address + +Returns: + + Status code + +--*/ +; + +EFI_STATUS +EfiCommonPciRead ( + IN UINT8 Width, + IN UINT64 Address, + IN UINTN Count, + IN OUT VOID *Buffer + ) +/*++ + +Routine Description: + + Pci read operation + +Arguments: + + Width - Width of PCI read + Address - PCI address to read + Count - Read count + Buffer - Output buffer for the read + +Returns: + + Status code + +--*/ +; + +EFI_STATUS +EfiCommonPciWrite ( + IN UINT8 Width, + IN UINT64 Address, + IN UINTN Count, + IN OUT VOID *Buffer + ) +/*++ + +Routine Description: + + Pci write operation + +Arguments: + + Width - Width of PCI write + Address - PCI address to write + Count - Write count + Buffer - Buffer to write to the address + +Returns: + + Status code + +--*/ +; + +BOOLEAN +EfiCompareGuid ( + IN EFI_GUID *Guid1, + IN EFI_GUID *Guid2 + ) +/*++ + +Routine Description: + + Compares two GUIDs + +Arguments: + + Guid1 - guid to compare + + Guid2 - guid to compare + +Returns: + TRUE if Guid1 == Guid2 + FALSE if Guid1 != Guid2 + +--*/ +; + +VOID +EfiCommonLibSetMem ( + IN VOID *Buffer, + IN UINTN Size, + IN UINT8 Value + ) +/*++ + +Routine Description: + + Set Buffer to Value for Size bytes. + +Arguments: + + Buffer - Memory to set. + + Size - Number of bytes to set + + Value - Value of the set operation. + +Returns: + + None + +--*/ +; + +VOID +EfiCommonLibCopyMem ( + IN VOID *Destination, + IN VOID *Source, + IN UINTN Length + ) +/*++ + +Routine Description: + + Copy Length bytes from Source to Destination. + +Arguments: + + Destination - Target of copy + + Source - Place to copy from + + Length - Number of bytes to copy + +Returns: + + None + +--*/ +; + +INTN +EfiCompareMem ( + IN VOID *MemOne, + IN VOID *MemTwo, + IN UINTN Len + ) +/*++ + +Routine Description: + + Compares two memory buffers of a given length. + +Arguments: + + MemOne - First memory buffer + + MemTwo - Second memory buffer + + Len - Length of Mem1 and Mem2 memory regions to compare + +Returns: + + = 0 if MemOne == MemTwo + + > 0 if MemOne > MemTwo + + < 0 if MemOne < MemTwo + +--*/ +; + +VOID +EfiCommonLibZeroMem ( + IN VOID *Buffer, + IN UINTN Size + ) +/*++ + +Routine Description: + + Set Buffer to 0 for Size bytes. + +Arguments: + + Buffer - Memory to set. + + Size - Number of bytes to set + +Returns: + + None + +--*/ +; + +// +// Min Max +// +#define EFI_MIN(a, b) (((a) < (b)) ? (a) : (b)) +#define EFI_MAX(a, b) (((a) > (b)) ? (a) : (b)) + +// +// Align a pointer. The pointer represented by ptr is aligned to the bound. +// The resulting pointer is always equal or greater (by no more than bound-1) +// than the ptr. I.e., if the ptr is already aligned, the result will be equal to ptr. +// Valid values for bound are powers of two: 2, 4, 8, 16, 32 etc. +// The returned pointer is VOID* this assignment-compatible with all pointer types. +// +#define EFI_ALIGN(ptr, bound) ((VOID *) (((UINTN) (ptr) + ((UINTN) (bound) - 1)) &~((UINTN) (bound) - 1))) + +// +// Alignment tests. +// +#define EFI_UINTN_ALIGN_MASK (sizeof (UINTN) - 1) +#define EFI_UINTN_ALIGNED(ptr) (((UINTN) (ptr)) & EFI_UINTN_ALIGN_MASK) + +// +// Integer division with rounding to the nearest rather than truncating. +// For example 8/3=2 but EFI_IDIV_ROUND(8,3)=3. 1/3=0 and EFI_IDIV_ROUND(1,3)=0. +// A half is rounded up e.g., EFI_IDIV_ROUND(1,2)=1 but 1/2=0. +// +#define EFI_IDIV_ROUND(r, s) ((r) / (s) + (((2 * ((r) % (s))) < (s)) ? 0 : 1)) + +// +// ReportStatusCode.c init +// +VOID * +EfiConstructStatusCodeData ( + IN UINT16 DataSize, + IN EFI_GUID *TypeGuid, + IN OUT EFI_STATUS_CODE_DATA *Data + ) +/*++ + +Routine Description: + + Construct stanader header for optional data passed into ReportStatusCode + +Arguments: + + DataSize - Size of optional data. Does not include EFI_STATUS_CODE_DATA header + TypeGuid - GUID to place in EFI_STATUS_CODE_DATA + Data - Buffer to use. + +Returns: + + Return pointer to Data buffer pointing past the end of EFI_STATUS_CODE_DATA + +--*/ +; + +EFI_STATUS +EfiDebugVPrintWorker ( + IN UINTN ErrorLevel, + IN CHAR8 *Format, + IN VA_LIST Marker, + IN UINTN BufferSize, + IN OUT VOID *Buffer + ) +/*++ + +Routine Description: + + Worker function for DEBUG(). If Error Logging hub is loaded log ASSERT + information. If Error Logging hub is not loaded do nothing. + + We use UINT64 buffers due to IPF alignment concerns. + +Arguments: + + ErrorLevel - If error level is set do the debug print. + + Format - String to use for the print, followed by Print arguments. + + Marker - VarArgs + + BufferSize - Size of Buffer. + + Buffer - Caller allocated buffer, contains ReportStatusCode extended data + +Returns: + + Status code + +--*/ +; + +EFI_STATUS +EfiDebugAssertWorker ( + IN CHAR8 *FileName, + IN INTN LineNumber, + IN CHAR8 *Description, + IN UINTN BufferSize, + IN OUT VOID *Buffer + ) +/*++ + +Routine Description: + + Worker function for ASSERT (). If Error Logging hub is loaded log ASSERT + information. If Error Logging hub is not loaded DEADLOOP (). + + We use UINT64 buffers due to IPF alignment concerns. + +Arguments: + + FileName - File name of failing routine. + + LineNumber - Line number of failing ASSERT(). + + Description - Description, usually the assertion, + + BufferSize - Size of Buffer. + + Buffer - Caller allocated buffer, contains ReportStatusCode extendecd data + +Returns: + + Status code + +--*/ +; + +BOOLEAN +ReportStatusCodeExtractAssertInfo ( + IN EFI_STATUS_CODE_TYPE CodeType, + IN EFI_STATUS_CODE_VALUE Value, + IN EFI_STATUS_CODE_DATA *Data, + OUT CHAR8 **Filename, + OUT CHAR8 **Description, + OUT UINT32 *LineNumber + ) +/*++ + +Routine Description: + + Extract assert information from status code data. + +Arguments: + + CodeType - Code type + Value - Code value + Data - Optional data associated with this status code. + Filename - Filename extracted from Data + Description - Description extracted from Data + LineNumber - Line number extracted from Data + +Returns: + + TRUE - Successfully extracted + + FALSE - Extraction failed + +--*/ +; + +BOOLEAN +ReportStatusCodeExtractDebugInfo ( + IN EFI_STATUS_CODE_DATA *Data, + OUT UINT32 *ErrorLevel, + OUT VA_LIST *Marker, + OUT CHAR8 **Format + ) +/*++ + +Routine Description: + + Extract debug information from status code data. + +Arguments: + + Data - Optional data associated with status code. + ErrorLevel - Error level extracted from Data + Marker - VA_LIST extracted from Data + Format - Format string extracted from Data + +Returns: + + TRUE - Successfully extracted + + FALSE - Extraction failed + +--*/ +; + +BOOLEAN +CodeTypeToPostCode ( + IN EFI_STATUS_CODE_TYPE CodeType, + IN EFI_STATUS_CODE_VALUE Value, + OUT UINT8 *PostCode + ) +/*++ + +Routine Description: + + Convert code value to an 8 bit post code + +Arguments: + + CodeType - Code type + Value - Code value + PostCode - Post code as output + +Returns: + + TRUE - Successfully converted + + FALSE - Convertion failed + +--*/ +; + +// +// math.c +// +UINT64 +MultU64x32 ( + IN UINT64 Multiplicand, + IN UINTN Multiplier + ) +/*++ + +Routine Description: + + This routine allows a 64 bit value to be multiplied with a 32 bit + value returns 64bit result. + No checking if the result is greater than 64bits + +Arguments: + + Multiplicand - multiplicand + Multiplier - multiplier + +Returns: + + Multiplicand * Multiplier + +--*/ +; + +UINT64 +DivU64x32 ( + IN UINT64 Dividend, + IN UINTN Divisor, + OUT UINTN *Remainder OPTIONAL + ) +/*++ + +Routine Description: + + This routine allows a 64 bit value to be divided with a 32 bit value returns + 64bit result and the Remainder. + +Arguments: + + Dividend - dividend + Divisor - divisor + Remainder - buffer for remainder + +Returns: + + Dividend / Divisor + Remainder = Dividend mod Divisor + +--*/ +; + +UINT64 +RShiftU64 ( + IN UINT64 Operand, + IN UINTN Count + ) +/*++ + +Routine Description: + + This routine allows a 64 bit value to be right shifted by 32 bits and returns the + shifted value. + Count is valid up 63. (Only Bits 0-5 is valid for Count) + +Arguments: + + Operand - Value to be shifted + Count - Number of times to shift right. + +Returns: + + Value shifted right identified by the Count. + +--*/ +; + +UINT64 +LShiftU64 ( + IN UINT64 Operand, + IN UINTN Count + ) +/*++ + +Routine Description: + + This routine allows a 64 bit value to be left shifted by 32 bits and + returns the shifted value. + Count is valid up 63. (Only Bits 0-5 is valid for Count) + +Arguments: + + Operand - Value to be shifted + Count - Number of times to shift left. + +Returns: + + Value shifted left identified by the Count. + +--*/ +; + +UINT64 +Power10U64 ( + IN UINT64 Operand, + IN UINTN Power + ) +/*++ + +Routine Description: + + Raise 10 to the power of Power, and multiply the result with Operand + +Arguments: + + Operand - multiplicand + Power - power + +Returns: + + Operand * 10 ^ Power + +--*/ +; + +UINT8 +Log2 ( + IN UINT64 Operand + ) +/*++ + +Routine Description: + + Calculates and floors logarithms based on 2 + +Arguments: + + Operand - value to calculate logarithm + +Returns: + + The largest integer that is less than or equal + to the logarithm of Operand based on 2 + +--*/ +; + +UINT64 +GetPowerOfTwo ( + IN UINT64 Input + ) +/*++ + +Routine Description: + + Calculates the largest integer that is both + a power of two and less than Input + +Arguments: + + Input - value to calculate power of two + +Returns: + + the largest integer that is both a power of + two and less than Input + +--*/ +; + +// +// Unicode String primatives +// +VOID +EfiStrCpy ( + IN CHAR16 *Destination, + IN CHAR16 *Source + ) +/*++ + +Routine Description: + Copy the Unicode string Source to Destination. + +Arguments: + Destination - Location to copy string + Source - String to copy + +Returns: + NONE + +--*/ +; + +VOID +EfiStrnCpy ( + OUT CHAR16 *Dst, + IN CHAR16 *Src, + IN UINTN Length + ) +/*++ + +Routine Description: + Copy a string from source to destination + +Arguments: + Dst Destination string + Src Source string + Length Length of destination string + +Returns: + +--*/ +; + +UINTN +EfiStrLen ( + 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 +EfiStrSize ( + IN CHAR16 *String + ) +/*++ + +Routine Description: + Return the number bytes in the Unicode String. This is not the same as + the length of the string in characters. The string size includes the NULL + +Arguments: + String - String to process + +Returns: + Number of bytes in String + +--*/ +; + +INTN +EfiStrCmp ( + IN CHAR16 *String, + IN CHAR16 *String2 + ) +/*++ + +Routine Description: + Return the alphabetic relationship between two stirngs. + +Arguments: + String - Compare to String2 + + String2 - Compare to String + +Returns: + 0 - Identical + + > 0 - String is alphabeticly greater than String2 + + < 0 - String is alphabeticly less than String2 + +--*/ +; + +INTN +EfiStrnCmp ( + IN CHAR16 *String, + IN CHAR16 *String2, + IN UINTN Length + ) +/*++ + +Routine Description: + This function compares the Unicode string String to the Unicode + string String2 for len characters. If the first len characters + of String is identical to the first len characters of String2, + then 0 is returned. If substring of String sorts lexicographically + after String2, the function returns a number greater than 0. If + substring of String sorts lexicographically before String2, the + function returns a number less than 0. + +Arguments: + String - Compare to String2 + String2 - Compare to String + Length - Number of Unicode characters to compare + +Returns: + 0 - The substring of String and String2 is identical. + > 0 - The substring of String sorts lexicographically after String2 + < 0 - The substring of String sorts lexicographically before String2 + +--*/ +; + +VOID +EfiStrCat ( + IN CHAR16 *Destination, + IN CHAR16 *Source + ) +/*++ + +Routine Description: + Concatinate Source on the end of Destination + +Arguments: + Destination - String to added to the end of. + Source - String to concatinate. + +Returns: + NONE + +--*/ +; + +VOID +EfiStrnCat ( + IN CHAR16 *Dest, + IN CHAR16 *Src, + IN UINTN Length + ) +/*++ + +Routine Description: + Concatinate Source on the end of Destination + +Arguments: + Dst Destination string + Src Source string + Length Length of destination string + +Returns: + +--*/ +; + +UINTN +EfiAsciiStrLen ( + 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 Unicode characters in String + +--*/ +; + +CHAR8 * +EfiAsciiStrCpy ( + IN CHAR8 *Destination, + IN CHAR8 *Source + ) +/*++ + +Routine Description: + Copy the Ascii string Source to Destination. + +Arguments: + Destination - Location to copy string + Source - String to copy + +Returns: + Pointer just pass the end of Destination + +--*/ +; + +VOID +EfiAsciiStrnCpy ( + OUT CHAR8 *Dst, + IN CHAR8 *Src, + IN UINTN Length + ) +/*++ + +Routine Description: + Copy the Ascii string from source to destination + +Arguments: + Dst Destination string + Src Source string + Length Length of destination string + +Returns: + +--*/ +; + +UINTN +EfiAsciiStrSize ( + IN CHAR8 *String + ) +/*++ + +Routine Description: + Return the number bytes in the Ascii String. This is not the same as + the length of the string in characters. The string size includes the NULL + +Arguments: + String - String to process + +Returns: + Number of bytes in String + +--*/ +; + + +INTN +EfiAsciiStrCmp ( + IN CHAR8 *String, + IN CHAR8 *String2 + ) +/*++ + +Routine Description: + Compare the Ascii string pointed by String to the string pointed by String2. + +Arguments: + String - String to process + + String2 - The other string to process + +Returns: + Return a positive integer if String is lexicall greater than String2; Zero if + the two strings are identical; and a negative interger if String is lexically + less than String2. +--*/ +; + +INTN +EfiAsciiStrnCmp ( + IN CHAR8 *String, + IN CHAR8 *String2, + IN UINTN Length + ) +/*++ + +Routine Description: + This function compares the ASCII string String to the ASCII + string String2 for len characters. If the first len characters + of String is identical to the first len characters of String2, + then 0 is returned. If substring of String sorts lexicographically + after String2, the function returns a number greater than 0. If + substring of String sorts lexicographically before String2, the + function returns a number less than 0. + +Arguments: + String - Compare to String2 + String2 - Compare to String + Length - Number of ASCII characters to compare + +Returns: + 0 - The substring of String and String2 is identical. + > 0 - The substring of String sorts lexicographically after String2 + < 0 - The substring of String sorts lexicographically before String2 + +--*/ +; + +VOID +EfiAsciiStrCat ( + IN CHAR8 *Destination, + IN CHAR8 *Source + ) +/*++ + +Routine Description: + Concatinate Source on the end of Destination + +Arguments: + Destination - String to added to the end of. + Source - String to concatinate. + +Returns: + NONE + +--*/ +; + +VOID +EfiAsciiStrnCat ( + IN CHAR8 *Destination, + IN CHAR8 *Source, + IN UINTN Length + ) +/*++ + +Routine Description: + Concatinate Source on the end of Destination + +Arguments: + Destination - String to added to the end of. + Source - String to concatinate. + +Returns: + NONE + +--*/ +; + +// +// Print primitives +// +#define LEFT_JUSTIFY 0x01 +#define PREFIX_SIGN 0x02 +#define PREFIX_BLANK 0x04 +#define COMMA_TYPE 0x08 +#define LONG_TYPE 0x10 +#define PREFIX_ZERO 0x20 + +// +// Length of temp string buffer to store value string. +// +#define CHARACTER_NUMBER_FOR_VALUE 30 + +UINTN +EfiValueToHexStr ( + IN OUT CHAR16 *Buffer, + IN UINT64 Value, + IN UINTN Flags, + IN UINTN Width + ) +/*++ + +Routine Description: + + VSPrint worker function that prints a Value as a hex number in Buffer + +Arguments: + + Buffer - Location to place ascii hex string of Value. + + Value - Hex value to convert to a string in Buffer. + + Flags - Flags to use in printing Hex string, see file header for details. + + Width - Width of hex value. + +Returns: + + Number of characters printed. + +--*/ +; + +UINTN +EfiValueToString ( + IN OUT CHAR16 *Buffer, + IN INT64 Value, + IN UINTN Flags, + IN UINTN Width + ) +/*++ + +Routine Description: + + VSPrint worker function that prints a Value as a decimal number in Buffer + +Arguments: + + Buffer - Location to place ascii decimal number string of Value. + + Value - Decimal value to convert to a string in Buffer. + + Flags - Flags to use in printing decimal string, see file header for details. + + Width - Width of hex value. + +Returns: + + Number of characters printed. + +--*/ +; + +BOOLEAN +IsHexDigit ( + OUT UINT8 *Digit, + IN CHAR16 Char + ) +/*++ + + Routine Description: + Determines if a Unicode character is a hexadecimal digit. + The test is case insensitive. + + Arguments: + Digit - Pointer to byte that receives the value of the hex character. + Char - Unicode character to test. + + Returns: + TRUE - If the character is a hexadecimal digit. + FALSE - Otherwise. + +--*/ +; + +CHAR16 +NibbleToHexChar ( + UINT8 Nibble + ) +/*++ + + Routine Description: + Converts the low nibble of a byte to hex unicode character. + + Arguments: + Nibble - lower nibble of a byte. + + Returns: + Hex unicode character. + +--*/ +; + +EFI_STATUS +HexStringToBuf ( + IN OUT UINT8 *Buf, + IN OUT UINTN *Len, + IN CHAR16 *Str, + OUT UINTN *ConvertedStrLen OPTIONAL + ) +/*++ + + Routine Description: + Converts Unicode string to binary buffer. + The conversion may be partial. + The first character in the string that is not hex digit stops the conversion. + At a minimum, any blob of data could be represented as a hex string. + + Arguments: + Buf - Pointer to buffer that receives the data. + Len - Length in bytes of the buffer to hold converted data. + If routine return with EFI_SUCCESS, containing length of converted data. + If routine return with EFI_BUFFER_TOO_SMALL, containg length of buffer desired. + Str - String to be converted from. + ConvertedStrLen - Length of the Hex String consumed. + + Returns: + EFI_SUCCESS: Routine Success. + EFI_BUFFER_TOO_SMALL: The buffer is too small to hold converted data. + EFI_ + +--*/ +; + +EFI_STATUS +BufToHexString ( + IN OUT CHAR16 *Str, + IN OUT UINTN *HexStringBufferLength, + IN UINT8 *Buf, + IN UINTN Len + ) +/*++ + + Routine Description: + Converts binary buffer to Unicode string. + At a minimum, any blob of data could be represented as a hex string. + + Arguments: + Str - Pointer to the string. + HexStringBufferLength - Length in bytes of buffer to hold the hex string. Includes tailing '\0' character. + If routine return with EFI_SUCCESS, containing length of hex string buffer. + If routine return with EFI_BUFFER_TOO_SMALL, containg length of hex string buffer desired. + Buf - Buffer to be converted from. + Len - Length in bytes of the buffer to be converted. + + Returns: + EFI_SUCCESS: Routine success. + EFI_BUFFER_TOO_SMALL: The hex string buffer is too small. + +--*/ +; + +VOID +EfiStrTrim ( + IN OUT CHAR16 *str, + IN CHAR16 CharC + ) +/*++ + +Routine Description: + + Removes (trims) specified leading and trailing characters from a string. + +Arguments: + + str - Pointer to the null-terminated string to be trimmed. On return, + str will hold the trimmed string. + CharC - Character will be trimmed from str. + +Returns: + + None + +--*/ +; +CHAR16* +EfiStrStr ( + IN CHAR16 *String, + IN CHAR16 *StrCharSet + ) +/*++ + +Routine Description: + + Find a substring. + +Arguments: + + String - Null-terminated string to search. + StrCharSet - Null-terminated string to search for. + +Returns: + The address of the first occurrence of the matching substring if successful, or NULL otherwise. +--*/ +; + +CHAR8* +EfiAsciiStrStr ( + IN CHAR8 *String, + IN CHAR8 *StrCharSet + ) +/*++ + +Routine Description: + + Find a Ascii substring. + +Arguments: + + String - Null-terminated Ascii string to search. + StrCharSet - Null-terminated Ascii string to search for. + +Returns: + The address of the first occurrence of the matching Ascii substring if successful, or NULL otherwise. +--*/ +; +#endif diff --git a/EDK/Foundation/Library/Dxe/Include/EfiDriverLib.h b/EDK/Foundation/Library/Dxe/Include/EfiDriverLib.h new file mode 100644 index 0000000..20ba3af --- /dev/null +++ b/EDK/Foundation/Library/Dxe/Include/EfiDriverLib.h @@ -0,0 +1,1231 @@ +/*++ + +Copyright (c) 2004 - 2008, 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: + + EfiDriverLib.h + +Abstract: + + Light weight lib to support EFI drivers. + +--*/ + +#ifndef _EFI_DRIVER_LIB_H_ +#define _EFI_DRIVER_LIB_H_ + +#include "EfiStatusCode.h" +#include "EfiCommonLib.h" +#include "EfiPerf.h" +#include "LinkedList.h" +#include "GetImage.h" +#include "EfiImageFormat.h" +#include "EfiCompNameSupport.h" + +#include EFI_GUID_DEFINITION (DxeServices) +#include EFI_GUID_DEFINITION (EventGroup) +#include EFI_GUID_DEFINITION (EventLegacyBios) +#include EFI_GUID_DEFINITION (FrameworkDevicePath) +#include EFI_PROTOCOL_DEFINITION (FirmwareVolume) +#include EFI_PROTOCOL_DEFINITION (FirmwareVolume2) //;;## ...AMI_OVERRIDE... Support PI1.x +#include EFI_PROTOCOL_DEFINITION (DataHub) +#include EFI_PROTOCOL_DEFINITION (DriverBinding) +#include EFI_PROTOCOL_DEFINITION (ComponentName) +#include EFI_PROTOCOL_DEFINITION (ComponentName2) +#include EFI_PROTOCOL_DEFINITION (DriverConfiguration) +#include EFI_PROTOCOL_DEFINITION (DriverConfiguration2) +#include EFI_PROTOCOL_DEFINITION (DriverDiagnostics) +#include EFI_PROTOCOL_DEFINITION (DriverDiagnostics2) + +#include EFI_PROTOCOL_DEFINITION (DebugMask) + +typedef struct { + CHAR8 *Language; + CHAR16 *UnicodeString; +} EFI_UNICODE_STRING_TABLE; + +#if (EFI_SPECIFICATION_VERSION >= 0x00020000) +#define LANGUAGE_CODE_ENGLISH "en-US" +#else +#define LANGUAGE_CODE_ENGLISH "eng" +#endif + +// +// Macros for EFI Driver Library Functions that are really EFI Boot Services +// +#define EfiCopyMem(_Destination, _Source, _Length) gBS->CopyMem ((_Destination), (_Source), (_Length)) +#define EfiSetMem(_Destination, _Length, _Value) gBS->SetMem ((_Destination), (_Length), (_Value)) +#define EfiZeroMem(_Destination, _Length) gBS->SetMem ((_Destination), (_Length), 0) + +// +// Driver Lib Globals. +// +extern EFI_BOOT_SERVICES *gBS; +extern EFI_DXE_SERVICES *gDS; +extern EFI_RUNTIME_SERVICES *gRT; +extern EFI_SYSTEM_TABLE *gST; +extern UINTN gErrorLevel; +extern EFI_GUID gEfiCallerIdGuid; +extern EFI_DEBUG_MASK_PROTOCOL *gDebugMaskInterface; + +EFI_STATUS +EfiInitializeDriverLib ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +/*++ + +Routine Description: + + Intialize Driver Lib if it has not yet been initialized. + +Arguments: + + ImageHandle - The firmware allocated handle for the EFI image. + + SystemTable - A pointer to the EFI System Table. + + +Returns: + + EFI_STATUS always returns EFI_SUCCESS + +--*/ +; + +EFI_STATUS +DxeInitializeDriverLib ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +/*++ + +Routine Description: + + Intialize Driver Lib if it has not yet been initialized. + +Arguments: + + ImageHandle - The firmware allocated handle for the EFI image. + + SystemTable - A pointer to the EFI System Table. + +Returns: + + EFI_STATUS always returns EFI_SUCCESS + +--*/ +; + +EFI_STATUS +EfiLibInstallDriverBinding ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable, + IN EFI_DRIVER_BINDING_PROTOCOL *DriverBinding, + IN EFI_HANDLE DriverBindingHandle + ) +/*++ + +Routine Description: + + Intialize a driver by installing the Driver Binding Protocol onto the + driver's DriverBindingHandle. This is typically the same as the driver's + ImageHandle, but it can be different if the driver produces multiple + DriverBinding Protocols. This function also initializes the EFI Driver + Library that initializes the global variables gST, gBS, gRT. + +Arguments: + + ImageHandle - The image handle of the driver + + SystemTable - The EFI System Table that was passed to the driver's entry point + + DriverBinding - A Driver Binding Protocol instance that this driver is producing + + DriverBindingHandle - The handle that DriverBinding is to be installe onto. If this + parameter is NULL, then a new handle is created. + +Returns: + + EFI_SUCCESS is DriverBinding is installed onto DriverBindingHandle + + Otherwise, then return status from gBS->InstallProtocolInterface() + +--*/ +; + +EFI_STATUS +EfiLibInstallAllDriverProtocols ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable, + IN EFI_DRIVER_BINDING_PROTOCOL *DriverBinding, + IN EFI_HANDLE DriverBindingHandle, + IN EFI_COMPONENT_NAME_PROTOCOL *ComponentName, OPTIONAL + IN EFI_DRIVER_CONFIGURATION_PROTOCOL *DriverConfiguration, OPTIONAL + IN EFI_DRIVER_DIAGNOSTICS_PROTOCOL *DriverDiagnostics OPTIONAL + ) +/*++ + +Routine Description: + + Intialize a driver by installing the Driver Binding Protocol onto the + driver's DriverBindingHandle. This is typically the same as the driver's + ImageHandle, but it can be different if the driver produces multiple + DriverBinding Protocols. This function also initializes the EFI Driver + Library that initializes the global variables gST, gBS, gRT. + +Arguments: + + ImageHandle - The image handle of the driver + + SystemTable - The EFI System Table that was passed to the driver's entry point + + DriverBinding - A Driver Binding Protocol instance that this driver is producing + + DriverBindingHandle - The handle that DriverBinding is to be installe onto. If this + parameter is NULL, then a new handle is created. + + ComponentName - A Component Name Protocol instance that this driver is producing + + DriverConfiguration - A Driver Configuration Protocol instance that this driver is producing + + DriverDiagnostics - A Driver Diagnostics Protocol instance that this driver is producing + +Returns: + + EFI_SUCCESS if all the protocols were installed onto DriverBindingHandle + + Otherwise, then return status from gBS->InstallProtocolInterface() + +--*/ +; + +EFI_STATUS +EfiLibInstallAllDriverProtocols2 ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable, + IN EFI_DRIVER_BINDING_PROTOCOL *DriverBinding, + IN EFI_HANDLE DriverBindingHandle, + IN EFI_COMPONENT_NAME2_PROTOCOL *ComponentName2, OPTIONAL + IN EFI_DRIVER_CONFIGURATION2_PROTOCOL *DriverConfiguration2, OPTIONAL + IN EFI_DRIVER_DIAGNOSTICS2_PROTOCOL *DriverDiagnostics2 OPTIONAL + ) +/*++ + +Routine Description: + + Intialize a driver by installing the Driver Binding Protocol onto the + driver's DriverBindingHandle. This is typically the same as the driver's + ImageHandle, but it can be different if the driver produces multiple + DriverBinding Protocols. This function also initializes the EFI Driver + Library that initializes the global variables gST, gBS, gRT. + +Arguments: + + ImageHandle - The image handle of the driver + + SystemTable - The EFI System Table that was passed to the driver's entry point + + DriverBinding - A Driver Binding Protocol instance that this driver is producing + + DriverBindingHandle - The handle that DriverBinding is to be installe onto. If this + parameter is NULL, then a new handle is created. + + ComponentName2 - A Component Name2 Protocol instance that this driver is producing + + DriverConfiguration2- A Driver Configuration2 Protocol instance that this driver is producing + + DriverDiagnostics2 - A Driver Diagnostics2 Protocol instance that this driver is producing + +Returns: + + EFI_SUCCESS if all the protocols were installed onto DriverBindingHandle + + Otherwise, then return status from gBS->InstallProtocolInterface() + +--*/ +; + +EFI_STATUS +EfiLibGetSystemConfigurationTable ( + IN EFI_GUID *TableGuid, + OUT VOID **Table + ) +/*++ + +Routine Description: + + Return the EFI 1.0 System Tabl entry with TableGuid + +Arguments: + + TableGuid - Name of entry to return in the system table + Table - Pointer in EFI system table associated with TableGuid + +Returns: + + EFI_SUCCESS - Table returned; + EFI_NOT_FOUND - TableGuid not in EFI system table + +--*/ +; + +BOOLEAN +EfiLibCompareLanguage ( + CHAR8 *Language1, + CHAR8 *Language2 + ) +/*++ + +Routine Description: + + Compare two languages to say whether they are identical. + +Arguments: + + Language1 - first language + Language2 - second language + +Returns: + + TRUE - identical + FALSE - not identical + +--*/ +; + +// +// DevicePath.c +// +BOOLEAN +EfiIsDevicePathMultiInstance ( + IN EFI_DEVICE_PATH_PROTOCOL *DevicePath + ) +/*++ + +Routine Description: + Return TRUE is this is a multi instance device path. + +Arguments: + DevicePath - A pointer to a device path data structure. + + +Returns: + TRUE - If DevicePath is multi instance. + FALSE - If DevicePath is not multi instance. + +--*/ +; + +EFI_DEVICE_PATH_PROTOCOL * +EfiDevicePathInstance ( + IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath, + OUT UINTN *Size + ) +/*++ + +Routine Description: + Function retrieves the next device path instance from a device path data structure. + +Arguments: + DevicePath - A pointer to a device path data structure. + + Size - A pointer to the size of a device path instance in bytes. + +Returns: + + This function returns a pointer to the current device path instance. + In addition, it returns the size in bytes of the current device path instance in Size, + and a pointer to the next device path instance in DevicePath. + If there are no more device path instances in DevicePath, then DevicePath will be set to NULL. + +--*/ +; + +UINTN +EfiDevicePathSize ( + IN EFI_DEVICE_PATH_PROTOCOL *DevPath + ) +/*++ + +Routine Description: + + Calculate the size of a whole device path. + +Arguments: + + DevPath - The pointer to the device path data. + +Returns: + + Size of device path data structure.. + +--*/ +; + +EFI_DEVICE_PATH_PROTOCOL * +EfiAppendDevicePath ( + IN EFI_DEVICE_PATH_PROTOCOL *Src1, + IN EFI_DEVICE_PATH_PROTOCOL *Src2 + ) +/*++ + +Routine Description: + Function is used to append a Src1 and Src2 together. + +Arguments: + Src1 - A pointer to a device path data structure. + + Src2 - A pointer to a device path data structure. + +Returns: + + A pointer to the new device path is returned. + NULL is returned if space for the new device path could not be allocated from pool. + It is up to the caller to free the memory used by Src1 and Src2 if they are no longer needed. + +--*/ +; + +EFI_DEVICE_PATH_PROTOCOL * +EfiDevicePathFromHandle ( + IN EFI_HANDLE Handle + ) +/*++ + +Routine Description: + + Locate device path protocol interface on a device handle. + +Arguments: + + Handle - The device handle + +Returns: + + Device path protocol interface located. + +--*/ +; + +EFI_DEVICE_PATH_PROTOCOL * +EfiDuplicateDevicePath ( + IN EFI_DEVICE_PATH_PROTOCOL *DevPath + ) +/*++ + +Routine Description: + Duplicate a new device path data structure from the old one. + +Arguments: + DevPath - A pointer to a device path data structure. + +Returns: + A pointer to the new allocated device path data. + Caller must free the memory used by DevicePath if it is no longer needed. + +--*/ +; + +EFI_DEVICE_PATH_PROTOCOL * +EfiAppendDevicePathNode ( + IN EFI_DEVICE_PATH_PROTOCOL *Src1, + IN EFI_DEVICE_PATH_PROTOCOL *Src2 + ) +/*++ + +Routine Description: + Function is used to append a device path node to the end of another device path. + +Arguments: + Src1 - A pointer to a device path data structure. + + Src2 - A pointer to a device path data structure. + +Returns: + This function returns a pointer to the new device path. + If there is not enough temporary pool memory available to complete this function, + then NULL is returned. + + +--*/ +; + +EFI_DEVICE_PATH_PROTOCOL * +EfiFileDevicePath ( + IN EFI_HANDLE Device OPTIONAL, + IN CHAR16 *FileName + ) +/*++ + +Routine Description: + Create a device path that appends a MEDIA_DEVICE_PATH with + FileNameGuid to the device path of DeviceHandle. + +Arguments: + Device - Optional Device Handle to use as Root of the Device Path + + FileName - FileName + +Returns: + EFI_DEVICE_PATH_PROTOCOL that was allocated from dynamic memory + or NULL pointer. + +--*/ +; + +EFI_DEVICE_PATH_PROTOCOL * +EfiAppendDevicePathInstance ( + IN EFI_DEVICE_PATH_PROTOCOL *Src, + IN EFI_DEVICE_PATH_PROTOCOL *Instance + ) +/*++ + +Routine Description: + + Append a device path instance to another. + +Arguments: + + Src - The device path instance to be appended with. + Instance - The device path instance appending the other. + +Returns: + + The contaction of these two. + +--*/ +; + +// +// Lock.c +// +typedef struct { + EFI_TPL Tpl; + EFI_TPL OwnerTpl; + UINTN Lock; +} EFI_LOCK; + +VOID +EfiInitializeLock ( + IN OUT EFI_LOCK *Lock, + IN EFI_TPL Priority + ) +/*++ + +Routine Description: + + Initialize a basic mutual exclusion lock. Each lock + provides mutual exclusion access at it's task priority + level. Since there is no-premption (at any TPL) or + multiprocessor support, acquiring the lock only consists + of raising to the locks TPL. + + Note on a check build ASSERT()s are used to ensure proper + lock usage. + +Arguments: + + Lock - The EFI_LOCK structure to initialize + + Priority - The task priority level of the lock + + +Returns: + + An initialized Efi Lock structure. + +--*/ +; + +// +// Macro to initialize the state of a lock when a lock variable is declared +// +#define EFI_INITIALIZE_LOCK_VARIABLE(Tpl) {Tpl,0,0} + +VOID +EfiAcquireLock ( + IN EFI_LOCK *Lock + ) +/*++ + +Routine Description: + + Raising to the task priority level of the mutual exclusion + lock, and then acquires ownership of the lock. + +Arguments: + + Lock - The lock to acquire + +Returns: + + None + +--*/ +; + +EFI_STATUS +EfiAcquireLockOrFail ( + IN EFI_LOCK *Lock + ) +/*++ + +Routine Description: + + Initialize a basic mutual exclusion lock. Each lock + provides mutual exclusion access at it's task priority + level. Since there is no-premption (at any TPL) or + multiprocessor support, acquiring the lock only consists + of raising to the locks TPL. + +Arguments: + + Lock - The EFI_LOCK structure to initialize + +Returns: + + EFI_SUCCESS - Lock Owned. + EFI_ACCESS_DENIED - Reentrant Lock Acquisition, Lock not Owned. + +--*/ +; + +VOID +EfiReleaseLock ( + IN EFI_LOCK *Lock + ) +/*++ + +Routine Description: + + Releases ownership of the mutual exclusion lock, and + restores the previous task priority level. + +Arguments: + + Lock - The lock to release + +Returns: + + None + +--*/ +; + +VOID * +EfiLibAllocatePool ( + IN UINTN AllocationSize + ) +/*++ + +Routine Description: + + Allocate EfiBootServicesData pool of size AllocationSize + +Arguments: + + AllocationSize - Pool size + +Returns: + + Pointer to the pool allocated + +--*/ +; + +VOID * +EfiLibAllocateRuntimePool ( + IN UINTN AllocationSize + ) +/*++ + +Routine Description: + + Allocate EfiRuntimeServicesData pool of size AllocationSize + +Arguments: + + AllocationSize - Pool size + +Returns: + + Pointer to the pool allocated + +--*/ +; + +VOID * +EfiLibAllocateZeroPool ( + IN UINTN AllocationSize + ) +/*++ + +Routine Description: + + Allocate EfiBootServicesData pool of size AllocationSize and set memory to zero. + +Arguments: + + AllocationSize - Pool size + +Returns: + + Pointer to the pool allocated + +--*/ +; + +VOID * +EfiLibAllocateRuntimeZeroPool ( + IN UINTN AllocationSize + ) +/*++ + +Routine Description: + + Allocate EfiRuntimeServicesData pool of size AllocationSize and set memory to zero. + +Arguments: + + AllocationSize - Pool size + +Returns: + + Pointer to the pool allocated + +--*/ +; + +VOID * +EfiLibAllocateCopyPool ( + IN UINTN AllocationSize, + IN VOID *Buffer + ) +/*++ + +Routine Description: + + Allocate BootServicesData pool and use a buffer provided by + caller to fill it. + +Arguments: + + AllocationSize - The size to allocate + + Buffer - Buffer that will be filled into the buffer allocated + +Returns: + + Pointer of the buffer allocated. + +--*/ +; + +VOID * +EfiLibAllocateRuntimeCopyPool ( + IN UINTN AllocationSize, + IN VOID *Buffer + ) +/*++ + +Routine Description: + + Allocate RuntimeServicesData pool and use a buffer provided by + caller to fill it. + +Arguments: + + AllocationSize - The size to allocate + + Buffer - Buffer that will be filled into the buffer allocated + +Returns: + + Pointer of the buffer allocated. + +--*/ +; + +// +// Event.c +// +EFI_EVENT +EfiLibCreateProtocolNotifyEvent ( + IN EFI_GUID *ProtocolGuid, + IN EFI_TPL NotifyTpl, + IN EFI_EVENT_NOTIFY NotifyFunction, + IN VOID *NotifyContext, + OUT VOID **Registration + ) +/*++ + +Routine Description: + + Create a protocol notification event and return it. + +Arguments: + + ProtocolGuid - Protocol to register notification event on. + + NotifyTpl - Maximum TPL to single the NotifyFunction. + + NotifyFunction - EFI notification routine. + + NotifyContext - Context passed into Event when it is created. + + Registration - Registration key returned from RegisterProtocolNotify(). + +Returns: + + The EFI_EVENT that has been registered to be signaled when a ProtocolGuid + is added to the system. + +--*/ +; + +EFI_STATUS +EfiLibNamedEventSignal ( + IN EFI_GUID *Name + ) +/*++ + +Routine Description: + Signals a named event. All registered listeners will run. + The listeners should register using EfiLibNamedEventListen() function. + + NOTE: For now, the named listening/signalling is implemented + on a protocol interface being installed and uninstalled. + In the future, this maybe implemented based on a dedicated mechanism. + +Arguments: + Name - Name to perform the signaling on. The name is a GUID. + +Returns: + EFI_SUCCESS if successfull. + +--*/ +; + +EFI_STATUS +EfiLibNamedEventListen ( + IN EFI_GUID * Name, + IN EFI_TPL NotifyTpl, + IN EFI_EVENT_NOTIFY NotifyFunction, + IN VOID *NotifyContext + ) +/*++ + +Routine Description: + Listenes to signals on the name. + EfiLibNamedEventSignal() signals the event. + + NOTE: For now, the named listening/signalling is implemented + on a protocol interface being installed and uninstalled. + In the future, this maybe implemented based on a dedicated mechanism. + +Arguments: + Name - Name to register the listener on. + NotifyTpl - Maximum TPL to singnal the NotifyFunction. + NotifyFunction - The listener routine. + NotifyContext - Context passed into the listener routine. + +Returns: + EFI_SUCCESS if successful. + +--*/ +; + +// +// Handle.c +// +EFI_STATUS +EfiLibLocateHandleProtocolByProtocols ( + IN OUT EFI_HANDLE * Handle, OPTIONAL + OUT VOID **Interface, OPTIONAL + ... + ) +/*++ +Routine Description: + + Function locates Protocol and/or Handle on which all Protocols specified + as a variable list are installed. + It supports continued search. The caller must assure that no handles are added + or removed while performing continued search, by e.g., rising the TPL and not + calling any handle routines. Otherwise the behavior is undefined. + +Arguments: + + Handle - The address of handle to receive the handle on which protocols + indicated by the variable list are installed. + If points to NULL, all handles are searched. If pointing to a + handle returned from previous call, searches starting from next handle. + If NULL, the parameter is ignored. + + Interface - The address of a pointer to a protocol interface that will receive + the interface indicated by first variable argument. + If NULL, the parameter is ignored. + + ... - A variable argument list containing protocol GUIDs. Must end with NULL. + +Returns: + + EFI_SUCCESS - All the protocols where found on same handle. + EFI_NOT_FOUND - A Handle with all the protocols installed was not found. + Other values as may be returned from LocateHandleBuffer() or HandleProtocol(). + +--*/ +; + +// +// Debug.c init +// +EFI_STATUS +EfiDebugAssertInit ( + VOID + ) +/*++ + +Routine Description: + + Locate Debug Assert Protocol and set as mDebugAssert + +Arguments: + + None + +Returns: + + Status code + +--*/ +; + +// +// Unicode String Support +// +EFI_STATUS +EfiLibLookupUnicodeString ( + CHAR8 *Language, + CHAR8 *SupportedLanguages, + EFI_UNICODE_STRING_TABLE *UnicodeStringTable, + CHAR16 **UnicodeString + ) +/*++ + +Routine Description: + + Translate a unicode string to a specified language if supported. + +Arguments: + + Language - The name of language to translate to + SupportedLanguages - Supported languages set + UnicodeStringTable - Pointer of one item in translation dictionary + UnicodeString - The translated string + +Returns: + + EFI_INVALID_PARAMETER - Invalid parameter + EFI_UNSUPPORTED - System not supported this language or this string translation + EFI_SUCCESS - String successfully translated + +--*/ +; + +EFI_STATUS +EfiLibAddUnicodeString ( + CHAR8 *Language, + CHAR8 *SupportedLanguages, + EFI_UNICODE_STRING_TABLE **UnicodeStringTable, + CHAR16 *UnicodeString + ) +/*++ + +Routine Description: + + Add an translation to the dictionary if this language if supported. + +Arguments: + + Language - The name of language to translate to + SupportedLanguages - Supported languages set + UnicodeStringTable - Translation dictionary + UnicodeString - The corresponding string for the language to be translated to + +Returns: + + EFI_INVALID_PARAMETER - Invalid parameter + EFI_UNSUPPORTED - System not supported this language + EFI_ALREADY_STARTED - Already has a translation item of this language + EFI_OUT_OF_RESOURCES - No enough buffer to be allocated + EFI_SUCCESS - String successfully translated + +--*/ +; + +EFI_STATUS +EfiLibFreeUnicodeStringTable ( + EFI_UNICODE_STRING_TABLE *UnicodeStringTable + ) +/*++ + +Routine Description: + + Free a string table. + +Arguments: + + UnicodeStringTable - The string table to be freed. + +Returns: + + EFI_SUCCESS - The table successfully freed. + +--*/ +; + +EFI_STATUS +EfiLibReportStatusCode ( + IN EFI_STATUS_CODE_TYPE Type, + IN EFI_STATUS_CODE_VALUE Value, + IN UINT32 Instance, + IN EFI_GUID *CallerId OPTIONAL, + IN EFI_STATUS_CODE_DATA *Data OPTIONAL + ) +/*++ + +Routine Description: + + Report status code. + +Arguments: + + Type - Code type + Value - Code value + Instance - Instance number + CallerId - Caller name + DevicePath - Device path that to be reported + +Returns: + + Status code. + + EFI_OUT_OF_RESOURCES - No enough buffer could be allocated + +--*/ +; + +EFI_STATUS +ReportStatusCodeWithDevicePath ( + IN EFI_STATUS_CODE_TYPE Type, + IN EFI_STATUS_CODE_VALUE Value, + IN UINT32 Instance, + IN EFI_GUID * CallerId OPTIONAL, + IN EFI_DEVICE_PATH_PROTOCOL * DevicePath + ) +/*++ + +Routine Description: + + Report device path through status code. + +Arguments: + + Type - Code type + Value - Code value + Instance - Instance number + CallerId - Caller name + DevicePath - Device path that to be reported + +Returns: + + Status code. + + EFI_OUT_OF_RESOURCES - No enough buffer could be allocated + +--*/ +; + +EFI_STATUS +EFIAPI +EfiCreateEventLegacyBoot ( + IN EFI_TPL NotifyTpl, + IN EFI_EVENT_NOTIFY NotifyFunction, + IN VOID *NotifyContext, + OUT EFI_EVENT *LegacyBootEvent + ) +/*++ + +Routine Description: + Create a Legacy Boot Event. + Tiano extended the CreateEvent Type enum to add a legacy boot event type. + This was bad as Tiano did not own the enum. In UEFI 2.0 CreateEventEx was + added and now it's possible to not voilate the UEFI specification by + declaring a GUID for the legacy boot event class. This library supports + the R8.5/EFI 1.10 form and R8.6/UEFI 2.0 form and allows common code to + work both ways. + +Arguments: + LegacyBootEvent Returns the EFI event returned from gBS->CreateEvent(Ex) + +Returns: + EFI_SUCCESS Event was created. + Other Event was not created. + +--*/ +; + +EFI_STATUS +EFIAPI +EfiCreateEventReadyToBoot ( + IN EFI_TPL NotifyTpl, + IN EFI_EVENT_NOTIFY NotifyFunction, + IN VOID *NotifyContext, + OUT EFI_EVENT *ReadyToBootEvent + ) +/*++ + +Routine Description: + Create a Read to Boot Event. + + Tiano extended the CreateEvent Type enum to add a ready to boot event type. + This was bad as Tiano did not own the enum. In UEFI 2.0 CreateEventEx was + added and now it's possible to not voilate the UEFI specification and use + the ready to boot event class defined in UEFI 2.0. This library supports + the R8.5/EFI 1.10 form and R8.6/UEFI 2.0 form and allows common code to + work both ways. + +Arguments: + @param LegacyBootEvent Returns the EFI event returned from gBS->CreateEvent(Ex) + +Return: + EFI_SUCCESS - Event was created. + Other - Event was not created. + +--*/ +; + +VOID +EFIAPI +EfiInitializeFwVolDevicepathNode ( + IN MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *FvDevicePathNode, + IN EFI_GUID *NameGuid + ) +/*++ +Routine Description: + Initialize a Firmware Volume (FV) Media Device Path node. + +Arguments: + FvDevicePathNode - Pointer to a FV device path node to initialize + NameGuid - FV file name to use in FvDevicePathNode + +--*/ +; + +EFI_GUID * +EFIAPI +EfiGetNameGuidFromFwVolDevicePathNode ( + IN MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *FvDevicePathNode + ) +/*++ +Routine Description: + Check to see if the Firmware Volume (FV) Media Device Path is valid. + +Arguments: + FvDevicePathNode - Pointer to FV device path to check + +Return: + NULL - FvDevicePathNode is not valid. + Other - FvDevicePathNode is valid and pointer to NameGuid was returned. + +--*/ +; + +VOID +EfiLibSafeFreePool ( + IN VOID *Buffer + ) +/*++ + +Routine Description: + + Free pool safely. + +Arguments: + + Buffer - The allocated pool entry to free + +Returns: + + Pointer of the buffer allocated. + +--*/ +; + +EFI_STATUS +EfiLibTestManagedDevice ( + IN EFI_HANDLE ControllerHandle, + IN EFI_HANDLE DriverBindingHandle, + IN EFI_GUID *ManagedProtocolGuid + ) +/*++ + +Routine Description: + + Test to see if the controller is managed by a specific driver. + +Arguments: + + ControllerHandle - Handle for controller to test + + DriverBindingHandle - Driver binding handle for controller + + ManagedProtocolGuid - The protocol guid the driver opens on controller + +Returns: + + EFI_SUCCESS - The controller is managed by the driver + + EFI_UNSUPPORTED - The controller is not managed by the driver + +--*/ +; + +EFI_STATUS +EfiLibTestChildHandle ( + IN EFI_HANDLE ControllerHandle, + IN EFI_HANDLE ChildHandle, + IN EFI_GUID *ConsumedGuid + ) +/*++ + +Routine Description: + + Test to see if the child handle is the child of the controller + +Arguments: + + ControllerHandle - Handle for controller (parent) + + ChildHandle - Child handle to test + + ConsumsedGuid - Protocol guid consumed by child from controller + +Returns: + + EFI_SUCCESS - The child handle is the child of the controller + + EFI_UNSUPPORTED - The child handle is not the child of the controller + +--*/ +; +#endif diff --git a/EDK/Foundation/Library/Dxe/Include/EfiHobLib.h b/EDK/Foundation/Library/Dxe/Include/EfiHobLib.h new file mode 100644 index 0000000..787e872 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/Include/EfiHobLib.h @@ -0,0 +1,299 @@ +/*++ + +Copyright (c) 2004, 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: + + EfiHobLib.h + +Abstract: + + +--*/ + +#ifndef _EFI_HOB_LIB_H_ +#define _EFI_HOB_LIB_H_ + +#include "PeiHob.h" + +VOID * +GetHob ( + IN UINT16 Type, + IN VOID *HobStart + ) +/*++ + +Routine Description: + + This function returns the first instance of a HOB type in a HOB list. + +Arguments: + + Type The HOB type to return. + HobStart The first HOB in the HOB list. + +Returns: + + HobStart There were no HOBs found with the requested type. + else Returns the first HOB with the matching type. + +--*/ +; + +UINTN +GetHobListSize ( + IN VOID *HobStart + ) +/*++ + +Routine Description: + + Get size of hob list. + +Arguments: + + HobStart - Start pointer of hob list + +Returns: + + Size of hob list. + +--*/ +; + +UINT32 +GetHobVersion ( + IN VOID *HobStart + ) +/*++ + +Routine Description: + + Get hob version. + +Arguments: + + HobStart - Start pointer of hob list + +Returns: + + Hob version. + +--*/ +; + +EFI_STATUS +GetHobBootMode ( + IN VOID *HobStart, + OUT EFI_BOOT_MODE *BootMode + ) +/*++ + +Routine Description: + + Get current boot mode. + +Arguments: + + HobStart - Start pointer of hob list + + BootMode - Current boot mode recorded in PHIT hob + +Returns: + + EFI_NOT_FOUND - Invalid hob header + + EFI_SUCCESS - Boot mode found + +--*/ +; + +EFI_STATUS +GetCpuHobInfo ( + IN VOID *HobStart, + OUT UINT8 *SizeOfMemorySpace, + OUT UINT8 *SizeOfIoSpace + ) +/*++ + +Routine Description: + + Get information recorded in CPU hob (Memory space size, Io space size) + +Arguments: + + HobStart - Start pointer of hob list + + SizeOfMemorySpace - Size of memory size + + SizeOfIoSpace - Size of IO size + +Returns: + + EFI_NOT_FOUND - CPU hob not found + + EFI_SUCCESS - CPU hob found and information got. + +--*/ +; + +EFI_STATUS +GetDxeCoreHobInfo ( + IN VOID *HobStart, + OUT EFI_PHYSICAL_ADDRESS *BaseAddress, + OUT UINT64 *Length, + OUT VOID **EntryPoint, + OUT EFI_GUID **FileName + ) +/*++ + +Routine Description: + + Get memory allocation hob created for DXE core and extract its information + +Arguments: + + HobStart - Start pointer of the hob list + + BaseAddress - Start address of memory allocated for DXE core + + Length - Length of memory allocated for DXE core + + EntryPoint - DXE core file name + + FileName - FileName + +Returns: + + EFI_NOT_FOUND - DxeCoreHob not found + + EFI_SUCCESS - DxeCoreHob found and information got + +--*/ +; + +EFI_STATUS +GetNextFirmwareVolumeHob ( + IN OUT VOID **HobStart, + OUT EFI_PHYSICAL_ADDRESS *BaseAddress, + OUT UINT64 *Length + ) +/*++ + +Routine Description: + + Get next firmware volume hob from HobStart + +Arguments: + + HobStart - Start pointer of hob list + + BaseAddress - Start address of next firmware volume + + Length - Length of next firmware volume + +Returns: + + EFI_NOT_FOUND - Next firmware volume not found + + EFI_SUCCESS - Next firmware volume found with address information + +--*/ +; + +//;;## ...AMI_OVERRIDE... Support PI1.x +#if (PI_SPECIFICATION_VERSION >= 0x00010000) +EFI_STATUS +GetNextFirmwareVolume2Hob ( + IN OUT VOID **HobStart, + OUT EFI_PHYSICAL_ADDRESS *BaseAddress, + OUT UINT64 *Length, + OUT EFI_GUID *FileName + ) +; +#endif + +EFI_STATUS +GetNextGuidHob ( + IN OUT VOID **HobStart, + IN EFI_GUID * Guid, + OUT VOID **Buffer, + OUT UINTN *BufferSize OPTIONAL + ) +/*++ + +Routine Description: + Get the next guid hob. + +Arguments: + HobStart A pointer to the start hob. + Guid A pointer to a guid. + Buffer A pointer to the buffer. + BufferSize Buffer size. + +Returns: + Status code. + + EFI_NOT_FOUND - Next Guid hob not found + + EFI_SUCCESS - Next Guid hob found and data for this Guid got + +--*/ +; + +EFI_STATUS +GetPalEntryHobInfo ( + IN VOID *HobStart, + OUT EFI_PHYSICAL_ADDRESS *PalEntry + ) +/*++ + +Routine Description: + + Get PAL entry from PalEntryHob + +Arguments: + + HobStart - Start pointer of hob list + + PalEntry - Pointer to PAL entry + +Returns: + + Status code. + +--*/ +; + +EFI_STATUS +GetIoPortSpaceAddressHobInfo ( + IN VOID *HobStart, + OUT EFI_PHYSICAL_ADDRESS *IoPortSpaceAddress + ) +/*++ + +Routine Description: + + Get IO port space address from IoBaseHob. + +Arguments: + + HobStart - Start pointer of hob list + + IoPortSpaceAddress - IO port space address + +Returns: + + Status code + +--*/ +; + +#endif diff --git a/EDK/Foundation/Library/Dxe/Include/EfiMgmtModeRuntimeLib.h b/EDK/Foundation/Library/Dxe/Include/EfiMgmtModeRuntimeLib.h new file mode 100644 index 0000000..89fb72e --- /dev/null +++ b/EDK/Foundation/Library/Dxe/Include/EfiMgmtModeRuntimeLib.h @@ -0,0 +1,429 @@ +/*++ + +Copyright (c) 2004, 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: + + EfiMgmtModeRuntimeLib.h + +Abstract: + + Light weight lib to support EFI drivers. + +--*/ + +#ifndef _EFI_RT_SUPPORT_LIB_H_ +#define _EFI_RT_SUPPORT_LIB_H_ + +#ifndef EFI_LOAD_IMAGE_SMM +#define EFI_LOAD_DRIVER_SMM FALSE +#else +#define EFI_LOAD_DRIVER_SMM TRUE +#endif + +#ifndef EFI_NO_LOAD_IMAGE_RT +#define EFI_NO_LOAD_DRIVER_RT FALSE +#else +#define EFI_NO_LOAD_DRIVER_RT TRUE +#endif + +#include "EfiCommonLib.h" +#include "LinkedList.h" +#include "ProcDep.h" + +#include EFI_PROTOCOL_DEFINITION (CpuIo) +#include EFI_PROTOCOL_DEFINITION (FirmwareVolumeBlock) + +// +// Driver Lib Globals. +// +extern EFI_BOOT_SERVICES *gBS; +extern EFI_SYSTEM_TABLE *gST; +extern UINTN gRtErrorLevel; +extern BOOLEAN mEfiLoadDriverSmm; +extern BOOLEAN mEfiNoLoadDriverRt; +extern EFI_DEVICE_PATH_PROTOCOL *mFilePath; + +// +// Runtime Memory Allocation/De-Allocation tools (Should be used in Boot Phase only) +// +EFI_STATUS +EfiAllocateRuntimeMemoryPool ( + IN UINTN Size, + OUT VOID **Buffer + ) +/*++ + +Routine Description: + + Allocate EfiRuntimeServicesData pool of specified size. + +Arguments: + + Size - Pool size + Buffer - Memory pointer for output + +Returns: + + Status code + +--*/ +; + +EFI_STATUS +EfiFreeRuntimeMemoryPool ( + IN VOID *Buffer + ) +/*++ + +Routine Description: + + Free allocated pool + +Arguments: + + Buffer - Pool to be freed + +Returns: + + Status code + +--*/ +; + +EFI_STATUS +EfiLocateProtocolHandleBuffers ( + IN EFI_GUID *Protocol, + IN OUT UINTN *NumberHandles, + OUT EFI_HANDLE **Buffer + ) +/*++ + +Routine Description: + + Returns an array of handles that support the requested protocol in a buffer allocated from pool. + +Arguments: + + Protocol - Provides the protocol to search by. + NumberHandles - The number of handles returned in Buffer. + Buffer - A pointer to the buffer to return the requested array of handles that + support Protocol. + +Returns: + + Status code + +--*/ +; + +EFI_STATUS +EfiHandleProtocol ( + IN EFI_HANDLE Handle, + IN EFI_GUID *Protocol, + OUT VOID **Interface + ) +/*++ + +Routine Description: + + Queries a handle to determine if it supports a specified protocol. + +Arguments: + + Handle - The handle being queried. + Protocol - The published unique identifier of the protocol. + Interface - Supplies the address where a pointer to the corresponding Protocol + Interface is returned. NULL will be returned in *Interface if a + structure is not associated with Protocol. + +Returns: + + Status code + +--*/ +; + +EFI_STATUS +EfiInstallProtocolInterface ( + IN OUT EFI_HANDLE *Handle, + IN EFI_GUID *Protocol, + IN EFI_INTERFACE_TYPE InterfaceType, + IN VOID *Interface + ) +/*++ + +Routine Description: + + Installs a protocol interface on a device handle. If the handle does not exist, it is created and added +to the list of handles in the system. + +Arguments: + + Handle - A pointer to the EFI_HANDLE on which the interface is to be installed. + Protocol - The numeric ID of the protocol interface. + InterfaceType - Indicates whether Interface is supplied in native form. + Interface - A pointer to the protocol interface. + +Returns: + + Status code + +--*/ +; + +EFI_STATUS +EfiReinstallProtocolInterface ( + IN EFI_HANDLE SmmProtocolHandle, + IN EFI_GUID *Protocol, + IN VOID *OldInterface, + IN VOID *NewInterface + ) +/*++ + +Routine Description: + + Reinstalls a protocol interface on a device handle. + +Arguments: + + SmmProtocolHandle - Handle on which the interface is to be reinstalled. + Protocol - The numeric ID of the interface. + OldInterface - A pointer to the old interface. + NewInterface - A pointer to the new interface. + +Returns: + + Status code + +--*/ +; + +EFI_STATUS +EfiLocateProtocolInterface ( + EFI_GUID *Protocol, + VOID *Registration, OPTIONAL + VOID **Interface + ) +/*++ + +Routine Description: + + Returns the first protocol instance that matches the given protocol. + +Arguments: + + Protocol - Provides the protocol to search for. + Registration - Optional registration key returned from + RegisterProtocolNotify(). If Registration is NULL, then + it is ignored. + Interface - On return, a pointer to the first interface that matches Protocol and + Registration. + +Returns: + + Status code + +--*/ +; + +EFI_STATUS +UninstallProtocolInterface ( + IN EFI_HANDLE SmmProtocolHandle, + IN EFI_GUID *Protocol, + IN VOID *Interface + ) +/*++ + +Routine Description: + + Removes a protocol interface from a device handle. + +Arguments: + + SmmProtocolHandle - The handle on which the interface was installed. + Protocol - The numeric ID of the interface. + Interface - A pointer to the interface. + +Returns: + + Status code + +--*/ +; + +EFI_STATUS +EfiRegisterProtocolCallback ( + IN EFI_EVENT_NOTIFY CallbackFunction, + IN VOID *Context, + IN EFI_GUID *ProtocolGuid, + IN EFI_TPL NotifyTpl, + OUT VOID **Registeration, + OUT EFI_EVENT *Event + ) +/*++ + +Routine Description: + + Register a callback function to be signaled whenever an interface is installed for + a specified protocol. + +Arguments: + + CallbackFunction - Call back function + Context - Context of call back function + ProtocolGuid - The numeric ID of the protocol for which the callback function + is to be registered. + NotifyTpl - Notify tpl of callback function + Registeration - A pointer to a memory location to receive the registration value. + Event - Event that is to be signaled whenever a protocol interface is registered + for Protocol. + +Returns: + + Status code + +--*/ +; + +EFI_STATUS +EfiSignalProtocolEvent ( + EFI_EVENT Event + ) +/*++ + +Routine Description: + + Signals an event. + +Arguments: + + Event - The event to signal. + +Returns: + + Status code + +--*/ +; + +EFI_STATUS +EfiInstallVendorConfigurationTable ( + IN EFI_GUID *Guid, + IN VOID *Table + ) +/*++ + +Routine Description: + + Adds, updates, or removes a configuration table entry from the EFI System Table. + +Arguments: + + Guid - A pointer to the GUID for the entry to add, update, or remove. + Table - A pointer to the configuration table for the entry to add, update, or + remove. May be NULL. + +Returns: + + Status code + +--*/ +; + +EFI_STATUS +EfiGetVendorConfigurationTable ( + IN EFI_GUID *Guid, + OUT VOID **Table + ) +/*++ + +Routine Description: + + Return the EFI 1.0 System Tabl entry with TableGuid + +Arguments: + + Guid - Name of entry to return in the system table + Table - Pointer in EFI system table associated with TableGuid + +Returns: + + EFI_SUCCESS - Table returned; + EFI_NOT_FOUND - TableGuid not in EFI system table + +--*/ +; + +EFI_STATUS +EfiInitializeUtilsRuntimeDriverLib ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable, + IN EFI_EVENT_NOTIFY GoVirtualChildEvent + ) +/*++ + +Routine Description: + + Intialize runtime Driver Lib if it has not yet been initialized. + +Arguments: + + ImageHandle - The firmware allocated handle for the EFI image. + + SystemTable - A pointer to the EFI System Table. + + GoVirtualChildEvent - Caller can register a virtual notification event. + +Returns: + + EFI_STATUS always returns EFI_SUCCESS + +--*/ +; + +BOOLEAN +EfiInManagementInterrupt ( + VOID + ) +/*++ + +Routine Description: + + Indicate whether the caller is already in SMM or not. + +Arguments: + + None + +Returns: + + TRUE - In SMM + FALSE - Not in SMM + +--*/ +; + +// +// This MACRO initializes the RUNTIME invironment and optionally loads Image to SMM or Non-SMM space +// based upon the presence of build flags EFI_LOAD_DRIVER_SMM and EFI_NO_LOAD_DRIVER_RT. +// +#define EFI_INITIALIZE_RUNTIME_DRIVER_LIB(ImageHandle, SystemTable, GoVirtualChildEvent, FilePath) \ + mEfiLoadDriverSmm = EFI_LOAD_DRIVER_SMM; \ + mEfiNoLoadDriverRt = EFI_NO_LOAD_DRIVER_RT; \ + mFilePath = (EFI_DEVICE_PATH_PROTOCOL*) FilePath; \ + EfiInitializeUtilsRuntimeDriverLib ((EFI_HANDLE) ImageHandle, (EFI_SYSTEM_TABLE*) SystemTable, (EFI_EVENT_NOTIFY) GoVirtualChildEvent); \ + if (!EfiInManagementInterrupt()) { \ + if (mEfiNoLoadDriverRt) { \ + return EFI_SUCCESS; \ + } \ + } + +#endif diff --git a/EDK/Foundation/Library/Dxe/Include/EfiPrintLib.h b/EDK/Foundation/Library/Dxe/Include/EfiPrintLib.h new file mode 100644 index 0000000..1fca597 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/Include/EfiPrintLib.h @@ -0,0 +1,326 @@ +/*++ + +Copyright (c) 2004 - 2006, 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: + + EfiPrintLib.h + +Abstract: + + Light weight lib to support EFI drivers. + +--*/ + +#ifndef _EFI_PRINT_LIB_H_ +#define _EFI_PRINT_LIB_H_ + +#include EFI_PROTOCOL_DEFINITION(GraphicsOutput) +#include EFI_PROTOCOL_DEFINITION(UgaDraw) +#include EFI_PROTOCOL_DEFINITION(Print) + +UINTN +ErrorPrint ( + IN CONST CHAR16 *ErrorString, + IN CONST CHAR8 *Format, + ... + ) +/*++ + +Routine Description: + + Print function for a maximum of EFI_DRIVER_LIB_MAX_PRINT_BUFFER ascii + characters. + +Arguments: + + ErrorString - Error message printed first + + Format - Ascii format string see file header for more details. + + ... - Vararg list consumed by processing Format. + +Returns: + + Number of characters printed. + +--*/ +; + +VOID +ErrorDumpHex ( + IN UINTN Indent, + IN UINTN Offset, + IN UINTN DataSize, + IN VOID *UserData + ) +/*++ + +Routine Description: + + Dump error info by hex. + +Arguments: + + Indent - Indent number + Offset - Offset number + DataSize - Size of user data + UserData - User data to dump + +Returns: + + None + +--*/ +; + +UINTN +Print ( + IN CONST CHAR16 *Format, + ... + ) +/*++ + +Routine Description: + + Prints a formatted unicode string to the default console + +Arguments: + + fmt - Format string + +Returns: + + Length of string printed to the console + +--*/ +; + +UINTN +PrintXY ( + IN UINTN X, + IN UINTN Y, + IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Foreground, OPTIONAL + IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Background, OPTIONAL + IN CHAR16 *Fmt, + ... + ) +/*++ + +Routine Description: + + Prints a formatted unicode string to the default console + +Arguments: + + X - X coordinate to start printing + + Y - Y coordinate to start printing + + ForeGround - Foreground color + + BackGround - Background color + + Fmt - Format string + + ... - Print arguments + +Returns: + + Length of string printed to the console + +--*/ +; + +UINTN +Aprint ( + IN CONST CHAR8 *Format, + ... + ) +/*++ + +Routine Description: + + Print function for a maximum of EFI_DRIVER_LIB_MAX_PRINT_BUFFER ascii + characters. + +Arguments: + + Format - Ascii format string see file header for more details. + + ... - Vararg list consumed by processing Format. + +Returns: + + Number of characters printed. + +--*/ +; + +UINTN +UPrint ( + IN CONST CHAR16 *Format, + ... + ) +/*++ + +Routine Description: + + Print function for a maximum of EFI_DRIVER_LIB_MAX_PRINT_BUFFER ascii + characters. + +Arguments: + + Format - Ascii format string see file header for more details. + + ... - Vararg list consumed by processing Format. + +Returns: + + Number of characters printed. + +--*/ +; + +UINTN +VSPrint ( + OUT CHAR16 *StartOfBuffer, + IN UINTN StrLen, + IN CONST CHAR16 *Format, + IN VA_LIST Marker + ) +/*++ + +Routine Description: + + Prints a formatted unicode string to a buffer + +Arguments: + + StartOfBuffer - Output buffer to print the formatted string into + StrLen - Size of Str. String is truncated to this size. + A size of 0 means there is no limit + Format - The format string + Marker - Vararg list consumed by processing Format. + +Returns: + + String length returned in buffer + +--*/ +; + +UINTN +SPrint ( + OUT CHAR16 *Buffer, + IN UINTN BufferSize, + IN CONST CHAR16 *Format, + ... + ) +/*++ + +Routine Description: + + SPrint function to process format and place the results in Buffer. + +Arguments: + + Buffer - Wide char buffer to print the results of the parsing of Format into. + + BufferSize - Maximum number of characters to put into buffer. Zero means no + limit. + + Format - Format string see file header for more details. + + ... - Vararg list consumed by processing Format. + +Returns: + + Number of characters printed. + +--*/ +; + +// +// BoxDraw support +// +BOOLEAN +IsValidEfiCntlChar ( + IN CHAR16 CharC + ) +/*++ + +Routine Description: + + Test whether a wide char is a valid control char. + +Arguments: + + CharC - A char + +Returns: + + TRUE - A control char + + FALSE - Not a control char + +--*/ +; + +BOOLEAN +IsValidAscii ( + IN CHAR16 Ascii + ) +/*++ + +Routine Description: + + Test whether a wide char is a normal printable char + +Arguments: + + Ascii - A char + +Returns: + + True - A normal, printable char + FALSE - Not a normal, printable char + +--*/ +; + +BOOLEAN +LibIsValidTextGraphics ( + IN CHAR16 Graphic, + OUT CHAR8 *PcAnsi, OPTIONAL + OUT CHAR8 *Ascii OPTIONAL + ) +/*++ + +Routine Description: + + Detects if a Unicode char is for Box Drawing text graphics. + +Arguments: + + Graphic - Unicode char to test. + + PcAnsi - Optional pointer to return PCANSI equivalent of Graphic. + + Ascii - Optional pointer to return Ascii equivalent of Graphic. + +Returns: + + TRUE if Gpaphic is a supported Unicode Box Drawing character. + +--*/ +; + +#endif diff --git a/EDK/Foundation/Library/Dxe/Include/EfiRegTableLib.h b/EDK/Foundation/Library/Dxe/Include/EfiRegTableLib.h new file mode 100644 index 0000000..6df50d8 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/Include/EfiRegTableLib.h @@ -0,0 +1,205 @@ +/*++ + +Copyright (c) 2004, 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: + + EfiRegTableLib.h + +Abstract: + + Definitions and macros for building register tables for chipset + initialization.. + + Components linking this lib must include CpuIo, PciRootBridgeIo, and + BootScriptSave protocols in their DPX. + +Revision History: + +--*/ + +#ifndef EFI_REG_TABLE_H +#define EFI_REG_TABLE_H + +#include "Tiano.h" +#include "EfiScriptLib.h" +#include EFI_PROTOCOL_CONSUMER (CpuIo) +#include EFI_PROTOCOL_CONSUMER (PciRootBridgeIo) + +// +// RegTable OpCodes are encoded as follows: +// +// |31----------------------------16|15---------8|7-------0| +// \ \ \ +// \ \ \ +// 31:16 defined by Base OpCode---+ \ \ +// Opcode Flags---+ \ +// Base OpCode---+ +// +#define OPCODE_BASE(OpCode) ((UINT8)((OpCode) & 0xFF)) +#define OPCODE_FLAGS(OpCode) ((UINT8)(((OpCode) >> 8) & 0xFF)) +#define OPCODE_EXTRA_DATA(OpCode) ((UINT16)((OpCode) >> 16)) + +// +// RegTable Base OpCodes +// +#define OP_TERMINATE_TABLE 0 +#define OP_MEM_WRITE 1 +#define OP_MEM_READ_MODIFY_WRITE 2 +#define OP_IO_WRITE 3 +#define OP_IO_READ_MODIFY_WRITE 4 +#define OP_PCI_WRITE 5 +#define OP_PCI_READ_MODIFY_WRITE 6 +#define OP_STALL 7 + +// +// RegTable OpCode Flags +// +#define OPCODE_FLAG_S3SAVE 1 + + +#define TERMINATE_TABLE { (UINT32) OP_TERMINATE_TABLE, (UINT32) 0, (UINT32) 0 } + + +// +// REG_TABLE_ENTRY_PCI_WRITE encodes the width in the upper bits of the OpCode +// as one of the EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH values +// +typedef struct { + UINT32 OpCode; + UINT32 PciAddress; + UINT32 Data; +} EFI_REG_TABLE_PCI_WRITE; + +#define PCI_WRITE(Bus, Dev, Fnc, Reg, Width, Data, S3Flag) \ + { \ + (UINT32) (OP_PCI_WRITE | ((S3Flag) << 8) | ((Width) << 16)), \ + (UINT32) (EFI_PCI_ADDRESS ((Bus), (Dev), (Fnc), (Reg))), \ + (UINT32) (Data), \ + (UINT32) (0) \ + } + +typedef struct { + UINT32 OpCode; + UINT32 PciAddress; + UINT32 OrMask; + UINT32 AndMask; +} EFI_REG_TABLE_PCI_READ_MODIFY_WRITE; + +#define PCI_READ_MODIFY_WRITE(Bus, Dev, Fnc, Reg, Width, OrMask, AndMask, S3Flag) \ + { \ + (UINT32) (OP_PCI_READ_MODIFY_WRITE | ((S3Flag) << 8) | ((Width) << 16)), \ + (UINT32) (EFI_PCI_ADDRESS ((Bus), (Dev), (Fnc), (Reg))), \ + (UINT32) (OrMask), \ + (UINT32) (AndMask) \ + } + +typedef struct { + UINT32 OpCode; + UINT32 MemAddress; + UINT32 OrMask; + UINT32 AndMask; +} EFI_REG_TABLE_MEM_READ_MODIFY_WRITE; + +#define MEM_READ_MODIFY_WRITE(Address, Width, OrMask, AndMask, S3Flag) \ + { \ + (UINT32) (OP_MEM_READ_MODIFY_WRITE | ((S3Flag) << 8) | ((Width) << 16)), \ + (UINT32) (Address), \ + (UINT32) (OrMask), \ + (UINT32) (AndMask) \ + } + +typedef struct { + UINT32 OpCode; + UINT32 Field2; + UINT32 Field3; + UINT32 Field4; +} EFI_REG_TABLE_GENERIC; + +typedef union { + EFI_REG_TABLE_GENERIC Generic; + EFI_REG_TABLE_PCI_WRITE PciWrite; + EFI_REG_TABLE_PCI_READ_MODIFY_WRITE PciReadModifyWrite; + EFI_REG_TABLE_MEM_READ_MODIFY_WRITE MemReadModifyWrite; +} EFI_REG_TABLE; + +VOID +ProcessRegTablePci ( + EFI_REG_TABLE * RegTableEntry, + EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL * PciRootBridgeIo, + EFI_CPU_IO_PROTOCOL * CpuIo + ) +/*++ + +Routine Description: + Processes register table assuming which may contain PCI, IO, MEM, and STALL + entries. + + No parameter checking is done so the caller must be careful about omitting + values for PciRootBridgeIo or CpuIo parameters. If the regtable does + not contain any PCI accesses, it is safe to omit the PciRootBridgeIo (supply + NULL). If the regtable does not contain any IO or Mem entries, it is safe to + omit the CpuIo (supply NULL). + + The RegTableEntry parameter is not checked, but is required. + + gBS is assumed to have been defined and is used when processing stalls. + + The function processes each entry sequentially until an OP_TERMINATE_TABLE + entry is encountered. + +Arguments: + RegTableEntry - A pointer to the register table to process + + PciRootBridgeIo - A pointer to the instance of PciRootBridgeIo that is used + when processing PCI table entries + + CpuIo - A pointer to the instance of CpuIo that is used when processing IO and + MEM table entries + +Returns: + Nothing. + +--*/ +; + +VOID +ProcessRegTableCpu ( + EFI_REG_TABLE * RegTableEntry, + EFI_CPU_IO_PROTOCOL * CpuIo + ) +/*++ + +Routine Description: + Processes register table assuming which may contain IO, MEM, and STALL + entries, but must NOT contain any PCI entries. Any PCI entries cause an + ASSERT in a DEBUG build and are skipped in a free build. + + No parameter checking is done. Both RegTableEntry and CpuIo parameters are + required. + + gBS is assumed to have been defined and is used when processing stalls. + + The function processes each entry sequentially until an OP_TERMINATE_TABLE + entry is encountered. + +Arguments: + RegTableEntry - A pointer to the register table to process + + CpuIo - A pointer to the instance of CpuIo that is used when processing IO and + MEM table entries + +Returns: + Nothing. + +--*/ +; + +#endif diff --git a/EDK/Foundation/Library/Dxe/Include/EfiRuntimeLib.h b/EDK/Foundation/Library/Dxe/Include/EfiRuntimeLib.h new file mode 100644 index 0000000..b2ae8a0 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/Include/EfiRuntimeLib.h @@ -0,0 +1,1691 @@ +/*++ + +Copyright (c) 2004 - 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: + + EfiRuntimeLib.h + +Abstract: + + Light weight lib to support EFI drivers. + +--*/ + +#ifndef _EFI_RUNTIME_LIB_H_ +#define _EFI_RUNTIME_LIB_H_ +#define MAX_FVB_COUNT 16 +#include "EfiStatusCode.h" +#include "EfiCommonLib.h" + +#include "LinkedList.h" +#include "GetImage.h" +#include "RtDevicePath.h" + +#include EFI_GUID_DEFINITION (DxeServices) +#include EFI_GUID_DEFINITION (EventGroup) +#include EFI_GUID_DEFINITION (EventLegacyBios) +#include EFI_PROTOCOL_DEFINITION (CpuIo) +#include EFI_PROTOCOL_DEFINITION (FirmwareVolume) +#include EFI_PROTOCOL_DEFINITION (FirmwareVolume2) //;;## ...AMI_OVERRIDE... Support PI1.x +#include EFI_PROTOCOL_DEFINITION (FirmwareVolumeBlock) +#include EFI_PROTOCOL_DEFINITION (FvbExtension) +#include "ProcDep.h" + +typedef struct { + EFI_HANDLE Handle; + EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *Fvb; + EFI_FVB_EXTENSION_PROTOCOL *FvbExtension; +} FVB_ENTRY; + +// +// Driver Lib Globals. +// +extern EFI_BOOT_SERVICES *gBS; +extern EFI_SYSTEM_TABLE *gST; +extern EFI_DXE_SERVICES *gDS; +extern UINTN gRtErrorLevel; +extern FVB_ENTRY *mFvbEntry; + +VOID +EFIAPI +EfiRuntimeLibFvbVirtualNotifyEvent ( + IN EFI_EVENT Event, + IN VOID *Context + ) +/*++ + +Routine Description: + + Notify function to convert pointers to Fvb functions after ExitBootServices + +Arguments: + + Event - Event whose notification function is being invoked. + Context - Pointer to the notification function¡¯s context, which is + implementation-dependent. + +Returns: + + None + +--*/ +; + +EFI_STATUS +EfiInitializeRuntimeDriverLib ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable, + IN EFI_EVENT_NOTIFY RuntimeNotifyEventHandler + ) +/*++ + +Routine Description: + + Intialize Runtime Driver Lib if it has not yet been initialized. + +Arguments: + + ImageHandle - The firmware allocated handle for the EFI image. + + SystemTable - A pointer to the EFI System Table. + + RuntimeNotifyEventHandler - Virtual address change notification event + +Returns: + + EFI_STATUS always returns EFI_SUCCESS + +--*/ +; + +EFI_STATUS +EfiShutdownRuntimeDriverLib ( + VOID + ) +/*++ + +Routine Description: + + This routine will free some resources which have been allocated in + EfiInitializeRuntimeDriverLib(). If a runtime driver exits with an error, + it must call this routine to free the allocated resource before the exiting. + +Arguments: + + None + +Returns: + + EFI_SUCCESS - Shotdown the Runtime Driver Lib successfully + EFI_UNSUPPORTED - Runtime Driver lib was not initialized at all + +--*/ +; + +EFI_STATUS +EfiInitializeSmmDriverLib ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +/*++ + +Routine Description: + + Intialize Smm Driver Lib if it has not yet been initialized. + +Arguments: + + ImageHandle - The firmware allocated handle for the EFI image. + + SystemTable - A pointer to the EFI System Table. + +Returns: + + EFI_STATUS always returns EFI_SUCCESS + +--*/ +; + +EFI_STATUS +EfiLibGetSystemConfigurationTable ( + IN EFI_GUID *TableGuid, + IN OUT VOID **Table + ) +/*++ + +Routine Description: + + Return the EFI 1.0 System Tabl entry with TableGuid + +Arguments: + + TableGuid - Name of entry to return in the system table + Table - Pointer in EFI system table associated with TableGuid + +Returns: + + EFI_SUCCESS - Table returned; + EFI_NOT_FOUND - TableGuid not in EFI system table + +--*/ +; + +BOOLEAN +EfiAtRuntime ( + VOID + ) +/*++ + +Routine Description: + + Am I at runtime? + +Arguments: + + None + +Returns: + + TRUE - At runtime + FALSE - Not at runtime + +--*/ +; + +BOOLEAN +EfiGoneVirtual ( + VOID + ) +/*++ + +Routine Description: + Return TRUE if SetVirtualAddressMap () has been called + +Arguments: + NONE + +Returns: + TRUE - If SetVirtualAddressMap () has been called + FALSE - If SetVirtualAddressMap () has not been called + +--*/ +; + +EFI_STATUS +EfiLibGetSystemConfigurationTable ( + IN EFI_GUID *TableGuid, + IN OUT VOID **Table + ) +/*++ + + + +Routine Description: + + + + Get table from configuration table by name + + + +Arguments: + + + + TableGuid - Table name to search + + + + Table - Pointer to the table caller wants + + + +Returns: + + + + EFI_NOT_FOUND - Not found the table + + + + EFI_SUCCESS - Found the table + + + +--*/ + +; + +EFI_EVENT +RtEfiLibCreateProtocolNotifyEvent ( + IN EFI_GUID *ProtocolGuid, + IN EFI_TPL NotifyTpl, + IN EFI_EVENT_NOTIFY NotifyFunction, + IN VOID *NotifyContext, + OUT VOID **Registration + ) +/*++ + +Routine Description: + + Create a protocol notification event and return it. + +Arguments: + + ProtocolGuid - Protocol to register notification event on. + + NotifyTpl - Maximum TPL to single the NotifyFunction. + + NotifyFunction - EFI notification routine. + + NotifyContext - Context passed into Event when it is created. + + Registration - Registration key returned from RegisterProtocolNotify(). + +Returns: + + The EFI_EVENT that has been registered to be signaled when a ProtocolGuid + is added to the system. + +--*/ +; + +// +// Lock.c +// +typedef struct { + EFI_TPL Tpl; + EFI_TPL OwnerTpl; + UINTN Lock; +} EFI_LOCK; + +VOID +EfiInitializeLock ( + IN OUT EFI_LOCK *Lock, + IN EFI_TPL Priority + ) +/*++ + +Routine Description: + + Initialize a basic mutual exclusion lock. Each lock + provides mutual exclusion access at it's task priority + level. Since there is no-premption (at any TPL) or + multiprocessor support, acquiring the lock only consists + of raising to the locks TPL. + + Note on a check build ASSERT()s are used to ensure proper + lock usage. + +Arguments: + + Lock - The EFI_LOCK structure to initialize + + Priority - The task priority level of the lock + + +Returns: + + An initialized Efi Lock structure. + +--*/ +; + +// +// Macro to initialize the state of a lock when a lock variable is declared +// +#define EFI_INITIALIZE_LOCK_VARIABLE(Tpl) {Tpl,0,0} + + +VOID +EfiAcquireLock ( + IN EFI_LOCK *Lock + ) +/*++ + +Routine Description: + + Raising to the task priority level of the mutual exclusion + lock, and then acquires ownership of the lock. + +Arguments: + + Lock - The lock to acquire + +Returns: + + Lock owned + +--*/ +; + +EFI_STATUS +EfiAcquireLockOrFail ( + IN EFI_LOCK *Lock + ) +/*++ + +Routine Description: + + Initialize a basic mutual exclusion lock. Each lock + provides mutual exclusion access at it's task priority + level. Since there is no-premption (at any TPL) or + multiprocessor support, acquiring the lock only consists + of raising to the locks TPL. + +Arguments: + + Lock - The EFI_LOCK structure to initialize + +Returns: + + EFI_SUCCESS - Lock Owned. + EFI_ACCESS_DENIED - Reentrant Lock Acquisition, Lock not Owned. + +--*/ +; + +VOID +EfiReleaseLock ( + IN EFI_LOCK *Lock + ) +/*++ + +Routine Description: + + Releases ownership of the mutual exclusion lock, and + restores the previous task priority level. + +Arguments: + + Lock - The lock to release + +Returns: + + None + +--*/ +; + +#define EfiCopyMem EfiCommonLibCopyMem +#define EfiSetMem EfiCommonLibSetMem +#define EfiZeroMem EfiCommonLibZeroMem + +INTN +EfiCompareMem ( + IN VOID *MemOne, + IN VOID *MemTwo, + IN UINTN Len + ) +/*++ + +Routine Description: + + Compares two memory buffers of a given length. + +Arguments: + + MemOne - First memory buffer + + MemTwo - Second memory buffer + + Len - Length of Mem1 and Mem2 memory regions to compare + +Returns: + + = 0 if MemOne == MemTwo + + > 0 if MemOne > MemTwo + + < 0 if MemOne < MemTwo + +--*/ +; + +// +// Debug.c init +// +EFI_STATUS +EfiDebugAssertInit ( + VOID + ) +/*++ + +Routine Description: + + Locate Debug Assert Protocol and set as mDebugAssert + +Arguments: + + None + +Returns: + + Status code + +--*/ +; + +// +// Wrapper for EFI runtime functions +// +VOID +EfiResetSystem ( + IN EFI_RESET_TYPE ResetType, + IN EFI_STATUS ResetStatus, + IN UINTN DataSize, + IN CHAR16 *ResetData + ) +/*++ + +Routine Description: + + Resets the entire platform. + +Arguments: + + ResetType - The type of reset to perform. + ResetStatus - The status code for the reset. + DataSize - The size, in bytes, of ResetData. + ResetData - A data buffer that includes a Null-terminated Unicode string, optionally + followed by additional binary data. + +Returns: + + None + +--*/ +; + +EFI_STATUS +EfiGetNextHighMonotonicCount ( + OUT UINT32 *HighCount + ) +/*++ + +Routine Description: + + Returns the next high 32 bits of the platform¡¯s monotonic counter. + +Arguments: + + HighCount - Pointer to returned value. + +Returns: + + Status code + +--*/ +; + +EFI_STATUS +EfiGetTime ( + OUT EFI_TIME *Time, + OUT EFI_TIME_CAPABILITIES *Capabilities + ) +/*++ + +Routine Description: + + Returns the current time and date information, and the time-keeping + capabilities of the hardware platform. + +Arguments: + + Time - A pointer to storage to receive a snapshot of the current time. + Capabilities - An optional pointer to a buffer to receive the real time clock device¡¯s + capabilities. + +Returns: + + Status code + +--*/ +; + +EFI_STATUS +EfiSetTime ( + OUT EFI_TIME *Time + ) +/*++ + +Routine Description: + + Sets the current local time and date information. + +Arguments: + + Time - A pointer to the current time. + +Returns: + + Status code + +--*/ +; + +EFI_STATUS +EfiGetWakeupTime ( + OUT BOOLEAN *Enabled, + OUT BOOLEAN *Pending, + OUT EFI_TIME *Time + ) +/*++ + +Routine Description: + + Returns the current wakeup alarm clock setting. + +Arguments: + + Enabled - Indicates if the alarm is currently enabled or disabled. + Pending - Indicates if the alarm signal is pending and requires acknowledgement. + Time - The current alarm setting. + +Returns: + + Status code + +--*/ +; + +EFI_STATUS +EfiSetWakeupTime ( + IN BOOLEAN Enable, + IN EFI_TIME *Time + ) +/*++ + +Routine Description: + + Sets the system wakeup alarm clock time. + +Arguments: + + Enable - Enable or disable the wakeup alarm. + Time - If Enable is TRUE, the time to set the wakeup alarm for. + If Enable is FALSE, then this parameter is optional, and may be NULL. + +Returns: + + Status code + +--*/ +; + +EFI_STATUS +EfiGetVariable ( + IN CHAR16 *VariableName, + IN EFI_GUID * VendorGuid, + OUT UINT32 *Attributes OPTIONAL, + IN OUT UINTN *DataSize, + OUT VOID *Data + ) +/*++ + +Routine Description: + + Returns the value of a variable. + +Arguments: + + VariableName - A Null-terminated Unicode string that is the name of the + vendor¡¯s variable. + VendorGuid - A unique identifier for the vendor. + Attributes - If not NULL, a pointer to the memory location to return the + attributes bitmask for the variable. + DataSize - On input, the size in bytes of the return Data buffer. + On output the size of data returned in Data. + Data - The buffer to return the contents of the variable. + +Returns: + + Status code + +--*/ +; + +EFI_STATUS +EfiGetNextVariableName ( + IN OUT UINTN *VariableNameSize, + IN OUT CHAR16 *VariableName, + IN OUT EFI_GUID *VendorGuid + ) +/*++ + +Routine Description: + + Enumerates the current variable names. + +Arguments: + + VariableNameSize - The size of the VariableName buffer. + VariableName - On input, supplies the last VariableName that was returned + by GetNextVariableName(). + On output, returns the Nullterminated Unicode string of the + current variable. + VendorGuid - On input, supplies the last VendorGuid that was returned by + GetNextVariableName(). + On output, returns the VendorGuid of the current variable. + +Returns: + + Status code + +--*/ +; + +EFI_STATUS +EfiSetVariable ( + IN CHAR16 *VariableName, + IN EFI_GUID *VendorGuid, + IN UINT32 Attributes, + IN UINTN DataSize, + IN VOID *Data + ) +/*++ + +Routine Description: + + Sets the value of a variable. + +Arguments: + + VariableName - A Null-terminated Unicode string that is the name of the + vendor¡¯s variable. + VendorGuid - A unique identifier for the vendor. + Attributes - Attributes bitmask to set for the variable. + DataSize - The size in bytes of the Data buffer. + Data - The contents for the variable. + +Returns: + + Status code + +--*/ +; + +#if (EFI_SPECIFICATION_VERSION >= 0x00020000) + +EFI_STATUS +EfiQueryVariableInfo ( + IN UINT32 Attributes, + OUT UINT64 *MaximumVariableStorageSize, + OUT UINT64 *RemainingVariableStorageSize, + OUT UINT64 *MaximumVariableSize + ) +/*++ + +Routine Description: + + This code returns information about the EFI variables. + +Arguments: + + Attributes Attributes bitmask to specify the type of variables + on which to return information. + MaximumVariableStorageSize Pointer to the maximum size of the storage space available + for the EFI variables associated with the attributes specified. + RemainingVariableStorageSize Pointer to the remaining size of the storage space available + for the EFI variables associated with the attributes specified. + MaximumVariableSize Pointer to the maximum size of the individual EFI variables + associated with the attributes specified. + +Returns: + + Status code + +--*/ +; +#endif + + +EFI_STATUS +EfiReportStatusCode ( + IN EFI_STATUS_CODE_TYPE CodeType, + IN EFI_STATUS_CODE_VALUE Value, + IN UINT32 Instance, + IN EFI_GUID * CallerId, + IN EFI_STATUS_CODE_DATA * Data OPTIONAL + ) +/*++ + +Routine Description: + + Status Code reporter + +Arguments: + + CodeType - Type of Status Code. + + Value - Value to output for Status Code. + + Instance - Instance Number of this status code. + + CallerId - ID of the caller of this status code. + + Data - Optional data associated with this status code. + +Returns: + + Status code + +--*/ +; + +EFI_STATUS +EfiConvertPointer ( + IN UINTN DebugDisposition, + IN OUT VOID *Address + ) +/*++ + +Routine Description: + + Determines the new virtual address that is to be used on subsequent memory accesses. + +Arguments: + + DebugDisposition - Supplies type information for the pointer being converted. + Address - A pointer to a pointer that is to be fixed to be the value needed + for the new virtual address mappings being applied. + +Returns: + + Status code + +--*/ +; + +EFI_STATUS +EfiConvertList ( + IN UINTN DebugDisposition, + IN OUT EFI_LIST_ENTRY *ListHead + ) +/*++ + +Routine Description: + + Conver the standard Lib double linked list to a virtual mapping. + +Arguments: + + DebugDisposition - Argument to EfiConvertPointer (EFI 1.0 API) + + ListHead - Head of linked list to convert + +Returns: + + EFI_SUCCESS + +--*/ +; + +// +// Base IO Class Functions +// +EFI_STATUS +EfiIoRead ( + IN EFI_CPU_IO_PROTOCOL_WIDTH Width, + IN UINT64 Address, + IN UINTN Count, + IN OUT VOID *Buffer + ) +/*++ + +Routine Description: + Perform an IO read into Buffer. + +Arguments: + Width - Width of read transaction, and repeat operation to use + Address - IO address to read + Count - Number of times to read the IO address. + Buffer - Buffer to read data into. size is Width * Count + +Returns: + Status code + +--*/ +; + +UINT8 +IoRead8 ( + IN UINT64 Address + ) +/*++ + +Routine Description: + Do a one byte IO read + +Arguments: + Address - IO address to read + +Returns: + Data read + +--*/ +; + +UINT16 +IoRead16 ( + IN UINT64 Address + ) +/*++ + +Routine Description: + Do a two byte IO read + +Arguments: + Address - IO address to read + +Returns: + Data read + +--*/ +; + +UINT32 +IoRead32 ( + IN UINT64 Address + ) +/*++ + +Routine Description: + Do a four byte IO read + +Arguments: + Address - IO address to read + +Returns: + Data read + +--*/ +; + +EFI_STATUS +EfiIoWrite ( + IN EFI_CPU_IO_PROTOCOL_WIDTH Width, + IN UINT64 Address, + IN UINTN Count, + IN OUT VOID *Buffer + ) +/*++ + +Routine Description: + Perform an IO write into Buffer. + +Arguments: + Width - Width of write transaction, and repeat operation to use + Address - IO address to write + Count - Number of times to write the IO address. + Buffer - Buffer to write data from. size is Width * Count + +Returns: + Status code + +--*/ +; + +VOID +IoWrite8 ( + IN UINT64 Address, + IN UINT8 Data + ) +/*++ + +Routine Description: + Do a one byte IO write + +Arguments: + Address - IO address to write + Data - Data to write to Address + +Returns: + NONE + +--*/ +; + +VOID +IoWrite16 ( + IN UINT64 Address, + IN UINT16 Data + ) +/*++ + +Routine Description: + Do a two byte IO write + +Arguments: + Address - IO address to write + Data - Data to write to Address + +Returns: + NONE + +--*/ +; + +VOID +IoWrite32 ( + IN UINT64 Address, + IN UINT32 Data + ) +/*++ + +Routine Description: + Do a four byte IO write + +Arguments: + Address - IO address to write + Data - Data to write to Address + +Returns: + NONE + +--*/ +; + +EFI_STATUS +EfiMemRead ( + IN EFI_CPU_IO_PROTOCOL_WIDTH Width, + IN UINT64 Address, + IN UINTN Count, + IN OUT VOID *Buffer + ) +/*++ + +Routine Description: + Perform a Memory mapped IO read into Buffer. + +Arguments: + Width - Width of each read transaction. + Address - Memory mapped IO address to read + Count - Number of Width quanta to read + Buffer - Buffer to read data into. size is Width * Count + +Returns: + Status code + +--*/ +; + +UINT8 +MemRead8 ( + IN UINT64 Address + ) +/*++ + +Routine Description: + Do a one byte Memory mapped IO read + +Arguments: + Address - Memory mapped IO address to read + +Returns: + Data read + +--*/ +; + +UINT16 +MemRead16 ( + IN UINT64 Address + ) +/*++ + +Routine Description: + Do a two byte Memory mapped IO read + +Arguments: + Address - Memory mapped IO address to read + +Returns: + Data read + +--*/ +; + +UINT32 +MemRead32 ( + IN UINT64 Address + ) +/*++ + +Routine Description: + Do a four byte Memory mapped IO read + +Arguments: + Address - Memory mapped IO address to read + +Returns: + Data read + +--*/ +; + +UINT64 +MemRead64 ( + IN UINT64 Address + ) +/*++ + +Routine Description: + Do a eight byte Memory mapped IO read + +Arguments: + Address - Memory mapped IO address to read + +Returns: + Data read + +--*/ +; + +EFI_STATUS +EfiMemWrite ( + IN EFI_CPU_IO_PROTOCOL_WIDTH Width, + IN UINT64 Address, + IN UINTN Count, + IN OUT VOID *Buffer + ) +/*++ + +Routine Description: + Perform a memory mapped IO write into Buffer. + +Arguments: + Width - Width of write transaction, and repeat operation to use + Address - IO address to write + Count - Number of times to write the IO address. + Buffer - Buffer to write data from. size is Width * Count + +Returns: + Status code + +--*/ +; + +VOID +MemWrite8 ( + IN UINT64 Address, + IN UINT8 Data + ) +/*++ + +Routine Description: + Do a one byte Memory mapped IO write + +Arguments: + Address - Memory mapped IO address to write + Data - Data to write to Address + +Returns: + NONE + +--*/ +; + +VOID +MemWrite16 ( + IN UINT64 Address, + IN UINT16 Data + ) +/*++ + +Routine Description: + Do a two byte Memory mapped IO write + +Arguments: + Address - Memory mapped IO address to write + Data - Data to write to Address + +Returns: + NONE + +--*/ +; + +VOID +MemWrite32 ( + IN UINT64 Address, + IN UINT32 Data + ) +/*++ + +Routine Description: + Do a four byte Memory mapped IO write + +Arguments: + Address - Memory mapped IO address to write + Data - Data to write to Address + +Returns: + NONE + +--*/ +; + +VOID +MemWrite64 ( + IN UINT64 Address, + IN UINT64 Data + ) +/*++ + +Routine Description: + Do a eight byte Memory mapped IO write + +Arguments: + Address - Memory mapped IO address to write + Data - Data to write to Address + +Returns: + NONE + +--*/ +; + +// +// Platform specific functions +// +UINT8 +PciRead8 ( + UINT8 Segment, + UINT8 Bus, + UINT8 DevFunc, + UINT8 Register + ) +/*++ + +Routine Description: + Perform an one byte PCI config cycle read + +Arguments: + Segment - PCI Segment ACPI _SEG + Bus - PCI Bus + DevFunc - PCI Device(7:3) and Func(2:0) + Register - PCI config space register + +Returns: + Data read from PCI config space + +--*/ +; + +UINT16 +PciRead16 ( + UINT8 Segment, + UINT8 Bus, + UINT8 DevFunc, + UINT8 Register + ) +/*++ + +Routine Description: + Perform an two byte PCI config cycle read + +Arguments: + Segment - PCI Segment ACPI _SEG + Bus - PCI Bus + DevFunc - PCI Device(7:3) and Func(2:0) + Register - PCI config space register + +Returns: + Data read from PCI config space + +--*/ +; + +UINT32 +PciRead32 ( + UINT8 Segment, + UINT8 Bus, + UINT8 DevFunc, + UINT8 Register + ) +/*++ + +Routine Description: + Perform an four byte PCI config cycle read + +Arguments: + Segment - PCI Segment ACPI _SEG + Bus - PCI Bus + DevFunc - PCI Device(7:3) and Func(2:0) + Register - PCI config space register + +Returns: + Data read from PCI config space + +--*/ +; + +VOID +PciWrite8 ( + UINT8 Segment, + UINT8 Bus, + UINT8 DevFunc, + UINT8 Register, + UINT8 Data + ) +/*++ + +Routine Description: + Perform an one byte PCI config cycle write + +Arguments: + Segment - PCI Segment ACPI _SEG + Bus - PCI Bus + DevFunc - PCI Device(7:3) and Func(2:0) + Register - PCI config space register + Data - Data to write + +Returns: + NONE + +--*/ +; + +VOID +PciWrite16 ( + UINT8 Segment, + UINT8 Bus, + UINT8 DevFunc, + UINT8 Register, + UINT16 Data + ) +/*++ + +Routine Description: + Perform an two byte PCI config cycle write + +Arguments: + Segment - PCI Segment ACPI _SEG + Bus - PCI Bus + DevFunc - PCI Device(7:3) and Func(2:0) + Register - PCI config space register + Data - Data to write + +Returns: + NONE + +--*/ +; + +VOID +PciWrite32 ( + UINT8 Segment, + UINT8 Bus, + UINT8 DevFunc, + UINT8 Register, + UINT32 Data + ) +/*++ + +Routine Description: + Perform an four byte PCI config cycle write + +Arguments: + Segment - PCI Segment ACPI _SEG + Bus - PCI Bus + DevFunc - PCI Device(7:3) and Func(2:0) + Register - PCI config space register + Data - Data to write + +Returns: + NONE + +--*/ +; + +VOID +EfiStall ( + IN UINTN Microseconds + ) +/*++ + +Routine Description: + Delay for at least the request number of microseconds + +Arguments: + Microseconds - Number of microseconds to delay. + +Returns: + NONE + +--*/ +; + +// +// FVB Services. +// +EFI_STATUS +EfiFvbInitialize ( + VOID + ) +/*++ + +Routine Description: + Initialize globals and register Fvb Protocol notification function. + +Arguments: + None + +Returns: + EFI_SUCCESS + +--*/ +; + +EFI_STATUS +EfiFvbShutdown ( + VOID + ) +/*++ + +Routine Description: + Release resources allocated in EfiFvbInitialize. + +Arguments: + None + +Returns: + EFI_SUCCESS + +--*/ +; + +EFI_STATUS +EfiFvbReadBlock ( + IN UINTN Instance, + IN EFI_LBA Lba, + IN UINTN Offset, + IN OUT UINTN *NumBytes, + IN UINT8 *Buffer + ) +/*++ + +Routine Description: + Reads specified number of bytes into a buffer from the specified block + +Arguments: + Instance - The FV instance to be read from + Lba - The logical block address to be read from + Offset - Offset into the block at which to begin reading + NumBytes - Pointer that on input contains the total size of + the buffer. On output, it contains the total number + of bytes read + Buffer - Pointer to a caller allocated buffer that will be + used to hold the data read + +Returns: + Status code + +--*/ +; + +EFI_STATUS +EfiFvbWriteBlock ( + IN UINTN Instance, + IN EFI_LBA Lba, + IN UINTN Offset, + IN OUT UINTN *NumBytes, + IN UINT8 *Buffer + ) +/*++ + +Routine Description: + Writes specified number of bytes from the input buffer to the block + +Arguments: + Instance - The FV instance to be written to + Lba - The starting logical block index to write to + Offset - Offset into the block at which to begin writing + NumBytes - Pointer that on input contains the total size of + the buffer. On output, it contains the total number + of bytes actually written + Buffer - Pointer to a caller allocated buffer that contains + the source for the write + +Returns: + Status code + +--*/ +; + +EFI_STATUS +EfiFvbEraseBlock ( + IN UINTN Instance, + IN EFI_LBA Lba + ) +/*++ + +Routine Description: + Erases and initializes a firmware volume block + +Arguments: + Instance - The FV instance to be erased + Lba - The logical block index to be erased + +Returns: + Status code + +--*/ +; + +EFI_STATUS +EfiFvbGetVolumeAttributes ( + IN UINTN Instance, + OUT EFI_FVB_ATTRIBUTES *Attributes + ) +/*++ + +Routine Description: + Retrieves attributes, insures positive polarity of attribute bits, returns + resulting attributes in output parameter + +Arguments: + Instance - The FV instance whose attributes is going to be + returned + Attributes - Output buffer which contains attributes + +Returns: + Status code + +--*/ +; + +EFI_STATUS +EfiFvbSetVolumeAttributes ( + IN UINTN Instance, + IN EFI_FVB_ATTRIBUTES Attributes + ) +/*++ + +Routine Description: + Modifies the current settings of the firmware volume according to the + input parameter. + +Arguments: + Instance - The FV instance whose attributes is going to be + modified + Attributes - It is a pointer to EFI_FVB_ATTRIBUTES + containing the desired firmware volume settings. + +Returns: + Status code + +--*/ +; + +EFI_STATUS +EfiFvbGetPhysicalAddress ( + IN UINTN Instance, + OUT EFI_PHYSICAL_ADDRESS *Address + ) +/*++ + +Routine Description: + Retrieves the physical address of a memory mapped FV + +Arguments: + Instance - The FV instance whose base address is going to be + returned + Address - Pointer to a caller allocated EFI_PHYSICAL_ADDRESS + that on successful return, contains the base address + of the firmware volume. + +Returns: + Status code + +--*/ +; + +EFI_STATUS +EfiFvbGetBlockSize ( + IN UINTN Instance, + IN EFI_LBA Lba, + OUT UINTN *BlockSize, + OUT UINTN *NumOfBlocks + ) +/*++ + +Routine Description: + Retrieve the size of a logical block + +Arguments: + Instance - The FV instance whose block size is going to be + returned + Lba - Indicates which block to return the size for. + BlockSize - A pointer to a caller allocated UINTN in which + the size of the block is returned + NumOfBlocks - a pointer to a caller allocated UINTN in which the + number of consecutive blocks starting with Lba is + returned. All blocks in this range have a size of + BlockSize + +Returns: + EFI_SUCCESS - The firmware volume was read successfully and + contents are in Buffer + +--*/ +; +EFI_STATUS +EfiFvbEraseCustomBlockRange ( + IN UINTN Instance, + IN EFI_LBA StartLba, + IN UINTN OffsetStartLba, + IN EFI_LBA LastLba, + IN UINTN OffsetLastLba + ) +/*++ + +Routine Description: + Erases and initializes a specified range of a firmware volume + +Arguments: + Instance - The FV instance to be erased + StartLba - The starting logical block index to be erased + OffsetStartLba - Offset into the starting block at which to + begin erasing + LastLba - The last logical block index to be erased + OffsetLastLba - Offset into the last block at which to end erasing + +Returns: + Status code + +--*/ +; + +EFI_STATUS +EfiCpuFlushCache ( + IN EFI_PHYSICAL_ADDRESS Start, + IN UINT64 Length + ) +/*++ + +Routine Description: + + Flush cache with specified range. + +Arguments: + + Start - Start address + Length - Length in bytes + +Returns: + + Status code + +--*/ +; + +EFI_STATUS +EFIAPI +RtEfiCreateEventLegacyBoot ( + IN EFI_TPL NotifyTpl, + IN EFI_EVENT_NOTIFY NotifyFunction, + IN VOID *NotifyContext, + OUT EFI_EVENT *LegacyBootEvent + ) +/*++ + +Routine Description: + Create a Legacy Boot Event. + Tiano extended the CreateEvent Type enum to add a legacy boot event type. + This was bad as Tiano did not own the enum. In UEFI 2.0 CreateEventEx was + added and now it's possible to not voilate the UEFI specification by + declaring a GUID for the legacy boot event class. This library supports + the R8.5/EFI 1.10 form and R8.6/UEFI 2.0 form and allows common code to + work both ways. + +Arguments: + LegacyBootEvent Returns the EFI event returned from gBS->CreateEvent(Ex) + +Returns: + EFI_SUCCESS Event was created. + Other Event was not created. + +--*/ +; + +EFI_STATUS +EFIAPI +RtEfiCreateEventReadyToBoot ( + IN EFI_TPL NotifyTpl, + IN EFI_EVENT_NOTIFY NotifyFunction, + IN VOID *NotifyContext, + OUT EFI_EVENT *ReadyToBootEvent + ) +/*++ + +Routine Description: + Create a Read to Boot Event. + + Tiano extended the CreateEvent Type enum to add a ready to boot event type. + This was bad as Tiano did not own the enum. In UEFI 2.0 CreateEventEx was + added and now it's possible to not voilate the UEFI specification and use + the ready to boot event class defined in UEFI 2.0. This library supports + the R8.5/EFI 1.10 form and R8.6/UEFI 2.0 form and allows common code to + work both ways. + +Arguments: + ReadyToBootEvent Returns the EFI event returned from gBS->CreateEvent(Ex) + +Return: + EFI_SUCCESS - Event was created. + Other - Event was not created. + +--*/ +; + +#endif diff --git a/EDK/Foundation/Library/Dxe/Include/EfiScriptLib.h b/EDK/Foundation/Library/Dxe/Include/EfiScriptLib.h new file mode 100644 index 0000000..53b523f --- /dev/null +++ b/EDK/Foundation/Library/Dxe/Include/EfiScriptLib.h @@ -0,0 +1,570 @@ +/*++ + +Copyright (c) 2004 - 2008, 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.h + +Abstract: + + +--*/ + +#ifndef _EFI_SCRIPT_LIB_H_ +#define _EFI_SCRIPT_LIB_H_ + +#include "Tiano.h" +#include "EfiCommonLib.h" +#include "EfiBootScript.h" +#include EFI_PROTOCOL_DEFINITION (BootScriptSave) + + +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: + + ImageHandle - The firmware allocated handle for the EFI image. + + SystemTable - A pointer to the EFI System Table. + +Returns: + + EFI_STATUS always returns 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 with opcode EFI_BOOT_SCRIPT_IO_WRITE_OPCODE + +Arguments: + + TableName - Desired boot script table + + Width - The width of the I/O operations. + + Address - The base address of the I/O operations. + + Count - The number of I/O operations to perform. + + Buffer - The source buffer from which to write data. + +Returns: + + EFI_NOT_FOUND - BootScriptSave Protocol not exist. + + EFI_STATUS - BootScriptSave Protocol exist, always returns 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 modify to boot script with opcode EFI_BOOT_SCRIPT_IO_READ_WRITE_OPCODE + +Arguments: + + TableName - Desired boot script table + + Width - The width of the I/O operations. + + Address - The base address of the I/O operations. + + Data - A pointer to the data to be OR-ed. + + DataMask - A pointer to the data mask to be AND-ed with the data read from the register. + +Returns: + + EFI_NOT_FOUND - BootScriptSave Protocol not exist. + + EFI_STATUS - BootScriptSave Protocol exist, always returns 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 memory write to boot script with opcode EFI_BOOT_SCRIPT_MEM_WRITE_OPCODE + +Arguments: + + TableName - Desired boot script table + + Width - The width of the memory operations. + + Address - The base address of the memory operations. + + Count - The number of memory operations to perform. + + Buffer - The source buffer from which to write the data. + +Returns: + + EFI_NOT_FOUND - BootScriptSave Protocol not exist. + + EFI_STATUS - BootScriptSave Protocol exist, always returns 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 memory modify to boot script with opcode EFI_BOOT_SCRIPT_MEM_READ_WRITE_OPCODE + +Arguments: + + TableName - Desired boot script table + + Width - The width of the memory operations. + + Address - The base address of the memory operations. + + Data - A pointer to the data to be OR-ed. + + DataMask - A pointer to the data mask to be AND-ed with the data read from the register. + +Returns: + + EFI_NOT_FOUND - BootScriptSave Protocol not exist. + + EFI_STATUS - BootScriptSave Protocol exist, always returns 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 PCI configuration space write operation to boot script with opcode + EFI_BOOT_SCRIPT_PCI_CONFIG_WRITE_OPCODE + +Arguments: + + TableName - Desired boot script table + + Width - The width of the PCI operations + + Address - The address within the PCI configuration space. + + Count - The number of PCI operations to perform. + + Buffer - The source buffer from which to write the data. + +Returns: + + EFI_NOT_FOUND - BootScriptSave Protocol not exist. + + EFI_STATUS - BootScriptSave Protocol exist, always returns 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 PCI configuration space modify operation to boot script with opcode + EFI_BOOT_SCRIPT_PCI_CONFIG_READ_WRITE_OPCODE + +Arguments: + + TableName - Desired boot script table + + Width - The width of the PCI operations + + Address - The address within the PCI configuration space. + + Data - A pointer to the data to be OR-ed. + + DataMask - A pointer to the data mask to be AND-ed with the data read from the register. + +Returns: + + EFI_NOT_FOUND - BootScriptSave Protocol not exist. + + EFI_STATUS - BootScriptSave Protocol exist, always returns 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 SMBus command execution to boot script with opcode + EFI_BOOT_SCRIPT_SMBUS_EXECUTE_OPCODE + +Arguments: + + TableName - Desired boot script table + SlaveAddress - The SMBus address for the slave device that the operation is targeting. + Command - The command that is transmitted by the SMBus host controller to the + SMBus slave device. + Operation - Indicates which particular SMBus protocol it will use to execute the + SMBus transactions. + PecCheck - Defines if Packet Error Code (PEC) checking is required for this operation. + Length - A pointer to signify the number of bytes that this operation will do. + Buffer - Contains the value of data to execute to the SMBUS slave device. + +Returns: + + EFI_NOT_FOUND - BootScriptSave Protocol not exist. + + EFI_STATUS - BootScriptSave Protocol exist, always returns EFI_SUCCESS + +--*/ +; + +EFI_STATUS +EFIAPI +BootScriptSaveStall ( + IN UINT16 TableName, + IN UINTN Duration + ) +/*++ + +Routine Description: + + Save execution stall on the processor to boot script with opcode + EFI_BOOT_SCRIPT_STALL_OPCODE + +Arguments: + + TableName - Desired boot script table + + Duration - Duration in microseconds of the stall. + +Returns: + + EFI_NOT_FOUND - BootScriptSave Protocol not exist. + + EFI_STATUS - BootScriptSave Protocol exist, always returns EFI_SUCCESS + +--*/ +; + +EFI_STATUS +EFIAPI +BootScriptSaveDispatch ( + IN UINT16 TableName, + IN EFI_PHYSICAL_ADDRESS EntryPoint + ) +/*++ + +Routine Description: + + Save dispatching specified arbitrary code to boot script with opcode + EFI_BOOT_SCRIPT_DISPATCH_OPCODE + +Arguments: + + TableName - Desired boot script table + + EntryPoint - Entry point of the code to be dispatched. + +Returns: + + EFI_NOT_FOUND - BootScriptSave Protocol not exist. + + EFI_STATUS - BootScriptSave Protocol exist, always returns 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: + Polling one memory mapping register + +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_SUCCESS - The operation was executed successfully + +--*/ +; + +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 + +--*/ +; + +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 + +--*/ +; + +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 + +--*/ +; + +#ifdef EFI_S3_RESUME + +#define INITIALIZE_SCRIPT(ImageHandle, SystemTable) \ + BootScriptSaveInitialize(ImageHandle, SystemTable) + +#define SCRIPT_IO_WRITE(TableName, Width, Address, Count, Buffer) \ + BootScriptSaveIoWrite(TableName, Width, Address, Count, Buffer) + +#define SCRIPT_IO_READ_WRITE(TableName, Width, Address, Data, DataMask) \ + BootScriptSaveIoReadWrite(TableName, Width, Address, Data, DataMask) + +#define SCRIPT_MEM_WRITE(TableName, Width, Address, Count, Buffer) \ + BootScriptSaveMemWrite(TableName, Width, Address, Count, Buffer) + +#define SCRIPT_MEM_WRITE_THIS(TableName, Width, Address, Count) \ + BootScriptSaveMemWrite(TableName, Width, Address, Count, (VOID*)(UINTN)Address) + +#define SCRIPT_MEM_READ_WRITE(TableName, Width, Address, Data, DataMask) \ + BootScriptSaveMemReadWrite(TableName, Width, Address, Data, DataMask) + +#define SCRIPT_PCI_CFG_WRITE(TableName, Width, Address, Count, Buffer) \ + BootScriptSavePciCfgWrite(TableName, Width, Address, Count, Buffer) + +#define SCRIPT_PCI_CFG_READ_WRITE(TableName, Width, Address, Data, DataMask) \ + BootScriptSavePciCfgReadWrite(TableName, Width, Address, Data, DataMask) + +#define SCRIPT_SMBUS_EXECUTE(TableName, SlaveAddress, Command, Operation, PecCheck, Length, Buffer) \ + BootScriptSaveSmbusExecute(TableName, SlaveAddress, Command, Operation, PecCheck, Length, Buffer) + +#define SCRIPT_STALL(TableName, Duration) \ + BootScriptSaveStall(TableName, Duration) + +#define SCRIPT_DISPATCH(TableName, EntryPoint) \ + BootScriptSaveDispatch(TableName, EntryPoint) + +#define SCRIPT_MEM_POLL(TableName, Width, Address, BitMask, BitValue, Duration, LoopTimes) \ + BootScriptMemPoll(TableName, Width, Address, BitMask, BitValue, Duration, LoopTimes) + +#define SCRIPT_INFORMATION(TableName, Length, Buffer) \ + BootScriptSaveInformation(TableName, Length, Buffer) + +#define SCRIPT_INFORMATION_UNICODE_STRING(TableName, String) \ + BootScriptSaveInformationUnicodeString(TableName, String) + +#define SCRIPT_INFORMATION_ASCII_STRING(TableName, String) \ + BootScriptSaveInformationAsciiString(TableName, String) + +#else + +#define INITIALIZE_SCRIPT(ImageHandle, SystemTable) + +#define SCRIPT_IO_WRITE(TableName, Width, Address, Count, Buffer) + +#define SCRIPT_IO_READ_WRITE(TableName, Width, Address, Data, DataMask) + +#define SCRIPT_MEM_WRITE(TableName, Width, Address, Count, Buffer) + +#define SCRIPT_MEM_WRITE_THIS(TableName, Width, Address, Count) + +#define SCRIPT_MEM_READ_WRITE(TableName, Width, Address, Data, DataMask) + +#define SCRIPT_PCI_CFG_WRITE(TableName, Width, Address, Count, Buffer) + +#define SCRIPT_PCI_CFG_READ_WRITE(TableName, Width, Address, Data, DataMask) + +#define SCRIPT_SMBUS_EXECUTE(TableName, SlaveAddress, Command, Operation, PecCheck, Length, Buffer) + +#define SCRIPT_STALL(TableName, Duration) + +#define SCRIPT_DISPATCH(TableName, EntryPoint) + +#define SCRIPT_MEM_POLL(TableName, Width, Address, BitMask, BitValue, Duration, LoopTimes) + +#define SCRIPT_INFORMATION(TableName, Length, Buffer) + +#define SCRIPT_INFORMATION_UNICODE_STRING(TableName, String) + +#define SCRIPT_INFORMATION_ASCII_STRING(TableName, String) + +#endif + +#endif diff --git a/EDK/Foundation/Library/Dxe/Include/EfiSmmDriverLib.h b/EDK/Foundation/Library/Dxe/Include/EfiSmmDriverLib.h new file mode 100644 index 0000000..5b6e74a --- /dev/null +++ b/EDK/Foundation/Library/Dxe/Include/EfiSmmDriverLib.h @@ -0,0 +1,226 @@ +/*++ + +Copyright (c) 2004 - 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: + + EfiSmmDriverLib.h + +Abstract: + + Light weight lib to support EFI Smm drivers. + +--*/ + +#ifndef _EFI_SMM_DRIVER_LIB_H_ +#define _EFI_SMM_DRIVER_LIB_H_ + +#include "Tiano.h" +#include "GetImage.h" +#include "EfiCommonLib.h" +#include EFI_GUID_DEFINITION (EventLegacyBios) +#include EFI_GUID_DEFINITION (EventGroup) +#include EFI_PROTOCOL_DEFINITION (FirmwareVolume) +#include EFI_PROTOCOL_DEFINITION (FirmwareVolume2) //;;## ...AMI_OVERRIDE... Support PI1.x +#include EFI_PROTOCOL_DEFINITION (SmmBase) +#include EFI_PROTOCOL_DEFINITION (SmmStatusCode) +// +// Driver Lib Globals. +// +extern EFI_BOOT_SERVICES *gBS; +extern EFI_SYSTEM_TABLE *gST; +extern EFI_RUNTIME_SERVICES *gRT; +extern EFI_SMM_BASE_PROTOCOL *gSMM; +extern EFI_SMM_STATUS_CODE_PROTOCOL *mSmmDebug; +extern UINTN gErrorLevel; + +#define EfiCopyMem EfiCommonLibCopyMem +#define EfiSetMem EfiCommonLibSetMem +#define EfiZeroMem EfiCommonLibZeroMem + +EFI_STATUS +EfiInitializeSmmDriverLib ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable, + IN OUT BOOLEAN *InSmm + ) +/*++ + +Routine Description: + + Intialize Smm Driver Lib if it has not yet been initialized. + +Arguments: + + ImageHandle - The firmware allocated handle for the EFI image. + + SystemTable - A pointer to the EFI System Table. + + InSmm - If InSmm is NULL, it will not register Image to SMM. + If InSmm is not NULL, it will register Image to SMM and + return information on currently in SMM mode or not. + +Returns: + + EFI_STATUS always returns EFI_SUCCESS + +--*/ +; + +VOID +EfiDebugAssert ( + IN CHAR8 *FileName, + IN INTN LineNumber, + IN CHAR8 *Description + ) +/*++ + +Routine Description: + + Worker function for ASSERT (). If Error Logging hub is loaded log ASSERT + information. If Error Logging hub is not loaded DEADLOOP (). + +Arguments: + + FileName - File name of failing routine. + + LineNumber - Line number of failing ASSERT(). + + Description - Description, usually the assertion, + +Returns: + + None + +--*/ +; + +VOID +EfiDebugVPrint ( + IN UINTN ErrorLevel, + IN CHAR8 *Format, + IN VA_LIST Marker + ) +/*++ + +Routine Description: + + Worker function for DEBUG(). If Error Logging hub is loaded log ASSERT + information. If Error Logging hub is not loaded do nothing. + +Arguments: + + ErrorLevel - If error level is set do the debug print. + + Format - String to use for the print, followed by Print arguments. + + Marker - VarArgs + +Returns: + + None + +--*/ +; + +VOID +EfiDebugPrint ( + IN UINTN ErrorLevel, + IN CHAR8 *Format, + ... + ) +/*++ + +Routine Description: + + Worker function for DEBUG(). If Error Logging hub is loaded log ASSERT + information. If Error Logging hub is not loaded do nothing. + +Arguments: + + ErrorLevel - If error level is set do the debug print. + + Format - String to use for the print, followed by Print arguments. + + ... - VAR args for Format + +Returns: + + None + +--*/ +; + +EFI_STATUS +EFIAPI +SmmEfiCreateEventLegacyBoot ( + IN EFI_TPL NotifyTpl, + IN EFI_EVENT_NOTIFY NotifyFunction, + IN VOID *NotifyContext, + OUT EFI_EVENT *LegacyBootEvent + ) +/*++ + +Routine Description: + Create a Legacy Boot Event. + Tiano extended the CreateEvent Type enum to add a legacy boot event type. + This was bad as Tiano did not own the enum. In UEFI 2.0 CreateEventEx was + added and now it's possible to not voilate the UEFI specification by + declaring a GUID for the legacy boot event class. This library supports + the R8.5/EFI 1.10 form and R8.6/UEFI 2.0 form and allows common code to + work both ways. + +Arguments: + LegacyBootEvent Returns the EFI event returned from gBS->CreateEvent(Ex) + +Returns: + EFI_SUCCESS Event was created. + Other Event was not created. + +--*/ +; + +EFI_STATUS +EFIAPI +SmmEfiCreateEventReadyToBoot ( + IN EFI_TPL NotifyTpl, + IN EFI_EVENT_NOTIFY NotifyFunction, + IN VOID *NotifyContext, + OUT EFI_EVENT *ReadyToBootEvent + ) +/*++ + +Routine Description: + Create a Read to Boot Event. + + Tiano extended the CreateEvent Type enum to add a ready to boot event type. + This was bad as Tiano did not own the enum. In UEFI 2.0 CreateEventEx was + added and now it's possible to not voilate the UEFI specification and use + the ready to boot event class defined in UEFI 2.0. This library supports + the R8.5/EFI 1.10 form and R8.6/UEFI 2.0 form and allows common code to + work both ways. + +Arguments: + ReadyToBootEvent Returns the EFI event returned from gBS->CreateEvent(Ex) + +Return: + EFI_SUCCESS - Event was created. + Other - Event was not created. + +--*/ +; + +// +// These macros let code use the same name as boot service driver lib. +// +#define EfiCreateEventLegacyBoot SmmEfiCreateEventLegacyBoot +#define EfiCreateEventReadyToBoot SmmEfiCreateEventReadyToBoot + +#endif diff --git a/EDK/Foundation/Library/Dxe/Include/EfiUiLib.h b/EDK/Foundation/Library/Dxe/Include/EfiUiLib.h new file mode 100644 index 0000000..0e2bc59 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/Include/EfiUiLib.h @@ -0,0 +1,205 @@ +/*++ + +Copyright (c) 2004, 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: + EfiUiLib.h + +Abstract: + Collection of usefull UI functions. + +Revision History: + +--*/ + +#ifndef _EFI_UI_LIB_H_ +#define _EFI_UI_LIB_H_ + +#include "Tiano.h" +#include "TianoTypes.h" +#include "EfiDriverLib.h" + +CHAR16 * +StrHzToString ( + OUT CHAR16 *String, + IN UINT64 Val + ) +/*++ + +Routine Description: + Converts frequency in Hz to Unicode string. + Three significant digits are delivered. Used for processor info display. + +Arguments: + String - string that will contain the frequency. + Val - value to convert, minimum is 100000 i.e., 0.1 MHz. + +Returns: + String that contains the frequency. + +--*/ +; + +CHAR16 * +StrBytesToString ( + OUT CHAR16 *String, + IN UINT64 Val + ) +/*++ + +Routine Description: + Converts size in bytes to Unicode string. + Used for memory/cache size display. + +Arguments: + String - string that will contain the value + Val - value to convert in bytes + +Returns: + String that contains the value. + +--*/ +; + +CHAR16 * +StrVersionToString ( + OUT CHAR16 *String, + IN UINT8 Version + ) +/*++ + +Routine Description: + Converts 8 bit version value to Unicode string. + The upper nibble contains the upper part, the lower nibble contains the minor part. + The output format is .. + +Arguments: + String - string that will contain the version value + Version - Version value to convert + +Returns: + String that contains the version value. + +--*/ +; + +CHAR16 * +StrMacToString ( + OUT CHAR16 *String, + IN EFI_MAC_ADDRESS *MacAddr, + IN UINT32 AddrSize + ) +/*++ + +Routine Description: + Converts MAC address to Unicode string. + The value is 64-bit and the resulting string will be 12 + digit hex number in pairs of digits separated by dashes. + +Arguments: + String - string that will contain the value + MacAddr - MAC address to convert + AddrSize - Size of address + +Returns: + String that contains the value. + +--*/ +; + +CHAR16 * +StrIp4AdrToString ( + OUT CHAR16 *String, + IN EFI_IPv4_ADDRESS *Ip4Addr + ) +/*++ + +Routine Description: + Converts IP v4 address to Unicode string. + The value is 64-bit and the resulting string will + be four decimal values 0-255 separated by dots. + +Arguments: + String - string that will contain the value + Ip4Addr - IP v4 address to convert from + +Returns: + + String that contain the value + +--*/ +; + +EFI_STATUS +StrStringToIp4Adr ( + OUT EFI_IPv4_ADDRESS *Ip4Addr, + IN CHAR16 *String + ) +/*++ + +Routine Description: + Parses and converts Unicode string to IP v4 address. + The value will 64-bit. + The string must be four decimal values 0-255 separated by dots. + The string is parsed and format verified. + +Arguments: + Ip4Addr - pointer to the variable to store the value to + String - string that contains the value to parse and convert + +Returns: + EFI_SUCCESS - if successful + EFI_INVALID_PARAMETER - if String contains invalid IP v4 format + +--*/ +; + +CHAR16 * +Ascii2Unicode ( + OUT CHAR16 *UnicodeStr, + IN CHAR8 *AsciiStr + ) +/*++ + +Routine Description: + Converts ASCII characters to Unicode. + +Arguments: + UnicodeStr - the Unicode string to be written to. The buffer must be large enough. + AsciiStr - The ASCII string to be converted. + +Returns: + The address to the Unicode string - same as UnicodeStr. + +--*/ +; + +CHAR8 * +Unicode2Ascii ( + OUT CHAR8 *AsciiStr, + IN CHAR16 *UnicodeStr + ) +/*++ + +Routine Description: + Converts ASCII characters to Unicode. + Assumes that the Unicode characters are only these defined in the ASCII set. + +Arguments: + AsciiStr - The ASCII string to be written to. The buffer must be large enough. + UnicodeStr - the Unicode string to be converted. + +Returns: + The address to the ASCII string - same as AsciiStr. + +--*/ +; + +#endif diff --git a/EDK/Foundation/Library/Dxe/Include/EfiWinNtLib.h b/EDK/Foundation/Library/Dxe/Include/EfiWinNtLib.h new file mode 100644 index 0000000..8f7bd57 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/Include/EfiWinNtLib.h @@ -0,0 +1,75 @@ +/*++ + +Copyright (c) 2004, 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: + + EfiWinNtLib.h + +Abstract: + + Set up gWinNt pointer so we can call WinNT APIs. + +--*/ + +#ifndef _EFI_WIN_NT_LIB_H_ +#define _EFI_WIN_NT_LIB_H_ + +extern EFI_WIN_NT_THUNK_PROTOCOL *gWinNt; + +EFI_STATUS +EfiInitializeWinNtDriverLib ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +/*++ + +Routine Description: + + Intialize gWinNt and initialize debug console. + +Arguments: + + ImageHandle - The firmware allocated handle for the EFI image. + + SystemTable - A pointer to the EFI System Table. + +Returns: + + Status code + +--*/ +; + +// +// NTDebugConsole Prototypes +// +VOID +NtDebugConsoleInit ( + VOID + ) +/*++ + +Routine Description: + + Nt debug console initialize. + +Arguments: + + None + +Returns: + + None + +--*/ +; + +#endif diff --git a/EDK/Foundation/Library/Dxe/Include/GetImage.h b/EDK/Foundation/Library/Dxe/Include/GetImage.h new file mode 100644 index 0000000..0f22c5e --- /dev/null +++ b/EDK/Foundation/Library/Dxe/Include/GetImage.h @@ -0,0 +1,104 @@ +/*++ + +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: + + GetImage.h + +Abstract: + + Image data retrieval support for common use. + +--*/ + +#ifndef _GET_IMAGE_H_ +#define _GET_IMAGE_H_ +#include "EfiImageFormat.h" + +EFI_STATUS +GetImage ( + IN EFI_GUID *NameGuid, + IN EFI_SECTION_TYPE SectionType, + OUT VOID **Buffer, + OUT UINTN *Size + ) +/*++ + +Routine Description: + Enumerate all the FVs, and fill Buffer with the SectionType section content in NameGuid file. + + Note: + 1. when SectionType is EFI_SECTION_PE32, it tries to read NameGuid file after failure on + reading EFI_SECTION_PE32 section. + 2. when SectionType is EFI_SECTION_TE, it tries to get EFI_SECTION_PE32 section after failure on + reading EFI_SECTION_TE section. If it's failed again, it tries to read NameGuid file. + 3. Callee allocates memory, which caller is responsible to free. + +Arguments: + + NameGuid - Pointer to EFI_GUID, which is file name. + SectionType - Required section type. + Buffer - Pointer to a pointer in which the read content is returned. + Caller is responsible to free Buffer. + Size - Pointer to a UINTN, which indicates the size of returned *Buffer. + +Returns: + EFI_NOT_FOUND - Required content can not be found. + EFI_SUCCESS - Required content can be found, but whether the Buffer is filled + with section content or not depends on the Buffer and Size. +--*/ +; + +EFI_STATUS +GetImageEx ( + IN EFI_HANDLE ImageHandle, + IN EFI_GUID *NameGuid, + IN EFI_SECTION_TYPE SectionType, + OUT VOID **Buffer, + OUT UINTN *Size, + BOOLEAN WithinImageFv + ) +/*++ + +Routine Description: + Search FVs, and fill Buffer with the SectionType section content in NameGuid file. + If ImageHandle is not NULL, the FV from which the ImageHandle is loaded is searched + first. If WithinImageFv is TRUE, only the FV from which the ImageHandle is loaded + is searched. If ImageHandle is NULL or WithinImageFv is FALSE, all FVs in the system + is searched. + + Note: + 1. when SectionType is EFI_SECTION_PE32, it tries to read NameGuid file after failure on + reading EFI_SECTION_PE32 section. + 2. when SectionType is EFI_SECTION_TE, it tries to get EFI_SECTION_PE32 section after failure on + reading EFI_SECTION_TE section. If it's failed again, it tries to read NameGuid file. + 3. Callee allocates memory, which caller is responsible to free. + +Arguments: + + ImageHandle - The caller's driver image handle. + NameGuid - Pointer to EFI_GUID, which is file name. + SectionType - Required section type. + Buffer - Pointer to a pointer in which the read content is returned. + Caller is responsible to free Buffer. + Size - Pointer to a UINTN, which indicates the size of returned *Buffer. + WithinImageFv - Whether the search only performs on the FV from which the caller's + driver image is loaded. + +Returns: + EFI_INVALID_PARAMETER - ImageHandle is NULL and WithinImageFv is TRUE. + EFI_NOT_FOUND - Required content can not be found. + EFI_SUCCESS - Required content can be found, but whether the Buffer is filled + with section content or not depends on the Buffer and Size. +--*/ +; + +#endif //_GET_IMAGE_H_ diff --git a/EDK/Foundation/Library/Dxe/Include/GraphicsLib.h b/EDK/Foundation/Library/Dxe/Include/GraphicsLib.h new file mode 100644 index 0000000..02f1d97 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/Include/GraphicsLib.h @@ -0,0 +1,181 @@ +/*++ + +Copyright (c) 2004 - 2006, 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: + + GraphicsLib.h + +Abstract: + + +--*/ + +#ifndef _EFI_GRAPHICS_LIB_H_ +#define _EFI_GRAPHICS_LIB_H_ + +#include EFI_PROTOCOL_DEFINITION (ConsoleControl) +#include EFI_PROTOCOL_DEFINITION (FirmwareVolume) +#include EFI_PROTOCOL_DEFINITION (GraphicsOutput) +#include EFI_PROTOCOL_DEFINITION (UgaDraw) +#include EFI_PROTOCOL_DEFINITION (EfiOEMBadging) + +#include EFI_GUID_DEFINITION (Bmp) + +EFI_STATUS +GetGraphicsBitMapFromFV ( + IN EFI_GUID *FileNameGuid, + OUT VOID **Image, + OUT UINTN *ImageSize + ) +/*++ + +Routine Description: + + Return the graphics image file named FileNameGuid into Image and return it's + size in ImageSize. All Firmware Volumes (FV) in the system are searched for the + file name. + +Arguments: + + FileNameGuid - File Name of graphics file in the FV(s). + + Image - Pointer to pointer to return graphics image. If NULL, a + buffer will be allocated. + + ImageSize - Size of the graphics Image in bytes. Zero if no image found. + + +Returns: + + EFI_SUCCESS - Image and ImageSize are valid. + EFI_BUFFER_TOO_SMALL - Image not big enough. ImageSize has required size + EFI_NOT_FOUND - FileNameGuid not found + +--*/ +; + +EFI_STATUS +ConvertBmpToGopBlt ( + IN VOID *BmpImage, + IN UINTN BmpImageSize, + IN OUT VOID **GopBlt, + IN OUT UINTN *GopBltSize, + OUT UINTN *PixelHeight, + OUT UINTN *PixelWidth + ) +/*++ + +Routine Description: + + Convert a *.BMP graphics image to a GOP/UGA blt buffer. If a NULL Blt buffer + is passed in a GopBlt buffer will be allocated by this routine. If a GopBlt + buffer is passed in it will be used if it is big enough. + +Arguments: + + BmpImage - Pointer to BMP file + + BmpImageSize - Number of bytes in BmpImage + + GopBlt - Buffer containing GOP version of BmpImage. + + GopBltSize - Size of GopBlt in bytes. + + PixelHeight - Height of GopBlt/BmpImage in pixels + + PixelWidth - Width of GopBlt/BmpImage in pixels + + +Returns: + + EFI_SUCCESS - GopBlt and GopBltSize are returned. + EFI_UNSUPPORTED - BmpImage is not a valid *.BMP image + EFI_BUFFER_TOO_SMALL - The passed in GopBlt buffer is not big enough. + GopBltSize will contain the required size. + EFI_OUT_OF_RESOURCES - No enough buffer to allocate + +--*/ +; + +EFI_STATUS +EnableQuietBoot ( + IN EFI_GUID *LogoFile + ) +/*++ + +Routine Description: + + Use Console Control to turn off UGA based Simple Text Out consoles from going + to the UGA device. Put up LogoFile on every UGA device that is a console + +Arguments: + + LogoFile - File name of logo to display on the center of the screen. + + +Returns: + + EFI_SUCCESS - ConsoleControl has been flipped to graphics and logo + displayed. + EFI_UNSUPPORTED - Logo not found + +--*/ +; + +EFI_STATUS +DisableQuietBoot ( + VOID + ) +/*++ + +Routine Description: + + Use Console Control to turn on UGA based Simple Text Out consoles. The UGA + Simple Text Out screens will now be synced up with all non UGA output devices + +Arguments: + + NONE + +Returns: + + EFI_SUCCESS - UGA devices are back in text mode and synced up. + EFI_UNSUPPORTED - Logo not found + +--*/ +; + +EFI_STATUS +LockKeyboards ( + IN CHAR16 *Password + ) +/*++ + +Routine Description: + Use Console Control Protocol to lock the Console In Spliter virtual handle. + This is the ConInHandle and ConIn handle in the EFI system table. All key + presses will be ignored until the Password is typed in. The only way to + disable the password is to type it in to a ConIn device. + +Arguments: + Password - Password used to lock ConIn device + + +Returns: + + EFI_SUCCESS - ConsoleControl has been flipped to graphics and logo + displayed. + EFI_UNSUPPORTED - Logo not found + +--*/ +; + +#endif diff --git a/EDK/Foundation/Library/Dxe/Include/Ia32/CpuFuncs.h b/EDK/Foundation/Library/Dxe/Include/Ia32/CpuFuncs.h new file mode 100644 index 0000000..affb3bd --- /dev/null +++ b/EDK/Foundation/Library/Dxe/Include/Ia32/CpuFuncs.h @@ -0,0 +1,260 @@ +/*++ + +Copyright (c) 2004 - 2006, 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: + + CpuFuncs.h + +Abstract: + +--*/ + +#ifndef _CPU_FUNCS_H_ +#define _CPU_FUNCS_H_ + +#define EFI_CPUID_SIGNATURE 0x0 +#define EFI_CPUID_VERSION_INFO 0x1 +#define EFI_CPUID_CACHE_INFO 0x2 +#define EFI_CPUID_SERIAL_NUMBER 0x3 +#define EFI_CPUID_EXTENDED_FUNCTION 0x80000000 +#define EFI_CPUID_EXTENDED_CPU_SIG 0x80000001 +#define EFI_CPUID_BRAND_STRING1 0x80000002 +#define EFI_CPUID_BRAND_STRING2 0x80000003 +#define EFI_CPUID_BRAND_STRING3 0x80000004 + +// +// CPUID version information masks +// Note: leaving masks here is for the compatibility +// use EfiCpuVersion (...) instead +// +#define EFI_CPUID_FAMILY 0x0F00 +#define EFI_CPUID_MODEL 0x00F0 +#define EFI_CPUID_STEPPING 0x000F + +#define EFI_CPUID_PENTIUM_M 0x0600 +#define EFI_CPUID_BANIAS 0x0090 +#define EFI_CPUID_DOTHAN 0x00D0 +#define EFI_CPUID_NETBURST 0x0F00 + +#define EFI_MSR_IA32_PLATFORM_ID 0x17 +#define EFI_MSR_IA32_APIC_BASE 0x1B +#define EFI_MSR_EBC_HARD_POWERON 0x2A +#define EFI_MSR_EBC_SOFT_POWERON 0x2B +#define BINIT_DRIVER_DISABLE 0x40 +#define INTERNAL_MCERR_DISABLE 0x20 +#define INITIATOR_MCERR_DISABLE 0x10 +#define EFI_MSR_EBC_FREQUENCY_ID 0x2C +#define EFI_MSR_IA32_BIOS_UPDT_TRIG 0x79 +#define EFI_MSR_IA32_BIOS_SIGN_ID 0x8B +#define EFI_MSR_PSB_CLOCK_STATUS 0xCD +#define EFI_APIC_GLOBAL_ENABLE 0x800 +#define EFI_MSR_IA32_MISC_ENABLE 0x1A0 +#define LIMIT_CPUID_MAXVAL_ENABLE_BIT 0x00400000 +#define AUTOMATIC_THERMAL_CONTROL_ENABLE_BIT 0x00000008 +#define COMPATIBLE_FPU_OPCODE_ENABLE_BIT 0x00000004 +#define LOGICAL_PROCESSOR_PRIORITY_ENABLE_BIT 0x00000002 +#define FAST_STRING_ENABLE_BIT 0x00000001 + +#define EFI_CACHE_VARIABLE_MTRR_BASE 0x200 +#define EFI_CACHE_VARIABLE_MTRR_END 0x20F +#define EFI_CACHE_IA32_MTRR_DEF_TYPE 0x2FF +#define EFI_CACHE_VALID_ADDRESS 0xFFFFFF000 +#define EFI_CACHE_MTRR_VALID 0x800 +#define EFI_CACHE_FIXED_MTRR_VALID 0x400 +#define EFI_MSR_VALID_MASK 0xFFFFFFFFF + +#define EFI_IA32_MTRR_FIX64K_00000 0x250 +#define EFI_IA32_MTRR_FIX16K_80000 0x258 +#define EFI_IA32_MTRR_FIX16K_A0000 0x259 +#define EFI_IA32_MTRR_FIX4K_C0000 0x268 +#define EFI_IA32_MTRR_FIX4K_C8000 0x269 +#define EFI_IA32_MTRR_FIX4K_D0000 0x26A +#define EFI_IA32_MTRR_FIX4K_D8000 0x26B +#define EFI_IA32_MTRR_FIX4K_E0000 0x26C +#define EFI_IA32_MTRR_FIX4K_E8000 0x26D +#define EFI_IA32_MTRR_FIX4K_F0000 0x26E +#define EFI_IA32_MTRR_FIX4K_F8000 0x26F + +#define EFI_IA32_MCG_CAP 0x179 +#define EFI_IA32_MCG_CTL 0x17B +#define EFI_IA32_MC0_CTL 0x400 +#define EFI_IA32_MC0_STATUS 0x401 + +#define EFI_CACHE_UNCACHEABLE 0 +#define EFI_CACHE_WRITECOMBINING 1 +#define EFI_CACHE_WRITETHROUGH 4 +#define EFI_CACHE_WRITEPROTECTED 5 +#define EFI_CACHE_WRITEBACK 6 + +// +// Combine f(FamilyId), m(Model), s(SteppingId) to a single 32 bit number +// +#define EfiMakeCpuVersion(f, m, s) \ + (((UINT32) (f) << 16) | ((UINT32) (m) << 8) | ((UINT32) (s))) + +typedef struct { + UINT32 HeaderVersion; + UINT32 UpdateRevision; + UINT32 Date; + UINT32 ProcessorId; + UINT32 Checksum; + UINT32 LoaderRevision; + UINT32 ProcessorFlags; + UINT32 DataSize; + UINT32 TotalSize; + UINT8 Reserved[12]; +} EFI_CPU_MICROCODE_HEADER; + +typedef struct { + UINT32 ExtSigCount; + UINT32 ExtChecksum; + UINT8 Reserved[12]; + UINT32 ProcessorId; + UINT32 ProcessorFlags; + UINT32 Checksum; +} EFI_CPU_MICROCODE_EXT_HEADER; + +typedef struct { + UINT32 RegEax; + UINT32 RegEbx; + UINT32 RegEcx; + UINT32 RegEdx; +} EFI_CPUID_REGISTER; + +VOID +EfiWriteMsr ( + IN UINT32 Input, + IN UINT64 Value + ) +/*++ + +Routine Description: + + Write Cpu MSR + +Arguments: + + Input -The index value to select the register + Value -The value to write to the selected register + +Returns: + + None + +--*/ +; + +UINT64 +EfiReadMsr ( + IN UINT32 Input + ) +/*++ + +Routine Description: + + Read Cpu MSR. + +Arguments: + + Input: -The index value to select the register + +Returns: + + Return the read data + +--*/ +; + +VOID +EfiCpuid ( + IN UINT32 RegEax, + OUT EFI_CPUID_REGISTER *Reg + ) +/*++ + +Routine Description: + + Get the Cpu info by excute the CPUID instruction. + +Arguments: + + RegEax -The input value to put into register EAX + Reg -The Output value + +Returns: + + None + +--*/ +; + +VOID +EfiCpuVersion ( + IN UINT16 *FamilyId, OPTIONAL + IN UINT8 *Model, OPTIONAL + IN UINT8 *SteppingId, OPTIONAL + IN UINT8 *Processor OPTIONAL + ) +/*++ + +Routine Description: + Extract CPU detail version infomation + +Arguments: + FamilyId - FamilyId, including ExtendedFamilyId + Model - Model, including ExtendedModel + SteppingId - SteppingId + Processor - Processor + +--*/ +; + +UINT64 +EfiReadTsc ( + VOID + ) +/*++ + +Routine Description: + + Read Time stamp. + +Arguments: + + None + +Returns: + + Return the read data + +--*/ +; +VOID +EfiCpuidExt ( + IN UINT32 RegisterInEax, + IN UINT32 CacheLevel, + OUT EFI_CPUID_REGISTER *Regs + ) +/*++ +Routine Description: + When RegisterInEax != 4, the functionality is the same as EfiCpuid. + When RegisterInEax == 4, the function return the deterministic cache + parameters by excuting the CPUID instruction +Arguments: + RegisterInEax: - The input value to put into register EAX + CacheLevel: - The deterministic cache level + Regs: - The Output value +Returns: + None +--*/ +; + +#endif diff --git a/EDK/Foundation/Library/Dxe/Include/Ia32/ProcDep.h b/EDK/Foundation/Library/Dxe/Include/Ia32/ProcDep.h new file mode 100644 index 0000000..2e072d2 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/Include/Ia32/ProcDep.h @@ -0,0 +1,26 @@ +/*++ + +Copyright (c) 2004, 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: + + ProcDep.h + +Abstract: + + IA-32 specific Runtime Lib code. At this time there is non. + IPF has different code due to extra API requirements. + +--*/ + +#ifndef _PROC_DEP_H_ +#define _PROC_DEP_H_ + +#endif diff --git a/EDK/Foundation/Library/Dxe/Include/Ia32EfiRuntimeDriverLib.h b/EDK/Foundation/Library/Dxe/Include/Ia32EfiRuntimeDriverLib.h new file mode 100644 index 0000000..df833c4 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/Include/Ia32EfiRuntimeDriverLib.h @@ -0,0 +1,111 @@ +/*++ + +Copyright (c) 2004, 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: + + Ia32EfiRuntimeDriverLib.h + +Abstract: + + Light weight lib to support IA32 EFI Libraries. + +--*/ + +#ifndef _IA32_EFI_RUNTIME_LIB_H_ +#define _IA32_EFI_RUNTIME_LIB_H_ + +#include "Tiano.h" +#include "EfiRuntimeLib.h" +#include EFI_PROTOCOL_DEFINITION (ExtendedSalGuid) + +typedef +EFI_STATUS +(EFIAPI *COMMON_PROC_ENTRY) ( + IN UINTN FunctionId, + IN UINTN Arg2, + IN UINTN Arg3, + IN UINTN Arg4, + IN UINTN Arg5, + IN UINTN Arg6, + IN UINTN Arg7, + IN UINTN Arg8 + ); + +typedef struct { + COMMON_PROC_ENTRY CommonProcEntry; +} COMMON_PROC_ENTRY_STRUCT; + +EFI_STATUS +InstallPlatformRuntimeLib ( + IN EFI_GUID *Guid, + IN COMMON_PROC_ENTRY_STRUCT *CommonEntry + ) +/*++ + +Routine Description: + + Install platform runtime lib. + +Arguments: + + Guid - Guid for runtime lib + CommonEntry - Common entry + +Returns: + + Status code + +--*/ +; + +EFI_STATUS +GetPlatformRuntimeLib ( + IN EFI_SYSTEM_TABLE *SystemTable + ) +/*++ + +Routine Description: + + Get platform runtime lib. + +Arguments: + + SystemTable - Pointer to system table + +Returns: + + Status code + +--*/ +; + +EFI_STATUS +ConvertPlatformRuntimeLibPtr ( + IN EFI_RUNTIME_SERVICES *mRT + ) +/*++ + +Routine Description: + + Convert platform runtime lib pointer. + +Arguments: + + mRT - Pointer to runtime service table. + +Returns: + + Status code + +--*/ +; + +#endif diff --git a/EDK/Foundation/Library/Dxe/Include/Ipf/CpuFuncs.h b/EDK/Foundation/Library/Dxe/Include/Ipf/CpuFuncs.h new file mode 100644 index 0000000..3818170 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/Include/Ipf/CpuFuncs.h @@ -0,0 +1,93 @@ +/*++ + +Copyright (c) 2004, 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: + + CpuFuncs.h + +Abstract: + +--*/ + +#ifndef _CPU_FUNCS_H +#define _CPU_FUNCS_H + +#define EFI_CPUID_SIGNATURE 0x0 +#define EFI_CPUID_VERSION_INFO 0x1 +#define EFI_CPUID_CACHE_INFO 0x2 +#define EFI_CPUID_SERIAL_NUMBER 0x3 +#define EFI_CPUID_EXTENDED_FUNCTION 0x80000000 +#define EFI_CPUID_EXTENDED_CPU_SIG 0x80000001 +#define EFI_CPUID_BRAND_STRING1 0x80000002 +#define EFI_CPUID_BRAND_STRING2 0x80000003 +#define EFI_CPUID_BRAND_STRING3 0x80000004 + +#define EFI_MSR_IA32_APIC_BASE 0x1B +#define EFI_MSR_EBC_HARD_POWERON 0x2A +#define EFI_MSR_EBC_SOFT_POWERON 0x2B +#define EFI_MSR_EBC_FREQUENCY_ID 0x2C +#define EFI_MSR_IA32_BIOS_UPDT_TRIG 0x79 +#define EFI_MSR_IA32_BIOS_SIGN_ID 0x8B +#define EFI_APIC_GLOBAL_ENABLE 0x800 + +#define EFI_CACHE_VARIABLE_MTRR_BASE 0x200 +#define EFI_CACHE_VARIABLE_MTRR_END 0x20F +#define EFI_CACHE_IA32_MTRR_DEF_TYPE 0x2FF +#define EFI_CACHE_VALID_ADDRESS 0xFFFFFF000 +#define EFI_CACHE_MTRR_VALID 0x800 +#define EFI_CACHE_FIXED_MTRR_VALID 0x400 +#define EFI_MSR_VALID_MASK 0xFFFFFFFFF + +#define EFI_IA32_MTRR_FIX64K_00000 0x250 +#define EFI_IA32_MTRR_FIX16K_80000 0x258 +#define EFI_IA32_MTRR_FIX16K_A0000 0x259 +#define EFI_IA32_MTRR_FIX4K_C0000 0x268 +#define EFI_IA32_MTRR_FIX4K_C8000 0x269 +#define EFI_IA32_MTRR_FIX4K_D0000 0x26A +#define EFI_IA32_MTRR_FIX4K_D8000 0x26B +#define EFI_IA32_MTRR_FIX4K_E0000 0x26C +#define EFI_IA32_MTRR_FIX4K_E8000 0x26D +#define EFI_IA32_MTRR_FIX4K_F0000 0x26E +#define EFI_IA32_MTRR_FIX4K_F8000 0x26F + +#define EFI_IA32_MCG_CAP 0x179 +#define EFI_IA32_MCG_CTL 0x17B +#define EFI_IA32_MC0_CTL 0x400 +#define EFI_IA32_MC0_STATUS 0x401 + +#define EFI_CACHE_UNCACHEABLE 0 +#define EFI_CACHE_WRITECOMBINING 1 +#define EFI_CACHE_WRITETHROUGH 4 +#define EFI_CACHE_WRITEPROTECTED 5 +#define EFI_CACHE_WRITEBACK 6 + +UINT64 +EfiReadTsc ( + VOID + ) +/*++ + +Routine Description: + + Read Time stamp. + +Arguments: + + None + +Returns: + + Return the read data + +--*/ +; + +#endif diff --git a/EDK/Foundation/Library/Dxe/Include/Ipf/EsalRuntimeLib.h b/EDK/Foundation/Library/Dxe/Include/Ipf/EsalRuntimeLib.h new file mode 100644 index 0000000..7f29acf --- /dev/null +++ b/EDK/Foundation/Library/Dxe/Include/Ipf/EsalRuntimeLib.h @@ -0,0 +1,1305 @@ +/*++ + +Copyright (c) 2004, 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: + + EsalRuntimeLib.h + +Abstract: + + SAL Driver Lib + +Revision History + +--*/ + +#ifndef _ESAL_RUNTIME_LIB_H_ +#define _ESAL_RUNTIME_LIB_H_ + +#include "SalApi.h" +#include "EfiFirmwareVolumeHeader.h" + +#include EFI_PROTOCOL_DEFINITION (ExtendedSalBootService) +#include EFI_PROTOCOL_DEFINITION (ExtendedSalGuid) +#include EFI_PROTOCOL_DEFINITION (FirmwareVolumeBlock) + +VOID +EsalRuntimeLibVirtualNotify ( + VOID + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + None + +Returns: + + TODO: add return values + +--*/ +; + +EFI_STATUS +EsalInitializeRuntimeDriverLib ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + ImageHandle - Image Handle + SystemTable - the System Table + +Returns: + + TODO: add return values + +--*/ +; +SAL_RETURN_REGS +CallEsalService ( + IN EFI_GUID *ClassGuid, + IN UINT64 FunctionId, + IN UINT64 Arg2, + IN UINT64 Arg3, + IN UINT64 Arg4, + IN UINT64 Arg5, + IN UINT64 Arg6, + IN UINT64 Arg7, + IN UINT64 Arg8 + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + ClassGuid - TODO: add argument description + FunctionId - TODO: add argument description + Arg2 - TODO: add argument description + Arg3 - TODO: add argument description + Arg4 - TODO: add argument description + Arg5 - TODO: add argument description + Arg6 - TODO: add argument description + Arg7 - TODO: add argument description + Arg8 - TODO: add argument description + +Returns: + + TODO: add return values + +--*/ +; + +// +// Assembly Functions +// + +SAL_RETURN_REGS +EsalGetEntryPoint ( + VOID + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + None + +Returns: + + TODO: add return values + +--*/ +; + +SAL_RETURN_REGS +EsalSetPhysicalEntryPoint ( + IN UINT64 EntryPoint, + IN UINT64 Gp + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + EntryPoint - TODO: add argument description + Gp - TODO: add argument description + +Returns: + + TODO: add return values + +--*/ +; + +SAL_RETURN_REGS +EsalSetVirtualEntryPoint ( + IN UINT64 EntryPoint, + IN UINT64 Gp + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + EntryPoint - TODO: add argument description + Gp - TODO: add argument description + +Returns: + + TODO: add return values + +--*/ +; + +SAL_RETURN_REGS +EsalSetPhysicalModuleGlobal ( + IN VOID *Global + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + Global - TODO: add argument description + +Returns: + + TODO: add return values + +--*/ +; + +SAL_RETURN_REGS +EsalSetVirtualModuleGlobal ( + IN VOID *Global + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + Global - TODO: add argument description + +Returns: + + TODO: add return values + +--*/ +; + +SAL_RETURN_REGS +EsalGetModuleGlobal ( + VOID + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + None + +Returns: + + TODO: add return values + +--*/ +; + +SAL_RETURN_REGS +GetIrrData ( + VOID + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + None + +Returns: + + TODO: add return values + +--*/ +; + +SAL_RETURN_REGS +GetPsrData ( + VOID + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + None + +Returns: + + TODO: add return values + +--*/ +; + +SAL_RETURN_REGS +GetProcIdData ( + VOID + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + None + +Returns: + + TODO: add return values + +--*/ +; + +VOID +SwitchCpuStack ( + IN UINT64 NewBsp, + IN UINT64 OldBsp + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + NewBsp - TODO: add argument description + OldBsp - TODO: add argument description + +Returns: + + TODO: add return values + +--*/ +; + +// +// PAL PROC Class +// + +SAL_RETURN_REGS +SalPalProc ( + IN UINT64 Arg1, + IN UINT64 Arg2, + IN UINT64 Arg3, + IN UINT64 Arg4 + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + Arg1 - TODO: add argument description + Arg2 - TODO: add argument description + Arg3 - TODO: add argument description + Arg4 - TODO: add argument description + +Returns: + + TODO: add return values + +--*/ +; + +SAL_RETURN_REGS +SalRegisterNewPalEntry ( + IN BOOLEAN PhysicalPalAddress, + IN EFI_PHYSICAL_ADDRESS NewPalAddress + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + PhysicalPalAddress - TODO: add argument description + NewPalAddress - TODO: add argument description + +Returns: + + TODO: add return values + +--*/ +; + +SAL_RETURN_REGS +SalGetPalEntryPointer ( + IN BOOLEAN PhysicalPalAddress + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + PhysicalPalAddress - TODO: add argument description + +Returns: + + TODO: add return values + +--*/ +; + +// +// SAL BASE Class +// + +SAL_RETURN_REGS +SalProcSetVectors ( + IN UINT64 SalVectorType, + IN UINT64 PhyAddr1, + IN UINT64 Gp1, + IN UINT64 LengthCs1, + IN UINT64 PhyAddr2, + IN UINT64 Gp2, + IN UINT64 LengthCs2 + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + SalVectorType - TODO: add argument description + PhyAddr1 - TODO: add argument description + Gp1 - TODO: add argument description + LengthCs1 - TODO: add argument description + PhyAddr2 - TODO: add argument description + Gp2 - TODO: add argument description + LengthCs2 - TODO: add argument description + +Returns: + + TODO: add return values + +--*/ +; + +SAL_RETURN_REGS +SalProcMcRendez ( + VOID + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + None + +Returns: + + TODO: add return values + +--*/ +; + +SAL_RETURN_REGS +SalProcMcSetParams ( + IN UINT64 ParamType, + IN UINT64 IntOrMem, + IN UINT64 IntOrMemVal, + IN UINT64 Timeout, + IN UINT64 McaOpt + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + ParamType - TODO: add argument description + IntOrMem - TODO: add argument description + IntOrMemVal - TODO: add argument description + Timeout - TODO: add argument description + McaOpt - TODO: add argument description + +Returns: + + TODO: add return values + +--*/ +; + +SAL_RETURN_REGS +EsalProcGetVectors ( + IN UINT64 VectorType + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + VectorType - TODO: add argument description + +Returns: + + TODO: add return values + +--*/ +; + +SAL_RETURN_REGS +EsalProcMcGetParams ( + IN UINT64 ParamInfoType + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + ParamInfoType - TODO: add argument description + +Returns: + + TODO: add return values + +--*/ +; + +SAL_RETURN_REGS +EsalProcMcGetMcParams ( + VOID + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + None + +Returns: + + TODO: add return values + +--*/ +; + +SAL_RETURN_REGS +EsalProcGetMcCheckinFlags ( + IN UINT64 ProcessorUnit + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + ProcessorUnit - TODO: add argument description + +Returns: + + TODO: add return values + +--*/ +; + +// +// Sal Base Class enums +// + +typedef enum { + McaVector, + BspInitVector, + BootRendezVector, + ApInitVector +} ESAL_GET_VECTOR_TYPE; + +SAL_RETURN_REGS +SalInitializeThreshold ( + IN VOID *ThresholdStruct, + IN UINT64 Count, + IN UINT64 Duration + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + ThresholdStruct - TODO: add argument description + Count - TODO: add argument description + Duration - TODO: add argument description + +Returns: + + TODO: add return values + +--*/ +; + +SAL_RETURN_REGS +SalBumpThresholdCount ( + IN VOID *ThresholdStruct, + IN UINT64 Count, + IN UINT64 Duration + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + ThresholdStruct - TODO: add argument description + Count - TODO: add argument description + Duration - TODO: add argument description + +Returns: + + TODO: add return values + +--*/ +; + +SAL_RETURN_REGS +SalGetThresholdCount ( + IN VOID *ThresholdStruct, + IN UINT64 Count, + IN UINT64 Duration + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + ThresholdStruct - TODO: add argument description + Count - TODO: add argument description + Duration - TODO: add argument description + +Returns: + + TODO: add return values + +--*/ +; + +// +// Common Lib Function +// + +EFI_STATUS +RegisterEsalFunction ( + IN UINT64 FunctionId, + IN EFI_GUID *ClassGuid, + IN SAL_INTERNAL_EXTENDED_SAL_PROC Function, + IN VOID *ModuleGlobal + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + FunctionId - TODO: add argument description + ClassGuid - TODO: add argument description + Function - TODO: add argument description + ModuleGlobal - TODO: add argument description + +Returns: + + TODO: add return values + +--*/ +; + +EFI_STATUS +RegisterEsalClass ( + IN EFI_GUID *ClassGuid, + IN VOID *ModuleGlobal, + ... + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + ClassGuid - TODO: add argument description + ModuleGlobal - TODO: add argument description + ... - TODO: add argument description + +Returns: + + TODO: add return values + +--*/ +; + +// +// MP Class Functions +// +SAL_RETURN_REGS +LibMpAddCpuData ( + IN UINT64 CpuGlobalId, + IN BOOLEAN Enabled, + IN UINT64 PalCompatability + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + CpuGlobalId - TODO: add argument description + Enabled - TODO: add argument description + PalCompatability - TODO: add argument description + +Returns: + + TODO: add return values + +--*/ +; + +SAL_RETURN_REGS +LibMpRemoveCpuData ( + IN UINT64 CpuGlobalId + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + CpuGlobalId - TODO: add argument description + +Returns: + + TODO: add return values + +--*/ +; + +SAL_RETURN_REGS +LibMpModifyCpuData ( + IN UINT64 CpuGlobalId, + IN BOOLEAN Enabled, + IN UINT64 PalCompatability + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + CpuGlobalId - TODO: add argument description + Enabled - TODO: add argument description + PalCompatability - TODO: add argument description + +Returns: + + TODO: add return values + +--*/ +; + +SAL_RETURN_REGS +LibMpGetCpuDataByID ( + IN UINT64 CpuGlobalId, + IN BOOLEAN IndexByEnabledCpu + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + CpuGlobalId - TODO: add argument description + IndexByEnabledCpu - TODO: add argument description + +Returns: + + TODO: add return values + +--*/ +; + +SAL_RETURN_REGS +LibMpGetCpuDataByIndex ( + IN UINT64 Index, + IN BOOLEAN IndexByEnabledCpu + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + Index - TODO: add argument description + IndexByEnabledCpu - TODO: add argument description + +Returns: + + TODO: add return values + +--*/ +; + +SAL_RETURN_REGS +LibMpSendIpi ( + IN UINT64 ProcessorNumber, + IN UINT64 VectorNumber, + IN EFI_DELIVERY_MODE DeliveryMode, + IN BOOLEAN IRFlag + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + ProcessorNumber - TODO: add argument description + VectorNumber - TODO: add argument description + DeliveryMode - TODO: add argument description + IRFlag - TODO: add argument description + +Returns: + + TODO: add return values + +--*/ +; + +SAL_RETURN_REGS +LibMpCurrentProcessor ( + IN BOOLEAN IndexByEnabledCpu + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + IndexByEnabledCpu - TODO: add argument description + +Returns: + + TODO: add return values + +--*/ +; + +SAL_RETURN_REGS +LibGetNumProcessors ( + VOID + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + None + +Returns: + + TODO: add return values + +--*/ +; + +SAL_RETURN_REGS +LibMpSaveMinStatePointer ( + IN UINT64 CpuGlobalId, + IN EFI_PHYSICAL_ADDRESS MinStatePointer + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + CpuGlobalId - TODO: add argument description + MinStatePointer - TODO: add argument description + +Returns: + + TODO: add return values + +--*/ +; + +SAL_RETURN_REGS +LibMpRestoreMinStatePointer ( + IN UINT64 CpuGlobalId + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + CpuGlobalId - TODO: add argument description + +Returns: + + TODO: add return values + +--*/ +; + +// +// MCA Class Functions +// + +EFI_STATUS +LibMcaGetStateInfo ( + IN UINT64 CpuId, + OUT EFI_PHYSICAL_ADDRESS *StateBufferPointer, + OUT UINT64 *RequiredStateBufferSize + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + CpuId - TODO: add argument description + StateBufferPointer - TODO: add argument description + RequiredStateBufferSize - TODO: add argument description + +Returns: + + TODO: add return values + +--*/ +; + +EFI_STATUS +LibMcaRegisterCpu ( + IN UINT64 CpuId, + IN EFI_PHYSICAL_ADDRESS StateBufferAddress + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + CpuId - TODO: add argument description + StateBufferAddress - TODO: add argument description + +Returns: + + TODO: add return values + +--*/ +; + +// +// FVB Variables Class +// +EFI_STATUS +EsalReadBlock ( + IN UINTN Instance, + IN EFI_LBA Lba, + IN UINTN Offset, + IN OUT UINTN *NumBytes, + IN UINT8 *Buffer + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + Instance - TODO: add argument description + Lba - TODO: add argument description + Offset - TODO: add argument description + NumBytes - TODO: add argument description + Buffer - TODO: add argument description + +Returns: + + TODO: add return values + +--*/ +; + +EFI_STATUS +EsalWriteBlock ( + IN UINTN Instance, + IN EFI_LBA Lba, + IN UINTN Offset, + IN OUT UINTN *NumBytes, + IN UINT8 *Buffer + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + Instance - TODO: add argument description + Lba - TODO: add argument description + Offset - TODO: add argument description + NumBytes - TODO: add argument description + Buffer - TODO: add argument description + +Returns: + + TODO: add return values + +--*/ +; + +EFI_STATUS +EsalEraseBlock ( + IN UINTN Instance, + IN UINTN Lba + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + Instance - TODO: add argument description + Lba - TODO: add argument description + +Returns: + + TODO: add return values + +--*/ +; + +EFI_STATUS +EsalGetVolumeAttributes ( + IN UINTN Instance, + OUT EFI_FVB_ATTRIBUTES *Attributes + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + Instance - TODO: add argument description + Attributes - TODO: add argument description + +Returns: + + TODO: add return values + +--*/ +; + +EFI_STATUS +EsalSetVolumeAttributes ( + IN UINTN Instance, + IN EFI_FVB_ATTRIBUTES Attributes + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + Instance - TODO: add argument description + Attributes - TODO: add argument description + +Returns: + + TODO: add return values + +--*/ +; + +EFI_STATUS +EsalGetPhysicalAddress ( + IN UINTN Instance, + OUT EFI_PHYSICAL_ADDRESS *Address + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + Instance - TODO: add argument description + Address - TODO: add argument description + +Returns: + + TODO: add return values + +--*/ +; + +EFI_STATUS +EsalGetBlockSize ( + IN UINTN Instance, + IN EFI_LBA Lba, + OUT UINTN *BlockSize, + OUT UINTN *NumOfBlocks + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + Instance - TODO: add argument description + Lba - TODO: add argument description + BlockSize - TODO: add argument description + NumOfBlocks - TODO: add argument description + +Returns: + + TODO: add return values + +--*/ +; + +// +// SAL ELOG Functions +// +EFI_STATUS +LibSalGetStateInfo ( + IN UINT64 McaType, + IN UINT8 *McaBuffer, + OUT UINTN *Size + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + McaType - TODO: add argument description + McaBuffer - TODO: add argument description + Size - TODO: add argument description + +Returns: + + TODO: add return values + +--*/ +; + +EFI_STATUS +LibSalGetStateInfoSize ( + IN UINT64 McaType, + OUT UINTN *Size + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + McaType - TODO: add argument description + Size - TODO: add argument description + +Returns: + + TODO: add return values + +--*/ +; + +EFI_STATUS +LibSalClearStateInfo ( + IN UINT64 McaType + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + McaType - TODO: add argument description + +Returns: + + TODO: add return values + +--*/ +; + +EFI_STATUS +LibEsalGetStateBuffer ( + IN UINT64 McaType, + OUT UINT8 **McaBuffer, + OUT UINTN *Index + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + McaType - TODO: add argument description + McaBuffer - TODO: add argument description + Index - TODO: add argument description + +Returns: + + TODO: add return values + +--*/ +; + +EFI_STATUS +LibEsalSaveStateBuffer ( + IN UINT64 McaType + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + McaType - TODO: add argument description + +Returns: + + TODO: add return values + +--*/ +; + +#endif diff --git a/EDK/Foundation/Library/Dxe/Include/Ipf/ProcDep.h b/EDK/Foundation/Library/Dxe/Include/Ipf/ProcDep.h new file mode 100644 index 0000000..2df940f --- /dev/null +++ b/EDK/Foundation/Library/Dxe/Include/Ipf/ProcDep.h @@ -0,0 +1,119 @@ +/*++ + +Copyright (c) 2004, 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: + + ProcDep.h + +Abstract: + + IPF specific Runtime Lib code. IPF has a SAL API that does not + exit on IA-32. Thus + +--*/ + +#ifndef _PROC_DEP_H_ +#define _PROC_DEP_H_ + +#include EFI_PROTOCOL_DEFINITION (ExtendedSalGuid) +#include EFI_PROTOCOL_DEFINITION (ExtendedSalBootService) +#include "SalApi.h" + +EFI_STATUS +RegisterEsalFunction ( + IN UINT64 FunctionId, + IN EFI_GUID *ClassGuid, + IN SAL_INTERNAL_EXTENDED_SAL_PROC Function, + IN VOID *ModuleGlobal + ) +/*++ + +Routine Description: + + Register ESAL Class Function and it's asociated global. + This function is boot service only! + +Arguments: + FunctionId - ID of function to register + ClassGuid - GUID of function class + Function - Function to register under ClassGuid/FunctionId pair + ModuleGlobal - Module global for Function. + +Returns: + EFI_SUCCESS - If ClassGuid/FunctionId Function was registered. + +--*/ +; + +EFI_STATUS +RegisterEsalClass ( + IN EFI_GUID *ClassGuid, + IN VOID *ModuleGlobal, + ... + ) +/*++ + +Routine Description: + + Register ESAL Class and it's asociated global. + This function is boot service only! + +Arguments: + ClassGuid - GUID of function class + ModuleGlobal - Module global for Function. + .. - SAL_INTERNAL_EXTENDED_SAL_PROC and FunctionId pairs. NULL + indicates the end of the list. + +Returns: + EFI_SUCCESS - All members of ClassGuid registered + +--*/ +; + +SAL_RETURN_REGS +EfiCallEsalService ( + IN EFI_GUID *ClassGuid, + IN UINT64 FunctionId, + IN UINT64 Arg2, + IN UINT64 Arg3, + IN UINT64 Arg4, + IN UINT64 Arg5, + IN UINT64 Arg6, + IN UINT64 Arg7, + IN UINT64 Arg8 + ) +/*++ + +Routine Description: + + Call module that is not linked direclty to this module. This code is IP + relative and hides the binding issues of virtual or physical calling. The + function that gets dispatched has extra arguments that include the registered + module global and a boolean flag to indicate if the system is in virutal mode. + +Arguments: + ClassGuid - GUID of function + FunctionId - Function in ClassGuid to call + Arg2 - Argument 2 ClassGuid/FunctionId defined + Arg3 - Argument 3 ClassGuid/FunctionId defined + Arg4 - Argument 4 ClassGuid/FunctionId defined + Arg5 - Argument 5 ClassGuid/FunctionId defined + Arg6 - Argument 6 ClassGuid/FunctionId defined + Arg7 - Argument 7 ClassGuid/FunctionId defined + Arg8 - Argument 8 ClassGuid/FunctionId defined + +Returns: + Status of ClassGuid/FuncitonId + +--*/ +; + +#endif diff --git a/EDK/Foundation/Library/Dxe/Include/Ipf/SalDriverLib.h b/EDK/Foundation/Library/Dxe/Include/Ipf/SalDriverLib.h new file mode 100644 index 0000000..c294706 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/Include/Ipf/SalDriverLib.h @@ -0,0 +1,1454 @@ +/*++ + +Copyright (c) 2004, 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: + + SalDriverLib.h + +Abstract: + + SAL Driver Lib + +Revision History + +--*/ + +#ifndef _SAL_DRIVER_LIB_H_ +#define _SAL_DRIVER_LIB_H_ + +#include "Tiano.h" +#include "EfiDriverLib.h" +#include "SalApi.h" + +#include EFI_PROTOCOL_DEFINITION (ExtendedSalBootService) +#include EFI_PROTOCOL_DEFINITION (ExtendedSalGuid) + +// +// Assembly Functions +// +SAL_RETURN_REGS +LibGetEsalPhyData ( + VOID + ) +/*++ + +Routine Description: + + Get Esal global data in physical mode. + +Arguments: + + None + +Returns: + + Output regs + +--*/ +; + +SAL_RETURN_REGS +LibGetEsalVirtData ( + VOID + ) +/*++ + +Routine Description: + + Get Esal global data in virtual mode. + +Arguments: + + None + +Returns: + + Output regs + +--*/ +; + +SAL_RETURN_REGS +LibSetEsalPhyData ( + IN VOID *Ptr, + IN UINT64 GP + ) +/*++ + +Routine Description: + + Set Esal global data in physical mode. + +Arguments: + + Ptr - Pointer to the data + GP - Global pointer + +Returns: + + Output regs + +--*/ +; + +SAL_RETURN_REGS +LibSetEsalVirtData ( + IN VOID *Ptr, + IN UINT64 GP + ) +/*++ + +Routine Description: + + Set Esal global data in virtual mode. + +Arguments: + + Ptr - Pointer to the data + GP - Global pointer + +Returns: + + Output regs + +--*/ +; + +SAL_RETURN_REGS +LibGetGlobalPhyData ( + VOID + ) +/*++ + +Routine Description: + + Get Esal global data in physical mode. + +Arguments: + + None + +Returns: + + Output regs + +--*/ +; + +SAL_RETURN_REGS +LibGetGlobalVirtData ( + VOID + ) +/*++ + +Routine Description: + + Get Esal global data in virtual mode. + +Arguments: + + None + +Returns: + + Output regs + +--*/ +; + +SAL_RETURN_REGS +LibSetGlobalPhyData ( + IN VOID *Ptr, + IN UINT64 GP + ) +/*++ + +Routine Description: + + Set Esal global data in physical mode. + +Arguments: + + Ptr - Pointer to the data + GP - Global pointer + +Returns: + + Output regs + +--*/ +; + +SAL_RETURN_REGS +LibSetGlobalVirtData ( + IN VOID *Ptr, + IN UINT64 GP + ) +/*++ + +Routine Description: + + Set Esal global data in virtual mode. + +Arguments: + + Ptr - Pointer to the data + GP - Global pointer + +Returns: + + Output regs + +--*/ +; + +SAL_RETURN_REGS +GetIrrData ( + VOID + ) +/*++ + +Routine Description: + + Get interrupt request register. + +Arguments: + + None + +Returns: + + Output regs + +--*/ +; + +VOID +PrepareApsForHandOverToOS ( + VOID + ) +/*++ + +Routine Description: + + Prepare AP info for hand over to OS. + +Arguments: + + None + +Returns: + + None + +--*/ +; + +VOID +HandOverApsToOS ( + IN UINT64 a1, + IN UINT64 a2, + IN UINT64 a3 + ) +/*++ + +Routine Description: + + Hand over AP info to OS. + +Arguments: + + a1 - Address to call into + + a2 - GP + + a3 - Undefined + +Returns: + + None + +--*/ +; + +SAL_RETURN_REGS +GetPsrData ( + VOID + ) +/*++ + +Routine Description: + + Get PSR register. + +Arguments: + + None + +Returns: + + Output regs. + +--*/ +; + +SAL_RETURN_REGS +GetProcIdData ( + VOID + ) +/*++ + +Routine Description: + + Get LID + +Arguments: + + None + +Returns: + + Output regs + +--*/ +; + +VOID +SwitchCpuStack ( + IN UINT64 NewBsp, + IN UINT64 OldBsp + ) +/*++ + +Routine Description: + + Switch BSP + +Arguments: + + NewBsp - New BSP index + OldBsp - Old BSP index + +Returns: + + None + +--*/ +; + +// +// SAL Reset Class +// +VOID +SalResetSystem ( + IN EFI_RESET_TYPE ResetType, + IN EFI_STATUS ResetStatus, + IN UINTN DataSize, + IN CHAR16 *ResetData + ) +/*++ + +Routine Description: + + Reset system + +Arguments: + + ResetType - Reset type + ResetStatus - Reset status + DataSize - Size of ResetData + ResetData - Description string + +Returns: + + None + +--*/ +; + +// +// PAL PROC Class +// +SAL_RETURN_REGS +SalPalProc ( + IN UINT64 Arg1, + IN UINT64 Arg2, + IN UINT64 Arg3, + IN UINT64 Arg4 + ) +/*++ + +Routine Description: + + Call pal proc. + +Arguments: + + Arg1 - Pal call index + Arg2 - First arg + Arg3 - Second arg + Arg4 - Third arg + +Returns: + + Output regs + +--*/ +; + +SAL_RETURN_REGS +SalRegisterNewPalEntry ( + IN BOOLEAN PhysicalPalAddress, + IN EFI_PHYSICAL_ADDRESS NewPalAddress + ) +/*++ + +Routine Description: + + Register Pal entry. + +Arguments: + + PhysicalPalAddress - The address is physical or virtual + NewPalAddress - New Pal entry address + +Returns: + + Output regs + +--*/ +; + +SAL_RETURN_REGS +SalGetPalEntryPointer ( + IN BOOLEAN PhysicalPalAddress + ) +/*++ + +Routine Description: + + Get Pal entry. + +Arguments: + + PhysicalPalAddress - The address is physical or virtual + +Returns: + + Output regs + +--*/ +; + +// +// SAL MTC Class +// +EFI_STATUS +SalGetNextHighMonotonicCount ( + OUT UINT32 *HighCount + ) +/*++ + +Routine Description: + + Get next high 32 bits of monotonic count. + +Arguments: + + HighCount - High 32 bits of monotonic count. + +Returns: + + Status code + +--*/ +; + +// +// SAL BASE Class +// +SAL_RETURN_REGS +SalProcSetVectors ( + IN UINT64 SalVectorType, + IN UINT64 PhyAddr1, + IN UINT64 Gp1, + IN UINT64 LengthCs1, + IN UINT64 PhyAddr2, + IN UINT64 Gp2, + IN UINT64 LengthCs2 + ) +/*++ + +Routine Description: + + Set vectors. + +Arguments: + + SalVectorType - Vector type + PhyAddr1 - OS MCA entry point + Gp1 - GP for OS MCA entry + LengthCs1 - Length of OS MCA + PhyAddr2 - OS INIT entry point + Gp2 - GP for OS Init entry + LengthCs2 - Length of OS INIT + +Returns: + + Output regs + +--*/ +; + +SAL_RETURN_REGS +SalProcMcRendez ( + VOID + ) +/*++ + +Routine Description: + + Mc rendezvous function. + +Arguments: + + None + +Returns: + + Output regs + +--*/ +; + +SAL_RETURN_REGS +SalProcMcSetParams ( + IN UINT64 ParamType, + IN UINT64 IntOrMem, + IN UINT64 IntOrMemVal, + IN UINT64 Timeout, + IN UINT64 McaOpt + ) +/*++ + +Routine Description: + + Set MCA parameters. + +Arguments: + + ParamType - Parameter type + IntOrMem - Interrupt or memory address + IntOrMemVal - Interrupt number or memory address value + Timeout - Time out value + McaOpt - Option for MCA + +Returns: + + Output regs + +--*/ +; + +SAL_RETURN_REGS +EsalProcGetVectors ( + IN UINT64 VectorType + ) +/*++ + +Routine Description: + + Get OS MCA vector. + +Arguments: + + VectorType - Vector type + +Returns: + + Output regs + +--*/ +; + +SAL_RETURN_REGS +EsalProcMcGetParams ( + IN UINT64 ParamInfoType + ) +/*++ + +Routine Description: + + Get MCA parameter. + +Arguments: + + ParamInfoType - Parameter info type + +Returns: + + Output regs + +--*/ +; + +SAL_RETURN_REGS +EsalProcMcGetMcParams ( + VOID + ) +/*++ + +Routine Description: + + Get MCA parameter. + +Arguments: + + +Returns: + + Output regs + +--*/ +; + +SAL_RETURN_REGS +EsalProcGetMcCheckinFlags ( + IN UINT64 ProcessorUnit + ) +/*++ + +Routine Description: + + Get process status. + +Arguments: + + ProcessorUnit - Processor Index + +Returns: + + Output regs + +--*/ +; + +// +// Sal Base Class enums +// +typedef enum { + McaVector, + BspInitVector, + BootRendezVector, + ApInitVector +} ESAL_GET_VECTOR_TYPE; + +// +// Sal RTC Class +// +EFI_STATUS +SalGetTime ( + OUT EFI_TIME *Time, + OUT EFI_TIME_CAPABILITIES *Capabilities + ) +/*++ + +Routine Description: + + Returns the current time and date information, and the time-keeping + capabilities of the hardware platform. + +Arguments: + + Time - A pointer to storage to receive a snapshot of the current time. + Capabilities - An optional pointer to a buffer to receive the real time clock device¡¯s + capabilities. + +Returns: + + Status code + +--*/ +; + +EFI_STATUS +SalSetTime ( + OUT EFI_TIME *Time + ) +/*++ + +Routine Description: + + Sets the current local time and date information. + +Arguments: + + Time - A pointer to the current time. + +Returns: + + Status code + +--*/ +; + +EFI_STATUS +SalGetWakeupTime ( + OUT BOOLEAN *Enabled, + OUT BOOLEAN *Pending, + OUT EFI_TIME *Time + ) +/*++ + +Routine Description: + + Returns the current wakeup alarm clock setting. + +Arguments: + + Enabled - Indicates if the alarm is currently enabled or disabled. + Pending - Indicates if the alarm signal is pending and requires acknowledgement. + Time - The current alarm setting. + +Returns: + + Status code + +--*/ +; + +EFI_STATUS +SalSetWakeupTime ( + IN BOOLEAN Enable, + IN EFI_TIME *Time + ) +/*++ + +Routine Description: + + Sets the system wakeup alarm clock time. + +Arguments: + + Enable - Enable or disable the wakeup alarm. + Time - If Enable is TRUE, the time to set the wakeup alarm for. + If Enable is FALSE, then this parameter is optional, and may be NULL. + +Returns: + + Status code + +--*/ +; + +SAL_RETURN_REGS +SalInitializeThreshold ( + IN VOID *ThresholdStruct, + IN UINT64 Count, + IN UINT64 Duration + ) +/*++ + +Routine Description: + + Init threshold structure. + +Arguments: + + ThresholdStruct - Threshold structure + Count - Threshold count + Duration - Duration + +Returns: + + Output regs + +--*/ +; + +SAL_RETURN_REGS +SalBumpThresholdCount ( + IN VOID *ThresholdStruct, + IN UINT64 Count, + IN UINT64 Duration + ) +/*++ + +Routine Description: + + Bump threshold count. + +Arguments: + + ThresholdStruct - Threshold structure + Count - Threshold count + Duration - Duration + +Returns: + + Output regs + +--*/ +; + +SAL_RETURN_REGS +SalGetThresholdCount ( + IN VOID *ThresholdStruct, + IN UINT64 Count, + IN UINT64 Duration + ) +/*++ + +Routine Description: + + Get threshold structure. + +Arguments: + + ThresholdStruct - Threshold structure + Count - Threshold count + Duration - Duration + +Returns: + + Output regs + +--*/ +; + +// +// Common Lib Function +// +EFI_STATUS +RegisterEsalFunction ( + IN UINT64 FunctionId, + IN EFI_GUID *ClassGuid, + IN SAL_INTERNAL_EXTENDED_SAL_PROC Function, + IN VOID *ModuleGlobal + ) +/*++ + +Routine Description: + + Register ESAL Class Function and it's asociated global. + This function is boot service only! + +Arguments: + FunctionId - ID of function to register + ClassGuid - GUID of function class + Function - Function to register under ClassGuid/FunctionId pair + ModuleGlobal - Module global for Function. + +Returns: + EFI_SUCCESS - If ClassGuid/FunctionId Function was registered. + +--*/ +; + +EFI_STATUS +EfiInitializeSalDriverLib ( + IN BOOLEAN Runtime + ) +/*++ + +Routine Description: + + Initialize Sal driver lib. + +Arguments: + Runtime - At runtime or not? + +Returns: + Status code + +--*/ +; + +// +// MCA PMI INIT Registeration Functions. +// +EFI_STATUS +LibRegisterMcaFunction ( + IN EFI_SAL_MCA_HANDLER McaHandler, + IN VOID *ModuleGlobal, + IN BOOLEAN MakeFirst, + IN BOOLEAN MakeLast + ) +/*++ + +Routine Description: + + Register MCA handler. + +Arguments: + McaHandler - MCA handler + ModuleGlobal - Module global for function + MakeFirst - Make it as first? + MakeLast - Make it as last? + +Returns: + Status code + +--*/ +; + +EFI_STATUS +LibRegisterPmiFunction ( + IN EFI_SAL_PMI_HANDLER PmiHandler, + IN VOID *ModuleGlobal, + IN BOOLEAN MakeFirst, + IN BOOLEAN MakeLast + ) +/*++ + +Routine Description: + + Register PMI handler. + +Arguments: + PmiHandler - PMI handler + ModuleGlobal - Module global for function + MakeFirst - Make it as first? + MakeLast - Make it as last? + +Returns: + Status code + +--*/ +; + +EFI_STATUS +LibRegisterInitFunction ( + IN EFI_SAL_INIT_HANDLER InitHandler, + IN VOID *ModuleGlobal, + IN BOOLEAN MakeFirst, + IN BOOLEAN MakeLast + ) +/*++ + +Routine Description: + + Register INIT handler. + +Arguments: + InitHandler - INIT handler + ModuleGlobal - Module global for function + MakeFirst - Make it as first? + MakeLast - Make it as last? + +Returns: + Status code + +--*/ +; + +// +// Base IO Class Functions +// +EFI_STATUS +ESalIoRead ( + IN EFI_CPU_IO_PROTOCOL_WIDTH Width, + IN UINT64 Address, + IN UINTN Count, + IN OUT VOID *Buffer + ) +/*++ + +Routine Description: + + Io read operation. + +Arguments: + + Width - Width of read operation + Address - Start IO address to read + Count - Read count + Buffer - Buffer to store result + +Returns: + + Status code + +--*/ +; + +EFI_STATUS +ESalIoWrite ( + IN EFI_CPU_IO_PROTOCOL_WIDTH Width, + IN UINT64 Address, + IN UINTN Count, + IN OUT VOID *Buffer + ) +/*++ + +Routine Description: + + Io write operation. + +Arguments: + + Width - Width of write operation + Address - Start IO address to write + Count - Write count + Buffer - Buffer to write to the address + +Returns: + + Status code + +--*/ +; + +EFI_STATUS +ESalMemRead ( + IN EFI_CPU_IO_PROTOCOL_WIDTH Width, + IN UINT64 Address, + IN UINTN Count, + IN OUT VOID *Buffer + ) +/*++ + +Routine Description: + Perform a Memory mapped IO read into Buffer. + +Arguments: + Width - Width of each read transaction. + Address - Memory mapped IO address to read + Count - Number of Width quanta to read + Buffer - Buffer to read data into. size is Width * Count + +Returns: + Status code + +--*/ +; + +EFI_STATUS +ESalMemWrite ( + IN EFI_CPU_IO_PROTOCOL_WIDTH Width, + IN UINT64 Address, + IN UINTN Count, + IN OUT VOID *Buffer + ) +/*++ + +Routine Description: + Perform a memory mapped IO write into Buffer. + +Arguments: + Width - Width of write transaction, and repeat operation to use + Address - IO address to write + Count - Number of times to write the IO address. + Buffer - Buffer to write data from. size is Width * Count + +Returns: + Status code + +--*/ +; + +// +// PCI Class Functions +// +SAL_RETURN_REGS +SalPCIConfigRead ( + IN UINT64 Address, + IN UINT64 Size + ) +/*++ + +Routine Description: + Pci config space read. + +Arguments: + Address - PCI address to read + Size - Size to read + +Returns: + Output regs + +--*/ +; + +SAL_RETURN_REGS +SalPCIConfigWrite ( + IN UINT64 Address, + IN UINT64 Size, + IN UINT64 Value + ) +/*++ + +Routine Description: + Pci config space write. + +Arguments: + Address - PCI address to write + Size - Size to write + Value - Value to write + +Returns: + Output regs + +--*/ +; + +// +// MP Class Functions +// +SAL_RETURN_REGS +LibMPAddCpuData ( + IN UINT64 CpuGlobalId, + IN BOOLEAN Enabled, + IN UINT64 PalCompatability + ) +/*++ + +Routine Description: + Add CPU data. + +Arguments: + CpuGlobalId - CPU ID + Enabled - Enabled or not + PalCompatability - Pal compatability + +Returns: + Output regs + +--*/ +; + +SAL_RETURN_REGS +LibMPRemoveCpuData ( + IN UINT64 CpuGlobalId + ) +/*++ + +Routine Description: + Remove CPU data. + +Arguments: + CpuGlobalId - CPU ID + +Returns: + Output regs + +--*/ +; + +SAL_RETURN_REGS +LibMPModifyCpuData ( + IN UINT64 CpuGlobalId, + IN BOOLEAN Enabled, + IN UINT64 PalCompatability + ) +/*++ + +Routine Description: + Modify CPU data. + +Arguments: + CpuGlobalId - CPU ID + Enabled - Enabled or not + PalCompatability - Pal compatability + +Returns: + Output regs + +--*/ +; + +SAL_RETURN_REGS +LibMPGetCpuDataByID ( + IN UINT64 CpuGlobalId, + IN BOOLEAN IndexByEnabledCpu + ) +/*++ + +Routine Description: + Get CPU data. + +Arguments: + CpuGlobalId - CPU ID + IndexByEnabledCpu - Whether indexed by enabled CPU + +Returns: + Output regs + +--*/ +; + +SAL_RETURN_REGS +LibMPGetCpuDataByIndex ( + IN UINT64 Index, + IN BOOLEAN IndexByEnabledCpu + ) +/*++ + +Routine Description: + Get CPU data. + +Arguments: + Index - CPU index + IndexByEnabledCpu - Whether indexed by enabled CPU + +Returns: + Output regs + +--*/ +; + +SAL_RETURN_REGS +LibMPSendIpi ( + IN UINT64 ProcessorNumber, + IN UINT64 VectorNumber, + IN EFI_DELIVERY_MODE DeliveryMode, + IN BOOLEAN IRFlag + ) +/*++ + +Routine Description: + Send IPI. + +Arguments: + ProcessorNumber - Processor number + VectorNumber - Vector number + DeliveryMode - Delivery mode + IRFlag - Interrupt Redirection flag + +Returns: + Output regs + +--*/ +; + +SAL_RETURN_REGS +LibMpCurrentProcessor ( + IN BOOLEAN IndexByEnabledCpu + ) +/*++ + +Routine Description: + Get current processor index. + +Arguments: + IndexByEnabledCpu - Whether indexed by enabled CPU + +Returns: + Output regs + +--*/ +; + +SAL_RETURN_REGS +LibGetNumProcessors ( + VOID + ) +/*++ + +Routine Description: + Get number of processors. + +Arguments: + None + +Returns: + Output regs + +--*/ +; + +SAL_RETURN_REGS +LibMpSaveMinStatePointer ( + IN UINT64 CpuGlobalId, + IN EFI_PHYSICAL_ADDRESS MinStatePointer + ) +/*++ + +Routine Description: + Register pointer to save min state. + +Arguments: + CpuGlobalId - CPU global ID + MinStatePointer - Pointer to save min state + +Returns: + Output regs + +--*/ +; + +SAL_RETURN_REGS +LibMpRestoreMinStatePointer ( + IN UINT64 CpuGlobalId + ) +/*++ + +Routine Description: + Restore pointer to save min state. + +Arguments: + CpuGlobalId - CPU global ID + +Returns: + Output regs + +--*/ +; + +// +// MCA Class Functions +// +EFI_STATUS +LibMcaGetStateInfo ( + IN UINT64 CpuId, + OUT EFI_PHYSICAL_ADDRESS *StateBufferPointer, + OUT UINT64 *RequiredStateBufferSize + ) +/*++ + +Routine Description: + MCA get state info. + +Arguments: + CpuId - CPU ID + StateBufferPointer - Pointer of state buffer + RequiredStateBufferSize - Size of required state buffer + +Returns: + Status code + +--*/ +; + +EFI_STATUS +LibMcaRegisterCpu ( + IN UINT64 CpuId, + IN EFI_PHYSICAL_ADDRESS StateBufferAddress + ) +/*++ + +Routine Description: + MCA register CPU state info. + +Arguments: + CpuId - CPU ID + StateBufferAddress - Pointer of state buffer + +Returns: + Status code + +--*/ +; + +// +// SAL ELOG Functions +// +EFI_STATUS +LibSalGetStateInfo ( + IN UINT64 McaType, + IN UINT8 *McaBuffer, + OUT UINTN *Size + ) +/*++ + +Routine Description: + Get state info. + +Arguments: + McaType - MCA type + McaBuffer - Info buffer provided by caller + Size - Size of info + +Returns: + Status code + +--*/ +; + +EFI_STATUS +LibSalGetStateInfoSize ( + IN UINT64 McaType, + OUT UINTN *Size + ) +/*++ + +Routine Description: + Get state info size. + +Arguments: + McaType - MCA type + Size - Size required + +Returns: + Status code + +--*/ +; + +EFI_STATUS +LibSalClearStateInfo ( + IN UINT64 McaType + ) +/*++ + +Routine Description: + Clear state info. + +Arguments: + McaType - MCA type + +Returns: + Status code + +--*/ +; + +EFI_STATUS +LibEsalGetStateBuffer ( + IN UINT64 McaType, + OUT UINT8 **McaBuffer, + OUT UINTN *Index + ) +/*++ + +Routine Description: + Get state buffer. + +Arguments: + McaType - MCA type + McaBuffer - MCA buffer + Index - CPU index + +Returns: + Status code + +--*/ +; + +EFI_STATUS +LibEsalSaveStateBuffer ( + IN UINT64 McaType + ) +/*++ + +Routine Description: + Save state buffer. + +Arguments: + McaType - MCA type + +Returns: + Status code + +--*/ +; + +#endif diff --git a/EDK/Foundation/Library/Dxe/Include/LinkedList.h b/EDK/Foundation/Library/Dxe/Include/LinkedList.h new file mode 100644 index 0000000..4e1d140 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/Include/LinkedList.h @@ -0,0 +1,310 @@ +/*++ + +Copyright (c) 2004, 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: + + LinkedList.h + +Abstract: + + This implementation of a linked list provides data structures for the + list itself and for list nodes. It provides operations for initializing + the list, modifying the list, and walking the list. + +--*/ + +// +// Prevent multiple includes in the same source file +// +#ifndef _LINKED_LIST_H_ +#define _LINKED_LIST_H_ + + +typedef struct _EFI_LIST_ENTRY { + struct _EFI_LIST_ENTRY *ForwardLink; + struct _EFI_LIST_ENTRY *BackLink; +} EFI_LIST_ENTRY; + +typedef EFI_LIST_ENTRY EFI_LIST; +typedef EFI_LIST_ENTRY EFI_LIST_NODE; + +#define INITIALIZE_LIST_HEAD_VARIABLE(ListHead) {&ListHead, &ListHead} + +// +// EFI_FIELD_OFFSET - returns the byte offset to a field within a structure +// + +#define EFI_FIELD_OFFSET(TYPE,Field) ((UINTN)(&(((TYPE *) 0)->Field))) + +// +// A lock structure +// + +typedef struct { + EFI_TPL Tpl; + EFI_TPL OwnerTpl; + UINTN Lock; +} FLOCK; + +VOID +InitializeListHead ( + EFI_LIST_ENTRY *List + ) +/*++ + +Routine Description: + + Initialize the head of the List. The caller must allocate the memory + for the EFI_LIST. This function must be called before the other linked + list macros can be used. + +Arguments: + + List - Pointer to list head to initialize + +Returns: + + None. + +--*/ +; + +BOOLEAN +IsListEmpty ( + EFI_LIST_ENTRY *List + ) +/*++ + +Routine Description: + + Return TRUE is the list contains zero nodes. Otherzise return FALSE. + The list must have been initialized with InitializeListHead () before using + this function. + +Arguments: + + List - Pointer to list head to test + + +Returns: + + Return TRUE is the list contains zero nodes. Otherzise return FALSE. + +--*/ +; + +VOID +RemoveEntryList ( + EFI_LIST_ENTRY *Entry + ) +/*++ + +Routine Description: + + Remove Node from the doubly linked list. It is the caller's responsibility + to free any memory used by the entry if needed. The list must have been + initialized with InitializeListHead () before using this function. + +Arguments: + + Entry - Element to remove from the list. + +Returns: + + None + +--*/ +; + +VOID +InsertTailList ( + EFI_LIST_ENTRY *ListHead, + EFI_LIST_ENTRY *Entry + ) +/*++ + +Routine Description: + + Insert a Node into the end of a doubly linked list. The list must have + been initialized with InitializeListHead () before using this function. + +Arguments: + + ListHead - Head of doubly linked list + + Entry - Element to insert at the end of the list. + +Returns: + + None + +--*/ +; + +VOID +InsertHeadList ( + EFI_LIST_ENTRY *ListHead, + EFI_LIST_ENTRY *Entry + ) +/*++ + +Routine Description: + + Insert a Node into the start of a doubly linked list. The list must have + been initialized with InitializeListHead () before using this function. + +Arguments: + + ListHead - Head of doubly linked list + + Entry - Element to insert to beginning of list + +Returns: + + None + +--*/ +; + +VOID +SwapListEntries ( + EFI_LIST_ENTRY *Entry1, + EFI_LIST_ENTRY *Entry2 + ) +/*++ + +Routine Description: + + Swap the location of the two elements of a doubly linked list. Node2 + is placed in front of Node1. The list must have been initialized with + InitializeListHead () before using this function. + +Arguments: + + Entry1 - Element in the doubly linked list in front of Node2. + + Entry2 - Element in the doubly linked list behind Node1. + +Returns: + + None + +--*/ +; + +EFI_LIST_ENTRY * +GetFirstNode ( + EFI_LIST_ENTRY *List + ) +/*++ + +Routine Description: + + Return the first node pointed to by the list head. The list must + have been initialized with InitializeListHead () before using this + function and must contain data. + +Arguments: + + List - The head of the doubly linked list. + +Returns: + + Pointer to the first node, if the list contains nodes. The list will + return a null value--that is, the value of List--when the list is empty. + See the description of IsNull for more information. + + +--*/ +; + +EFI_LIST_ENTRY * +GetNextNode ( + EFI_LIST_ENTRY *List, + EFI_LIST_ENTRY *Node + ) +/*++ + +Routine Description: + + Returns the node following Node in the list. The list must + have been initialized with InitializeListHead () before using this + function and must contain data. + +Arguments: + + List - The head of the list. MUST NOT be the literal value NULL. + Node - The node in the list. This value MUST NOT be the literal value NULL. + See the description of IsNull for more information. + +Returns: + + Pointer to the next node, if one exists. Otherwise, returns a null value, + which is actually a pointer to List. + See the description of IsNull for more information. + +--*/ +; + +BOOLEAN +IsNull ( + EFI_LIST_ENTRY *List, + EFI_LIST_ENTRY *Node + ) +/*++ + +Routine Description: + + Determines whether the given node is null. Note that Node is null + when its value is equal to the value of List. It is an error for + Node to be the literal value NULL [(VOID*)0x0]. + +Arguments: + + List - The head of the list. MUST NOT be the literal value NULL. + Node - The node to test. MUST NOT be the literal value NULL. See + the description above. + +Returns: + + Returns true if the node is null. + +--*/ +; + +BOOLEAN +IsNodeAtEnd ( + EFI_LIST_ENTRY *List, + EFI_LIST_ENTRY *Node + ) +/*++ + +Routine Description: + + Determines whether the given node is at the end of the list. Used + to walk the list. The list must have been initialized with + InitializeListHead () before using this function and must contain + data. + +Arguments: + + List - The head of the list. MUST NOT be the literal value NULL. + Node - The node to test. MUST NOT be the literal value NULL. + See the description of IsNull for more information. + +Returns: + + Returns true if the list is the tail. + +--*/ +; + +#endif diff --git a/EDK/Foundation/Library/Dxe/Include/RtDevicePath.h b/EDK/Foundation/Library/Dxe/Include/RtDevicePath.h new file mode 100644 index 0000000..765b575 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/Include/RtDevicePath.h @@ -0,0 +1,231 @@ +/*++ + +Copyright (c) 2006, 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: + + RtDevicePath.h + +Abstract: + + Device Path services. The thing to remember is device paths are built out of + nodes. The device path is terminated by an end node that is length + sizeof(EFI_DEVICE_PATH_PROTOCOL). That would be why there is sizeof(EFI_DEVICE_PATH_PROTOCOL) + all over this file. + + The only place where multi-instance device paths are supported is in + environment varibles. Multi-instance device paths should never be placed + on a Handle. + +--*/ +#ifndef _RT_DEVICE_PATH_H_ +#define _RT_DEVICE_PATH_H_ + +BOOLEAN +RtEfiIsDevicePathMultiInstance ( + IN EFI_DEVICE_PATH_PROTOCOL *DevicePath + ) +/*++ + +Routine Description: + Return TRUE is this is a multi instance device path. + +Arguments: + DevicePath - A pointer to a device path data structure. + + +Returns: + TRUE - If DevicePath is multi instance. + FALSE - If DevicePath is not multi instance. + +--*/ +; + +EFI_DEVICE_PATH_PROTOCOL * +RtEfiDevicePathInstance ( + IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath, + OUT UINTN *Size + ) +/*++ + +Routine Description: + Function retrieves the next device path instance from a device path data structure. + +Arguments: + DevicePath - A pointer to a device path data structure. + + Size - A pointer to the size of a device path instance in bytes. + +Returns: + + This function returns a pointer to the current device path instance. + In addition, it returns the size in bytes of the current device path instance in Size, + and a pointer to the next device path instance in DevicePath. + If there are no more device path instances in DevicePath, then DevicePath will be set to NULL. + +--*/ +; + +UINTN +RtEfiDevicePathSize ( + IN EFI_DEVICE_PATH_PROTOCOL *DevPath + ) +/*++ + +Routine Description: + + Calculate the size of a whole device path. + +Arguments: + + DevPath - The pointer to the device path data. + +Returns: + + Size of device path data structure.. + +--*/ +; + +EFI_DEVICE_PATH_PROTOCOL * +RtEfiAppendDevicePath ( + IN EFI_DEVICE_PATH_PROTOCOL *Src1, + IN EFI_DEVICE_PATH_PROTOCOL *Src2 + ) +/*++ + +Routine Description: + Function is used to append a Src1 and Src2 together. + +Arguments: + Src1 - A pointer to a device path data structure. + + Src2 - A pointer to a device path data structure. + +Returns: + + A pointer to the new device path is returned. + NULL is returned if space for the new device path could not be allocated from pool. + It is up to the caller to free the memory used by Src1 and Src2 if they are no longer needed. + +--*/ +; + +EFI_DEVICE_PATH_PROTOCOL * +RtEfiDevicePathFromHandle ( + IN EFI_HANDLE Handle + ) +/*++ + +Routine Description: + + Locate device path protocol interface on a device handle. + +Arguments: + + Handle - The device handle + +Returns: + + Device path protocol interface located. + +--*/ +; + +EFI_DEVICE_PATH_PROTOCOL * +RtEfiDuplicateDevicePath ( + IN EFI_DEVICE_PATH_PROTOCOL *DevPath + ) +/*++ + +Routine Description: + Duplicate a new device path data structure from the old one. + +Arguments: + DevPath - A pointer to a device path data structure. + +Returns: + A pointer to the new allocated device path data. + Caller must free the memory used by DevicePath if it is no longer needed. + +--*/ +; + +EFI_DEVICE_PATH_PROTOCOL * +RtEfiAppendDevicePathNode ( + IN EFI_DEVICE_PATH_PROTOCOL *Src1, + IN EFI_DEVICE_PATH_PROTOCOL *Src2 + ) +/*++ + +Routine Description: + Function is used to append a device path node to the end of another device path. + +Arguments: + Src1 - A pointer to a device path data structure. + + Src2 - A pointer to a device path data structure. + +Returns: + This function returns a pointer to the new device path. + If there is not enough temporary pool memory available to complete this function, + then NULL is returned. + + +--*/ +; + +EFI_DEVICE_PATH_PROTOCOL * +RtEfiFileDevicePath ( + IN EFI_HANDLE Device OPTIONAL, + IN CHAR16 *FileName + ) +/*++ + +Routine Description: + Create a device path that appends a MEDIA_DEVICE_PATH with + FileNameGuid to the device path of DeviceHandle. + +Arguments: + Device - Optional Device Handle to use as Root of the Device Path + + FileName - FileName + +Returns: + EFI_DEVICE_PATH_PROTOCOL that was allocated from dynamic memory + or NULL pointer. + +--*/ +; + +EFI_DEVICE_PATH_PROTOCOL * +RtEfiAppendDevicePathInstance ( + IN EFI_DEVICE_PATH_PROTOCOL *Src, + IN EFI_DEVICE_PATH_PROTOCOL *Instance + ) +/*++ + +Routine Description: + + Append a device path instance to another. + +Arguments: + + Src - The device path instance to be appended with. + Instance - The device path instance appending the other. + +Returns: + + The contaction of these two. + +--*/ +; + +#endif diff --git a/EDK/Foundation/Library/Dxe/Include/SmmRuntimeLib.h b/EDK/Foundation/Library/Dxe/Include/SmmRuntimeLib.h new file mode 100644 index 0000000..d60a029 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/Include/SmmRuntimeLib.h @@ -0,0 +1,75 @@ +/*++ + +Copyright (c) 2004, 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: + + SmmRuntimeLib.h + +Abstract: + + SMM Related prototypes that can be referenced for Preboot Configuration only. + +--*/ + +#ifndef _SMM_RUNTIME_LIB_H_ +#define _SMM_RUNTIME_LIB_H_ + +#include "Tiano.h" +#include "EfiRuntimeLib.h" + +BOOLEAN +EfiInSmm ( + VOID + ) +/*++ + +Routine Description: + + Test whether in Smm mode currently. + +Arguments: + + None + +Returns: + + TRUE - In Smm mode + FALSE - Not in Smm mode + +--*/ +; + +EFI_STATUS +RegisterSmmRuntimeDriver ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable, + OUT EFI_HANDLE *SmmImageHandle + ) +/*++ + +Routine Description: + + Registers a Driver with the SMM. + +Arguments: + + ImageHandle - The firmware allocated handle for the EFI image. + SystemTable - A pointer to the EFI System Table. + SmmImageHandle - Image handle returned by the SMM driver. + +Returns: + + Status code + +--*/ +; + +#endif diff --git a/EDK/Foundation/Library/Dxe/Include/x64/CpuFuncs.h b/EDK/Foundation/Library/Dxe/Include/x64/CpuFuncs.h new file mode 100644 index 0000000..a39647d --- /dev/null +++ b/EDK/Foundation/Library/Dxe/Include/x64/CpuFuncs.h @@ -0,0 +1,262 @@ +/*++ + +Copyright (c) 2005 - 2006, 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: + + CpuFuncs.h + +Abstract: + +--*/ + +#ifndef _CPU_FUNCS_H_ +#define _CPU_FUNCS_H_ + +#define EFI_CPUID_SIGNATURE 0x0 +#define EFI_CPUID_VERSION_INFO 0x1 +#define EFI_CPUID_CACHE_INFO 0x2 +#define EFI_CPUID_SERIAL_NUMBER 0x3 +#define EFI_CPUID_EXTENDED_FUNCTION 0x80000000 +#define EFI_CPUID_EXTENDED_CPU_SIG 0x80000001 +#define EFI_CPUID_BRAND_STRING1 0x80000002 +#define EFI_CPUID_BRAND_STRING2 0x80000003 +#define EFI_CPUID_BRAND_STRING3 0x80000004 + +// +// CPUID version information masks +// Note: leaving masks here is for the compatibility +// use EfiCpuVersion (...) instead +// + +#define EFI_CPUID_FAMILY 0x0F00 +#define EFI_CPUID_MODEL 0x00F0 +#define EFI_CPUID_STEPPING 0x000F + +#define EFI_CPUID_PENTIUM_M 0x0600 +#define EFI_CPUID_BANIAS 0x0090 +#define EFI_CPUID_DOTHAN 0x00D0 +#define EFI_CPUID_NETBURST 0x0F00 + +#define EFI_MSR_IA32_PLATFORM_ID 0x17 +#define EFI_MSR_IA32_APIC_BASE 0x1B +#define EFI_MSR_EBC_HARD_POWERON 0x2A +#define EFI_MSR_EBC_SOFT_POWERON 0x2B +#define BINIT_DRIVER_DISABLE 0x40 +#define INTERNAL_MCERR_DISABLE 0x20 +#define INITIATOR_MCERR_DISABLE 0x10 +#define EFI_MSR_EBC_FREQUENCY_ID 0x2C +#define EFI_MSR_IA32_BIOS_UPDT_TRIG 0x79 +#define EFI_MSR_IA32_BIOS_SIGN_ID 0x8B +#define EFI_MSR_PSB_CLOCK_STATUS 0xCD +#define EFI_APIC_GLOBAL_ENABLE 0x800 +#define EFI_MSR_IA32_MISC_ENABLE 0x1A0 +#define LIMIT_CPUID_MAXVAL_ENABLE_BIT 0x00400000 +#define AUTOMATIC_THERMAL_CONTROL_ENABLE_BIT 0x00000008 +#define COMPATIBLE_FPU_OPCODE_ENABLE_BIT 0x00000004 +#define LOGICAL_PROCESSOR_PRIORITY_ENABLE_BIT 0x00000002 +#define FAST_STRING_ENABLE_BIT 0x00000001 + +#define EFI_CACHE_VARIABLE_MTRR_BASE 0x200 +#define EFI_CACHE_VARIABLE_MTRR_END 0x20F +#define EFI_CACHE_IA32_MTRR_DEF_TYPE 0x2FF +#define EFI_CACHE_VALID_ADDRESS 0xFFFFFF000 +#define EFI_CACHE_MTRR_VALID 0x800 +#define EFI_CACHE_FIXED_MTRR_VALID 0x400 +#define EFI_MSR_VALID_MASK 0xFFFFFFFFF + +#define EFI_IA32_MTRR_FIX64K_00000 0x250 +#define EFI_IA32_MTRR_FIX16K_80000 0x258 +#define EFI_IA32_MTRR_FIX16K_A0000 0x259 +#define EFI_IA32_MTRR_FIX4K_C0000 0x268 +#define EFI_IA32_MTRR_FIX4K_C8000 0x269 +#define EFI_IA32_MTRR_FIX4K_D0000 0x26A +#define EFI_IA32_MTRR_FIX4K_D8000 0x26B +#define EFI_IA32_MTRR_FIX4K_E0000 0x26C +#define EFI_IA32_MTRR_FIX4K_E8000 0x26D +#define EFI_IA32_MTRR_FIX4K_F0000 0x26E +#define EFI_IA32_MTRR_FIX4K_F8000 0x26F + +#define EFI_IA32_MCG_CAP 0x179 +#define EFI_IA32_MCG_CTL 0x17B +#define EFI_IA32_MC0_CTL 0x400 +#define EFI_IA32_MC0_STATUS 0x401 + +#define EFI_CACHE_UNCACHEABLE 0 +#define EFI_CACHE_WRITECOMBINING 1 +#define EFI_CACHE_WRITETHROUGH 4 +#define EFI_CACHE_WRITEPROTECTED 5 +#define EFI_CACHE_WRITEBACK 6 + +// +// Combine f(FamilyId), m(Model), s(SteppingId) to a single 32 bit number +// +#define EfiMakeCpuVersion(f, m, s) \ + (((UINT32) (f) << 16) | ((UINT32) (m) << 8) | ((UINT32) (s))) + + +typedef struct { + UINT32 HeaderVersion; + UINT32 UpdateRevision; + UINT32 Date; + UINT32 ProcessorId; + UINT32 Checksum; + UINT32 LoaderRevision; + UINT32 ProcessorFlags; + UINT32 DataSize; + UINT32 TotalSize; + UINT8 Reserved[12]; +} EFI_CPU_MICROCODE_HEADER; + +typedef struct { + UINT32 ExtSigCount; + UINT32 ExtChecksum; + UINT8 Reserved[12]; + UINT32 ProcessorId; + UINT32 ProcessorFlags; + UINT32 Checksum; +} EFI_CPU_MICROCODE_EXT_HEADER; + +typedef struct { + UINT32 RegEax; + UINT32 RegEbx; + UINT32 RegEcx; + UINT32 RegEdx; +} EFI_CPUID_REGISTER; + +VOID +EfiWriteMsr ( + IN UINT32 Input, + IN UINT64 Value + ) +/*++ + +Routine Description: + + Write Cpu MSR + +Arguments: + + Input -The index value to select the register + Value -The value to write to the selected register + +Returns: + + None + +--*/ +; + +UINT64 +EfiReadMsr ( + IN UINT32 Input + ) +/*++ + +Routine Description: + + Read Cpu MSR. + +Arguments: + + Input: -The index value to select the register + +Returns: + + Return the read data + +--*/ +; + +VOID +EfiCpuid ( + IN UINT32 RegEax, + OUT EFI_CPUID_REGISTER *Reg + ) +/*++ + +Routine Description: + + Get the Cpu info by excute the CPUID instruction. + +Arguments: + + RegEax -The input value to put into register EAX + Reg -The Output value + +Returns: + + None + +--*/ +; + +VOID +EfiCpuVersion ( + IN UINT16 *FamilyId, OPTIONAL + IN UINT8 *Model, OPTIONAL + IN UINT8 *SteppingId, OPTIONAL + IN UINT8 *Processor OPTIONAL + ) +/*++ + +Routine Description: + Extract CPU detail version infomation + +Arguments: + FamilyId - FamilyId, including ExtendedFamilyId + Model - Model, including ExtendedModel + SteppingId - SteppingId + Processor - Processor + +--*/ +; + +UINT64 +EfiReadTsc ( + VOID + ) +/*++ + +Routine Description: + + Read Time stamp. + +Arguments: + + None + +Returns: + + Return the read data + +--*/ +; +VOID +EfiCpuidExt ( + IN UINT32 RegisterInEax, + IN UINT32 CacheLevel, + OUT EFI_CPUID_REGISTER *Regs + ) +/*++ +Routine Description: + When RegisterInEax != 4, the functionality is the same as EfiCpuid. + When RegisterInEax == 4, the function return the deterministic cache + parameters by excuting the CPUID instruction +Arguments: + RegisterInEax: - The input value to put into register EAX + CacheLevel: - The deterministic cache level + Regs: - The Output value +Returns: + None +--*/ +; + +#endif diff --git a/EDK/Foundation/Library/Dxe/Include/x64/ProcDep.h b/EDK/Foundation/Library/Dxe/Include/x64/ProcDep.h new file mode 100644 index 0000000..b3e3be4 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/Include/x64/ProcDep.h @@ -0,0 +1,29 @@ +/*++ + +Copyright (c) 2005, 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: + + ProcDep.h + +Abstract: + + x64 specific Runtime Lib code. At this time there is non. + IPF has different code due to extra API requirements. + +--*/ + +#ifndef _PROC_DEP_H_ +#define _PROC_DEP_H_ + + + +#endif diff --git a/EDK/Foundation/Library/Dxe/Print/Ascii/PrintAscii.cif b/EDK/Foundation/Library/Dxe/Print/Ascii/PrintAscii.cif new file mode 100644 index 0000000..3d79f4c --- /dev/null +++ b/EDK/Foundation/Library/Dxe/Print/Ascii/PrintAscii.cif @@ -0,0 +1,9 @@ + + name = "PrintAscii" + category = ModulePart + LocalRoot = "EDK\Foundation\Library\Dxe\Print\Ascii" + RefName = "PrintAscii" +[files] +"PrintWidth.h" +"Sprint.c" + diff --git a/EDK/Foundation/Library/Dxe/Print/Ascii/PrintWidth.h b/EDK/Foundation/Library/Dxe/Print/Ascii/PrintWidth.h new file mode 100644 index 0000000..07901dc --- /dev/null +++ b/EDK/Foundation/Library/Dxe/Print/Ascii/PrintWidth.h @@ -0,0 +1,88 @@ +/*++ + +Copyright (c) 2004, 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: + + PrintWidth.h + +Abstract: + + Unicde option for generic width. + CHAR_W is Ascii + STRING_W is "" + +--*/ + +#ifndef _PRINT_WIDTH_H_ +#define _PRINT_WIDTH_H_ + +typedef CHAR8 CHAR_W; +#define STRING_W(_s) _s + +#define ASPrint(Buffer, BufferSize, Format) SPrint (Buffer, BufferSize, Format) +#define AvSPrint(Buffer, BufferSize, Format, Marker) VSPrint (Buffer, BufferSize, Format, Marker) + +UINTN +UvSPrint ( + OUT CHAR16 *StartOfBuffer, + IN UINTN StrLen, + IN CONST CHAR16 *Format, + IN VA_LIST Marker + ) +/*++ + +Routine Description: + + Internal implementation of USPrint. + Process format and place the results in Buffer for wide chars. + +Arguments: + + StartOfBuffer - Wide char buffer to print the results of the parsing of Format into. + StrLen - Maximum number of characters to put into buffer. + Format - Format string + Marker - Vararg list consumed by processing Format. + +Returns: + + Number of characters printed. + +--*/ +; + +UINTN +USPrint ( + OUT CHAR16 *Buffer, + IN UINTN BufferSize, + IN CONST CHAR16 *Format, + ... + ) +/*++ + +Routine Description: + + Process format and place the results in Buffer for wide chars. + +Arguments: + + Buffer - Wide char buffer to print the results of the parsing of Format into. + BufferSize - Maximum number of characters to put into buffer. + Format - Format string + ... - Vararg list consumed by processing Format. + +Returns: + + Number of characters printed. + +--*/ +; + +#endif diff --git a/EDK/Foundation/Library/Dxe/Print/Ascii/Sprint.c b/EDK/Foundation/Library/Dxe/Print/Ascii/Sprint.c new file mode 100644 index 0000000..bb4bb1e --- /dev/null +++ b/EDK/Foundation/Library/Dxe/Print/Ascii/Sprint.c @@ -0,0 +1,144 @@ +/*++ + +Copyright (c) 2004, 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: + + Sprint.c + +Abstract: + + Basic Ascii AvSPrintf() function named VSPrint(). VSPrint() enables very + simple implemenation of SPrint() and Print() to support debug. + + You can not Print more than EFI_DRIVER_LIB_MAX_PRINT_BUFFER characters at a + time. This makes the implementation very simple. + + VSPrint, Print, SPrint format specification has the follwoing form + + %[flags][width]type + + flags: + '-' - Left justify + '+' - Prefix a sign + ' ' - Prefix a blank + ',' - Place commas in numberss + '0' - Prefix for width with zeros + 'l' - UINT64 + 'L' - UINT64 + + width: + '*' - Get width from a UINTN argumnet from the argument list + Decimal number that represents width of print + + type: + 'X' - argument is a UINTN hex number, prefix '0' + 'x' - argument is a hex number + 'd' - argument is a decimal number + 'a' - argument is an ascii string + 'S','s' - argument is an Unicode string + 'g' - argument is a pointer to an EFI_GUID + 't' - argument is a pointer to an EFI_TIME structure + 'c' - argument is an ascii character + 'r' - argument is EFI_STATUS + '%' - Print a % + +--*/ + +#include "TianoCommon.h" +#include "PrintWidth.h" +#include "EfiPrintLib.h" +#include "Print.h" + + +UINTN +USPrint ( + OUT CHAR16 *Buffer, + IN UINTN BufferSize, + IN CONST CHAR16 *Format, + ... + ) +/*++ + +Routine Description: + + Process format and place the results in Buffer for wide chars. + +Arguments: + + Buffer - Wide char buffer to print the results of the parsing of Format into. + BufferSize - Maximum number of characters to put into buffer. + Format - Format string + ... - Vararg list consumed by processing Format. + +Returns: + + Number of characters printed. + +--*/ +{ + UINTN Return; + VA_LIST Marker; + + VA_START (Marker, Format); + Return = UnicodeVSPrint (Buffer, BufferSize, Format, Marker); + VA_END (Marker); + + return Return; +} + + +UINTN +UvSPrint ( + OUT CHAR16 *Buffer, + IN UINTN BufferSize, + IN CONST CHAR16 *FormatString, + IN VA_LIST Marker + ) +/*++ + +Routine Description: + + Internal implementation of USPrint. + Process format and place the results in Buffer for wide chars. + +Arguments: + + Buffer - Wide char buffer to print the results of the parsing of Format into. + BufferSize - Maximum number of characters to put into buffer. + FormatString - Format string + Marker - Vararg list consumed by processing Format. + +Returns: + + Number of characters printed. + +--*/ +{ + UINTN Index; + CHAR8 AsciiFormat[EFI_DRIVER_LIB_MAX_PRINT_BUFFER]; + CHAR8 AsciiResult[EFI_DRIVER_LIB_MAX_PRINT_BUFFER]; + + for (Index = 0; Index < EFI_DRIVER_LIB_MAX_PRINT_BUFFER && FormatString[Index] != '\0'; Index++) { + AsciiFormat[Index] = (CHAR8) FormatString[Index]; + } + + AsciiFormat[Index] = '\0'; + + Index = VSPrint (AsciiResult, EFI_DRIVER_LIB_MAX_PRINT_BUFFER, AsciiFormat, Marker); + + for (Index = 0; (Index < (BufferSize - 1)) && AsciiResult[Index] != '\0'; Index++) { + Buffer[Index] = (CHAR16) AsciiResult[Index]; + } + + Buffer[Index] = '\0'; + + return Index++; +} diff --git a/EDK/Foundation/Library/Dxe/Print/BoxDraw.c b/EDK/Foundation/Library/Dxe/Print/BoxDraw.c new file mode 100644 index 0000000..fdcd073 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/Print/BoxDraw.c @@ -0,0 +1,212 @@ +/*++ + +Copyright (c) 2004, 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: + + BoxDraw.c + +Abstract: + Lib functions to support Box Draw Unicode code pages. + + + +Revision History + +--*/ + +#include "Tiano.h" +#include "EfiDriverLib.h" + + + +typedef struct { + CHAR16 Unicode; + CHAR8 PcAnsi; + CHAR8 Ascii; +} UNICODE_TO_CHAR; + + +// +// This list is used to define the valid extend chars. +// It also provides a mapping from Unicode to PCANSI or +// ASCII. The ASCII mapping we just made up. +// +// + +static UNICODE_TO_CHAR UnicodeToPcAnsiOrAscii[] = { + BOXDRAW_HORIZONTAL, 0xc4, L'-', + BOXDRAW_VERTICAL, 0xb3, L'|', + BOXDRAW_DOWN_RIGHT, 0xda, L'/', + BOXDRAW_DOWN_LEFT, 0xbf, L'\\', + BOXDRAW_UP_RIGHT, 0xc0, L'\\', + BOXDRAW_UP_LEFT, 0xd9, L'/', + BOXDRAW_VERTICAL_RIGHT, 0xc3, L'|', + BOXDRAW_VERTICAL_LEFT, 0xb4, L'|', + BOXDRAW_DOWN_HORIZONTAL, 0xc2, L'+', + BOXDRAW_UP_HORIZONTAL, 0xc1, L'+', + BOXDRAW_VERTICAL_HORIZONTAL, 0xc5, L'+', + BOXDRAW_DOUBLE_HORIZONTAL, 0xcd, L'-', + BOXDRAW_DOUBLE_VERTICAL, 0xba, L'|', + BOXDRAW_DOWN_RIGHT_DOUBLE, 0xd5, L'/', + BOXDRAW_DOWN_DOUBLE_RIGHT, 0xd6, L'/', + BOXDRAW_DOUBLE_DOWN_RIGHT, 0xc9, L'/', + BOXDRAW_DOWN_LEFT_DOUBLE, 0xb8, L'\\', + BOXDRAW_DOWN_DOUBLE_LEFT, 0xb7, L'\\', + BOXDRAW_DOUBLE_DOWN_LEFT, 0xbb, L'\\', + BOXDRAW_UP_RIGHT_DOUBLE, 0xd4, L'\\', + BOXDRAW_UP_DOUBLE_RIGHT, 0xd3, L'\\', + BOXDRAW_DOUBLE_UP_RIGHT, 0xc8, L'\\', + BOXDRAW_UP_LEFT_DOUBLE, 0xbe, L'/', + BOXDRAW_UP_DOUBLE_LEFT, 0xbd, L'/', + BOXDRAW_DOUBLE_UP_LEFT, 0xbc, L'/', + BOXDRAW_VERTICAL_RIGHT_DOUBLE, 0xc6, L'|', + BOXDRAW_VERTICAL_DOUBLE_RIGHT, 0xc7, L'|', + BOXDRAW_DOUBLE_VERTICAL_RIGHT, 0xcc, L'|', + BOXDRAW_VERTICAL_LEFT_DOUBLE, 0xb5, L'|', + BOXDRAW_VERTICAL_DOUBLE_LEFT, 0xb6, L'|', + BOXDRAW_DOUBLE_VERTICAL_LEFT, 0xb9, L'|', + BOXDRAW_DOWN_HORIZONTAL_DOUBLE, 0xd1, L'+', + BOXDRAW_DOWN_DOUBLE_HORIZONTAL, 0xd2, L'+', + BOXDRAW_DOUBLE_DOWN_HORIZONTAL, 0xcb, L'+', + BOXDRAW_UP_HORIZONTAL_DOUBLE, 0xcf, L'+', + BOXDRAW_UP_DOUBLE_HORIZONTAL, 0xd0, L'+', + BOXDRAW_DOUBLE_UP_HORIZONTAL, 0xca, L'+', + BOXDRAW_VERTICAL_HORIZONTAL_DOUBLE, 0xd8, L'+', + BOXDRAW_VERTICAL_DOUBLE_HORIZONTAL, 0xd7, L'+', + BOXDRAW_DOUBLE_VERTICAL_HORIZONTAL, 0xce, L'+', + + BLOCKELEMENT_FULL_BLOCK, 0xdb, L'*', + BLOCKELEMENT_LIGHT_SHADE, 0xb0, L'+', + + GEOMETRICSHAPE_UP_TRIANGLE, 0x1e, L'^', + GEOMETRICSHAPE_RIGHT_TRIANGLE, 0x10, L'>', + GEOMETRICSHAPE_DOWN_TRIANGLE, 0x1f, L'v', + GEOMETRICSHAPE_LEFT_TRIANGLE, 0x11, L'<', + + ARROW_LEFT, 0x3c, L'<', + + ARROW_UP, 0x18, L'^', + + ARROW_RIGHT, 0x3e, L'>', + + ARROW_DOWN, 0x19, L'v', + + 0x0000, 0x00 +}; + + +BOOLEAN +LibIsValidTextGraphics ( + IN CHAR16 Graphic, + OUT CHAR8 *PcAnsi, OPTIONAL + OUT CHAR8 *Ascii OPTIONAL + ) +/*++ + +Routine Description: + + Detects if a Unicode char is for Box Drawing text graphics. + +Arguments: + + Grphic - Unicode char to test. + + PcAnsi - Optional pointer to return PCANSI equivalent of Graphic. + + Asci - Optional pointer to return Ascii equivalent of Graphic. + +Returns: + + TRUE if Gpaphic is a supported Unicode Box Drawing character. + +--*/ +{ + UNICODE_TO_CHAR *Table; + + if ((((Graphic & 0xff00) != 0x2500) && ((Graphic & 0xff00) != 0x2100))) { + + // + // Unicode drawing code charts are all in the 0x25xx range, + // arrows are 0x21xx + // + return FALSE; + } + + for (Table = UnicodeToPcAnsiOrAscii; Table->Unicode != 0x0000; Table++) { + if (Graphic == Table->Unicode) { + if (PcAnsi != NULL) { + *PcAnsi = Table->PcAnsi; + } + if (Ascii != NULL) { + *Ascii = Table->Ascii; + } + return TRUE; + } + } + return FALSE; +} + + +BOOLEAN +IsValidAscii ( + IN CHAR16 Ascii + ) +/*++ + +Routine Description: + + Is it valid ascii char? + +Arguments: + + Ascii - The char to check + +Returns: + + TRUE - Is a ascii char + FALSE - Not a ascii char + +--*/ +{ + if ((Ascii >= 0x20) && (Ascii <= 0x7f)) { + return TRUE; + } + return FALSE; +} + + +BOOLEAN +IsValidEfiCntlChar ( + IN CHAR16 CharC + ) +/*++ + +Routine Description: + + Is it valid EFI control char? + +Arguments: + + Ascii - The char to check + +Returns: + + TRUE - Is a valid EFI control char + FALSE - Not a valid EFI control char + +--*/ +{ + if (CharC == CHAR_NULL || CharC == CHAR_BACKSPACE || CharC == CHAR_LINEFEED || CharC == CHAR_CARRIAGE_RETURN) { + return TRUE; + } + return FALSE; +} + diff --git a/EDK/Foundation/Library/Dxe/Print/Print.c b/EDK/Foundation/Library/Dxe/Print/Print.c new file mode 100644 index 0000000..d939be5 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/Print/Print.c @@ -0,0 +1,596 @@ +/*++ + +Copyright (c) 2004, 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: + + Print.c + +Abstract: + + Basic Ascii AvSPrintf() function named VSPrint(). VSPrint() enables very + simple implemenation of SPrint() and Print() to support debug. + + You can not Print more than EFI_DRIVER_LIB_MAX_PRINT_BUFFER characters at a + time. This makes the implementation very simple. + + VSPrint, Print, SPrint format specification has the follwoing form + + %[flags][width]type + + flags: + '-' - Left justify + '+' - Prefix a sign + ' ' - Prefix a blank + ',' - Place commas in numberss + '0' - Prefix for width with zeros + 'l' - UINT64 + 'L' - UINT64 + + width: + '*' - Get width from a UINTN argumnet from the argument list + Decimal number that represents width of print + + type: + 'X' - argument is a UINTN hex number, prefix '0' + 'x' - argument is a hex number + 'd' - argument is a decimal number + 'a' - argument is an ascii string + 'S','s' - argument is an Unicode string + 'g' - argument is a pointer to an EFI_GUID + 't' - argument is a pointer to an EFI_TIME structure + 'c' - argument is an ascii character + 'r' - argument is EFI_STATUS + '%' - Print a % + +--*/ + +#include "TianoCommon.h" +#include "EfiCommonLib.h" +#include "PrintWidth.h" +#include "EfiPrintLib.h" +#include "Print.h" + + +STATIC +CHAR_W * +GetFlagsAndWidth ( + IN CHAR_W *Format, + OUT UINTN *Flags, + OUT UINTN *Width, + IN OUT VA_LIST *Marker + ); + +STATIC +UINTN +GuidToString ( + IN EFI_GUID *Guid, + IN OUT CHAR_W *Buffer, + IN UINTN BufferSize + ); + +STATIC +UINTN +TimeToString ( + IN EFI_TIME *Time, + IN OUT CHAR_W *Buffer, + IN UINTN BufferSize + ); + +STATIC +UINTN +EfiStatusToString ( + IN EFI_STATUS Status, + OUT CHAR_W *Buffer, + IN UINTN BufferSize + ); + +STATIC +UINTN +Atoi ( + CHAR_W *String + ); + + + +UINTN +SPrint ( + OUT CHAR_W *Buffer, + IN UINTN BufferSize, + IN CONST CHAR_W *Format, + ... + ) +/*++ + +Routine Description: + + SPrint function to process format and place the results in Buffer. + +Arguments: + + Buffer - Wide char buffer to print the results of the parsing of Format into. + + BufferSize - Maximum number of characters to put into buffer. Zero means no + limit. + + Format - Format string see file header for more details. + + ... - Vararg list consumed by processing Format. + +Returns: + + Number of characters printed. + +--*/ +{ + UINTN Return; + VA_LIST Marker; + + VA_START (Marker, Format); + Return = VSPrint (Buffer, BufferSize, Format, Marker); + VA_END (Marker); + + return Return; +} + + +UINTN +VSPrint ( + OUT CHAR_W *StartOfBuffer, + IN UINTN BufferSize, + IN CONST CHAR_W *FormatString, + IN VA_LIST Marker + ) +/*++ + +Routine Description: + + VSPrint function to process format and place the results in Buffer. Since a + VA_LIST is used this rountine allows the nesting of Vararg routines. Thus + this is the main print working routine + +Arguments: + + StartOfBuffer - Unicode buffer to print the results of the parsing of Format into. + + BufferSize - Maximum number of characters to put into buffer. Zero means + no limit. + + FormatString - Unicode format string see file header for more details. + + Marker - Vararg list consumed by processing Format. + +Returns: + + Number of characters printed. + +--*/ +{ + CHAR16 TempBuffer[CHARACTER_NUMBER_FOR_VALUE]; + CHAR_W *Buffer; + CHAR8 *AsciiStr; + CHAR16 *UnicodeStr; + CHAR_W *Format; + UINTN Index; + UINTN Flags; + UINTN Width; + UINTN Count; + UINTN NumberOfCharacters; + UINTN BufferLeft; + UINT64 Value; + EFI_GUID *TmpGUID; + + // + // Process the format string. Stop if Buffer is over run. + // + + Buffer = StartOfBuffer; + Format = (CHAR_W *)FormatString; + NumberOfCharacters = BufferSize/sizeof(CHAR_W); + BufferLeft = BufferSize; + for (Index = 0; (*Format != '\0') && (Index < NumberOfCharacters - 1); Format++) { + if (*Format != '%') { + if ((*Format == '\n') && (Index < NumberOfCharacters - 2)) { + // + // If carage return add line feed + // + Buffer[Index++] = '\r'; + BufferLeft -= sizeof(CHAR_W); + } + Buffer[Index++] = *Format; + BufferLeft -= sizeof(CHAR_W); + } else { + + // + // Now it's time to parse what follows after % + // + Format = GetFlagsAndWidth (Format, &Flags, &Width, &Marker); + switch (*Format) { + case 'X': + Flags |= PREFIX_ZERO; + Width = sizeof (UINT64) * 2; + // + // break skiped on purpose + // + case 'x': + if ((Flags & LONG_TYPE) == LONG_TYPE) { + Value = VA_ARG (Marker, UINT64); + } else { + Value = VA_ARG (Marker, UINTN); + Value &= 0xFFFFFFFF; + } + + EfiValueToHexStr (TempBuffer, Value, Flags, Width); + UnicodeStr = TempBuffer; + + for ( ;(*UnicodeStr != '\0') && (Index < NumberOfCharacters - 1); UnicodeStr++) { + Buffer[Index++] = *UnicodeStr; + } + break; + + case 'd': + if ((Flags & LONG_TYPE) == LONG_TYPE) { + Value = VA_ARG (Marker, UINT64); + } else { + Value = (UINTN)VA_ARG (Marker, UINTN); + Value &= 0xFFFFFFFF; + Value = (INT32)Value; + } + + EfiValueToString (TempBuffer, Value, Flags, Width); + UnicodeStr = TempBuffer; + + for ( ;(*UnicodeStr != '\0') && (Index < NumberOfCharacters - 1); UnicodeStr++) { + Buffer[Index++] = *UnicodeStr; + } + break; + + case 's': + case 'S': + UnicodeStr = (CHAR16 *)VA_ARG (Marker, CHAR_W *); + if (UnicodeStr == NULL) { + UnicodeStr = L""; + } + for (Count = 0 ;(*UnicodeStr != '\0') && (Index < NumberOfCharacters - 1); UnicodeStr++, Count++) { + Buffer[Index++] = *UnicodeStr; + } + // + // Add padding if needed + // + for (; (Count < Width) && (Index < NumberOfCharacters - 1); Count++) { + Buffer[Index++] = ' '; + } + + break; + + case 'a': + AsciiStr = (CHAR8 *)VA_ARG (Marker, CHAR8 *); + if (AsciiStr == NULL) { + AsciiStr = ""; + } + for (Count = 0 ;(*AsciiStr != '\0') && (Index < NumberOfCharacters - 1); AsciiStr++, Count++) { + Buffer[Index++] = (CHAR_W)*AsciiStr; + } + // + // Add padding if needed + // + for (;(Count < Width) && (Index < NumberOfCharacters - 1); Count++) { + Buffer[Index++] = ' '; + } + break; + + case 'c': + Buffer[Index++] = (CHAR_W)VA_ARG (Marker, UINTN); + break; + + case 'g': + TmpGUID = VA_ARG (Marker, EFI_GUID *); + if (TmpGUID != NULL) { + Index += GuidToString ( + TmpGUID, + &Buffer[Index], + BufferLeft + ); + } + break; + + case 't': + Index += TimeToString ( + VA_ARG (Marker, EFI_TIME *), + &Buffer[Index], + BufferLeft + ); + break; + + case 'r': + Index += EfiStatusToString ( + VA_ARG (Marker, EFI_STATUS), + &Buffer[Index], + BufferLeft + ); + break; + + case '%': + Buffer[Index++] = *Format; + break; + + default: + // + // if the type is unknown print it to the screen + // + Buffer[Index++] = *Format; + } + BufferLeft = BufferSize - Index * sizeof(CHAR_W) ; + } + } + Buffer[Index++] = '\0'; + + return &Buffer[Index] - StartOfBuffer; +} + + + +STATIC +CHAR_W * +GetFlagsAndWidth ( + IN CHAR_W *Format, + OUT UINTN *Flags, + OUT UINTN *Width, + IN OUT VA_LIST *Marker + ) +/*++ + +Routine Description: + + VSPrint worker function that parses flag and width information from the + Format string and returns the next index into the Format string that needs + to be parsed. See file headed for details of Flag and Width. + +Arguments: + + Format - Current location in the VSPrint format string. + + Flags - Returns flags + + Width - Returns width of element + + Marker - Vararg list that may be paritally consumed and returned. + +Returns: + + Pointer indexed into the Format string for all the information parsed + by this routine. + +--*/ +{ + UINTN Count; + BOOLEAN Done; + + *Flags = 0; + *Width = 0; + for (Done = FALSE; !Done; ) { + Format++; + + switch (*Format) { + + case '-': *Flags |= LEFT_JUSTIFY; break; + case '+': *Flags |= PREFIX_SIGN; break; + case ' ': *Flags |= PREFIX_BLANK; break; + case ',': *Flags |= COMMA_TYPE; break; + case 'L': + case 'l': *Flags |= LONG_TYPE; break; + + case '*': + *Width = VA_ARG (*Marker, UINTN); + break; + + case '0': + *Flags |= PREFIX_ZERO; + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + Count = 0; + do { + Count = (Count * 10) + *Format - '0'; + Format++; + } while ((*Format >= '0') && (*Format <= '9')); + Format--; + *Width = Count; + break; + + default: + Done = TRUE; + } + } + return Format; +} + +STATIC +UINTN +GuidToString ( + IN EFI_GUID *Guid, + IN CHAR_W *Buffer, + IN UINTN BufferSize + ) +/*++ + +Routine Description: + + VSPrint worker function that prints an EFI_GUID. + +Arguments: + + Guid - Pointer to GUID to print. + + Buffer - Buffe to print Guid into. + + BufferSize - Size of Buffer. + +Returns: + + Number of characters printed. + +--*/ +{ + UINTN Size; + + Size = SPrint ( + Buffer, + BufferSize, + STRING_W ("%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x"), + (UINTN)Guid->Data1, + (UINTN)Guid->Data2, + (UINTN)Guid->Data3, + (UINTN)Guid->Data4[0], + (UINTN)Guid->Data4[1], + (UINTN)Guid->Data4[2], + (UINTN)Guid->Data4[3], + (UINTN)Guid->Data4[4], + (UINTN)Guid->Data4[5], + (UINTN)Guid->Data4[6], + (UINTN)Guid->Data4[7] + ); + + // + // SPrint will null terminate the string. The -1 skips the null + // + return Size - 1; +} + + +STATIC +UINTN +TimeToString ( + IN EFI_TIME *Time, + OUT CHAR_W *Buffer, + IN UINTN BufferSize + ) +/*++ + +Routine Description: + + VSPrint worker function that prints EFI_TIME. + +Arguments: + + Time - Pointer to EFI_TIME sturcture to print. + + Buffer - Buffer to print Time into. + + BufferSize - Size of Buffer. + +Returns: + + Number of characters printed. + +--*/ +{ + UINTN Size; + + Size = SPrint ( + Buffer, + BufferSize, + STRING_W ("%02d/%02d/%04d %02d:%02d"), + (UINTN)Time->Month, + (UINTN)Time->Day, + (UINTN)Time->Year, + (UINTN)Time->Hour, + (UINTN)Time->Minute + ); + + // + // SPrint will null terminate the string. The -1 skips the null + // + return Size - 1; +} + +STATIC +UINTN +EfiStatusToString ( + IN EFI_STATUS Status, + OUT CHAR_W *Buffer, + IN UINTN BufferSize + ) +/*++ + +Routine Description: + + VSPrint worker function that prints EFI_STATUS as a string. If string is + not known a hex value will be printed. + +Arguments: + + Status - EFI_STATUS sturcture to print. + + Buffer - Buffer to print EFI_STATUS message string into. + + BufferSize - Size of Buffer. + +Returns: + + Number of characters printed. + +--*/ +{ + UINTN Size; + CHAR8 *Desc; + + Desc = NULL; + + // + // Can't use global Status String Array as UINTN is not constant for EBC + // + if (Status == EFI_SUCCESS) { Desc = "Success"; } else + if (Status == EFI_LOAD_ERROR) { Desc = "Load Error"; } else + if (Status == EFI_INVALID_PARAMETER) { Desc = "Invalid Parameter"; } else + if (Status == EFI_UNSUPPORTED) { Desc = "Unsupported"; } else + if (Status == EFI_BAD_BUFFER_SIZE) { Desc = "Bad Buffer Size"; } else + if (Status == EFI_BUFFER_TOO_SMALL) { Desc = "Buffer Too Small"; } else + if (Status == EFI_NOT_READY) { Desc = "Not Ready"; } else + if (Status == EFI_DEVICE_ERROR) { Desc = "Device Error"; } else + if (Status == EFI_WRITE_PROTECTED) { Desc = "Write Protected"; } else + if (Status == EFI_OUT_OF_RESOURCES) { Desc = "Out of Resources"; } else + if (Status == EFI_VOLUME_CORRUPTED) { Desc = "Volume Corrupt"; } else + if (Status == EFI_VOLUME_FULL) { Desc = "Volume Full"; } else + if (Status == EFI_NO_MEDIA) { Desc = "No Media"; } else + if (Status == EFI_MEDIA_CHANGED) { Desc = "Media changed"; } else + if (Status == EFI_NOT_FOUND) { Desc = "Not Found"; } else + if (Status == EFI_ACCESS_DENIED) { Desc = "Access Denied"; } else + if (Status == EFI_NO_RESPONSE) { Desc = "No Response"; } else + if (Status == EFI_NO_MAPPING) { Desc = "No mapping"; } else + if (Status == EFI_TIMEOUT) { Desc = "Time out"; } else + if (Status == EFI_NOT_STARTED) { Desc = "Not started"; } else + if (Status == EFI_ALREADY_STARTED) { Desc = "Already started"; } else + if (Status == EFI_ABORTED) { Desc = "Aborted"; } else + if (Status == EFI_ICMP_ERROR) { Desc = "ICMP Error"; } else + if (Status == EFI_TFTP_ERROR) { Desc = "TFTP Error"; } else + if (Status == EFI_PROTOCOL_ERROR) { Desc = "Protocol Error"; } else + if (Status == EFI_WARN_UNKNOWN_GLYPH) { Desc = "Warning Unknown Glyph"; } else + if (Status == EFI_WARN_DELETE_FAILURE) { Desc = "Warning Delete Failure"; } else + if (Status == EFI_WARN_WRITE_FAILURE) { Desc = "Warning Write Failure"; } else + if (Status == EFI_WARN_BUFFER_TOO_SMALL) { Desc = "Warning Buffer Too Small"; } + + // + // If we found a match, copy the message to the user's buffer. Otherwise + // sprint the hex status code to their buffer. + // + if (Desc != NULL) { + Size = SPrint (Buffer, BufferSize, STRING_W ("%a"), Desc); + } else { + Size = SPrint (Buffer, BufferSize, STRING_W ("%X"), Status); + } + return Size - 1; +} diff --git a/EDK/Foundation/Library/Dxe/Print/Print.h b/EDK/Foundation/Library/Dxe/Print/Print.h new file mode 100644 index 0000000..ad54aa8 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/Print/Print.h @@ -0,0 +1,37 @@ +/*++ + +Copyright (c) 2004, 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: + + Print.h + +Abstract: + + Private data for Print.c + +--*/ + +#ifndef _PRINT_H_ +#define _PRINT_H_ + +#define LEFT_JUSTIFY 0x01 +#define PREFIX_SIGN 0x02 +#define PREFIX_BLANK 0x04 +#define COMMA_TYPE 0x08 +#define LONG_TYPE 0x10 +#define PREFIX_ZERO 0x20 + +// +// Largest number of characters that can be printed out. +// +#define EFI_DRIVER_LIB_MAX_PRINT_BUFFER (80 * 4) + +#endif diff --git a/EDK/Foundation/Library/Dxe/Print/PrintLib.cif b/EDK/Foundation/Library/Dxe/Print/PrintLib.cif new file mode 100644 index 0000000..4692aae --- /dev/null +++ b/EDK/Foundation/Library/Dxe/Print/PrintLib.cif @@ -0,0 +1,19 @@ + + name = "PrintLib" + category = ModulePart + LocalRoot = "EDK\Foundation\Library\Dxe\Print\" + RefName = "PrintLib" +[files] +"PrintLib.sdl" +"PrintLib.mak" +"BoxDraw.c" +"Print.c" +"Print.h" +"StdErr.c" +"PrintLib.inf" +[parts] +"PrintAscii" +"PrintUnicode" +"PrintAscii" +"PrintUnicode" + diff --git a/EDK/Foundation/Library/Dxe/Print/PrintLib.inf b/EDK/Foundation/Library/Dxe/Print/PrintLib.inf new file mode 100644 index 0000000..b06e272 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/Print/PrintLib.inf @@ -0,0 +1,50 @@ +#/*++ +# +# Copyright (c) 2004, 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: +# +# PrintLib.inf +# +# Abstract: +# +# Component description file. +# +#--*/ + +[defines] +BASE_NAME = PrintLib +COMPONENT_TYPE = LIBRARY + +[sources.common] + BoxDraw.c + Print.c + Print.h + StdErr.c + Unicode\PrintWidth.h + Unicode\SPrint.c + +[includes.common] + $(EDK_SOURCE)\Foundation + $(EDK_SOURCE)\Foundation\Framework + $(EDK_SOURCE)\Foundation\Efi + . + $(EDK_SOURCE)\Foundation\Include + $(EDK_SOURCE)\Foundation\Efi\Include + $(EDK_SOURCE)\Foundation\Framework\Include + $(EDK_SOURCE)\Foundation\Include\IndustryStandard + $(EDK_SOURCE)\Foundation\Library\Dxe\Include + $(EDK_SOURCE)\Foundation\Library\Dxe\Print\Unicode + $(EDK_SOURCE)\Foundation\Core\Dxe + +[libraries.common] + +[nmake.common] + C_STD_INCLUDE= diff --git a/EDK/Foundation/Library/Dxe/Print/PrintLib.mak b/EDK/Foundation/Library/Dxe/Print/PrintLib.mak new file mode 100644 index 0000000..dc019ce --- /dev/null +++ b/EDK/Foundation/Library/Dxe/Print/PrintLib.mak @@ -0,0 +1,70 @@ +#********************************************************************** +#********************************************************************** +#** ** +#** (C)Copyright 1985-2009, American Megatrends, Inc. ** +#** ** +#** All Rights Reserved. ** +#** ** +#** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +#** ** +#** Phone: (770)-246-8600 ** +#** ** +#********************************************************************** +#********************************************************************** + +#********************************************************************** +# $Header: /Alaska/SOURCE/Modules/SharkBayRefCodes/IntelEDK/PrintLib/PrintLib.mak 1 1/20/12 4:08a Jeffch $ +# +# $Revision: 1 $ +# +# $Date: 1/20/12 4:08a $ +#********************************************************************** +# Revision History +# ---------------- +# $Log: /Alaska/SOURCE/Modules/SharkBayRefCodes/IntelEDK/PrintLib/PrintLib.mak $ +# +# 1 1/20/12 4:08a Jeffch +# Create Intel EDK 1117 Patch 7. +# +# 1 9/27/11 6:31a Wesleychen +# Intel EDK initially releases. +# +# 2 9/02/09 3:52a Iminglin +# EIP24919 +# +#********************************************************************** +# +# +# Name: PrintLib.mak +# +# Description: +# +# +#********************************************************************** +$(PRINTLIB) : PrintLib + +$(BUILD_DIR)\PrintLib.lib : PrintLib + +PrintLib : $(BUILD_DIR)\PrintLib.mak PrintLibBin + +$(BUILD_DIR)\PrintLib.mak : $(PrintLib_DIR)\$(@B).cif $(PrintLib_DIR)\$(@B).mak $(BUILD_RULES) $(PrintLib_DIR)\Unicode\PrintUnicode.cif + $(CIF2MAK) $(PrintLib_DIR)\$(@B).cif $(CIF2MAK_DEFAULTS) $(PrintLib_DIR)\Unicode\PrintUnicode.cif + +PrintLibBin : + $(MAKE) /$(MAKEFLAGS) $(EDK_DEFAULTS)\ + /f $(BUILD_DIR)\PrintLib.mak all\ + "MY_INCLUDES=/I$(PrintLib_DIR) /I$(PrintLib_DIR)\Unicode"\ + TYPE=LIBRARY \ +#********************************************************************** +#********************************************************************** +#** ** +#** (C)Copyright 1985-2009, American Megatrends, Inc. ** +#** ** +#** All Rights Reserved. ** +#** ** +#** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +#** ** +#** Phone: (770)-246-8600 ** +#** ** +#********************************************************************** +#********************************************************************** diff --git a/EDK/Foundation/Library/Dxe/Print/PrintLib.sdl b/EDK/Foundation/Library/Dxe/Print/PrintLib.sdl new file mode 100644 index 0000000..6920785 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/Print/PrintLib.sdl @@ -0,0 +1,26 @@ +TOKEN + Name = "PrintLib_SUPPORT" + Value = "1" + Help = "Main switch to enable PrintLib support in Project" + TokenType = Boolean + TargetEQU = Yes + TargetMAK = Yes + Master = Yes +End + +TOKEN + Name = "PRINTLIB" + Value = "$(BUILD_DIR)\PrintLib.lib" + TokenType = Expression + TargetMAK = Yes +End + +PATH + Name = "PrintLib_DIR" +End + +MODULE + Help = "Includes PrintLib.mak to Project" + File = "PrintLib.mak" +End + diff --git a/EDK/Foundation/Library/Dxe/Print/StdErr.c b/EDK/Foundation/Library/Dxe/Print/StdErr.c new file mode 100644 index 0000000..14d6ba9 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/Print/StdErr.c @@ -0,0 +1,287 @@ +/*++ + +Copyright (c) 2004, 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: + + StdErr.c + +Abstract: + + Basic Ascii AvSPrintf() function named VSPrint(). VSPrint() enables very + simple implemenation of SPrint() and Print() to support debug. + + You can not Print more than EFI_DRIVER_LIB_MAX_PRINT_BUFFER characters at a + time. This makes the implementation very simple. + + VSPrint, Print, SPrint format specification has the follwoing form + + %[flags][width]type + + flags: + '-' - Left justify + '+' - Prefix a sign + ' ' - Prefix a blank + ',' - Place commas in numberss + '0' - Prefix for width with zeros + 'l' - UINT64 + 'L' - UINT64 + + width: + '*' - Get width from a UINTN argumnet from the argument list + Decimal number that represents width of print + + type: + 'X' - argument is a UINTN hex number, prefix '0' + 'x' - argument is a hex number + 'd' - argument is a decimal number + 'a' - argument is an ascii string + 'S','s' - argument is an Unicode string + 'g' - argument is a pointer to an EFI_GUID + 't' - argument is a pointer to an EFI_TIME structure + 'c' - argument is an ascii character + 'r' - argument is EFI_STATUS + '%' - Print a % + +--*/ + +#include "Tiano.h" +#include "EfiDriverLib.h" +#include "EfiCommonLib.h" +#include "EfiPrintLib.h" +#include "Print.h" + + +UINTN +ErrorPrint ( + IN CONST CHAR16 *ErrorString, + IN CONST CHAR8 *Format, + ... + ) +/*++ + +Routine Description: + + Print function for a maximum of EFI_DRIVER_LIB_MAX_PRINT_BUFFER ascii + characters. + +Arguments: + + ErrorString - String of error infomation. + + Format - Ascii format string see file header for more details. + + ... - Vararg list consumed by processing Format. + +Returns: + + Number of characters printed. + +--*/ +{ + UINTN Return; + VA_LIST Marker; + UINTN Index; + UINTN MaxIndex; + // + // Increase array size of 'UnicodeFormat' and 'Buffer' by 1 as there is a possibility of buffer overflow. + // + CHAR16 Buffer[EFI_DRIVER_LIB_MAX_PRINT_BUFFER+1]; + CHAR16 UnicodeFormat[EFI_DRIVER_LIB_MAX_PRINT_BUFFER+1]; + + MaxIndex = EfiAsciiStrLen ((CHAR8 *) Format); + if (MaxIndex >= EFI_DRIVER_LIB_MAX_PRINT_BUFFER) { + // + // Format string was too long for use to process. + // + return 0; + } + + if (ErrorString != '\0') { + if (gST->StdErr != NULL) { + // + // To be extra safe make sure StdErr has been initialized + // + gST->StdErr->SetAttribute (gST->StdErr, EFI_TEXT_ATTR (EFI_RED, EFI_BLACK)); + gST->StdErr->OutputString (gST->StdErr, (CHAR16 *) ErrorString); + gST->StdErr->SetAttribute (gST->StdErr, EFI_TEXT_ATTR (EFI_WHITE, EFI_BLACK)); + } + } + + for (Index = 0; Index < MaxIndex; Index++) { + UnicodeFormat[Index] = (CHAR16) Format[Index]; + } + + UnicodeFormat[Index] = 0; + + VA_START (Marker, Format); + Return = VSPrint (Buffer, sizeof (Buffer), UnicodeFormat, Marker); + VA_END (Marker); + + // + // Need to convert to Unicode to do an OutputString + // + + if (gST->StdErr != NULL) { + // + // To be extra safe make sure StdErr has been initialized + // + gST->StdErr->OutputString (gST->StdErr, Buffer); + } + + return Return; +} + + +UINTN +Aprint ( + IN CONST CHAR8 *Format, + ... + ) +/*++ + +Routine Description: + + Print function for a maximum of EFI_DRIVER_LIB_MAX_PRINT_BUFFER ascii + characters. + +Arguments: + + Format - Ascii format string see file header for more details. + + ... - Vararg list consumed by processing Format. + +Returns: + + Number of characters printed. + +--*/ +{ + UINTN Return; + VA_LIST Marker; + UINTN Index; + UINTN MaxIndex; + CHAR16 Buffer[EFI_DRIVER_LIB_MAX_PRINT_BUFFER]; + CHAR16 UnicodeFormat[EFI_DRIVER_LIB_MAX_PRINT_BUFFER]; + + MaxIndex = EfiAsciiStrLen ((CHAR8 *) Format); + if (MaxIndex >= EFI_DRIVER_LIB_MAX_PRINT_BUFFER) { + // + // Format string was too long for use to process. + // + return 0; + } + + for (Index = 0; Index < EFI_DRIVER_LIB_MAX_PRINT_BUFFER; Index++) { + UnicodeFormat[Index] = (CHAR16) Format[Index]; + } + + VA_START (Marker, Format); + Return = VSPrint (Buffer, sizeof (Buffer), UnicodeFormat, Marker); + VA_END (Marker); + + // + // Need to convert to Unicode to do an OutputString + // + + if (gST->ConOut != NULL) { + // + // To be extra safe make sure ConOut has been initialized + // + gST->ConOut->OutputString (gST->ConOut, Buffer); + } + + return Return; +} + + +UINTN +Print ( + IN CONST CHAR16 *Format, + ... + ) +/*++ + +Routine Description: + + Print function for a maximum of EFI_DRIVER_LIB_MAX_PRINT_BUFFER ascii + characters. + +Arguments: + + Format - Ascii format string see file header for more details. + + ... - Vararg list consumed by processing Format. + +Returns: + + Number of characters printed. + +--*/ +{ + UINTN Return; + VA_LIST Marker; + CHAR16 Buffer[EFI_DRIVER_LIB_MAX_PRINT_BUFFER]; + + VA_START (Marker, Format); + Return = VSPrint (Buffer, sizeof (Buffer), Format, Marker); + VA_END (Marker); + + if (gST->ConOut != NULL) { + // + // To be extra safe make sure ConOut has been initialized + // + gST->ConOut->OutputString (gST->ConOut, Buffer); + } + + return Return; +} + +UINTN +UPrint ( + IN CONST CHAR16 *Format, + ... + ) +/*++ + +Routine Description: + + Print function for a maximum of EFI_DRIVER_LIB_MAX_PRINT_BUFFER ascii + characters. + +Arguments: + + Format - Ascii format string see file header for more details. + + ... - Vararg list consumed by processing Format. + +Returns: + + Number of characters printed. + +--*/ +{ + UINTN Return; + VA_LIST Marker; + CHAR16 Buffer[EFI_DRIVER_LIB_MAX_PRINT_BUFFER]; + + VA_START (Marker, Format); + Return = VSPrint (Buffer, sizeof (Buffer), Format, Marker); + VA_END (Marker); + + if (gST->ConOut != NULL) { + // + // To be extra safe make sure ConOut has been initialized + // + gST->ConOut->OutputString (gST->ConOut, Buffer); + } + + return Return; +} diff --git a/EDK/Foundation/Library/Dxe/Print/Unicode/PrintUnicode.cif b/EDK/Foundation/Library/Dxe/Print/Unicode/PrintUnicode.cif new file mode 100644 index 0000000..01c6e6d --- /dev/null +++ b/EDK/Foundation/Library/Dxe/Print/Unicode/PrintUnicode.cif @@ -0,0 +1,9 @@ + + name = "PrintUnicode" + category = ModulePart + LocalRoot = "EDK\Foundation\Library\Dxe\Print\Unicode" + RefName = "PrintUnicode" +[files] +"PrintWidth.h" +"Sprint.c" + diff --git a/EDK/Foundation/Library/Dxe/Print/Unicode/PrintWidth.h b/EDK/Foundation/Library/Dxe/Print/Unicode/PrintWidth.h new file mode 100644 index 0000000..fef9ea9 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/Print/Unicode/PrintWidth.h @@ -0,0 +1,35 @@ +/*++ + +Copyright (c) 2004, 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: + + PrintWidth.h + +Abstract: + + Unicde option for generic width. + CHAR_W is Unicode + STRING_W is L"" + +--*/ + +#ifndef _PRINT_WIDTH_H_ +#define _PRINT_WIDTH_H_ + +typedef CHAR16 CHAR_W; +#define STRING_W(_s) L##_s + +#define USPrint(Buffer, BufferSize, Format) SPrint (Buffer, BufferSize, Format) +#define UvSPrint(Buffer, BufferSize, Format, Marker) VSPrint (Buffer, BufferSize, Format, Marker) + +#include "EfiCommonLib.h" + +#endif diff --git a/EDK/Foundation/Library/Dxe/Print/Unicode/Sprint.c b/EDK/Foundation/Library/Dxe/Print/Unicode/Sprint.c new file mode 100644 index 0000000..e3b8738 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/Print/Unicode/Sprint.c @@ -0,0 +1,147 @@ +/*++ + +Copyright (c) 2004, 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: + + Sprint.c + +Abstract: + + Basic Ascii AvSPrintf() function named VSPrint(). VSPrint() enables very + simple implemenation of SPrint() and Print() to support debug. + + You can not Print more than EFI_DRIVER_LIB_MAX_PRINT_BUFFER characters at a + time. This makes the implementation very simple. + + VSPrint, Print, SPrint format specification has the follwoing form + + %[flags][width]type + + flags: + '-' - Left justify + '+' - Prefix a sign + ' ' - Prefix a blank + ',' - Place commas in numberss + '0' - Prefix for width with zeros + 'l' - UINT64 + 'L' - UINT64 + + width: + '*' - Get width from a UINTN argumnet from the argument list + Decimal number that represents width of print + + type: + 'X' - argument is a UINTN hex number, prefix '0' + 'x' - argument is a hex number + 'd' - argument is a decimal number + 'a' - argument is an ascii string + 'S','s' - argument is an Unicode string + 'g' - argument is a pointer to an EFI_GUID + 't' - argument is a pointer to an EFI_TIME structure + 'c' - argument is an ascii character + 'r' - argument is EFI_STATUS + '%' - Print a % + +--*/ + +#include "TianoCommon.h" +#include "PrintWidth.h" +#include "EfiPrintLib.h" +#include "Print.h" + + +UINTN +ASPrint ( + OUT CHAR8 *Buffer, + IN UINTN BufferSize, + IN CONST CHAR8 *Format, + ... + ) +/*++ + +Routine Description: + + Process format and place the results in Buffer for narrow chars. + +Arguments: + + Buffer - Narrow char buffer to print the results of the parsing of Format into. + BufferSize - Maximum number of characters to put into buffer. + Format - Format string + ... - Vararg list consumed by processing Format. + +Returns: + + Number of characters printed. + +--*/ +{ + UINTN Return; + VA_LIST Marker; + + VA_START (Marker, Format); + Return = AvSPrint (Buffer, BufferSize, Format, Marker); + VA_END (Marker); + + return Return; +} + + +UINTN +AvSPrint ( + OUT CHAR8 *Buffer, + IN UINTN BufferSize, + IN CONST CHAR8 *FormatString, + IN VA_LIST Marker + ) +/*++ + +Routine Description: + + Internal implementation of ASPrint. + Process format and place the results in Buffer for narrow chars. + +Arguments: + + Buffer - Narrow char buffer to print the results of the parsing of Format into. + BufferSize - Maximum number of characters to put into buffer. + FormatString - Format string + Marker - Vararg list consumed by processing Format. + +Returns: + + Number of characters printed. + +--*/ +{ + UINTN Index; + // + // Increase array size of 'UnicodeFormat' and 'UnicodeResult' by 1 as there is a possibility of buffer overflow. + // + CHAR16 UnicodeFormat[EFI_DRIVER_LIB_MAX_PRINT_BUFFER+1]; + CHAR16 UnicodeResult[EFI_DRIVER_LIB_MAX_PRINT_BUFFER+1]; + + for (Index = 0; Index < EFI_DRIVER_LIB_MAX_PRINT_BUFFER && FormatString[Index] != '\0'; Index++) { + UnicodeFormat[Index] = (CHAR16) FormatString[Index]; + } + + UnicodeFormat[Index] = '\0'; + + Index = VSPrint (UnicodeResult, sizeof (UnicodeResult)/sizeof (CHAR16), UnicodeFormat, Marker); + + for (Index = 0; (Index < (BufferSize - 1)) && UnicodeResult[Index] != '\0'; Index++) { + Buffer[Index] = (CHAR8) UnicodeResult[Index]; + } + + Buffer[Index] = '\0'; + + return Index++; +} diff --git a/EDK/Foundation/Library/Dxe/PrintLite/Ascii/PrintLiteAscii.cif b/EDK/Foundation/Library/Dxe/PrintLite/Ascii/PrintLiteAscii.cif new file mode 100644 index 0000000..e7d8a3f --- /dev/null +++ b/EDK/Foundation/Library/Dxe/PrintLite/Ascii/PrintLiteAscii.cif @@ -0,0 +1,9 @@ + + name = "PrintLiteAscii" + category = ModulePart + LocalRoot = "EDK\Foundation\Library\Dxe\PrintLite\Ascii" + RefName = "PrintLiteAscii" +[files] +"PrintWidth.h" +"Sprint.c" + diff --git a/EDK/Foundation/Library/Dxe/PrintLite/Ascii/PrintWidth.h b/EDK/Foundation/Library/Dxe/PrintLite/Ascii/PrintWidth.h new file mode 100644 index 0000000..07901dc --- /dev/null +++ b/EDK/Foundation/Library/Dxe/PrintLite/Ascii/PrintWidth.h @@ -0,0 +1,88 @@ +/*++ + +Copyright (c) 2004, 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: + + PrintWidth.h + +Abstract: + + Unicde option for generic width. + CHAR_W is Ascii + STRING_W is "" + +--*/ + +#ifndef _PRINT_WIDTH_H_ +#define _PRINT_WIDTH_H_ + +typedef CHAR8 CHAR_W; +#define STRING_W(_s) _s + +#define ASPrint(Buffer, BufferSize, Format) SPrint (Buffer, BufferSize, Format) +#define AvSPrint(Buffer, BufferSize, Format, Marker) VSPrint (Buffer, BufferSize, Format, Marker) + +UINTN +UvSPrint ( + OUT CHAR16 *StartOfBuffer, + IN UINTN StrLen, + IN CONST CHAR16 *Format, + IN VA_LIST Marker + ) +/*++ + +Routine Description: + + Internal implementation of USPrint. + Process format and place the results in Buffer for wide chars. + +Arguments: + + StartOfBuffer - Wide char buffer to print the results of the parsing of Format into. + StrLen - Maximum number of characters to put into buffer. + Format - Format string + Marker - Vararg list consumed by processing Format. + +Returns: + + Number of characters printed. + +--*/ +; + +UINTN +USPrint ( + OUT CHAR16 *Buffer, + IN UINTN BufferSize, + IN CONST CHAR16 *Format, + ... + ) +/*++ + +Routine Description: + + Process format and place the results in Buffer for wide chars. + +Arguments: + + Buffer - Wide char buffer to print the results of the parsing of Format into. + BufferSize - Maximum number of characters to put into buffer. + Format - Format string + ... - Vararg list consumed by processing Format. + +Returns: + + Number of characters printed. + +--*/ +; + +#endif diff --git a/EDK/Foundation/Library/Dxe/PrintLite/Ascii/Sprint.c b/EDK/Foundation/Library/Dxe/PrintLite/Ascii/Sprint.c new file mode 100644 index 0000000..35a7d4b --- /dev/null +++ b/EDK/Foundation/Library/Dxe/PrintLite/Ascii/Sprint.c @@ -0,0 +1,142 @@ +/*++ + +Copyright (c) 2004, 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: + + Sprint.c + +Abstract: + + Basic Ascii AvSPrintf() function named VSPrint(). VSPrint() enables very + simple implemenation of SPrint() and Print() to support debug. + + You can not Print more than EFI_DRIVER_LIB_MAX_PRINT_BUFFER characters at a + time. This makes the implementation very simple. + + VSPrint, Print, SPrint format specification has the follwoing form + + %[flags][width]type + + flags: + '-' - Left justify + '+' - Prefix a sign + ' ' - Prefix a blank + ',' - Place commas in numberss + '0' - Prefix for width with zeros + 'l' - UINT64 + 'L' - UINT64 + + width: + '*' - Get width from a UINTN argumnet from the argument list + Decimal number that represents width of print + + type: + 'X' - argument is a UINTN hex number, prefix '0' + 'x' - argument is a hex number + 'd' - argument is a decimal number + 'a' - argument is an ascii string + 'S','s' - argument is an Unicode string + 'g' - argument is a pointer to an EFI_GUID + 't' - argument is a pointer to an EFI_TIME structure + 'c' - argument is an ascii character + 'r' - argument is EFI_STATUS + '%' - Print a % + +--*/ + +#include "TianoCommon.h" +#include "PrintWidth.h" +#include "EfiPrintLib.h" +#include "Print.h" + +UINTN +USPrint ( + OUT CHAR16 *Buffer, + IN UINTN BufferSize, + IN CONST CHAR16 *Format, + ... + ) +/*++ + +Routine Description: + + Process format and place the results in Buffer for wide chars. + +Arguments: + + Buffer - Wide char buffer to print the results of the parsing of Format into. + BufferSize - Maximum number of characters to put into buffer. + Format - Format string + ... - Vararg list consumed by processing Format. + +Returns: + + Number of characters printed. + +--*/ +{ + UINTN Return; + VA_LIST Marker; + + VA_START (Marker, Format); + Return = UnicodeVSPrint (Buffer, BufferSize, Format, Marker); + VA_END (Marker); + + return Return; +} + +UINTN +UvSPrint ( + OUT CHAR16 *Buffer, + IN UINTN BufferSize, + IN CONST CHAR16 *FormatString, + IN VA_LIST Marker + ) +/*++ + +Routine Description: + + Internal implementation of USPrint. + Process format and place the results in Buffer for wide chars. + +Arguments: + + Buffer - Wide char buffer to print the results of the parsing of Format into. + BufferSize - Maximum number of characters to put into buffer. + FormatString - Format string + Marker - Vararg list consumed by processing Format. + +Returns: + + Number of characters printed. + +--*/ +{ + UINTN Index; + CHAR8 AsciiFormat[EFI_DRIVER_LIB_MAX_PRINT_BUFFER]; + CHAR8 AsciiResult[EFI_DRIVER_LIB_MAX_PRINT_BUFFER]; + + for (Index = 0; Index < EFI_DRIVER_LIB_MAX_PRINT_BUFFER && FormatString[Index] != '\0'; Index++) { + AsciiFormat[Index] = (CHAR8) FormatString[Index]; + } + + AsciiFormat[Index] = '\0'; + + Index = VSPrint (AsciiResult, EFI_DRIVER_LIB_MAX_PRINT_BUFFER, AsciiFormat, Marker); + + for (Index = 0; (Index < (BufferSize - 1)) && AsciiResult[Index] != '\0'; Index++) { + Buffer[Index] = (CHAR16) AsciiResult[Index]; + } + + Buffer[Index] = '\0'; + + return Index++; +} diff --git a/EDK/Foundation/Library/Dxe/PrintLite/BoxDraw.c b/EDK/Foundation/Library/Dxe/PrintLite/BoxDraw.c new file mode 100644 index 0000000..560d92c --- /dev/null +++ b/EDK/Foundation/Library/Dxe/PrintLite/BoxDraw.c @@ -0,0 +1,212 @@ +/*++ + +Copyright (c) 2004, 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: + + BoxDraw.c + +Abstract: + Lib functions to support Box Draw Unicode code pages. + + + +Revision History + +--*/ + +#include "Tiano.h" +#include "EfiDriverLib.h" + + + +typedef struct { + CHAR16 Unicode; + CHAR8 PcAnsi; + CHAR8 Ascii; +} UNICODE_TO_CHAR; + + +// +// This list is used to define the valid extend chars. +// It also provides a mapping from Unicode to PCANSI or +// ASCII. The ASCII mapping we just made up. +// +// + +static UNICODE_TO_CHAR UnicodeToPcAnsiOrAscii[] = { + BOXDRAW_HORIZONTAL, 0xc4, L'-', + BOXDRAW_VERTICAL, 0xb3, L'|', + BOXDRAW_DOWN_RIGHT, 0xda, L'/', + BOXDRAW_DOWN_LEFT, 0xbf, L'\\', + BOXDRAW_UP_RIGHT, 0xc0, L'\\', + BOXDRAW_UP_LEFT, 0xd9, L'/', + BOXDRAW_VERTICAL_RIGHT, 0xc3, L'|', + BOXDRAW_VERTICAL_LEFT, 0xb4, L'|', + BOXDRAW_DOWN_HORIZONTAL, 0xc2, L'+', + BOXDRAW_UP_HORIZONTAL, 0xc1, L'+', + BOXDRAW_VERTICAL_HORIZONTAL, 0xc5, L'+', + BOXDRAW_DOUBLE_HORIZONTAL, 0xcd, L'-', + BOXDRAW_DOUBLE_VERTICAL, 0xba, L'|', + BOXDRAW_DOWN_RIGHT_DOUBLE, 0xd5, L'/', + BOXDRAW_DOWN_DOUBLE_RIGHT, 0xd6, L'/', + BOXDRAW_DOUBLE_DOWN_RIGHT, 0xc9, L'/', + BOXDRAW_DOWN_LEFT_DOUBLE, 0xb8, L'\\', + BOXDRAW_DOWN_DOUBLE_LEFT, 0xb7, L'\\', + BOXDRAW_DOUBLE_DOWN_LEFT, 0xbb, L'\\', + BOXDRAW_UP_RIGHT_DOUBLE, 0xd4, L'\\', + BOXDRAW_UP_DOUBLE_RIGHT, 0xd3, L'\\', + BOXDRAW_DOUBLE_UP_RIGHT, 0xc8, L'\\', + BOXDRAW_UP_LEFT_DOUBLE, 0xbe, L'/', + BOXDRAW_UP_DOUBLE_LEFT, 0xbd, L'/', + BOXDRAW_DOUBLE_UP_LEFT, 0xbc, L'/', + BOXDRAW_VERTICAL_RIGHT_DOUBLE, 0xc6, L'|', + BOXDRAW_VERTICAL_DOUBLE_RIGHT, 0xc7, L'|', + BOXDRAW_DOUBLE_VERTICAL_RIGHT, 0xcc, L'|', + BOXDRAW_VERTICAL_LEFT_DOUBLE, 0xb5, L'|', + BOXDRAW_VERTICAL_DOUBLE_LEFT, 0xb6, L'|', + BOXDRAW_DOUBLE_VERTICAL_LEFT, 0xb9, L'|', + BOXDRAW_DOWN_HORIZONTAL_DOUBLE, 0xd1, L'+', + BOXDRAW_DOWN_DOUBLE_HORIZONTAL, 0xd2, L'+', + BOXDRAW_DOUBLE_DOWN_HORIZONTAL, 0xcb, L'+', + BOXDRAW_UP_HORIZONTAL_DOUBLE, 0xcf, L'+', + BOXDRAW_UP_DOUBLE_HORIZONTAL, 0xd0, L'+', + BOXDRAW_DOUBLE_UP_HORIZONTAL, 0xca, L'+', + BOXDRAW_VERTICAL_HORIZONTAL_DOUBLE, 0xd8, L'+', + BOXDRAW_VERTICAL_DOUBLE_HORIZONTAL, 0xd7, L'+', + BOXDRAW_DOUBLE_VERTICAL_HORIZONTAL, 0xce, L'+', + + BLOCKELEMENT_FULL_BLOCK, 0xdb, L'*', + BLOCKELEMENT_LIGHT_SHADE, 0xb0, L'+', + + GEOMETRICSHAPE_UP_TRIANGLE, 0x1e, L'^', + GEOMETRICSHAPE_RIGHT_TRIANGLE, 0x10, L'>', + GEOMETRICSHAPE_DOWN_TRIANGLE, 0x1f, L'v', + GEOMETRICSHAPE_LEFT_TRIANGLE, 0x11, L'<', + + ARROW_LEFT, 0x3c, L'<', + + ARROW_UP, 0x18, L'^', + + ARROW_RIGHT, 0x3e, L'>', + + ARROW_DOWN, 0x19, L'v', + + 0x0000, 0x00 +}; + + +BOOLEAN +LibIsValidTextGraphics ( + IN CHAR16 Graphic, + OUT CHAR8 *PcAnsi, OPTIONAL + OUT CHAR8 *Ascii OPTIONAL + ) +/*++ + +Routine Description: + + Detects if a Unicode char is for Box Drawing text graphics. + +Arguments: + + Graphic - Unicode char to test. + + PcAnsi - Optional pointer to return PCANSI equivalent of Graphic. + + Asci - Optional pointer to return Ascii equivalent of Graphic. + +Returns: + + TRUE if Gpaphic is a supported Unicode Box Drawing character. + +--*/ +{ + UNICODE_TO_CHAR *Table; + + if ((((Graphic & 0xff00) != 0x2500) && ((Graphic & 0xff00) != 0x2100))) { + + // + // Unicode drawing code charts are all in the 0x25xx range, + // arrows are 0x21xx + // + return FALSE; + } + + for (Table = UnicodeToPcAnsiOrAscii; Table->Unicode != 0x0000; Table++) { + if (Graphic == Table->Unicode) { + if (PcAnsi != NULL) { + *PcAnsi = Table->PcAnsi; + } + if (Ascii != NULL) { + *Ascii = Table->Ascii; + } + return TRUE; + } + } + return FALSE; +} + + +BOOLEAN +IsValidAscii ( + IN CHAR16 Ascii + ) +/*++ + +Routine Description: + + Is it valid ascii char? + +Arguments: + + Ascii - The char to check + +Returns: + + TRUE - Is a ascii char + FALSE - Not a ascii char + +--*/ +{ + if ((Ascii >= 0x20) && (Ascii <= 0x7f)) { + return TRUE; + } + return FALSE; +} + + +BOOLEAN +IsValidEfiCntlChar ( + IN CHAR16 CharC + ) +/*++ + +Routine Description: + + Is it valid EFI control char? + +Arguments: + + CharC - The char to check + +Returns: + + TRUE - Is a valid EFI control char + FALSE - Not a valid EFI control char + +--*/ +{ + if (CharC == CHAR_NULL || CharC == CHAR_BACKSPACE || CharC == CHAR_LINEFEED || CharC == CHAR_CARRIAGE_RETURN) { + return TRUE; + } + return FALSE; +} + diff --git a/EDK/Foundation/Library/Dxe/PrintLite/Print.c b/EDK/Foundation/Library/Dxe/PrintLite/Print.c new file mode 100644 index 0000000..35b2327 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/PrintLite/Print.c @@ -0,0 +1,194 @@ +/*++ + +Copyright (c) 2004, 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: + + Print.c + +Abstract: + + Basic Ascii AvSPrintf() function named VSPrint(). VSPrint() enables very + simple implemenation of SPrint() and Print() to support debug. + + You can not Print more than EFI_DRIVER_LIB_MAX_PRINT_BUFFER characters at a + time. This makes the implementation very simple. + + VSPrint, Print, SPrint format specification has the follwoing form + + %[flags][width]type + + flags: + '-' - Left justify + '+' - Prefix a sign + ' ' - Prefix a blank + ',' - Place commas in numberss + '0' - Prefix for width with zeros + 'l' - UINT64 + 'L' - UINT64 + + width: + '*' - Get width from a UINTN argumnet from the argument list + Decimal number that represents width of print + + type: + 'X' - argument is a UINTN hex number, prefix '0' + 'x' - argument is a hex number + 'd' - argument is a decimal number + 'a' - argument is an ascii string + 'S','s' - argument is an Unicode string + 'g' - argument is a pointer to an EFI_GUID + 't' - argument is a pointer to an EFI_TIME structure + 'c' - argument is an ascii character + 'r' - argument is EFI_STATUS + '%' - Print a % + +--*/ + +#include "Tiano.h" +#include "EfiDriverLib.h" +#include "TianoCommon.h" +#include "EfiCommonLib.h" +#include "PrintWidth.h" +#include "EfiPrintLib.h" +#include "Print.h" + +#ifndef EFI_PRINT_LITE +STATIC +CHAR_W * +GetFlagsAndWidth ( + IN CHAR_W *Format, + OUT UINTN *Flags, + OUT UINTN *Width, + IN OUT VA_LIST *Marker + ); + +STATIC +UINTN +GuidToString ( + IN EFI_GUID *Guid, + IN OUT CHAR_W *Buffer, + IN UINTN BufferSize + ); + +STATIC +UINTN +TimeToString ( + IN EFI_TIME *Time, + IN OUT CHAR_W *Buffer, + IN UINTN BufferSize + ); + +STATIC +UINTN +EfiStatusToString ( + IN EFI_STATUS Status, + OUT CHAR_W *Buffer, + IN UINTN BufferSize + ); + +#endif +STATIC +UINTN +Atoi ( + CHAR_W *String + ); + +UINTN +SPrint ( + OUT CHAR_W *Buffer, + IN UINTN BufferSize, + IN CONST CHAR_W *Format, + ... + ) +/*++ + +Routine Description: + + SPrint function to process format and place the results in Buffer. + +Arguments: + + Buffer - Wide char buffer to print the results of the parsing of Format into. + + BufferSize - Maximum number of characters to put into buffer. Zero means no + limit. + + Format - Format string see file header for more details. + + ... - Vararg list consumed by processing Format. + +Returns: + + Number of characters printed. + +--*/ +{ + UINTN Return; + VA_LIST Marker; + + VA_START (Marker, Format); + Return = VSPrint (Buffer, BufferSize, Format, Marker); + VA_END (Marker); + + return Return; +} + +UINTN +VSPrint ( + OUT CHAR_W *StartOfBuffer, + IN UINTN BufferSize, + IN CONST CHAR_W *FormatString, + IN VA_LIST Marker + ) +/*++ + +Routine Description: + + VSPrint function to process format and place the results in Buffer. Since a + VA_LIST is used this rountine allows the nesting of Vararg routines. Thus + this is the main print working routine + +Arguments: + + StartOfBuffer - Unicode buffer to print the results of the parsing of Format into. + + BufferSize - Maximum number of characters to put into buffer. Zero means + no limit. + + FormatString - Unicode format string see file header for more details. + + Marker - Vararg list consumed by processing Format. + +Returns: + + Number of characters printed. + +--*/ +{ + EFI_STATUS Status; + EFI_PRINT_PROTOCOL *PrintProtocol; + + Status = gBS->LocateProtocol ( + &gEfiPrintProtocolGuid, + NULL, + (VOID*)&PrintProtocol + ); + if (EFI_ERROR (Status)) { + return 0; + } else { + return PrintProtocol->VSPrint ( + StartOfBuffer, + BufferSize, + FormatString, + Marker + ); + } +} diff --git a/EDK/Foundation/Library/Dxe/PrintLite/Print.h b/EDK/Foundation/Library/Dxe/PrintLite/Print.h new file mode 100644 index 0000000..ad54aa8 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/PrintLite/Print.h @@ -0,0 +1,37 @@ +/*++ + +Copyright (c) 2004, 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: + + Print.h + +Abstract: + + Private data for Print.c + +--*/ + +#ifndef _PRINT_H_ +#define _PRINT_H_ + +#define LEFT_JUSTIFY 0x01 +#define PREFIX_SIGN 0x02 +#define PREFIX_BLANK 0x04 +#define COMMA_TYPE 0x08 +#define LONG_TYPE 0x10 +#define PREFIX_ZERO 0x20 + +// +// Largest number of characters that can be printed out. +// +#define EFI_DRIVER_LIB_MAX_PRINT_BUFFER (80 * 4) + +#endif diff --git a/EDK/Foundation/Library/Dxe/PrintLite/PrintLib.inf b/EDK/Foundation/Library/Dxe/PrintLite/PrintLib.inf new file mode 100644 index 0000000..876271d --- /dev/null +++ b/EDK/Foundation/Library/Dxe/PrintLite/PrintLib.inf @@ -0,0 +1,51 @@ +#/*++ +# +# Copyright (c) 2004, 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: +# +# PrintLib.inf +# +# Abstract: +# +# Component description file. +# +#--*/ + +[defines] +BASE_NAME = PrintLibLite +COMPONENT_TYPE = LIBRARY + +[sources.common] + BoxDraw.c + Print.c + Print.h + StdErr.c + Unicode\PrintWidth.h + Unicode\SPrint.c + +[includes.common] + $(EDK_SOURCE)\Foundation + $(EDK_SOURCE)\Foundation\Framework + $(EDK_SOURCE)\Foundation\Efi + . + $(EDK_SOURCE)\Foundation\Include + $(EDK_SOURCE)\Foundation\Efi\Include + $(EDK_SOURCE)\Foundation\Framework\Include + $(EDK_SOURCE)\Foundation\Include\IndustryStandard + $(EDK_SOURCE)\Foundation\Library\Dxe\Include + $(EDK_SOURCE)\Foundation\Library\Dxe\Print\Unicode + $(EDK_SOURCE)\Foundation\Core\Dxe + +[libraries.common] + EdkProtocolLib + +[nmake.common] + C_STD_INCLUDE= diff --git a/EDK/Foundation/Library/Dxe/PrintLite/PrintLibLite.cif b/EDK/Foundation/Library/Dxe/PrintLite/PrintLibLite.cif new file mode 100644 index 0000000..9acf21e --- /dev/null +++ b/EDK/Foundation/Library/Dxe/PrintLite/PrintLibLite.cif @@ -0,0 +1,19 @@ + + name = "PrintLibLite" + category = ModulePart + LocalRoot = "EDK\Foundation\Library\Dxe\PrintLite\" + RefName = "PrintLibLite" +[files] +"PrintLibLite.sdl" +"PrintLibLite.mak" +"BoxDraw.c" +"Print.c" +"Print.h" +"StdErr.c" +"PrintLib.inf" +[parts] +"PrintLiteAscii" +"PrintLiteUnicode" +"PrintLiteAscii" +"PrintLiteUnicode" + diff --git a/EDK/Foundation/Library/Dxe/PrintLite/PrintLibLite.mak b/EDK/Foundation/Library/Dxe/PrintLite/PrintLibLite.mak new file mode 100644 index 0000000..bac6c40 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/PrintLite/PrintLibLite.mak @@ -0,0 +1,70 @@ +#********************************************************************** +#********************************************************************** +#** ** +#** (C)Copyright 1985-2009, American Megatrends, Inc. ** +#** ** +#** All Rights Reserved. ** +#** ** +#** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +#** ** +#** Phone: (770)-246-8600 ** +#** ** +#********************************************************************** +#********************************************************************** + +#********************************************************************** +# $Header: /Alaska/SOURCE/Modules/SharkBayRefCodes/IntelEDK/PrintLibLite/PrintLibLite.mak 1 1/20/12 4:09a Jeffch $ +# +# $Revision: 1 $ +# +# $Date: 1/20/12 4:09a $ +#********************************************************************** +# Revision History +# ---------------- +# $Log: /Alaska/SOURCE/Modules/SharkBayRefCodes/IntelEDK/PrintLibLite/PrintLibLite.mak $ +# +# 1 1/20/12 4:09a Jeffch +# Create Intel EDK 1117 Patch 7. +# +# 1 9/27/11 6:31a Wesleychen +# Intel EDK initially releases. +# +# 2 9/02/09 3:53a Iminglin +# EIP24919 +# +#********************************************************************** +# +# +# Name: PrintLibLite.mak +# +# Description: +# +# +#********************************************************************** +$(PRINTLIBLITE) : PrintLibLite + +$(BUILD_DIR)\PrintLibLite.lib : PrintLibLite + +PrintLibLite : $(BUILD_DIR)\PrintLibLite.mak PrintLibLiteBin + +$(BUILD_DIR)\PrintLibLite.mak : $(PrintLibLite_DIR)\$(@B).cif $(PrintLibLite_DIR)\$(@B).mak $(BUILD_RULES) $(PrintLibLite_DIR)\Unicode\PrintLiteUnicode.cif + $(CIF2MAK) $(PrintLibLite_DIR)\$(@B).cif $(CIF2MAK_DEFAULTS) $(PrintLibLite_DIR)\Unicode\PrintLiteUnicode.cif + +PrintLibLiteBin : $(EDKPROTOCOLLIB) + $(MAKE) /$(MAKEFLAGS) $(EDK_DEFAULTS)\ + /f $(BUILD_DIR)\PrintLibLite.mak all\ + "MY_INCLUDES=/I$(PrintLibLite_DIR) /I$(PrintLibLite_DIR)\Unicode"\ + TYPE=LIBRARY \ +#********************************************************************** +#********************************************************************** +#** ** +#** (C)Copyright 1985-2009, American Megatrends, Inc. ** +#** ** +#** All Rights Reserved. ** +#** ** +#** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +#** ** +#** Phone: (770)-246-8600 ** +#** ** +#********************************************************************** +#********************************************************************** \ No newline at end of file diff --git a/EDK/Foundation/Library/Dxe/PrintLite/PrintLibLite.sdl b/EDK/Foundation/Library/Dxe/PrintLite/PrintLibLite.sdl new file mode 100644 index 0000000..c41267d --- /dev/null +++ b/EDK/Foundation/Library/Dxe/PrintLite/PrintLibLite.sdl @@ -0,0 +1,26 @@ +TOKEN + Name = "PrintLibLite_SUPPORT" + Value = "1" + Help = "Main switch to enable PrintLibLite support in Project" + TokenType = Boolean + TargetEQU = Yes + TargetMAK = Yes + Master = Yes +End + +TOKEN + Name = "PRINTLIBLITE" + Value = "$(BUILD_DIR)\PrintLibLite.lib" + TokenType = Expression + TargetMAK = Yes +End + +PATH + Name = "PrintLibLite_DIR" +End + +MODULE + Help = "Includes PrintLibLite.mak to Project" + File = "PrintLibLite.mak" +End + diff --git a/EDK/Foundation/Library/Dxe/PrintLite/StdErr.c b/EDK/Foundation/Library/Dxe/PrintLite/StdErr.c new file mode 100644 index 0000000..14d6ba9 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/PrintLite/StdErr.c @@ -0,0 +1,287 @@ +/*++ + +Copyright (c) 2004, 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: + + StdErr.c + +Abstract: + + Basic Ascii AvSPrintf() function named VSPrint(). VSPrint() enables very + simple implemenation of SPrint() and Print() to support debug. + + You can not Print more than EFI_DRIVER_LIB_MAX_PRINT_BUFFER characters at a + time. This makes the implementation very simple. + + VSPrint, Print, SPrint format specification has the follwoing form + + %[flags][width]type + + flags: + '-' - Left justify + '+' - Prefix a sign + ' ' - Prefix a blank + ',' - Place commas in numberss + '0' - Prefix for width with zeros + 'l' - UINT64 + 'L' - UINT64 + + width: + '*' - Get width from a UINTN argumnet from the argument list + Decimal number that represents width of print + + type: + 'X' - argument is a UINTN hex number, prefix '0' + 'x' - argument is a hex number + 'd' - argument is a decimal number + 'a' - argument is an ascii string + 'S','s' - argument is an Unicode string + 'g' - argument is a pointer to an EFI_GUID + 't' - argument is a pointer to an EFI_TIME structure + 'c' - argument is an ascii character + 'r' - argument is EFI_STATUS + '%' - Print a % + +--*/ + +#include "Tiano.h" +#include "EfiDriverLib.h" +#include "EfiCommonLib.h" +#include "EfiPrintLib.h" +#include "Print.h" + + +UINTN +ErrorPrint ( + IN CONST CHAR16 *ErrorString, + IN CONST CHAR8 *Format, + ... + ) +/*++ + +Routine Description: + + Print function for a maximum of EFI_DRIVER_LIB_MAX_PRINT_BUFFER ascii + characters. + +Arguments: + + ErrorString - String of error infomation. + + Format - Ascii format string see file header for more details. + + ... - Vararg list consumed by processing Format. + +Returns: + + Number of characters printed. + +--*/ +{ + UINTN Return; + VA_LIST Marker; + UINTN Index; + UINTN MaxIndex; + // + // Increase array size of 'UnicodeFormat' and 'Buffer' by 1 as there is a possibility of buffer overflow. + // + CHAR16 Buffer[EFI_DRIVER_LIB_MAX_PRINT_BUFFER+1]; + CHAR16 UnicodeFormat[EFI_DRIVER_LIB_MAX_PRINT_BUFFER+1]; + + MaxIndex = EfiAsciiStrLen ((CHAR8 *) Format); + if (MaxIndex >= EFI_DRIVER_LIB_MAX_PRINT_BUFFER) { + // + // Format string was too long for use to process. + // + return 0; + } + + if (ErrorString != '\0') { + if (gST->StdErr != NULL) { + // + // To be extra safe make sure StdErr has been initialized + // + gST->StdErr->SetAttribute (gST->StdErr, EFI_TEXT_ATTR (EFI_RED, EFI_BLACK)); + gST->StdErr->OutputString (gST->StdErr, (CHAR16 *) ErrorString); + gST->StdErr->SetAttribute (gST->StdErr, EFI_TEXT_ATTR (EFI_WHITE, EFI_BLACK)); + } + } + + for (Index = 0; Index < MaxIndex; Index++) { + UnicodeFormat[Index] = (CHAR16) Format[Index]; + } + + UnicodeFormat[Index] = 0; + + VA_START (Marker, Format); + Return = VSPrint (Buffer, sizeof (Buffer), UnicodeFormat, Marker); + VA_END (Marker); + + // + // Need to convert to Unicode to do an OutputString + // + + if (gST->StdErr != NULL) { + // + // To be extra safe make sure StdErr has been initialized + // + gST->StdErr->OutputString (gST->StdErr, Buffer); + } + + return Return; +} + + +UINTN +Aprint ( + IN CONST CHAR8 *Format, + ... + ) +/*++ + +Routine Description: + + Print function for a maximum of EFI_DRIVER_LIB_MAX_PRINT_BUFFER ascii + characters. + +Arguments: + + Format - Ascii format string see file header for more details. + + ... - Vararg list consumed by processing Format. + +Returns: + + Number of characters printed. + +--*/ +{ + UINTN Return; + VA_LIST Marker; + UINTN Index; + UINTN MaxIndex; + CHAR16 Buffer[EFI_DRIVER_LIB_MAX_PRINT_BUFFER]; + CHAR16 UnicodeFormat[EFI_DRIVER_LIB_MAX_PRINT_BUFFER]; + + MaxIndex = EfiAsciiStrLen ((CHAR8 *) Format); + if (MaxIndex >= EFI_DRIVER_LIB_MAX_PRINT_BUFFER) { + // + // Format string was too long for use to process. + // + return 0; + } + + for (Index = 0; Index < EFI_DRIVER_LIB_MAX_PRINT_BUFFER; Index++) { + UnicodeFormat[Index] = (CHAR16) Format[Index]; + } + + VA_START (Marker, Format); + Return = VSPrint (Buffer, sizeof (Buffer), UnicodeFormat, Marker); + VA_END (Marker); + + // + // Need to convert to Unicode to do an OutputString + // + + if (gST->ConOut != NULL) { + // + // To be extra safe make sure ConOut has been initialized + // + gST->ConOut->OutputString (gST->ConOut, Buffer); + } + + return Return; +} + + +UINTN +Print ( + IN CONST CHAR16 *Format, + ... + ) +/*++ + +Routine Description: + + Print function for a maximum of EFI_DRIVER_LIB_MAX_PRINT_BUFFER ascii + characters. + +Arguments: + + Format - Ascii format string see file header for more details. + + ... - Vararg list consumed by processing Format. + +Returns: + + Number of characters printed. + +--*/ +{ + UINTN Return; + VA_LIST Marker; + CHAR16 Buffer[EFI_DRIVER_LIB_MAX_PRINT_BUFFER]; + + VA_START (Marker, Format); + Return = VSPrint (Buffer, sizeof (Buffer), Format, Marker); + VA_END (Marker); + + if (gST->ConOut != NULL) { + // + // To be extra safe make sure ConOut has been initialized + // + gST->ConOut->OutputString (gST->ConOut, Buffer); + } + + return Return; +} + +UINTN +UPrint ( + IN CONST CHAR16 *Format, + ... + ) +/*++ + +Routine Description: + + Print function for a maximum of EFI_DRIVER_LIB_MAX_PRINT_BUFFER ascii + characters. + +Arguments: + + Format - Ascii format string see file header for more details. + + ... - Vararg list consumed by processing Format. + +Returns: + + Number of characters printed. + +--*/ +{ + UINTN Return; + VA_LIST Marker; + CHAR16 Buffer[EFI_DRIVER_LIB_MAX_PRINT_BUFFER]; + + VA_START (Marker, Format); + Return = VSPrint (Buffer, sizeof (Buffer), Format, Marker); + VA_END (Marker); + + if (gST->ConOut != NULL) { + // + // To be extra safe make sure ConOut has been initialized + // + gST->ConOut->OutputString (gST->ConOut, Buffer); + } + + return Return; +} diff --git a/EDK/Foundation/Library/Dxe/PrintLite/Unicode/PrintLiteUnicode.cif b/EDK/Foundation/Library/Dxe/PrintLite/Unicode/PrintLiteUnicode.cif new file mode 100644 index 0000000..8e55a78 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/PrintLite/Unicode/PrintLiteUnicode.cif @@ -0,0 +1,9 @@ + + name = "PrintLiteUnicode" + category = ModulePart + LocalRoot = "EDK\Foundation\Library\Dxe\PrintLite\Unicode" + RefName = "PrintLiteUnicode" +[files] +"PrintWidth.h" +"Sprint.c" + diff --git a/EDK/Foundation/Library/Dxe/PrintLite/Unicode/PrintWidth.h b/EDK/Foundation/Library/Dxe/PrintLite/Unicode/PrintWidth.h new file mode 100644 index 0000000..fef9ea9 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/PrintLite/Unicode/PrintWidth.h @@ -0,0 +1,35 @@ +/*++ + +Copyright (c) 2004, 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: + + PrintWidth.h + +Abstract: + + Unicde option for generic width. + CHAR_W is Unicode + STRING_W is L"" + +--*/ + +#ifndef _PRINT_WIDTH_H_ +#define _PRINT_WIDTH_H_ + +typedef CHAR16 CHAR_W; +#define STRING_W(_s) L##_s + +#define USPrint(Buffer, BufferSize, Format) SPrint (Buffer, BufferSize, Format) +#define UvSPrint(Buffer, BufferSize, Format, Marker) VSPrint (Buffer, BufferSize, Format, Marker) + +#include "EfiCommonLib.h" + +#endif diff --git a/EDK/Foundation/Library/Dxe/PrintLite/Unicode/Sprint.c b/EDK/Foundation/Library/Dxe/PrintLite/Unicode/Sprint.c new file mode 100644 index 0000000..e3b8738 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/PrintLite/Unicode/Sprint.c @@ -0,0 +1,147 @@ +/*++ + +Copyright (c) 2004, 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: + + Sprint.c + +Abstract: + + Basic Ascii AvSPrintf() function named VSPrint(). VSPrint() enables very + simple implemenation of SPrint() and Print() to support debug. + + You can not Print more than EFI_DRIVER_LIB_MAX_PRINT_BUFFER characters at a + time. This makes the implementation very simple. + + VSPrint, Print, SPrint format specification has the follwoing form + + %[flags][width]type + + flags: + '-' - Left justify + '+' - Prefix a sign + ' ' - Prefix a blank + ',' - Place commas in numberss + '0' - Prefix for width with zeros + 'l' - UINT64 + 'L' - UINT64 + + width: + '*' - Get width from a UINTN argumnet from the argument list + Decimal number that represents width of print + + type: + 'X' - argument is a UINTN hex number, prefix '0' + 'x' - argument is a hex number + 'd' - argument is a decimal number + 'a' - argument is an ascii string + 'S','s' - argument is an Unicode string + 'g' - argument is a pointer to an EFI_GUID + 't' - argument is a pointer to an EFI_TIME structure + 'c' - argument is an ascii character + 'r' - argument is EFI_STATUS + '%' - Print a % + +--*/ + +#include "TianoCommon.h" +#include "PrintWidth.h" +#include "EfiPrintLib.h" +#include "Print.h" + + +UINTN +ASPrint ( + OUT CHAR8 *Buffer, + IN UINTN BufferSize, + IN CONST CHAR8 *Format, + ... + ) +/*++ + +Routine Description: + + Process format and place the results in Buffer for narrow chars. + +Arguments: + + Buffer - Narrow char buffer to print the results of the parsing of Format into. + BufferSize - Maximum number of characters to put into buffer. + Format - Format string + ... - Vararg list consumed by processing Format. + +Returns: + + Number of characters printed. + +--*/ +{ + UINTN Return; + VA_LIST Marker; + + VA_START (Marker, Format); + Return = AvSPrint (Buffer, BufferSize, Format, Marker); + VA_END (Marker); + + return Return; +} + + +UINTN +AvSPrint ( + OUT CHAR8 *Buffer, + IN UINTN BufferSize, + IN CONST CHAR8 *FormatString, + IN VA_LIST Marker + ) +/*++ + +Routine Description: + + Internal implementation of ASPrint. + Process format and place the results in Buffer for narrow chars. + +Arguments: + + Buffer - Narrow char buffer to print the results of the parsing of Format into. + BufferSize - Maximum number of characters to put into buffer. + FormatString - Format string + Marker - Vararg list consumed by processing Format. + +Returns: + + Number of characters printed. + +--*/ +{ + UINTN Index; + // + // Increase array size of 'UnicodeFormat' and 'UnicodeResult' by 1 as there is a possibility of buffer overflow. + // + CHAR16 UnicodeFormat[EFI_DRIVER_LIB_MAX_PRINT_BUFFER+1]; + CHAR16 UnicodeResult[EFI_DRIVER_LIB_MAX_PRINT_BUFFER+1]; + + for (Index = 0; Index < EFI_DRIVER_LIB_MAX_PRINT_BUFFER && FormatString[Index] != '\0'; Index++) { + UnicodeFormat[Index] = (CHAR16) FormatString[Index]; + } + + UnicodeFormat[Index] = '\0'; + + Index = VSPrint (UnicodeResult, sizeof (UnicodeResult)/sizeof (CHAR16), UnicodeFormat, Marker); + + for (Index = 0; (Index < (BufferSize - 1)) && UnicodeResult[Index] != '\0'; Index++) { + Buffer[Index] = (CHAR8) UnicodeResult[Index]; + } + + Buffer[Index] = '\0'; + + return Index++; +} diff --git a/EDK/Foundation/Library/Dxe/UefiEfiIfrSupportLib/UefiEfiIfrSupportLib.cif b/EDK/Foundation/Library/Dxe/UefiEfiIfrSupportLib/UefiEfiIfrSupportLib.cif new file mode 100644 index 0000000..7a843fc --- /dev/null +++ b/EDK/Foundation/Library/Dxe/UefiEfiIfrSupportLib/UefiEfiIfrSupportLib.cif @@ -0,0 +1,15 @@ + + name = "UefiEfiIfrSupportLib" + category = ModulePart + LocalRoot = "EDK\Foundation\Library\Dxe\UefiEfiIfrSupportLib\" + RefName = "UefiEfiIfrSupportLib" +[files] +"UefiEfiIfrSupportLib.sdl" +"UefiEfiIfrSupportLib.mak" +"UefiIfrCommon.c" +"UefiIfrForm.c" +"UefiIfrLibrary.h" +"UefiIfrOpCodeCreation.c" +"UefiIfrString.c" +"UefiEfiIfrSupportLib.inf" + diff --git a/EDK/Foundation/Library/Dxe/UefiEfiIfrSupportLib/UefiEfiIfrSupportLib.inf b/EDK/Foundation/Library/Dxe/UefiEfiIfrSupportLib/UefiEfiIfrSupportLib.inf new file mode 100644 index 0000000..cc26951 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/UefiEfiIfrSupportLib/UefiEfiIfrSupportLib.inf @@ -0,0 +1,49 @@ +#/*++ +# +# Copyright (c) 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: +# +# UfiIfrSupportLib.inf +# +# Abstract: +# +# Component description file. +# +#--*/ + +[defines] +BASE_NAME = UefiEfiIfrSupportLib +COMPONENT_TYPE = LIBRARY + +[sources.common] + UefiIfrCommon.c + UefiIfrForm.c + UefiIfrString.c + UefiIfrOpCodeCreation.c + UefiIfrLibrary.h + +[includes.common] + $(EDK_SOURCE)\Foundation\Efi + $(EDK_SOURCE)\Foundation\Framework + $(EDK_SOURCE)\Foundation + . + $(EDK_SOURCE)\Foundation\Include + $(EDK_SOURCE)\Foundation\Efi\Include + $(EDK_SOURCE)\Foundation\Framework\Include + $(EDK_SOURCE)\Foundation\Include\IndustryStandard + $(EDK_SOURCE)\Foundation\Core\Dxe + $(EDK_SOURCE)\Foundation\Library\Dxe\Include + +[libraries.common] + EfiGuidLib + EdkFrameworkProtocolLib + +[nmake.common] diff --git a/EDK/Foundation/Library/Dxe/UefiEfiIfrSupportLib/UefiEfiIfrSupportLib.mak b/EDK/Foundation/Library/Dxe/UefiEfiIfrSupportLib/UefiEfiIfrSupportLib.mak new file mode 100644 index 0000000..991cd72 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/UefiEfiIfrSupportLib/UefiEfiIfrSupportLib.mak @@ -0,0 +1,70 @@ +#********************************************************************** +#********************************************************************** +#** ** +#** (C)Copyright 1985-2009, American Megatrends, Inc. ** +#** ** +#** All Rights Reserved. ** +#** ** +#** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +#** ** +#** Phone: (770)-246-8600 ** +#** ** +#********************************************************************** +#********************************************************************** + +#********************************************************************** +# $Header: /Alaska/SOURCE/Modules/SharkBayRefCodes/IntelEDK/UefiEfiIfrSupportLib/UefiEfiIfrSupportLib.mak 1 1/20/12 4:13a Jeffch $ +# +# $Revision: 1 $ +# +# $Date: 1/20/12 4:13a $ +#********************************************************************** +# Revision History +# ---------------- +# $Log: /Alaska/SOURCE/Modules/SharkBayRefCodes/IntelEDK/UefiEfiIfrSupportLib/UefiEfiIfrSupportLib.mak $ +# +# 1 1/20/12 4:13a Jeffch +# Create Intel EDK 1117 Patch 7. +# +# 1 9/27/11 6:35a Wesleychen +# Intel EDK initially releases. +# +# 2 9/02/09 3:55a Iminglin +# EIP24919 +# +#********************************************************************** +#********************************************************************** +# +# +# Name: UefiEfiIfrSupportLib.mak +# +# Description: +# +# +#********************************************************************** +$(UEFIEFIIFRSUPPORTLIB) : UefiEfiIfrSupportLib + +$(BUILD_DIR)\UefiEfiIfrSupportLib.lib : UefiEfiIfrSupportLib + +UefiEfiIfrSupportLib : $(BUILD_DIR)\UefiEfiIfrSupportLib.mak UefiEfiIfrSupportLibBin + +$(BUILD_DIR)\UefiEfiIfrSupportLib.mak : $(UefiEfiIfrSupportLib_DIR)\$(@B).cif $(UefiEfiIfrSupportLib_DIR)\$(@B).mak $(BUILD_RULES) + $(CIF2MAK) $(UefiEfiIfrSupportLib_DIR)\$(@B).cif $(CIF2MAK_DEFAULTS) + +UefiEfiIfrSupportLibBin : $(EFIGUIDLIB) $(EDKFRAMEWORKPROTOCOLLIB) + $(MAKE) /$(MAKEFLAGS) $(EDK_DEFAULTS)\ + /f $(BUILD_DIR)\UefiEfiIfrSupportLib.mak all\ + TYPE=LIBRARY \ +#********************************************************************** +#********************************************************************** +#** ** +#** (C)Copyright 1985-2009, American Megatrends, Inc. ** +#** ** +#** All Rights Reserved. ** +#** ** +#** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +#** ** +#** Phone: (770)-246-8600 ** +#** ** +#********************************************************************** +#********************************************************************** \ No newline at end of file diff --git a/EDK/Foundation/Library/Dxe/UefiEfiIfrSupportLib/UefiEfiIfrSupportLib.sdl b/EDK/Foundation/Library/Dxe/UefiEfiIfrSupportLib/UefiEfiIfrSupportLib.sdl new file mode 100644 index 0000000..f7135b8 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/UefiEfiIfrSupportLib/UefiEfiIfrSupportLib.sdl @@ -0,0 +1,26 @@ +TOKEN + Name = "UefiEfiIfrSupportLib_SUPPORT" + Value = "1" + Help = "Main switch to enable UefiEfiIfrSupportLib support in Project" + TokenType = Boolean + TargetEQU = Yes + TargetMAK = Yes + Master = Yes +End + +TOKEN + Name = "UEFIEFIIFRSUPPORTLIB" + Value = "$(BUILD_DIR)\UefiEfiIfrSupportLib.lib" + TokenType = Expression + TargetMAK = Yes +End + +PATH + Name = "UefiEfiIfrSupportLib_DIR" +End + +MODULE + Help = "Includes UefiEfiIfrSupportLib.mak to Project" + File = "UefiEfiIfrSupportLib.mak" +End + diff --git a/EDK/Foundation/Library/Dxe/UefiEfiIfrSupportLib/UefiIfrCommon.c b/EDK/Foundation/Library/Dxe/UefiEfiIfrSupportLib/UefiIfrCommon.c new file mode 100644 index 0000000..d2a66e0 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/UefiEfiIfrSupportLib/UefiIfrCommon.c @@ -0,0 +1,762 @@ +/*++ + +Copyright (c) 2007 - 2011, 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: + + UefiIfrCommon.c + +Abstract: + + Common Library Routines to assist handle HII elements. + +--*/ + +#include "UefiIfrLibrary.h" + +// +// Hii vendor device path template +// +HII_VENDOR_DEVICE_PATH mHiiVendorDevicePathTemplate = { + { + { + { + HARDWARE_DEVICE_PATH, + HW_VENDOR_DP, + (UINT8) (sizeof (HII_VENDOR_DEVICE_PATH_NODE)), + (UINT8) ((sizeof (HII_VENDOR_DEVICE_PATH_NODE)) >> 8) + }, + EFI_IFR_TIANO_GUID, + }, + 0, + 0 + }, + { + END_DEVICE_PATH_TYPE, + END_ENTIRE_DEVICE_PATH_SUBTYPE, + END_DEVICE_PATH_LENGTH, + 0 + } +}; + +// +// Hii relative protocols +// +BOOLEAN mHiiProtocolsInitialized = FALSE; + +EFI_HII_DATABASE_PROTOCOL *gIfrLibHiiDatabase; +EFI_HII_STRING_PROTOCOL *gIfrLibHiiString; + +VOID +LocateHiiProtocols ( + VOID + ) +/*++ + +Routine Description: + This function locate Hii relative protocols for later usage. + +Arguments: + None. + +Returns: + None. + +--*/ +{ + EFI_STATUS Status; + + if (mHiiProtocolsInitialized) { + return; + } + + Status = gBS->LocateProtocol (&gEfiHiiDatabaseProtocolGuid, NULL, &gIfrLibHiiDatabase); + ASSERT_EFI_ERROR (Status); + + Status = gBS->LocateProtocol (&gEfiHiiStringProtocolGuid, NULL, &gIfrLibHiiString); + ASSERT_EFI_ERROR (Status); + + mHiiProtocolsInitialized = TRUE; +} + +EFI_HII_PACKAGE_LIST_HEADER * +PreparePackageList ( + IN UINTN NumberOfPackages, + IN EFI_GUID *GuidId, + ... + ) +/*++ + +Routine Description: + Assemble EFI_HII_PACKAGE_LIST according to the passed in packages. + +Arguments: + NumberOfPackages - Number of packages. + GuidId - Package GUID. + +Returns: + Pointer of EFI_HII_PACKAGE_LIST_HEADER. + +--*/ +{ + VA_LIST Marker; + EFI_HII_PACKAGE_LIST_HEADER *PackageListHeader; + UINT8 *PackageListData; + UINT32 PackageListLength; + UINT32 PackageLength; + EFI_HII_PACKAGE_HEADER PackageHeader; + UINT8 *PackageArray; + UINTN Index; + + PackageListLength = sizeof (EFI_HII_PACKAGE_LIST_HEADER); + + VA_START (Marker, GuidId); + for (Index = 0; Index < NumberOfPackages; Index++) { + EfiCopyMem (&PackageLength, VA_ARG (Marker, VOID *), sizeof (UINT32)); + PackageListLength += (PackageLength - sizeof (UINT32)); + } + VA_END (Marker); + + // + // Include the lenght of EFI_HII_PACKAGE_END + // + PackageListLength += sizeof (EFI_HII_PACKAGE_HEADER); + PackageListHeader = EfiLibAllocateZeroPool (PackageListLength); + ASSERT (PackageListHeader != NULL); + EfiCopyMem (&PackageListHeader->PackageListGuid, GuidId, sizeof (EFI_GUID)); + PackageListHeader->PackageLength = PackageListLength; + + PackageListData = ((UINT8 *) PackageListHeader) + sizeof (EFI_HII_PACKAGE_LIST_HEADER); + + VA_START (Marker, GuidId); + for (Index = 0; Index < NumberOfPackages; Index++) { + PackageArray = (UINT8 *) VA_ARG (Marker, VOID *); + EfiCopyMem (&PackageLength, PackageArray, sizeof (UINT32)); + PackageLength -= sizeof (UINT32); + PackageArray += sizeof (UINT32); + EfiCopyMem (PackageListData, PackageArray, PackageLength); + PackageListData += PackageLength; + } + VA_END (Marker); + + // + // Append EFI_HII_PACKAGE_END + // + PackageHeader.Type = EFI_HII_PACKAGE_END; + PackageHeader.Length = sizeof (EFI_HII_PACKAGE_HEADER); + EfiCopyMem (PackageListData, &PackageHeader, PackageHeader.Length); + + return PackageListHeader; +} + +EFI_STATUS +CreateHiiDriverHandle ( + OUT EFI_HANDLE *DriverHandle + ) +/*++ + +Routine Description: + The HII driver handle passed in for HiiDatabase.NewPackageList() requires + that there should be DevicePath Protocol installed on it. + This routine create a virtual Driver Handle by installing a vendor device + path on it, so as to use it to invoke HiiDatabase.NewPackageList(). + +Arguments: + DriverHandle - Handle to be returned + +Returns: + EFI_SUCCESS - Handle destroy success. + EFI_OUT_OF_RESOURCES - Not enough memory. + +--*/ +{ + EFI_STATUS Status; + HII_VENDOR_DEVICE_PATH_NODE *VendorDevicePath; + + VendorDevicePath = EfiLibAllocateCopyPool (sizeof (HII_VENDOR_DEVICE_PATH), &mHiiVendorDevicePathTemplate); + if (VendorDevicePath == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + // + // Use memory address as unique ID to distinguish from different device paths + // + VendorDevicePath->UniqueId = (UINT64) ((UINTN) VendorDevicePath); + + *DriverHandle = NULL; + Status = gBS->InstallMultipleProtocolInterfaces ( + DriverHandle, + &gEfiDevicePathProtocolGuid, + VendorDevicePath, + NULL + ); + if (EFI_ERROR (Status)) { + return Status; + } + + return EFI_SUCCESS; +} + +EFI_STATUS +DestroyHiiDriverHandle ( + IN EFI_HANDLE DriverHandle + ) +/*++ + +Routine Description: + Destroy the Driver Handle created by CreateHiiDriverHandle(). + +Arguments: + DriverHandle - Handle returned by CreateHiiDriverHandle() + +Returns: + EFI_SUCCESS - Handle destroy success. + other - Handle destroy fail. + +--*/ +{ + EFI_STATUS Status; + EFI_DEVICE_PATH_PROTOCOL *DevicePath; + + Status = gBS->HandleProtocol ( + DriverHandle, + &gEfiDevicePathProtocolGuid, + &DevicePath + ); + if (EFI_ERROR (Status)) { + return Status; + } + + Status = gBS->UninstallProtocolInterface ( + DriverHandle, + &gEfiDevicePathProtocolGuid, + DevicePath + ); + gBS->FreePool (DevicePath); + return Status; +} + +EFI_HII_HANDLE +DevicePathToHiiHandle ( + IN EFI_HII_DATABASE_PROTOCOL *HiiDatabase, + IN EFI_DEVICE_PATH_PROTOCOL *DevicePath + ) +/*++ + +Routine Description: + Find HII Handle associated with given Device Path. + +Arguments: + HiiDatabase - Point to EFI_HII_DATABASE_PROTOCOL instance. + DevicePath - Device Path associated with the HII package list handle. + +Returns: + Handle - HII package list Handle associated with the Device Path. + NULL - Hii Package list handle is not found. + +--*/ +{ + EFI_STATUS Status; + EFI_DEVICE_PATH_PROTOCOL *TmpDevicePath; + UINTN BufferSize; + UINTN HandleCount; + UINTN Index; + EFI_HANDLE *Handles; + EFI_HANDLE Handle; + UINTN Size; + EFI_HANDLE DriverHandle; + EFI_HII_HANDLE *HiiHandles; + EFI_HII_HANDLE HiiHandle; + + // + // Locate Device Path Protocol handle buffer + // + Status = gBS->LocateHandleBuffer ( + ByProtocol, + &gEfiDevicePathProtocolGuid, + NULL, + &HandleCount, + &Handles + ); + if (EFI_ERROR (Status)) { + return NULL; + } + + // + // Search Driver Handle by Device Path + // + DriverHandle = NULL; + BufferSize = EfiDevicePathSize (DevicePath); + for(Index = 0; Index < HandleCount; Index++) { + Handle = Handles[Index]; + gBS->HandleProtocol (Handle, &gEfiDevicePathProtocolGuid, &TmpDevicePath); + + // + // Check whether DevicePath match + // + Size = EfiDevicePathSize (TmpDevicePath); + if ((Size == BufferSize) && EfiCompareMem (DevicePath, TmpDevicePath, Size) == 0) { + DriverHandle = Handle; + break; + } + } + gBS->FreePool (Handles); + + if (DriverHandle == NULL) { + return NULL; + } + + // + // Retrieve all Hii Handles from HII database + // + BufferSize = 0x1000; + HiiHandles = EfiLibAllocatePool (BufferSize); + ASSERT (HiiHandles != NULL); + Status = HiiDatabase->ListPackageLists ( + HiiDatabase, + EFI_HII_PACKAGE_TYPE_ALL, + NULL, + &BufferSize, + HiiHandles + ); + if (Status == EFI_BUFFER_TOO_SMALL) { + gBS->FreePool (HiiHandles); + HiiHandles = EfiLibAllocatePool (BufferSize); + ASSERT (HiiHandles != NULL); + + Status = HiiDatabase->ListPackageLists ( + HiiDatabase, + EFI_HII_PACKAGE_TYPE_ALL, + NULL, + &BufferSize, + HiiHandles + ); + } + + if (EFI_ERROR (Status)) { + gBS->FreePool (HiiHandles); + return NULL; + } + + // + // Search Hii Handle by Driver Handle + // + HiiHandle = NULL; + HandleCount = BufferSize / sizeof (EFI_HII_HANDLE); + for (Index = 0; Index < HandleCount; Index++) { + Status = HiiDatabase->GetPackageListHandle ( + HiiDatabase, + HiiHandles[Index], + &Handle + ); + if (!EFI_ERROR (Status) && (Handle == DriverHandle)) { + HiiHandle = HiiHandles[Index]; + break; + } + } + + gBS->FreePool (HiiHandles); + return HiiHandle; +} + +EFI_STATUS +GetHiiHandles ( + IN OUT UINTN *HandleBufferLength, + OUT EFI_HII_HANDLE **HiiHandleBuffer + ) +/*++ + +Routine Description: + Determines the handles that are currently active in the database. + It's the caller's responsibility to free handle buffer. + +Arguments: + HiiDatabase - A pointer to the EFI_HII_DATABASE_PROTOCOL instance. + HandleBufferLength - On input, a pointer to the length of the handle buffer. On output, + the length of the handle buffer that is required for the handles found. + HiiHandleBuffer - Pointer to an array of Hii Handles returned. + +Returns: + EFI_SUCCESS - Get an array of Hii Handles successfully. + EFI_INVALID_PARAMETER - Hii is NULL. + EFI_NOT_FOUND - Database not found. + +--*/ +{ + UINTN BufferLength; + EFI_STATUS Status; + + BufferLength = 0; + + LocateHiiProtocols (); + + // + // Try to find the actual buffer size for HiiHandle Buffer. + // + Status = gIfrLibHiiDatabase->ListPackageLists ( + gIfrLibHiiDatabase, + EFI_HII_PACKAGE_TYPE_ALL, + NULL, + &BufferLength, + *HiiHandleBuffer + ); + + if (Status == EFI_BUFFER_TOO_SMALL) { + *HiiHandleBuffer = EfiLibAllocateZeroPool (BufferLength); + Status = gIfrLibHiiDatabase->ListPackageLists ( + gIfrLibHiiDatabase, + EFI_HII_PACKAGE_TYPE_ALL, + NULL, + &BufferLength, + *HiiHandleBuffer + ); + // + // we should not fail here. + // + ASSERT_EFI_ERROR (Status); + } + + *HandleBufferLength = BufferLength; + + return Status; +} + +EFI_STATUS +ExtractGuidFromHiiHandle ( + IN EFI_HII_HANDLE Handle, + OUT EFI_GUID *Guid + ) +/*++ + +Routine Description: + Extract Hii package list GUID for given HII handle. + +Arguments: + HiiHandle - Hii handle + Guid - Package list GUID + +Returns: + EFI_SUCCESS - Successfully extract GUID from Hii database. + +--*/ +{ + EFI_STATUS Status; + UINTN BufferSize; + EFI_HII_DATABASE_PROTOCOL *HiiDatabase; + EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList; + + // + // Locate HII Database protocol + // + Status = gBS->LocateProtocol ( + &gEfiHiiDatabaseProtocolGuid, + NULL, + &HiiDatabase + ); + if (EFI_ERROR (Status)) { + return Status; + } + + // + // Get HII PackageList + // + BufferSize = 0; + HiiPackageList = NULL; + Status = HiiDatabase->ExportPackageLists (HiiDatabase, Handle, &BufferSize, HiiPackageList); + if (Status == EFI_BUFFER_TOO_SMALL) { + HiiPackageList = EfiLibAllocatePool (BufferSize); + ASSERT (HiiPackageList != NULL); + + Status = HiiDatabase->ExportPackageLists (HiiDatabase, Handle, &BufferSize, HiiPackageList); + } + if (EFI_ERROR (Status)) { + return Status; + } + + // + // Extract GUID + // + EfiCopyMem (Guid, &HiiPackageList->PackageListGuid, sizeof (EFI_GUID)); + + gBS->FreePool (HiiPackageList); + + return EFI_SUCCESS; +} + +EFI_STATUS +ExtractClassFromHiiHandle ( + IN EFI_HII_HANDLE Handle, + OUT UINT16 *Class, + OUT EFI_STRING_ID *FormSetTitle, + OUT EFI_STRING_ID *FormSetHelp + ) +/*++ + +Routine Description: + Extract formset class for given HII handle. + +Arguments: + HiiHandle - Hii handle + Class - Class of the formset + FormSetTitle - Formset title string + FormSetHelp - Formset help string + +Returns: + EFI_SUCCESS - Successfully extract Class for specified Hii handle. + EFI_NOT_FOUND - Class not found. + +--*/ +{ + EFI_STATUS Status; + UINTN BufferSize; + EFI_HII_DATABASE_PROTOCOL *HiiDatabase; + EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList; + UINT8 *Package; + UINT8 *FormSet; + UINT8 *OpCodeData; + UINT32 Offset; + UINT32 Offset2; + UINT32 PackageListLength; + EFI_HII_PACKAGE_HEADER PackageHeader; + BOOLEAN ClassFound; + + *Class = EFI_NON_DEVICE_CLASS; + *FormSetTitle = 0; + *FormSetHelp = 0; + ClassFound = FALSE; + + // + // Locate HII Database protocol + // + Status = gBS->LocateProtocol ( + &gEfiHiiDatabaseProtocolGuid, + NULL, + &HiiDatabase + ); + if (EFI_ERROR (Status)) { + return Status; + } + + // + // Get HII PackageList + // + BufferSize = 0; + HiiPackageList = NULL; + Status = HiiDatabase->ExportPackageLists (HiiDatabase, Handle, &BufferSize, HiiPackageList); + if (Status == EFI_BUFFER_TOO_SMALL) { + HiiPackageList = EfiLibAllocatePool (BufferSize); + ASSERT (HiiPackageList != NULL); + + Status = HiiDatabase->ExportPackageLists (HiiDatabase, Handle, &BufferSize, HiiPackageList); + } + if (EFI_ERROR (Status)) { + return Status; + } + + // + // Get Form package from this HII package List + // + Offset = sizeof (EFI_HII_PACKAGE_LIST_HEADER); + Offset2 = 0; + FormSet = NULL; + EfiCopyMem (&PackageListLength, &HiiPackageList->PackageLength, sizeof (UINT32)); + + while (Offset < PackageListLength) { + Package = ((UINT8 *) HiiPackageList) + Offset; + EfiCopyMem (&PackageHeader, Package, sizeof (EFI_HII_PACKAGE_HEADER)); + + if (PackageHeader.Type == EFI_HII_PACKAGE_FORMS) { + // + // Search Class Opcode in this Form Package + // + Offset2 = sizeof (EFI_HII_PACKAGE_HEADER); + while (Offset2 < PackageHeader.Length) { + OpCodeData = Package + Offset2; + if (OpCodeData == NULL) { + return EFI_NOT_FOUND; + } + + if (((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode == EFI_IFR_FORM_SET_OP) { + // + // Find FormSet OpCode + // + EfiCopyMem (FormSetTitle, &((EFI_IFR_FORM_SET *) OpCodeData)->FormSetTitle, sizeof (EFI_STRING_ID)); + EfiCopyMem (FormSetHelp, &((EFI_IFR_FORM_SET *) OpCodeData)->Help, sizeof (EFI_STRING_ID)); + } + + if ((((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode == EFI_IFR_GUID_OP) && + (EfiCompareGuid (&mIfrVendorGuid, &((EFI_IFR_GUID *) OpCodeData)->Guid)) && + (((EFI_IFR_GUID_CLASS *) OpCodeData)->ExtendOpCode == EFI_IFR_EXTEND_OP_CLASS) + ) { + // + // Find GUIDed Class OpCode + // + EfiCopyMem (Class, &((EFI_IFR_GUID_CLASS *) OpCodeData)->Class, sizeof (UINT16)); + + // + // Till now, we ought to have found the formset Opcode + // + ClassFound = TRUE; + break; + } + + Offset2 += ((EFI_IFR_OP_HEADER *) OpCodeData)->Length; + } + + if (Offset2 < PackageHeader.Length) { + // + // Target formset found + // + break; + } + } + + Offset += PackageHeader.Length; + } + + gBS->FreePool (HiiPackageList); + + return ClassFound ? EFI_SUCCESS : EFI_NOT_FOUND; +} + +EFI_STATUS +ExtractClassGuidFromHiiHandle ( + IN EFI_HII_HANDLE Handle, + OUT UINT8 *NumberOfClassGuid, + OUT EFI_GUID **ClassGuid, + OUT EFI_STRING_ID *FormSetTitle, + OUT EFI_STRING_ID *FormSetHelp + ) +/*++ + +Routine Description: + Extract formset ClassGuid for given HII handle. + +Arguments: + HiiHandle - Hii handle + NumberOfClassGuid - Number of ClassGuid + ClassGuid - Pointer to callee allocated buffer, an array of ClassGuid + FormSetTitle - Formset title string + FormSetHelp - Formset help string + +Returns: + EFI_SUCCESS - Successfully extract Class for specified Hii handle. + +--*/ +{ + EFI_STATUS Status; + UINTN BufferSize; + EFI_HII_DATABASE_PROTOCOL *HiiDatabase; + EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList; + UINT8 *Package; + UINT8 *FormSet; + UINT8 *OpCodeData; + UINT32 Offset; + UINT32 Offset2; + UINT32 PackageListLength; + EFI_HII_PACKAGE_HEADER PackageHeader; + + if (NumberOfClassGuid == NULL || ClassGuid == NULL || FormSetTitle == NULL || FormSetHelp == NULL) { + return EFI_INVALID_PARAMETER; + } + + *NumberOfClassGuid = 0; + *ClassGuid = NULL; + *FormSetTitle = 0; + *FormSetHelp = 0; + + // + // Locate HII Database protocol + // + Status = gBS->LocateProtocol ( + &gEfiHiiDatabaseProtocolGuid, + NULL, + &HiiDatabase + ); + if (EFI_ERROR (Status)) { + return Status; + } + + // + // Get HII PackageList + // + BufferSize = 0; + HiiPackageList = NULL; + Status = HiiDatabase->ExportPackageLists (HiiDatabase, Handle, &BufferSize, HiiPackageList); + if (Status == EFI_BUFFER_TOO_SMALL) { + HiiPackageList = EfiLibAllocatePool (BufferSize); + ASSERT (HiiPackageList != NULL); + + Status = HiiDatabase->ExportPackageLists (HiiDatabase, Handle, &BufferSize, HiiPackageList); + } + if (EFI_ERROR (Status)) { + return Status; + } + + // + // Get Form package from this HII package List + // + Offset = sizeof (EFI_HII_PACKAGE_LIST_HEADER); + Offset2 = 0; + FormSet = NULL; + EfiCopyMem (&PackageListLength, &HiiPackageList->PackageLength, sizeof (UINT32)); + + while (Offset < PackageListLength) { + Package = ((UINT8 *) HiiPackageList) + Offset; + EfiCopyMem (&PackageHeader, Package, sizeof (EFI_HII_PACKAGE_HEADER)); + + if (PackageHeader.Type == EFI_HII_PACKAGE_FORMS) { + // + // Search Class Opcode in this Form Package + // + Offset2 = sizeof (EFI_HII_PACKAGE_HEADER); + while (Offset2 < PackageHeader.Length) { + OpCodeData = Package + Offset2; + if (OpCodeData == NULL) { + return EFI_NOT_FOUND; + } + + if (((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode == EFI_IFR_FORM_SET_OP) { + // + // Find FormSet OpCode + // + EfiCopyMem (FormSetTitle, &((EFI_IFR_FORM_SET *) OpCodeData)->FormSetTitle, sizeof (EFI_STRING_ID)); + EfiCopyMem (FormSetHelp, &((EFI_IFR_FORM_SET *) OpCodeData)->Help, sizeof (EFI_STRING_ID)); + if (((EFI_IFR_OP_HEADER *) OpCodeData)->Length > ((UINTN) &((EFI_IFR_FORM_SET *) 0)->Flags)) { + // + // New version of formset OpCode + // + *NumberOfClassGuid = ((EFI_IFR_FORM_SET *) OpCodeData)->Flags & 0x3; + *ClassGuid = EfiLibAllocateCopyPool ( + *NumberOfClassGuid * sizeof (EFI_GUID), + ((EFI_IFR_FORM_SET *) OpCodeData)->ClassGuid + ); + } + break; + } + + Offset2 += ((EFI_IFR_OP_HEADER *) OpCodeData)->Length; + } + + if (Offset2 < PackageHeader.Length) { + // + // Target formset found + // + break; + } + } + + Offset += PackageHeader.Length; + } + + gBS->FreePool (HiiPackageList); + + return EFI_SUCCESS; +} diff --git a/EDK/Foundation/Library/Dxe/UefiEfiIfrSupportLib/UefiIfrForm.c b/EDK/Foundation/Library/Dxe/UefiEfiIfrSupportLib/UefiIfrForm.c new file mode 100644 index 0000000..0fe6582 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/UefiEfiIfrSupportLib/UefiIfrForm.c @@ -0,0 +1,2249 @@ +/*++ + +Copyright (c) 2007 - 2008, 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: + + UefiIfrForm.c + +Abstract: + + Common Library Routines to assist handle HII elements. + +--*/ + +#include "UefiIfrLibrary.h" + +// +// Fake +// +UINT16 mFakeConfigHdr[] = L"GUID=00000000000000000000000000000000&NAME=0000&PATH=0"; + +STATIC +EFI_STATUS +GetPackageDataFromPackageList ( + IN EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList, + IN UINT32 PackageIndex, + OUT UINT32 *BufferLen, + OUT EFI_HII_PACKAGE_HEADER **Buffer + ) +{ + UINT32 Index; + EFI_HII_PACKAGE_HEADER *Package; + UINT32 Offset; + UINT32 PackageListLength; + EFI_HII_PACKAGE_HEADER PackageHeader = {0, 0}; + + ASSERT(HiiPackageList != NULL); + + if ((BufferLen == NULL) || (Buffer == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Package = NULL; + Index = 0; + Offset = sizeof (EFI_HII_PACKAGE_LIST_HEADER); + EfiCopyMem (&PackageListLength, &HiiPackageList->PackageLength, sizeof (UINT32)); + while (Offset < PackageListLength) { + Package = (EFI_HII_PACKAGE_HEADER *) (((UINT8 *) HiiPackageList) + Offset); + EfiCopyMem (&PackageHeader, Package, sizeof (EFI_HII_PACKAGE_HEADER)); + if (Index == PackageIndex) { + break; + } + Offset += PackageHeader.Length; + Index++; + } + if (Offset >= PackageListLength) { + // + // no package found in this Package List + // + return EFI_NOT_FOUND; + } + + *BufferLen = PackageHeader.Length; + *Buffer = Package; + return EFI_SUCCESS; +} + +STATIC +EFI_STATUS +UpdateFormPackageData ( + IN EFI_GUID *FormSetGuid, + IN EFI_FORM_ID FormId, + IN EFI_HII_PACKAGE_HEADER *Package, + IN UINT32 PackageLength, + IN UINT16 Label, + IN BOOLEAN Insert, + IN EFI_HII_UPDATE_DATA *Data, + OUT UINT8 **TempBuffer, + OUT UINT32 *TempBufferSize + ) +{ + UINT8 *BufferPos; + EFI_HII_PACKAGE_HEADER PackageHeader; + UINT32 Offset; + EFI_IFR_OP_HEADER *IfrOpHdr; + BOOLEAN GetFormSet; + BOOLEAN GetForm; + UINT8 ExtendOpCode; + UINT16 LabelNumber; + BOOLEAN Updated; + + if ((TempBuffer == NULL) || (TempBufferSize == NULL)) { + return EFI_INVALID_PARAMETER; + } + + *TempBufferSize = PackageLength; + if (Data != NULL) { + *TempBufferSize += Data->Offset; + } + *TempBuffer = EfiLibAllocateZeroPool (*TempBufferSize); + if (*TempBuffer == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + EfiCopyMem (*TempBuffer, Package, sizeof (EFI_HII_PACKAGE_HEADER)); + *TempBufferSize = sizeof (EFI_HII_PACKAGE_HEADER); + BufferPos = *TempBuffer + sizeof (EFI_HII_PACKAGE_HEADER); + + EfiCopyMem (&PackageHeader, Package, sizeof (EFI_HII_PACKAGE_HEADER)); + IfrOpHdr = (EFI_IFR_OP_HEADER *)((UINT8 *) Package + sizeof (EFI_HII_PACKAGE_HEADER)); + Offset = sizeof (EFI_HII_PACKAGE_HEADER); + GetFormSet = (FormSetGuid == NULL) ? TRUE : FALSE; + GetForm = FALSE; + Updated = FALSE; + + while (!Updated && Offset < PackageHeader.Length) { + EfiCopyMem (BufferPos, IfrOpHdr, IfrOpHdr->Length); + BufferPos += IfrOpHdr->Length; + *TempBufferSize += IfrOpHdr->Length; + + switch (IfrOpHdr->OpCode) { + case EFI_IFR_FORM_SET_OP : + if (FormSetGuid != NULL) { + if (EfiCompareMem (&((EFI_IFR_FORM_SET *) IfrOpHdr)->Guid, FormSetGuid, sizeof (EFI_GUID)) == 0) { + GetFormSet = TRUE; + } else { + GetFormSet = FALSE; + } + } + break; + + case EFI_IFR_FORM_OP: + if (EfiCompareMem (&((EFI_IFR_FORM *) IfrOpHdr)->FormId, &FormId, sizeof (EFI_FORM_ID)) == 0) { + GetForm = TRUE; + } else { + GetForm = FALSE; + } + break; + + case EFI_IFR_GUID_OP : + if (!GetFormSet || !GetForm) { + // + // Go to the next Op-Code + // + break; + } + + if (!EfiCompareGuid (&((EFI_IFR_GUID *) IfrOpHdr)->Guid, &mIfrVendorGuid)) { + // + // GUID mismatch, skip this op-code + // + break; + } + + ExtendOpCode = ((EFI_IFR_GUID_LABEL *) IfrOpHdr)->ExtendOpCode; + EfiCopyMem (&LabelNumber, &((EFI_IFR_GUID_LABEL *)IfrOpHdr)->Number, sizeof (UINT16)); + if ((ExtendOpCode != EFI_IFR_EXTEND_OP_LABEL) || (LabelNumber != Label)) { + // + // Go to the next Op-Code + // + break; + } + + if (Insert) { + // + // Insert data after current Label, skip myself + // + Offset += IfrOpHdr->Length; + IfrOpHdr = (EFI_IFR_OP_HEADER *) ((CHAR8 *) (IfrOpHdr) + IfrOpHdr->Length); + } else { + // + // Replace data between two paired Label, try to find the next Label. + // + while (TRUE) { + Offset += IfrOpHdr->Length; + // + // Search the next label and Fail if not label found. + // + if (Offset >= PackageHeader.Length) { + goto Fail; + } + IfrOpHdr = (EFI_IFR_OP_HEADER *) ((CHAR8 *) (IfrOpHdr) + IfrOpHdr->Length); + if (IfrOpHdr->OpCode == EFI_IFR_GUID_OP) { + ExtendOpCode = ((EFI_IFR_GUID_LABEL *) IfrOpHdr)->ExtendOpCode; + if (EfiCompareGuid (&((EFI_IFR_GUID *) IfrOpHdr)->Guid, &mIfrVendorGuid) && ExtendOpCode == EFI_IFR_EXTEND_OP_LABEL) { + break; + } + } + } + } + + // + // Fill in the update data + // + if (Data != NULL) { + EfiCopyMem (BufferPos, Data->Data, Data->Offset); + BufferPos += Data->Offset; + *TempBufferSize += Data->Offset; + } + + // + // Copy the reset data + // + EfiCopyMem (BufferPos, IfrOpHdr, PackageHeader.Length - Offset); + *TempBufferSize += PackageHeader.Length - Offset; + + Updated = TRUE; + break; + default : + break; + } + + // + // Go to the next Op-Code + // + Offset += IfrOpHdr->Length; + IfrOpHdr = (EFI_IFR_OP_HEADER *) ((CHAR8 *) (IfrOpHdr) + IfrOpHdr->Length); + } + + // + // Update the package length. + // + PackageHeader.Length = *TempBufferSize; + EfiCopyMem (*TempBuffer, &PackageHeader, sizeof (EFI_HII_PACKAGE_HEADER)); + +Fail: + if (!Updated) { + gBS->FreePool (*TempBuffer); + *TempBufferSize = 0; + return EFI_NOT_FOUND; + } + + return EFI_SUCCESS; +} + +EFI_STATUS +IfrLibInitUpdateData ( + IN OUT EFI_HII_UPDATE_DATA *UpdateData, + IN UINT32 BufferSize + ) +/*++ + +Routine Description: + This function initialize the data structure for dynamic opcode. + +Arguments: + UpdateData - The adding data; + BufferSize - Length of the buffer to fill dynamic opcodes. + +Returns: + EFI_SUCCESS - Update data is initialized. + EFI_INVALID_PARAMETER - UpdateData is NULL. + EFI_OUT_OF_RESOURCES - No enough memory to allocate. + +--*/ +{ + if (UpdateData == NULL) { + return EFI_INVALID_PARAMETER; + } + + UpdateData->BufferSize = BufferSize; + UpdateData->Offset = 0; + UpdateData->Data = EfiLibAllocatePool (BufferSize); + + return (UpdateData->Data != NULL) ? EFI_SUCCESS : EFI_OUT_OF_RESOURCES; +} + +EFI_STATUS +IfrLibFreeUpdateData ( + IN EFI_HII_UPDATE_DATA *UpdateData + ) +/*++ + +Routine Description: + This function free the resource of update data. + +Arguments: + UpdateData - The adding data; + +Returns: + EFI_SUCCESS - Resource in UpdateData is released. + EFI_INVALID_PARAMETER - UpdateData is NULL. + +--*/ +{ + EFI_STATUS Status; + + if (UpdateData == NULL) { + return EFI_INVALID_PARAMETER; + } + + Status = gBS->FreePool (UpdateData->Data); + UpdateData->Data = NULL; + + return Status; +} + +EFI_STATUS +IfrLibUpdateForm ( + IN EFI_HII_HANDLE Handle, + IN EFI_GUID *FormSetGuid, OPTIONAL + IN EFI_FORM_ID FormId, + IN UINT16 Label, + IN BOOLEAN Insert, + IN EFI_HII_UPDATE_DATA *Data + ) +/*++ + +Routine Description: + This function allows the caller to update a form that has + previously been registered with the EFI HII database. + +Arguments: + Handle - Hii Handle + FormSetGuid - The formset should be updated. + FormId - The form should be updated. + Label - Update information starting immediately after this label in the IFR + Insert - If TRUE and Data is not NULL, insert data after Label. + If FALSE, replace opcodes between two labels with Data + Data - The adding data; If NULL, remove opcodes between two Label. + +Returns: + EFI_SUCCESS - Update success. + Other - Update fail. + +--*/ +{ + EFI_STATUS Status; + EFI_HII_DATABASE_PROTOCOL *HiiDatabase; + EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList; + UINT32 Index; + EFI_HII_PACKAGE_LIST_HEADER *UpdateBuffer; + UINTN BufferSize; + UINT8 *UpdateBufferPos; + EFI_HII_PACKAGE_HEADER PackageHeader; + EFI_HII_PACKAGE_HEADER *Package; + UINT32 PackageLength; + EFI_HII_PACKAGE_HEADER *TempBuffer; + UINT32 TempBufferSize; + BOOLEAN Updated; + + if (Data == NULL) { + return EFI_INVALID_PARAMETER; + } + + LocateHiiProtocols (); + HiiDatabase = gIfrLibHiiDatabase; + + // + // Get the orginal package list + // + BufferSize = 0; + HiiPackageList = NULL; + Status = HiiDatabase->ExportPackageLists (HiiDatabase, Handle, &BufferSize, HiiPackageList); + if (Status == EFI_BUFFER_TOO_SMALL) { + HiiPackageList = EfiLibAllocatePool (BufferSize); + ASSERT (HiiPackageList != NULL); + + Status = HiiDatabase->ExportPackageLists (HiiDatabase, Handle, &BufferSize, HiiPackageList); + if (EFI_ERROR (Status)) { + gBS->FreePool (HiiPackageList); + return Status; + } + } + + // + // Calculate and allocate space for retrieval of IFR data + // + BufferSize += Data->Offset; + UpdateBuffer = EfiLibAllocateZeroPool (BufferSize); + if (UpdateBuffer == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + UpdateBufferPos = (UINT8 *) UpdateBuffer; + + // + // copy the package list header + // + EfiCopyMem (UpdateBufferPos, HiiPackageList, sizeof (EFI_HII_PACKAGE_LIST_HEADER)); + UpdateBufferPos += sizeof (EFI_HII_PACKAGE_LIST_HEADER); + + Updated = FALSE; + for (Index = 0; ; Index++) { + Status = GetPackageDataFromPackageList (HiiPackageList, Index, &PackageLength, &Package); + if (Status == EFI_SUCCESS) { + EfiCopyMem (&PackageHeader, Package, sizeof (EFI_HII_PACKAGE_HEADER)); + if ((PackageHeader.Type == EFI_HII_PACKAGE_FORMS) && !Updated) { + Status = UpdateFormPackageData (FormSetGuid, FormId, Package, PackageLength, Label, Insert, Data, (UINT8 **)&TempBuffer, &TempBufferSize); + if (!EFI_ERROR(Status)) { + if (FormSetGuid == NULL) { + Updated = TRUE; + } + EfiCopyMem (UpdateBufferPos, TempBuffer, TempBufferSize); + UpdateBufferPos += TempBufferSize; + gBS->FreePool (TempBuffer); + continue; + } + } + + EfiCopyMem (UpdateBufferPos, Package, PackageLength); + UpdateBufferPos += PackageLength; + } else if (Status == EFI_NOT_FOUND) { + break; + } else { + gBS->FreePool (HiiPackageList); + return Status; + } + } + + // + // Update package list length + // + BufferSize = UpdateBufferPos - (UINT8 *) UpdateBuffer; + EfiCopyMem (&UpdateBuffer->PackageLength, &BufferSize, sizeof (UINT32)); + + gBS->FreePool (HiiPackageList); + + return HiiDatabase->UpdatePackageList (HiiDatabase, Handle, UpdateBuffer); +} + +EFI_STATUS +IfrLibCreatePopUp ( + IN UINTN NumberOfLines, + OUT EFI_INPUT_KEY *KeyValue, + IN CHAR16 *String, + ... + ) +/*++ + +Routine Description: + Draw a dialog and return the selected key. + +Arguments: + NumberOfLines - The number of lines for the dialog box + KeyValue - The EFI_KEY value returned if HotKey is TRUE.. + String - Pointer to the first string in the list + ... - A series of (quantity == NumberOfLines) text strings which + will be used to construct the dialog box + +Returns: + EFI_SUCCESS - Displayed dialog and received user interaction + EFI_INVALID_PARAMETER - One of the parameters was invalid. + +--*/ +{ + UINTN Index; + UINTN Count; + UINTN Start; + UINTN End; + UINTN Top; + UINTN Bottom; + CHAR16 *StringPtr; + UINTN LeftColumn; + UINTN RightColumn; + UINTN TopRow; + UINTN BottomRow; + UINTN DimensionsWidth; + UINTN DimensionsHeight; + VA_LIST Marker; + EFI_INPUT_KEY Key; + UINTN LargestString; + CHAR16 *StackString; + EFI_STATUS Status; + UINTN StringLen; + CHAR16 *LineBuffer; + CHAR16 **StringArray; + EFI_EVENT TimerEvent; + EFI_EVENT WaitList[2]; + UINTN CurrentAttribute; + EFI_SIMPLE_TEXT_OUT_PROTOCOL *ConOut; + + if ((KeyValue == NULL) || (String == NULL)) { + return EFI_INVALID_PARAMETER; + } + + TopRow = 0; + BottomRow = 0; + LeftColumn = 0; + RightColumn = 0; + + ConOut = gST->ConOut; + ConOut->QueryMode (ConOut, ConOut->Mode->Mode, &RightColumn, &BottomRow); + + DimensionsWidth = RightColumn - LeftColumn; + DimensionsHeight = BottomRow - TopRow; + + CurrentAttribute = ConOut->Mode->Attribute; + + LineBuffer = EfiLibAllocateZeroPool (DimensionsWidth * sizeof (CHAR16)); + ASSERT (LineBuffer != NULL); + + // + // Determine the largest string in the dialog box + // Notice we are starting with 1 since String is the first string + // + StringArray = EfiLibAllocateZeroPool (NumberOfLines * sizeof (CHAR16 *)); + LargestString = EfiStrLen (String); + StringArray[0] = String; + + VA_START (Marker, String); + for (Index = 1; Index < NumberOfLines; Index++) { + StackString = VA_ARG (Marker, CHAR16 *); + + if (StackString == NULL) { + return EFI_INVALID_PARAMETER; + } + + StringArray[Index] = StackString; + StringLen = EfiStrLen (StackString); + if (StringLen > LargestString) { + LargestString = StringLen; + } + } + + if ((LargestString + 2) > DimensionsWidth) { + LargestString = DimensionsWidth - 2; + } + + // + // Subtract the PopUp width from total Columns, allow for one space extra on + // each end plus a border. + // + Start = (DimensionsWidth - LargestString - 2) / 2 + LeftColumn + 1; + End = Start + LargestString + 1; + + Top = ((DimensionsHeight - NumberOfLines - 2) / 2) + TopRow - 1; + Bottom = Top + NumberOfLines + 2; + + // + // Disable cursor + // + ConOut->EnableCursor (ConOut, FALSE); + ConOut->SetAttribute (ConOut, EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE); + + StringPtr = &LineBuffer[0]; + *StringPtr++ = BOXDRAW_DOWN_RIGHT; + for (Index = 0; Index < LargestString; Index++) { + *StringPtr++ = BOXDRAW_HORIZONTAL; + } + *StringPtr++ = BOXDRAW_DOWN_LEFT; + *StringPtr = L'\0'; + + ConOut->SetCursorPosition (ConOut, Start, Top); + ConOut->OutputString (ConOut, LineBuffer); + + for (Index = 0; Index < NumberOfLines; Index++) { + StringPtr = &LineBuffer[0]; + *StringPtr++ = BOXDRAW_VERTICAL; + + for (Count = 0; Count < LargestString; Count++) { + StringPtr[Count] = L' '; + } + + StringLen = EfiStrLen (StringArray[Index]); + if (StringLen > LargestString) { + StringLen = LargestString; + } + EfiCopyMem ( + StringPtr + ((LargestString - StringLen) / 2), + StringArray[Index], + StringLen * sizeof (CHAR16) + ); + StringPtr += LargestString; + + *StringPtr++ = BOXDRAW_VERTICAL; + *StringPtr = L'\0'; + + ConOut->SetCursorPosition (ConOut, Start, Top + 1 + Index); + ConOut->OutputString (ConOut, LineBuffer); + } + + StringPtr = &LineBuffer[0]; + *StringPtr++ = BOXDRAW_UP_RIGHT; + for (Index = 0; Index < LargestString; Index++) { + *StringPtr++ = BOXDRAW_HORIZONTAL; + } + *StringPtr++ = BOXDRAW_UP_LEFT; + *StringPtr = L'\0'; + + ConOut->SetCursorPosition (ConOut, Start, Top + NumberOfLines + 1); + ConOut->OutputString (ConOut, LineBuffer); + + do { + Status = gBS->CreateEvent (EFI_EVENT_TIMER, 0, NULL, NULL, &TimerEvent); + + // + // Set a timer event of 1 second expiration + // + gBS->SetTimer ( + TimerEvent, + TimerRelative, + 10000000 + ); + + // + // Wait for the keystroke event or the timer + // + WaitList[0] = gST->ConIn->WaitForKey; + WaitList[1] = TimerEvent; + Status = gBS->WaitForEvent (2, WaitList, &Index); + + // + // Check for the timer expiration + // + if (!EFI_ERROR (Status) && Index == 1) { + Status = EFI_TIMEOUT; + } + + gBS->CloseEvent (TimerEvent); + } while (Status == EFI_TIMEOUT); + + Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key); + EfiCopyMem (KeyValue, &Key, sizeof (EFI_INPUT_KEY)); + + ConOut->SetAttribute (ConOut, CurrentAttribute); + ConOut->EnableCursor (ConOut, TRUE); + + return Status; +} + +EFI_STATUS +ExtractDefault( + IN VOID *Buffer, + IN UINTN *BufferSize, + UINTN Number, + ... + ) +/*++ + + Routine Description: + + Configure the buffer accrording to ConfigBody strings. + + Arguments: + DefaultId - the ID of default. + Buffer - the start address of buffer. + BufferSize - the size of buffer. + Number - the number of the strings. + + Returns: + EFI_BUFFER_TOO_SMALL - the BufferSize is too small to operate. + EFI_INVALID_PARAMETER - Buffer is NULL or BufferSize is 0. + EFI_SUCCESS - Operation successful. + +--*/ +{ + VA_LIST Args; + UINTN Index; + UINT32 TotalLen; + UINT8 *BufCfgArray; + UINT8 *BufferPos; + UINT16 Offset; + UINT16 Width; + UINT8 *Value; + + if ((Buffer == NULL) || (BufferSize == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Offset = 0; + Width = 0; + Value = NULL; + + VA_START (Args, Number); + for (Index = 0; Index < Number; Index++) { + BufCfgArray = (UINT8 *) VA_ARG (Args, VOID *); + EfiCopyMem (&TotalLen, BufCfgArray, sizeof (UINT32)); + BufferPos = BufCfgArray + sizeof (UINT32); + + while ((UINT32)(BufferPos - BufCfgArray) < TotalLen) { + EfiCopyMem (&Offset, BufferPos, sizeof (UINT16)); + BufferPos += sizeof (UINT16); + EfiCopyMem (&Width, BufferPos, sizeof (UINT16)); + BufferPos += sizeof (UINT16); + Value = BufferPos; + BufferPos += Width; + + if ((UINTN)(Offset + Width) > *BufferSize) { + return EFI_BUFFER_TOO_SMALL; + } + + EfiCopyMem ((UINT8 *)Buffer + Offset, Value, Width); + } + } + VA_END (Args); + + *BufferSize = (UINTN)Offset; + + return EFI_SUCCESS; +} + +EFI_STATUS +ExtractBlockName ( + IN UINT8 *Buffer, + OUT CHAR16 **BlockName + ) +/*++ + + Routine Description: + + Extract block name from the array generated by VFR compiler. The name of + this array is "Vfr + + BlockName", e.g. "VfrMyIfrNVDataBlockName". + Format of this array is: + Array length | 4-bytes + Offset | 2-bytes + Width | 2-bytes + Offset | 2-bytes + Width | 2-bytes + ... ... + + Arguments: + Buffer - Array generated by VFR compiler. + BlockName - The returned + + Returns: + EFI_OUT_OF_RESOURCES - Run out of memory resource. + EFI_INVALID_PARAMETER - Buffer is NULL or BlockName is NULL. + EFI_SUCCESS - Operation successful. + +--*/ +{ + UINTN Index; + UINT32 Length; + UINT32 BlockNameNumber; + UINTN HexStringBufferLen; + CHAR16 *StringPtr; + + if ((Buffer == NULL) || (BlockName == NULL)) { + return EFI_INVALID_PARAMETER; + } + + // + // Calculate number of Offset/Width pair + // + EfiCopyMem (&Length, Buffer, sizeof (UINT32)); + BlockNameNumber = (Length - sizeof (UINT32)) / (sizeof (UINT16) * 2); + + // + // ::= &OFFSET=1234&WIDTH=1234 + // | 8 | 4 | 7 | 4 | + // + StringPtr = EfiLibAllocateZeroPool ((BlockNameNumber * (8 + 4 + 7 + 4) + 1) * sizeof (CHAR16)); + *BlockName = StringPtr; + if (StringPtr == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + Buffer += sizeof (UINT32); + for (Index = 0; Index < BlockNameNumber; Index++) { + EfiStrCpy (StringPtr, L"&OFFSET="); + StringPtr += 8; + + HexStringBufferLen = 5; + BufToHexString (StringPtr, &HexStringBufferLen, Buffer, sizeof (UINT16)); + Buffer += sizeof (UINT16); + StringPtr += 4; + + EfiStrCpy (StringPtr, L"&WIDTH="); + StringPtr += 7; + + HexStringBufferLen = 5; + BufToHexString (StringPtr, &HexStringBufferLen, Buffer, sizeof (UINT16)); + Buffer += sizeof (UINT16); + StringPtr += 4; + } + + return EFI_SUCCESS; +} + +EFI_STATUS +ExtractBlockConfig ( + IN UINT8 *Buffer, + OUT CHAR16 **BlockConfig + ) +/*++ + + Routine Description: + + Extract block config from the array generated by VFR compiler. The name of + this array is "Vfr + + Default4", e.g. "VfrMyIfrNVDataDefault0000". + + Arguments: + Buffer - Array generated by VFR compiler. + BlockConfig - The returned + + Returns: + EFI_OUT_OF_RESOURCES - Run out of memory resource. + EFI_INVALID_PARAMETER - Buffer is NULL or BlockConfig is NULL. + EFI_SUCCESS - Operation successful. + +--*/ +{ + UINT32 Length; + UINT16 Width; + UINTN HexStringBufferLen; + CHAR16 *StringPtr; + UINT8 *BufferEnd; + CHAR16 *StringEnd; + EFI_STATUS Status; + + if ((Buffer == NULL) || (BlockConfig == NULL)) { + return EFI_INVALID_PARAMETER; + } + + // + // Calculate length of AltResp string + // Format of Default value array is: + // Array length | 4-bytes + // Offset | 2-bytes + // Width | 2-bytes + // Value | Variable length + // Offset | 2-bytes + // Width | 2-bytes + // Value | Variable length + // ... ... + // When value is 1 byte in length, overhead of AltResp string will be maximum, + // BlockConfig ::= <&OFFSET=1234&WIDTH=1234&VALUE=12>+ + // | 8 | 4 | 7 | 4 | 7 |2| + // so the maximum length of BlockConfig could be calculated as: + // (ArrayLength / 5) * (8 + 4 + 7 + 4 + 7 + 2) = ArrayLength * 6.4 < ArrayLength * 7 + // + EfiCopyMem (&Length, Buffer, sizeof (UINT32)); + BufferEnd = Buffer + Length; + StringPtr = EfiLibAllocatePool (Length * 7 * sizeof (CHAR16)); + *BlockConfig = StringPtr; + if (StringPtr == NULL) { + return EFI_OUT_OF_RESOURCES; + } + StringEnd = StringPtr + (Length * 7); + + Buffer += sizeof (UINT32); + while (Buffer < BufferEnd) { + EfiStrCpy (StringPtr, L"&OFFSET="); + StringPtr += 8; + + HexStringBufferLen = 5; + BufToHexString (StringPtr, &HexStringBufferLen, Buffer, sizeof (UINT16)); + Buffer += sizeof (UINT16); + StringPtr += 4; + + EfiStrCpy (StringPtr, L"&WIDTH="); + StringPtr += 7; + + HexStringBufferLen = 5; + BufToHexString (StringPtr, &HexStringBufferLen, Buffer, sizeof (UINT16)); + EfiCopyMem (&Width, Buffer, sizeof (UINT16)); + Buffer += sizeof (UINT16); + StringPtr += 4; + + EfiStrCpy (StringPtr, L"&VALUE="); + StringPtr += 7; + + HexStringBufferLen = StringEnd - StringPtr; + Status = BufToHexString (StringPtr, &HexStringBufferLen, Buffer, Width); + if (EFI_ERROR (Status)) { + return Status; + } + Buffer += Width; + StringPtr += (Width * 2); + } + + return EFI_SUCCESS; +} + +EFI_STATUS +ConstructConfigAltResp ( + IN EFI_STRING ConfigRequest, OPTIONAL + OUT EFI_STRING *Progress, + OUT EFI_STRING *ConfigAltResp, + IN EFI_GUID *Guid, + IN CHAR16 *Name, + IN EFI_HANDLE *DriverHandle, + IN VOID *BufferStorage, + IN UINTN BufferStorageSize, + IN VOID *BlockNameArray, OPTIONAL + IN UINTN NumberAltCfg, + ... +//IN UINT16 AltCfgId, +//IN VOID *DefaultValueArray, + ) +/*++ + + Routine Description: + + Construct for a buffer storage. + + Arguments: + ConfigRequest - The Config request string. If set to NULL, all the + configurable elements will be extracted from BlockNameArray. + ConfigAltResp - The returned . + Progress - On return, points to a character in the Request. + Guid - GUID of the buffer storage. + Name - Name of the buffer storage. + DriverHandle - The DriverHandle which is used to invoke HiiDatabase + protocol interface NewPackageList(). + BufferStorage - Content of the buffer storage. + BufferStorageSize - Length in bytes of the buffer storage. + BlockNameArray - Array generated by VFR compiler. + NumberAltCfg - Number of Default value array generated by VFR compiler. + The sequential input parameters will be number of + AltCfgId and DefaultValueArray pairs. When set to 0, + there will be no . + + Returns: + EFI_OUT_OF_RESOURCES - Run out of memory resource. + EFI_INVALID_PARAMETER - ConfigAltResp is NULL. + EFI_SUCCESS - Operation successful. + +--*/ +{ + EFI_STATUS Status; + CHAR16 *ConfigHdr; + CHAR16 *BlockName; + CHAR16 *DescHdr; + CHAR16 *StringPtr; + CHAR16 **AltCfg; + UINT16 AltCfgId; + VOID *DefaultValueArray; + UINTN StrBufferLen; + EFI_STRING ConfigResp; + EFI_STRING TempStr; + VA_LIST Args; + UINTN AltRespLen; + UINTN Index; + BOOLEAN NeedFreeConfigRequest; + EFI_HII_CONFIG_ROUTING_PROTOCOL *HiiConfigRouting; + + if (ConfigAltResp == NULL) { + return EFI_INVALID_PARAMETER; + } + + // + // Construct : "GUID=...&NAME=...&PATH=..." + // + ConfigHdr = NULL; + StrBufferLen = 0; + Status = ConstructConfigHdr ( + ConfigHdr, + &StrBufferLen, + Guid, + Name, + DriverHandle + ); + if (Status == EFI_BUFFER_TOO_SMALL) { + ConfigHdr = EfiLibAllocateZeroPool (StrBufferLen); + Status = ConstructConfigHdr ( + ConfigHdr, + &StrBufferLen, + Guid, + Name, + DriverHandle + ); + } + + if (EFI_ERROR (Status)) { + return Status; + } + + // + // Construct + // + NeedFreeConfigRequest = FALSE; + if (ConfigRequest == NULL) { + // + // If ConfigRequest is set to NULL, export all configurable elements in BlockNameArray + // + Status = ExtractBlockName (BlockNameArray, &BlockName); + if (EFI_ERROR (Status)) { + return Status; + } + + ConfigRequest = EfiLibAllocateZeroPool (EfiStrSize (ConfigHdr) + EfiStrSize (BlockName) - sizeof (CHAR16)); + EfiStrCpy (ConfigRequest, ConfigHdr); + EfiStrCat (ConfigRequest, BlockName); + NeedFreeConfigRequest = TRUE; + } + + Status = gBS->LocateProtocol (&gEfiHiiConfigRoutingProtocolGuid, NULL, &HiiConfigRouting); + if (EFI_ERROR (Status)) { + return Status; + } + + Status = HiiConfigRouting->BlockToConfig ( + HiiConfigRouting, + ConfigRequest, + BufferStorage, + BufferStorageSize, + &ConfigResp, + (Progress == NULL) ? &TempStr : Progress + ); + if (EFI_ERROR (Status)) { + return Status; + } + + // + // Construct + // + DescHdr = EfiLibAllocateZeroPool (NumberAltCfg * 16 * sizeof (CHAR16)); + StringPtr = DescHdr; + AltCfg = EfiLibAllocateZeroPool (NumberAltCfg * sizeof (CHAR16 *)); + AltRespLen = 0; + VA_START (Args, NumberAltCfg); + for (Index = 0; Index < NumberAltCfg; Index++) { + AltCfgId = (UINT16) VA_ARG (Args, UINT16); + DefaultValueArray = (UINT8 *) VA_ARG (Args, VOID *); + + // + // '&' + // + AltRespLen += (EfiStrLen (ConfigHdr) + 1); + + StringPtr = DescHdr + Index * 16; + EfiStrCpy (StringPtr, L"&ALTCFG="); + AltRespLen += (8 + sizeof (UINT16) * 2); + + StrBufferLen = 5; + BufToHexString (StringPtr + 8, &StrBufferLen, (UINT8 *) &AltCfgId, sizeof (UINT16)); + Status = ExtractBlockConfig (DefaultValueArray, &AltCfg[Index]); + if (EFI_ERROR (Status)) { + return Status; + } + AltRespLen += EfiStrLen (AltCfg[Index]); + } + VA_END (Args); + + // + // Generate the final + // + StrBufferLen = (EfiStrLen ((CHAR16 *) ConfigResp) + AltRespLen + 1) * sizeof (CHAR16); + TempStr = EfiLibAllocateZeroPool (StrBufferLen); + *ConfigAltResp = TempStr; + if (TempStr == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + // + // ::= ['&' ]* + // + EfiStrCpy (TempStr, ConfigResp); + for (Index = 0; Index < NumberAltCfg; Index++) { + EfiStrCat (TempStr, L"&"); + EfiStrCat (TempStr, ConfigHdr); + EfiStrCat (TempStr, DescHdr + Index * 16); + EfiStrCat (TempStr, AltCfg[Index]); + + gBS->FreePool (AltCfg[Index]); + } + + if (NeedFreeConfigRequest) { + gBS->FreePool (ConfigRequest); + } + gBS->FreePool (ConfigHdr); + gBS->FreePool (ConfigResp); + gBS->FreePool (DescHdr); + gBS->FreePool (AltCfg); + + return EFI_SUCCESS; +} + +STATIC +VOID +SwapBuffer ( + IN OUT UINT8 *Buffer, + IN UINTN BufferSize + ) +/*++ + +Routine Description: + Swap bytes in the buffer. + +Arguments: + Buffer - Binary buffer. + BufferSize - Size of the buffer in bytes. + +Returns: + None. + +--*/ +{ + UINTN Index; + UINT8 Temp; + UINTN SwapCount; + + SwapCount = BufferSize / 2; + for (Index = 0; Index < SwapCount; Index++) { + Temp = Buffer[Index]; + Buffer[Index] = Buffer[BufferSize - 1 - Index]; + Buffer[BufferSize - 1 - Index] = Temp; + } +} + +VOID +ToLower ( + IN OUT CHAR16 *Str + ) +/*++ + +Routine Description: + Converts the unicode character of the string from uppercase to lowercase. + +Arguments: + Str - String to be converted + +Returns: + +--*/ +{ + CHAR16 *Ptr; + + for (Ptr = Str; *Ptr != L'\0'; Ptr++) { + if (*Ptr >= L'A' && *Ptr <= L'Z') { + *Ptr = (CHAR16) (*Ptr - L'A' + L'a'); + } + } +} + +EFI_STATUS +BufferToHexString ( + IN OUT CHAR16 *Str, + IN UINT8 *Buffer, + IN UINTN BufferSize + ) +/*++ + +Routine Description: + Converts binary buffer to Unicode string in reversed byte order from BufToHexString(). + +Arguments: + Str - String for output + Buffer - Binary buffer. + BufferSize - Size of the buffer in bytes. + +Returns: + EFI_SUCCESS - The function completed successfully. + +--*/ +{ + EFI_STATUS Status; + UINT8 *NewBuffer; + UINTN StrBufferLen; + + NewBuffer = EfiLibAllocateCopyPool (BufferSize, Buffer); + SwapBuffer (NewBuffer, BufferSize); + + StrBufferLen = BufferSize * 2 + 1; + Status = BufToHexString (Str, &StrBufferLen, NewBuffer, BufferSize); + + gBS->FreePool (NewBuffer); + // + // Convert the uppercase to lowercase since is defined in lowercase format. + // + ToLower (Str); + + return Status; +} + +EFI_STATUS +HexStringToBuffer ( + IN OUT UINT8 *Buffer, + IN OUT UINTN *BufferSize, + IN CHAR16 *Str + ) +/*++ + +Routine Description: + Converts Hex String to binary buffer in reversed byte order from HexStringToBuf(). + +Arguments: + Buffer - Pointer to buffer that receives the data. + BufferSize - Length in bytes of the buffer to hold converted data. + If routine return with EFI_SUCCESS, containing length of converted data. + If routine return with EFI_BUFFER_TOO_SMALL, containg length of buffer desired. + Str - String to be converted from. + +Returns: + EFI_SUCCESS - The function completed successfully. + +--*/ +{ + EFI_STATUS Status; + UINTN ConvertedStrLen; + + ConvertedStrLen = 0; + Status = HexStringToBuf (Buffer, BufferSize, Str, &ConvertedStrLen); + if (!EFI_ERROR (Status)) { + SwapBuffer (Buffer, (ConvertedStrLen + 1) / 2); + } + + return Status; +} + +EFI_STATUS +ConfigStringToUnicode ( + IN OUT CHAR16 *UnicodeString, + IN OUT UINTN *StrBufferLen, + IN CHAR16 *ConfigString + ) +/*++ + +Routine Description: + Convert binary representation Config string (e.g. "0041004200430044") to the + original string (e.g. "ABCD"). Config string appears in (i.e. + "&NAME="), or Name/Value pair in (i.e. "label="). + +Arguments: + UnicodeString - Original Unicode string. + StrBufferLen - On input: Length in bytes of buffer to hold the Unicode string. + Includes tailing '\0' character. + On output: + If return EFI_SUCCESS, containing length of Unicode string buffer. + If return EFI_BUFFER_TOO_SMALL, containg length of string buffer desired. + ConfigString - Binary representation of Unicode String, := (4)+ + +Returns: + EFI_SUCCESS - Routine success. + EFI_BUFFER_TOO_SMALL - The string buffer is too small. + +--*/ +{ + UINTN Index; + UINTN Len; + UINTN BufferSize; + CHAR16 BackupChar; + + Len = EfiStrLen (ConfigString) / 4; + BufferSize = (Len + 1) * sizeof (CHAR16); + + if (*StrBufferLen < BufferSize) { + *StrBufferLen = BufferSize; + return EFI_BUFFER_TOO_SMALL; + } + + *StrBufferLen = BufferSize; + + for (Index = 0; Index < Len; Index++) { + BackupChar = ConfigString[4]; + ConfigString[4] = L'\0'; + + HexStringToBuf ((UINT8 *) UnicodeString, &BufferSize, ConfigString, NULL); + + ConfigString[4] = BackupChar; + + ConfigString += 4; + UnicodeString += 1; + } + + // + // Add tailing '\0' character + // + *UnicodeString = L'\0'; + + return EFI_SUCCESS; +} + +EFI_STATUS +UnicodeToConfigString ( + IN OUT CHAR16 *ConfigString, + IN OUT UINTN *StrBufferLen, + IN CHAR16 *UnicodeString + ) +/*++ + +Routine Description: + Convert Unicode string to binary representation Config string, e.g. + "ABCD" => "0041004200430044". Config string appears in (i.e. + "&NAME="), or Name/Value pair in (i.e. "label="). + +Arguments: + ConfigString - Binary representation of Unicode String, := (4)+ + StrBufferLen - On input: Length in bytes of buffer to hold the Unicode string. + Includes tailing '\0' character. + On output: + If return EFI_SUCCESS, containing length of Unicode string buffer. + If return EFI_BUFFER_TOO_SMALL, containg length of string buffer desired. + UnicodeString - Original Unicode string. + +Returns: + EFI_SUCCESS - Routine success. + EFI_BUFFER_TOO_SMALL - The string buffer is too small. + +--*/ +{ + UINTN Index; + UINTN Len; + UINTN BufferSize; + CHAR16 *String; + + Len = EfiStrLen (UnicodeString); + BufferSize = (Len * 4 + 1) * sizeof (CHAR16); + + if (*StrBufferLen < BufferSize) { + *StrBufferLen = BufferSize; + return EFI_BUFFER_TOO_SMALL; + } + + *StrBufferLen = BufferSize; + String = ConfigString; + + for (Index = 0; Index < Len; Index++) { + BufToHexString (ConfigString, &BufferSize, (UINT8 *) UnicodeString, 2); + + ConfigString += 4; + UnicodeString += 1; + } + + // + // Add tailing '\0' character + // + *ConfigString = L'\0'; + + // + // Convert the uppercase to lowercase since is defined in lowercase format. + // + ToLower (String); + return EFI_SUCCESS; +} + +EFI_STATUS +ConstructConfigHdr ( + IN OUT CHAR16 *ConfigHdr, + IN OUT UINTN *StrBufferLen, + IN EFI_GUID *Guid, + IN CHAR16 *Name, OPTIONAL + IN EFI_HANDLE *DriverHandle + ) +/*++ + +Routine Description: + Construct using routing information GUID/NAME/PATH. + +Arguments: + ConfigHdr - Pointer to the ConfigHdr string. + StrBufferLen - On input: Length in bytes of buffer to hold the ConfigHdr string. + Includes tailing '\0' character. + On output: + If return EFI_SUCCESS, containing length of ConfigHdr string buffer. + If return EFI_BUFFER_TOO_SMALL, containg length of string buffer desired. + Guid - Routing information: GUID. + Name - Routing information: NAME. + DriverHandle - Driver handle which contains the routing information: PATH. + +Returns: + EFI_SUCCESS - Routine success. + EFI_BUFFER_TOO_SMALL - The ConfigHdr string buffer is too small. + +--*/ +{ + EFI_STATUS Status; + UINTN NameStrLen; + UINTN DevicePathSize; + UINTN BufferSize; + CHAR16 *StrPtr; + EFI_DEVICE_PATH_PROTOCOL *DevicePath; + + if (Name == NULL) { + // + // There will be no "NAME" in for Name/Value storage + // + NameStrLen = 0; + } else { + // + // For buffer storage + // + NameStrLen = EfiStrLen (Name); + } + + // + // Retrieve DevicePath Protocol associated with this HiiPackageList + // + Status = gBS->HandleProtocol ( + DriverHandle, + &gEfiDevicePathProtocolGuid, + &DevicePath + ); + if (EFI_ERROR (Status)) { + return Status; + } + + DevicePathSize = EfiDevicePathSize (DevicePath); + + // + // GUID=32&NAME=NameStrLen&PATH=DevicePathStrLen + // | 5 | 32 | 6 | NameStrLen*4 | 6 | DevicePathStrLen | 1 | + // + BufferSize = (5 + 32 + 6 + NameStrLen * 4 + 6 + DevicePathSize * 2 + 1) * sizeof (CHAR16); + if (*StrBufferLen < BufferSize) { + *StrBufferLen = BufferSize; + return EFI_BUFFER_TOO_SMALL; + } + + *StrBufferLen = BufferSize; + + StrPtr = ConfigHdr; + + EfiStrCpy (StrPtr, L"GUID="); + StrPtr += 5; + BufferToHexString (StrPtr, (UINT8 *) Guid, sizeof (EFI_GUID)); + StrPtr += 32; + + // + // Convert name string, e.g. name "ABCD" => "&NAME=0041004200430044" + // + EfiStrCpy (StrPtr, L"&NAME="); + StrPtr += 6; + if (Name != NULL) { + BufferSize = (NameStrLen * 4 + 1) * sizeof (CHAR16); + UnicodeToConfigString (StrPtr, &BufferSize, Name); + StrPtr += (NameStrLen * 4); + } + + EfiStrCpy (StrPtr, L"&PATH="); + StrPtr += 6; + BufferToHexString (StrPtr, (UINT8 *) DevicePath, DevicePathSize); + + return EFI_SUCCESS; +} + +BOOLEAN +IsConfigHdrMatch ( + IN EFI_STRING ConfigString, + IN EFI_GUID *StorageGuid, OPTIONAL + IN CHAR16 *StorageName OPTIONAL + ) +/*++ + +Routine Description: + Determines if the Routing data (Guid and Name) is correct in . + +Arguments: + ConfigString - Either or . + StorageGuid - GUID of the storage. + StorageName - Name of the stoarge. + +Returns: + TRUE - Routing information is correct in ConfigString. + FALSE - Routing information is incorrect in ConfigString. + +--*/ +{ + EFI_STATUS Status; + BOOLEAN Match; + EFI_GUID Guid; + CHAR16 *Name; + CHAR16 *StrPtr; + UINTN BufferSize; + + // + // ::= + // GUID=32&NAME=NameStrLen&PATH=DevicePathStrLen + // | 5 | 32 | 6 | NameStrLen*4 | 6 | DevicePathStrLen | 1 | + // + if (EfiStrLen (ConfigString) <= (5 + 32 + 6)) { + return FALSE; + } + + // + // Compare GUID + // + if (StorageGuid != NULL) { + + StrPtr = ConfigString + 5 + 32; + if (*StrPtr != L'&') { + return FALSE; + } + *StrPtr = L'\0'; + + BufferSize = sizeof (EFI_GUID); + Status = HexStringToBuffer ( + (UINT8 *) &Guid, + &BufferSize, + ConfigString + 5 + ); + *StrPtr = L'&'; + + if (EFI_ERROR (Status)) { + return FALSE; + } + + if (!EfiCompareGuid (&Guid, StorageGuid)) { + return FALSE; + } + } + + // + // Compare Name + // + Match = TRUE; + if (StorageName != NULL) { + StrPtr = ConfigString + 5 + 32 + 6; + while (*StrPtr != L'\0' && *StrPtr != L'&') { + StrPtr++; + } + if (*StrPtr != L'&') { + return FALSE; + } + + *StrPtr = L'\0'; + BufferSize = (((UINTN) StrPtr) - ((UINTN) &ConfigString[5 + 32 + 6])) / 4 + sizeof (CHAR16); + Name = EfiLibAllocatePool (BufferSize); + ASSERT (Name != NULL); + Status = ConfigStringToUnicode ( + Name, + &BufferSize, + ConfigString + 5 + 32 + 6 + ); + *StrPtr = L'&'; + + if (EFI_ERROR (Status) || (EfiStrCmp (Name, StorageName) != 0)) { + Match = FALSE; + } + gBS->FreePool (Name); + } + + return Match; +} + +BOOLEAN +FindBlockName ( + IN OUT CHAR16 *String, + UINTN Offset, + UINTN Width + ) +/*++ + +Routine Description: + Search BlockName "&OFFSET=Offset&WIDTH=Width" in a string. + +Arguments: + String - The string to be searched in. + Offset - Offset in BlockName. + Width - Width in BlockName. + +Returns: + TRUE - Block name found. + FALSE - Block name not found. + +--*/ +{ + EFI_STATUS Status; + UINTN Data; + UINTN BufferSize; + UINTN ConvertedStrLen; + + while ((String = EfiStrStr (String, L"&OFFSET=")) != NULL) { + // + // Skip '&OFFSET=' + // + String = String + 8; + + Data = 0; + BufferSize = sizeof (UINTN); + Status = HexStringToBuf ((UINT8 *) &Data, &BufferSize, String, &ConvertedStrLen); + if (EFI_ERROR (Status)) { + return FALSE; + } + String = String + ConvertedStrLen; + + if (Data != Offset) { + continue; + } + + if (EfiStrnCmp (String, L"&WIDTH=", 7) != 0) { + return FALSE; + } + String = String + 7; + + Data = 0; + BufferSize = sizeof (UINTN); + Status = HexStringToBuf ((UINT8 *) &Data, &BufferSize, String, &ConvertedStrLen); + if (EFI_ERROR (Status)) { + return FALSE; + } + if (Data == Width) { + return TRUE; + } + + String = String + ConvertedStrLen; + } + + return FALSE; +} + +EFI_STATUS +GetBrowserData ( + EFI_GUID *VariableGuid, OPTIONAL + CHAR16 *VariableName, OPTIONAL + UINTN *BufferSize, + UINT8 *Buffer + ) +/*++ + +Routine Description: + This routine is invoked by ConfigAccess.Callback() to retrived uncommitted data from Form Browser. + +Arguments: + VariableGuid - An optional field to indicate the target variable GUID name to use. + VariableName - An optional field to indicate the target human-readable variable name. + BufferSize - On input: Length in bytes of buffer to hold retrived data. + On output: + If return EFI_BUFFER_TOO_SMALL, containg length of buffer desired. + Buffer - Buffer to hold retrived data. + +Returns: + EFI_SUCCESS - Routine success. + EFI_BUFFER_TOO_SMALL - The intput buffer is too small. + +--*/ +{ + EFI_STATUS Status; + CHAR16 *ConfigHdr; + CHAR16 *ConfigResp; + CHAR16 *StringPtr; + UINTN HeaderLen; + UINTN BufferLen; + CHAR16 *Progress; + EFI_FORM_BROWSER2_PROTOCOL *FormBrowser2; + EFI_HII_CONFIG_ROUTING_PROTOCOL *HiiConfigRouting; + + // + // Locate protocols for use + // + Status = gBS->LocateProtocol (&gEfiFormBrowser2ProtocolGuid, NULL, &FormBrowser2); + if (EFI_ERROR (Status)) { + return Status; + } + + Status = gBS->LocateProtocol (&gEfiHiiConfigRoutingProtocolGuid, NULL, &HiiConfigRouting); + if (EFI_ERROR (Status)) { + return Status; + } + + // + // Retrive formset storage data from Form Browser + // + ConfigHdr = mFakeConfigHdr; + HeaderLen = EfiStrLen (ConfigHdr); + + BufferLen = 0x4000; + ConfigResp = EfiLibAllocateZeroPool (BufferLen + (HeaderLen + 1) * sizeof (CHAR16)); + + StringPtr = ConfigResp + HeaderLen; + *StringPtr = L'&'; + StringPtr++; + + Status = FormBrowser2->BrowserCallback ( + FormBrowser2, + &BufferLen, + StringPtr, + TRUE, + VariableGuid, + VariableName + ); + if (Status == EFI_BUFFER_TOO_SMALL) { + gBS->FreePool (ConfigResp); + ConfigResp = EfiLibAllocateZeroPool (BufferLen + (HeaderLen + 1) * sizeof (CHAR16)); + + StringPtr = ConfigResp + HeaderLen; + *StringPtr = L'&'; + StringPtr++; + + Status = FormBrowser2->BrowserCallback ( + FormBrowser2, + &BufferLen, + StringPtr, + TRUE, + VariableGuid, + VariableName + ); + } + if (EFI_ERROR (Status)) { + gBS->FreePool (ConfigResp); + return Status; + } + EfiCopyMem (ConfigResp, ConfigHdr, HeaderLen * sizeof (UINT16)); + + // + // Convert to buffer data + // + Status = HiiConfigRouting->ConfigToBlock ( + HiiConfigRouting, + ConfigResp, + Buffer, + BufferSize, + &Progress + ); + gBS->FreePool (ConfigResp); + + return Status; +} + +EFI_STATUS +SetBrowserData ( + EFI_GUID *VariableGuid, OPTIONAL + CHAR16 *VariableName, OPTIONAL + UINTN BufferSize, + UINT8 *Buffer, + CHAR16 *RequestElement OPTIONAL + ) +/*++ + +Routine Description: + This routine is invoked by ConfigAccess.Callback() to update uncommitted data of Form Browser. + +Arguments: + VariableGuid - An optional field to indicate the target variable GUID name to use. + VariableName - An optional field to indicate the target human-readable variable name. + BufferSize - Length in bytes of buffer to hold retrived data. + Buffer - Buffer to hold retrived data. + RequestElement - An optional field to specify which part of the buffer data + will be send back to Browser. If NULL, the whole buffer of + data will be committed to Browser. + ::= &OFFSET=&WIDTH=* + +Returns: + EFI_SUCCESS - Routine success. + Other - Updating Browser uncommitted data failed. + +--*/ +{ + EFI_STATUS Status; + CHAR16 *ConfigHdr; + CHAR16 *ConfigResp; + CHAR16 *StringPtr; + UINTN HeaderLen; + UINTN BufferLen; + CHAR16 *Progress; + EFI_FORM_BROWSER2_PROTOCOL *FormBrowser2; + EFI_HII_CONFIG_ROUTING_PROTOCOL *HiiConfigRouting; + CHAR16 BlockName[33]; + CHAR16 *ConfigRequest; + CHAR16 *Request; + + // + // Locate protocols for use + // + Status = gBS->LocateProtocol (&gEfiFormBrowser2ProtocolGuid, NULL, &FormBrowser2); + if (EFI_ERROR (Status)) { + return Status; + } + + Status = gBS->LocateProtocol (&gEfiHiiConfigRoutingProtocolGuid, NULL, &HiiConfigRouting); + if (EFI_ERROR (Status)) { + return Status; + } + + // + // Prepare + // + ConfigHdr = mFakeConfigHdr; + HeaderLen = EfiStrLen (ConfigHdr); + + if (RequestElement == NULL) { + // + // RequestElement not specified, use "&OFFSET=0&WIDTH=" as + // + BlockName[0] = L'\0'; + EfiStrCpy (BlockName, L"&OFFSET=0&WIDTH="); + + // + // String lenghth of L"&OFFSET=0&WIDTH=" is 16 + // + StringPtr = BlockName + 16; + BufferLen = sizeof (BlockName) - (16 * sizeof (CHAR16)); + BufToHexString (StringPtr, &BufferLen, (UINT8 *) &BufferSize, sizeof (UINTN)); + + Request = BlockName; + } else { + Request = RequestElement; + } + + BufferLen = HeaderLen * sizeof (CHAR16) + EfiStrSize (Request); + ConfigRequest = EfiLibAllocateZeroPool (BufferLen); + + EfiCopyMem (ConfigRequest, ConfigHdr, HeaderLen * sizeof (CHAR16)); + StringPtr = ConfigRequest + HeaderLen; + EfiStrCpy (StringPtr, Request); + + // + // Convert buffer to + // + Status = HiiConfigRouting->BlockToConfig ( + HiiConfigRouting, + ConfigRequest, + Buffer, + BufferSize, + &ConfigResp, + &Progress + ); + if (EFI_ERROR (Status)) { + gBS->FreePool (ConfigRequest); + return Status; + } + + // + // Skip and '&' + // + StringPtr = ConfigResp + HeaderLen + 1; + + // + // Change uncommitted data in Browser + // + Status = FormBrowser2->BrowserCallback ( + FormBrowser2, + &BufferSize, + StringPtr, + FALSE, + VariableGuid, + VariableName + ); + gBS->FreePool (ConfigResp); + gBS->FreePool (ConfigRequest); + return Status; +} + +BOOLEAN +HiiSetToDefaults ( + IN CONST EFI_STRING Request, OPTIONAL + IN UINT16 DefaultId + ) +/*++ + +Routine Description: + Reset the default value specified by DefaultId to the driver + configuration got by Request string. + + NULL request string support depends on the ExportConfig interface of + HiiConfigRouting protocol in UEFI specification. + +Arguments: + Request - A null-terminated Unicode string in + format. It can be NULL. + If it is NULL, all configuration for the + entirety of the current HII database will be reset. + DefaultId - Specifies the type of defaults to retrieve. + +Returns: + TURE - The default value is set successfully. + FALSE - The default value can't be found and set. + +--*/ +{ + EFI_STRING ConfigAltResp; + EFI_STRING ConfigAltHdr; + EFI_STRING ConfigResp; + EFI_STRING Progress; + EFI_STRING StringPtr; + EFI_STRING StringHdr; + EFI_STRING CurString; + EFI_STATUS Status; + EFI_HII_HANDLE HiiHandle; + CHAR16 OrigChar; + UINT32 Index; + EFI_GUID *VarGuid; + EFI_STRING VarName; + EFI_STRING_ID DefaultName; + UINTN BufferSize; + UINT8 *PackageData; + UINTN IfrOffset; + EFI_IFR_OP_HEADER *IfrOpHdr; + EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList; + UINT32 PackageOffset; + UINTN PackageListLength; + EFI_HII_PACKAGE_HEADER PacakgeHeader; + EFI_DEVICE_PATH_PROTOCOL *DevicePath; + EFI_HII_CONFIG_ROUTING_PROTOCOL *HiiConfigRouting; + + DEBUG ((EFI_D_ERROR, "HiiSetToDefaults - enter\n")); + + Status = gBS->LocateProtocol (&gEfiHiiConfigRoutingProtocolGuid, NULL, (VOID **) &HiiConfigRouting); + if (EFI_ERROR (Status)) { + return FALSE; + } + LocateHiiProtocols (); + + ConfigAltResp = NULL; + ConfigResp = NULL; + VarGuid = NULL; + VarName = NULL; + DevicePath = NULL; + ConfigAltHdr = NULL; + CurString = NULL; + Index = 0; + BufferSize = 0; + OrigChar = 0; + HiiHandle = NULL; + PackageData = NULL; + HiiPackageList = NULL; + + // + // Get the full requested value and deault value string. + // + if (Request != NULL) { + Status = HiiConfigRouting->ExtractConfig ( + HiiConfigRouting, + Request, + &Progress, + &ConfigAltResp + ); + } else { + Status = HiiConfigRouting->ExportConfig ( + HiiConfigRouting, + &ConfigAltResp + ); + } + + if (EFI_ERROR (Status)) { + return FALSE; + } + DEBUG ((EFI_D_ERROR, "HiiSetToDefaults - start\n")); + StringPtr = ConfigAltResp; + + while (StringPtr != L'\0') { + // + // 1. Find GUID=...&NAME=...&PATH=... + // + StringHdr = StringPtr; + + if (EfiStrnCmp (StringPtr, L"GUID=", (sizeof(L"GUID=")/sizeof(CHAR16)) - 1) != 0) { + Status = EFI_INVALID_PARAMETER; + goto Done; + } + StringPtr += (sizeof(L"GUID=")/sizeof(CHAR16)) - 1; + CurString = StringPtr; + while (*StringPtr != L'\0' && EfiStrnCmp (StringPtr, L"&NAME=", (sizeof(L"&NAME=")/sizeof(CHAR16)) - 1) != 0) { + StringPtr++; + } + if (*StringPtr == L'\0') { + Status = EFI_INVALID_PARAMETER; + goto Done; + } + + // + // Get Guid value + // + BufferSize = sizeof (EFI_GUID); + VarGuid = EfiLibAllocatePool (BufferSize); + OrigChar = *StringPtr; + *StringPtr = L'\0'; + Status = HexStringToBuffer ((UINT8 *) VarGuid, &BufferSize, CurString); + *StringPtr = OrigChar; + if (EFI_ERROR (Status)) { + goto Done; + } + + // + // Get Name value VarName + // + StringPtr += (sizeof(L"&NAME=")/sizeof(CHAR16)) - 1; + CurString = StringPtr; + while (*StringPtr != L'\0' && EfiStrnCmp (StringPtr, L"&PATH=", (sizeof(L"&PATH=")/sizeof(CHAR16)) - 1) != 0) { + StringPtr++; + } + if (*StringPtr == L'\0') { + Status = EFI_INVALID_PARAMETER; + goto Done; + } + OrigChar = *StringPtr; + *StringPtr = L'\0'; + BufferSize = 0; + Status = ConfigStringToUnicode (VarName, &BufferSize, CurString); + if (Status == EFI_BUFFER_TOO_SMALL) { + VarName = EfiLibAllocatePool (BufferSize); + Status = ConfigStringToUnicode (VarName, &BufferSize, CurString); + } + *StringPtr = OrigChar; + if (EFI_ERROR (Status)) { + goto Done; + } + + // + // Get Path value DevicePath + // + StringPtr += (sizeof(L"&PATH=")/sizeof(CHAR16)) - 1; + CurString = StringPtr; + for (; *StringPtr != L'\0' && *StringPtr != L'&'; StringPtr++); + OrigChar = *StringPtr; + *StringPtr = L'\0'; + Status = HexStringToBuffer ((UINT8 *) DevicePath, &BufferSize, CurString); + if (Status == EFI_BUFFER_TOO_SMALL) { + DevicePath = EfiLibAllocatePool (BufferSize); + Status = HexStringToBuffer ((UINT8 *) DevicePath, &BufferSize, CurString); + } + *StringPtr = OrigChar; + + if (EFI_ERROR (Status)) { + goto Done; + } + + // + // Get the Driver handle by the got device path. + // + HiiHandle = DevicePathToHiiHandle (gIfrLibHiiDatabase, DevicePath); + if (HiiHandle == NULL) { + // + // This request string has no its Hii package. + // Its default value and validating can't execute by parsing IFR data. + // Directly jump into the next ConfigAltResp string for another pair Guid, Name, and Path. + // + Status = EFI_SUCCESS; + goto NextConfigAltResp; + } + + // + // 2. Get DefaultName string ID by parsing the PacakgeList + // + + // + // Get HiiPackage by HiiHandle + // + PackageListLength = 0; + HiiPackageList = NULL; + Status = gIfrLibHiiDatabase->ExportPackageLists (gIfrLibHiiDatabase, HiiHandle, &PackageListLength, HiiPackageList); + + // + // The return status should always be EFI_BUFFER_TOO_SMALL as input buffer's size is 0. + // + if (Status != EFI_BUFFER_TOO_SMALL) { + Status = EFI_INVALID_PARAMETER; + goto Done; + } + + HiiPackageList = EfiLibAllocatePool (PackageListLength); + if (HiiPackageList == NULL) { + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + // + // Get PackageList on HiiHandle + // + Status = gIfrLibHiiDatabase->ExportPackageLists (gIfrLibHiiDatabase, HiiHandle, &PackageListLength, HiiPackageList); + if (EFI_ERROR (Status)) { + goto Done; + } + + // + // Parse the form package and get the default name string ID. + // + PackageOffset = sizeof (EFI_HII_PACKAGE_LIST_HEADER); + Status = EFI_NOT_FOUND; + while (PackageOffset < PackageListLength) { + EfiCopyMem (&PacakgeHeader, (UINT8 *) HiiPackageList + PackageOffset, sizeof (PacakgeHeader)); + + // + // Parse IFR opcode to get default store opcode + // + if (PacakgeHeader.Type == EFI_HII_PACKAGE_FORMS) { + IfrOffset = sizeof (PacakgeHeader); + PackageData = (UINT8 *) HiiPackageList + PackageOffset; + while (IfrOffset < PacakgeHeader.Length) { + IfrOpHdr = (EFI_IFR_OP_HEADER *) (PackageData + IfrOffset); + // + // Match DefaultId to find its DefaultName + // + if (IfrOpHdr->OpCode == EFI_IFR_DEFAULTSTORE_OP) { + if (((EFI_IFR_DEFAULTSTORE *) IfrOpHdr)->DefaultId == DefaultId) { + DefaultName = ((EFI_IFR_DEFAULTSTORE *) IfrOpHdr)->DefaultName; + Status = EFI_SUCCESS; + break; + } + } + IfrOffset += IfrOpHdr->Length; + } + // + // Only one form is in a package list. + // + break; + } + + // + // Go to next package. + // + PackageOffset += PacakgeHeader.Length; + } + + // + // Not found the matched default string ID + // + if (EFI_ERROR (Status)) { + Status = EFI_SUCCESS; + goto NextConfigAltResp; + } + + // + // 3. Call ConfigRouting GetAltCfg(ConfigRoute, , Guid, Name, DevicePath, AltCfgId, AltCfgResp) + // Get the default configuration string according to the found default name string ID. + // + Status = HiiConfigRouting->GetAltConfig ( + HiiConfigRouting, + ConfigAltResp, + VarGuid, + VarName, + DevicePath, + &DefaultName, // it can be NULL to get the current setting. + &ConfigResp + ); + + // + // The required setting can't be found. So, it is not required to be validated and set. + // + if (EFI_ERROR (Status)) { + Status = EFI_SUCCESS; + goto NextConfigAltResp; + } + // + // Only the ConfigHdr is found. Not any block data is found. No data is required to be validated and set. + // + if (EfiStrStr (ConfigResp, L"&OFFSET=") == NULL) { + goto NextConfigAltResp; + } + + // + // 4. Set the default configuration information or Validate current setting by parse IFR code. + // Current Setting is in ConfigResp, will be set into buffer, then check it again. + // + // + // Set the default configuration information. + // + Status = HiiConfigRouting->RouteConfig (HiiConfigRouting, ConfigResp, &Progress); + + if (EFI_ERROR (Status)) { + goto Done; + } + +NextConfigAltResp: + // + // Free the allocated pacakge buffer and the got ConfigResp string. + // + if (HiiPackageList != NULL) { + gBS->FreePool (HiiPackageList); + HiiPackageList = NULL; + } + + if (ConfigResp != NULL) { + gBS->FreePool (ConfigResp); + ConfigResp = NULL; + } + + // + // Free the allocated buffer. + // + gBS->FreePool (VarGuid); + VarGuid = NULL; + + gBS->FreePool (VarName); + VarName = NULL; + + gBS->FreePool (DevicePath); + DevicePath = NULL; + + // + // 5. Jump to next ConfigAltResp for another Guid, Name, Path. + // + + // + // Get and Skip ConfigHdr + // + while (*StringPtr != L'\0' && *StringPtr != L'&') { + StringPtr++; + } + if (*StringPtr == L'\0') { + break; + } + + // + // Construct ConfigAltHdr string "&&ALTCFG=\0" + // | 1 | EfiStrLen (ConfigHdr) | 8 | 1 | + // + ConfigAltHdr = EfiLibAllocateZeroPool ((1 + StringPtr - StringHdr + 8 + 1) * sizeof (CHAR16)); + if (ConfigAltHdr == NULL) { + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + EfiStrCpy (ConfigAltHdr, L"&"); + EfiStrnCat (ConfigAltHdr, StringHdr, StringPtr - StringHdr); + EfiStrCat (ConfigAltHdr, L"&ALTCFG="); + + // + // Skip all AltResp (AltConfigHdr ConfigBody) for the same ConfigHdr + // + while ((StringHdr = EfiStrStr (StringPtr, ConfigAltHdr)) != NULL) { + StringPtr = StringHdr + EfiStrLen (ConfigAltHdr); + if (*StringPtr == L'\0') { + break; + } + } + + // + // Free the allocated ConfigAltHdr string + // + gBS->FreePool (ConfigAltHdr); + if (*StringPtr == L'\0') { + break; + } + + // + // Find &GUID as the next ConfigHdr + // + StringPtr = EfiStrStr (StringPtr, L"&GUID"); + if (StringPtr == NULL) { + break; + } + + // + // Skip char '&' + // + StringPtr ++; + } + DEBUG ((EFI_D_ERROR, "HiiSetToDefaults - end\n")); + +Done: + if (VarGuid != NULL) { + gBS->FreePool (VarGuid); + } + + if (VarName != NULL) { + gBS->FreePool (VarName); + } + + if (DevicePath != NULL) { + gBS->FreePool (DevicePath); + } + + if (ConfigResp != NULL) { + gBS->FreePool (ConfigResp); + } + + if (ConfigAltResp != NULL) { + gBS->FreePool (ConfigAltResp); + } + + if (HiiPackageList != NULL) { + gBS->FreePool (HiiPackageList); + } + + if (EFI_ERROR (Status)) { + return FALSE; + } + + return TRUE; +} diff --git a/EDK/Foundation/Library/Dxe/UefiEfiIfrSupportLib/UefiIfrLibrary.h b/EDK/Foundation/Library/Dxe/UefiEfiIfrSupportLib/UefiIfrLibrary.h new file mode 100644 index 0000000..3baf851 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/UefiEfiIfrSupportLib/UefiIfrLibrary.h @@ -0,0 +1,1370 @@ +/*++ + +Copyright (c) 2007 - 2008, 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: + + UefiIfrLibrary.h + +Abstract: + + The file contain all library function for Ifr Operations. + +--*/ + +#ifndef _IFRLIBRARY_H +#define _IFRLIBRARY_H + +#include "Tiano.h" +#include "EfiDriverLib.h" +#include "TianoHii.h" + +#include EFI_PROTOCOL_DEFINITION (HiiFont) +#include EFI_PROTOCOL_DEFINITION (HiiImage) +#include EFI_PROTOCOL_DEFINITION (HiiString) +#include EFI_PROTOCOL_DEFINITION (HiiDatabase) +#include EFI_PROTOCOL_DEFINITION (HiiConfigRouting) +#include EFI_PROTOCOL_DEFINITION (HiiConfigAccess) +#include EFI_PROTOCOL_DEFINITION (FormBrowser2) +#include EFI_PROTOCOL_DEFINITION (SimpleTextOut) + +#include EFI_GUID_DEFINITION (GlobalVariable) + +#define IFR_LIB_DEFAULT_STRING_SIZE 0x200 + +// +// The architectural variable "Lang" and "LangCodes" are deprecated in UEFI +// specification. While, UEFI specification also states that these deprecated +// variables may be provided for backwards compatibility. +// If "LANG_SUPPORT" is defined, "Lang" and "LangCodes" will be produced; +// If "LANG_SUPPORT" is undefined, "Lang" and "LangCodes" will not be produced. +// +#define LANG_SUPPORT + +#define EFI_LANGUAGE_VARIABLE L"Lang" +#define EFI_LANGUAGE_CODES_VARIABLE L"LangCodes" + +#define UEFI_LANGUAGE_VARIABLE L"PlatformLang" +#define UEFI_LANGUAGE_CODES_VARIABLE L"PlatformLangCodes" + +// +// Limited buffer size recommended by RFC4646 (4.3. Length Considerations) +// (42 characters plus a NULL terminator) +// +#define RFC_3066_ENTRY_SIZE (42 + 1) +#define ISO_639_2_ENTRY_SIZE 3 + +#define INVALID_VARSTORE_ID 0 + +#define QUESTION_FLAGS (EFI_IFR_FLAG_READ_ONLY | EFI_IFR_FLAG_CALLBACK | EFI_IFR_FLAG_RESET_REQUIRED | EFI_IFR_FLAG_OPTIONS_ONLY) +#define QUESTION_FLAGS_MASK (~QUESTION_FLAGS) + +extern EFI_GUID mIfrVendorGuid; +extern EFI_HII_DATABASE_PROTOCOL *gIfrLibHiiDatabase; +extern EFI_HII_STRING_PROTOCOL *gIfrLibHiiString; + +#pragma pack(1) +typedef struct { + EFI_STRING_ID StringToken; + EFI_IFR_TYPE_VALUE Value; + UINT8 Flags; +} IFR_OPTION; +#pragma pack() + +#pragma pack(1) +typedef struct { + VENDOR_DEVICE_PATH VendorDevicePath; + UINT32 Reserved; + UINT64 UniqueId; +} HII_VENDOR_DEVICE_PATH_NODE; +#pragma pack() + +typedef struct { + HII_VENDOR_DEVICE_PATH_NODE Node; + EFI_DEVICE_PATH_PROTOCOL End; +} HII_VENDOR_DEVICE_PATH; + +typedef struct { + // + // Buffer size allocated for Data. + // + UINT32 BufferSize; + + // + // Offset in Data to append the newly created opcode binary. + // It will be adjusted automatically in Create***OpCode(), and should be + // initialized to 0 before invocation of a serial of Create***OpCode() + // + UINT32 Offset; + + // + // The destination buffer for created op-codes + // + UINT8 *Data; +} EFI_HII_UPDATE_DATA; + +VOID +LocateHiiProtocols ( + VOID + ) +/*++ + +Routine Description: + This function locate Hii relative protocols for later usage. + +Arguments: + None. + +Returns: + None. + +--*/ +; + +// +// Exported Library functions +// +EFI_STATUS +CreateEndOpCode ( + IN OUT EFI_HII_UPDATE_DATA *Data + ) +/*++ + +Routine Description: + Create EFI_IFR_END_OP opcode. + +Arguments: + Data - Destination for the created opcode binary + +Returns: + EFI_SUCCESS - Opcode create success + +--*/ +; + +EFI_STATUS +CreateDefaultOpCode ( + IN EFI_IFR_TYPE_VALUE *Value, + IN UINT8 Type, + IN OUT EFI_HII_UPDATE_DATA *Data + ) +/*++ + +Routine Description: + Create EFI_IFR_DEFAULT_OP opcode. + +Arguments: + Value - Value for the default + Type - Type for the default + Data - Destination for the created opcode binary + +Returns: + EFI_SUCCESS - Opcode create success + +--*/ +; + +EFI_STATUS +CreateActionOpCode ( + IN EFI_QUESTION_ID QuestionId, + IN EFI_STRING_ID Prompt, + IN EFI_STRING_ID Help, + IN UINT8 QuestionFlags, + IN EFI_STRING_ID QuestionConfig, + IN OUT EFI_HII_UPDATE_DATA *Data + ) +/*++ + +Routine Description: + Create EFI_IFR_ACTION_OP opcode. + +Arguments: + QuestionId - Question ID + Prompt - String ID for Prompt + Help - String ID for Help + QuestionFlags - Flags in Question Header + QuestionConfig - String ID for configuration + Data - Destination for the created opcode binary + +Returns: + EFI_SUCCESS - Opcode create success + +--*/ +; + +EFI_STATUS +CreateSubTitleOpCode ( + IN EFI_STRING_ID Prompt, + IN EFI_STRING_ID Help, + IN UINT8 Flags, + IN UINT8 Scope, + IN OUT EFI_HII_UPDATE_DATA *Data + ) +/*++ + +Routine Description: + Create EFI_IFR_SUBTITLE_OP opcode. + +Arguments: + Prompt - String ID for Prompt + Help - String ID for Help + Flags - Subtitle opcode flags + Scope - Subtitle Scope bit + Data - Destination for the created opcode binary + +Returns: + EFI_SUCCESS - Opcode create success + +--*/ +; + +EFI_STATUS +CreateTextOpCode ( + IN EFI_STRING_ID Prompt, + IN EFI_STRING_ID Help, + IN EFI_STRING_ID TextTwo, + IN OUT EFI_HII_UPDATE_DATA *Data + ) +/*++ + +Routine Description: + Create EFI_IFR_TEXT_OP opcode. + +Arguments: + Prompt - String ID for Prompt + Help - String ID for Help + TextTwo - String ID for text two + Data - Destination for the created opcode binary + +Returns: + EFI_SUCCESS - Opcode create success + +--*/ +; + +EFI_STATUS +CreateGotoOpCode ( + IN EFI_FORM_ID FormId, + IN EFI_STRING_ID Prompt, + IN EFI_STRING_ID Help, + IN UINT8 QuestionFlags, + IN EFI_QUESTION_ID QuestionId, + IN OUT EFI_HII_UPDATE_DATA *Data + ) +/*++ + +Routine Description: + Create EFI_IFR_REF_OP opcode. + +Arguments: + FormId - Destination Form ID + Prompt - String ID for Prompt + Help - String ID for Help + QuestionFlags - Flags in Question Header + QuestionId - Question ID + Data - Destination for the created opcode binary + +Returns: + EFI_SUCCESS - Opcode create success + +--*/ +; + +EFI_STATUS +CreateOneOfOptionOpCode ( + IN UINTN OptionCount, + IN IFR_OPTION *OptionsList, + IN UINT8 Type, + IN OUT EFI_HII_UPDATE_DATA *Data + ) +; + +EFI_STATUS +CreateOneOfOpCode ( + IN EFI_QUESTION_ID QuestionId, + IN EFI_VARSTORE_ID VarStoreId, + IN UINT16 VarOffset, + IN EFI_STRING_ID Prompt, + IN EFI_STRING_ID Help, + IN UINT8 QuestionFlags, + IN UINT8 OneOfFlags, + IN IFR_OPTION *OptionsList, + IN UINTN OptionCount, + IN OUT EFI_HII_UPDATE_DATA *Data + ) +/*++ + +Routine Description: + Create EFI_IFR_ONE_OF_OP opcode. + +Arguments: + QuestionId - Question ID + VarStoreId - Storage ID + VarOffset - Offset in Storage + Prompt - String ID for Prompt + Help - String ID for Help + QuestionFlags - Flags in Question Header + OneOfFlags - Flags for oneof opcode + OptionsList - List of options + OptionCount - Number of options in option list + Data - Destination for the created opcode binary + +Returns: + EFI_SUCCESS - Opcode create success + +--*/ +; + +EFI_STATUS +CreateOrderedListOpCode ( + IN EFI_QUESTION_ID QuestionId, + IN EFI_VARSTORE_ID VarStoreId, + IN UINT16 VarOffset, + IN EFI_STRING_ID Prompt, + IN EFI_STRING_ID Help, + IN UINT8 QuestionFlags, + IN UINT8 Flags, + IN UINT8 DataType, + IN UINT8 MaxContainers, + IN IFR_OPTION *OptionsList, + IN UINTN OptionCount, + IN OUT EFI_HII_UPDATE_DATA *Data + ) +/*++ + +Routine Description: + Create EFI_IFR_ORDERED_LIST_OP opcode. + +Arguments: + QuestionId - Question ID + VarStoreId - Storage ID + VarOffset - Offset in Storage + Prompt - String ID for Prompt + Help - String ID for Help + QuestionFlags - Flags in Question Header + Flags - Flags for ordered list opcode + DataType - Type for option value + MaxContainers - Maximum count for options in this ordered list + OptionsList - List of options + OptionCount - Number of options in option list + Data - Destination for the created opcode binary + +Returns: + EFI_SUCCESS - Opcode create success + +--*/ +; + +EFI_STATUS +CreateCheckBoxOpCode ( + IN EFI_QUESTION_ID QuestionId, + IN EFI_VARSTORE_ID VarStoreId, + IN UINT16 VarOffset, + IN EFI_STRING_ID Prompt, + IN EFI_STRING_ID Help, + IN UINT8 QuestionFlags, + IN UINT8 CheckBoxFlags, + IN OUT EFI_HII_UPDATE_DATA *Data + ) +/*++ + +Routine Description: + Create EFI_IFR_CHECKBOX_OP opcode. + +Arguments: + QuestionId - Question ID + VarStoreId - Storage ID + VarOffset - Offset in Storage + Prompt - String ID for Prompt + Help - String ID for Help + QuestionFlags - Flags in Question Header + CheckBoxFlags - Flags for checkbox opcode + Data - Destination for the created opcode binary + +Returns: + EFI_SUCCESS - Opcode create success + +--*/ +; + +EFI_STATUS +CreateNumericOpCode ( + IN EFI_QUESTION_ID QuestionId, + IN EFI_VARSTORE_ID VarStoreId, + IN UINT16 VarOffset, + IN EFI_STRING_ID Prompt, + IN EFI_STRING_ID Help, + IN UINT8 QuestionFlags, + IN UINT8 NumericFlags, + IN UINT64 Minimum, + IN UINT64 Maximum, + IN UINT64 Step, + IN UINT64 Default, + IN OUT EFI_HII_UPDATE_DATA *Data + ) +/*++ + +Routine Description: + Create EFI_IFR_NUMERIC_OP opcode. + +Arguments: + QuestionId - Question ID + VarStoreId - Storage ID + VarOffset - Offset in Storage + Prompt - String ID for Prompt + Help - String ID for Help + QuestionFlags - Flags in Question Header + NumericFlags - Flags for numeric opcode + Minimum - Numeric minimum value + Maximum - Numeric maximum value + Step - Numeric step for edit + Default - Numeric default value + Data - Destination for the created opcode binary + +Returns: + EFI_SUCCESS - Opcode create success + +--*/ +; + +EFI_STATUS +CreateStringOpCode ( + IN EFI_QUESTION_ID QuestionId, + IN EFI_VARSTORE_ID VarStoreId, + IN UINT16 VarOffset, + IN EFI_STRING_ID Prompt, + IN EFI_STRING_ID Help, + IN UINT8 QuestionFlags, + IN UINT8 StringFlags, + IN UINT8 MinSize, + IN UINT8 MaxSize, + IN OUT EFI_HII_UPDATE_DATA *Data + ) +/*++ + +Routine Description: + Create EFI_IFR_STRING_OP opcode. + +Arguments: + QuestionId - Question ID + VarStoreId - Storage ID + VarOffset - Offset in Storage + Prompt - String ID for Prompt + Help - String ID for Help + QuestionFlags - Flags in Question Header + StringFlags - Flags for string opcode + MinSize - String minimum length + MaxSize - String maximum length + Data - Destination for the created opcode binary + +Returns: + EFI_SUCCESS - Opcode create success + +--*/ +; + +EFI_STATUS +CreateBannerOpCode ( + IN EFI_STRING_ID Title, + IN UINT16 LineNumber, + IN UINT8 Alignment, + IN OUT EFI_HII_UPDATE_DATA *Data + ) +/*++ + +Routine Description: + Create GUIDed opcode for banner. + +Arguments: + Title - String ID for title + LineNumber - Line number for this banner + Alignment - Alignment for this banner, left, center or right + Data - Destination for the created opcode binary + +Returns: + EFI_SUCCESS - Opcode create success + +--*/ +; + +EFI_HII_PACKAGE_LIST_HEADER * +PreparePackageList ( + IN UINTN NumberOfPackages, + IN EFI_GUID *GuidId, + ... + ) +/*++ + +Routine Description: + Assemble EFI_HII_PACKAGE_LIST according to the passed in packages. + +Arguments: + NumberOfPackages - Number of packages. + GuidId - Package GUID. + +Returns: + Pointer of EFI_HII_PACKAGE_LIST_HEADER. + +--*/ +; + +EFI_STATUS +CreateHiiDriverHandle ( + OUT EFI_HANDLE *DriverHandle + ) +/*++ + +Routine Description: + The HII driver handle passed in for HiiDatabase.NewPackageList() requires + that there should be DevicePath Protocol installed on it. + This routine create a virtual Driver Handle by installing a vendor device + path on it, so as to use it to invoke HiiDatabase.NewPackageList(). + +Arguments: + DriverHandle - Handle to be returned + +Returns: + EFI_SUCCESS - Handle destroy success. + EFI_OUT_OF_RESOURCES - Not enough memory. + +--*/ +; + +EFI_STATUS +DestroyHiiDriverHandle ( + IN EFI_HANDLE DriverHandle + ) +/*++ + +Routine Description: + Destroy the Driver Handle created by CreateHiiDriverHandle(). + +Arguments: + DriverHandle - Handle returned by CreateHiiDriverHandle() + +Returns: + EFI_SUCCESS - Handle destroy success. + other - Handle destroy fail. + +--*/ +; + +EFI_HII_HANDLE +DevicePathToHiiHandle ( + IN EFI_HII_DATABASE_PROTOCOL *HiiDatabase, + IN EFI_DEVICE_PATH_PROTOCOL *DevicePath + ) +/*++ + +Routine Description: + Find HII Handle associated with given Device Path. + +Arguments: + HiiDatabase - Point to EFI_HII_DATABASE_PROTOCOL instance. + DevicePath - Device Path associated with the HII package list handle. + +Returns: + Handle - HII package list Handle associated with the Device Path. + NULL - Hii Package list handle is not found. + +--*/ +; + +EFI_STATUS +ExtractDefault( + IN VOID *Buffer, + IN UINTN *BufferSize, + UINTN Number, + ... + ) +/*++ + + Routine Description: + Configure the buffer accrording to ConfigBody strings. + + Arguments: + DefaultId - the ID of default. + Buffer - the start address of buffer. + BufferSize - the size of buffer. + Number - the number of the strings. + + Returns: + EFI_BUFFER_TOO_SMALL - the BufferSize is too small to operate. + EFI_INVALID_PARAMETER - Buffer is NULL or BufferSize is 0. + EFI_SUCCESS - Operation successful. + +--*/ +; + +EFI_STATUS +ConstructConfigAltResp ( + IN EFI_STRING ConfigRequest, OPTIONAL + OUT EFI_STRING *Progress, + OUT EFI_STRING *ConfigAltResp, + IN EFI_GUID *Guid, + IN CHAR16 *Name, + IN EFI_HANDLE *DriverHandle, + IN VOID *BufferStorage, + IN UINTN BufferStorageSize, + IN VOID *BlockNameArray, OPTIONAL + IN UINTN NumberAltCfg, + ... +//IN UINT16 AltCfgId, +//IN VOID *DefaultValueArray, + ) +/*++ + + Routine Description: + + Construct for a buffer storage. + + Arguments: + ConfigRequest - The Config request string. If set to NULL, all the + configurable elements will be extracted from BlockNameArray. + ConfigAltResp - The returned . + Progress - On return, points to a character in the Request. + Guid - GUID of the buffer storage. + Name - Name of the buffer storage. + DriverHandle - The DriverHandle which is used to invoke HiiDatabase + protocol interface NewPackageList(). + BufferStorage - Content of the buffer storage. + BufferStorageSize - Length in bytes of the buffer storage. + BlockNameArray - Array generated by VFR compiler. + NumberAltCfg - Number of Default value array generated by VFR compiler. + The sequential input parameters will be number of + AltCfgId and DefaultValueArray pairs. When set to 0, + there will be no . + + Returns: + EFI_OUT_OF_RESOURCES - Run out of memory resource. + EFI_INVALID_PARAMETER - ConfigAltResp is NULL. + EFI_SUCCESS - Operation successful. + +--*/ +; + +EFI_STATUS +ExtractGuidFromHiiHandle ( + IN EFI_HII_HANDLE Handle, + OUT EFI_GUID *Guid + ) +/*++ + +Routine Description: + Extract Hii package list GUID for given HII handle. + +Arguments: + HiiHandle - Hii handle + Guid - Package list GUID + +Returns: + EFI_SUCCESS - Successfully extract GUID from Hii database. + +--*/ +; + +EFI_STATUS +ExtractClassFromHiiHandle ( + IN EFI_HII_HANDLE Handle, + OUT UINT16 *Class, + OUT EFI_STRING_ID *FormSetTitle, + OUT EFI_STRING_ID *FormSetHelp + ) +/*++ + +Routine Description: + Extract formset class for given HII handle. + +Arguments: + HiiHandle - Hii handle + Class - Class of the formset + FormSetTitle - Formset title string + FormSetHelp - Formset help string + +Returns: + EFI_SUCCESS - Successfully extract Class for specified Hii handle. + +--*/ +; + +EFI_STATUS +ExtractClassGuidFromHiiHandle ( + IN EFI_HII_HANDLE Handle, + OUT UINT8 *NumberOfClassGuid, + OUT EFI_GUID **ClassGuid, + OUT EFI_STRING_ID *FormSetTitle, + OUT EFI_STRING_ID *FormSetHelp + ) +/*++ + +Routine Description: + Extract formset ClassGuid for given HII handle. + +Arguments: + HiiHandle - Hii handle + NumberOfClassGuid - Number of ClassGuid + ClassGuid - Pointer to callee allocated buffer, an array of ClassGuid + FormSetTitle - Formset title string + FormSetHelp - Formset help string + +Returns: + EFI_SUCCESS - Successfully extract Class for specified Hii handle. + +--*/ +; + +VOID +ToLower ( + IN OUT CHAR16 *Str + ) +/*++ + +Routine Description: + Converts the unicode character from uppercase to lowercase. + +Arguments: + Str - String to be converted + +Returns: + +--*/ +; + +EFI_STATUS +BufferToHexString ( + IN OUT CHAR16 *Str, + IN UINT8 *Buffer, + IN UINTN BufferSize + ) +/*++ + +Routine Description: + Converts binary buffer to Unicode string in reversed byte order to BufToHexString(). + +Arguments: + Str - String for output + Buffer - Binary buffer. + BufferSize - Size of the buffer in bytes. + +Returns: + EFI_SUCCESS - The function completed successfully. + +--*/ +; + +EFI_STATUS +HexStringToBuffer ( + IN OUT UINT8 *Buffer, + IN OUT UINTN *BufferSize, + IN CHAR16 *Str + ) +/*++ + +Routine Description: + Converts Hex String to binary buffer in reversed byte order to HexStringToBuf(). + +Arguments: + Buffer - Pointer to buffer that receives the data. + BufferSize - Length in bytes of the buffer to hold converted data. + If routine return with EFI_SUCCESS, containing length of converted data. + If routine return with EFI_BUFFER_TOO_SMALL, containg length of buffer desired. + Str - String to be converted from. + +Returns: + EFI_SUCCESS - The function completed successfully. + +--*/ +; + +EFI_STATUS +ConfigStringToUnicode ( + IN OUT CHAR16 *UnicodeString, + IN OUT UINTN *StrBufferLen, + IN CHAR16 *ConfigString + ) +/*++ + +Routine Description: + Convert binary representation Config string (e.g. "0041004200430044") to the + original string (e.g. "ABCD"). Config string appears in (i.e. + "&NAME="), or Name/Value pair in (i.e. "label="). + +Arguments: + UnicodeString - Original Unicode string. + StrBufferLen - On input: Length in bytes of buffer to hold the Unicode string. + Includes tailing '\0' character. + On output: + If return EFI_SUCCESS, containing length of Unicode string buffer. + If return EFI_BUFFER_TOO_SMALL, containg length of string buffer desired. + ConfigString - Binary representation of Unicode String, := (4)+ + +Returns: + EFI_SUCCESS - Routine success. + EFI_BUFFER_TOO_SMALL - The string buffer is too small. + +--*/ +; + +EFI_STATUS +UnicodeToConfigString ( + IN OUT CHAR16 *ConfigString, + IN OUT UINTN *StrBufferLen, + IN CHAR16 *UnicodeString + ) +/*++ + +Routine Description: + Convert Unicode string to binary representation Config string, e.g. + "ABCD" => "0041004200430044". Config string appears in (i.e. + "&NAME="), or Name/Value pair in (i.e. "label="). + +Arguments: + ConfigString - Binary representation of Unicode String, := (4)+ + StrBufferLen - On input: Length in bytes of buffer to hold the Unicode string. + Includes tailing '\0' character. + On output: + If return EFI_SUCCESS, containing length of Unicode string buffer. + If return EFI_BUFFER_TOO_SMALL, containg length of string buffer desired. + UnicodeString - Original Unicode string. + +Returns: + EFI_SUCCESS - Routine success. + EFI_BUFFER_TOO_SMALL - The string buffer is too small. + +--*/ +; + +EFI_STATUS +ConstructConfigHdr ( + IN OUT CHAR16 *ConfigHdr, + IN OUT UINTN *StrBufferLen, + IN EFI_GUID *Guid, + IN CHAR16 *Name, OPTIONAL + IN EFI_HANDLE *DriverHandle + ) +/*++ + +Routine Description: + Construct using routing information GUID/NAME/PATH. + +Arguments: + ConfigHdr - Pointer to the ConfigHdr string. + StrBufferLen - On input: Length in bytes of buffer to hold the ConfigHdr string. Includes tailing '\0' character. + On output: + If return EFI_SUCCESS, containing length of ConfigHdr string buffer. + If return EFI_BUFFER_TOO_SMALL, containg length of string buffer desired. + Guid - Routing information: GUID. + Name - Routing information: NAME. + DriverHandle - Driver handle which contains the routing information: PATH. + +Returns: + EFI_SUCCESS - Routine success. + EFI_BUFFER_TOO_SMALL - The ConfigHdr string buffer is too small. + +--*/ +; + +BOOLEAN +IsConfigHdrMatch ( + IN EFI_STRING ConfigString, + IN EFI_GUID *StorageGuid, OPTIONAL + IN CHAR16 *StorageName OPTIONAL + ) +/*++ + +Routine Description: + Determines if the Routing data (Guid and Name) is correct in . + +Arguments: + ConfigString - Either or . + StorageGuid - GUID of the storage. + StorageName - Name of the stoarge. + +Returns: + TRUE - Routing information is correct in ConfigString. + FALSE - Routing information is incorrect in ConfigString. + +--*/ +; + +BOOLEAN +FindBlockName ( + IN OUT CHAR16 *String, + UINTN Offset, + UINTN Width + ) +/*++ + +Routine Description: + Search BlockName "&OFFSET=Offset&WIDTH=Width" in a string. + +Arguments: + String - The string to be searched in. + Offset - Offset in BlockName. + Width - Width in BlockName. + +Returns: + TRUE - Block name found. + FALSE - Block name not found. + +--*/ +; + +EFI_STATUS +GetBrowserData ( + EFI_GUID *VariableGuid, OPTIONAL + CHAR16 *VariableName, OPTIONAL + UINTN *BufferSize, + UINT8 *Buffer + ) +/*++ + +Routine Description: + This routine is invoked by ConfigAccess.Callback() to retrived uncommitted data from Form Browser. + +Arguments: + VariableGuid - An optional field to indicate the target variable GUID name to use. + VariableName - An optional field to indicate the target human-readable variable name. + BufferSize - On input: Length in bytes of buffer to hold retrived data. + On output: + If return EFI_BUFFER_TOO_SMALL, containg length of buffer desired. + Buffer - Buffer to hold retrived data. + +Returns: + EFI_SUCCESS - Routine success. + EFI_BUFFER_TOO_SMALL - The intput buffer is too small. + +--*/ +; + +EFI_STATUS +GetHiiHandles ( + IN OUT UINTN *HandleBufferLength, + OUT EFI_HII_HANDLE **HiiHandleBuffer + ) +/*++ + +Routine Description: + Determines the handles that are currently active in the database. + It's the caller's responsibility to free handle buffer. + +Arguments: + HiiDatabase - A pointer to the EFI_HII_DATABASE_PROTOCOL instance. + HandleBufferLength - On input, a pointer to the length of the handle buffer. On output, + the length of the handle buffer that is required for the handles found. + HiiHandleBuffer - Pointer to an array of Hii Handles returned. + +Returns: + EFI_SUCCESS - Get an array of Hii Handles successfully. + EFI_INVALID_PARAMETER - Hii is NULL. + EFI_NOT_FOUND - Database not found. + +--*/ +; + +EFI_STATUS +SetBrowserData ( + EFI_GUID *VariableGuid, OPTIONAL + CHAR16 *VariableName, OPTIONAL + UINTN BufferSize, + UINT8 *Buffer, + CHAR16 *RequestElement OPTIONAL + ) +/*++ + +Routine Description: + This routine is invoked by ConfigAccess.Callback() to update uncommitted data of Form Browser. + +Arguments: + VariableGuid - An optional field to indicate the target variable GUID name to use. + VariableName - An optional field to indicate the target human-readable variable name. + BufferSize - Length in bytes of buffer to hold retrived data. + Buffer - Buffer to hold retrived data. + RequestElement - An optional field to specify which part of the buffer data + will be send back to Browser. If NULL, the whole buffer of + data will be committed to Browser. + ::= &OFFSET=&WIDTH=* + +Returns: + EFI_SUCCESS - Routine success. + Other - Updating Browser uncommitted data failed. + +--*/ +; + +EFI_STATUS +ConvertRfc3066LanguageToIso639Language ( + CHAR8 *LanguageRfc3066, + CHAR8 *LanguageIso639 + ) +/*++ + +Routine Description: + Convert language code from RFC3066 to ISO639-2. + +Arguments: + LanguageRfc3066 - RFC3066 language code. + LanguageIso639 - ISO639-2 language code. + +Returns: + EFI_SUCCESS - Language code converted. + EFI_NOT_FOUND - Language code not found. + +--*/ +; + +CHAR8 * +Rfc3066ToIso639 ( + CHAR8 *SupportedLanguages + ) +/*++ + +Routine Description: + Convert language code list from RFC3066 to ISO639-2, e.g. "en-US;fr-FR" will + be converted to "engfra". + +Arguments: + SupportedLanguages - The RFC3066 language list. + +Returns: + The ISO639-2 language list. + +--*/ +; + +EFI_STATUS +GetCurrentLanguage ( + OUT CHAR8 *Lang + ) +/*++ + +Routine Description: + Determine what is the current language setting + +Arguments: + Lang - Pointer of system language + +Returns: + Status code + +--*/ +; + +VOID +GetNextLanguage ( + IN OUT CHAR8 **LangCode, + OUT CHAR8 *Lang + ) +/*++ + +Routine Description: + Get next language from language code list. + +Arguments: + LangCode - The language code. + Lang - Returned language. + +Returns: + None. + +--*/ +; + +CHAR8 * +GetSupportedLanguages ( + IN EFI_HII_HANDLE HiiHandle + ) +/*++ + +Routine Description: + This function returns the list of supported languages, in the format specified + in UEFI specification Appendix M. + +Arguments: + HiiHandle - The HII package list handle. + +Returns: + The supported languages. + +--*/ +; + +UINT16 +GetSupportedLanguageNumber ( + IN EFI_HII_HANDLE HiiHandle + ) +/*++ + +Routine Description: + This function returns the number of supported languages + +Arguments: + HiiHandle - The HII package list handle. + +Returns: + The number of supported languages. + +--*/ +; + +EFI_STATUS +GetStringFromHandle ( + IN EFI_HII_HANDLE HiiHandle, + IN EFI_STRING_ID StringId, + OUT EFI_STRING *String + ) +/*++ + +Routine Description: + Get string specified by StringId form the HiiHandle. + +Arguments: + HiiHandle - The HII handle of package list. + StringId - The String ID. + String - The output string. + +Returns: + EFI_NOT_FOUND - String is not found. + EFI_SUCCESS - Operation is successful. + EFI_OUT_OF_RESOURCES - There is not enought memory in the system. + EFI_INVALID_PARAMETER - The String is NULL. + +--*/ +; + +EFI_STATUS +GetStringFromToken ( + IN EFI_GUID *ProducerGuid, + IN EFI_STRING_ID StringId, + OUT EFI_STRING *String + ) +/*++ + +Routine Description: + Get the string given the StringId and String package Producer's Guid. + +Arguments: + ProducerGuid - The Guid of String package list. + StringId - The String ID. + String - The output string. + +Returns: + EFI_NOT_FOUND - String is not found. + EFI_SUCCESS - Operation is successful. + EFI_OUT_OF_RESOURCES - There is not enought memory in the system. + +--*/ +; + +EFI_STATUS +IfrLibNewString ( + IN EFI_HII_HANDLE PackageList, + OUT EFI_STRING_ID *StringId, + IN CONST EFI_STRING String + ) +/*++ + + Routine Description: + This function adds the string into String Package of each language. + + Arguments: + PackageList - Handle of the package list where this string will be added. + StringId - On return, contains the new strings id, which is unique within PackageList. + String - Points to the new null-terminated string. + + Returns: + EFI_SUCCESS - The new string was added successfully. + EFI_NOT_FOUND - The specified PackageList could not be found in database. + EFI_OUT_OF_RESOURCES - Could not add the string due to lack of resources. + EFI_INVALID_PARAMETER - String is NULL or StringId is NULL is NULL. + +--*/ +; + +EFI_STATUS +IfrLibGetString ( + IN EFI_HII_HANDLE PackageList, + IN EFI_STRING_ID StringId, + OUT EFI_STRING String, + IN OUT UINTN *StringSize + ) +/*++ + + Routine Description: + This function try to retrieve string from String package of current language. + If fail, it try to retrieve string from String package of first language it support. + + Arguments: + PackageList - The package list in the HII database to search for the specified string. + StringId - The string's id, which is unique within PackageList. + String - Points to the new null-terminated string. + StringSize - On entry, points to the size of the buffer pointed to by String, in bytes. On return, + points to the length of the string, in bytes. + + Returns: + EFI_SUCCESS - The string was returned successfully. + EFI_NOT_FOUND - The string specified by StringId is not available. + EFI_BUFFER_TOO_SMALL - The buffer specified by StringLength is too small to hold the string. + EFI_INVALID_PARAMETER - The String or StringSize was NULL. + +--*/ +; + +EFI_STATUS +IfrLibSetString ( + IN EFI_HII_HANDLE PackageList, + IN EFI_STRING_ID StringId, + IN CONST EFI_STRING String + ) +/*++ + + Routine Description: + This function updates the string in String package of current language. + + Arguments: + PackageList - The package list containing the strings. + StringId - The string's id, which is unique within PackageList. + String - Points to the new null-terminated string. + + Returns: + EFI_SUCCESS - The string was updated successfully. + EFI_NOT_FOUND - The string specified by StringId is not in the database. + EFI_INVALID_PARAMETER - The String was NULL. + EFI_OUT_OF_RESOURCES - The system is out of resources to accomplish the task. + +--*/ +; + +EFI_STATUS +IfrLibCreatePopUp ( + IN UINTN NumberOfLines, + OUT EFI_INPUT_KEY *KeyValue, + IN CHAR16 *String, + ... + ) +/*++ + +Routine Description: + Draw a dialog and return the selected key. + +Arguments: + NumberOfLines - The number of lines for the dialog box + KeyValue - The EFI_KEY value returned if HotKey is TRUE.. + String - Pointer to the first string in the list + ... - A series of (quantity == NumberOfLines) text strings which + will be used to construct the dialog box + +Returns: + EFI_SUCCESS - Displayed dialog and received user interaction + EFI_INVALID_PARAMETER - One of the parameters was invalid. + +--*/ +; + +EFI_STATUS +IfrLibInitUpdateData ( + IN OUT EFI_HII_UPDATE_DATA *UpdateData, + IN UINT32 BufferSize + ) +/*++ + +Routine Description: + This function initialize the data structure for dynamic opcode. + +Arguments: + UpdateData - The adding data; + BufferSize - Length of the buffer to fill dynamic opcodes. + +Returns: + EFI_SUCCESS - Update data is initialized. + EFI_INVALID_PARAMETER - UpdateData is NULL. + EFI_OUT_OF_RESOURCES - No enough memory to allocate. + +--*/ +; + +EFI_STATUS +IfrLibFreeUpdateData ( + IN EFI_HII_UPDATE_DATA *UpdateData + ) +/*++ + +Routine Description: + This function free the resource of update data. + +Arguments: + UpdateData - The adding data; + +Returns: + EFI_SUCCESS - Resource in UpdateData is released. + EFI_INVALID_PARAMETER - UpdateData is NULL. + +--*/ +; + +EFI_STATUS +IfrLibUpdateForm ( + IN EFI_HII_HANDLE Handle, + IN EFI_GUID *FormSetGuid, OPTIONAL + IN EFI_FORM_ID FormId, + IN UINT16 Label, + IN BOOLEAN Insert, + IN EFI_HII_UPDATE_DATA *Data + ) +/*++ + +Routine Description: + This function allows the caller to update a form that has + previously been registered with the EFI HII database. + +Arguments: + Handle - Hii Handle + FormSetGuid - The formset should be updated. + FormId - The form should be updated. + Label - Update information starting immediately after this label in the IFR + Insert - If TRUE and Data is not NULL, insert data after Label. + If FALSE, replace opcodes between two labels with Data. + Data - The adding data; If NULL, remove opcodes between two Label. + +Returns: + EFI_SUCCESS - Update success. + Other - Update fail. + +--*/ +; + +BOOLEAN +HiiSetToDefaults ( + IN CONST EFI_STRING Request, OPTIONAL + IN UINT16 DefaultId + ) +/*++ + +Routine Description: + Reset the default value specified by DefaultId to the driver + configuration got by Request string. + + NULL request string support depends on the ExportConfig interface of + HiiConfigRouting protocol in UEFI specification. + +Arguments: + Request - A null-terminated Unicode string in + format. It can be NULL. + If it is NULL, all configuration for the + entirety of the current HII database will be reset. + DefaultId - Specifies the type of defaults to retrieve. + +Returns: + TURE - The default value is set successfully. + FALSE - The default value can't be found and set. + +--*/ +; +#endif diff --git a/EDK/Foundation/Library/Dxe/UefiEfiIfrSupportLib/UefiIfrOpCodeCreation.c b/EDK/Foundation/Library/Dxe/UefiEfiIfrSupportLib/UefiIfrOpCodeCreation.c new file mode 100644 index 0000000..e6b37b8 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/UefiEfiIfrSupportLib/UefiIfrOpCodeCreation.c @@ -0,0 +1,638 @@ +/*++ + +Copyright (c) 2007 - 2009, 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: + + UefiIfrOpCodeCreation.c + +Abstract: + + Library Routines to create IFR independent of string data - assume tokens already exist + Primarily to be used for exporting op-codes at a label in pre-defined forms. + +Revision History: + +--*/ + +#include "UefiIfrLibrary.h" + +EFI_GUID mIfrVendorGuid = EFI_IFR_TIANO_GUID; + +STATIC +BOOLEAN +IsValidQuestionFlags ( + IN UINT8 Flags + ) +{ + return (Flags & (~QUESTION_FLAGS)) ? FALSE : TRUE; +} + +STATIC +BOOLEAN +IsValidValueType ( + IN UINT8 Type + ) +{ + return (Type <= EFI_IFR_TYPE_OTHER) ? TRUE : FALSE; +} + +STATIC +BOOLEAN +IsValidNumricFlags ( + IN UINT8 Flags + ) +{ + if (Flags & ~(EFI_IFR_NUMERIC_SIZE | EFI_IFR_DISPLAY)) { + return FALSE; + } + + if ((Flags & EFI_IFR_DISPLAY) > EFI_IFR_DISPLAY_UINT_HEX) { + return FALSE; + } + + return TRUE; +} + +STATIC +BOOLEAN +IsValidCheckboxFlags ( + IN UINT8 Flags + ) +{ + return (Flags <= EFI_IFR_CHECKBOX_DEFAULT_MFG) ? TRUE : FALSE; +} + +EFI_STATUS +CreateEndOpCode ( + IN OUT EFI_HII_UPDATE_DATA *Data + ) +{ + EFI_IFR_END End; + UINT8 *LocalBuffer; + + ASSERT (Data != NULL && Data->Data != NULL); + + if (Data->Offset + sizeof (EFI_IFR_END) > Data->BufferSize) { + return EFI_BUFFER_TOO_SMALL; + } + + End.Header.Length = sizeof (EFI_IFR_END); + End.Header.OpCode = EFI_IFR_END_OP; + End.Header.Scope = 0; + + LocalBuffer = (UINT8 *) Data->Data + Data->Offset; + EfiCopyMem (LocalBuffer, &End, sizeof (EFI_IFR_END)); + Data->Offset += sizeof (EFI_IFR_END); + + return EFI_SUCCESS; +} + +EFI_STATUS +CreateDefaultOpCode ( + IN EFI_IFR_TYPE_VALUE *Value, + IN UINT8 Type, + IN OUT EFI_HII_UPDATE_DATA *Data + ) +{ + EFI_IFR_DEFAULT Default; + UINT8 *LocalBuffer; + + ASSERT (Data != NULL && Data->Data != NULL); + + if ((Value == NULL) || !IsValidValueType (Type)) { + return EFI_INVALID_PARAMETER; + } + + if (Data->Offset + sizeof (EFI_IFR_DEFAULT) > Data->BufferSize) { + return EFI_BUFFER_TOO_SMALL; + } + + Default.Header.OpCode = EFI_IFR_DEFAULT_OP; + Default.Header.Length = sizeof (EFI_IFR_DEFAULT); + Default.Header.Scope = 0; + Default.Type = Type; + Default.DefaultId = EFI_HII_DEFAULT_CLASS_STANDARD; + EfiCopyMem (&Default.Value, Value, sizeof(EFI_IFR_TYPE_VALUE)); + + LocalBuffer = (UINT8 *) Data->Data + Data->Offset; + EfiCopyMem (LocalBuffer, &Default, sizeof (EFI_IFR_DEFAULT)); + Data->Offset += sizeof (EFI_IFR_DEFAULT); + + return EFI_SUCCESS; +} + +EFI_STATUS +CreateActionOpCode ( + IN EFI_QUESTION_ID QuestionId, + IN EFI_STRING_ID Prompt, + IN EFI_STRING_ID Help, + IN UINT8 QuestionFlags, + IN EFI_STRING_ID QuestionConfig, + IN OUT EFI_HII_UPDATE_DATA *Data + ) +{ + EFI_IFR_ACTION Action; + UINT8 *LocalBuffer; + + ASSERT (Data != NULL && Data->Data != NULL); + + if (!IsValidQuestionFlags (QuestionFlags)) { + return EFI_INVALID_PARAMETER; + } + + if (Data->Offset + sizeof (EFI_IFR_ACTION) > Data->BufferSize) { + return EFI_BUFFER_TOO_SMALL; + } + + Action.Header.OpCode = EFI_IFR_ACTION_OP; + Action.Header.Length = sizeof (EFI_IFR_ACTION); + Action.Header.Scope = 0; + Action.Question.QuestionId = QuestionId; + Action.Question.Header.Prompt = Prompt; + Action.Question.Header.Help = Help; + Action.Question.VarStoreId = INVALID_VARSTORE_ID; + Action.Question.Flags = QuestionFlags; + Action.QuestionConfig = QuestionConfig; + + LocalBuffer = (UINT8 *) Data->Data + Data->Offset; + EfiCopyMem (LocalBuffer, &Action, sizeof (EFI_IFR_ACTION)); + Data->Offset += sizeof (EFI_IFR_ACTION); + + return EFI_SUCCESS; +} + +EFI_STATUS +CreateSubTitleOpCode ( + IN EFI_STRING_ID Prompt, + IN EFI_STRING_ID Help, + IN UINT8 Flags, + IN UINT8 Scope, + IN OUT EFI_HII_UPDATE_DATA *Data + ) +{ + EFI_IFR_SUBTITLE Subtitle; + UINT8 *LocalBuffer; + + ASSERT (Data != NULL && Data->Data != NULL); + + if (Data->Offset + sizeof (EFI_IFR_SUBTITLE) > Data->BufferSize) { + return EFI_BUFFER_TOO_SMALL; + } + + Subtitle.Header.OpCode = EFI_IFR_SUBTITLE_OP; + Subtitle.Header.Length = sizeof (EFI_IFR_SUBTITLE); + Subtitle.Header.Scope = Scope; + Subtitle.Statement.Prompt = Prompt; + Subtitle.Statement.Help = Help; + Subtitle.Flags = Flags; + + LocalBuffer = (UINT8 *) Data->Data + Data->Offset; + EfiCopyMem (LocalBuffer, &Subtitle, sizeof (EFI_IFR_SUBTITLE)); + Data->Offset += sizeof (EFI_IFR_SUBTITLE); + + return EFI_SUCCESS; +} + + +EFI_STATUS +CreateTextOpCode ( + IN EFI_STRING_ID Prompt, + IN EFI_STRING_ID Help, + IN EFI_STRING_ID TextTwo, + IN OUT EFI_HII_UPDATE_DATA *Data + ) +{ + EFI_IFR_TEXT Text; + UINT8 *LocalBuffer; + + ASSERT (Data != NULL && Data->Data != NULL); + + if (Data->Offset + sizeof (EFI_IFR_TEXT) > Data->BufferSize) { + return EFI_BUFFER_TOO_SMALL; + } + + Text.Header.OpCode = EFI_IFR_TEXT_OP; + Text.Header.Length = sizeof (EFI_IFR_TEXT); + Text.Header.Scope = 0; + Text.Statement.Prompt = Prompt; + Text.Statement.Help = Help; + Text.TextTwo = TextTwo; + + LocalBuffer = (UINT8 *) Data->Data + Data->Offset; + EfiCopyMem (LocalBuffer, &Text, sizeof (EFI_IFR_TEXT)); + Data->Offset += sizeof (EFI_IFR_TEXT); + + return EFI_SUCCESS; +} + +EFI_STATUS +CreateGotoOpCode ( + IN EFI_FORM_ID FormId, + IN EFI_STRING_ID Prompt, + IN EFI_STRING_ID Help, + IN UINT8 QuestionFlags, + IN EFI_QUESTION_ID QuestionId, + IN OUT EFI_HII_UPDATE_DATA *Data + ) +{ + EFI_IFR_REF Goto; + UINT8 *LocalBuffer; + + ASSERT (Data != NULL && Data->Data != NULL); + + if (!IsValidQuestionFlags (QuestionFlags)) { + return EFI_INVALID_PARAMETER; + } + + if (Data->Offset + sizeof (EFI_IFR_REF) > Data->BufferSize) { + return EFI_BUFFER_TOO_SMALL; + } + + Goto.Header.OpCode = EFI_IFR_REF_OP; + Goto.Header.Length = sizeof (EFI_IFR_REF); + Goto.Header.Scope = 0; + Goto.Question.Header.Prompt = Prompt; + Goto.Question.Header.Help = Help; + Goto.Question.VarStoreId = INVALID_VARSTORE_ID; + Goto.Question.QuestionId = QuestionId; + Goto.Question.Flags = QuestionFlags; + Goto.FormId = FormId; + + LocalBuffer = (UINT8 *) Data->Data + Data->Offset; + EfiCopyMem (LocalBuffer, &Goto, sizeof (EFI_IFR_REF)); + Data->Offset += sizeof (EFI_IFR_REF); + + return EFI_SUCCESS; +} + +EFI_STATUS +CreateOneOfOptionOpCode ( + IN UINTN OptionCount, + IN IFR_OPTION *OptionsList, + IN UINT8 Type, + IN OUT EFI_HII_UPDATE_DATA *Data + ) +{ + UINTN Index; + UINT8 *LocalBuffer; + EFI_IFR_ONE_OF_OPTION OneOfOption; + + ASSERT (Data != NULL && Data->Data != NULL); + + if ((OptionCount != 0) && (OptionsList == NULL)) { + return EFI_INVALID_PARAMETER; + } + + if (Data->Offset + OptionCount * sizeof (EFI_IFR_ONE_OF_OPTION) > Data->BufferSize) { + return EFI_BUFFER_TOO_SMALL; + } + + for (Index = 0; Index < OptionCount; Index++) { + OneOfOption.Header.OpCode = EFI_IFR_ONE_OF_OPTION_OP; + OneOfOption.Header.Length = sizeof (EFI_IFR_ONE_OF_OPTION); + OneOfOption.Header.Scope = 0; + + OneOfOption.Option = OptionsList[Index].StringToken; + OneOfOption.Value = OptionsList[Index].Value; + OneOfOption.Flags = OptionsList[Index].Flags & (EFI_IFR_OPTION_DEFAULT | EFI_IFR_OPTION_DEFAULT_MFG); + OneOfOption.Type = Type; + + LocalBuffer = (UINT8 *) Data->Data + Data->Offset; + EfiCopyMem (LocalBuffer, &OneOfOption, sizeof (EFI_IFR_ONE_OF_OPTION)); + Data->Offset += sizeof (EFI_IFR_ONE_OF_OPTION); + } + + return EFI_SUCCESS; +} + +EFI_STATUS +CreateOneOfOpCode ( + IN EFI_QUESTION_ID QuestionId, + IN EFI_VARSTORE_ID VarStoreId, + IN UINT16 VarOffset, + IN EFI_STRING_ID Prompt, + IN EFI_STRING_ID Help, + IN UINT8 QuestionFlags, + IN UINT8 OneOfFlags, + IN IFR_OPTION *OptionsList, + IN UINTN OptionCount, + IN OUT EFI_HII_UPDATE_DATA *Data + ) +{ + UINTN Length; + EFI_IFR_ONE_OF OneOf; + UINT8 *LocalBuffer; + + ASSERT (Data != NULL && Data->Data != NULL); + + if (!IsValidNumricFlags (OneOfFlags) || + !IsValidQuestionFlags (QuestionFlags) || + ((OptionCount != 0) && (OptionsList == NULL))) { + return EFI_INVALID_PARAMETER; + } + + Length = sizeof (EFI_IFR_ONE_OF) + OptionCount * sizeof (EFI_IFR_ONE_OF_OPTION) + sizeof (EFI_IFR_END); + if (Data->Offset + Length > Data->BufferSize) { + return EFI_BUFFER_TOO_SMALL; + } + + OneOf.Header.OpCode = EFI_IFR_ONE_OF_OP; + OneOf.Header.Length = sizeof (EFI_IFR_ONE_OF); + OneOf.Header.Scope = 1; + OneOf.Question.Header.Prompt = Prompt; + OneOf.Question.Header.Help = Help; + OneOf.Question.QuestionId = QuestionId; + OneOf.Question.VarStoreId = VarStoreId; + OneOf.Question.VarStoreInfo.VarOffset = VarOffset; + OneOf.Question.Flags = QuestionFlags; + OneOf.Flags = OneOfFlags; + EfiZeroMem ((VOID *) &OneOf.data, sizeof (MINMAXSTEP_DATA)); + + LocalBuffer = (UINT8 *) Data->Data + Data->Offset; + EfiCopyMem (LocalBuffer, &OneOf, sizeof (EFI_IFR_ONE_OF)); + Data->Offset += sizeof (EFI_IFR_ONE_OF); + + CreateOneOfOptionOpCode (OptionCount, OptionsList, (OneOfFlags & EFI_IFR_NUMERIC_SIZE), Data); + + CreateEndOpCode (Data); + + return EFI_SUCCESS; +} + +EFI_STATUS +CreateOrderedListOpCode ( + IN EFI_QUESTION_ID QuestionId, + IN EFI_VARSTORE_ID VarStoreId, + IN UINT16 VarOffset, + IN EFI_STRING_ID Prompt, + IN EFI_STRING_ID Help, + IN UINT8 QuestionFlags, + IN UINT8 OrderedListFlags, + IN UINT8 DataType, + IN UINT8 MaxContainers, + IN IFR_OPTION *OptionsList, + IN UINTN OptionCount, + IN OUT EFI_HII_UPDATE_DATA *Data + ) +{ + UINTN Length; + EFI_IFR_ORDERED_LIST OrderedList; + UINT8 *LocalBuffer; + + ASSERT (Data != NULL && Data->Data != NULL); + + if (!IsValidQuestionFlags (QuestionFlags) || + ((OptionCount != 0) && (OptionsList == NULL))) { + return EFI_INVALID_PARAMETER; + } + + if ((OrderedListFlags & (~(EFI_IFR_UNIQUE_SET | EFI_IFR_NO_EMPTY_SET))) != 0) { + return EFI_INVALID_PARAMETER; + } + + Length = sizeof (EFI_IFR_ORDERED_LIST) + OptionCount * sizeof (EFI_IFR_ONE_OF_OPTION) + sizeof (EFI_IFR_END); + if (Data->Offset + Length > Data->BufferSize) { + return EFI_BUFFER_TOO_SMALL; + } + + OrderedList.Header.OpCode = EFI_IFR_ORDERED_LIST_OP; + OrderedList.Header.Length = sizeof (EFI_IFR_ORDERED_LIST); + OrderedList.Header.Scope = 1; + OrderedList.Question.Header.Prompt = Prompt; + OrderedList.Question.Header.Help = Help; + OrderedList.Question.QuestionId = QuestionId; + OrderedList.Question.VarStoreId = VarStoreId; + OrderedList.Question.VarStoreInfo.VarOffset = VarOffset; + OrderedList.Question.Flags = QuestionFlags; + OrderedList.MaxContainers = MaxContainers; + OrderedList.Flags = OrderedListFlags; + + LocalBuffer = (UINT8 *) Data->Data + Data->Offset; + EfiCopyMem (LocalBuffer, &OrderedList, sizeof (EFI_IFR_ORDERED_LIST)); + Data->Offset += sizeof (EFI_IFR_ORDERED_LIST); + + CreateOneOfOptionOpCode (OptionCount, OptionsList, DataType, Data); + + CreateEndOpCode (Data); + + return EFI_SUCCESS; +} + +EFI_STATUS +CreateCheckBoxOpCode ( + IN EFI_QUESTION_ID QuestionId, + IN EFI_VARSTORE_ID VarStoreId, + IN UINT16 VarOffset, + IN EFI_STRING_ID Prompt, + IN EFI_STRING_ID Help, + IN UINT8 QuestionFlags, + IN UINT8 CheckBoxFlags, + IN OUT EFI_HII_UPDATE_DATA *Data + ) +{ + EFI_IFR_CHECKBOX CheckBox; + UINT8 *LocalBuffer; + + ASSERT (Data != NULL && Data->Data != NULL); + + if (!IsValidQuestionFlags (QuestionFlags) || !IsValidCheckboxFlags (CheckBoxFlags)) { + return EFI_INVALID_PARAMETER; + } + + if (Data->Offset + sizeof (EFI_IFR_CHECKBOX) > Data->BufferSize) { + return EFI_BUFFER_TOO_SMALL; + } + + CheckBox.Header.OpCode = EFI_IFR_CHECKBOX_OP; + CheckBox.Header.Length = sizeof (EFI_IFR_CHECKBOX); + CheckBox.Header.Scope = 0; + CheckBox.Question.QuestionId = QuestionId; + CheckBox.Question.VarStoreId = VarStoreId; + CheckBox.Question.VarStoreInfo.VarOffset = VarOffset; + CheckBox.Question.Header.Prompt = Prompt; + CheckBox.Question.Header.Help = Help; + CheckBox.Question.Flags = QuestionFlags; + CheckBox.Flags = CheckBoxFlags; + + LocalBuffer = (UINT8 *) Data->Data + Data->Offset; + EfiCopyMem (LocalBuffer, &CheckBox, sizeof (EFI_IFR_CHECKBOX)); + Data->Offset += sizeof (EFI_IFR_CHECKBOX); + + return EFI_SUCCESS; +} + +EFI_STATUS +CreateNumericOpCode ( + IN EFI_QUESTION_ID QuestionId, + IN EFI_VARSTORE_ID VarStoreId, + IN UINT16 VarOffset, + IN EFI_STRING_ID Prompt, + IN EFI_STRING_ID Help, + IN UINT8 QuestionFlags, + IN UINT8 NumericFlags, + IN UINT64 Minimum, + IN UINT64 Maximum, + IN UINT64 Step, + IN UINT64 Default, + IN OUT EFI_HII_UPDATE_DATA *Data + ) +{ + UINTN Length; + EFI_STATUS Status; + EFI_IFR_NUMERIC Numeric; + MINMAXSTEP_DATA MinMaxStep; + EFI_IFR_TYPE_VALUE DefaultValue; + UINT8 *LocalBuffer; + + ASSERT (Data != NULL && Data->Data != NULL); + + if (!IsValidQuestionFlags (QuestionFlags) || !IsValidNumricFlags (NumericFlags)) { + return EFI_INVALID_PARAMETER; + } + + Length = sizeof (EFI_IFR_NUMERIC) + sizeof (EFI_IFR_DEFAULT) + sizeof (EFI_IFR_END); + if (Data->Offset + sizeof (EFI_IFR_CHECKBOX) > Data->BufferSize) { + return EFI_BUFFER_TOO_SMALL; + } + + Numeric.Header.OpCode = EFI_IFR_NUMERIC_OP; + Numeric.Header.Length = sizeof (EFI_IFR_NUMERIC); + Numeric.Header.Scope = 1; + Numeric.Question.QuestionId = QuestionId; + Numeric.Question.VarStoreId = VarStoreId; + Numeric.Question.VarStoreInfo.VarOffset = VarOffset; + Numeric.Question.Header.Prompt = Prompt; + Numeric.Question.Header.Help = Help; + Numeric.Question.Flags = QuestionFlags; + Numeric.Flags = NumericFlags; + + switch (NumericFlags & EFI_IFR_NUMERIC_SIZE) { + case EFI_IFR_NUMERIC_SIZE_1: + MinMaxStep.u8.MinValue = (UINT8) Minimum; + MinMaxStep.u8.MaxValue = (UINT8) Maximum; + MinMaxStep.u8.Step = (UINT8) Step; + break; + + case EFI_IFR_NUMERIC_SIZE_2: + MinMaxStep.u16.MinValue = (UINT16) Minimum; + MinMaxStep.u16.MaxValue = (UINT16) Maximum; + MinMaxStep.u16.Step = (UINT16) Step; + break; + + case EFI_IFR_NUMERIC_SIZE_4: + MinMaxStep.u32.MinValue = (UINT32) Minimum; + MinMaxStep.u32.MaxValue = (UINT32) Maximum; + MinMaxStep.u32.Step = (UINT32) Step; + break; + + case EFI_IFR_NUMERIC_SIZE_8: + MinMaxStep.u64.MinValue = Minimum; + MinMaxStep.u64.MaxValue = Maximum; + MinMaxStep.u64.Step = Step; + break; + } + + EfiCopyMem (&Numeric.data, &MinMaxStep, sizeof (MINMAXSTEP_DATA)); + + LocalBuffer = (UINT8 *) Data->Data + Data->Offset; + EfiCopyMem (LocalBuffer, &Numeric, sizeof (EFI_IFR_NUMERIC)); + Data->Offset += sizeof (EFI_IFR_NUMERIC); + + DefaultValue.u64 = Default; + Status = CreateDefaultOpCode (&DefaultValue, (NumericFlags & EFI_IFR_NUMERIC_SIZE), Data); + if (EFI_ERROR(Status)) { + return Status; + } + + CreateEndOpCode (Data); + + return EFI_SUCCESS; +} + +EFI_STATUS +CreateStringOpCode ( + IN EFI_QUESTION_ID QuestionId, + IN EFI_VARSTORE_ID VarStoreId, + IN UINT16 VarOffset, + IN EFI_STRING_ID Prompt, + IN EFI_STRING_ID Help, + IN UINT8 QuestionFlags, + IN UINT8 StringFlags, + IN UINT8 MinSize, + IN UINT8 MaxSize, + IN OUT EFI_HII_UPDATE_DATA *Data + ) +{ + EFI_IFR_STRING String; + UINT8 *LocalBuffer; + + ASSERT (Data != NULL && Data->Data != NULL); + + if (!IsValidQuestionFlags (QuestionFlags) || (StringFlags & (~EFI_IFR_STRING_MULTI_LINE))) { + return EFI_INVALID_PARAMETER; + } + + if (Data->Offset + sizeof (EFI_IFR_STRING) > Data->BufferSize) { + return EFI_BUFFER_TOO_SMALL; + } + + String.Header.OpCode = EFI_IFR_STRING_OP; + String.Header.Length = sizeof (EFI_IFR_STRING); + String.Header.Scope = 0; + String.Question.Header.Prompt = Prompt; + String.Question.Header.Help = Help; + String.Question.QuestionId = QuestionId; + String.Question.VarStoreId = VarStoreId; + String.Question.VarStoreInfo.VarOffset = VarOffset; + String.Question.Flags = QuestionFlags; + String.MinSize = MinSize; + String.MaxSize = MaxSize; + String.Flags = StringFlags; + + LocalBuffer = (UINT8 *) Data->Data + Data->Offset; + EfiCopyMem (LocalBuffer, &String, sizeof (EFI_IFR_STRING)); + Data->Offset += sizeof (EFI_IFR_STRING); + + return EFI_SUCCESS; +} + +EFI_STATUS +CreateBannerOpCode ( + IN EFI_STRING_ID Title, + IN UINT16 LineNumber, + IN UINT8 Alignment, + IN OUT EFI_HII_UPDATE_DATA *Data + ) +{ + EFI_IFR_GUID_BANNER Banner; + UINT8 *LocalBuffer; + + ASSERT (Data != NULL && Data->Data != NULL); + + if (Data->Offset + sizeof (EFI_IFR_GUID_BANNER) > Data->BufferSize) { + return EFI_BUFFER_TOO_SMALL; + } + + Banner.Header.OpCode = EFI_IFR_GUID_OP; + Banner.Header.Length = sizeof (EFI_IFR_GUID_BANNER); + Banner.Header.Scope = 0; + EfiCopyMem (&Banner.Guid, &mIfrVendorGuid, sizeof (EFI_IFR_GUID)); + Banner.ExtendOpCode = EFI_IFR_EXTEND_OP_BANNER; + Banner.Title = Title; + Banner.LineNumber = LineNumber; + Banner.Alignment = Alignment; + + LocalBuffer = (UINT8 *) Data->Data + Data->Offset; + EfiCopyMem (LocalBuffer, &Banner, sizeof (EFI_IFR_GUID_BANNER)); + Data->Offset += sizeof (EFI_IFR_GUID_BANNER); + + return EFI_SUCCESS; +} diff --git a/EDK/Foundation/Library/Dxe/UefiEfiIfrSupportLib/UefiIfrString.c b/EDK/Foundation/Library/Dxe/UefiEfiIfrSupportLib/UefiIfrString.c new file mode 100644 index 0000000..5341941 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/UefiEfiIfrSupportLib/UefiIfrString.c @@ -0,0 +1,729 @@ +/*++ + +Copyright (c) 2007 - 2011, 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: + + UefiIfrString.c + +Abstract: + + Common Library Routines to assist to handle String and Language. + +--*/ + +#include "UefiIfrLibrary.h" + +// +// Lookup table of ISO639-2 3 character language codes to ISO 639-1 2 character language codes +// Each entry is 5 CHAR8 values long. The first 3 CHAR8 values are the ISO 639-2 code. +// The last 2 CHAR8 values are the ISO 639-1 code. +// +CHAR8 Iso639ToRfc3066ConversionTable[] = +"\ +aaraa\ +abkab\ +afraf\ +amham\ +araar\ +asmas\ +aymay\ +azeaz\ +bakba\ +belbe\ +benbn\ +bihbh\ +bisbi\ +bodbo\ +brebr\ +bulbg\ +catca\ +cescs\ +corkw\ +cosco\ +cymcy\ +danda\ +deude\ +dzodz\ +ellel\ +engen\ +epoeo\ +estet\ +euseu\ +faofo\ +fasfa\ +fijfj\ +finfi\ +frafr\ +fryfy\ +gaiga\ +gdhgd\ +glggl\ +grngn\ +gujgu\ +hauha\ +hebhe\ +hinhi\ +hrvhr\ +hunhu\ +hyehy\ +ikuiu\ +ileie\ +inaia\ +indid\ +ipkik\ +islis\ +itait\ +jawjw\ +jpnja\ +kalkl\ +kankn\ +kasks\ +katka\ +kazkk\ +khmkm\ +kinrw\ +kirky\ +korko\ +kurku\ +laolo\ +latla\ +lavlv\ +linln\ +litlt\ +ltzlb\ +malml\ +marmr\ +mkdmk\ +mlgmg\ +mltmt\ +molmo\ +monmn\ +mrimi\ +msams\ +myamy\ +nauna\ +nepne\ +nldnl\ +norno\ +ocioc\ +ormom\ +panpa\ +polpl\ +porpt\ +pusps\ +quequ\ +rohrm\ +ronro\ +runrn\ +rusru\ +sagsg\ +sansa\ +sinsi\ +slksk\ +slvsl\ +smise\ +smosm\ +snasn\ +sndsd\ +somso\ +sotst\ +spaes\ +sqisq\ +srpsr\ +sswss\ +sunsu\ +swasw\ +swesv\ +tamta\ +tattt\ +telte\ +tgktg\ +tgltl\ +thath\ +tsnts\ +tuktk\ +twitw\ +uigug\ +ukruk\ +urdur\ +uzbuz\ +vievi\ +volvo\ +wolwo\ +xhoxh\ +yidyi\ +zhaza\ +zhozh\ +zulzu\ +"; + +EFI_STATUS +ConvertRfc3066LanguageToIso639Language ( + CHAR8 *LanguageRfc3066, + CHAR8 *LanguageIso639 + ) +/*++ + +Routine Description: + Convert language code from RFC3066 to ISO639-2. + +Arguments: + LanguageRfc3066 - RFC3066 language code. + LanguageIso639 - ISO639-2 language code. + +Returns: + EFI_SUCCESS - Language code converted. + EFI_NOT_FOUND - Language code not found. + +--*/ +{ + UINTN Index; + + if ((LanguageRfc3066[2] != '-') && (LanguageRfc3066[2] != 0)) { + EfiCopyMem (LanguageIso639, LanguageRfc3066, 3); + return EFI_SUCCESS; + } + + for (Index = 0; Iso639ToRfc3066ConversionTable[Index] != 0; Index += 5) { + if (EfiCompareMem (LanguageRfc3066, &Iso639ToRfc3066ConversionTable[Index + 3], 2) == 0) { + EfiCopyMem (LanguageIso639, &Iso639ToRfc3066ConversionTable[Index], 3); + return EFI_SUCCESS; + } + } + + return EFI_NOT_FOUND; +} + +CHAR8 * +Rfc3066ToIso639 ( + CHAR8 *SupportedLanguages + ) +/*++ + +Routine Description: + Convert language code list from RFC3066 to ISO639-2, e.g. "en-US;fr-FR" will + be converted to "engfra". + +Arguments: + SupportedLanguages - The RFC3066 language list. + +Returns: + The ISO639-2 language list. + +--*/ +{ + CHAR8 *Languages; + CHAR8 *ReturnValue; + CHAR8 *LangCodes; + CHAR8 LangRfc3066[RFC_3066_ENTRY_SIZE]; + CHAR8 LangIso639[ISO_639_2_ENTRY_SIZE]; + EFI_STATUS Status; + + ReturnValue = EfiLibAllocateZeroPool (EfiAsciiStrSize (SupportedLanguages)); + if (ReturnValue == NULL) { + return ReturnValue; + } + + Languages = ReturnValue; + LangCodes = SupportedLanguages; + while (*LangCodes != 0) { + GetNextLanguage (&LangCodes, LangRfc3066); + + Status = ConvertRfc3066LanguageToIso639Language (LangRfc3066, LangIso639); + if (!EFI_ERROR (Status)) { + EfiCopyMem (Languages, LangIso639, 3); + Languages = Languages + 3; + } + } + + return ReturnValue; +} + +EFI_STATUS +GetCurrentLanguage ( + OUT CHAR8 *Lang + ) +/*++ + +Routine Description: + Determine what is the current language setting + +Arguments: + Lang - Pointer of system language + +Returns: + Status code + +--*/ +{ + EFI_STATUS Status; + UINTN Size; + + // + // Get current language setting + // + Size = RFC_3066_ENTRY_SIZE; + Status = gRT->GetVariable ( + L"PlatformLang", + &gEfiGlobalVariableGuid, + NULL, + &Size, + Lang + ); + + if (EFI_ERROR (Status)) { + EfiAsciiStrCpy (Lang, "en-US"); + } + + return Status; +} + +VOID +GetNextLanguage ( + IN OUT CHAR8 **LangCode, + OUT CHAR8 *Lang + ) +/*++ + +Routine Description: + Get next language from language code list (with separator ';'). + +Arguments: + LangCode - On input: point to first language in the list. On output: point to + next language in the list, or NULL if no more language in the list. + Lang - The first language in the list. + +Returns: + None. + +--*/ +{ + UINTN Index; + CHAR8 *StringPtr; + + if (LangCode == NULL || *LangCode == NULL) { + *Lang = 0; + return; + } + + Index = 0; + StringPtr = *LangCode; + while (StringPtr[Index] != 0 && StringPtr[Index] != ';') { + Index++; + } + + EfiCopyMem (Lang, StringPtr, Index); + Lang[Index] = 0; + + if (StringPtr[Index] == ';') { + Index++; + } + *LangCode = StringPtr + Index; +} + +CHAR8 * +GetSupportedLanguages ( + IN EFI_HII_HANDLE HiiHandle + ) +/*++ + +Routine Description: + This function returns the list of supported languages, in the format specified + in UEFI specification Appendix M. + +Arguments: + HiiHandle - The HII package list handle. + +Returns: + The supported languages. + +--*/ +{ + EFI_STATUS Status; + UINTN BufferSize; + CHAR8 *LanguageString; + + LocateHiiProtocols (); + + // + // Collect current supported Languages for given HII handle + // + BufferSize = 0x1000; + LanguageString = EfiLibAllocatePool (BufferSize); + Status = gIfrLibHiiString->GetLanguages (gIfrLibHiiString, HiiHandle, LanguageString, &BufferSize); + if (Status == EFI_BUFFER_TOO_SMALL) { + gBS->FreePool (LanguageString); + LanguageString = EfiLibAllocatePool (BufferSize); + Status = gIfrLibHiiString->GetLanguages (gIfrLibHiiString, HiiHandle, LanguageString, &BufferSize); + } + + if (EFI_ERROR (Status)) { + LanguageString = NULL; + } + + return LanguageString; +} + +UINT16 +GetSupportedLanguageNumber ( + IN EFI_HII_HANDLE HiiHandle + ) +/*++ + +Routine Description: + This function returns the number of supported languages + +Arguments: + HiiHandle - The HII package list handle. + +Returns: + The number of supported languages. + +--*/ +{ + CHAR8 *Languages; + CHAR8 *LanguageString; + UINT16 LangNumber; + CHAR8 Lang[RFC_3066_ENTRY_SIZE]; + + Languages = GetSupportedLanguages (HiiHandle); + if (Languages == NULL) { + return 0; + } + + LangNumber = 0; + LanguageString = Languages; + while (*LanguageString != 0) { + GetNextLanguage (&LanguageString, Lang); + LangNumber++; + } + gBS->FreePool (Languages); + + return LangNumber; +} + +EFI_STATUS +GetStringFromHandle ( + IN EFI_HII_HANDLE HiiHandle, + IN EFI_STRING_ID StringId, + OUT EFI_STRING *String + ) +/*++ + +Routine Description: + Get string specified by StringId form the HiiHandle. + +Arguments: + HiiHandle - The HII handle of package list. + StringId - The String ID. + String - The output string. + +Returns: + EFI_NOT_FOUND - String is not found. + EFI_SUCCESS - Operation is successful. + EFI_OUT_OF_RESOURCES - There is not enought memory in the system. + EFI_INVALID_PARAMETER - The String is NULL. + +--*/ +{ + EFI_STATUS Status; + UINTN StringSize; + + if (String == NULL) { + return EFI_INVALID_PARAMETER; + } + + StringSize = IFR_LIB_DEFAULT_STRING_SIZE; + *String = EfiLibAllocateZeroPool (StringSize); + if (*String == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + Status = IfrLibGetString (HiiHandle, StringId, *String, &StringSize); + if (Status == EFI_BUFFER_TOO_SMALL) { + gBS->FreePool (*String); + *String = EfiLibAllocateZeroPool (StringSize); + if (*String == NULL) { + return EFI_OUT_OF_RESOURCES; + } + Status = IfrLibGetString (HiiHandle, StringId, *String, &StringSize); + } + + return Status; +} + +EFI_STATUS +GetStringFromToken ( + IN EFI_GUID *ProducerGuid, + IN EFI_STRING_ID StringId, + OUT EFI_STRING *String + ) +/*++ + +Routine Description: + Get the string given the StringId and String package Producer's Guid. + +Arguments: + ProducerGuid - The Guid of String package list. + StringId - The String ID. + String - The output string. + +Returns: + EFI_NOT_FOUND - String is not found. + EFI_SUCCESS - Operation is successful. + EFI_OUT_OF_RESOURCES - There is not enought memory in the system. + +--*/ +{ + EFI_STATUS Status; + UINTN Index; + UINTN HandleBufferLen; + EFI_HII_HANDLE *HiiHandleBuffer; + EFI_GUID Guid; + + Status = GetHiiHandles (&HandleBufferLen, &HiiHandleBuffer); + if (HiiHandleBuffer == NULL) { + return EFI_OUT_OF_RESOURCES; + } + if (EFI_ERROR(Status)) { + return Status; + } + for (Index = 0; Index < (HandleBufferLen / sizeof (EFI_HII_HANDLE)); Index++) { + Status = ExtractGuidFromHiiHandle (HiiHandleBuffer[Index], &Guid); + if (EFI_ERROR(Status)) { + return Status; + } + if (EfiCompareGuid (&Guid, ProducerGuid) == TRUE) { + break; + } + } + + if (Index >= (HandleBufferLen / sizeof (EFI_HII_HANDLE))) { + Status = EFI_NOT_FOUND; + goto Out; + } + + Status = GetStringFromHandle (HiiHandleBuffer[Index], StringId, String); + +Out: + if (HiiHandleBuffer != NULL) { + gBS->FreePool (HiiHandleBuffer); + } + return Status; +} + +EFI_STATUS +IfrLibNewString ( + IN EFI_HII_HANDLE PackageList, + OUT EFI_STRING_ID *StringId, + IN CONST EFI_STRING String + ) +/*++ + + Routine Description: + This function adds the string into String Package of each language. + + Arguments: + PackageList - Handle of the package list where this string will be added. + StringId - On return, contains the new strings id, which is unique within PackageList. + String - Points to the new null-terminated string. + + Returns: + EFI_SUCCESS - The new string was added successfully. + EFI_NOT_FOUND - The specified PackageList could not be found in database. + EFI_OUT_OF_RESOURCES - Could not add the string due to lack of resources. + EFI_INVALID_PARAMETER - String is NULL or StringId is NULL is NULL. + +--*/ +{ + EFI_STATUS Status; + CHAR8 *Languages; + CHAR8 *LangStrings; + CHAR8 Lang[RFC_3066_ENTRY_SIZE]; + + Status = EFI_SUCCESS; + + LocateHiiProtocols (); + + Languages = GetSupportedLanguages (PackageList); + if (Languages == NULL) { + return EFI_NOT_FOUND; + } + + + if (StringId == NULL) { + return EFI_INVALID_PARAMETER; + } + *StringId = 0; + + LangStrings = Languages; + while (*LangStrings != 0) { + GetNextLanguage (&LangStrings, Lang); + + if (*StringId == 0) { + Status = gIfrLibHiiString->NewString ( + gIfrLibHiiString, + PackageList, + StringId, + Lang, + NULL, + String, + NULL + ); + } else { + Status = gIfrLibHiiString->SetString ( + gIfrLibHiiString, + PackageList, + *StringId, + Lang, + String, + NULL + ); + } + + if (EFI_ERROR (Status)) { + break; + } + } + + gBS->FreePool (Languages); + + return Status; +} + +EFI_STATUS +IfrLibGetString ( + IN EFI_HII_HANDLE PackageList, + IN EFI_STRING_ID StringId, + OUT EFI_STRING String, + IN OUT UINTN *StringSize + ) +/*++ + + Routine Description: + This function try to retrieve string from String package of current language. + If fail, it try to retrieve string from String package of first language it support. + + Arguments: + PackageList - The package list in the HII database to search for the specified string. + StringId - The string's id, which is unique within PackageList. + String - Points to the new null-terminated string. + StringSize - On entry, points to the size of the buffer pointed to by String, in bytes. On return, + points to the length of the string, in bytes. + + Returns: + EFI_SUCCESS - The string was returned successfully. + EFI_NOT_FOUND - The string specified by StringId is not available. + EFI_BUFFER_TOO_SMALL - The buffer specified by StringLength is too small to hold the string. + EFI_INVALID_PARAMETER - The String or StringSize was NULL. + +--*/ +{ + EFI_STATUS Status; + CHAR8 *Languages; + CHAR8 *LangStrings; + CHAR8 Lang[RFC_3066_ENTRY_SIZE]; + CHAR8 CurrentLang[RFC_3066_ENTRY_SIZE]; + + LocateHiiProtocols (); + + GetCurrentLanguage (CurrentLang); + + Status = gIfrLibHiiString->GetString ( + gIfrLibHiiString, + CurrentLang, + PackageList, + StringId, + String, + StringSize, + NULL + ); + + if (EFI_ERROR (Status) && (Status != EFI_BUFFER_TOO_SMALL)) { + Languages = GetSupportedLanguages (PackageList); + LangStrings = Languages; + GetNextLanguage (&LangStrings, Lang); + gBS->FreePool (Languages); + + Status = gIfrLibHiiString->GetString ( + gIfrLibHiiString, + Lang, + PackageList, + StringId, + String, + StringSize, + NULL + ); + } + + return Status; +} + +EFI_STATUS +IfrLibSetString ( + IN EFI_HII_HANDLE PackageList, + IN EFI_STRING_ID StringId, + IN CONST EFI_STRING String + ) +/*++ + + Routine Description: + This function updates the string in String package of each language. + + Arguments: + PackageList - The package list containing the strings. + StringId - The string's id, which is unique within PackageList. + String - Points to the new null-terminated string. + + Returns: + EFI_SUCCESS - The string was updated successfully. + EFI_NOT_FOUND - The string specified by StringId is not in the database. + EFI_INVALID_PARAMETER - The String was NULL. + EFI_OUT_OF_RESOURCES - The system is out of resources to accomplish the task. + +--*/ +{ + EFI_STATUS Status; + CHAR8 *Languages; + CHAR8 *LangStrings; + CHAR8 Lang[RFC_3066_ENTRY_SIZE]; + + Status = EFI_SUCCESS; + + LocateHiiProtocols (); + + Languages = GetSupportedLanguages (PackageList); + if (Languages == NULL) { + return EFI_NOT_FOUND; + } + + LangStrings = Languages; + while (*LangStrings != 0) { + GetNextLanguage (&LangStrings, Lang); + + Status = gIfrLibHiiString->SetString ( + gIfrLibHiiString, + PackageList, + StringId, + Lang, + String, + NULL + ); + if (EFI_ERROR (Status)) { + break; + } + } + + gBS->FreePool (Languages); + + return Status; +} + diff --git a/EDK/Foundation/Library/Dxe/hob/hob.c b/EDK/Foundation/Library/Dxe/hob/hob.c new file mode 100644 index 0000000..c228c37 --- /dev/null +++ b/EDK/Foundation/Library/Dxe/hob/hob.c @@ -0,0 +1,542 @@ +/*++ + +Copyright (c) 2004 - 2006, 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: + + hob.c + +Abstract: + + Support for hob operation + +--*/ + +#include "Tiano.h" +#include "EfiDriverLib.h" +#include "PeiHob.h" +#include EFI_GUID_DEFINITION (IoBaseHob) +#include EFI_GUID_DEFINITION (MemoryAllocationHob) + +VOID * +GetHob ( + IN UINT16 Type, + IN VOID *HobStart + ) +/*++ + +Routine Description: + + This function returns the first instance of a HOB type in a HOB list. + +Arguments: + + Type The HOB type to return. + HobStart The first HOB in the HOB list. + +Returns: + + HobStart There were no HOBs found with the requested type. + else Returns the first HOB with the matching type. + +--*/ +{ + EFI_PEI_HOB_POINTERS Hob; + + Hob.Raw = HobStart; + // + // Return input if not found + // + if (HobStart == NULL) { + return HobStart; + } + + // + // Parse the HOB list, stop if end of list or matching type found. + // + while (!END_OF_HOB_LIST (Hob)) { + + if (Hob.Header->HobType == Type) { + break; + } + + Hob.Raw = GET_NEXT_HOB (Hob); + } + + // + // Return input if not found + // + if (END_OF_HOB_LIST (Hob)) { + return HobStart; + } + + return (VOID *) (Hob.Raw); +} + +UINTN +GetHobListSize ( + IN VOID *HobStart + ) +/*++ + +Routine Description: + + Get size of hob list. + +Arguments: + + HobStart - Start pointer of hob list + +Returns: + + Size of hob list. + +--*/ +{ + EFI_PEI_HOB_POINTERS Hob; + UINTN Size; + + Hob.Raw = HobStart; + Size = 0; + + while (Hob.Header->HobType != EFI_HOB_TYPE_END_OF_HOB_LIST) { + Size += Hob.Header->HobLength; + Hob.Raw += Hob.Header->HobLength; + } + + Size += Hob.Header->HobLength; + + return Size; +} + +UINT32 +GetHobVersion ( + IN VOID *HobStart + ) +/*++ + +Routine Description: + + Get hob version. + +Arguments: + + HobStart - Start pointer of hob list + +Returns: + + Hob version. + +--*/ +{ + EFI_PEI_HOB_POINTERS Hob; + + Hob.Raw = HobStart; + return Hob.HandoffInformationTable->Version; +} + +EFI_STATUS +GetHobBootMode ( + IN VOID *HobStart, + OUT EFI_BOOT_MODE *BootMode + ) +/*++ + +Routine Description: + + Get current boot mode. + +Arguments: + + HobStart - Start pointer of hob list + + BootMode - Current boot mode recorded in PHIT hob + +Returns: + + EFI_NOT_FOUND - Invalid hob header + + EFI_SUCCESS - Boot mode found + +--*/ +{ + EFI_PEI_HOB_POINTERS Hob; + + Hob.Raw = HobStart; + if (Hob.Header->HobType != EFI_HOB_TYPE_HANDOFF) { + return EFI_NOT_FOUND; + } + + *BootMode = Hob.HandoffInformationTable->BootMode; + return EFI_SUCCESS; +} + +EFI_STATUS +GetCpuHobInfo ( + IN VOID *HobStart, + OUT UINT8 *SizeOfMemorySpace, + OUT UINT8 *SizeOfIoSpace + ) +/*++ + +Routine Description: + + Get information recorded in CPU hob (Memory space size, Io space size) + +Arguments: + + HobStart - Start pointer of hob list + + SizeOfMemorySpace - Size of memory size + + SizeOfIoSpace - Size of IO size + +Returns: + + EFI_NOT_FOUND - CPU hob not found + + EFI_SUCCESS - CPU hob found and information got. + +--*/ +{ + EFI_PEI_HOB_POINTERS CpuHob; + + CpuHob.Raw = HobStart; + CpuHob.Raw = GetHob (EFI_HOB_TYPE_CPU, CpuHob.Raw); + if (CpuHob.Header->HobType != EFI_HOB_TYPE_CPU) { + return EFI_NOT_FOUND; + } + + *SizeOfMemorySpace = CpuHob.Cpu->SizeOfMemorySpace; + *SizeOfIoSpace = CpuHob.Cpu->SizeOfIoSpace; + return EFI_SUCCESS; +} + +EFI_STATUS +GetDxeCoreHobInfo ( + IN VOID *HobStart, + OUT EFI_PHYSICAL_ADDRESS *BaseAddress, + OUT UINT64 *Length, + OUT VOID **EntryPoint, + OUT EFI_GUID **FileName + ) +/*++ + +Routine Description: + + Get memory allocation hob created for DXE core and extract its information + +Arguments: + + HobStart - Start pointer of the hob list + BaseAddress - Start address of memory allocated for DXE core + Length - Length of memory allocated for DXE core + EntryPoint - DXE core file name + FileName - File Name + +Returns: + + EFI_NOT_FOUND - DxeCoreHob not found + EFI_SUCCESS - DxeCoreHob found and information got + +--*/ +{ + EFI_PEI_HOB_POINTERS DxeCoreHob; + + + DxeCoreHob.Raw = HobStart; + DxeCoreHob.Raw = GetHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, DxeCoreHob.Raw); + while (DxeCoreHob.Header->HobType == EFI_HOB_TYPE_MEMORY_ALLOCATION && + !EfiCompareGuid (&DxeCoreHob.MemoryAllocationModule->MemoryAllocationHeader.Name, + &gEfiHobMemeryAllocModuleGuid)) { + + DxeCoreHob.Raw = GET_NEXT_HOB (DxeCoreHob); + DxeCoreHob.Raw = GetHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, DxeCoreHob.Raw); + + } + + if (DxeCoreHob.Header->HobType != EFI_HOB_TYPE_MEMORY_ALLOCATION) { + return EFI_NOT_FOUND; + } + + *BaseAddress = DxeCoreHob.MemoryAllocationModule->MemoryAllocationHeader.MemoryBaseAddress; + *Length = DxeCoreHob.MemoryAllocationModule->MemoryAllocationHeader.MemoryLength; + *EntryPoint = (VOID *) (UINTN) DxeCoreHob.MemoryAllocationModule->EntryPoint; + *FileName = &DxeCoreHob.MemoryAllocationModule->ModuleName; + + return EFI_SUCCESS; +} + +EFI_STATUS +GetNextFirmwareVolumeHob ( + IN OUT VOID **HobStart, + OUT EFI_PHYSICAL_ADDRESS *BaseAddress, + OUT UINT64 *Length + ) +/*++ + +Routine Description: + + Get next firmware volume hob from HobStart + +Arguments: + + HobStart - Start pointer of hob list + + BaseAddress - Start address of next firmware volume + + Length - Length of next firmware volume + +Returns: + + EFI_NOT_FOUND - Next firmware volume not found + + EFI_SUCCESS - Next firmware volume found with address information + +--*/ +{ + EFI_PEI_HOB_POINTERS FirmwareVolumeHob; + + FirmwareVolumeHob.Raw = *HobStart; + if (END_OF_HOB_LIST (FirmwareVolumeHob)) { + return EFI_NOT_FOUND; + } + + FirmwareVolumeHob.Raw = GetHob (EFI_HOB_TYPE_FV, *HobStart); + if (FirmwareVolumeHob.Header->HobType != EFI_HOB_TYPE_FV) { + return EFI_NOT_FOUND; + } + + *BaseAddress = FirmwareVolumeHob.FirmwareVolume->BaseAddress; + *Length = FirmwareVolumeHob.FirmwareVolume->Length; + + *HobStart = GET_NEXT_HOB (FirmwareVolumeHob); + + return EFI_SUCCESS; +} + +//;;## ...AMI_OVERRIDE... Support PI1.x +#if (PI_SPECIFICATION_VERSION >= 0x00010000) +EFI_STATUS +GetNextFirmwareVolume2Hob ( + IN OUT VOID **HobStart, + OUT EFI_PHYSICAL_ADDRESS *BaseAddress, + OUT UINT64 *Length, + OUT EFI_GUID *FileName + ) +/*++ + +Routine Description: + + Get next firmware volume2 hob from HobStart + +Arguments: + + HobStart - Start pointer of hob list + + BaseAddress - Start address of next firmware volume + + Length - Length of next firmware volume + +Returns: + + EFI_NOT_FOUND - Next firmware volume not found + + EFI_SUCCESS - Next firmware volume found with address information + +--*/ +{ + EFI_PEI_HOB_POINTERS FirmwareVolumeHob; + + FirmwareVolumeHob.Raw = *HobStart; + if (END_OF_HOB_LIST (FirmwareVolumeHob)) { + return EFI_NOT_FOUND; + } + + FirmwareVolumeHob.Raw = GetHob (EFI_HOB_TYPE_FV2, *HobStart); + if (FirmwareVolumeHob.Header->HobType != EFI_HOB_TYPE_FV2) { + return EFI_NOT_FOUND; + } + + *BaseAddress = FirmwareVolumeHob.FirmwareVolume2->BaseAddress; + *Length = FirmwareVolumeHob.FirmwareVolume2->Length; + EfiCommonLibCopyMem(FileName,&FirmwareVolumeHob.FirmwareVolume2->FileName,sizeof(EFI_GUID)); + + *HobStart = GET_NEXT_HOB (FirmwareVolumeHob); + + return EFI_SUCCESS; +} +#endif + +EFI_STATUS +GetNextGuidHob ( + IN OUT VOID **HobStart, + IN EFI_GUID * Guid, + OUT VOID **Buffer, + OUT UINTN *BufferSize OPTIONAL + ) +/*++ + +Routine Description: + Get the next guid hob. + +Arguments: + HobStart A pointer to the start hob. + Guid A pointer to a guid. + Buffer A pointer to the buffer. + BufferSize Buffer size. + +Returns: + Status code. + + EFI_NOT_FOUND - Next Guid hob not found + + EFI_SUCCESS - Next Guid hob found and data for this Guid got + + EFI_INVALID_PARAMETER - invalid parameter + +--*/ +{ + EFI_STATUS Status; + EFI_PEI_HOB_POINTERS GuidHob; + + if (Buffer == NULL) { + return EFI_INVALID_PARAMETER; + } + + for (Status = EFI_NOT_FOUND; EFI_ERROR (Status);) { + + GuidHob.Raw = *HobStart; + if (END_OF_HOB_LIST (GuidHob)) { + return EFI_NOT_FOUND; + } + + GuidHob.Raw = GetHob (EFI_HOB_TYPE_GUID_EXTENSION, *HobStart); + if (GuidHob.Header->HobType == EFI_HOB_TYPE_GUID_EXTENSION) { + if (EfiCompareGuid (Guid, &GuidHob.Guid->Name)) { + Status = EFI_SUCCESS; + *Buffer = (VOID *) ((UINT8 *) (&GuidHob.Guid->Name) + sizeof (EFI_GUID)); + if (BufferSize != NULL) { + *BufferSize = GuidHob.Header->HobLength - sizeof (EFI_HOB_GUID_TYPE); + } + } + } + + *HobStart = GET_NEXT_HOB (GuidHob); + } + + return Status; +} + + +#define PAL_ENTRY_HOB {0xe53cb8cc, 0xd62c, 0x4f74, 0xbd, 0xda, 0x31, 0xe5, 0x8d, 0xe5, 0x3e, 0x2} +EFI_GUID gPalEntryHob = PAL_ENTRY_HOB; + +EFI_STATUS +GetPalEntryHobInfo ( + IN VOID *HobStart, + OUT EFI_PHYSICAL_ADDRESS *PalEntry + ) +/*++ + +Routine Description: + + Get PAL entry from PalEntryHob + +Arguments: + + HobStart - Start pointer of hob list + + PalEntry - Pointer to PAL entry + +Returns: + + Status code. + +--*/ +{ + VOID *Buffer; + UINTN BufferSize; + EFI_STATUS Status; + VOID *HobStart2; + + // + // Initialize 'Buffer' to NULL before usage + // + Buffer = NULL; + HobStart2 = HobStart; + Status = GetNextGuidHob ( + &HobStart2, + &gPalEntryHob, + &Buffer, + &BufferSize + ); + if (EFI_ERROR (Status) || (Buffer == NULL)) { + // + // Failed to get HOB for gPalEntryHob + // + return Status; + } + + *PalEntry = *((EFI_PHYSICAL_ADDRESS *) Buffer); + return Status; +} + + +EFI_STATUS +GetIoPortSpaceAddressHobInfo ( + IN VOID *HobStart, + OUT EFI_PHYSICAL_ADDRESS *IoPortSpaceAddress + ) +/*++ + +Routine Description: + + Get IO port space address from IoBaseHob. + +Arguments: + + HobStart - Start pointer of hob list + + IoPortSpaceAddress - IO port space address + +Returns: + + Status code + +--*/ +{ + + VOID *Buffer; + UINTN BufferSize; + EFI_STATUS Status; + VOID *HobStart2; + + // + // Initialize 'Buffer' to NULL before usage + // + Buffer = NULL; + HobStart2 = HobStart; + Status = GetNextGuidHob ( + &HobStart2, + &gEfiIoBaseHobGuid, + &Buffer, + &BufferSize + ); + if (EFI_ERROR (Status) || (Buffer == NULL)) { + // + // Failed to get HOB for gEfiIoBaseHobGuid + // + return Status; + } + + *IoPortSpaceAddress = *((EFI_PHYSICAL_ADDRESS *) Buffer); + return Status; +} -- cgit v1.2.3